com.architexa.diagrams.relo.ui.ReloEditor.java Source code

Java tutorial

Introduction

Here is the source code for com.architexa.diagrams.relo.ui.ReloEditor.java

Source

/* 
 * Copyright (c) 2004-2005 Massachusetts Institute of Technology. This code was
 * developed as part of the Haystack (http://haystack.lcs.mit.edu/) research 
 * project at MIT. Permission is hereby granted, free of charge, to any person
 * obtaining a copy of this software and associated documentation files (the 
 * "Software"), to deal in the Software without restriction, including without 
 * limitation the rights to use, copy, modify, merge, publish, distribute, 
 * sublicense, and/or sell copies of the Software, and to permit persons to whom
 * the Software is furnished to do so, subject to the following conditions: 
 * 
 * The above copyright notice and this permission notice shall be included in 
 * all copies or substantial portions of the Software. 
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 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. 
 */
/*
 * Created on Feb 4, 2004
 *
 */
package com.architexa.diagrams.relo.ui;

import java.io.IOException;
import java.lang.reflect.Constructor;
import java.net.URL;

import org.apache.log4j.Logger;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.util.TransferDropTargetListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IWorkbenchPart;
import org.openrdf.model.Resource;
import org.openrdf.model.URI;
import org.openrdf.rio.RdfDocumentWriter;

import com.architexa.diagrams.RSECore;
import com.architexa.diagrams.editors.RSEMultiPageEditor;
import com.architexa.diagrams.model.BrowseModel;
import com.architexa.diagrams.model.NamedRel;
import com.architexa.diagrams.model.RootArtifact;
import com.architexa.diagrams.relo.ReloPlugin;
import com.architexa.diagrams.relo.actions.ListEditorInput;
import com.architexa.diagrams.relo.actions.SelectAllUIAction;
import com.architexa.diagrams.relo.modelBridge.ReloDoc;
import com.architexa.diagrams.relo.parts.ReloController;
import com.architexa.diagrams.relo.parts.ReloPartFactory;
import com.architexa.diagrams.ui.DefaultAfterConnectionCreationTool;
import com.architexa.diagrams.ui.EditorImageDecorator;
import com.architexa.diagrams.ui.ImageCache;
import com.architexa.diagrams.ui.RSECommandStack;
import com.architexa.diagrams.ui.RSEEditor;
import com.architexa.diagrams.ui.RSEShareableDiagramEditorInput;
import com.architexa.diagrams.ui.RSETransferDropTargetListener;
import com.architexa.org.eclipse.gef.DefaultEditDomain;
import com.architexa.org.eclipse.gef.EditDomain;
import com.architexa.org.eclipse.gef.editparts.AbstractGraphicalEditPart;
import com.architexa.org.eclipse.gef.editparts.ZoomManager;
import com.architexa.org.eclipse.gef.palette.CombinedTemplateCreationEntry;
import com.architexa.org.eclipse.gef.palette.ConnectionCreationToolEntry;
import com.architexa.org.eclipse.gef.palette.PaletteGroup;
import com.architexa.org.eclipse.gef.palette.PaletteRoot;
import com.architexa.org.eclipse.gef.palette.PaletteSeparator;
import com.architexa.org.eclipse.gef.palette.SelectionToolEntry;
import com.architexa.org.eclipse.gef.palette.ToolEntry;
import com.architexa.org.eclipse.gef.requests.SimpleFactory;
import com.architexa.org.eclipse.gef.tools.SelectionTool;
import com.architexa.org.eclipse.gef.ui.actions.ActionRegistry;
import com.architexa.org.eclipse.gef.ui.palette.PaletteViewerProvider;
import com.architexa.org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
import com.architexa.rse.BuildStatus;
import com.architexa.store.StoreUtil;

/**
 * @author vineet
 *
 */
public class ReloEditor extends RSEEditor {
    static final Logger logger = ReloPlugin.getLogger(ReloEditor.class);

    final public static String editorId = "com.architexa.diagrams.relo.editor";

    static {
        registerEditorID(editorId);
    }

