/** * Copyright (c) 2011 committers of YAKINDU and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * Contributors: * committers of YAKINDU - initial API and implementation * */ package org.yakindu.sct.simulation.ui.model.presenter; import org.eclipse.debug.core.DebugEvent; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.IDebugEventSetListener; import org.eclipse.debug.core.Launch; import org.eclipse.debug.core.model.IDebugTarget; import org.eclipse.debug.ui.sourcelookup.ISourceDisplay; import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramEditor; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IPartListener; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.PlatformUI; import org.yakindu.sct.simulation.core.debugmodel.SCTDebugElement; import org.yakindu.sct.simulation.core.debugmodel.SCTDebugTarget; import org.yakindu.sct.simulation.core.engine.ISimulationEngine; import org.yakindu.sct.ui.editor.partitioning.DiagramEditorInput; /** * Creates a {@link SCTSourceDisplay} for each {@link IDebugTarget} and * registeres itself as a {@link IDebugEventSetListener}. Terminate events are * deleged to the coresponding {@link IDebugTarget} * * @author andreas muelder - Initial contribution and API * */ public class SCTSourceDisplayDispatcher implements ISourceDisplay, IDebugEventSetListener, IPartListener { private SCTSourceDisplay activeSourceDisplay; private SCTDebugTarget activeDebugTarget; public SCTSourceDisplayDispatcher() { DebugPlugin.getDefault().addDebugEventListener(this); PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().addPartListener(this); } public void displaySource(Object element, IWorkbenchPage page, boolean forceSourceLookup) { SCTDebugTarget newTarget = unwrapTarget(element); if (newTarget.getDebugTarget().isTerminated()) return; if (newTarget != null && activeDebugTarget != newTarget){ if (activeSourceDisplay != null) activeSourceDisplay.terminate(false); activeSourceDisplay = new SCTSourceDisplay( (ISimulationEngine) newTarget.getAdapter(ISimulationEngine.class)); } activeSourceDisplay.displaySource(newTarget, page, forceSourceLookup); activeDebugTarget = newTarget; } protected SCTDebugTarget unwrapTarget(Object element) { if (element instanceof Launch) { IDebugTarget debugTarget = ((Launch) element).getDebugTarget(); if (debugTarget instanceof SCTDebugTarget) return (SCTDebugTarget) debugTarget; } else if (element instanceof SCTDebugElement) { return (SCTDebugTarget) ((SCTDebugElement) element).getDebugTarget(); } return null; } public void handleDebugEvents(DebugEvent[] events) { for (DebugEvent debugEvent : events) { handleDebugEvent(debugEvent); } } protected void handleDebugEvent(DebugEvent debugEvent) { switch (debugEvent.getKind()) { case DebugEvent.TERMINATE: handleDebugTargetTerminated(debugEvent); break; } } protected void handleDebugTargetTerminated(DebugEvent debugEvent) { Object source = debugEvent.getSource(); if (source instanceof IDebugTarget) { IDebugTarget target = (IDebugTarget) source; if (target == activeDebugTarget) { activeSourceDisplay.terminate(true); activeSourceDisplay = null; } } } @Override public void partOpened(IWorkbenchPart part) { highlightState(part); } @Override public void partActivated(IWorkbenchPart part) { highlightState(part); } protected void highlightState(IWorkbenchPart part) { if (part instanceof DiagramEditor) { IEditorInput editorInput = ((DiagramEditor) part).getEditorInput(); if (editorInput instanceof DiagramEditorInput) { if (activeSourceDisplay != null && activeDebugTarget != null) { activeSourceDisplay.displaySource((IEditorPart) part); } } } } @Override public void partClosed(IWorkbenchPart part) { // Nothing to do } @Override public void partBroughtToTop(IWorkbenchPart part) { // Nothing to do } @Override public void partDeactivated(IWorkbenchPart part) { // Nothing to do } }