package org.erlide.erlang.ui.views; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.text.Document; import org.eclipse.jface.text.TextViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IPartListener2; import org.eclipse.ui.IPropertyListener; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchPartReference; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.ViewPart; import org.eclipse.xtext.resource.IEObjectDescription; import org.eclipse.xtext.resource.IResourceDescription; import org.eclipse.xtext.resource.IResourceDescription.Manager; import org.eclipse.xtext.resource.IResourceServiceProvider; import org.eclipse.xtext.resource.IResourceServiceProvider.Registry; 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.erlide.erlang.ModelDebugExtensions; public class ParseDebugView extends ViewPart { /** * The ID of the view as specified by the extension. */ public static final String ID = "org.erlide.erlang.ui.views.ParseDebugView"; private TextViewer viewer; private Action action1; private Action action2; String crtResult; public ParseDebugView() { } @Override public void createPartControl(final Composite parent) { viewer = new TextViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); viewer.setInput(getViewSite()); final Document doc = new Document(); viewer.setDocument(doc); // Create the help context id for the viewer's control PlatformUI.getWorkbench().getHelpSystem() .setHelp(viewer.getControl(), "org.erlide.erlang.ui.viewer"); makeActions(); hookContextMenu(); contributeToActionBars(); getSite().getPage().addPartListener(new PartListener()); } private void hookContextMenu() { final MenuManager menuMgr = new MenuManager("#PopupMenu"); menuMgr.setRemoveAllWhenShown(true); menuMgr.addMenuListener(new IMenuListener() { @Override public void menuAboutToShow(final IMenuManager manager) { ParseDebugView.this.fillContextMenu(manager); } }); final Menu menu = menuMgr.createContextMenu(viewer.getControl()); viewer.getControl().setMenu(menu); getSite().registerContextMenu(menuMgr, viewer); } private void contributeToActionBars() { final IActionBars bars = getViewSite().getActionBars(); fillLocalPullDown(bars.getMenuManager()); fillLocalToolBar(bars.getToolBarManager()); } private void fillLocalPullDown(final IMenuManager manager) { manager.add(action1); manager.add(new Separator()); manager.add(action2); } private void fillContextMenu(final IMenuManager manager) { manager.add(action1); manager.add(action2); // Other plug-ins can contribute there actions here manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); } private void fillLocalToolBar(final IToolBarManager manager) { manager.add(action1); manager.add(action2); } private void makeActions() { action1 = new Action() { @Override public void run() { showMessage("Action 1 executed"); } }; action1.setText("Action 1"); action1.setToolTipText("Action 1 tooltip"); action1.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages() .getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK)); action2 = new Action() { @Override public void run() { showMessage("Action 2 executed"); } }; action2.setText("Action 2"); action2.setToolTipText("Action 2 tooltip"); action2.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages() .getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK)); } private void showMessage(final String message) { MessageDialog.openInformation(viewer.getControl().getShell(), "Parser debug view", message); } /** * Passing the focus request to the viewer's control. */ @Override public void setFocus() { viewer.getControl().setFocus(); } private class PartListener implements IPartListener2, IPropertyListener { IWorkbenchPart part; @Override public void partActivated(final IWorkbenchPartReference partRef) { if (viewer == null || viewer.getDocument() == null) { return; } part = partRef.getPart(false); updateViewer(); part.addPropertyListener(this); } @Override public void partDeactivated(final IWorkbenchPartReference partRef) { if (part == partRef.getPart(false)) { part.removePropertyListener(this); part = null; } } @Override public void propertyChanged(final Object source, final int propId) { if (propId == IEditorPart.PROP_DIRTY) { updateViewer(); } } private void updateViewer() { if (part instanceof XtextEditor) { updateParsedContentFor((XtextEditor) part); viewer.getDocument().set(crtResult); } } @Override public void partBroughtToTop(final IWorkbenchPartReference partRef) { } @Override public void partClosed(final IWorkbenchPartReference partRef) { } @Override public void partOpened(final IWorkbenchPartReference partRef) { } @Override public void partHidden(final IWorkbenchPartReference partRef) { } @Override public void partVisible(final IWorkbenchPartReference partRef) { } @Override public void partInputChanged(final IWorkbenchPartReference partRef) { } } private String updateParsedContentFor(final XtextEditor part) { part.getDocument().readOnly(new IUnitOfWork<Boolean, XtextResource>() { @Override public Boolean exec(final XtextResource state) throws Exception { final StringBuilder result = new StringBuilder(); for (final EObject obj : state.getContents()) { result.append(new ModelDebugExtensions().debugPrint(obj)); } result.append("----------------").append("\n\nEXPORTS:\n\n"); final IXtextDocument myDocument = part.getDocument(); final Resource resource = myDocument .readOnly(new IUnitOfWork<Resource, XtextResource>() { @Override public Resource exec(final XtextResource res) { return res; } }); final Registry reg = IResourceServiceProvider.Registry.INSTANCE; final Manager mgr = reg.getResourceServiceProvider( resource.getURI()).getResourceDescriptionManager(); final IResourceDescription descr = mgr .getResourceDescription(resource); for (final IEObjectDescription d : descr.getExportedObjects()) { result.append("- ").append(d.getQualifiedName()) .append("\t\t ").append(d.getEClass().getName()) .append("\n"); } crtResult = result.toString(); return Boolean.TRUE; } }); return crtResult; } }