/** * 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.view; import org.eclipse.debug.core.DebugEvent; import org.eclipse.debug.core.model.IDebugTarget; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseMoveListener; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.forms.widgets.FormToolkit; import org.yakindu.base.types.typesystem.ITypeSystem; import org.yakindu.sct.domain.extension.DomainRegistry; import org.yakindu.sct.domain.extension.IDomain; import org.yakindu.sct.simulation.core.engine.ISimulationEngine; import org.yakindu.sct.simulation.core.sruntime.ExecutionEvent; import org.yakindu.sct.simulation.ui.view.actions.CollapseAllAction; import org.yakindu.sct.simulation.ui.view.actions.ExpandAllAction; import org.yakindu.sct.simulation.ui.view.actions.HideTimeEventsAction; import org.yakindu.sct.simulation.ui.view.editing.ScopeSlotEditingSupport.ITypeSystemProvider; /** * * @author andreas muelder - Initial contribution and API * */ public class SimulationView extends AbstractDebugTargetView implements ITypeSystemProvider { private TreeViewer viewer; private FormToolkit kit; private Font font; private RaiseEventSelectionListener selectionListener; private ITypeSystem typeSystem; public SimulationView() { kit = new FormToolkit(Display.getDefault()); kit.setBorderStyle(SWT.BORDER); font = new Font(Display.getDefault(), new FontData("Courier", 10, SWT.BOLD)); } @Override public void dispose() { selectionListener.dispose(); font.dispose(); super.dispose(); } @Override public void createPartControl(Composite parent) { parent.setLayout(new FillLayout(SWT.VERTICAL)); Composite top = kit.createComposite(parent); top.setLayout(new FillLayout(SWT.VERTICAL)); createViewer(top); hookActions(); super.createPartControl(parent); } @Override public void setFocus() { viewer.getTree().setFocus(); } protected Viewer createViewer(Composite parent) { viewer = ExecutionContextViewerFactory.createViewer(parent, false, this); selectionListener = new RaiseEventSelectionListener(viewer); return viewer; } protected void handleDebugEvent(DebugEvent debugEvent) { switch (debugEvent.getKind()) { case DebugEvent.TERMINATE: Display.getDefault().asyncExec(new Runnable() { public void run() { viewer.setInput(null); } }); break; case DebugEvent.SUSPEND: break; case DebugEvent.RESUME: break; } } protected void activeTargetChanged(final IDebugTarget debugTarget) { updateTypeSystem(debugTarget); ISimulationEngine engine = (ISimulationEngine) debugTarget.getAdapter(ISimulationEngine.class); viewer.setInput(engine.getExecutionContext()); (new ExpandAllAction(viewer)).run(); } private void updateTypeSystem(final IDebugTarget debugTarget) { IDomain domain = DomainRegistry.getDomain((EObject)debugTarget.getAdapter(EObject.class)); typeSystem = domain.getInjector(IDomain.FEATURE_SIMULATION).getInstance(ITypeSystem.class); } protected void hookActions() { IToolBarManager mgr = getViewSite().getActionBars().getToolBarManager(); IAction collapse = new CollapseAllAction(viewer); mgr.add(collapse); IAction expand = new ExpandAllAction(viewer); mgr.add(expand); IAction hideTimeEvent = new HideTimeEventsAction(false); mgr.add(hideTimeEvent); } /** * Listens for event selections within the Context TreeViewer * * @author andreas muelder - Initial contribution and API * */ protected static class RaiseEventSelectionListener { private TreeViewer viewer; private Point mouseLocation; MouseMoveListener moveListener = new MouseMoveListener() { public void mouseMove(MouseEvent e) { mouseLocation = new Point(e.x, e.y); } }; MouseAdapter clickListener = new MouseAdapter() { @Override public void mouseUp(MouseEvent e) { ViewerCell cell = viewer.getCell(mouseLocation); if (cell == null || cell.getColumnIndex() != 0) return; Object element = cell.getElement(); if (element instanceof ExecutionEvent) raiseEvent((ExecutionEvent) element); } }; public RaiseEventSelectionListener(TreeViewer viewer) { this.viewer = viewer; registerMouseListener(); } public void dispose() { if (!viewer.getControl().isDisposed()) { viewer.getControl().removeMouseMoveListener(moveListener); viewer.getControl().removeMouseListener(clickListener); } } protected void registerMouseListener() { viewer.getControl().addMouseMoveListener(moveListener); viewer.getControl().addMouseListener(clickListener); } public void raiseEvent(ExecutionEvent event) { if (event.isRaised()) { event.setRaised(false); } else if (event.isScheduled()) { event.setScheduled(false); } else { event.setScheduled(true); } viewer.refresh(); } } @Override public ITypeSystem getTypeSystem() { return typeSystem; } }