Package org.eclipse.gef.examples.logicdesigner

Source Code of org.eclipse.gef.examples.logicdesigner.LogicEditor

/*******************************************************************************
* Copyright (c) 2000, 2007 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 API and implementation
*******************************************************************************/
package org.eclipse.gef.examples.logicdesigner;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.EventObject;
import java.util.List;

import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.util.SafeRunnable;
import org.eclipse.jface.util.TransferDropTargetListener;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
import org.eclipse.ui.dialogs.SaveAsDialog;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.part.IPageSite;
import org.eclipse.ui.part.PageBook;
import org.eclipse.ui.views.contentoutline.IContentOutlinePage;

import org.eclipse.draw2d.FigureCanvas;
import org.eclipse.draw2d.LightweightSystem;
import org.eclipse.draw2d.MarginBorder;
import org.eclipse.draw2d.PositionConstants;
import org.eclipse.draw2d.Viewport;
import org.eclipse.draw2d.parts.ScrollableThumbnail;
import org.eclipse.draw2d.parts.Thumbnail;

import org.eclipse.gef.ContextMenuProvider;
import org.eclipse.gef.DefaultEditDomain;
import org.eclipse.gef.EditPartViewer;
import org.eclipse.gef.KeyHandler;
import org.eclipse.gef.KeyStroke;
import org.eclipse.gef.LayerConstants;
import org.eclipse.gef.MouseWheelHandler;
import org.eclipse.gef.MouseWheelZoomHandler;
import org.eclipse.gef.RootEditPart;
import org.eclipse.gef.SnapToGeometry;
import org.eclipse.gef.SnapToGrid;
import org.eclipse.gef.dnd.TemplateTransferDragSourceListener;
import org.eclipse.gef.dnd.TemplateTransferDropTargetListener;
import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
import org.eclipse.gef.editparts.ZoomManager;
import org.eclipse.gef.palette.PaletteRoot;
import org.eclipse.gef.rulers.RulerProvider;
import org.eclipse.gef.ui.actions.ActionRegistry;
import org.eclipse.gef.ui.actions.AlignmentAction;
import org.eclipse.gef.ui.actions.CopyTemplateAction;
import org.eclipse.gef.ui.actions.DirectEditAction;
import org.eclipse.gef.ui.actions.GEFActionConstants;
import org.eclipse.gef.ui.actions.MatchHeightAction;
import org.eclipse.gef.ui.actions.MatchWidthAction;
import org.eclipse.gef.ui.actions.ToggleGridAction;
import org.eclipse.gef.ui.actions.ToggleRulerVisibilityAction;
import org.eclipse.gef.ui.actions.ToggleSnapToGeometryAction;
import org.eclipse.gef.ui.actions.ZoomInAction;
import org.eclipse.gef.ui.actions.ZoomOutAction;
import org.eclipse.gef.ui.palette.PaletteViewer;
import org.eclipse.gef.ui.palette.PaletteViewerProvider;
import org.eclipse.gef.ui.parts.ContentOutlinePage;
import org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette;
import org.eclipse.gef.ui.parts.GraphicalViewerKeyHandler;
import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
import org.eclipse.gef.ui.parts.TreeViewer;
import org.eclipse.gef.ui.rulers.RulerComposite;

import org.eclipse.gef.examples.logicdesigner.actions.IncrementDecrementAction;
import org.eclipse.gef.examples.logicdesigner.actions.LogicPasteTemplateAction;
import org.eclipse.gef.examples.logicdesigner.dnd.TextTransferDropTargetListener;
import org.eclipse.gef.examples.logicdesigner.edit.GraphicalPartFactory;
import org.eclipse.gef.examples.logicdesigner.edit.TreePartFactory;
import org.eclipse.gef.examples.logicdesigner.model.LogicDiagram;
import org.eclipse.gef.examples.logicdesigner.model.LogicRuler;
import org.eclipse.gef.examples.logicdesigner.palette.LogicPaletteCustomizer;
import org.eclipse.gef.examples.logicdesigner.rulers.LogicRulerProvider;

