1 package net.sourceforge.phpdt.externaltools.internal.model;
2 
3 /**********************************************************************
4  Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
5  This file is made available under the terms of the Common Public License v1.0
6  which accompanies this distribution, and is available at
7  http://www.eclipse.org/legal/cpl-v10.html
8  **********************************************************************/
9 
10 import java.util.Map;
11 
12 import net.sourceforge.phpdt.externaltools.variable.ExpandVariableContext;
13 
14 import org.eclipse.core.resources.IProject;
15 import org.eclipse.core.resources.IResource;
16 import org.eclipse.core.runtime.IAdaptable;
17 import org.eclipse.core.runtime.IProgressMonitor;
18 import org.eclipse.jface.viewers.ISelection;
19 import org.eclipse.jface.viewers.IStructuredSelection;
20 import org.eclipse.ui.IEditorInput;
21 import org.eclipse.ui.IEditorPart;
22 import org.eclipse.ui.ISelectionListener;
23 import org.eclipse.ui.ISelectionService;
24 import org.eclipse.ui.IWindowListener;
25 import org.eclipse.ui.IWorkbench;
26 import org.eclipse.ui.IWorkbenchPage;
27 import org.eclipse.ui.IWorkbenchPart;
28 import org.eclipse.ui.IWorkbenchWindow;
29 import org.eclipse.ui.PlatformUI;
30 import org.eclipse.ui.externaltools.internal.model.ExternalToolBuilder;
31 
32 /**
33  * Maintains the context used to expand variables. The context is based on the
34  * selected resource, unless a build is in progress - in which case the context
35  * is based on the project being built..
36  */
37 public class VariableContextManager implements IWindowListener,
38 		ISelectionListener {
39 
40 	// singleton
41 	private static VariableContextManager fgDefault;
42 
43 	private IResource fSelectedResource = null;
44 
45 	private boolean fBuilding = false;
46 
47 	private IProject fProject = null;
48 
49 	private int fKind;
50 
VariableContextManager()51 	private VariableContextManager() {
52 		IWorkbench workbench = PlatformUI.getWorkbench();
53 		if (workbench != null) { // may be running headless
54 			workbench.addWindowListener(this);
55 			IWorkbenchWindow activeWindow = workbench
56 					.getActiveWorkbenchWindow();
57 			if (activeWindow != null) {
58 				windowActivated(activeWindow);
59 			}
60 		}
61 	}
62 
63 	/**
64 	 * Returns the singleton resource selection manager
65 	 *
66 	 * @return VariableContextManager
67 	 */
getDefault()68 	public static VariableContextManager getDefault() {
69 		if (fgDefault == null) {
70 			fgDefault = new VariableContextManager();
71 		}
72 		return fgDefault;
73 	}
74 
75 	/**
76 	 * @see org.eclipse.ui.IWindowListener#windowActivated(org.eclipse.ui.IWorkbenchWindow)
77 	 */
windowActivated(IWorkbenchWindow window)78 	public void windowActivated(IWorkbenchWindow window) {
79 		fSelectedResource = null;
80 		ISelectionService service = window.getSelectionService();
81 		service.addSelectionListener(this);
82 		IWorkbenchPage page = window.getActivePage();
83 		if (page != null) {
84 			IWorkbenchPart part = page.getActivePart();
85 			if (part != null) {
86 				ISelection selection = service.getSelection();
87 				if (selection != null) {
88 					selectionChanged(part, selection);
89 				}
90 			}
91 		}
92 	}
93 
94 	/**
95 	 * @see org.eclipse.ui.IWindowListener#windowClosed(org.eclipse.ui.IWorkbenchWindow)
96 	 */
windowClosed(IWorkbenchWindow window)97 	public void windowClosed(IWorkbenchWindow window) {
98 		window.getSelectionService().removeSelectionListener(this);
99 	}
100 
101 	/**
102 	 * @see org.eclipse.ui.IWindowListener#windowDeactivated(org.eclipse.ui.IWorkbenchWindow)
103 	 */
windowDeactivated(IWorkbenchWindow window)104 	public void windowDeactivated(IWorkbenchWindow window) {
105 		window.getSelectionService().removeSelectionListener(this);
106 	}
107 
108 	/**
109 	 * @see org.eclipse.ui.IWindowListener#windowOpened(org.eclipse.ui.IWorkbenchWindow)
110 	 */
windowOpened(IWorkbenchWindow window)111 	public void windowOpened(IWorkbenchWindow window) {
112 	}
113 
114 	/**
115 	 * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart,
116 	 *      org.eclipse.jface.viewers.ISelection)
117 	 */
selectionChanged(IWorkbenchPart part, ISelection selection)118 	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
119 		IResource selectedResource = null;
120 		if (selection instanceof IStructuredSelection) {
121 			Object result = ((IStructuredSelection) selection)
122 					.getFirstElement();
123 			if (result instanceof IResource) {
124 				selectedResource = (IResource) result;
125 			} else if (result instanceof IAdaptable) {
126 				selectedResource = (IResource) ((IAdaptable) result)
127 						.getAdapter(IResource.class);
128 			}
129 		}
130 
131 		if (selectedResource == null) {
132 			// If the active part is an editor, get the file resource used as
133 			// input.
134 			if (part instanceof IEditorPart) {
135 				IEditorPart editorPart = (IEditorPart) part;
136 				IEditorInput input = editorPart.getEditorInput();
137 				selectedResource = (IResource) input
138 						.getAdapter(IResource.class);
139 			}
140 		}
141 
142 		fSelectedResource = selectedResource;
143 	}
144 
145 	/**
146 	 * Returns the active variable context. The context is that of the selected
147 	 * resource, or a project being built.
148 	 *
149 	 * @return variable context
150 	 */
getVariableContext()151 	public ExpandVariableContext getVariableContext() {
152 		if (fBuilding) {
153 			return new ExpandVariableContext(fProject, fKind);
154 		} else {
155 			return new ExpandVariableContext(fSelectedResource);
156 		}
157 	}
158 
159 	/**
160 	 * Notification that the given project is being built.
161 	 *
162 	 * @param project
163 	 * @param kind
164 	 * @see ExternalToolBuilder#build(int, Map, IProgressMonitor)
165 	 */
buildStarted(IProject project, int kind)166 	public void buildStarted(IProject project, int kind) {
167 		fBuilding = true;
168 		fProject = project;
169 		fKind = kind;
170 	}
171 
172 	/**
173 	 * Notification the building the current project has completed.
174 	 *
175 	 * @see ExternalToolBuilder#build(int, Map, IProgressMonitor)
176 	 */
buildEnded()177 	public void buildEnded() {
178 		fBuilding = false;
179 		fProject = null;
180 	}
181 }
182