Created a separated 'externaltools' plugin: initial check-in
[phpeclipse.git] / net.sourceforge.phpeclipse.externaltools / src / net / sourceforge / phpdt / externaltools / internal / model / VariableContextManager.java
diff --git a/net.sourceforge.phpeclipse.externaltools/src/net/sourceforge/phpdt/externaltools/internal/model/VariableContextManager.java b/net.sourceforge.phpeclipse.externaltools/src/net/sourceforge/phpdt/externaltools/internal/model/VariableContextManager.java
new file mode 100644 (file)
index 0000000..686413e
--- /dev/null
@@ -0,0 +1,171 @@
+package net.sourceforge.phpdt.externaltools.internal.model;
+
+/**********************************************************************
+Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
+This file is made available under the terms of the Common Public License v1.0
+which accompanies this distribution, and is available at
+http://www.eclipse.org/legal/cpl-v10.html
+**********************************************************************/
+
+import java.util.Map;
+
+import net.sourceforge.phpdt.externaltools.variable.ExpandVariableContext;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.ISelectionListener;
+import org.eclipse.ui.ISelectionService;
+import org.eclipse.ui.IWindowListener;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.externaltools.internal.model.ExternalToolBuilder;
+
+/**
+ * Maintains the context used to expand variables. The context is based on
+ * the selected resource, unless a build is in progress - in which case
+ * the context is based on the project being built..
+ */
+public class VariableContextManager implements IWindowListener, ISelectionListener {
+
+       // singleton
+       private static VariableContextManager fgDefault;
+       
+       private IResource fSelectedResource = null;
+       
+       private boolean fBuilding = false;
+       private IProject fProject = null;
+       private int fKind;
+       
+       private VariableContextManager() {
+               IWorkbench workbench = PlatformUI.getWorkbench();
+               if (workbench != null) { //may be running headless
+                       workbench.addWindowListener(this);
+                       IWorkbenchWindow activeWindow = workbench.getActiveWorkbenchWindow();
+                       if (activeWindow != null) {
+                               windowActivated(activeWindow);
+                       }
+               } 
+       }
+       
+       /**
+        * Returns the singleton resource selection manager
+        * 
+        * @return VariableContextManager
+        */
+       public static VariableContextManager getDefault() {
+               if (fgDefault == null) {
+                       fgDefault = new VariableContextManager(); 
+               }
+               return fgDefault;
+       }
+       
+       /**
+        * @see org.eclipse.ui.IWindowListener#windowActivated(org.eclipse.ui.IWorkbenchWindow)
+        */
+       public void windowActivated(IWorkbenchWindow window) {
+               fSelectedResource = null;
+               ISelectionService service = window.getSelectionService(); 
+               service.addSelectionListener(this);
+               IWorkbenchPage page = window.getActivePage();
+               if (page != null) {
+                       IWorkbenchPart part = page.getActivePart();
+                       if (part != null) {                             
+                               ISelection selection = service.getSelection();
+                               if (selection != null) {
+                                       selectionChanged(part, selection);
+                               }
+                       }
+               }
+       }
+
+       /**
+        * @see org.eclipse.ui.IWindowListener#windowClosed(org.eclipse.ui.IWorkbenchWindow)
+        */
+       public void windowClosed(IWorkbenchWindow window) {
+               window.getSelectionService().removeSelectionListener(this);
+       }
+
+       /**
+        * @see org.eclipse.ui.IWindowListener#windowDeactivated(org.eclipse.ui.IWorkbenchWindow)
+        */
+       public void windowDeactivated(IWorkbenchWindow window) {
+               window.getSelectionService().removeSelectionListener(this);
+       }
+
+       /**
+        * @see org.eclipse.ui.IWindowListener#windowOpened(org.eclipse.ui.IWorkbenchWindow)
+        */
+       public void windowOpened(IWorkbenchWindow window) {
+       }
+
+       /**
+        * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
+        */
+       public void selectionChanged(IWorkbenchPart part, ISelection selection) {
+               IResource selectedResource = null;
+               if (selection instanceof IStructuredSelection) {
+                       Object result = ((IStructuredSelection)selection).getFirstElement();
+                       if (result instanceof IResource) {
+                               selectedResource = (IResource) result;
+                       } else if (result instanceof IAdaptable) {
+                               selectedResource = (IResource)((IAdaptable) result).getAdapter(IResource.class);
+                       }
+               }
+               
+               if (selectedResource == null) {
+                       // If the active part is an editor, get the file resource used as input.
+                       if (part instanceof IEditorPart) {
+                               IEditorPart editorPart = (IEditorPart) part;
+                               IEditorInput input = editorPart.getEditorInput();
+                               selectedResource = (IResource) input.getAdapter(IResource.class);
+                       } 
+               }
+               
+               fSelectedResource = selectedResource;
+       }
+       
+       /**
+        * Returns the active variable context. The context is that of the selected
+        * resource, or a project being built.
+        * 
+        * @return variable context
+        */
+       public ExpandVariableContext getVariableContext() {
+               if (fBuilding) {
+                       return new ExpandVariableContext(fProject, fKind);
+               } else {
+                       return new ExpandVariableContext(fSelectedResource);
+               }
+       }
+       
+       /**
+        * Notification that the given project is being built.
+        * 
+        * @param project
+        * @param kind
+        * @see ExternalToolBuilder#build(int, Map, IProgressMonitor)
+        */
+       public void buildStarted(IProject project, int kind) {
+               fBuilding = true;
+               fProject = project;
+               fKind = kind;
+       }
+       
+       /**
+        * Notification the building the current project has completed.
+        * @see ExternalToolBuilder#build(int, Map, IProgressMonitor)
+        */
+       public void buildEnded() {
+               fBuilding = false;
+               fProject= null;
+       }
+}