Showing posts with label GEF. Show all posts
Showing posts with label GEF. Show all posts

Tuesday, July 29, 2008

DiagramEditor.java

package cn.edu.whu.sklse.aopworkshop.aosa.ui;

import java.util.ArrayList;
import java.util.EventObject;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.draw2d.GroupBoxBorder;
import org.eclipse.draw2d.LightweightSystem;
import org.eclipse.draw2d.PositionConstants;
import org.eclipse.draw2d.Viewport;
import org.eclipse.draw2d.parts.ScrollableThumbnail;
import org.eclipse.gef.ContextMenuProvider;
import org.eclipse.gef.DefaultEditDomain;
import org.eclipse.gef.GraphicalViewer;
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.SnapToGeometry;
import org.eclipse.gef.SnapToGrid;
import org.eclipse.gef.dnd.TemplateTransferDragSourceListener;
import org.eclipse.gef.editparts.ScalableRootEditPart;
import org.eclipse.gef.editparts.ZoomManager;
import org.eclipse.gef.palette.CombinedTemplateCreationEntry;
import org.eclipse.gef.palette.ConnectionCreationToolEntry;
import org.eclipse.gef.palette.CreationToolEntry;
import org.eclipse.gef.palette.MarqueeToolEntry;
import org.eclipse.gef.palette.PaletteDrawer;
import org.eclipse.gef.palette.PaletteRoot;
import org.eclipse.gef.palette.PaletteSeparator;
import org.eclipse.gef.palette.PanningSelectionToolEntry;
import org.eclipse.gef.palette.ToolEntry;
import org.eclipse.gef.requests.SimpleFactory;
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.DirectEditAction;
import org.eclipse.gef.ui.actions.GEFActionConstants;
import org.eclipse.gef.ui.actions.ToggleGridAction;
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.palette.FlyoutPaletteComposite.FlyoutPreferences;
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.jface.action.IAction;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
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.ui.IActionBars;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.part.IPageSite;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.eclipse.ui.views.contentoutline.IContentOutlinePage;

import cn.edu.whu.sklse.aopworkshop.aosa.AosaPlugin;
import cn.edu.whu.sklse.aopworkshop.aosa.Application;
import cn.edu.whu.sklse.aopworkshop.aosa.constants.DiagramPaletteStrings;
import cn.edu.whu.sklse.aopworkshop.aosa.constants.IIconNames;
import cn.edu.whu.sklse.aopworkshop.aosa.models.ArrowConnectionModel;
import cn.edu.whu.sklse.aopworkshop.aosa.models.AspectComponentModel;
import cn.edu.whu.sklse.aopworkshop.aosa.models.CombinationConnectionModel;
import cn.edu.whu.sklse.aopworkshop.aosa.models.ComponentModel;
import cn.edu.whu.sklse.aopworkshop.aosa.models.ConnectorModel;
import cn.edu.whu.sklse.aopworkshop.aosa.models.CrosscutConnectionModel;
import cn.edu.whu.sklse.aopworkshop.aosa.models.CrosscutInterfaceComponentModel;
import cn.edu.whu.sklse.aopworkshop.aosa.models.InOutConnectionModel;
import cn.edu.whu.sklse.aopworkshop.aosa.models.InterfaceComponentModel;
import cn.edu.whu.sklse.aopworkshop.aosa.models.LogicRuler;
import cn.edu.whu.sklse.aopworkshop.aosa.models.NoteComponentModel;
import cn.edu.whu.sklse.aopworkshop.aosa.models.ParentModel;
import cn.edu.whu.sklse.aopworkshop.aosa.models.LineConnectionModel;
import cn.edu.whu.sklse.aopworkshop.aosa.models.WhiteInterfaceComponentModel;
import cn.edu.whu.sklse.aopworkshop.aosa.parts.PartFactory;
import cn.edu.whu.sklse.aopworkshop.aosa.parts.TreeEditPartFactory;
import cn.edu.whu.sklse.aopworkshop.aosa.rulers.LogicRulerProvider;