public class LogicEditor
  extends GraphicalEditorWithFlyoutPalette
{

class OutlinePage
  extends ContentOutlinePage
  implements IAdaptable
{
 
  private PageBook pageBook;
  private Control outline;
  private Canvas overview;
  private IAction showOutlineAction, showOverviewAction;
  static final int ID_OUTLINE  = 0;
  static final int ID_OVERVIEW = 1;
  private Thumbnail thumbnail;
  private DisposeListener disposeListener;
 
  public OutlinePage(EditPartViewer viewer){
    super(viewer);
  }
  public void init(IPageSite pageSite) {
    super.init(pageSite);
    ActionRegistry registry = getActionRegistry();
    IActionBars bars = pageSite.getActionBars();
    String id = ActionFactory.UNDO.getId();
    bars.setGlobalActionHandler(id, registry.getAction(id));
    id = ActionFactory.REDO.getId();
    bars.setGlobalActionHandler(id, registry.getAction(id));
    id = ActionFactory.DELETE.getId();
    bars.setGlobalActionHandler(id, registry.getAction(id));
    id = IncrementDecrementAction.INCREMENT;
    bars.setGlobalActionHandler(id, registry.getAction(id));
    id = IncrementDecrementAction.DECREMENT;
    bars.setGlobalActionHandler(id, registry.getAction(id));
    bars.updateActionBars();
  }

  protected void configureOutlineViewer(){
    getViewer().setEditDomain(getEditDomain());
    getViewer().setEditPartFactory(new TreePartFactory());
    ContextMenuProvider provider = new LogicContextMenuProvider(getViewer(), getActionRegistry());
    getViewer().setContextMenu(provider);
    getSite().registerContextMenu(
      "org.eclipse.gef.examples.logic.outline.contextmenu", //$NON-NLS-1$
      provider, getSite().getSelectionProvider());
    getViewer().setKeyHandler(getCommonKeyHandler());
    getViewer().addDropTargetListener((TransferDropTargetListener)
      new TemplateTransferDropTargetListener(getViewer()));
    IToolBarManager tbm = getSite().getActionBars().getToolBarManager();
    showOutlineAction = new Action() {
      public void run() {
        showPage(ID_OUTLINE);
      }
    };
    showOutlineAction.setImageDescriptor(ImageDescriptor.createFromFile(
                LogicPlugin.class,"icons/outline.gif")); //$NON-NLS-1$
    showOutlineAction.setToolTipText(LogicMessages.LogicEditor_outline_show_outline);
    tbm.add(showOutlineAction);
    showOverviewAction = new Action() {
      public void run() {
        showPage(ID_OVERVIEW);
      }
    };
    showOverviewAction.setImageDescriptor(ImageDescriptor.createFromFile(
                LogicPlugin.class,"icons/overview.gif")); //$NON-NLS-1$
    showOverviewAction.setToolTipText(LogicMessages.LogicEditor_outline_show_overview);
    tbm.add(showOverviewAction);
    showPage(ID_OUTLINE);
  }

  public void createControl(Composite parent){
    pageBook = new PageBook(parent, SWT.NONE);
    outline = getViewer().createControl(pageBook);
    overview = new Canvas(pageBook, SWT.NONE);
    pageBook.showPage(outline);
    configureOutlineViewer();
    hookOutlineViewer();
    initializeOutlineViewer();
  }
 
  public void dispose(){
    unhookOutlineViewer();
    if (thumbnail != null) {
      thumbnail.deactivate();
      thumbnail = null;
    }
    super.dispose();
    LogicEditor.this.outlinePage = null;
    outlinePage = null;
  }
 
  public Object getAdapter(Class type) {
    if (type == ZoomManager.class)
      return getGraphicalViewer().getProperty(ZoomManager.class.toString());
    return null;
  }

  public Control getControl() {
    return pageBook;
  }

  protected void hookOutlineViewer(){
    getSelectionSynchronizer().addViewer(getViewer());
  }

  protected void initializeOutlineViewer(){
    setContents(getLogicDiagram());
  }
 
  protected void initializeOverview() {
    LightweightSystem lws = new LightweightSystem(overview);
    RootEditPart rep = getGraphicalViewer().getRootEditPart();
    if (rep instanceof ScalableFreeformRootEditPart) {
      ScalableFreeformRootEditPart root = (ScalableFreeformRootEditPart)rep;
      thumbnail = new ScrollableThumbnail((Viewport)root.getFigure());
      thumbnail.setBorder(new MarginBorder(3));
      thumbnail.setSource(root.getLayer(LayerConstants.PRINTABLE_LAYERS));
      lws.setContents(thumbnail);
      disposeListener = new DisposeListener() {
        public void widgetDisposed(DisposeEvent e) {
          if (thumbnail != null) {
            thumbnail.deactivate();
            thumbnail = null;
          }
        }
      };
      getEditor().addDisposeListener(disposeListener);
    }
  }
 
  public void setContents(Object contents) {
    getViewer().setContents(contents);
  }
 
  protected void showPage(int id) {
    if (id == ID_OUTLINE) {
      showOutlineAction.setChecked(true);
      showOverviewAction.setChecked(false);
      pageBook.showPage(outline);
      if (thumbnail != null)
        thumbnail.setVisible(false);
    } else if (id == ID_OVERVIEW) {
      if (thumbnail == null)
        initializeOverview();
      showOutlineAction.setChecked(false);
      showOverviewAction.setChecked(true);
      pageBook.showPage(overview);
      thumbnail.setVisible(true);
    }
  }
 
  protected void unhookOutlineViewer(){
    getSelectionSynchronizer().removeViewer(getViewer());
    if (disposeListener != null && getEditor() != null && !getEditor().isDisposed())
      getEditor().removeDisposeListener(disposeListener);
  }
}

private KeyHandler sharedKeyHandler;
private PaletteRoot root;
private OutlinePage outlinePage;
private boolean editorSaving = false;

// This class listens to changes to the file system in the workspace, and
// makes changes accordingly.
// 1) An open, saved file gets deleted -> close the editor
// 2) An open file gets renamed or moved -> change the editor's input accordingly 
class ResourceTracker
  implements IResourceChangeListener, IResourceDeltaVisitor
{
  public void resourceChanged(IResourceChangeEvent event) {
    IResourceDelta delta = event.getDelta();
    try {
      if (delta != null)
        delta.accept(this);
    }
    catch (CoreException exception) {
      // What should be done here?
    }
  } 
  public boolean visit(IResourceDelta delta) {
    if (delta == null || !delta.getResource().equals(((IFileEditorInput)getEditorInput()).getFile()))
      return true;
     
    if (delta.getKind() == IResourceDelta.REMOVED) {
      Display display = getSite().getShell().getDisplay();
      if ((IResourceDelta.MOVED_TO & delta.getFlags()) == 0) { // if the file was deleted
        // NOTE: The case where an open, unsaved file is deleted is being handled by the
        // PartListener added to the Workbench in the initialize() method.
        display.asyncExec(new Runnable() {
          public void run() {
            if (!isDirty())
              closeEditor(false);
          }
        });
      } else { // else if it was moved or renamed
        final IFile newFile = ResourcesPlugin.getWorkspace().getRoot().getFile(delta.getMovedToPath());
        display.asyncExec(new Runnable() {
          public void run() {
            superSetInput(new FileEditorInput(newFile));
          }
        });
      }
    } else if (delta.getKind() == IResourceDelta.CHANGED) {
      if (!editorSaving) {
        // the file was overwritten somehow (could have been replaced by another
        // version in the respository)
        final IFile newFile = ResourcesPlugin.getWorkspace().getRoot()
            .getFile(delta.getFullPath());
        Display display = getSite().getShell().getDisplay();
        display.asyncExec(new Runnable() {
          public void run() {
            setInput(new FileEditorInput(newFile));
            getCommandStack().flush();
          }
        });
      }
    }
    return false;
  }
}

private IPartListener partListener = new IPartListener() {
  // If an open, unsaved file was deleted, query the user to either do a "Save As"
  // or close the editor.
  public void partActivated(IWorkbenchPart part) {
    if (part != LogicEditor.this)
      return;
    if (!((IFileEditorInput)getEditorInput()).getFile().exists()) {
      Shell shell = getSite().getShell();
      String title = LogicMessages.GraphicalEditor_FILE_DELETED_TITLE_UI;
      String message = LogicMessages.GraphicalEditor_FILE_DELETED_WITHOUT_SAVE_INFO;
      String[] buttons = {   LogicMessages.GraphicalEditor_SAVE_BUTTON_UI,
                     LogicMessages.GraphicalEditor_CLOSE_BUTTON_UI };
      MessageDialog dialog = new MessageDialog(
          shell, title, null, message, MessageDialog.QUESTION, buttons, 0);     
      if (dialog.open() == 0) {
        if (!performSaveAs())
          partActivated(part);
      }
      else {
        closeEditor(false);
      }
    }
  }
  public void partBroughtToTop(IWorkbenchPart part) {}
  public void partClosed(IWorkbenchPart part) {}
  public void partDeactivated(IWorkbenchPart part) {}
  public void partOpened(IWorkbenchPart part) {}
};

private LogicDiagram logicDiagram = new LogicDiagram();
private ResourceTracker resourceListener = new ResourceTracker();
private RulerComposite rulerComp;

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;

static {
  LogicPlugin.getDefault().getPreferenceStore().setDefault(
      PALETTE_SIZE, DEFAULT_PALETTE_SIZE);
}

public LogicEditor() {
  setEditDomain(new DefaultEditDomain(this));
}

protected void closeEditor(boolean save) {
  getSite().getPage().closeEditor(LogicEditor.this, save);
}

public void commandStackChanged(EventObject event) {
  firePropertyChange(IEditorPart.PROP_DIRTY);
  super.commandStackChanged(event);
}

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 GraphicalPartFactory());
  ContextMenuProvider provider = new LogicContextMenuProvider(viewer, getActionRegistry());
  viewer.setContextMenu(provider);
  getSite().registerContextMenu("org.eclipse.gef.examples.logic.editor.contextmenu", //$NON-NLS-1$
      provider, viewer);
  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);
}

