/* * Copyright (c) 2008 Stiftung Deutsches Elektronen-Synchrotron, * Member of the Helmholtz Association, (DESY), HAMBURG, GERMANY. * * THIS SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "../AS IS" BASIS. * WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR PARTICULAR PURPOSE AND * NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * THE USE OR OTHER DEALINGS IN THE SOFTWARE. SHOULD THE SOFTWARE PROVE DEFECTIVE * IN ANY RESPECT, THE USER ASSUMES THE COST OF ANY NECESSARY SERVICING, REPAIR OR * CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. * NO USE OF ANY SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. * DESY HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, * OR MODIFICATIONS. * THE FULL LICENSE SPECIFYING FOR THE SOFTWARE THE REDISTRIBUTION, MODIFICATION, * USAGE AND OTHER RIGHTS AND OBLIGATIONS IS INCLUDED WITH THE DISTRIBUTION OF THIS * PROJECT IN THE FILE LICENSE.HTML. IF THE LICENSE IS NOT INCLUDED YOU MAY FIND A COPY * AT HTTP://WWW.DESY.DE/LEGAL/LICENSE.HTM */ package org.csstudio.sds.ui.internal.runmode; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.csstudio.sds.ui.runmode.RunModeService; import org.eclipse.gef.ContextMenuProvider; import org.eclipse.gef.GraphicalViewer; import org.eclipse.gef.MouseWheelHandler; import org.eclipse.gef.MouseWheelZoomHandler; import org.eclipse.gef.SnapToGeometry; import org.eclipse.gef.SnapToGrid; import org.eclipse.gef.editparts.ScalableFreeformRootEditPart; import org.eclipse.gef.editparts.ZoomManager; import org.eclipse.gef.ui.actions.ActionRegistry; import org.eclipse.gef.ui.actions.ZoomInAction; import org.eclipse.gef.ui.actions.ZoomOutAction; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IMemento; import org.eclipse.ui.IViewSite; import org.eclipse.ui.PartInitException; import org.eclipse.ui.part.ViewPart; /** * A view implementation that uses a GEF graphical viewer to display SDS * displays. * * Note: This view is enabled for multiple use. * * @author Sven Wende */ public final class DisplayViewPart extends ViewPart { private IMemento _memento; private Map<String, String> _mementoInfos; /** * The primary ID of this view. */ public static final String PRIMARY_ID = "org.csstudio.sds.ui.internal.runmode.DisplayViewPart"; /** * The graphical viewer. */ private GraphicalViewer _graphicalViewer; /** * Action for "Zoom In" functionality. */ private IAction _zoomInAction; /** * Action for "Zoom Out" functionality. */ private IAction _zoomOutAction; /** * Action for "Change Layer Visibility" functionality. */ private IAction _changeLayerVisibilityAction; public DisplayViewPart() { } /** * {@inheritDoc} */ @Override public void createPartControl(final Composite parent) { _graphicalViewer = AbstractRunModeBox.createGraphicalViewer(parent); configureGraphicalViewer(_graphicalViewer); final ZoomManager zm = ((ScalableFreeformRootEditPart) _graphicalViewer .getRootEditPart()).getZoomManager(); _zoomInAction = new ZoomInAction(zm); _zoomOutAction = new ZoomOutAction(zm); _changeLayerVisibilityAction = new ChangeLayerVisibilityAction(_graphicalViewer); // open a run mode box which is responsible for this view if (_memento != null) { RunModeService.getInstance().openDisplayViewInRunMode(this, _memento); } createContextMenu(); } /** * Returns the "Zoom In" action. * * @return the "Zoom In" action */ public IAction getZoomInAction() { return _zoomInAction; } /** * Returns the "Zoom Out" action. * * @return the "Zoom Out" action */ public IAction getZoomOutAction() { return _zoomOutAction; } /** * Returns the "Change Layer Visibility" action. * * @return the "Change Layer Visibility" action */ public IAction getChangeLayerVisibilityAction() { return _changeLayerVisibilityAction; } /** * Sets the information that will be stored with this view�s memento object. * * @param mementoInfos */ public void setMementoInfos(final Map<String, String> mementoInfos) { _mementoInfos = mementoInfos; } /** * Cache the memento which will be used in * {@link #createPartControl(Composite)} to create a run mode box. * * {@inheritDoc} */ @Override public void init(final IViewSite site, final IMemento memento) throws PartInitException { _memento = memento; super.init(site, memento); } /** * {@inheritDoc} */ @Override public void setFocus() { } @Override public void setTitleToolTip(String toolTip) { super.setTitleToolTip(toolTip); } /** * Configures the specified graphical viewer. * * @param viewer * the graphical viewer */ private void configureGraphicalViewer(final GraphicalViewer viewer) { assert viewer != null; final ScalableFreeformRootEditPart root = new ScalableFreeformRootEditPart(); viewer.setRootEditPart(root); // configure zoom actions final ZoomManager zm = root.getZoomManager(); final List<String> zoomLevels = new ArrayList<String>(3); zoomLevels.add(ZoomManager.FIT_ALL); zoomLevels.add(ZoomManager.FIT_WIDTH); zoomLevels.add(ZoomManager.FIT_HEIGHT); zm.setZoomLevelContributions(zoomLevels); if (zm != null) { final IAction zoomIn = new ZoomInAction(zm); final IAction zoomOut = new ZoomOutAction(zm); // getActionRegistry().registerAction(zoomIn); // getActionRegistry().registerAction(zoomOut); getSite().getKeyBindingService().registerAction(zoomIn); getSite().getKeyBindingService().registerAction(zoomOut); } /* scroll-wheel zoom */ viewer.setProperty(MouseWheelHandler.KeyGenerator.getKey(SWT.MOD1), MouseWheelZoomHandler.SINGLETON); viewer.setProperty(SnapToGrid.PROPERTY_GRID_VISIBLE, false); viewer.setProperty(SnapToGrid.PROPERTY_GRID_ENABLED, false); viewer.setProperty(SnapToGeometry.PROPERTY_SNAP_ENABLED, false); } private void createContextMenu() { final GraphicalViewer viewer = getGraphicalViewer(); ActionRegistry actionRegistry = new ActionRegistry(); this.createActions(actionRegistry); final ContextMenuProvider cmProvider = new RunModeContextMenuProvider( viewer, actionRegistry); cmProvider.addMenuListener(new IMenuListener() { @Override public void menuAboutToShow(final IMenuManager manager) { manager.setRemoveAllWhenShown(true); } }); viewer.setContextMenu(cmProvider); getSite().registerContextMenu(cmProvider, viewer); } private void createActions(final ActionRegistry actionRegistry) { Action closeAction = new Action() { @Override public void run() { Display.getCurrent().asyncExec(new Runnable() { @Override public void run() { getSite().getWorkbenchWindow().getActivePage().hideView(DisplayViewPart.this); } }); } }; closeAction.setText("Close View"); closeAction.setId(RunModeContextMenuProvider.CLOSE_ACTION_ID); actionRegistry.registerAction(closeAction); } public GraphicalViewer getGraphicalViewer() { return _graphicalViewer; } /** * {@inheritDoc} */ @Override public void saveState(IMemento memento) { if (_mementoInfos != null) { for (String key : _mementoInfos.keySet()) { memento.putString(key, _mementoInfos.get(key)); } } super.saveState(memento); } /** * {@inheritDoc} */ @Override public void setPartName(String partName) { super.setPartName(partName); } }