/**
* @author Terry Qu
*
*/
public class DiagramEditor extends GraphicalEditorWithFlyoutPalette {

/**
*
*/
public static final String ID = "cn.edu.whu.sklse.aopworkshop.aosa.ui.DiagramEditor";

GraphicalViewer diagramViewer;

private ParentModel parentModel;

public DiagramEditor() {
super();
setEditDomain(new DefaultEditDomain(this));
}

protected void loadProperties() {

}

/*
* (non-Javadoc)
*
* @see org.eclipse.gef.ui.parts.GraphicalEditor#initializeGraphicalViewer()
*/
protected void initializeGraphicalViewer() {
diagramViewer = getGraphicalViewer();
diagramViewer.setProperty(SnapToGrid.PROPERTY_GRID_ENABLED,
new Boolean(true));
// We keep grid visibility and enablement in sync
diagramViewer.setProperty(SnapToGrid.PROPERTY_GRID_VISIBLE,
new Boolean(true));
diagramViewer.setProperty(SnapToGeometry.PROPERTY_SNAP_ENABLED,
new Boolean(true));

// diagramViewer.setProperty(RulerProvider.PROPERTY_VERTICAL_RULER,new
// SubjectRulerProvider(diagram.getLeftRuler()));
// diagramViewer().setProperty(RulerProvider.PROPERTY_HORIZONTAL_RULER,
// new SubjectRulerProvider(diagram.getTopRuler()));
// diagramViewer().setProperty(RulerProvider.PROPERTY_RULER_VISIBILITY,new
// Boolean(diagram.isRulerVisibility()));
//
// // Ruler properties
// LogicRuler ruler = diagramViewer().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()));
// Ruler properties
///%%%%%%%%%%%%%%
LogicRuler ruler = new LogicRuler(true);
RulerProvider provider = null;
if (ruler != null) {
provider = new LogicRulerProvider(ruler);
}
getGraphicalViewer().setProperty(RulerProvider.PROPERTY_VERTICAL_RULER,
provider);
ruler = new LogicRuler(true);
provider = null;
if (ruler != null) {
provider = new LogicRulerProvider(ruler);
}
getGraphicalViewer().setProperty(
RulerProvider.PROPERTY_HORIZONTAL_RULER, provider);
getGraphicalViewer().setProperty(
RulerProvider.PROPERTY_RULER_VISIBILITY, new Boolean(true));

parentModel = new ParentModel();
// ComponentModel componentModel_1 = new ComponentModel();
// componentModel_1.setRectConstraint(new Rectangle(0, 0, -1, -1));
//
// InterfaceComponentModel inter = new InterfaceComponentModel();
// inter.setConstraint(new Rectangle(30, 30, -1, -1));
// NoteComponentModel noteComponentModel = new NoteComponentModel();
// noteComponentModel.setRecConstraint(new Rectangle(80, 80, 80,50));
// parentModel.addChild(componentModel_1);
// parentModel.addChild(inter);
// parentModel.addChild(noteComponentModel);
diagramViewer.setContents(parentModel);
diagramViewer.setProperty(MouseWheelHandler.KeyGenerator
.getKey(SWT.MOD1), MouseWheelZoomHandler.SINGLETON);
}

/*
* (non-Javadoc)
*
* @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
*/
public void doSave(IProgressMonitor monitor) {
// TODO Auto-generated method stub
getCommandStack().markSaveLocation();
}

/*
* (non-Javadoc)
*
* @see org.eclipse.ui.part.EditorPart#doSaveAs()
*/
public void doSaveAs() {
// TODO Auto-generated method stub

}

public boolean isDirty() {
return getCommandStack().isDirty();// true * dirty
}

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

super.commandStackChanged(event);
}

/*
* (non-Javadoc)
*
* @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
*/
public boolean isSaveAsAllowed() {
// TODO Auto-generated method stub
return false;
}

// getGraphicalControl RulerComposite

