1 11 package org.eclipse.debug.internal.ui.contextlaunching; 12 13 import java.util.HashMap ; 14 import java.util.HashSet ; 15 import java.util.Iterator ; 16 import java.util.List ; 17 18 import org.eclipse.core.resources.IProject; 19 import org.eclipse.core.resources.IResource; 20 import org.eclipse.core.runtime.IProgressMonitor; 21 import org.eclipse.core.runtime.IStatus; 22 import org.eclipse.core.runtime.ListenerList; 23 import org.eclipse.core.runtime.Status; 24 import org.eclipse.core.runtime.jobs.Job; 25 import org.eclipse.debug.core.DebugPlugin; 26 import org.eclipse.debug.core.ILaunch; 27 import org.eclipse.debug.core.ILaunchConfiguration; 28 import org.eclipse.debug.core.ILaunchesListener2; 29 import org.eclipse.debug.internal.ui.DebugUIPlugin; 30 import org.eclipse.debug.internal.ui.IInternalDebugUIConstants; 31 import org.eclipse.debug.internal.ui.ILaunchHistoryChangedListener; 32 import org.eclipse.debug.internal.ui.ILaunchLabelChangedListener; 33 import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationManager; 34 import org.eclipse.debug.internal.ui.stringsubstitution.SelectedResourceManager; 35 import org.eclipse.debug.ui.ILaunchGroup; 36 import org.eclipse.jface.action.CoolBarManager; 37 import org.eclipse.jface.action.IContributionItem; 38 import org.eclipse.jface.action.ToolBarContributionItem; 39 import org.eclipse.jface.action.ToolBarManager; 40 import org.eclipse.jface.util.IPropertyChangeListener; 41 import org.eclipse.jface.util.PropertyChangeEvent; 42 import org.eclipse.jface.viewers.ISelection; 43 import org.eclipse.swt.events.MouseEvent; 44 import org.eclipse.swt.events.MouseTrackAdapter; 45 import org.eclipse.swt.widgets.ToolBar; 46 import org.eclipse.ui.ISelectionListener; 47 import org.eclipse.ui.IWindowListener; 48 import org.eclipse.ui.IWorkbench; 49 import org.eclipse.ui.IWorkbenchPart; 50 import org.eclipse.ui.IWorkbenchWindow; 51 import org.eclipse.ui.PlatformUI; 52 import org.eclipse.ui.internal.WorkbenchWindow; 53 54 import com.ibm.icu.text.MessageFormat; 55 56 70 public class LaunchingResourceManager implements IPropertyChangeListener, IWindowListener, ISelectionListener, ILaunchHistoryChangedListener, ILaunchesListener2 { 71 72 75 private ListenerList fLabelListeners = new ListenerList(); 76 77 81 private HashMap fToolbars = new HashMap (); 82 83 86 private HashMap fCurrentLabels = new HashMap (); 87 88 91 private boolean fUpdateLabel = true; 92 93 96 private HashSet fWindows = new HashSet (); 97 98 102 private HashMap fConfigCache = new HashMap (); 103 104 108 private HashMap fExtCache = new HashMap (); 109 110 113 private static final String EMPTY_STRING = ""; 115 118 private MouseTrackAdapter fMouseListener = new MouseTrackAdapter() { 119 public void mouseEnter(MouseEvent e) { 120 if(fUpdateLabel) { 121 fUpdateLabel = false; 122 fCurrentLabels.clear(); 123 Job job = new Job("Compute launch button tooltip") { protected IStatus run(IProgressMonitor monitor) { 125 computeLabels(); 126 fConfigCache.clear(); 127 fExtCache.clear(); 128 return Status.OK_STATUS; 129 } 130 }; 131 job.setSystem(true); 132 job.schedule(); 133 } 134 } 135 }; 136 137 141 public static boolean isContextLaunchEnabled() { 142 return DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IInternalDebugUIConstants.PREF_USE_CONTEXTUAL_LAUNCH); 143 } 144 145 152 public void addLaunchLabelUpdateListener(ILaunchLabelChangedListener listener) { 153 fLabelListeners.add(listener); 154 } 155 156 164 public void removeLaunchLabelChangedListener(ILaunchLabelChangedListener listener) { 165 fLabelListeners.remove(listener); 166 } 167 168 174 public String getLaunchLabel(ILaunchGroup group) { 175 return (String ) fCurrentLabels.get(group); 176 } 177 178 182 protected boolean shouldCheckParent() { 183 return DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IInternalDebugUIConstants.PREF_LAUNCH_PARENT_PROJECT); 184 } 185 186 190 protected boolean shouldLaunchLast() { 191 return DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IInternalDebugUIConstants.PREF_LAUNCH_LAST_IF_NOT_LAUNCHABLE); 192 } 193 194 198 protected void computeLabels() { 199 ILaunchGroup group = null; 200 ILaunchConfiguration config = null; 201 String label = null; 202 Object [] listeners = fLabelListeners.getListeners(); 203 for(int i = 0; i < listeners.length; i++) { 204 group = ((ILaunchLabelChangedListener)listeners[i]).getLaunchGroup(); 205 if(group != null) { 206 if(isContextLaunchEnabled() && !group.getIdentifier().equals("org.eclipse.ui.externaltools.launchGroup")) { label = getResourceLabel(SelectedResourceManager.getDefault().getSelectedResource(), group); 208 } 209 else { 210 config = DebugUIPlugin.getDefault().getLaunchConfigurationManager().getFilteredLastLaunch(group.getIdentifier()); 211 if(config != null) { 212 label = appendLaunched(config); 213 } 214 } 215 fCurrentLabels.put(group, label); 216 label = null; 217 } 218 } 219 notifyLabelChanged(); 220 } 221 222 225 protected void notifyLabelChanged() { 226 Object [] listeners = fLabelListeners.getListeners(); 227 for(int i = 0; i < listeners.length; i++) { 228 ((ILaunchLabelChangedListener)listeners[i]).labelChanged(); 229 } 230 } 231 232 238 private String appendLaunched(ILaunchConfiguration config) { 239 ILaunch[] launches = DebugPlugin.getDefault().getLaunchManager().getLaunches(); 240 boolean launched = false; 241 ILaunchConfiguration tmp = null; 242 for(int i = 0; i < launches.length; i++) { 243 tmp = launches[i].getLaunchConfiguration(); 244 if(tmp != null) { 245 if(!launches[i].isTerminated() && tmp.equals(config)) { 246 launched = true; 247 break; 248 } 249 } 250 } 251 if(launched) { 252 return MessageFormat.format(ContextMessages.LaunchingResourceManager_0, new String [] {config.getName()}); 253 } 254 return config.getName(); 255 } 256 257 263 protected String getlastLaunchedLabel(ILaunchGroup group) { 264 ILaunchConfiguration config = DebugUIPlugin.getDefault().getLaunchConfigurationManager().getFilteredLastLaunch(group.getIdentifier()); 265 if(config != null) { 266 return appendLaunched(config); 267 } 268 return EMPTY_STRING; 269 } 270 271 277 protected String getResourceLabel(IResource resource, ILaunchGroup group) { 278 if(resource == null) { 279 if(group != null) { 281 String label = getlastLaunchedLabel(group); 282 if(!EMPTY_STRING.equals(label)) { 283 return label; 284 } 285 } 286 List shortcuts = ContextRunner.getDefault().getLaunchShortcutsForEmptySelection(); 288 if(!shortcuts.isEmpty()) { 289 return ContextMessages.ContextRunner_14; 290 } 291 else { 292 return EMPTY_STRING; 293 } 294 } 295 LaunchConfigurationManager lcm = DebugUIPlugin.getDefault().getLaunchConfigurationManager(); 296 ILaunchConfiguration config = lcm.isSharedConfig(resource); 298 if(config != null) { 299 return appendLaunched(config); 300 } 301 List configs = (List ) fConfigCache.get(resource); 302 if(configs == null) { 303 configs = lcm.getApplicableLaunchConfigurations(resource); 304 fConfigCache.put(resource, configs); 305 } 306 int csize = configs.size(); 307 if(csize == 1) { 308 return appendLaunched((ILaunchConfiguration)configs.get(0)); 309 } 310 else if(csize > 1) { 311 config = lcm.getMRUConfiguration(configs, group, resource); 312 if(config != null) { 313 return appendLaunched(config); 314 } 315 else { 316 return ContextMessages.ContextRunner_14; 317 } 318 } 319 else { 320 List exts = (List ) fExtCache.get(resource); 321 if(exts == null) { 322 exts = lcm.getLaunchShortcuts(resource); 323 fExtCache.put(resource, exts); 324 } 325 int esize = exts.size(); 326 if(esize == 0) { 327 if(shouldCheckParent()) { 328 IProject project = resource.getProject(); 329 if(project != null && !project.equals(resource)) { 330 return getResourceLabel(project, group); 331 } 332 } 333 else if(shouldLaunchLast()) { 334 return getlastLaunchedLabel(group); 335 } 336 else { 337 return ContextMessages.ContextRunner_15; 338 } 339 } 340 if(esize == 1) { 341 return resource.getName(); 342 } 343 else { 344 return ContextMessages.ContextRunner_14; 345 } 346 } 347 } 348 349 352 public void startup() { 353 IWorkbench workbench = PlatformUI.getWorkbench(); 354 if(workbench != null) { 355 workbench.addWindowListener(this); 356 } 357 DebugUIPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(this); 358 DebugUIPlugin.getDefault().getLaunchConfigurationManager().addLaunchHistoryListener(this); 359 DebugPlugin.getDefault().getLaunchManager().addLaunchListener(this); 360 } 361 362 365 public void shutdown() { 366 IWorkbench workbench = PlatformUI.getWorkbench(); 367 if(workbench != null) { 368 workbench.removeWindowListener(this); 369 } 370 DebugUIPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(this); 371 DebugUIPlugin.getDefault().getLaunchConfigurationManager().removeLaunchHistoryListener(this); 372 DebugPlugin.getDefault().getLaunchManager().removeLaunchListener(this); 373 IWorkbenchWindow window = null; 374 ToolBar bar = null; 375 for(Iterator iter = fToolbars.keySet().iterator(); iter.hasNext();) { 376 window = (IWorkbenchWindow) iter.next(); 377 bar = (ToolBar) fToolbars.get(window); 378 if(bar != null && !bar.isDisposed()) { 379 bar.removeMouseTrackListener(fMouseListener); 380 } 381 } 382 for(Iterator iter = fWindows.iterator(); iter.hasNext();) { 383 ((IWorkbenchWindow)iter.next()).getSelectionService().removeSelectionListener(this); 384 } 385 fWindows.clear(); 386 fToolbars.clear(); 387 fLabelListeners.clear(); 388 fCurrentLabels.clear(); 389 } 390 391 394 public void windowActivated(IWorkbenchWindow window) { 395 if(!fToolbars.containsKey(window)) { 396 addMouseListener(window); 397 } 398 } 399 400 403 public void windowClosed(IWorkbenchWindow window) { 404 ToolBar bar = (ToolBar) fToolbars.remove(window); 405 if(bar != null && !bar.isDisposed()) { 406 bar.removeMouseTrackListener(fMouseListener); 407 } 408 if(fWindows.remove(window)) { 409 window.getSelectionService().removeSelectionListener(this); 410 } 411 } 412 413 416 public void windowDeactivated(IWorkbenchWindow window) {} 417 418 421 public void windowOpened(IWorkbenchWindow window) { 422 if(fWindows.add(window)) { 423 window.getSelectionService().addSelectionListener(this); 424 } 425 } 426 427 432 private void addMouseListener(IWorkbenchWindow window) { 433 CoolBarManager cmgr = ((WorkbenchWindow)window).getCoolBarManager(); 434 if(cmgr != null) { 435 IContributionItem item = cmgr.find("org.eclipse.debug.ui.launchActionSet"); if(item instanceof ToolBarContributionItem) { 437 ToolBarManager tmgr = (ToolBarManager) ((ToolBarContributionItem)item).getToolBarManager(); 438 ToolBar bar = tmgr.getControl(); 439 if(bar != null && !bar.isDisposed()) { 440 bar.addMouseTrackListener(fMouseListener); 441 fToolbars.put(window, bar); 442 } 443 } 444 } 445 } 446 447 450 public void propertyChange(PropertyChangeEvent event) { 451 if(event.getProperty().equals(IInternalDebugUIConstants.PREF_USE_CONTEXTUAL_LAUNCH) || 452 event.getProperty().equals(IInternalDebugUIConstants.PREF_LAUNCH_LAST_IF_NOT_LAUNCHABLE)) { 453 if(isContextLaunchEnabled()) { 454 windowActivated(DebugUIPlugin.getActiveWorkbenchWindow()); 455 } 456 fUpdateLabel = true; 457 } 458 } 459 460 463 public void selectionChanged(IWorkbenchPart part, ISelection selection) { 464 fUpdateLabel = isContextLaunchEnabled(); 465 } 466 467 470 public void launchHistoryChanged() { 471 fUpdateLabel = true; 474 } 475 476 479 public void launchesTerminated(ILaunch[] launches) { 480 fUpdateLabel = true; 481 } 482 483 486 public void launchesAdded(ILaunch[] launches) { 487 fUpdateLabel = true; 488 } 489 490 493 public void launchesChanged(ILaunch[] launches) {} 494 495 498 public void launchesRemoved(ILaunch[] launches) {} 499 } 500 | Popular Tags |