/* * Copyright (c) 2012, the Dart project authors. * * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.eclipse.org/legal/epl-v10.html * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.dart.tools.debug.ui.internal.view; import com.google.dart.tools.debug.ui.internal.DartDebugUIPlugin; import com.google.dart.tools.debug.ui.internal.DartUtil; import com.google.dart.tools.debug.ui.internal.hover.DartDebugHover; import com.google.dart.tools.debug.ui.internal.util.DebuggerEditorInput; import com.google.dart.tools.ui.DartToolsPlugin; import com.google.dart.tools.ui.internal.text.editor.DartHover; import com.google.dart.tools.ui.internal.text.editor.DartTextHover; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.DebugEvent; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.IDebugEventSetListener; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunchListener; import org.eclipse.debug.core.ILaunchManager; import org.eclipse.debug.core.model.IDebugTarget; import org.eclipse.debug.core.model.IProcess; import org.eclipse.debug.ui.DebugUITools; import org.eclipse.debug.ui.contexts.ISuspendTrigger; import org.eclipse.debug.ui.contexts.ISuspendTriggerListener; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IViewReference; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.console.IConsole; import org.eclipse.ui.console.TextConsole; import org.eclipse.ui.views.IViewDescriptor; /** * Manages the Debugger view during the debug session. */ public class DebuggerViewManager implements ILaunchListener, ISuspendTriggerListener, IDebugEventSetListener { private static DebuggerViewManager manager; private static DartDebugHover hoverHelper = new DartDebugHover(); public static void dispose() { if (manager != null) { DebugPlugin.getDefault().removeDebugEventListener(manager); DebugPlugin.getDefault().getLaunchManager().removeLaunchListener(manager); DartTextHover.removeContributer(hoverHelper); manager = null; } } public static DebuggerViewManager getDefault() { if (manager == null) { manager = new DebuggerViewManager(); DebugPlugin.getDefault().getLaunchManager().addLaunchListener( DebuggerViewManager.getDefault()); DebugPlugin.getDefault().addDebugEventListener(DebuggerViewManager.getDefault()); DartTextHover.addContributer(hoverHelper); DartHover.addContributer(hoverHelper); } return manager; } private DebuggerPatternMatchListener patternMatchListener = new DebuggerPatternMatchListener(); DebuggerViewManager() { } @Override public void handleDebugEvents(DebugEvent[] events) { for (DebugEvent event : events) { if (event.getKind() == DebugEvent.CREATE && event.getSource() instanceof IProcess) { attachConsoleListener((IProcess) event.getSource()); } else if (event.getKind() == DebugEvent.TERMINATE && event.getSource() instanceof IDebugTarget) { handleDebugTargetTerminated((IDebugTarget) event.getSource()); } } } /** * Check if the debugger view has been contributed */ public boolean hasDebuggerView() { IViewDescriptor[] views = DartDebugUIPlugin.getDefault().getWorkbench().getViewRegistry().getViews(); for (IViewDescriptor view : views) { if (view.getId().equals(DebuggerView.ID)) { return true; } } return false; } @Override public void launchAdded(ILaunch launch) { try { if (launch.getLaunchConfiguration().getType().getIdentifier().startsWith("com.google") && launch.getLaunchMode().equals(ILaunchManager.DEBUG_MODE)) { // add the suspend trigger listener ISuspendTrigger trigger = (ISuspendTrigger) launch.getAdapter(ISuspendTrigger.class); if (trigger != null) { trigger.addSuspendTriggerListener(this); } } } catch (CoreException e) { DartUtil.logError(e); } } @Override public void launchChanged(ILaunch launch) { } @Override public void launchRemoved(ILaunch launch) { try { if (launch != null && launch.getLaunchConfiguration() != null && launch.getLaunchMode() != null) { if (launch.getLaunchConfiguration().getType().getIdentifier().startsWith("com.google") && launch.getLaunchMode().equals(ILaunchManager.DEBUG_MODE)) { ISuspendTrigger trigger = (ISuspendTrigger) launch.getAdapter(ISuspendTrigger.class); if (trigger != null) { trigger.removeSuspendTriggerListener(this); } } } } catch (CoreException e) { DartUtil.logError(e); } } public void openDebuggerView() { try { IWorkbenchWindow window = DartDebugUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow(); if (window == null) { IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows(); if (windows.length > 0) { IWorkbenchPage[] pages = windows[0].getPages(); if (pages.length > 0) { pages[0].showView(DebuggerView.ID, null, IWorkbenchPage.VIEW_ACTIVATE); } } } else { DartToolsPlugin.showView(DebuggerView.ID); } } catch (PartInitException e) { DartUtil.logError(e); } } @Override public void suspended(ILaunch launch, Object context) { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { if (hasDebuggerView()) { openDebuggerView(); IWorkbenchWindow window = DartDebugUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow(); if (window == null) { window = getWindowWithView(DebuggerView.ID); } window.getShell().forceActive(); IViewReference viewReference = window.getActivePage().findViewReference(DebuggerView.ID); window.getActivePage().activate(viewReference.getPart(true)); } } }); } protected void handleDebugTargetTerminated(IDebugTarget target) { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { closeDebuggerEditors(); } }); } private void attachConsoleListener(IProcess process) { IConsole console = DebugUITools.getConsole(process); if (console instanceof TextConsole) { TextConsole textConsole = (TextConsole) console; textConsole.addPatternMatchListener(patternMatchListener); } } /** * Close any editors that are open on files loaded through the debug channel. */ private void closeDebuggerEditors() { if (Display.getDefault().isDisposed()) { return; } if (PlatformUI.getWorkbench() == null || PlatformUI.getWorkbench().getActiveWorkbenchWindow() == null) { return; } IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); for (IEditorReference ref : page.getEditorReferences()) { IEditorPart editor = ref.getEditor(false); if (editor != null) { if (editor.getEditorInput() instanceof DebuggerEditorInput) { page.closeEditor(editor, false); } } } } private IWorkbenchWindow getWindowWithView(String viewId) { IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows(); if (windows.length > 0) { for (int i = 0; i < windows.length; i++) { IWorkbenchPage[] pages = windows[i].getPages(); for (IWorkbenchPage page : pages) { if (page.findView(viewId) != null) { return windows[i]; } } } } return null; } }