// 配置GraphicalViewer
// 把自定义的PartFactory映射到GraphicalViewer上的EditPartFactory
protected void configureGraphicalViewer() {
super.configureGraphicalViewer();
diagramViewer = getGraphicalViewer();
diagramViewer.setEditPartFactory(new PartFactory());
IEditorSite editorSite = getEditorSite();

// create keyboard operation keyhandler
KeyHandler keyHandler = new KeyHandler();

keyHandler.put(KeyStroke.getPressed(SWT.DEL, 127, 0),
getActionRegistry().getAction(GEFActionConstants.DELETE));
keyHandler.put(KeyStroke.getPressed(SWT.F3, 0), getActionRegistry()
.getAction(GEFActionConstants.DIRECT_EDIT));
keyHandler.put(KeyStroke.getPressed(SWT.INSERT, 0), getActionRegistry()
.getAction(GEFActionConstants.EDIT_START));
// getGraphicalViewer().setKeyHandler(keyHandler);
getGraphicalViewer().setKeyHandler(
new GraphicalViewerKeyHandler(getGraphicalViewer())
.setParent(keyHandler));

ContextMenuProvider provider = new DiagramEditorContextMenuProvider(
diagramViewer, getActionRegistry());
diagramViewer.setContextMenu(provider);
getSite().registerContextMenu(
"cn.whu.sklse.aopworkshop.aoso.diagrameditor.contextmenu",
provider, diagramViewer);
ScalableRootEditPart rootEditPart = new ScalableRootEditPart();
diagramViewer.setRootEditPart(rootEditPart);
// get a ZoomManager
ZoomManager manager = rootEditPart.getZoomManager();
//
double[] zoomLevels = new double[] {
// 252000
0.25, 0.5, 0.75, 1.0, 1.5, 2.0, 2.5, 3.0, 4.0, 5.0, 10.0, 20.0 };
manager.setZoomLevels(zoomLevels); //

//
ArrayList zoomContributions = new ArrayList();
zoomContributions.add(ZoomManager.FIT_ALL);
zoomContributions.add(ZoomManager.FIT_HEIGHT);
zoomContributions.add(ZoomManager.FIT_WIDTH);
manager.setZoomLevelContributions(zoomContributions);
// magnify
IAction zoomIn = new ZoomInAction(manager);

getActionRegistry().registerAction(zoomIn);
// shrink
IAction zoomOut = new ZoomOutAction(manager);

getActionRegistry().registerAction(zoomOut);
getSite().getKeyBindingService().registerAction(zoomIn);
getSite().getKeyBindingService().registerAction(zoomOut);
IAction showGrid = new ToggleGridAction(diagramViewer);
showGrid.setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(
Application.PLUGIN_ID, "icons/help.gif"));
showGrid.setToolTipText("show a grid on the background");
getActionRegistry().registerAction(showGrid);
IAction snapAction = new ToggleSnapToGeometryAction(diagramViewer);
getActionRegistry().registerAction(snapAction);
}

/**
* A generic selection tool.
*/
private static ToolEntry _selectionTool = new PanningSelectionToolEntry(
DiagramPaletteStrings.SELECTION_LABEL,
DiagramPaletteStrings.SELECTION_DESCRIPTION);

/**
* @return The generic selection tool.
*/
public static ToolEntry getSelectionTool() {
return _selectionTool;
}

