2066 - TaskView should become visible after a build when hidden
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorArea.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorArea.java
index a912ad4..50be789 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorArea.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorArea.java
@@ -34,12 +34,12 @@
 	private DropTarget dropTarget;
 	private DropTargetAdapter dropTargetAdapter;
 	
-public EditorArea(String editorId, IPartDropListener listener, Listener mouseDownListener, DropTargetAdapter dropTargetListener) {
+public EditorArea(String editorId, IPartDropListener listener, Listener mouseDownListener, WorkbenchPage page) {
 	super(editorId);
 
 	this.partDropListener = listener;
 	this.mouseDownListener = mouseDownListener;
-	this.dropTargetAdapter = dropTargetListener;
+	this.dropTargetAdapter = new EditorAreaDropAdapter(page);
 	createDefaultWorkbook();
 }
 /**
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorAreaDropAdapter.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorAreaDropAdapter.java
index fa45051..063d7e3 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorAreaDropAdapter.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorAreaDropAdapter.java
@@ -41,7 +41,8 @@
 			IResource [] files = (IResource[]) event.data;
 			try { //open all the files
 				for (int i = 0; i < files.length; i++) {
-					page.openInternalEditor((IFile)files[i]);	
+					if (files[i] instanceof IFile)
+						page.openInternalEditor((IFile)files[i]);	
 				}
 			} catch (PartInitException e) {
 				//do nothing, user may have been trying to drag a folder
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorPresentation.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorPresentation.java
index 5b786a3..2a6c664 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorPresentation.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorPresentation.java
@@ -41,9 +41,8 @@
 	
 	this.page = workbenchPage;
 	
-	EditorAreaDropAdapter dropTargetAdapter = new EditorAreaDropAdapter(page);
 	this.editorArea = new EditorArea(IPageLayout.ID_EDITOR_AREA, partDropListener, 
-		mouseDownListener, dropTargetAdapter);
+		mouseDownListener, page);
 }
 /**
  * Closes all of the editors.
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/IPreferenceConstants.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/IPreferenceConstants.java
index 1e0a284..b768aa3 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/IPreferenceConstants.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/IPreferenceConstants.java
@@ -124,5 +124,9 @@
 	// Sort criteria for EditorList
 	public static final String EDITOR_LIST_SORT_CRITERIA = "EDITOR_LIST_SORT_CRITERIA"; //$NON-NLS-1$
 	public static final int EDITOR_LIST_NAME_SORT = 0;
-	public static final int EDITOR_LIST_MRU_SORT = 1;	
+	public static final int EDITOR_LIST_MRU_SORT = 1;
+	
+	// Show Tasks view to users when build contains errors
+	public static final String SHOW_TASKS_ON_BUILD = "SHOW_TASKS_ON_BUILD"; //$NON-NLS-1$
+
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/Perspective.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/Perspective.java
index 690cfdc..891b896 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/Perspective.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/Perspective.java
@@ -1405,15 +1405,15 @@
 }
 /**
  * Method moveFastView.  Moves draggedView to the position above
- * destinationView.  If useDestination is false, add view to the end.
- * Otherwise, either place above destination view, or at the beginning if hte
+ * destinationView.  If placeAtEnd is true, add view to the end. Otherwise,
+ * either place above destination view, or at the beginning if the
  * destinationView is null
  * @param draggedView
  * @param destinationView
  * @param useDestination
  */
 
-/*package*/ void moveFastView(IViewReference draggedView, IViewReference destinationView, boolean useDestination) {
+/*package*/ void moveFastView(IViewReference draggedView, IViewReference destinationView, boolean placeAtEnd) {
 	//PR 6988
 	
 	//do nothing if views are the same
@@ -1422,14 +1422,14 @@
 		
 	//move the view
 	fastViews.remove(draggedView);
-	//should the destination be used to determine where to place the fast view?
-	if (useDestination) {
+	//determine where to place the view
+	if (placeAtEnd) {//add it to the end
+		fastViews.add(draggedView);
+	} else { 
 		if (destinationView == null) //add it to the beginning
 			fastViews.add(0, draggedView);
 		else
 			fastViews.add(fastViews.indexOf(destinationView), draggedView);
-	} else { //add it to the end
-		fastViews.add(draggedView);
 	}
 }
 
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/PerspectivePresentation.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/PerspectivePresentation.java
index 514fe73..9b84207 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/PerspectivePresentation.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/PerspectivePresentation.java
Binary files differ
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchPage.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchPage.java
index b478fac..5c8712f 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchPage.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchPage.java
@@ -1713,30 +1713,7 @@
 public IEditorPart openEditor(IMarker marker, boolean activate) 
 	throws PartInitException 
 {
-	// Get the resource.
-	IFile file = (IFile)marker.getResource();
-
-	// Get the preferred editor id.
-	String editorID = null;
-	try {
-		editorID = (String)marker.getAttribute(EDITOR_ID_ATTR);
-	}
-	catch (CoreException e) {
-		WorkbenchPlugin.log(WorkbenchMessages.getString("WorkbenchPage.ErrorExtractingEditorIDFromMarker"), e.getStatus()); //$NON-NLS-1$
-		return null;
-	}
-	
-	// Create a new editor.
-	IEditorPart editor = null;
-	if (editorID == null)
-		editor = openEditor(new FileEditorInput(file),null,activate,false,null, false);
-	else 
-		editor = openEditor(new FileEditorInput(file),editorID,activate,true,file, false);
-
-	// Goto the bookmark.
-	if (editor != null)
-		editor.gotoMarker(marker);
-	return editor;
+	return openMarker(marker, activate, false);
 }
 /**
  * See IWorkbenchPage.
@@ -1770,6 +1747,12 @@
  */
 public IEditorPart openInternalEditor(IMarker marker)
 	throws PartInitException {
+		
+	return openMarker(marker, true, true);
+}
+
+private IEditorPart openMarker(IMarker marker, boolean activate, boolean forceInternal)
+	throws PartInitException {
 	// Get the resource.
 	IFile file = (IFile)marker.getResource();
 
@@ -1786,9 +1769,9 @@
 	// Create a new editor.
 	IEditorPart editor = null;
 	if (editorID == null)
-		editor = openEditor(new FileEditorInput(file),null,true,false,null, true);
+		editor = openEditor(new FileEditorInput(file),null,activate,false,null, forceInternal);
 	else
-		editor = openEditor(new FileEditorInput(file),editorID,true,true,file, true);
+		editor = openEditor(new FileEditorInput(file),editorID,activate,true,file, forceInternal);
 
 	// Goto the bookmark.
 	if (editor != null)
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchPlugin.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchPlugin.java
index ef15ee2..1cf93e2 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchPlugin.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchPlugin.java
@@ -11,24 +11,70 @@
 
 package org.eclipse.ui.internal;
 
-import java.io.*;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
 import java.util.Iterator;
 import java.util.List;
 
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IMarkerDelta;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IResourceDelta;
 import org.eclipse.core.resources.IWorkspace;
 import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.*;
-import org.eclipse.jface.preference.*;
-import org.eclipse.jface.resource.*;
-import org.eclipse.jface.util.OpenStrategy;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IPluginDescriptor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.BusyIndicator;
 import org.eclipse.swt.graphics.FontData;
 import org.eclipse.swt.graphics.RGB;
-import org.eclipse.ui.*;
-import org.eclipse.ui.internal.decorators.*;
+import org.eclipse.swt.widgets.Display;
+
+import org.eclipse.jface.preference.IPreferenceNode;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.JFacePreferences;
+import org.eclipse.jface.preference.PreferenceConverter;
+import org.eclipse.jface.preference.PreferenceManager;
+import org.eclipse.jface.resource.FontRegistry;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.util.OpenStrategy;
+
+import org.eclipse.ui.IEditorRegistry;
+import org.eclipse.ui.IElementFactory;
+import org.eclipse.ui.IPerspectiveRegistry;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkingSetManager;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.internal.decorators.DecoratorManager;
 import org.eclipse.ui.internal.misc.StatusUtil;
-import org.eclipse.ui.internal.registry.*;
+import org.eclipse.ui.internal.registry.ActionSetRegistry;
+import org.eclipse.ui.internal.registry.CapabilityRegistry;
+import org.eclipse.ui.internal.registry.EditorRegistry;
+import org.eclipse.ui.internal.registry.IViewRegistry;
+import org.eclipse.ui.internal.registry.MarkerHelpRegistry;
+import org.eclipse.ui.internal.registry.MarkerHelpRegistryReader;
+import org.eclipse.ui.internal.registry.MarkerImageProviderRegistry;
+import org.eclipse.ui.internal.registry.PerspectiveRegistry;
+import org.eclipse.ui.internal.registry.PreferencePageRegistryReader;
+import org.eclipse.ui.internal.registry.ProjectImageRegistry;
+import org.eclipse.ui.internal.registry.ViewRegistry;
+import org.eclipse.ui.internal.registry.ViewRegistryReader;
+import org.eclipse.ui.internal.registry.WorkingSetRegistry;
 import org.eclipse.ui.plugin.AbstractUIPlugin;
 
 /**
@@ -76,6 +122,11 @@
 	public static String PI_WORKBENCH = PlatformUI.PLUGIN_ID;
 
 	/**
+	 * The id of the Tasks view.
+	 */
+	private static final String TASK_LIST_ID = PI_WORKBENCH + ".views.TaskList";
+	
+	/**
 	 * The character used to separate preference page category ids
 	 */
 	private static char PREFERENCE_PAGE_CATEGORY_SEPARATOR = '/';
@@ -91,6 +142,7 @@
 	private ActionSetRegistry actionSetRegistry;
 	private SharedImages sharedImages;
 	private MarkerImageProviderRegistry markerImageProviderRegistry;
+	
 	/**
 	 * Create an instance of the WorkbenchPlugin.
 	 * The workbench plugin is effectively the "application" for the workbench UI.
@@ -99,7 +151,61 @@
 	public WorkbenchPlugin(IPluginDescriptor descriptor) {
 		super(descriptor);
 		inst = this;
+		ResourcesPlugin.getWorkspace().addResourceChangeListener(
+			getShowTasksChangeListener(),
+			IResourceChangeEvent.POST_CHANGE);
 	}
+	
+	/**
+	 * Returns the resource change listener for noticing new errors.
+	 * Processes the delta and shows the Tasks view if new errors 
+	 * have appeared.  See PR 2066.
+	 */ 
+	private IResourceChangeListener getShowTasksChangeListener() {
+		return new IResourceChangeListener() {
+			public void resourceChanged(final IResourceChangeEvent event) {	
+				IPreferenceStore store = getWorkbench().getPreferenceStore();
+				if (store.getBoolean(IPreferenceConstants.SHOW_TASKS_ON_BUILD)) {
+					IMarker error = findError(event);
+					if (error != null) {
+						Display.getDefault().asyncExec(new Runnable() {
+							public void run() {
+								try {
+									IWorkbenchWindow window = getWorkbench().getActiveWorkbenchWindow();
+									if (window != null && !window.getShell().isDisposed()) { 
+										IWorkbenchPage page = window.getActivePage();
+										// ensure user has view somewhere on their page
+										if (page != null && page.findView(TASK_LIST_ID) != null)
+											page.showView(TASK_LIST_ID);
+									}
+								} catch (PartInitException e) {
+									getLog().log(e.getStatus()); //$NON-NLS$
+								}
+							}
+						});
+					}
+				}
+			}
+		};
+	}
+			
+	/**
+	 * Finds the first error marker which has been added in the delta.
+	 */
+	private IMarker findError(IResourceChangeEvent event) {
+		IMarkerDelta[] markerDeltas = event.findMarkerDeltas(IMarker.PROBLEM, true);
+		for (int i = 0; i < markerDeltas.length; i++) {
+			IMarkerDelta markerDelta = markerDeltas[i];
+			if (markerDelta.getKind() == IResourceDelta.ADDED) {
+				int severity = markerDelta.getAttribute(IMarker.SEVERITY, -1);
+				if (severity == IMarker.SEVERITY_ERROR) {
+					return markerDelta.getMarker();
+				}
+			}
+		}
+		return null;
+	}
+	
 	/**
 	 * Creates an extension.  If the extension plugin has not
 	 * been loaded a busy cursor will be activated during the duration of
@@ -392,6 +498,9 @@
 		store.setDefault(IPreferenceConstants.EDITOR_LIST_SELECTION_SCOPE, IPreferenceConstants.EDITOR_LIST_SET_PAGE_SCOPE); // Current Window
 		store.setDefault(IPreferenceConstants.EDITOR_LIST_SORT_CRITERIA, IPreferenceConstants.EDITOR_LIST_NAME_SORT); // Name Sort
 
+		// Set the default behaviour for showing the task list when there are compiles errors in the build
+		store.setDefault(IPreferenceConstants.SHOW_TASKS_ON_BUILD, true);
+
 		// Set the default configuration for the key binding service
 		store.setDefault(IWorkbenchConstants.ACCELERATOR_CONFIGURATION_ID, IWorkbenchConstants.DEFAULT_ACCELERATOR_CONFIGURATION_ID);
 		
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/dialogs/WorkbenchPreferencePage.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/dialogs/WorkbenchPreferencePage.java
index 0590c12..d93fc4f 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/dialogs/WorkbenchPreferencePage.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/dialogs/WorkbenchPreferencePage.java
@@ -25,6 +25,7 @@
 	private Button autoBuildButton;
 	private Button autoSaveAllButton;
 	private Button refreshButton;
+	private Button showTasks;
 	private IntegerFieldEditor saveInterval;
 
 	private Button doubleClickButton;
@@ -91,6 +92,11 @@
 		refreshButton.setText(WorkbenchMessages.getString("WorkbenchPreference.refreshButton")); //$NON-NLS-1$
 		refreshButton.setFont(font);
 		setButtonLayoutData(refreshButton);
+		
+		showTasks = new Button(composite, SWT.CHECK);
+		showTasks.setText(WorkbenchMessages.getString("WorkbenchPreference.showTasks")); //$NON-NLS-1$
+		showTasks.setFont(font);
+		setButtonLayoutData(showTasks);
 
 		createSpace(composite);
 		createSaveIntervalGroup(composite);
@@ -103,7 +109,8 @@
 		autoBuildButton.setSelection(ResourcesPlugin.getWorkspace().isAutoBuilding());
 		autoSaveAllButton.setSelection(store.getBoolean(IPreferenceConstants.SAVE_ALL_BEFORE_BUILD));
 		refreshButton.setSelection(store.getBoolean(IPreferenceConstants.REFRESH_WORKSPACE_ON_STARTUP));
-
+		showTasks.setSelection(store.getBoolean(IPreferenceConstants.SHOW_TASKS_ON_BUILD));
+		
 		return composite;
 	}
 	
@@ -303,6 +310,7 @@
 		autoBuildButton.setSelection(store.getDefaultBoolean(IPreferenceConstants.AUTO_BUILD));
 		autoSaveAllButton.setSelection(store.getDefaultBoolean(IPreferenceConstants.SAVE_ALL_BEFORE_BUILD));
 		refreshButton.setSelection(store.getDefaultBoolean(IPreferenceConstants.REFRESH_WORKSPACE_ON_STARTUP));
+		showTasks.setSelection(store.getBoolean(IPreferenceConstants.SHOW_TASKS_ON_BUILD));
 		saveInterval.loadDefault();
 		
 		openOnSingleClick = store.getDefaultBoolean(IPreferenceConstants.OPEN_ON_SINGLE_CLICK); //$NON-NLS-1$
@@ -345,6 +353,9 @@
 		// store the link navigator to editor setting
 		store.setValue(IPreferenceConstants.REFRESH_WORKSPACE_ON_STARTUP, refreshButton.getSelection());
 
+		//store the preference for bringing task view to front on build
+		store.setValue(IPreferenceConstants.SHOW_TASKS_ON_BUILD, showTasks.getSelection());
+
 		long oldSaveInterval = description.getSnapshotInterval() / 60000;
 		long newSaveInterval = new Long(saveInterval.getStringValue()).longValue();
 		if(oldSaveInterval != newSaveInterval) {
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/messages.properties b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/messages.properties
index 10730b9..9b039c5 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/messages.properties
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/messages.properties
@@ -682,6 +682,7 @@
 WorkbenchPreference.refreshButton = &Refresh Workspace on startup
 WorkbenchPreference.editorsListButton = &Show Editors drop-down
 WorkbenchPreference.closeEditorsButton = Close all editors on &exit
+WorkbenchPreference.showTasks = Show &Tasks view if build has errors
 WorkbenchPreference.replaceCurrent = &Replace current
 WorkbenchPreference.control = Ctrl
 WorkbenchPreference.shift = Shift
@@ -1314,6 +1315,7 @@
 ShowViewMenuAction.text=Show View Menu@Ctrl+F10
 ShowViewMenuAction.toolTip=Show View Menu
 
+EditorInputTransfer.errorMessage=Received wrong transfer data.
 
 # ==============================================================================
 # Working Set Framework.
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/part/EditorInputTransfer.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/part/EditorInputTransfer.java
index 4ed7206..3f7d70f 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/part/EditorInputTransfer.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/part/EditorInputTransfer.java
@@ -14,6 +14,8 @@
 import org.eclipse.swt.dnd.ByteArrayTransfer;
 import org.eclipse.swt.dnd.TransferData;
 import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.internal.WorkbenchMessages;
+import org.eclipse.ui.internal.WorkbenchPlugin;
 
 /**
  * The <code>EditorInputTransfer</code> class is used to transfer an
@@ -93,7 +95,8 @@
 	public Object nativeToJava(TransferData transferData) {
 		Object result = super.nativeToJava(transferData);
 		if (isInvalidNativeType(result)) {
-			//TODO: something went wrong, log error message!
+			//something went wrong, log error message
+			WorkbenchPlugin.log(WorkbenchMessages.getString("EditorInputTransfer.errorMessage"));
 		}
 		return new Object [] {editorId, input};
 	}