protected void writeToOutputStream(OutputStream os)throws IOException {
  ObjectOutputStream out = new ObjectOutputStream(os);
  out.writeObject(getLogicDiagram());
  out.close()
}

protected CustomPalettePage createPalettePage() {
  return new CustomPalettePage(getPaletteViewerProvider()) {
    public void init(IPageSite pageSite) {
      super.init(pageSite);
      IAction copy = getActionRegistry().getAction(ActionFactory.COPY.getId());
      pageSite.getActionBars().setGlobalActionHandler(
          ActionFactory.COPY.getId(), copy);
    }
  };
}

protected PaletteViewerProvider createPaletteViewerProvider() {
  return new PaletteViewerProvider(getEditDomain()) {
    private IMenuListener menuListener;
    protected void configurePaletteViewer(PaletteViewer viewer) {
      super.configurePaletteViewer(viewer);
      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);
    }
  };
}

public void dispose() {
  getSite().getWorkbenchWindow().getPartService().removePartListener(partListener);
  partListener = null;
  ((IFileEditorInput)getEditorInput()).getFile().getWorkspace()
      .removeResourceChangeListener(resourceListener);
  super.dispose();
}

public void doSave(final IProgressMonitor progressMonitor) {
  editorSaving = true;
  Platform.run(new SafeRunnable() {
    public void run() throws Exception {
      saveProperties();
      ByteArrayOutputStream out = new ByteArrayOutputStream();
      writeToOutputStream(out);
      IFile file = ((IFileEditorInput)getEditorInput()).getFile();
      file.setContents(new ByteArrayInputStream(out.toByteArray()),
              true, false, progressMonitor);
      getCommandStack().markSaveLocation();
    }
  });
  editorSaving = false;
}

