/*******************************************************************************
* 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);
}
}