    public ReloEditor() {
        DefaultEditDomain defaultEditDomain = new DefaultEditDomain(this);
        //defaultEditDomain.setActiveTool(new ConnectionCreationTool());
        defaultEditDomain.setActiveTool(new SelectionTool());
        // Removed QueueableCommandStack: Its functionality is obsolete
        defaultEditDomain.setCommandStack(new RSECommandStack("Relo"));
        setEditDomain(defaultEditDomain);
        BuildStatus.updateDiagramActionMap("Opened Diagram Created By", RSEMultiPageEditor.getDiagramCreator());
        setDiagramCreator(RSEMultiPageEditor.getDiagramCreator());
    }

    @Override
    public String getEditorId() {
        return editorId;
    }

    private ReloDoc rootModel = new ReloDoc();

    public ReloDoc getRootModel() {
        return rootModel;
    }

    @Override
    public RootArtifact getRootArt() {
        return rootModel;
    }

    // BUG-FIX: Overriding base implementation [backported from cvs]
    @Override
    protected PaletteViewerProvider createPaletteViewerProvider() {
        return new PaletteViewerProvider(getEditDomain());
    }

    @Override
    public void configureGraphicalViewer() {
        super.configureGraphicalViewer();
        BrowseModel bm = rootModel.getBrowseModel();
        ScrollingGraphicalViewer viewer = (ScrollingGraphicalViewer) getGraphicalViewer();
        ReloViewEditorCommon.configureGraphicalViewer(this, viewer, getActionRegistry(), getSite(), bm, null,
                graphicalViewManager);
        viewer.setEditPartFactory(new ReloPartFactory(bm));
    }

    @Override
    public void initializeGraphicalViewer() {
        super.initializeGraphicalViewer();
        getGraphicalViewer().setContents(rootModel);

        TransferDropTargetListener dragSrc = new RSETransferDropTargetListener(this, getGraphicalViewer());
        getGraphicalViewer().addDropTargetListener(dragSrc);

    }

    @Override
    public boolean canDropOnEditor(IStructuredSelection sel) {
        return ReloViewEditorCommon.canDropOnEditor(sel);
    }

    public ReloController getReloController() {
        return (ReloController) this.getGraphicalViewer().getEditPartRegistry().get(this.rootModel);
    }

    IProject defaultProject = null;

    @Override
    public IFile getNewSaveFile() {
        return ReloViewEditorCommon.getNewSaveFile(this, defaultProject);
    }

    private IResource getSelectedResource() {
        ISelection sel = getSite().getWorkbenchWindow().getSelectionService().getSelection();
        if (sel instanceof IStructuredSelection) {
            IStructuredSelection ss = (IStructuredSelection) sel;
            Object first = ss.getFirstElement();
            if (first instanceof IResource) {
                return (IResource) first;
            } else if (first instanceof IAdaptable) {
                Object res = ((IAdaptable) first).getAdapter(IResource.class);
                if (res != null)
                    return (IResource) res;
            }
        }

        return null;
    }

    /**
     * @see edu.mit.csail.pdeConsole.part.EditorPart#setInput(edu.mit.csail.pdeConsole.IEditorInput)
     */
    @Override
    protected void setInput(IEditorInput input) {
        super.setInput(input);

        IResource selRes = getSelectedResource();
        if (selRes != null)
            defaultProject = selRes.getProject();

        //TODO Should only receive RSEShareableEditorInput. Remove others
        if (input instanceof ListEditorInput) {
            rootModel.setInputItems(((ListEditorInput) input).list);
            BrowseModel bm = ((ListEditorInput) input).browseModel;
            rootModel.setBrowseModel(bm);
            bm.setRootArt(rootModel);
            //         bm.setRepo(rootModel.getRepo());
            super.setupRoot();
            return;
        } else if (input instanceof IFileEditorInput) {
            //         setFile(((IFileEditorInput)input).getFile());
            //         
            //         try {
            //            readFile(getFile().getName(), getFile().getContents(/*force*/true), memRepo);
            //         } catch (CoreException e) {
            //            logger.error("Unexpected Error", e);
            //         }
            //         
            //         RSEShareableDiagramEditorInput sharedInput = LoadUtils.isLocalFileShared(getFile(), memRepo, RSECore.reloFile);
            //         if (sharedInput != null) {
            //            this.setInput(sharedInput);
            //            return;
            //         }
            //         
            //         setupRoot();
        }

        if (input instanceof RSEShareableDiagramEditorInput) {
            //readFile(rseInput.getName(), rseInput.getInputStream(), memRepo);
            memRepo = ((RSEShareableDiagramEditorInput) input).getMemRepo();
            setupRoot();
            return;
        }

        checkEditorInputForOutsideWorkspace(input);
    }

