...
- Start Eclipse and create a new workspace.
- Setup your workspace as explained in this guide.
Adding a New Plug-in
Writing the Layout Algorithm
This exercise will introduce the usage of the Eclipse Plugin Development Environment for developing new layout algorithms to be used in Eclipse diagram editors. Replace each <login> by your own login name (e.g. msp), and each <Login> by your login name with capitalized first letter (e.g. Msp). For any questions contact msp.
- Install and set up Eclipse (TODO: describe steps to install and set up Eclipse)
- Import the following KIELER plugins: (TODO: describe steps to access and import the KIELER plugins and update the list)We will now make the two local clones of our Git repositories known to Eclipse. To that end, open the Git Repository Exploring perspective through Window -> Open Perspective -> Other.
- Click on Add an existing local Git repository and choose the location of the tutorial repository.
- Add the KIML repository.
- We will now import the projects required for KIML development to your workspace. Right-click on the KIML repository and choose Import Projects.
- Choose Import existing projects, and select the plugins folder from the Working Directory. Then click Next.
- Import the following plug-ins. This consitutes a basic configuration for the development of layout algorithms.
- de.cau.cs.kieler.core
- de.cau.cs.kieler.core.kgraph
- de.cau.cs.kieler.kiml
- de.cau.cs.kieler.kiml.gmf
- de.cau.cs.kieler.kiml.service
- de.cau.cs.kieler.kiml.ui
- de.cau.cs.kieler.klay.layered
- To actually test your layout algorithms, you will need some kind of simple graph editor. The following plug-ins will add our KEG editor to your installation, which is just that.
- de.cau.cs.kieler.core.annotations
- de.cau.cs.kieler.core.kgraph.edit
- de.cau.cs.kieler.core.kivi
- de.cau.cs.kieler.core.model
- de.cau.cs.kieler.core.model.gmf
- de.cau.cs.kieler.core.ui
- de.cau.cs.kieler.karma
- de.cau.cs.kieler.corekeg
- de.cau.cs.kieler.corekeg.kgraphdiagram
- de.cau.cs.kieler.keg.diagram.kimlcustom
- de.cau.cs.kieler.kiml.service
- de.cau.cs.kieler.kiml.ui
- de.cau.cs.kieler.klay.layered.keg.edit
Adding a New Plug-in
Writing the Layout Algorithm
This exercise will introduce the usage of the Eclipse Plugin Development Environment for developing new layout algorithms to be used in Eclipse diagram editors. Replace each <login> by your own login name (e.g. msp), and each <Login> by your login name with capitalized first letter (e.g. Msp). For any questions contact msp.
- Create a new plugin
- File → New → Other... → Plug-in Development → Plug-in Project
- Project name: de.cau.cs.rtprak.<login>.tutorial2
- Next → set version to 0.1.0.qualifier, provider to Christian-Albrechts-Universität zu Kiel, and execution environment to J2SE-1.5 (do this for all plugins that you create!)
- The checkboxes in the Options group can be deactivated -> Finish
- Commit the new plugin project (TODO: describe steps to commit plugin projects)
- Open the file META-INF/MANIFEST.MF → Dependencies tab
- Add the plugins de.cau.cs.kieler.core and de.cau.cs.kieler.kiml to the list of dependencies, then save the file.
- Create a layout provider class with the New → Class wizard
- Package: de.cau.cs.rtprak.<login>.tutorial2
- Name: <Login>LayoutProvider
- Superclass: de.cau.cs.kieler.kiml.AbstractLayoutProvider
- Implement the layout provider class
- Add the following constant to the class:
/** default value for spacing between nodes. */ private static final float DEFAULT_SPACING = 15.0f;
- Write the following lines at the beginning of the
doLayout
method:progressMonitor.begin("<Login> Layouter", 1); KShapeLayout parentLayout = layoutNode.getData(KShapeLayout.class); float objectSpacing = parentLayout.getProperty(LayoutOptions.SPACING); if (objectSpacing < 0) { objectSpacing = DEFAULT_SPACING; } float borderSpacing = parentLayout.getProperty(LayoutOptions.BORDER_SPACING); if (borderSpacing < 0) { borderSpacing = DEFAULT_SPACING; }
- Write the following line at the end of the
doLayout
method:progressMonitor.done();
- Implement the rest of the layouter such that the nodes of the input graph are all put in a row.
- See the KGraph and KLayoutData data structures: the input is a KNode and holds the nodes of the graph in its list of children
- Iterate over the nodes in the
getChildren()
list of thelayoutNode
input - Retrieve the size of a node using the following code:
KShapeLayout nodeLayout = node.getData(KShapeLayout.class); float width = nodeLayout.getWidth(); float height = nodeLayout.getHeight();
- Set the position (x, y) of a node's upper left corner using the following code:
nodeLayout.setXpos(x); nodeLayout.setYpos(y);
objectSpacing
shall be the spacing to be left between each pair of nodes.borderSpacing
shall be the spacing to be left to the borders of the drawing: the first node's coordinates shall be (borderSpacing, borderSpacing).- At the end of the method, set the width and height of
parentLayout
so that it is large enough to hold the whole drawing, including borders. - Edges may be ignored for now.
- Open the file META-INF/MANIFEST.MF → Extensions tab
- Add an extension for de.cau.cs.kieler.kiml.layout.layoutProviders
- Right-click the extension → New → layoutProvider
- Set name to <Login> Test Layouter, class to de.cau.cs.rtprak.<login>.tutorial2.<Login>LayoutProvider
- Right-click the new layoutProvider → New → knownOption, set option to de.cau.cs.kieler.spacing
- Add another knownOption, set to de.cau.cs.kieler.borderSpacing
- Run → Run Configurations... → right-click Eclipse Application → New
- Name: Layout
- For testing the layouter, a new workspace location will be created; you may configure its destination in Workspace Data → Location
- Add the program arguments
-debug -consoleLog
in the Arguments tab. - Go to Plug-ins tab, select Launch with: plug-ins selected below only
- Deselect All, activate Workspace checkbox, Add Required Plug-ins, Apply, Run
- Test the layouter in the new Eclipse instance:
- New → Project... → General → Project, name test
- Right-click test project → New → Other... → KEG Diagram (TODO: if graphs shall be created in another way, describe it here)
- Create a graph using the palette on the right.
- Window → Show View → Other... → KIELER → Layout
- While the graph diagram is open, set Layout Provider or Type in the Layout view to <Login> Test Layouter.
- Open the additional views Layout Graph and Layout Time.
- Trigger layout with the KIELER Layout button in the toolbar or Ctrl+R L (first Ctrl+R, then L).
- See the direct input and output of your algorithm in the Layout Graph view.
- See the execution time analysis in the Layout Time view.
- Implement another class EdgeRouter.
- Add the following method:
/**
* Route the edges that are connected with the children of the given node.
* @param parentNode the parent node of the input graph
*/
public void routeEdges(final KNode parentNode) {
getMonitor().begin("Edge Routing", 1);
getMonitor().done();
} - Add the following code to the end of the
doLayout
method in your layout provider:EdgeRouter edgeRouter = new EdgeRouter(); edgeRouter.routeEdges(layoutNode);
- Implement the
routeEdges
method:- Each edge shall be drawn with three line segments: one vertical segment starting below the source node, one horizonzal segment, and another vertical segment ending below the target node.
- The horizontal segments of two different edges shall not have the same y-coordinate; for consecutive edges, the distance between their horizontal segments shall equal
objectSpacing
. - See the attached image test-drawing.png for an example.
- Find the edges using
getOutgoingEdges()
orgetIncomingEdges()
on a node. - Get the edge layout of an edge to set bend points using this code:
KEdgeLayout edgeLayout = edge.getData(KEdgeLayout.class);
- Create a bend point using this code:
KPoint point = KLayoutDataFactory.eINSTANCE.createKPoint();
- Use the
getBendPoints()
list on theedgeLayout
to add bend points (clear the list first to remove points from the previous layout). - Set the values of the points returned by
getSourcePoint()
andgetTargetPoint()
according to the positions where the edge leaves its source node and reches its target node.
- Add the following method:
- Use your previous run configuration to test the edge router.