public void doSaveAs() {
  performSaveAs();
}

public Object getAdapter(Class type){
  if (type == IContentOutlinePage.class) {
    outlinePage = new OutlinePage(new TreeViewer());
    return outlinePage;
  }
  if (type == ZoomManager.class)
    return getGraphicalViewer().getProperty(ZoomManager.class.toString());

  return super.getAdapter(type);
}

protected Control getGraphicalControl() {
  return rulerComp;
}

/**
* Returns the KeyHandler with common bindings for both the Outline and Graphical Views.
* For example, delete is a common action.
*/
protected KeyHandler getCommonKeyHandler(){
  if (sharedKeyHandler == null){
    sharedKeyHandler = new KeyHandler();
    sharedKeyHandler.put(
      KeyStroke.getPressed(SWT.F2, 0),
      getActionRegistry().getAction(GEFActionConstants.DIRECT_EDIT));
  }
  return sharedKeyHandler;
}

protected LogicDiagram getLogicDiagram() {
  return logicDiagram;
}

protected PaletteRoot getPaletteRoot() {
  if( root == null ){
    root = LogicPlugin.createPalette();
  }
  return root;
}

public void gotoMarker(IMarker marker) {}

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();
  }
}

protected void initializeGraphicalViewer() {
  super.initializeGraphicalViewer();
  getGraphicalViewer().setContents(getLogicDiagram());
 
  getGraphicalViewer().addDropTargetListener((TransferDropTargetListener)
    new TemplateTransferDropTargetListener(getGraphicalViewer()));
  getGraphicalViewer().addDropTargetListener((TransferDropTargetListener)
    new TextTransferDropTargetListener(
        getGraphicalViewer(), TextTransfer.getInstance()));
}

