001 002 package nl.cwi.sen1.visplugin.graphplugin; 003 004 import java.awt.event.MouseEvent; 005 006 import nl.cwi.sen1.gui.plugin.prefusedot.DotEdgeRenderer; 007 import nl.cwi.sen1.gui.plugin.prefusedot.DotLabelLayout; 008 import nl.cwi.sen1.gui.plugin.prefusedot.DotNodeLayout; 009 import nl.cwi.sen1.gui.plugin.prefusedot.DotNodeRenderer; 010 import prefuse.Constants; 011 import prefuse.Display; 012 import prefuse.Visualization; 013 import prefuse.action.ActionList; 014 import prefuse.action.RepaintAction; 015 import prefuse.action.assignment.ColorAction; 016 import prefuse.action.assignment.FontAction; 017 import prefuse.action.layout.Layout; 018 import prefuse.controls.DragControl; 019 import prefuse.controls.FocusControl; 020 import prefuse.controls.PanControl; 021 import prefuse.controls.WheelZoomControl; 022 import prefuse.controls.ZoomControl; 023 import prefuse.data.Graph; 024 import prefuse.data.Schema; 025 import prefuse.render.AbstractShapeRenderer; 026 import prefuse.render.DefaultRendererFactory; 027 import prefuse.render.EdgeRenderer; 028 import prefuse.render.LabelRenderer; 029 import prefuse.util.ColorLib; 030 import prefuse.util.FontLib; 031 import prefuse.util.PrefuseLib; 032 import prefuse.visual.VisualItem; 033 import prefuse.visual.expression.InGroupPredicate; 034 035 /** 036 * Builder to create a display (formatting, colors and layout) for a graph. 037 * 038 * @author A. Belgraver 039 * @author Anton Gerdessen (reviewer) 040 * @author Jurgen Vinju 041 * @date 07-3-2007 042 */ 043 public class GraphDisplayBuilder { 044 private DotNodeLayout dotLayout; 045 046 private static final Schema LABEL_SCHEMA = PrefuseLib.getVisualItemSchema(); 047 { 048 LABEL_SCHEMA.setDefault(VisualItem.INTERACTIVE, false); 049 LABEL_SCHEMA.setDefault(VisualItem.TEXTCOLOR, ColorLib.gray(100)); 050 LABEL_SCHEMA.setDefault(VisualItem.FONT, FontLib.getFont("Tahoma", 16)); 051 } 052 053 /** 054 * Main method for the graph creation. 055 * 056 * @param graph the graph to be displayed. 057 * @return 058 * @author A. Belgraver 059 * @author Anton Gerdessen (reviewer) 060 * @date 07-3-2007 061 */ 062 public Display createDisplayFromGraph(Graph graph){ 063 064 // Setup the visualization type and renderer 065 Visualization vis = new Visualization(); 066 vis.addGraph(GraphConstants.GRAPH, graph); 067 vis.addDecorators(GraphConstants.LABELS, GraphConstants.NODES); 068 069 DefaultRendererFactory drf = new DefaultRendererFactory(); 070 071 LabelRenderer lr = new LabelRenderer(GraphConstants.LABEL); 072 lr.setHorizontalTextAlignment(Constants.CENTER); 073 lr.setVerticalTextAlignment(Constants.CENTER); 074 lr.setRenderType(LabelRenderer.RENDER_TYPE_NONE); 075 drf.add(new InGroupPredicate(GraphConstants.LABELS), lr); 076 077 DotNodeRenderer nr = new DotNodeRenderer(); 078 nr.setRenderType(AbstractShapeRenderer.RENDER_TYPE_DRAW_AND_FILL); 079 drf.add(new InGroupPredicate(GraphConstants.NODES), nr); 080 081 EdgeRenderer er = new DotEdgeRenderer(Constants.EDGE_TYPE_LINE, Constants.EDGE_ARROW_FORWARD); 082 drf.add(new InGroupPredicate(GraphConstants.EDGES), er); 083 084 vis.setRendererFactory(drf); 085 086 // Create an actions avaible for the graph. 087 ActionList layout = new ActionList(); 088 dotLayout = new DotNodeLayout(GraphConstants.GRAPH); 089 layout.add(dotLayout); 090 Layout labelLayout = new DotLabelLayout(GraphConstants.LABELS); 091 layout.add(labelLayout); 092 layout.add(new RepaintAction()); 093 vis.putAction(GraphConstants.LAYOUT, layout); 094 vis.putAction(GraphConstants.LABELLAYOUT, labelLayout); 095 096 vis.setInteractive(GraphConstants.LABELS, null, false); 097 098 // Add the actions available for this graph. 099 ActionList colors = createColorActions(); 100 vis.putAction(GraphConstants.COLOR, colors); 101 102 // Setup the display in which to display the graph 103 Display display = createDisplay(vis); 104 105 // Start the graph. 106 vis.run(GraphConstants.COLOR); 107 vis.run(GraphConstants.LAYOUT); 108 109 return display; 110 } 111 112 /** 113 * Set the color for the nodes, if no color is set they will be black and white. 114 * 115 * @return ActionList holding needed color actions. 116 * @author A. Belgraver 117 * @author Anton Gerdessen (reviewer) 118 * @date 07-3-2007 119 */ 120 private ActionList createColorActions() { 121 // Text options. 122 ColorAction text = new ColorAction(GraphConstants.LABELS, VisualItem.TEXTCOLOR, 123 ColorLib.gray(0)); 124 text.setDefaultColor(GraphConstants.TEXTCOLOR); 125 FontAction nFont = new FontAction(GraphConstants.LABELS, GraphConstants.NODE_FONT); 126 127 // Outer line color. 128 ColorAction nStroke = new ColorAction(GraphConstants.NODES, 129 VisualItem.STROKECOLOR); 130 nStroke.setDefaultColor(GraphConstants.NODE_LINECOLOR); 131 132 // Fill color. 133 ColorAction nFill = new ColorAction(GraphConstants.NODES, VisualItem.FILLCOLOR); 134 nFill.setDefaultColor(GraphConstants.NODE_FILLCOLOR); 135 136 // Edge lines and heads. 137 ColorAction nEdges = new ColorAction(GraphConstants.EDGES, VisualItem.STROKECOLOR); 138 nEdges.setDefaultColor(GraphConstants.ARROWCOLOR); 139 ColorAction nHeads = new ColorAction(GraphConstants.EDGES, VisualItem.FILLCOLOR); 140 nHeads.setDefaultColor(GraphConstants.ARROWCOLOR); 141 142 // Bundle the color actions in an actionlist. 143 ActionList colors = new ActionList(); 144 colors.add(nFont); 145 colors.add(nStroke); 146 colors.add(nFill); 147 colors.add(nEdges); 148 colors.add(nHeads); 149 colors.add(text); 150 colors.add(new RepaintAction()); 151 152 return colors; 153 } 154 155 /** 156 * Create and configure the visualization display. 157 * 158 * @param vis The visualisation to display 159 * @return A configured display object 160 * @author A. Belgraver 161 * @author Anton Gerdessen (reviewer) 162 * @date 07-3-2007 163 */ 164 private Display createDisplay(Visualization vis) { 165 Display d = new Display(vis); 166 167 // Anti aliasing on 168 d.setHighQuality(true); 169 170 // Allow manipulation of those nodes while visible in the panel 171 d.addControlListener(new FocusControl()); 172 d.addControlListener(new DragControl() { 173 public void itemDragged(VisualItem item, MouseEvent e) { 174 super.itemDragged(item, e); 175 // This is a bit sluggish, because it relayouts all labels instead of just 176 // the one that has moved 177 item.getVisualization().run(GraphConstants.LABELLAYOUT); 178 } 179 }); 180 d.addControlListener(new PanControl()); 181 182 // Allowing zooming in the panel. 183 d.addControlListener(new ZoomControl()); 184 d.addControlListener(new WheelZoomControl()); 185 186 return d; 187 } 188 }