/*
* (non-Javadoc)
*
* @see org.eclipse.gef.ui.parts.GraphicalEditorWithPalette#getPaletteRoot()
*/
protected PaletteRoot getPaletteRoot() {
// TODO Auto-generated method stub
PaletteRoot paletteRoot = new PaletteRoot();
// PaletteGroup tools = new
// PaletteGroup(DiagramPaletteStrings.GROUP_MAIN_LABEL);
paletteRoot.setDefaultEntry(getSelectionTool());
ToolEntry marqueeTool = new MarqueeToolEntry();
ImageDescriptor descriptor = AbstractUIPlugin
.imageDescriptorFromPlugin(Application.PLUGIN_ID,
IIconNames.COMPONENT_MODEL);

//notation
ImageDescriptor noteDescriptor = AbstractUIPlugin
.imageDescriptorFromPlugin(Application.PLUGIN_ID,
IIconNames.NOTE_COMPONENT_MODEL);
CombinedTemplateCreationEntry combinedTemplateCreationEntry = new CombinedTemplateCreationEntry(
"Notation", "make notations for graphs", NoteComponentModel.class,
new SimpleFactory(NoteComponentModel.class), noteDescriptor, noteDescriptor);

//provided port
ImageDescriptor interDescriptor = AbstractUIPlugin
.imageDescriptorFromPlugin(Application.PLUGIN_ID,
IIconNames.INTERFACE_COMPONENT_MODEL);
CombinedTemplateCreationEntry interTemplateCreationEntry = new CombinedTemplateCreationEntry(
"provided port ", "create a provided port ",InterfaceComponentModel.class,
new SimpleFactory(InterfaceComponentModel.class),
interDescriptor, interDescriptor);

//connector
ImageDescriptor connectorDescriptor = AbstractUIPlugin
.imageDescriptorFromPlugin(Application.PLUGIN_ID,
IIconNames.INTERFACE_COMPONENT_MODEL);
CombinedTemplateCreationEntry connectTemplateCreationEntry = new CombinedTemplateCreationEntry(
"connector ", "create a connector used by kinds of components",ConnectorModel.class,
new SimpleFactory(ConnectorModel.class),
connectorDescriptor, connectorDescriptor);

//aspect
ImageDescriptor aspectDescriptor = AbstractUIPlugin
.imageDescriptorFromPlugin(Application.PLUGIN_ID,
IIconNames.ASPECT_COMPONENT_MODEL);
CombinedTemplateCreationEntry aspectTemplateCreationEntry = new CombinedTemplateCreationEntry(
"Aspect Component ", "create a aspect component used ",AspectComponentModel.class,
new SimpleFactory(AspectComponentModel.class),
aspectDescriptor, aspectDescriptor);

ImageDescriptor whiteInterDescriptor = AbstractUIPlugin
.imageDescriptorFromPlugin(Application.PLUGIN_ID,
IIconNames.WHITE_INTERFACE_COMPONENT_MODEL);
CombinedTemplateCreationEntry whiteInterTemplateCreationEntry = new CombinedTemplateCreationEntry(
"required port ", "create a required port ",WhiteInterfaceComponentModel.class,
new SimpleFactory(WhiteInterfaceComponentModel.class),
whiteInterDescriptor, whiteInterDescriptor);

ImageDescriptor cutInterDescriptor = AbstractUIPlugin
.imageDescriptorFromPlugin(Application.PLUGIN_ID,
IIconNames.CROSSCUT_INTERFACE_COMPONENT_MODEL);
CombinedTemplateCreationEntry cutInterTemplateCreationEntry = new CombinedTemplateCreationEntry(
"crosscutting port ", "create a crosscutting port ",CrosscutInterfaceComponentModel.class,
new SimpleFactory(CrosscutInterfaceComponentModel.class),
cutInterDescriptor, cutInterDescriptor);
/////////////drawer
PaletteDrawer drawer = new PaletteDrawer(
DiagramPaletteStrings.DRAWER_LABEL);

CreationToolEntry creationToolEntry = new CreationToolEntry(
"Base Commponent", "create a base component", new SimpleFactory(
ComponentModel.class), descriptor, descriptor);
drawer.add(creationToolEntry);


// ConnectionCreationToolEntry noteCreationToolEntry = new ConnectionCreationToolEntry(
// "Notation ", "make notations for graphs",
// new SimpleFactory(NoteComponentModel.class),
// noteDescriptor, noteDescriptor);


ImageDescriptor descriptorRelationship = AbstractUIPlugin
.imageDescriptorFromPlugin(Application.PLUGIN_ID,
IIconNames.RELATIONSHIP_MODEL);
ConnectionCreationToolEntry conCreationToolEntry = new ConnectionCreationToolEntry(
"association ", "create a association among components and connectors ", new SimpleFactory(
LineConnectionModel.class), descriptorRelationship,
descriptorRelationship);
drawer.add(conCreationToolEntry);
drawer.add(new PaletteSeparator());
ImageDescriptor arrowDescriptor = AbstractUIPlugin
.imageDescriptorFromPlugin(Application.PLUGIN_ID,
IIconNames.ARROW_RELATIONSHIP_MODEL);
ConnectionCreationToolEntry arrowConCreationToolEntry = new ConnectionCreationToolEntry(
"arrow connector", "create a arrow connector ",
new SimpleFactory(ArrowConnectionModel.class), arrowDescriptor,
arrowDescriptor);
drawer.add(arrowConCreationToolEntry);

ImageDescriptor crosscutDescriptor = AbstractUIPlugin
.imageDescriptorFromPlugin(Application.PLUGIN_ID,
IIconNames.CROSSCUT_RELATIONSHIP_MODEL);
ConnectionCreationToolEntry crosscutConCreationToolEntry = new ConnectionCreationToolEntry(
"crosscutting ", "create a crosscutting relationship ",
new SimpleFactory(CrosscutConnectionModel.class),
crosscutDescriptor, crosscutDescriptor);
drawer.add(crosscutConCreationToolEntry);
ImageDescriptor inoutDescriptor = AbstractUIPlugin
.imageDescriptorFromPlugin(Application.PLUGIN_ID,
IIconNames.IN_OUT_RELATIONSHIP_MODEL);
ConnectionCreationToolEntry inoutConCreationToolEntry = new ConnectionCreationToolEntry(
"in-out relationship ", "create an inner-outter relationship ",
new SimpleFactory(InOutConnectionModel.class),
inoutDescriptor, inoutDescriptor);
drawer.add(inoutConCreationToolEntry);

ImageDescriptor combinationDescriptor = AbstractUIPlugin
.imageDescriptorFromPlugin(Application.PLUGIN_ID,
IIconNames.COMBINATION_RELATIONSHIP_MODEL);
ConnectionCreationToolEntry combinationConCreationToolEntry = new ConnectionCreationToolEntry(
"combination relationship ", "combination relationship between BaseRole and CrosscutRole ",
new SimpleFactory(CombinationConnectionModel.class),
combinationDescriptor, combinationDescriptor);
drawer.add(combinationConCreationToolEntry);





/***********************************************************************
* commono tool
*/
PaletteDrawer commonDrawer = new PaletteDrawer(
DiagramPaletteStrings.COMMON_DRAWER_LABEL);
commonDrawer.add(getSelectionTool());
commonDrawer.add(marqueeTool);
commonDrawer.add(aspectTemplateCreationEntry);
commonDrawer.add(connectTemplateCreationEntry);
commonDrawer.add(combinedTemplateCreationEntry);
commonDrawer.add(interTemplateCreationEntry);
commonDrawer.add(whiteInterTemplateCreationEntry);
commonDrawer.add(cutInterTemplateCreationEntry);

paletteRoot.add(commonDrawer);
paletteRoot.add(drawer);
return paletteRoot;
}