    @Override
    protected void setupRoot() {
        rootModel.setInputRepo(memRepo);

        BrowseModel bm = (BrowseModel) StoreUtil.loadClass(memRepo, RSECore.docRoot, browseModel);
        if (bm == null)
            System.err.println();
        rootModel.setBrowseModel(bm);
        bm.setRootArt(rootModel);

        super.setupRoot();
    }

    public static final URI browseModel = RSECore.createRseUri("core#browseModel");

    @Override
    public void writeFile(RdfDocumentWriter rdfWriter, Resource diagramRes) throws IOException {
        ReloController rc = (ReloController) getGraphicalViewer().getRootEditPart().getContents();
        diagramRes = ReloViewEditorCommon.writeFile(this, rc, rootModel, browseModel, rootModel.getBrowseModel(),
                rdfWriter, diagramRes);
    }

    /* (non-Javadoc)
     * @see org.eclipse.gef.ui.parts.GraphicalEditor#createActions()
     */
    @Override
    protected void createActions() {
        super.createActions();
        ActionRegistry registry = getActionRegistry();
        IAction action;

        // do not need fisheye or rename options in context menu

        //action = new FisheyeSemanticZoomInAction((IWorkbenchPart)this);
        //registry.registerAction(action);
        //getSelectionActions().add(action.getId());

        // action = new DirectEditAction((IWorkbenchPart)this);
        // registry.registerAction(action);
        // addSelectionAction(action);

        action = new SelectAllUIAction((IWorkbenchPart) this);
        registry.registerAction(action);
        addSelectionAction(action);
    }

    @SuppressWarnings("unchecked")
    private final void addSelectionAction(IAction action) {
        getSelectionActions().add(action.getId());
    }

    @SuppressWarnings("rawtypes")
    @Override
    public Object getAdapter(Class type) {
        if (type == ZoomManager.class)
            return getGraphicalViewer().getProperty(ZoomManager.class.toString());
        else if (type == EditDomain.class)
            return getEditDomain();

        return super.getAdapter(type);
    }

    /**
     * @see com.architexa.org.eclipse.gef.ui.parts.GraphicalEditorWithPalette#initializePaletteViewer()
     */
    /*
    protected void initializePaletteViewer() {
       super.initializePaletteViewer();
       //getPaletteViewer().addDragSourceListener(
       //   new TemplateTransferDragSourceListener(getPaletteViewer()));
    }
    */

    ///* (non-Javadoc)
    // * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#getPalettePreferences()
    // */
    //@Override
    //protected FlyoutPreferences getPalettePreferences() {
    //    return new FlyoutPreferences() {
    //
    //        int dockLocation = -1;
    //        public int getDockLocation() {
    //            return dockLocation;
    //        }
    //        public void setDockLocation(int location) {
    //            dockLocation = location;
    //        }
    //
    //        int paletteState = -1;
    //        public int getPaletteState() {
    //            return paletteState;
    //        }
    //        public void setPaletteState(int state) {
    //            paletteState = state;
    //        }
    //
    //        int paletteWidth = 125;
    //        public int getPaletteWidth() {
    //            return paletteWidth;
    //        }
    //
    //        public void setPaletteWidth(int width) {
    //            paletteWidth = width;                
    //        }};
    //}

    private static PaletteRoot paletteRoot;

    public static ImageDescriptor getImageDescriptor(String key) {
        return ImageDescriptor.createFromFile(ReloEditor.class, key);
    }

    @SuppressWarnings("unused") // used primarily for debugging
    private final String getObjType(Object obj) {
        return (obj == null) ? "null" : obj.getClass().toString();
    }

