1   
28  package demo.io.graphml;
29  
30  import y.option.OptionHandler;
31  import y.view.Graph2D;
32  import y.view.NodeRealizer;
33  import y.view.SizeConstraintProvider;
34  import y.view.NodeLabel;
35  import y.base.NodeCursor;
36  import y.base.Node;
37  import y.geom.YDimension;
38  
39  import java.awt.font.FontRenderContext;
40  import java.awt.geom.AffineTransform;
41  
42  
46  public class NodeSizeAdapter extends y.module.YModule 
47  {
48    static final String MIN_WIDTH             = "MIN_WIDTH";
49    static final String IGNORE_WIDTHS         = "IGNORE_WIDTHS";
50    static final String ADAPT_TO_MAXIMUM_NODE = "ADAPT_TO_MAXIMUM_NODE";
51    static final String NODE_SIZE_ADAPTER     = "NODE_SIZE_ADAPTER";
52    static final String ONLY_SELECTION        = "ONLY_SELECTION";
53    static final String VERTICAL_SPACE        = "VERTICAL_SPACE";
54    static final String IGNORE_HEIGHTS        = "IGNORE_HEIGHTS";
55    static final String MIN_HEIGHT            = "MIN_HEIGHT";
56    static final String HORIZON_SPACE         = "HORIZON_SPACE";
57  
58    private int vSpace        = 5;
59    private int hSpace        = 5;
60    private int minWidth      = 10;
61    private int minHeight     = 30;
62    private boolean selectionOnly = false;
63    private boolean adaptToMax    = false;
64    private boolean ignoreHeight  = true;
65    private boolean ignoreWidth   = false;
66  
67    double currentMaxH = 0;
68    double currentMaxW = 0;
69  
70    public NodeSizeAdapter()
71    {
72      super(NodeSizeAdapter.NODE_SIZE_ADAPTER);
73    }
74  
75    protected OptionHandler createOptionHandler()
76    {
77      OptionHandler op = new OptionHandler(getModuleName());
78  
79      op.addInt(NodeSizeAdapter.VERTICAL_SPACE, vSpace, 1, 20);
80      op.addInt(NodeSizeAdapter.MIN_HEIGHT, minHeight, 5, 100 );
81      op.addBool(NodeSizeAdapter.IGNORE_HEIGHTS, ignoreHeight);
82      op.addInt(NodeSizeAdapter.HORIZON_SPACE, hSpace, 1, 20);
83      op.addInt(NodeSizeAdapter.MIN_WIDTH, minWidth, 5, 100 );
84      op.addBool(NodeSizeAdapter.IGNORE_WIDTHS, ignoreWidth);
85      op.addBool(NodeSizeAdapter.ADAPT_TO_MAXIMUM_NODE, adaptToMax);
86      op.addBool(NodeSizeAdapter.ONLY_SELECTION, false);
87  
88      return op;
89    }
90  
91    protected void init()
92    {
93      OptionHandler op = getOptionHandler();
94  
95      vSpace = op.getInt(NodeSizeAdapter.VERTICAL_SPACE);
96      minHeight = op.getInt(NodeSizeAdapter.MIN_HEIGHT);
97      ignoreHeight = op.getBool(NodeSizeAdapter.IGNORE_HEIGHTS);
98      hSpace = op.getInt(NodeSizeAdapter.HORIZON_SPACE);
99      minWidth = op.getInt(NodeSizeAdapter.MIN_WIDTH);
100     ignoreWidth = op.getBool(NodeSizeAdapter.IGNORE_WIDTHS);
101     adaptToMax = op.getBool(NodeSizeAdapter.ADAPT_TO_MAXIMUM_NODE);
102     selectionOnly = op.getBool(NodeSizeAdapter.ONLY_SELECTION);
103   }
104 
105   protected void mainrun()
106   {
107     Graph2D graph = getGraph2D();
108     NodeCursor nc;
109     if( selectionOnly )                     nc = graph.selectedNodes();
111     else                                    nc = graph.nodes();
113     adapt(nc,adaptToMax);
114     getGraph2D().updateViews();
115   }
116 
117   public void adaptMax()
118   {
119     Graph2D graph = getGraph2D();
120 
121     NodeCursor nc;
122     if( selectionOnly )                     nc = graph.selectedNodes();
124     else                                    nc = graph.nodes();
126     for( ; nc.ok(); nc.next() )
127     {
128       NodeRealizer nr = graph.getRealizer(nc.node());
129       if( !ignoreHeight )
130         nr.setHeight( currentMaxH );
131       if( !ignoreWidth )
132         nr.setWidth( currentMaxW );
133     }
134   }
135 
136     
140   public void adapt(NodeCursor nc,boolean adaptToMax)
141   {
142     currentMaxW = currentMaxH = 0;
143     for (;nc.ok();nc.next())
144     {
145       adapt(nc.node());
146     }
147     if( adaptToMax )
148       adaptMax();
149   }
150 
151   static FontRenderContext defaultFRC =
152     new FontRenderContext(new AffineTransform(),false,false);
153 
154     
158   public void adapt(Node n)
159   {
160     NodeRealizer nr = getGraph2D().getRealizer(n);
161     adapt(nr);
162   }
163 
164 
165   
168   public void adapt(NodeRealizer nr) {
169     double minWidth = this.minWidth;
170     double minHeight = this.minHeight;
171     double maxWidth = Double.POSITIVE_INFINITY;
172     double maxHeight = Double.POSITIVE_INFINITY;
173     final SizeConstraintProvider scp = nr.getSizeConstraintProvider();
174     if (scp != null) {
175       final YDimension min = scp.getMinimumSize();
176       if (min != null) {
177         if (minWidth < min.width) {
178           minWidth = min.width;
179         }
180         if (minHeight < min.height) {
181           minHeight = min.height;
182         }
183       }
184       final YDimension max = scp.getMaximumSize();
185       if (max != null) {
186         maxWidth = max.width;
187         maxHeight = max.height;
188       }
189     }
190 
191     final NodeLabel nl = nr.getLabel();
192 
193     if (!ignoreWidth) {
194       double width = nl.getWidth() + 2 * hSpace;
195       if (width < minWidth) {
196         width = minWidth;
197       }
198       if (width > maxWidth) {
199         width = maxWidth;
200       }
201       nr.setWidth(width);
202       if (width > currentMaxW) {
203         currentMaxW = width;
204       }
205     }
206     if (!ignoreHeight) {
207       double height = nl.getHeight() + 2 * vSpace;
208       if (height < minHeight) {
209         height = minHeight;
210       }
211       if (height > maxHeight) {
212         height = maxHeight;
213       }
214       nr.setHeight(height);
215       if (height > currentMaxH) {
216         currentMaxH = height;
217       }
218     }
219   }
220 
221     public void setIgnore(boolean width,boolean height)
223   {
224     ignoreHeight = height;
225     ignoreWidth = width;
226   }
227 
228 }
229