/**
* keyboard operation override method
*
*/
protected void createActions() {
super.createActions();
ActionRegistry registry = getActionRegistry();

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

getSelectionActions().add(action.getId());

//
// action = new
// ZoomOutAction(((ScalableRootEditPart)diagramViewer.getRootEditPart()).getZoomManager());
// action.setId(GEFActionConstants.ZOOM_OUT);
// registry.registerAction(action);
// getSelectionActions().add(action.getId());
// action = new
// ZoomInAction(((ScalableRootEditPart)diagramViewer.getRootEditPart()).getZoomManager());
// action.setId(GEFActionConstants.ZOOM_IN);
// 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.CENTER);
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.MIDDLE);
registry.registerAction(action);
getSelectionActions().add(action.getId());

action = new AlignmentAction((IWorkbenchPart) this,
PositionConstants.BOTTOM);
registry.registerAction(action);
getSelectionActions().add(action.getId());
}

/**
* ZoomComboContributionItem
*/
// override
public Object getAdapter(Class type) {
if (type == ZoomManager.class)
return ((ScalableRootEditPart) getGraphicalViewer()
.getRootEditPart()).getZoomManager();
if (type == IContentOutlinePage.class) {
return new CustomContentOutlinePage();
}
return super.getAdapter(type);
}

/**
* outline
*/
// ContentOutlinePage
class CustomContentOutlinePage extends ContentOutlinePage {

public CustomContentOutlinePage() {
super(new TreeViewer());
// TODO Auto-generated constructor stub
}

// SashForm Outline
private SashForm sash;

private ScrollableThumbnail thumbnail;

private DisposeListener disposeListener;

//
public void createControl(Composite parent) {
// SashForm
sash = new SashForm(parent, SWT.VERTICAL);
//
getViewer().createControl(sash);

// Edit Domain
getViewer().setEditDomain(getEditDomain());
// set EditPartFactory
getViewer().setEditPartFactory(new TreeEditPartFactory());
// outline--->ParentModel
getViewer().setContents(parentModel);
// synchronize
getSelectionSynchronizer().addViewer(getViewer());

Canvas canvas = new Canvas(sash, SWT.BORDER);
// LightweightSystem
LightweightSystem lws = new LightweightSystem(canvas);

// RootEditPart
thumbnail = new ScrollableThumbnail(
(Viewport) ((ScalableRootEditPart) getGraphicalViewer()
.getRootEditPart()).getFigure());
thumbnail.setBorder(new GroupBoxBorder("Thumbnail"));
// thumbnail.setBorder(new MarginBorder(3));
thumbnail.setSource(((ScalableRootEditPart) getGraphicalViewer()
.getRootEditPart())
.getLayer(LayerConstants.PRINTABLE_LAYERS));

lws.setContents(thumbnail);

disposeListener = new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
//
if (thumbnail != null) {
thumbnail.deactivate();
thumbnail = null;
}
}
};
// Graphical Viewer thumbnail
getGraphicalViewer().getControl().addDisposeListener(
disposeListener);
}

public Control getControl() {
// outline 为active
return sash;
}

public void dispose() {
// TreeViewer SelectionSynchronizer
getSelectionSynchronizer().removeViewer(getViewer());
if (getGraphicalViewer().getControl() != null
&& !getGraphicalViewer().getControl().isDisposed())
getGraphicalViewer().getControl().removeDisposeListener(
disposeListener);
super.dispose();

}

public void init(IPageSite pageSite) {
super.init(pageSite);
// graphical editor Action
ActionRegistry registry = getActionRegistry();
// Action
IActionBars bars = pageSite.getActionBars();

String id = IWorkbenchActionConstants.UNDO;
bars.setGlobalActionHandler(id, registry.getAction(id));

id = IWorkbenchActionConstants.REDO;
bars.setGlobalActionHandler(id, registry.getAction(id));

id = IWorkbenchActionConstants.DELETE;
bars.setGlobalActionHandler(id, registry.getAction(id));
bars.updateActionBars();
}

}