    @Override
    public void checkError() {
        try {
            IMarker[] markers = getFile().findMarkers(IMarker.PROBLEM, false, IResource.DEPTH_ZERO);
            if (markers.length > 0) {
                addErrorDecoration();
            } else {
                removeErrorDecoration();
            }
            Shell shell = getEditorSite().getShell();
            shell.getDisplay().asyncExec(new Runnable() {
                public void run() {
                    getReloController().refresh();
                }
            });
        } catch (CoreException e) {
            logger.error("Could not find associated file's error markers. ", e);
        }
    }

    /**
     * Decorates the title image of this editor with an error decoration.
     * 
     */
    public void addErrorDecoration() {
        ImageDescriptor editorImage = ImageDescriptor.createFromImage(getTitleImage());
        final ImageDescriptor errorImage = ImageDescriptor.createFromFile(ReloEditor.class, "error_co.gif");
        EditorImageDecorator decorator = new EditorImageDecorator(editorImage, errorImage,
                EditorImageDecorator.BOTTOM_LEFT);
        final Image decoratedImage = ImageCache.calcImageFromDescriptor(decorator);
        Shell shell = getEditorSite().getShell();
        shell.getDisplay().asyncExec(new Runnable() {
            public void run() {
                setTitleImage(decoratedImage);
            }
        });
    }

    /**
     * Removes any error decoration on the title image of this editor
     *
     */
    public void removeErrorDecoration() {
        URL url = ReloPlugin.getDefault().getBundle().getEntry("icons/relo-document.png");
        try {
            final Image errorFreeImage = new Image(Display.getDefault(), url.openStream());
            Shell shell = getEditorSite().getShell();
            shell.getDisplay().asyncExec(new Runnable() {
                public void run() {
                    setTitleImage(errorFreeImage);
                }
            });
        } catch (IOException e) {
            logger.error("Could not remove error decoration. ", e);
        }
    }

