--- /dev/null
+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;
+ }
+}