protected FlyoutPreferences getPalettePreferences() {
return new FlyoutPreferences() {

public int getDockLocation() {
return
// AosaPlugin.getDefault().getPreferenceStore().getInt(IConstants.PREF_PALETTE_DOCK_LOCATION);
AosaPlugin.getDefault().getPreferenceStore().getInt("pre");
}

public void setDockLocation(int location) {
AosaPlugin.getDefault().getPreferenceStore().setValue("pre",
location);
}

public int getPaletteState() {
return 0;
}

public int getPaletteWidth() {
return 0;
}

public void setPaletteState(int arg0) {

}

public void setPaletteWidth(int arg0) {
}
};
}

protected PaletteViewerProvider createPaletteViewerProvider() {
return new PaletteViewerProvider(getEditDomain()) {
protected void configurePaletteViewer(PaletteViewer viewer) {
super.configurePaletteViewer(viewer);
viewer
.addDragSourceListener(new TemplateTransferDragSourceListener(
viewer));
}
};
}

/*
* (non-Javadoc)
*
* @see org.eclipse.gef.ui.parts.GraphicalEditor#createGraphicalViewer(org.eclipse.swt.widgets.Composite)
*/
private RulerComposite rulerComp;

protected void createGraphicalViewer(Composite parent) {
rulerComp = new RulerComposite(parent, SWT.NONE);
super.createGraphicalViewer(rulerComp);
rulerComp
.setGraphicalViewer((ScrollingGraphicalViewer) getGraphicalViewer());
}

// getGraphicalControl RulerComposite

protected Control getGraphicalControl() {
return rulerComp;
}
}

Serializable Problem in GEF

public abstract class Element implements IPropertySource, Cloneable, Serializable {

PropertyChangeSupport listeners = new PropertyChangeSupport(this);

private static final long serialVersionUID = 1;

/** An empty property descriptor. */
private static final IPropertyDescriptor[] EMPTY_ARRAY = new IPropertyDescriptor[0];

public void addPropertyChangeListener(PropertyChangeListener l) {
listeners.addPropertyChangeListener(l);
}

protected void firePropertyChange(String prop, Object old, Object newValue) {
listeners.firePropertyChange(prop, old, newValue);
}

protected void fireStructureChange(String prop, Object child) {
listeners.firePropertyChange(prop, null, child);
}
////
/**
* Returns a value for this property source that can be edited in a property sheet.
*

My personal rule of thumb:


*

    *
  • model elements should return themselves and

  • *
  • custom IPropertySource implementations (like DimensionPropertySource in the GEF-logic
    * example) should return an editable value.

  • *

*

Override only if necessary.


* @return this instance
*/
public Object getEditableValue() {
return this;
}

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
listeners = new PropertyChangeSupport(this);
}

public void removePropertyChangeListener(PropertyChangeListener l) {
listeners.removePropertyChangeListener(l);
}

/**
* Children should override this. The default implementation returns an empty array.
*/
public IPropertyDescriptor[] getPropertyDescriptors() {
return EMPTY_ARRAY;
}

/**
* Children should override this. The default implementation does nothing.
*/
public void resetPropertyValue(Object id) {
// do nothing
}

/**
* Children should override this. The default implementation does nothing.
*/
public void setPropertyValue(Object id, Object value) {
// do nothing
}

/**
* Children should override this. The default implementation returns null.
*/
public Object getPropertyValue(Object id) {
return null;
}

/**
* Children should override this. The default implementation returns false.
*/
public boolean isPropertySet(Object id) {
return false;
}

