package com.temenos.interaction.rimdsl.visualisation.views;
/*
* #%L
* com.temenos.interaction.rimdsl.RimDsl - Visualisation
* %%
* Copyright (C) 2012 - 2013 Temenos Holdings N.V.
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* #L%
*/
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.part.*;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.viewers.*;
import org.eclipse.jface.action.*;
import org.eclipse.ui.*;
import org.eclipse.xtext.nodemodel.impl.CompositeNode;
import org.eclipse.xtext.nodemodel.impl.LeafNode;
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
import org.eclipse.xtext.parser.IParseResult;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.ui.editor.XtextEditor;
import org.eclipse.xtext.ui.editor.model.IXtextDocument;
import org.eclipse.xtext.util.concurrent.IUnitOfWork;
import org.eclipse.zest.core.viewers.AbstractZoomableViewer;
import org.eclipse.zest.core.viewers.GraphViewer;
import org.eclipse.zest.core.viewers.IZoomableWorkbenchPart;
import org.eclipse.zest.core.viewers.ZoomContributionViewItem;
import org.eclipse.swt.widgets.Menu;
/**
* This class implements the Resource Interaction Model plug-in in a
* workbench view.
* @author aphethean
*/
public class RIMDSLVisualisationView extends ViewPart implements IZoomableWorkbenchPart, ISelectionListener {
/**
* The ID of the view as specified by the extension.
*/
public static final String ID = "com.temenos.interaction.rimdsl.visualisation.views.RIMDSLVisualisationView";
private FormToolkit toolKit = null;
private ScrolledForm form = null;
private GraphViewer viewer;
private ZoomContributionViewItem contextZoomContributionViewItem;
private TransitionForm visualizationForm;
/**
* The constructor.
*/
public RIMDSLVisualisationView() {
}
/**
* This is a callback that will allow us
* to create the viewer and initialize it.
*/
public void createPartControl(Composite parent) {
toolKit = new FormToolkit(parent.getDisplay());
visualizationForm = new TransitionForm(parent, toolKit, this);
viewer = visualizationForm.getGraphViewer();
form = visualizationForm.getForm();
hookContextMenu();
fillToolBar();
// Register selection service listener
getSite().getWorkbenchWindow().getSelectionService().
addPostSelectionListener(this);
}
/**
* Set the toolbar
*/
private void fillToolBar() {
ZoomContributionViewItem toolbarZoomContributionViewItem = new ZoomContributionViewItem(this);
IActionBars bars = getViewSite().getActionBars();
bars.getMenuManager().add(toolbarZoomContributionViewItem);
IToolBarManager toolBarManager = bars.getToolBarManager();
toolBarManager.add(visualizationForm.showIncomingRelationsAction);
toolBarManager.add(visualizationForm.showOutgoingRelationsAction);
}
/**
* Creates the context menu for this view.
*/
private void hookContextMenu() {
contextZoomContributionViewItem = new ZoomContributionViewItem(this);
MenuManager menuMgr = new MenuManager("#PopupMenu");
menuMgr.setRemoveAllWhenShown(true);
fillContextMenu(menuMgr);
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
RIMDSLVisualisationView.this.fillContextMenu(manager);
}
});
Menu menu = menuMgr.createContextMenu(viewer.getControl());
viewer.getControl().setMenu(menu);
getSite().registerContextMenu(menuMgr, viewer);
}
/**
* Add the items to the context menu
*
* @param manager
*/
private void fillContextMenu(IMenuManager manager) {
manager.add(visualizationForm.showIncomingRelationsAction);
manager.add(visualizationForm.showOutgoingRelationsAction);
manager.add(new Separator());
manager.add(contextZoomContributionViewItem);
}
/**
* Passing the focus request to the viewer's control.
*/
public void setFocus() {
form.setFocus();
}
public void selectionChanged(IWorkbenchPart sourcepart, ISelection selection) {
// we ignore our own selections
if (sourcepart != this) {
if (!selection.isEmpty() && selection instanceof ITextSelection && sourcepart instanceof XtextEditor) {
final ITextSelection textSel = (ITextSelection) selection;
final XtextEditor editor = (XtextEditor)sourcepart;
final IXtextDocument document = editor.getDocument();
// determine the model element at the offset
// Access to the underlying resource in the Xtext editor need to be encapsulated by an IUnitOfWork
document.readOnly(new IUnitOfWork.Void<XtextResource>() {
public void process(XtextResource resource) throws Exception {
// parse the whole resource
IParseResult parseResult = resource.getParseResult();
if(parseResult == null)
return;
// Get the root of the parsing result
CompositeNode rootNode = (CompositeNode) parseResult.getRootNode();
// Get the parsing result around the current offset
int offset = textSel.getOffset();
LeafNode node = (LeafNode) NodeModelUtils.findLeafNodeAtOffset(rootNode, offset);
EObject object = NodeModelUtils.findActualSemanticObjectFor(node);
visualizationForm.setInput(object);
}
});
} else {
visualizationForm.setInput(null);
}
}
}
public AbstractZoomableViewer getZoomableViewer() {
return viewer;
}
public void dispose() {
super.dispose();
// Unregister selection service listener
getSite().getWorkbenchWindow().getSelectionService().
removePostSelectionListener(this);
}
}