protected void createActions() {
  super.createActions();
  ActionRegistry registry = getActionRegistry();
  IAction action;
 
  action = new CopyTemplateAction(this);
  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());
}

/* (non-Javadoc)
* @see org.eclipse.gef.ui.parts.GraphicalEditor#createGraphicalViewer(org.eclipse.swt.widgets.Composite)
*/
protected void createGraphicalViewer(Composite parent) {
  rulerComp = new RulerComposite(parent, SWT.NONE);
  super.createGraphicalViewer(rulerComp);
  rulerComp.setGraphicalViewer((ScrollingGraphicalViewer)getGraphicalViewer());
}

protected FigureCanvas getEditor(){
  return (FigureCanvas)getGraphicalViewer().getControl();
}

public boolean isSaveAsAllowed() {
  return true;
}

protected void loadProperties() {
  // Ruler properties
  LogicRuler ruler = getLogicDiagram().getRuler(PositionConstants.WEST);
  RulerProvider provider = null;
  if (ruler != null) {
    provider = new LogicRulerProvider(ruler);
  }
  getGraphicalViewer().setProperty(RulerProvider.PROPERTY_VERTICAL_RULER, provider);
  ruler = getLogicDiagram().getRuler(PositionConstants.NORTH);
  provider = null;
  if (ruler != null) {
    provider = new LogicRulerProvider(ruler);
  }
  getGraphicalViewer().setProperty(RulerProvider.PROPERTY_HORIZONTAL_RULER, provider);
  getGraphicalViewer().setProperty(RulerProvider.PROPERTY_RULER_VISIBILITY,
      new Boolean(getLogicDiagram().getRulerVisibility()));
 
  // Snap to Geometry property
  getGraphicalViewer().setProperty(SnapToGeometry.PROPERTY_SNAP_ENABLED,
      new Boolean(getLogicDiagram().isSnapToGeometryEnabled()));
 
  // Grid properties
  getGraphicalViewer().setProperty(SnapToGrid.PROPERTY_GRID_ENABLED,
      new Boolean(getLogicDiagram().isGridEnabled()));
  // We keep grid visibility and enablement in sync
  getGraphicalViewer().setProperty(SnapToGrid.PROPERTY_GRID_VISIBLE,
      new Boolean(getLogicDiagram().isGridEnabled()));
 
  // Zoom
  ZoomManager manager = (ZoomManager)getGraphicalViewer()
      .getProperty(ZoomManager.class.toString());
  if (manager != null)
    manager.setZoom(getLogicDiagram().getZoom());
  // Scroll-wheel Zoom
  getGraphicalViewer().setProperty(MouseWheelHandler.KeyGenerator.getKey(SWT.MOD1),
      MouseWheelZoomHandler.SINGLETON);

}