/*
* Created on 2005-1-24
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package com.example.ui;

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 org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.gef.DefaultEditDomain;
import org.eclipse.gef.dnd.TemplateTransferDragSourceListener;
import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
//import org.eclipse.gef.examples.shapes.model.ShapesDiagram;
//import org.eclipse.gef.examples.flow.model.ActivityDiagram;
import org.eclipse.gef.palette.PaletteRoot;
import org.eclipse.gef.ui.actions.ActionRegistry;
import org.eclipse.gef.ui.parts.ContentOutlinePage;
import org.eclipse.gef.ui.parts.GraphicalEditorWithPalette;
import org.eclipse.gef.ui.parts.TreeViewer;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IWorkbenchActionConstants;
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.views.contentoutline.IContentOutlinePage;

import com.example.dnd.DiagramTemplateTransferDropTargetListener;
import com.example.model.Diagram;
import com.example.parts.PartFactory;
import com.example.parts.TreePartFactory;
import com.example.tools.PaletteFactory;


public class PracticeEditor extends GraphicalEditorWithPalette {

private Diagram diagram = new Diagram();

private PaletteRoot paletteRoot;

public Diagram getDiagram() {
return this.diagram;
}

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

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

protected void configureGraphicalViewer() {
super.configureGraphicalViewer();
getGraphicalViewer().setRootEditPart(new ScalableFreeformRootEditPart());
getGraphicalViewer().setEditPartFactory(new PartFactory());
}

protected void initializeGraphicalViewer() {
getGraphicalViewer().setContents(this.diagram);
getGraphicalViewer().addDropTargetListener(new DiagramTemplateTransferDropTargetListener(getGraphicalViewer()));
}

public void doSave(IProgressMonitor monitor) {
// try {
// InputStream in = diagram.getAsStream();
// IFile file = ((IFileEditorInput)getEditorInput()).getFile();
// file.setContents(in, true, false, monitor);
// getCommandStack().markSaveLocation();
// }
// catch (Exception e) {
// e.printStackTrace();
// }
try{
ByteArrayOutputStream out = new ByteArrayOutputStream();
createOutputStream(out);
IFile file = ((IFileEditorInput)getEditorInput()).getFile();
file.setContents(new ByteArrayInputStream(out.toByteArray()),
true, false, monitor);
out.close();
getCommandStack().markSaveLocation();
}
catch (Exception e) {
e.printStackTrace();
}
}

public void doSaveAs() {
SaveAsDialog dialog= new SaveAsDialog(getSite().getWorkbenchWindow().getShell());
dialog.setOriginalFile(((IFileEditorInput)getEditorInput()).getFile());
dialog.open();
IPath path= dialog.getResult();

if (path == null)
return;

IWorkspace workspace= ResourcesPlugin.getWorkspace();
final IFile file= workspace.getRoot().getFile(path);

WorkspaceModifyOperation op= new WorkspaceModifyOperation() {
public void execute(final IProgressMonitor monitor) throws CoreException {
try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
createOutputStream(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);
setInput(new FileEditorInput((IFile)file));
getCommandStack().markSaveLocation();
}
catch (Exception e) {
e.printStackTrace();
}
}

public boolean isDirty() {
return getCommandStack().isDirty();
}

public boolean isSaveAsAllowed() {
return true;
}

protected void setInput(IEditorInput input) {
// super.setInput(input);
// try {
// IFile file = ((IFileEditorInput) input).getFile();
// ObjectInputStream in = new ObjectInputStream(file.getContents());
// diagram = (Diagram) in.readObject();
// in.close();
// setPartName(file.getName());
// }
// catch (Exception e) {
// //This is just an example. All exceptions caught here.
// e.printStackTrace();
// diagram = new Diagram();
// }

// super.setInput(input);
//
// IFile file = ((IFileEditorInput)input).getFile();
// try {
// InputStream is = file.getContents(false);
// ObjectInputStream ois = new ObjectInputStream(is);
// diagram = (Diagram)ois.readObject();
// ois.close();
// } catch (Exception e) {
// //This is just an example. All exceptions caught here.
// e.printStackTrace();
// diagram = new Diagram();
// }

super.setInput(input);

IFile file = ((IFileEditorInput) input).getFile();
// diagram = new Diagram();
try { // attempt to read from a file
InputStream istream = file.getContents(false);
diagram = Diagram.makeFromStream(istream);
} catch (Exception e) { // but if there's an error, create a new diagram
e.printStackTrace();
diagram = new Diagram();
}
}

public Object getAdapter(Class type) {
if (type == IContentOutlinePage.class)
return new OutlinePage();
return super.getAdapter(type);
}

protected PaletteRoot getPaletteRoot() {
if (this.paletteRoot == null) {
this.paletteRoot = PaletteFactory.createPalette();
}
return this.paletteRoot;
}

protected void initializePaletteViewer() {
super.initializePaletteViewer();
getPaletteViewer().addDragSourceListener(new TemplateTransferDragSourceListener(getPaletteViewer()));
}

class OutlinePage extends ContentOutlinePage {
// private PageBook pageBook;

private Control outline;

public OutlinePage() {
super(new TreeViewer());
}

public void init(IPageSite pageSite) {
super.init(pageSite);
ActionRegistry registry = getActionRegistry();
IActionBars bars = pageSite.getActionBars();
String id = IWorkbenchActionConstants.UNDO;
bars.setGlobalActionHandler(id, registry.getAction(id));
id = IWorkbenchActionConstants.REDO;
bars.setGlobalActionHandler(id, registry.getAction(id));
id = IWorkbenchActionConstants.DELETE;
bars.setGlobalActionHandler(id, registry.getAction(id));
bars.updateActionBars();
}

public void createControl(Composite parent) {
// pageBook = new PageBook(parent, SWT.NONE);
// outline = getViewer().createControl(pageBook);
// pageBook.showPage(outline);
outline = getViewer().createControl(parent);
getSelectionSynchronizer().addViewer(getViewer());
getViewer().setEditDomain(getEditDomain());
getViewer().setEditPartFactory(new TreePartFactory());
// getViewer().setKeyHandler(getCommonKeyHandler());
getViewer().setContents(getDiagram());
}

public Control getControl() {
// return pageBook;
return outline;
}

public void dispose() {
getSelectionSynchronizer().removeViewer(getViewer());
super.dispose();
}
}

}


java.io.NotSerializableException: org.eclipse.ui.views.properties.TextPropertyDescriptor
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeArray(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at java.util.ArrayList.writeObject(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at com.example.ui.PracticeEditor.createOutputStream(PracticeEditor.java:74)
at com.example.ui.PracticeEditor.doSave(PracticeEditor.java:101)
at org.eclipse.ui.internal.SaveableHelper$1.run(SaveableHelper.java:131)
at org.eclipse.ui.internal.SaveableHelper$4.run(SaveableHelper.java:252)
at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:369)
at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:313)
at org.eclipse.jface.window.ApplicationWindow$1.run(ApplicationWindow.java:763)
at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:67)
at org.eclipse.jface.window.ApplicationWindow.run(ApplicationWindow.java:760)
at org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:2283)
at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:258)
at org.eclipse.ui.internal.SaveableHelper.savePart(SaveableHelper.java:136)
at org.eclipse.ui.internal.EditorManager.savePart(EditorManager.java:1386)
at org.eclipse.ui.internal.WorkbenchPage.savePart(WorkbenchPage.java:2995)
at org.eclipse.ui.internal.WorkbenchPage.saveEditor(WorkbenchPage.java:3008)
at org.eclipse.ui.internal.SaveAction.run(SaveAction.java:67)
at org.eclipse.jface.action.Action.runWithEvent(Action.java:499)
at org.eclipse.jface.commands.ActionHandler.execute(ActionHandler.java:119)
at org.eclipse.core.commands.Command.executeWithChecks(Command.java:461)
at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:424)
at org.eclipse.ui.internal.handlers.HandlerService.executeCommand(HandlerService.java:160)
at org.eclipse.ui.internal.keys.WorkbenchKeyboard.executeCommand(WorkbenchKeyboard.java:466)
at org.eclipse.ui.internal.keys.WorkbenchKeyboard.press(WorkbenchKeyboard.java:799)
at org.eclipse.ui.internal.keys.WorkbenchKeyboard.processKeyEvent(WorkbenchKeyboard.java:846)
at org.eclipse.ui.internal.keys.WorkbenchKeyboard.filterKeySequenceBindings(WorkbenchKeyboard.java:564)
at org.eclipse.ui.internal.keys.WorkbenchKeyboard.access$3(WorkbenchKeyboard.java:506)
at org.eclipse.ui.internal.keys.WorkbenchKeyboard$KeyDownFilter.handleEvent(WorkbenchKeyboard.java:122)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
at org.eclipse.swt.widgets.Display.filterEvent(Display.java:982)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:927)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:952)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:937)
at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:965)
at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:961)
at org.eclipse.swt.widgets.Widget.wmChar(Widget.java:1275)
at org.eclipse.swt.widgets.Control.WM_CHAR(Control.java:3346)
at org.eclipse.swt.widgets.Control.windowProc(Control.java:3246)
at org.eclipse.swt.widgets.Display.windowProc(Display.java:4025)
at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method)
at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:1925)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2966)
at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:1914)
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:1878)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:419)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
at org.eclipse.ui.internal.ide.IDEApplication.run(IDEApplication.java:95)
at org.eclipse.core.internal.runtime.PlatformActivator$1.run(PlatformActivator.java:78)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:92)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:68)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:400)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:177)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.core.launcher.Main.invokeFramework(Main.java:336)
at org.eclipse.core.launcher.Main.basicRun(Main.java:280)
at org.eclipse.core.launcher.Main.run(Main.java:977)
at org.eclipse.core.launcher.Main.main(Main.java:952)