    /* (non-Javadoc)
    * @see org.eclipse.gef.ui.parts.GraphicalEditorWithPalette#getPaletteRoot()
    */
    @Override
    protected PaletteRoot getPaletteRoot() {
        if (paletteRoot == null) {
            paletteRoot = new PaletteRoot();

            PaletteGroup controlGroup = new PaletteGroup("Control Group");

            ToolEntry tool = new SelectionToolEntry();
            controlGroup.add(tool);
            paletteRoot.setDefaultEntry(tool);

            //tool = new MarqueeToolEntry();
            //controlGroup.add(tool);

            controlGroup.add(new PaletteSeparator("Entities"));

            controlGroup.add(getImportImagePaletteEntry());
            controlGroup.add(getActorPaletteEntry());
            controlGroup.add(getDatabasePaletteEntry());
            controlGroup.add(getCommentPaletteEntry());

            controlGroup.add(new PaletteSeparator("Code Components"));

            String packageName = "newPackage";
            String className = "NewClass";
            String methodName = "newMethod()";
            String fieldName = "newField";

            //         final BrowseModel bm = rootModel.getBrowseModel();

            SimpleFactory factory = new CreationWithParamsFactory(packageName + "$" + className);
            ImageDescriptor img = ReloPlugin.getImageDescriptor("icons_palette/palette_relo_class.PNG");
            controlGroup.add(new CombinedTemplateCreationEntry("Class",
                    "Press here, then click in the diagram to add a class", factory, factory, img, img));

            factory = new CreationWithParamsFactory(packageName + "$" + className + "." + methodName);
            img = ReloPlugin.getImageDescriptor("icons_palette/palette_relo_method.PNG");
            controlGroup.add(new CombinedTemplateCreationEntry("Method",
                    "Press here, then click on a class in the diagram to add a method to it", factory, factory, img,
                    img));

            factory = new CreationWithParamsFactory(packageName + "$" + className + "." + fieldName);
            img = ReloPlugin.getImageDescriptor("icons_palette/palette_relo_field.PNG");
            controlGroup.add(new CombinedTemplateCreationEntry("Field",
                    "Press here, then click on a class in the diagram to add a field to it", factory, factory, img,
                    img));

            controlGroup.add(new PaletteSeparator("Relationships"));

            String relDesc = "Press here, then click any item in the diagram and then "
                    + "click another item in the diagram to draw this connection between them";

            img = ReloPlugin.getImageDescriptor("icons_palette/palette_relo_inheritance.PNG");
            ToolEntry inheritanceEntry = new ConnectionCreationToolEntry("Inheritance", relDesc,
                    new SimpleFactory(NamedRel.class) {
                        @Override
                        public Object getNewObject() {
                            NamedRel rel = (NamedRel) super.getNewObject();
                            BrowseModel bm = rootModel.getBrowseModel();
                            bm.setUserCreatedRelTypeToInheritance(rel);
                            rel.setUserCreated(true);
                            return rel;
                        }
                    }, img, img);
            inheritanceEntry.setToolClass(DefaultAfterConnectionCreationTool.class);
            controlGroup.add(inheritanceEntry);

            img = ReloPlugin.getImageDescriptor("icons_palette/palette_relo_call.PNG");
            ToolEntry methodCallEntry = new ConnectionCreationToolEntry("Method Call", relDesc,
                    new SimpleFactory(NamedRel.class) {
                        @Override
                        public Object getNewObject() {
                            NamedRel rel = (NamedRel) super.getNewObject();
                            BrowseModel bm = rootModel.getBrowseModel();
                            bm.setUserCreatedRelTypeToCall(rel);
                            rel.setUserCreated(true);
                            return rel;
                        }
                    }, img, img);
            methodCallEntry.setToolClass(DefaultAfterConnectionCreationTool.class);
            controlGroup.add(methodCallEntry);

            img = ReloPlugin.getImageDescriptor("icons_palette/palette_relo_overrides.png");
            ToolEntry overrideEntry = new ConnectionCreationToolEntry("Method Override", relDesc,
                    new SimpleFactory(NamedRel.class) {
                        @Override
                        public Object getNewObject() {
                            NamedRel rel = (NamedRel) super.getNewObject();
                            BrowseModel bm = rootModel.getBrowseModel();
                            bm.setUserCreatedRelTypeToOverride(rel);
                            rel.setUserCreated(true);
                            return rel;
                        }
                    }, img, img);
            overrideEntry.setToolClass(DefaultAfterConnectionCreationTool.class);
            controlGroup.add(overrideEntry);

            controlGroup.add(getGeneralConnectionPaletteEntry());

            //controlGroup.add(new PaletteSeparator());
            //         img = getImageDescriptor("comment.gif");
            //         controlGroup.add(new CombinedTemplateCreationEntry(
            //                    "Add Package", 
            //               "Can be used to add packages to the diagram", 
            //                    new SimpleFactory(EmptyCodeUnit.class),
            //                    new SimpleFactory(EmptyCodeUnit.class), 
            //                    img, 
            //                    img));

            paletteRoot.add(controlGroup);
        }
        return paletteRoot;
    }

    // Only used by strata
    // TODO make all 'get root' methods the same
    @Deprecated
    public AbstractGraphicalEditPart getRootController() {
        return getReloController();
    }

    //Currently only for Chrono
    public void addRemoveImageExportCustomizations(boolean status) {
    }

    // TODO combine with SeqEditor.CreationWithParamsFactory and move to RSEEditor
    public class CreationWithParamsFactory extends SimpleFactory {

        String fragName;

        public CreationWithParamsFactory(String fragName) {
            super(null);
            this.fragName = fragName;
        }

        @Override
        public Object getNewObject() {
            BrowseModel bm = rootModel.getBrowseModel();
            try {
                Class<?> type = bm.getUserCreatedFragmentClass();
                Constructor<?> constructor = type.getDeclaredConstructor(BrowseModel.class, String.class);
                constructor.setAccessible(true);
                return constructor.newInstance(bm, fragName);
            } catch (Exception exc) {
                logger.error("Unable to create new instance of " + bm.getUserCreatedFragmentClass(), exc);
                return null;
            }
        }
    }

    @Override
    public ImageDescriptor getImageDescriptor() {
        return ReloPlugin.getImageDescriptor("icons/relo-document.png");
    }

}