protected boolean performSaveAs() {
  SaveAsDialog dialog = new SaveAsDialog(getSite().getWorkbenchWindow().getShell());
  dialog.setOriginalFile(((IFileEditorInput)getEditorInput()).getFile());
  dialog.open();
  IPath path= dialog.getResult();
 
  if (path == null)
    return false;
 
  IWorkspace workspace = ResourcesPlugin.getWorkspace();
  final IFile file= workspace.getRoot().getFile(path);
 
  if (!file.exists()) {
    WorkspaceModifyOperation op= new WorkspaceModifyOperation() {
      public void execute(final IProgressMonitor monitor) {
        saveProperties();
        try {
          ByteArrayOutputStream out = new ByteArrayOutputStream();
          writeToOutputStream(out);
          file.create(new ByteArrayInputStream(out.toByteArray()), true, monitor);
          out.close();
        }
        catch (Exception e) {
          e.printStackTrace();
        }
      }
    };
    try {
      new ProgressMonitorDialog(getSite().getWorkbenchWindow().getShell())
          .run(false, true, op);     
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }
 
  try {
    superSetInput(new FileEditorInput(file));
    getCommandStack().markSaveLocation();
  }
  catch (Exception e) {
    e.printStackTrace();
  }
  return true;
}

protected void saveProperties() {
  getLogicDiagram().setRulerVisibility(((Boolean)getGraphicalViewer()
      .getProperty(RulerProvider.PROPERTY_RULER_VISIBILITY)).booleanValue());
  getLogicDiagram().setGridEnabled(((Boolean)getGraphicalViewer()
      .getProperty(SnapToGrid.PROPERTY_GRID_ENABLED)).booleanValue());
  getLogicDiagram().setSnapToGeometry(((Boolean)getGraphicalViewer()
      .getProperty(SnapToGeometry.PROPERTY_SNAP_ENABLED)).booleanValue());
  ZoomManager manager = (ZoomManager)getGraphicalViewer()
      .getProperty(ZoomManager.class.toString());
  if (manager != null)
    getLogicDiagram().setZoom(manager.getZoom());
}

protected void setInput(IEditorInput input) {
  superSetInput(input);

  IFile file = ((IFileEditorInput)input).getFile();
  try {
    InputStream is = file.getContents(false);
    ObjectInputStream ois = new ObjectInputStream(is);
    setLogicDiagram((LogicDiagram)ois.readObject());
    ois.close();
  }
  catch (Exception e) {
    //This is just an example.  All exceptions caught here.
    e.printStackTrace();
  }
 
  if (!editorSaving) {
    if (getGraphicalViewer() != null) {
      getGraphicalViewer().setContents(getLogicDiagram());
      loadProperties();
    }
    if (outlinePage != null) {
      outlinePage.setContents(getLogicDiagram());
    }
  }
}

public void setLogicDiagram(LogicDiagram diagram) {
  logicDiagram = diagram;
}

protected void superSetInput(IEditorInput input) {
  // The workspace never changes for an editor.  So, removing and re-adding the
  // resourceListener is not necessary.  But it is being done here for the sake
  // of proper implementation.  Plus, the resourceListener needs to be added
  // to the workspace the first time around.
  if(getEditorInput() != null) {
    IFile file = ((IFileEditorInput)getEditorInput()).getFile();
    file.getWorkspace().removeResourceChangeListener(resourceListener);
  }
 
  super.setInput(input);
 
  if(getEditorInput() != null) {
    IFile file = ((IFileEditorInput)getEditorInput()).getFile();
    file.getWorkspace().addResourceChangeListener(resourceListener);
    setPartName(file.getName());
  }
}

protected void setSite(IWorkbenchPartSite site){
  super.setSite(site);
  getSite().getWorkbenchWindow().getPartService().addPartListener(partListener);
}

}
TOP

Related Classes of org.eclipse.gef.examples.logicdesigner.LogicEditor

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.