//------------------------------------------------------------------------------ // Copyright (c) 2005, 2006 IBM Corporation 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: // IBM Corporation - initial implementation //------------------------------------------------------------------------------ package org.eclipse.epf.authoring.ui.editors; import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.draw2d.AbsoluteBendpoint; import org.eclipse.draw2d.PositionConstants; import org.eclipse.draw2d.geometry.Point; import org.eclipse.emf.common.CommonPlugin; import org.eclipse.emf.common.command.BasicCommandStack; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain; import org.eclipse.epf.authoring.gef.commands.ChangeBoundsCommand; import org.eclipse.epf.authoring.gef.commands.CreateBendpointCommand; import org.eclipse.epf.authoring.gef.commands.CreateLinkCommand; import org.eclipse.epf.authoring.gef.commands.CreateNodeCommand; import org.eclipse.epf.authoring.gef.commands.MoveBendpointCommand; import org.eclipse.epf.authoring.gef.edit.DecisionNodeEditPart; import org.eclipse.epf.authoring.gef.edit.DiagramActionService; import org.eclipse.epf.authoring.gef.edit.FreeTextNodeEditPart; import org.eclipse.epf.authoring.gef.edit.LinkEditPart; import org.eclipse.epf.authoring.gef.edit.NodeContainerEditPart; import org.eclipse.epf.authoring.gef.edit.NodeEditPart; import org.eclipse.epf.authoring.gef.edit.SynchBarNodeEditPart; import org.eclipse.epf.authoring.gef.figures.FreeTextFigure; import org.eclipse.epf.authoring.gef.util.DiagramUIResources; import org.eclipse.epf.authoring.gef.util.TemplateConstants; import org.eclipse.epf.authoring.ui.AuthoringUIHelpContexts; import org.eclipse.epf.authoring.ui.AuthoringUIPlugin; import org.eclipse.epf.authoring.ui.actions.DiagramPrintAction; import org.eclipse.epf.authoring.ui.views.ViewHelper; import org.eclipse.epf.diagram.model.Diagram; import org.eclipse.epf.diagram.model.Link; import org.eclipse.epf.diagram.model.ModelFactory; import org.eclipse.epf.diagram.model.NamedNode; import org.eclipse.epf.diagram.model.Node; import org.eclipse.epf.diagram.model.TypedNode; import org.eclipse.epf.diagram.model.util.GraphicalDataHelper; import org.eclipse.epf.library.ILibraryManager; import org.eclipse.epf.library.ILibraryServiceListener; import org.eclipse.epf.library.LibraryService; import org.eclipse.epf.library.LibraryServiceUtil; import org.eclipse.epf.library.configuration.ProcessAuthoringConfigurator; import org.eclipse.epf.library.edit.TngAdapterFactory; import org.eclipse.epf.library.edit.util.TngUtil; import org.eclipse.epf.library.events.ILibraryChangeListener; import org.eclipse.epf.library.ui.actions.ProcessDeleteAction; import org.eclipse.epf.library.util.ResourceHelper; import org.eclipse.epf.services.ILibraryPersister; import org.eclipse.epf.ui.editors.IMethodEditor; import org.eclipse.epf.uma.Activity; import org.eclipse.epf.uma.BreakdownElement; import org.eclipse.epf.uma.GraphNode; import org.eclipse.epf.uma.MethodConfiguration; import org.eclipse.epf.uma.MethodElement; import org.eclipse.epf.uma.MethodLibrary; import org.eclipse.epf.uma.Property; import org.eclipse.epf.uma.UmaFactory; import org.eclipse.epf.uma.UmaPackage; import org.eclipse.epf.uma.WorkProductDescriptor; import org.eclipse.epf.uma.util.UmaUtil; import org.eclipse.gef.ContextMenuProvider; import org.eclipse.gef.DefaultEditDomain; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPartFactory; import org.eclipse.gef.EditPartViewer; import org.eclipse.gef.GraphicalEditPart; import org.eclipse.gef.GraphicalViewer; import org.eclipse.gef.KeyHandler; import org.eclipse.gef.KeyStroke; import org.eclipse.gef.commands.Command; import org.eclipse.gef.commands.CommandStack; import org.eclipse.gef.commands.CommandStackEvent; import org.eclipse.gef.commands.CommandStackEventListener; import org.eclipse.gef.dnd.TemplateTransferDragSourceListener; import org.eclipse.gef.dnd.TemplateTransferDropTargetListener; import org.eclipse.gef.editparts.ScalableFreeformRootEditPart; import org.eclipse.gef.palette.PaletteContainer; import org.eclipse.gef.palette.PaletteEntry; import org.eclipse.gef.palette.PaletteRoot; import org.eclipse.gef.requests.CreateRequest; import org.eclipse.gef.requests.CreationFactory; import org.eclipse.gef.ui.actions.ActionRegistry; import org.eclipse.gef.ui.actions.CopyTemplateAction; import org.eclipse.gef.ui.actions.DeleteAction; import org.eclipse.gef.ui.actions.GEFActionConstants; import org.eclipse.gef.ui.palette.PaletteViewer; import org.eclipse.gef.ui.palette.PaletteViewerProvider; import org.eclipse.gef.ui.palette.FlyoutPaletteComposite.FlyoutPreferences; import org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette; import org.eclipse.gef.ui.parts.GraphicalViewerKeyHandler; import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.util.SafeRunnable; import org.eclipse.jface.util.TransferDropTargetListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.BusyIndicator; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.FontDialog; import org.eclipse.swt.widgets.Listener; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IPartListener; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.actions.ActionFactory; /** * Abstract base class for all diagram editors * * @author Phong Nguyen Le * @author Jim Thario * @author Jinhua Xi * @since 1.0 */ public abstract class AbstractDiagramEditor extends GraphicalEditorWithFlyoutPalette implements IMethodEditor { private static final String REFRESH_FROM_BASE_ACTIVITY = "refresh_from_base_activity"; //$NON-NLS-1$ // protected static final String ALIGN_HORZ_AVERAGE = // "align_horizontal_to_average"; //$NON-NLS-1$ // protected static final String ALIGN_HORZ_FIRST_SELECTED = // "align_horizontal_to_first_selection"; //$NON-NLS-1$ // protected static final String ALIGN_VERT_AVERAGE = // "align_vertical_to_average"; //$NON-NLS-1$ // protected static final String ALIGN_VERT_FIRST_SELECTED = // "align_vertical_to_first_selection"; //$NON-NLS-1$ private static final String FONT_DIALOG = "font_dialog"; //$NON-NLS-1$ private static final String CREATE_LINK = "create_link"; //$NON-NLS-1$ private static final String SELECT_LINK = "select_link"; //$NON-NLS-1$ private static final String CREATE_BEND_POINT = "create_bend_point"; //$NON-NLS-1$ protected static final String CREATE_FREE_TEXT = "create_free_text"; //$NON-NLS-1$ public static final String MOVE = "move"; //$NON-NLS-1$ protected static final String REFRESH = "refresh"; //$NON-NLS-1$ protected static final String ALIGN_BEND_POINT = "align_bend_point"; //$NON-NLS-1$ protected static final String PALETTE_DOCK_LOCATION = "Dock location"; //$NON-NLS-1$ protected static final String PALETTE_SIZE = "Palette Size"; //$NON-NLS-1$ protected static final String PALETTE_STATE = "Palette state"; //$NON-NLS-1$ protected static final int DEFAULT_PALETTE_SIZE = 130; protected static final String DELETE_DIAGRAM = "delete_actvity_detail_diagram"; //$NON-NLS-1$ private KeyHandler sharedKeyHandler; private PaletteRoot paletteRoot; protected EditPart editPart; private CommandStackEventListener cmdStackEventListener; protected CreationFactory freeTxtNodeCreationFactory; protected DiagramActionService actionService = null; private boolean disposed; /** * The parent is the editor from where the user opened this editor. */ protected IEditorPart parentEditor = null; /** * This is used to listen for our parent editor and our own closing. When it * does, we ask the user if they want to close this diagram as well. */ protected IPartListener partListener = new IPartListener() { IEditorPart me = AbstractDiagramEditor.this; public void partOpened(IWorkbenchPart part) { } public void partDeactivated(IWorkbenchPart part) { } public void partClosed(IWorkbenchPart part) { // check if the editor closed as a result of user action or the // workbench closing // IWorkbench wb = PlatformUI.getWorkbench(); if (part == me) { setParentEditor(null); IWorkbenchPage page = getSite().getPage(); page.removePartListener(partListener); // remove this diagram if it is new Diagram diagram = (Diagram) ((EditPart) getGraphicalViewer() .getContents()).getModel(); // make sure we remove the UMA diagram from the model if it is // new (never saved) if (diagram.isNew()) { if (diagram.getUMADiagram() != null) { EcoreUtil.remove(diagram.getUMADiagram()); } if(isResourceChangedByOther()) { doSave(new NullProgressMonitor()); } } } // else if (!wb.isClosing()) { // // are we being notified about our parent editor object? // if (getParentEditor() != null) { // if (part == getParentEditor()) { // IWorkbenchPage page = getSite().getPage(); // // yes, ask the user if they want to close this // // editor // if (AuthoringUIPlugin // .getDefault() // .getMsgDialog() // .displayPrompt( // DiagramUIResources // .getString("DiagramUI.AbstractDiagramEditor.ParentEditorClose.title"), // //$NON-NLS-1$ // DiagramUIResources // .formatString( // "DiagramUI.AbstractDiagramEditor.ParentEditorClose.text", // getParentEditor().getTitle(), me.getTitle()))) { //$NON-NLS-1$ // // yes, close this diagram, ask to save changes // page.closeEditor(me, true); // } // // either way, our parent is closed and we can stop // // listening // page.removePartListener(partListener); // } // } // } } public void partBroughtToTop(IWorkbenchPart part) { } public void partActivated(IWorkbenchPart part) { } }; private Font font; private Color color; private Command refreshFromBaseCommand = new Command(DiagramUIResources.AbstractDiagramEditorrefreshfrombase) { private ArrayList oldContent = new ArrayList(); public void execute() { Diagram diagram = (Diagram) editPart.getModel(); // back up old diagram content // oldContent.clear(); oldContent.addAll(diagram.getUMADiagram().getContained()); GraphicalDataHelper.refreshFromBase(diagram.getUMADiagram()); if (editPart.isActive()) { editPart.deactivate(); } diagram.removeConsumer(this); createEditPart(); getGraphicalViewer().setContents(editPart); } public void undo() { Diagram diagram = (Diagram) editPart.getModel(); diagram.getUMADiagram().getContained().clear(); diagram.getUMADiagram().getContained().addAll(oldContent); if (editPart.isActive()) { editPart.deactivate(); } diagram.removeConsumer(this); createEditPart(); getGraphicalViewer().setContents(editPart); } }; protected Map templateNameToCreationFactoryMap; /** * Records time when the model first has been changed by this editor. This will be used later * to determine if save is needed to reverse the changes. */ protected long changeTime = -1; protected MethodConfiguration currentConfig; class DiagramContextMenuProvider extends ContextMenuProvider { private ActionRegistry actionRegistry; /** * Creates a new WorkflowContextMenuProvider assoicated with the given * viewer and action registry. * * @param viewer * the viewer * @param registry * the action registry */ public DiagramContextMenuProvider(EditPartViewer viewer, ActionRegistry registry) { super(viewer); setActionRegistry(registry); } /** * @see ContextMenuProvider#buildContextMenu(org.eclipse.jface.action.IMenuManager) */ public void buildContextMenu(IMenuManager menu) { GEFActionConstants.addStandardActionGroups(menu); IAction action; action = getActionRegistry().getAction(ActionFactory.UNDO.getId()); menu.appendToGroup(GEFActionConstants.GROUP_UNDO, action); action = getActionRegistry().getAction(ActionFactory.REDO.getId()); menu.appendToGroup(GEFActionConstants.GROUP_UNDO, action); boolean canModify = !isReadOnly(); action = getActionRegistry() .getAction(ActionFactory.DELETE.getId()); if (action.isEnabled() && canModify) { if (!TngUtil.isLocked(getMethodElementFromInput())) { menu.appendToGroup(GEFActionConstants.GROUP_EDIT, action); } } action = getActionRegistry().getAction(REFRESH); menu.appendToGroup(GEFActionConstants.GROUP_VIEW, action); action = getActionRegistry().getAction(FONT_DIALOG); if (action.isEnabled() && canModify) { menu.appendToGroup(GEFActionConstants.MB_ADDITIONS, action); } IAction createFreeTextAction = getActionRegistry().getAction( CREATE_FREE_TEXT); if (createFreeTextAction.isEnabled() && canModify) { menu.appendToGroup(GEFActionConstants.MB_ADDITIONS, createFreeTextAction); } // IAction moveAction = getActionRegistry().getAction(MOVE); // if(moveAction.isEnabled()){ // menu.appendToGroup(GEFActionConstants.MB_ADDITIONS,moveAction); // } IAction linkAction = getActionRegistry().getAction(CREATE_LINK); if (linkAction.isEnabled() && canModify) { menu.appendToGroup(GEFActionConstants.MB_ADDITIONS, linkAction); } IAction selectlinkAction = getActionRegistry().getAction( SELECT_LINK); if (selectlinkAction.isEnabled()) { menu.appendToGroup(GEFActionConstants.MB_ADDITIONS, selectlinkAction); } IAction bendpointAction = getActionRegistry().getAction( CREATE_BEND_POINT); if (bendpointAction.isEnabled() && canModify) { menu.appendToGroup(GEFActionConstants.MB_ADDITIONS, bendpointAction); } IAction alignbendpointaction = getActionRegistry().getAction( ALIGN_BEND_POINT); if (alignbendpointaction.isEnabled() && canModify) { menu.appendToGroup(GEFActionConstants.MB_ADDITIONS, alignbendpointaction); } //Print Action for diagram through Context Menu. // Enable this code when print required for diagram. // action = getActionRegistry().getAction(ActionFactory.PRINT.getId()); // if(action.isEnabled()){ // menu.appendToGroup(GEFActionConstants.GROUP_PRINT, action); // } contributeToContextMenu(menu); } private ActionRegistry getActionRegistry() { return actionRegistry; } /** * Sets the action registry * * @param registry * the action registry */ public void setActionRegistry(ActionRegistry registry) { actionRegistry = registry; } } /** * Creates an instance * */ public AbstractDiagramEditor() { super(); setEditDomain(new DefaultEditDomain(this)); getEditDomain().setCommandStack(new CommandStack() { public boolean isDirty() { Command cmd = getUndoCommand(); if (cmd != null && !cmd.canUndo()) { return false; } return super.isDirty(); } /* (non-Javadoc) * @see org.eclipse.gef.commands.CommandStack#execute(org.eclipse.gef.commands.Command) */ public void execute(Command command) { if(command == null || !command.canExecute()) { return; } if(changeTime == -1) { changeTime = System.currentTimeMillis(); } super.execute(command); } }); // add CommandStackEventListener // cmdStackEventListener = new CommandStackEventListener() { public void stackChanged(CommandStackEvent event) { if (event.getDetail() == CommandStack.POST_EXECUTE) { firePropertyChange(PROP_DIRTY); } } }; getEditDomain().getCommandStack().addCommandStackEventListener( cmdStackEventListener); // add our part listener if either parent or this closes IWorkbench wb = PlatformUI.getWorkbench(); IWorkbenchWindow win = wb.getActiveWorkbenchWindow(); IWorkbenchPage page = win.getActivePage(); page.addPartListener(partListener); } /** * * @see org.eclipse.gef.ui.parts.GraphicalEditor#dispose() */ public void dispose() { getCommandStack() .removeCommandStackEventListener(cmdStackEventListener); if (isDirty()) { // changes discarded, reverse to saved // reverseToSaved(); } if (editPart != null) { Diagram diagram = (Diagram) editPart.getModel(); if (diagram != null) { diagram.removeConsumer(this); } } if (font != null && !font.isDisposed()) { font.dispose(); } if (color != null && !color.isDisposed()) { color.dispose(); } ILibraryManager manager = LibraryService.getInstance().getCurrentLibraryManager(); if (manager != null) { manager.removeListener(libraryListener); } LibraryService.getInstance().removeListener(libSvcListener); super.dispose(); disposed = true; } private boolean isResourceChangedByOther() { Resource resource = getMethodElementFromInput().eResource(); if(resource != null && resource.getURI().isFile()){ File file = new File(resource.getURI().toFileString()); return file.lastModified() > changeTime; } return false; } /** * */ private void reverseToSaved() { // save the undone changes only if the resource has been changed outside this editor // boolean saveNeeded = getCommandStack().isDirty() && isResourceChangedByOther(); changeTime = -1; while (getCommandStack().isDirty()) { getCommandStack().undo(); } if (saveNeeded) { ILibraryPersister.FailSafeMethodLibraryPersister persister = LibraryServiceUtil.getCurrentPersister().getFailSafePersister(); try { persister.save(getMethodElementFromInput().eResource()); persister.commit(); } catch (Exception e) { CommonPlugin.INSTANCE.log(e); try { persister.rollback(); } catch (Exception ex) { ViewHelper.reloadCurrentLibrary(getSite().getShell(), null); } } } } protected void contributeToContextMenu(IMenuManager menu) { boolean canModify = !isReadOnly(); IAction action = getActionRegistry().getAction( REFRESH_FROM_BASE_ACTIVITY); if (action.isEnabled() && canModify) { menu.appendToGroup(GEFActionConstants.MB_ADDITIONS, action); } // the align menu is a cascading menu IContributionItem ci = createAlignMenu(); if (ci.isEnabled() && canModify) { menu .appendToGroup(GEFActionConstants.MB_ADDITIONS, new Separator()); menu.appendToGroup(GEFActionConstants.MB_ADDITIONS, ci); menu .appendToGroup(GEFActionConstants.MB_ADDITIONS, new Separator()); } action = getActionRegistry().getAction(DELETE_DIAGRAM); if (action.isEnabled() && canModify) { menu .appendToGroup(GEFActionConstants.MB_ADDITIONS, new Separator()); menu.appendToGroup(GEFActionConstants.MB_ADDITIONS, action); menu .appendToGroup(GEFActionConstants.MB_ADDITIONS, new Separator()); } } protected IContributionItem createAlignMenu() { // create a new menu manager for the cascading menu MenuManager alignMenuManager = new MenuManager(DiagramUIResources.AbstractDiagramEditor_alignMenu_text) { public boolean isEnabled() { int total = 0; // enable the menu only if 2 or more nodes or node containers // are selected List editParts = getGraphicalViewer().getSelectedEditParts(); // need at least two things selected to align if (editParts.size() > 1) { for (int a = 0; a < editParts.size(); a++) { EditPart editPart = (EditPart) editParts.get(a); // we can align nodes and containers if (editPart instanceof NodeEditPart || editPart instanceof NodeContainerEditPart) { // add up the elements we need, there may be more // elements selected (links, etc.) total++; if (total > 1) { // we only need to know there is more than 1, so // we can stop here break; } } } } return total > 1; } }; // add the actions to this menu alignMenuManager.add(getActionRegistry().getAction( DiagramActionService.ALIGN_HORZ_AVERAGE)); alignMenuManager.add(getActionRegistry().getAction( DiagramActionService.ALIGN_HORZ_FIRST_SELECTED)); alignMenuManager.add(getActionRegistry().getAction( DiagramActionService.ALIGN_VERT_AVERAGE)); alignMenuManager.add(getActionRegistry().getAction( DiagramActionService.ALIGN_VERT_FIRST_SELECTED)); return alignMenuManager; } protected void refreshFromBase() { getCommandStack().execute(refreshFromBaseCommand); // Diagram diagram = (Diagram) editPart.getModel(); // GraphicalDataHelper.refreshFromBase(diagram.getUMADiagram()); // Object act = diagram.getObject(); // if(editPart.isActive()) { // editPart.deactivate(); // } // diagram.removeConsumer(this); // editPart = createEditPart(act); // getGraphicalViewer().setContents(editPart); } protected void createActions() { super.createActions(); ActionRegistry registry = getActionRegistry(); IAction action; // replace default delete action with a custom one // action = registry.getAction(ActionFactory.DELETE.getId()); if (action != null) { registry.removeAction(action); getSelectionActions().remove(action); } action = new DeleteAction((IWorkbenchPart) this) { /* * (non-Javadoc) * * @see org.eclipse.gef.ui.actions.WorkbenchPartAction#isEnabled() */ public boolean isEnabled() { return super.isEnabled(); } /* * (non-Javadoc) * * @see org.eclipse.gef.ui.actions.DeleteAction#calculateEnabled() */ // protected boolean calculateEnabled() { // for (Iterator iter = getSelectedObjects().iterator(); // iter.hasNext();) { // Object editPart = iter.next(); // if(editPart instanceof EditPart) { // Object obj = ((EditPart)editPart).getModel(); // if(obj instanceof NamedNode) { // Object element = ((NamedNode)obj).getObject(); // if(element instanceof BreakdownElement) { // return false; // } // } // } // } // return super.calculateEnabled(); // } // TODO: uncomment this code if we are ready to test deleting // BreakdownElement node // // /* (non-Javadoc) // * @see org.eclipse.gef.ui.actions.DeleteAction#run() // */ public void run() { List elements = new ArrayList(); for (Iterator iter = getSelectedObjects().iterator(); iter .hasNext();) { Object editPart = iter.next(); if (editPart instanceof EditPart) { Object obj = ((EditPart) editPart).getModel(); if (obj instanceof NamedNode) { Object element = ((NamedNode) obj).getObject(); if (element instanceof BreakdownElement) { elements.add(element); } } } } if (!elements.isEmpty()) { ProcessDeleteAction deleteAction = new ProcessDeleteAction() { /* * (non-Javadoc) * * @see org.eclipse.epf.authoring.ui.actions.MethodElementDeleteAction#createCommand(java.util.Collection) */ public org.eclipse.emf.common.command.Command createCommand( Collection selection) { domain = null; for (Iterator iter = selection.iterator(); iter .hasNext();) { Object element = iter.next(); if (element instanceof WorkProductDescriptor) { domain = new AdapterFactoryEditingDomain( TngAdapterFactory.INSTANCE .getPBS_ComposedAdapterFactory(), new BasicCommandStack()); break; } } if (domain == null) { domain = new AdapterFactoryEditingDomain( TngAdapterFactory.INSTANCE .getWBS_ComposedAdapterFactory(), new BasicCommandStack()); } return super.createCommand(selection); } }; deleteAction.updateSelection(new StructuredSelection( elements)); deleteAction.run(); if (deleteAction.isDeletionConfirmed()) { super.run(); // save the editor // BusyIndicator.showWhile(getEditorSite().getShell() .getDisplay(), new Runnable() { public void run() { doSave(new NullProgressMonitor()); } }); } } else { super.run(); } } }; registry.registerAction(action); getSelectionActions().add(action.getId()); action = new CopyTemplateAction(this); registry.registerAction(action); // refresh diagram from base action // action = new Action( DiagramUIResources.AbstractDiagramEditor_refreshFromBaseActivity_text) { public String getId() { return REFRESH_FROM_BASE_ACTIVITY; } public void run() { refreshFromBase(); } public boolean isEnabled() { Activity act = (Activity) getMethodElementFromInput(); return act.getVariabilityBasedOnElement() != null; } }; registry.registerAction(action); // action = new MatchWidthAction(this); // registry.registerAction(action); // getSelectionActions().add(action.getId()); // action = new MatchHeightAction(this); // registry.registerAction(action); // getSelectionActions().add(action.getId()); // action = new LogicPasteTemplateAction(this); // registry.registerAction(action); // getSelectionActions().add(action.getId()); // action = new IncrementDecrementAction(this, true); // registry.registerAction(action); // getSelectionActions().add(action.getId()); // // action = new IncrementDecrementAction(this, false); // registry.registerAction(action); // getSelectionActions().add(action.getId()); // // action = new DirectEditAction((IWorkbenchPart)this); // registry.registerAction(action); // getSelectionActions().add(action.getId()); // // action = new AlignmentAction((IWorkbenchPart)this, // PositionConstants.LEFT); // registry.registerAction(action); // getSelectionActions().add(action.getId()); // // action = new AlignmentAction((IWorkbenchPart)this, // PositionConstants.RIGHT); // registry.registerAction(action); // getSelectionActions().add(action.getId()); // // action = new AlignmentAction((IWorkbenchPart)this, // PositionConstants.TOP); // registry.registerAction(action); // getSelectionActions().add(action.getId()); // // action = new AlignmentAction((IWorkbenchPart)this, // PositionConstants.BOTTOM); // registry.registerAction(action); // getSelectionActions().add(action.getId()); // // action = new AlignmentAction((IWorkbenchPart)this, // PositionConstants.CENTER); // registry.registerAction(action); // getSelectionActions().add(action.getId()); // // action = new AlignmentAction((IWorkbenchPart)this, // PositionConstants.MIDDLE); // registry.registerAction(action); // getSelectionActions().add(action.getId()); IAction action1 = new Action( DiagramUIResources.AbstractDiagramEditor_formatTextBoxActivity_text) { public String getId() { return FONT_DIALOG; } public void run() { try { try { EditPart selectedEditPart = (EditPart) getGraphicalViewer() .getSelectedEditParts().get(0); FontDialog fd = new FontDialog(PlatformUI .getWorkbench().getActiveWorkbenchWindow() .getShell()); // Restoring old values. if(selectedEditPart != null){ restoreFontData(selectedEditPart, fd); } fd.open(); if (selectedEditPart instanceof FreeTextNodeEditPart) { if (fd.getFontList() != null) { FontData fData = fd.getFontList()[0]; if (fData != null) { if (font != null && !font.isDisposed()) { font.dispose(); } // if(color != null && !font.isDisposed()){ // color.dispose(); // } font = new Font(PlatformUI.getWorkbench() .getDisplay(), fData); if(fd.getRGB() != null) color = new Color(null, fd.getRGB()); ((FreeTextFigure) ((FreeTextNodeEditPart) selectedEditPart) .getFigure()).setFont(font); if(color != null) ((FreeTextFigure) ((FreeTextNodeEditPart) selectedEditPart) .getFigure()) .setForegroundColor(color); GraphNode graphNode = ((Node) selectedEditPart .getModel()).getGraphNode(); List list = graphNode .getList(UmaPackage.GRAPH_NODE__PROPERTY); String text = ((FreeTextFigure) ((FreeTextNodeEditPart) selectedEditPart) .getFigure()).getText(); Property property = getPropertyByKey( list, GraphicalDataHelper.GRAPH_NODE_FREE_TEXT); if (property != null) { property.setValue(text); list.add(property); } setProperty( list, TemplateConstants.PROPERTY_FONT_NAME, fData.getName()); setProperty( list, TemplateConstants.PROPERTY_FONT_STYLE, new Integer(fData.getStyle()) .toString()); setProperty( list, TemplateConstants.PROPERTY_FONT_HEIGHT, new Integer(fData.getHeight()) .toString()); if(fd.getRGB() != null){ setProperty( list, TemplateConstants.PROPERTY_FONT_RED, new Integer(fd.getRGB().red) .toString()); setProperty( list, TemplateConstants.PROPERTY_FONT_BLUE, new Integer(fd.getRGB().blue) .toString()); setProperty( list, TemplateConstants.PROPERTY_FONT_GREEN, new Integer(fd.getRGB().green) .toString()); } selectedEditPart.refresh(); } } } } catch (Exception exception) { exception.printStackTrace(); } } catch (RuntimeException e) { e.printStackTrace(); } } public boolean isEnabled() { List editParts = getGraphicalViewer().getSelectedEditParts(); if (editParts.size() != 1) return false; EditPart editPart = (EditPart) editParts.get(0); if (editPart.getModel() instanceof TypedNode) { return (((TypedNode) editPart.getModel()).getType() == TypedNode.FREE_TEXT); } return false; } public Property getPropertyByKey(List list, String key) { if (!list.isEmpty()) { for (Iterator iror = list.iterator(); iror.hasNext();) { Property property = (Property) iror.next(); if (property != null) { if (property.getKey().equals(key)) { return property; } } } } return null; } public void setProperty(List list, String key, String value) { Property property = getPropertyByKey(list, key); if (property != null) { property.setValue(value); } else { property = UmaFactory.eINSTANCE.createProperty(); property.setKey(key); property.setValue(value); } list.add(property); } public void restoreFontData(EditPart selectedEditPart, FontDialog fd){ GraphNode graphNode = ((Node) selectedEditPart .getModel()).getGraphNode(); List list = graphNode .getList(UmaPackage.GRAPH_NODE__PROPERTY); if(list != null && !list.isEmpty()){ Property property = null; String fontname = null, fontStyle = null, fontHeight = null, red = null, blue = null, green = null; property = getPropertyByKey(list, TemplateConstants.PROPERTY_FONT_NAME); if(property != null ){ fontname = property.getValue(); }else{ return; } property = getPropertyByKey(list, TemplateConstants.PROPERTY_FONT_STYLE); if(property != null ){ fontStyle = property.getValue(); } property = getPropertyByKey(list, TemplateConstants.PROPERTY_FONT_HEIGHT); if(property != null){ fontHeight = property.getValue(); } property = getPropertyByKey(list, TemplateConstants.PROPERTY_FONT_RED); if(property != null){ red = property.getValue(); } property = getPropertyByKey(list, TemplateConstants.PROPERTY_FONT_BLUE); if(property != null){ blue = property.getValue(); } property = getPropertyByKey(list, TemplateConstants.PROPERTY_FONT_GREEN); if(property != null){ green = property.getValue(); } FontData fData = new FontData(); fData.setName(fontname); fData.setHeight((new Integer(fontHeight)).intValue()); fData.setStyle((new Integer(fontStyle)).intValue()); //, (new Integer(fontStyle)).intValue(), (new Integer(fontHeight)).intValue()); if( red != null && blue != null && green != null){ RGB rgb = new RGB(new Integer(red).intValue(), new Integer(green).intValue(), new Integer(blue).intValue() ); fd.setRGB(rgb); // if(rgb != null){ // rgb.red = new Integer(red).intValue(); // rgb.blue = new Integer(blue).intValue(); // rgb.green = new Integer(green).intValue(); // } } fd.setFontList(new FontData[]{fData}); } } }; getActionRegistry().registerAction(action1); // Jinhua Xi // added this to consolidate common actions into a service class actionService = new DiagramActionService(getGraphicalViewer(), getEditDomain(), registry); actionService.registerHorizontalAlignAverageAction(); actionService.registerHorizontalAlignFirstSelectedAction(); actionService.registerVerticalAlignAverageAction(); actionService.registerVerticalAlignFirstSelectedAction(); // // align horizontally to average y-value of all nodes // IAction hAlignAverageAction = new Action( // DiagramUIResources // .getString("DiagramUI.AbstractDiagramEditor.hAlignAverageAction.text")) // { //$NON-NLS-1$ // public void run() { // horizAlignToAverageSelected(); // } // // public String getId() { // return ALIGN_HORZ_AVERAGE; // } // }; // getActionRegistry().registerAction(hAlignAverageAction); // // // align horizontally to y-value of first selected node // IAction hAlignFirstSelectedAction = new Action( // DiagramUIResources // .getString("DiagramUI.AbstractDiagramEditor.hAlignFirstSelectedAction.text")) // { //$NON-NLS-1$ // public void run() { // horzAlignToFirstSelected(); // } // // public String getId() { // return ALIGN_HORZ_FIRST_SELECTED; // } // }; // getActionRegistry().registerAction(hAlignFirstSelectedAction); // // // align vertically to average x-value of all selected nodes // IAction vAlignAverageAction = new Action( // DiagramUIResources // .getString("DiagramUI.AbstractDiagramEditor.vAlignAverageAction.text")) // { //$NON-NLS-1$ // public void run() { // verticalAlignToAverageSelected(); // } // // public String getId() { // return ALIGN_VERT_AVERAGE; // } // }; // getActionRegistry().registerAction(vAlignAverageAction); // // // align vertically to x-value of first selected node // IAction vAlignFirstSelectedAction = new Action( // DiagramUIResources // .getString("DiagramUI.AbstractDiagramEditor.vAlignFirstSelectedAction.text")) // { //$NON-NLS-1$ // public void run() { // verticalAlignToFirstSelected(); // } // // public String getId() { // return ALIGN_VERT_FIRST_SELECTED; // } // }; // getActionRegistry().registerAction(vAlignFirstSelectedAction); action = createAnAction( DiagramUIResources.AbstractDiagram_FreeText_text, freeTxtNodeCreationFactory, CREATE_FREE_TEXT, DiagramUIResources.AbstractDiagram_FreeText_tooltip, AuthoringUIPlugin.getDefault().getImageDescriptor( "freetext_pal16.gif")); //$NON-NLS-1$ getActionRegistry().registerAction(action); action = new Action(DiagramUIResources.moveAction_label) { public void setImageDescriptor(ImageDescriptor newImage) { super.setImageDescriptor(newImage); } public void runWithEvent(Event event) { super.runWithEvent(event); } public void run() { super.run(); } public boolean isEnabled() { List editParts = getGraphicalViewer().getSelectedEditParts(); if (editParts.size() > 0) return true; return false; } public String getId() { return MOVE; } }; getActionRegistry().registerAction(action); IAction linkAction = new Action(DiagramUIResources.AbstractDiagram_Link_text) { public void run() { List editParts = getGraphicalViewer().getSelectedEditParts(); if (editParts.size() == 2) { EditPart sourceEditPart = (EditPart) editParts.get(0); EditPart targetEditPart = (EditPart) editParts.get(1); List targetList = new ArrayList(); if (sourceEditPart instanceof FreeTextNodeEditPart || targetEditPart instanceof FreeTextNodeEditPart) return; if (sourceEditPart instanceof NodeEditPart) { targetList = ((NodeEditPart) sourceEditPart) .getSourceConnections(); if (!targetList.isEmpty()) { for (Iterator itor = targetList.iterator(); itor .hasNext();) { LinkEditPart obj = (LinkEditPart) itor.next(); if (targetEditPart.equals(obj.getSource())) return; if (targetEditPart.equals(obj.getTarget())) return; } } targetList = ((NodeEditPart) sourceEditPart) .getTargetConnections(); if (!targetList.isEmpty()) { for (Iterator itor = targetList.iterator(); itor .hasNext();) { LinkEditPart obj = (LinkEditPart) itor.next(); if (targetEditPart.equals(obj.getSource())) return; if (targetEditPart.equals(obj.getTarget())) return; } } } Link link = ModelFactory.eINSTANCE.createLink(); if (sourceEditPart.getModel() instanceof Node) link.setSource((Node) sourceEditPart.getModel()); if (targetEditPart.getModel() instanceof Node) link.setTarget((Node) targetEditPart.getModel()); org.eclipse.gef.commands.Command c = new CreateLinkCommand( link, (Node) sourceEditPart.getModel()); getCommandStack().execute(c); } } public boolean isEnabled() { List editParts = getGraphicalViewer().getSelectedEditParts(); for (Iterator itor = editParts.iterator(); itor.hasNext();) { Object part = itor.next(); if (part instanceof FreeTextNodeEditPart) return false; } if (editParts.size() == 2) return true; return false; } public String getId() { return CREATE_LINK; } }; getActionRegistry().registerAction(linkAction); IAction selectLinkAction = new Action(DiagramUIResources.AbstractDiagram_Link_select) { public void run() { List editParts = getGraphicalViewer().getSelectedEditParts(); if (editParts.size() == 1) { EditPart part = (EditPart) editParts.get(0); if (part instanceof NodeEditPart) { List list = ((NodeEditPart) part) .getSourceConnections(); if (list != null && !list.isEmpty()) { LinkEditPart linkpart = (LinkEditPart) list.get(0); linkpart.setSelected(1); getGraphicalViewer().select(linkpart); // part.setSelected(0); } } } } public boolean isEnabled() { List editParts = getGraphicalViewer().getSelectedEditParts(); if (editParts.size() == 1) { return true; } return false; } public String getId() { return SELECT_LINK; } }; getActionRegistry().registerAction(selectLinkAction); IAction createBendPointAction = new Action(DiagramUIResources.AbstractDiagram_BendPoint_create) { public void run() { List editParts = getGraphicalViewer().getSelectedEditParts(); if (editParts.size() == 1) { EditPart part = (EditPart) editParts.get(0); if (part instanceof LinkEditPart) { // return true; Link link = (Link) ((LinkEditPart) part).getModel(); List bendpoints = link.getBendpoints(); if (bendpoints == null || bendpoints.size() < 1) { Point sp = link.getSourceEndPoint(); Point tp = link.getTargetEndPoint(); if (sp == null) { if (link.getSource() == null) { sp = ((Node) link.eContainer()) .getLocation(); } else { sp = link.getSource().getLocation(); } } if (tp == null) { tp = link.getTarget().getLocation(); } Point bPoint = new Point(); bPoint.x = (sp.x + tp.x) / 2; bPoint.y = (sp.y + tp.y) / 2; org.eclipse.gef.commands.Command c = new CreateBendpointCommand( link, bPoint, 0); getCommandStack().execute(c); } } } } public boolean isEnabled() { List editParts = getGraphicalViewer().getSelectedEditParts(); if (editParts.size() == 1) { EditPart part = (EditPart) editParts.get(0); if (part instanceof LinkEditPart) { return true; } } return false; } public String getId() { return CREATE_BEND_POINT; } }; getActionRegistry().registerAction(createBendPointAction); IAction refreshAction = new Action(DiagramUIResources.refreshAction_label) { public void run() { Diagram diagram = (Diagram) editPart.getModel(); if (editPart.isActive()) { editPart.deactivate(); } diagram.removeConsumer(AbstractDiagramEditor.this); createEditPart(); getGraphicalViewer().setContents(editPart); } public String getId() { return REFRESH; } }; getActionRegistry().registerAction(refreshAction); IAction deleteDiagramAction = new Action(DiagramUIResources.DeleteDiagram_text) { public void run() { if (AuthoringUIPlugin .getDefault() .getMsgDialog() .displayPrompt( DiagramUIResources.DeleteDiagram_text, DiagramUIResources.DeleteDiagram_prompt)) { Diagram diagram = (Diagram) ((EditPart) getGraphicalViewer() .getContents()).getModel(); EcoreUtil.remove(diagram.getUMADiagram()); doSave(new NullProgressMonitor()); getSite().getPage().closeEditor( getSite().getPage().getActiveEditor(), false); } } public boolean isEnabled() { return getGraphicalViewer().getSelectedEditParts().size() == 0; } public String getId() { return DELETE_DIAGRAM; } }; getActionRegistry().registerAction(deleteDiagramAction); IAction alignBendPointAction = new Action(DiagramUIResources.align_bend_point_text) { public void run() { EditPart part = (EditPart) getGraphicalViewer() .getSelectedEditParts().get(0); if (part instanceof LinkEditPart) { LinkEditPart linkpart = ((LinkEditPart) part); Link link = (Link) linkpart.getModel(); if (link.getBendpoints().size() > 0) { GraphicalEditPart spart = ((GraphicalEditPart) linkpart .getSource()); GraphicalEditPart tpart = ((GraphicalEditPart) linkpart .getTarget()); Point sp = spart.getFigure().getBounds().getCenter(); Point tp = tpart.getFigure().getBounds().getCenter(); if (spart instanceof DecisionNodeEditPart || spart instanceof SynchBarNodeEditPart) { sp = ((TypedNode) spart.getModel()).getLocation(); List list = ((NodeEditPart) spart) .getSourceConnections(); for (Iterator itor = list.iterator(); itor .hasNext();) { LinkEditPart lp = (LinkEditPart) itor.next(); if (lp.getTarget().equals(tpart)) { Point sourceEndPoint = ((Link) lp .getModel()).getSourceEndPoint(); sp = sp.getTranslated(sourceEndPoint); } } } if (tpart instanceof DecisionNodeEditPart || tpart instanceof SynchBarNodeEditPart) { tp = ((TypedNode) tpart.getModel()).getLocation(); List list = ((NodeEditPart) tpart) .getTargetConnections(); for (Iterator itor = list.iterator(); itor .hasNext();) { LinkEditPart lp = (LinkEditPart) itor.next(); if (lp.getSource().equals(spart)) { Point targetEndPoint = ((Link) lp .getModel()).getTargetEndPoint(); tp = tp.getTranslated(targetEndPoint); } } } for (int i = 0; i < link.getBendpoints().size(); i++) { AbsoluteBendpoint oldbp = (AbsoluteBendpoint) link .getBendpoints().get(i); AbsoluteBendpoint bp = new AbsoluteBendpoint( new Point(-1, -1)); AbsoluteBendpoint previousbp = null; int delta = 40; int position = 0; if (i == 0) { position = sp.getPosition(oldbp); } else { previousbp = (AbsoluteBendpoint) link .getBendpoints().get(i - 1); position = previousbp.getPosition(oldbp); } if (position == PositionConstants.SOUTH || position == PositionConstants.NORTH) { if (i == 0) { if (sp.x - delta < oldbp.x && sp.x + delta > oldbp.x && !(sp.x == oldbp.x)) { bp.x = sp.x; } } else { if (previousbp.x - delta < oldbp.x && previousbp.x + delta > oldbp.x && !(previousbp.x == oldbp.x)) { bp.x = previousbp.x; } } if (link.getBendpoints().size() - 1 == i) { if (tp.y - delta < oldbp.y && tp.y + delta > oldbp.y && !(tp.y == oldbp.y)) { bp.y = tp.y; } } else { bp.y = oldbp.y; } } if (position == PositionConstants.EAST || position == PositionConstants.WEST) { if (i == 0) { if (sp.y - delta < oldbp.y && sp.y + delta > oldbp.y && !(sp.y == oldbp.y)) { bp.y = sp.y; } } else { if (previousbp.y - delta < oldbp.y && previousbp.y + delta > oldbp.y && !(previousbp.y == oldbp.y)) { bp.y = previousbp.y; } } if (link.getBendpoints().size() - 1 == i) { if (tp.x - delta < oldbp.x && tp.x + delta > oldbp.x && !(tp.x == oldbp.x)) { bp.x = tp.x; } } else { bp.x = oldbp.x; } } if (bp.x == -1 && bp.y != -1) { org.eclipse.gef.commands.Command c = new MoveBendpointCommand( link, new Point(oldbp.x, bp.y), i); // ((RootEditPart)getRoot()).getViewer().getEditDomain().getCommandStack().execute(c); getCommandStack().execute(c); } if (bp.x != -1 && bp.y == -1) { org.eclipse.gef.commands.Command c = new MoveBendpointCommand( link, new Point(bp.x, oldbp.y), i); getCommandStack().execute(c); } if (bp.x != -1 && bp.y != -1) { org.eclipse.gef.commands.Command c = new MoveBendpointCommand( link, new Point(bp.x, bp.y), i); getCommandStack().execute(c); } } } } } public boolean isEnabled() { List list = getGraphicalViewer().getSelectedEditParts(); if (list.size() == 1) { if (list.get(0) instanceof LinkEditPart) { LinkEditPart part = (LinkEditPart) list.get(0); Link link = (Link) part.getModel(); if (link.getBendpoints().size() > 0) return true; } } return false; } public String getId() { return ALIGN_BEND_POINT; } }; // Viewer Print Action action = new DiagramPrintAction(this, getGraphicalViewer()); registry.registerAction(action); getActionRegistry().registerAction(alignBendPointAction); } protected IAction createAnAction(String actionName, CreationFactory creationFactory, String actionId, String tooltipString, ImageDescriptor imagedesc) { final CreationFactory factory = creationFactory; final String id = actionId; final String tooltip = tooltipString; final ImageDescriptor imagedescriptor = imagedesc; return new Action(actionName) { public void run() { CreateRequest request = new CreateRequest(); // CreationFactory factory = getFactory(template); if (factory == null) return; request.setFactory(factory); request.setLocation(new Point(10, 10)); if (request.getNewObject() instanceof Node) { Point loc = request.getLocation(); Diagram parent = (Diagram) editPart.getModel(); org.eclipse.gef.commands.Command c = new CreateNodeCommand( (Node) request.getNewObject(), parent, loc); getCommandStack().execute(c); } } public String getId() { return id; } public boolean isEnabled() { if (TngUtil.isLocked(getMethodElementFromInput())) { return false; } else return true; } public String getToolTipText() { return tooltip; } public void setImageDescriptor( org.eclipse.jface.resource.ImageDescriptor newImage) { super.setImageDescriptor(imagedescriptor); } public ImageDescriptor getImageDescriptor() { return imagedescriptor; } }; } protected PaletteViewerProvider createPaletteViewerProvider() { return new PaletteViewerProvider(getEditDomain()) { private IMenuListener menuListener; protected void configurePaletteViewer(PaletteViewer viewer) { super.configurePaletteViewer(viewer); // TODO viewer.setCustomizer(new LogicPaletteCustomizer()); viewer .addDragSourceListener(new TemplateTransferDragSourceListener( viewer)); } protected void hookPaletteViewer(PaletteViewer viewer) { super.hookPaletteViewer(viewer); final CopyTemplateAction copy = (CopyTemplateAction) getActionRegistry() .getAction(ActionFactory.COPY.getId()); viewer.addSelectionChangedListener(copy); if (menuListener == null) menuListener = new IMenuListener() { public void menuAboutToShow(IMenuManager manager) { manager.appendToGroup( GEFActionConstants.GROUP_COPY, copy); } }; viewer.getContextMenu().addMenuListener(menuListener); } }; } /** * * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#getPalettePreferences() */ protected FlyoutPreferences getPalettePreferences() { return new FlyoutPreferences() { public int getDockLocation() { return AuthoringUIPlugin.getDefault().getPreferenceStore() .getInt(PALETTE_DOCK_LOCATION); } public int getPaletteState() { return AuthoringUIPlugin.getDefault().getPreferenceStore() .getInt(PALETTE_STATE); } public int getPaletteWidth() { return AuthoringUIPlugin.getDefault().getPreferenceStore() .getInt(PALETTE_SIZE); } public void setDockLocation(int location) { AuthoringUIPlugin.getDefault().getPreferenceStore().setValue( PALETTE_DOCK_LOCATION, location); } public void setPaletteState(int state) { AuthoringUIPlugin.getDefault().getPreferenceStore().setValue( PALETTE_STATE, state); } public void setPaletteWidth(int width) { AuthoringUIPlugin.getDefault().getPreferenceStore().setValue( PALETTE_SIZE, width); } }; } protected KeyHandler getCommonKeyHandler() { if (sharedKeyHandler == null) { sharedKeyHandler = new KeyHandler() { public boolean keyPressed(KeyEvent event) { if ((event.stateMask == SWT.CTRL) && (event.keyCode == SWT.ARROW_RIGHT)) { move(1); } if ((event.stateMask == SWT.CTRL) && (event.keyCode == SWT.ARROW_DOWN)) { move(2); } if ((event.stateMask == SWT.CTRL) && (event.keyCode == SWT.ARROW_UP)) { move(3); } if ((event.stateMask == SWT.CTRL) && (event.keyCode == SWT.ARROW_LEFT)) { move(4); } return super.keyPressed(event); } public boolean move(int direction) { List list = getGraphicalViewer().getSelectedEditParts(); GraphicalEditPart part = (GraphicalEditPart) list.get(0); if (part.getModel() instanceof Node) { Node node = (Node) part.getModel(); Point point = node.getLocation(); int newx = point.x; int newy = point.y; int presslength = 1; switch (direction) { case 1: // node.setLocation(new Point(point.x+10,point.y)); newx = point.x + presslength; break; case 2: // node.setLocation(new Point(point.x,point.y+10)); newy += presslength; break; case 3: // node.setLocation(new Point(point.x,point.y-10)); newy -= presslength; break; case 4: // node.setLocation(new Point(point.x-10,point.y)); newx -= presslength; break; default: break; } org.eclipse.gef.commands.Command c = new ChangeBoundsCommand( node, new Point(newx, newy), node.getWidth()); getCommandStack().execute(c); return true; } // TODO- check adding more bendpoint, capture bendpoint // index on fly if (part.getModel() instanceof Link) { Link link = (Link) part.getModel(); List blist = link.getBendpoints(); int index = 0; if (blist != null && blist.size() > 0) { AbsoluteBendpoint point = (AbsoluteBendpoint) blist .get(index); int newx = point.x; int newy = point.y; int presslength = 5; switch (direction) { case 1: // node.setLocation(new // Point(point.x+10,point.y)); newx = point.x + presslength; break; case 2: // node.setLocation(new // Point(point.x,point.y+10)); newy += presslength; break; case 3: // node.setLocation(new // Point(point.x,point.y-10)); newy -= presslength; break; case 4: // node.setLocation(new // Point(point.x-10,point.y)); newx -= presslength; break; default: break; } org.eclipse.gef.commands.Command c = new MoveBendpointCommand( link, new Point(newx, newy), index); getCommandStack().execute(c); } } return true; } }; sharedKeyHandler .put(KeyStroke.getPressed(SWT.DEL, 127, 0), getActionRegistry().getAction( ActionFactory.DELETE.getId())); sharedKeyHandler.put(KeyStroke.getPressed(SWT.F2, 0), getActionRegistry().getAction( GEFActionConstants.DIRECT_EDIT)); } return sharedKeyHandler; } /** * Sets the graphicalViewer for this EditorPart. * * @param viewer * the graphical viewer */ protected void setGraphicalViewer(GraphicalViewer viewer) { super.setGraphicalViewer(viewer); if (actionService != null) { actionService.setGraphicalViewer(viewer); } } protected void configureGraphicalViewer() { super.configureGraphicalViewer(); ScrollingGraphicalViewer viewer = (ScrollingGraphicalViewer) getGraphicalViewer(); ScalableFreeformRootEditPart root = new ScalableFreeformRootEditPart(); // List zoomLevels = new ArrayList(3); // zoomLevels.add(ZoomManager.FIT_ALL); // zoomLevels.add(ZoomManager.FIT_WIDTH); // zoomLevels.add(ZoomManager.FIT_HEIGHT); // root.getZoomManager().setZoomLevelContributions(zoomLevels); // // IAction zoomIn = new ZoomInAction(root.getZoomManager()); // IAction zoomOut = new ZoomOutAction(root.getZoomManager()); // getActionRegistry().registerAction(zoomIn); // getActionRegistry().registerAction(zoomOut); // getSite().getKeyBindingService().registerAction(zoomIn); // getSite().getKeyBindingService().registerAction(zoomOut); viewer.setRootEditPart(root); // viewer.setEditPartFactory(new MethodElementEditPartFactory()); viewer.setEditPartFactory(createEditPartFactory()); ContextMenuProvider provider = new DiagramContextMenuProvider( getGraphicalViewer(), getActionRegistry()); getGraphicalViewer().setContextMenu(provider); getSite().registerContextMenu( "org.eclipse.epf.authoring.ui.editors.workflow.contextmenu", //$NON-NLS-1$ provider, getGraphicalViewer()); viewer.setKeyHandler(new GraphicalViewerKeyHandler(viewer) .setParent(getCommonKeyHandler())); // loadProperties(); // Actions // IAction showRulers = new // ToggleRulerVisibilityAction(getGraphicalViewer()); // getActionRegistry().registerAction(showRulers); // // IAction snapAction = new // ToggleSnapToGeometryAction(getGraphicalViewer()); // getActionRegistry().registerAction(snapAction); // // IAction showGrid = new ToggleGridAction(getGraphicalViewer()); // getActionRegistry().registerAction(showGrid); Listener listener = new Listener() { public void handleEvent(Event event) { handleActivationChanged(event); } }; getGraphicalControl().addListener(SWT.Activate, listener); getGraphicalControl().addListener(SWT.Deactivate, listener); getGraphicalControl().addListener(SWT.MouseDoubleClick, new Listener() { public void handleEvent(Event event) { handleDoubleClick(event); } }); if (getDiagramType().equalsIgnoreCase( ResourceHelper.DIAGRAM_TYPE_ACTIVITY_DETAIL)) PlatformUI .getWorkbench() .getHelpSystem() .setHelp( getGraphicalControl(), AuthoringUIHelpContexts.FORM_EDITOR_ACTIVITY_DETAIL_DIAGRAM_CONTEXT); else if (getDiagramType().equalsIgnoreCase( ResourceHelper.DIAGRAM_TYPE_WORKFLOW)) PlatformUI.getWorkbench().getHelpSystem().setHelp( getGraphicalControl(), AuthoringUIHelpContexts.FORM_EDITOR_ACTIVITY_DIAGRAM_CONTEXT); else if (getDiagramType().equalsIgnoreCase( ResourceHelper.DIAGRAM_TYPE_WP_DEPENDENCY)) PlatformUI .getWorkbench() .getHelpSystem() .setHelp(getGraphicalControl(), AuthoringUIHelpContexts.FORM_EDITOR_WP_DEPENDENCY_DIAGRAM_CONTEXT); Display display = getGraphicalControl().getDisplay(); if (!(display == null || display.isDisposed())) { display.asyncExec(new Runnable() { public void run() { if (getPaletteRoot() != null) { Object obj = getMethodElementFromInput(); if (TngUtil.isLocked((EObject) obj)) { List list = getPaletteRoot().getChildren(); for (Iterator itor = list.iterator(); itor .hasNext();) { PaletteEntry entry = (PaletteEntry) itor.next(); entry.setVisible(false); } } else { List list = getPaletteRoot().getChildren(); for (Iterator itor = list.iterator(); itor .hasNext();) { PaletteEntry entry = (PaletteEntry) itor.next(); entry.setVisible(true); } } } } }); } currentConfig = LibraryService.getInstance().getCurrentMethodConfiguration(); // listen to change for current selection of MethodConfiguration or changes in // current configuration. // LibraryService.getInstance().addListener(libSvcListener); ILibraryManager manager = LibraryService.getInstance().getCurrentLibraryManager(); if (manager != null) { manager.addListener(libraryListener); } IAction action = getActionRegistry().getAction(ActionFactory.PRINT.getId()); if(action instanceof DiagramPrintAction){ ((DiagramPrintAction)action).setViewer(viewer); } } /** * @return */ protected abstract EditPartFactory createEditPartFactory(); /** * @param event */ protected void handleDoubleClick(Event event) { } protected void initializeGraphicalViewer() { super.initializeGraphicalViewer(); getGraphicalViewer().setContents(editPart); TransferDropTargetListener listener = createDropTargetListener(); if (listener != null) { getGraphicalViewer().addDropTargetListener(listener); } // AbstractEditPartViewer // getGraphicalViewer().addDropTargetListener( // new TextTransferDropTargetListener(getGraphicalViewer(), // TextTransfer.getInstance())); } protected void initializeCreationFactories() { templateNameToCreationFactoryMap = new HashMap(); if (freeTxtNodeCreationFactory == null) freeTxtNodeCreationFactory = new CreationFactory() { public Object getNewObject() { TypedNode node = ModelFactory.eINSTANCE.createTypedNode(); node.setType(TypedNode.FREE_TEXT); node.setObject(GraphicalDataHelper .newTypedGraphNode(TypedNode.FREE_TEXT)); return node; } public Object getObjectType() { return TemplateConstants.FREE_TEXT; } }; CreationFactory creationFactory = freeTxtNodeCreationFactory; templateNameToCreationFactoryMap.put(creationFactory.getObjectType(), creationFactory); } /** * * @see org.eclipse.epf.authoring.ui.editors.AbstractDiagramEditor#createDropTargetListener() */ protected TransferDropTargetListener createDropTargetListener() { return new TemplateTransferDropTargetListener(getGraphicalViewer()) { protected CreationFactory getFactory(Object template) { return (CreationFactory) templateNameToCreationFactoryMap .get(template); } }; } protected void handleActivationChanged(Event event) { IAction copy = null; if (event.type == SWT.Deactivate) copy = getActionRegistry().getAction(ActionFactory.COPY.getId()); if (getEditorSite().getActionBars().getGlobalActionHandler( ActionFactory.COPY.getId()) != copy) { getEditorSite().getActionBars().setGlobalActionHandler( ActionFactory.COPY.getId(), copy); getEditorSite().getActionBars().updateActionBars(); } } /** * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#getPaletteRoot() */ protected PaletteRoot getPaletteRoot() { if (paletteRoot == null) { createPaletteRoot(); } return paletteRoot; } /** * */ private void createPaletteRoot() { paletteRoot = new PaletteRoot(); paletteRoot.addAll(createCategories(paletteRoot)); } private List createCategories(PaletteRoot root) { List categories = new ArrayList(); PaletteContainer paletteContainer = createControlGroup(root); if (paletteContainer != null) { categories.add(paletteContainer); } return categories; } protected PaletteContainer createControlGroup(PaletteRoot root) { return null; } protected MethodElement getMethodElementFromInput() { IEditorInput input = getEditorInput(); if (input instanceof MethodElementEditorInput) { return ((MethodElementEditorInput) input).getMethodElement(); } return null; } /** * @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor) */ public void doSave(final IProgressMonitor monitor) { // saveDiagram(); // saveScreen(); final MethodElement e = getMethodElementFromInput(); if (e == null) return; SafeRunnable.run(new SafeRunnable() { public void run() throws Exception { try { monitor .beginTask( DiagramUIResources.AbstractDiagramEditor_Save_text, IProgressMonitor.UNKNOWN); monitor .setTaskName(DiagramUIResources.bind(DiagramUIResources.AbstractDiagramEditor_Save_message , e.eResource().getURI().isFile() ? e.eResource().getURI().toFileString() : e.getName())); ILibraryPersister.FailSafeMethodLibraryPersister persister = LibraryServiceUtil.getCurrentPersister().getFailSafePersister(); try { persister.save(e.eResource()); persister.commit(); Diagram diagram = (Diagram) ((EditPart) getGraphicalViewer() .getContents()).getModel(); diagram.setNew(false); } catch (Exception e) { AuthoringUIPlugin.getDefault().getLogger().logError(e); try { persister.rollback(); } catch (Exception ex) { AuthoringUIPlugin.getDefault().getLogger() .logError(ex); ViewHelper .reloadCurrentLibaryOnRollbackError(getSite() .getShell()); return; } AuthoringUIPlugin .getDefault() .getMsgDialog() .displayWarning( getSite().getShell().getText(), DiagramUIResources.diagram_saveError , e.getMessage(), e); return; } // Refresh the necessary state. // //getEditDomain().getCommandStack().markSaveLocation(); getEditDomain().getCommandStack().flush(); changeTime = -1; firePropertyChange(IEditorPart.PROP_DIRTY); } finally { monitor.done(); } } }); } /** * @see org.eclipse.ui.ISaveablePart#doSaveAs() */ public void doSaveAs() { } /** * @see org.eclipse.ui.ISaveablePart#isDirty() */ public boolean isDirty() { return getEditDomain().getCommandStack().isDirty(); } /** * @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed() */ public boolean isSaveAsAllowed() { return false; } protected boolean isReadOnly() { if (editPart != null) { Diagram diagram = (Diagram) editPart.getModel(); return diagram != null && diagram.isReadOnly(); } return false; } private void createEditPart() { BreakdownElementEditorInput editorInput = (BreakdownElementEditorInput) getEditorInput(); Object object; if (editorInput.getWrapper() != null) { object = editorInput.getWrapper(); } else { object = editorInput.getMethodElement(); } changeTime = System.currentTimeMillis(); editPart = createDiagramEditPart(); Diagram diagram = (Diagram) editPart.getModel(); // pass along the Suppression instance from input to diagram model // diagram.setSuppression(editorInput.getSuppression()); diagram.setObject(object); diagram.addConsumer(this); if(!diagram.isNew()) { changeTime = -1; } } /** * @see org.eclipse.ui.part.EditorPart#setInput(org.eclipse.ui.IEditorInput) */ protected void setInput(IEditorInput input) { super.setInput(input); MethodElement e = getMethodElementFromInput(); if (e != null) { createEditPart(); BreakdownElementEditorInput editorInput = (BreakdownElementEditorInput) getEditorInput(); setPartName(getPartNamePrefix() + e.getName() + ", " + editorInput.getSuppression().getProcess().getName()); //$NON-NLS-1$ // setTitleImage(getTypeImage(e)); } } protected abstract EditPart createDiagramEditPart(); protected abstract String getPartNamePrefix(); protected abstract String getDiagramType(); /** * Get parent editor * @return editor */ public IEditorPart getParentEditor() { return parentEditor; } public void setParentEditor(IEditorPart parentEditor) { this.parentEditor = parentEditor; } //Adding librarychnaged listener, if configuration got changed diagram needs to refresh private ILibraryChangeListener libraryListener = new ILibraryChangeListener() { public void libraryChanged(int option, Collection collection) { switch (option) { case ILibraryChangeListener.OPTION_CHANGED: { if (collection != null && collection.contains(currentConfig)) { MethodConfiguration config = ProcessAuthoringConfigurator.INSTANCE.getMethodConfiguration(); try { ProcessAuthoringConfigurator.INSTANCE.setMethodConfiguration(currentConfig); IAction action = getActionRegistry().getAction(REFRESH); action.run(); } finally { ProcessAuthoringConfigurator.INSTANCE.setMethodConfiguration(config); } } break; } // handled by libSvcListener // // case ILibraryChangeListener.OPTION_CONFIGURATION_SELECTED: { // configChanged(); // break; // } } } }; private ILibraryServiceListener libSvcListener = new ILibraryServiceListener() { public void configurationSet(MethodConfiguration config) { configChanged(); } public void libraryClosed(MethodLibrary library) { } public void libraryCreated(MethodLibrary library) { } public void libraryOpened(MethodLibrary library) { } public void libraryReopened(MethodLibrary library) { } public void librarySet(MethodLibrary library) { } }; private void configChanged() { MethodConfiguration config = LibraryService.getInstance().getCurrentMethodConfiguration(); if(currentConfig != config) { // refresh only if the active part is this diagram editor or process editor of the process // that owns this diagram // IWorkbenchPart activePart = getSite().getWorkbenchWindow().getPartService().getActivePart(); boolean refresh = activePart == this; if(!refresh) { if(activePart instanceof ProcessEditor) { MethodElementEditorInput input = (MethodElementEditorInput) ((ProcessEditor)activePart).getEditorInput(); Object procComp = input.getMethodElement(); EObject diagram = ((Diagram)editPart.getModel()).getUMADiagram(); refresh = UmaUtil.isContainedBy(diagram, procComp); } } if(refresh) { currentConfig = config; IAction action = getActionRegistry().getAction(REFRESH); action.run(); } } } /** * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection) * override to donot allow any node selection in Activity Detail Diagram * if activity is extends. */ public void selectionChanged(IWorkbenchPart part, ISelection selection) { // TODO Auto-generated method stub super.selectionChanged(part, selection); if(editPart != null){ Diagram diagram = (Diagram)editPart.getModel(); if(diagram.isReadOnly() || TngUtil.isLocked(getMethodElementFromInput())){ getGraphicalViewer().select(editPart); } } } public void refreshDiagram(){ getActionRegistry().getAction(REFRESH).run(); } public boolean isDisposed() { return disposed; } // /* // * Method sets the context menu contributing items state. // * This is efficient way instead of doing at each action. // * Uncomment this code, once all the place isEnabled Code is removed. // */ // public void setStateMenuContributeItems(){ // // List editParts = getGraphicalViewer().getSelectedEditParts(); // if(editParts.size() == 0){ // getActionRegistry().getAction(DELETE_DIAGRAM).setEnabled(true); // } // if(editParts.size() == 1){ // EditPart editPart = (EditPart)editParts.get(0); // getActionRegistry().getAction(SELECT_LINK).setEnabled(true); // if (editPart.getModel() instanceof TypedNode) { // if(((TypedNode) editPart.getModel()).getType() == TypedNode.FREE_TEXT) // getActionRegistry().getAction(FONT_DIALOG).setEnabled(true); // getActionRegistry().getAction(SELECT_LINK).setEnabled(false); // } // if(editPart instanceof LinkEditPart){ // getActionRegistry().getAction(CREATE_BEND_POINT).setEnabled(true); // Link link = (Link)editPart.getModel(); // if(link.getBendpoints().size() > 0){ // getActionRegistry().getAction(ALIGN_BEND_POINT).setEnabled(true); // } // } // // } // if(editParts.size() == 2){ // getActionRegistry().getAction(CREATE_LINK).setEnabled(true); // for (Iterator itor = editParts.iterator(); itor.hasNext();) { // Object part = itor.next(); // if (part instanceof FreeTextEditPart) // getActionRegistry().getAction(CREATE_LINK).setEnabled(false); // } // } // } // public void setFocus() { // // TODO Auto-generated method stub // super.setFocus(); // // Refresh is expensive operation. // // TODO - find process solution for notification between // // base diagram and extend diagram. // MethodElement element = getMethodElementFromInput(); // if(((Diagram)editPart.getModel()).isReadOnly()){ // getActionRegistry().getAction(REFRESH).run(); // } // else if(element instanceof VariabilityElement){ // if(((VariabilityElement)element).getVariabilityType() != null){ // if(!((VariabilityElement)element).getVariabilityType().equals(VariabilityType.NA_LITERAL)){ // getActionRegistry().getAction(REFRESH).run(); // } // } // // } // } }