1   /****************************************************************************
2    **
3    ** This file is part of yFiles-2.9. 
4    ** 
5    ** yWorks proprietary/confidential. Use is subject to license terms.
6    **
7    ** Redistribution of this file or of an unauthorized byte-code version
8    ** of this file is strictly forbidden.
9    **
10   ** Copyright (c) 2000-2011 by yWorks GmbH, Vor dem Kreuzberg 28, 
11   ** 72070 Tuebingen, Germany. All rights reserved.
12   **
13   ***************************************************************************/
14  package demo.layout.multipage;
15  
16  import y.layout.multipage.MultiPageLayouter;
17  import y.option.ConstraintManager;
18  import y.option.OptionHandler;
19  import y.option.OptionItem;
20  
21  import java.beans.PropertyChangeListener;
22  
23  /**
24   * Provides settings for multi-page layout.
25   */
26  class MultiPageLayoutOptionHandler extends OptionHandler {
27    private static final String LAYOUT = "Page Layout";
28    static final String LAYOUT_ORGANIC = "Organic";
29    static final String LAYOUT_HIERARCHIC = "Hierarchic";
30    static final String LAYOUT_ORTHOGONAL = "Orthogonal";
31    static final String LAYOUT_COMPACT_ORTHOGONAL = "Compact Orthogonal";
32    static final String LAYOUT_CIRCULAR = "Circular";
33  
34    private static final String GROUPING = "Grouping";
35    private static final String GROUPING_IGNORE_GROUPS = "Ignore Groups";
36    private static final String GROUPING_ONLY_COMMON_NODES = "Common Nodes Only";
37    private static final String GROUPING_INCLUDE_CONNECTORS = "Include Connectors";
38  
39    private static final String SEPARATE_MULTIEDGES = "Separate Multi-edges";
40    private static final String SEPARATE_TYPES = "Separate Types";
41    private static final String SEPARATE_DIRECTION = "Separate Direction";
42  
43    private static final String MAXIMUM_WIDTH = "Maximum Width";
44    private static final String MAXIMUM_HEIGHT = "Maximum Height";
45    private static final String SINGLE_PAGE_LAYOUT = "Single Page Layout";
46    private static final String MAXIMAL_DURATION = "Max. Duration (sec)";
47    private static final String DRAW_PAGE = "Draw Page";
48  
49  
50    static final OptionSet OPTIONS_NETWORK_SMALL_DISPLAY;
51    static final OptionSet OPTIONS_NETWORK_LARGE_DISPLAY;
52    static final OptionSet OPTIONS_CLASS_DIAGRAM_SMALL_DISPLAY;
53    static final OptionSet OPTIONS_CLASS_DIAGRAM_LARGE_DISPLAY;
54    static {
55      {
56        final OptionSet setting = new OptionSet("Network on small display");
57        setting.setLayoutStyle(MultiPageLayoutOptionHandler.LAYOUT_ORGANIC);
58        setting.setMaximumHeight(800);
59        setting.setMaximumWidth(500);
60        OPTIONS_NETWORK_SMALL_DISPLAY = setting;
61      }
62      {
63        final OptionSet setting = new OptionSet("Network on large display");
64        setting.setLayoutStyle(MultiPageLayoutOptionHandler.LAYOUT_ORGANIC);
65        setting.setMaximumHeight(2000);
66        setting.setMaximumWidth(2000);
67        OPTIONS_NETWORK_LARGE_DISPLAY = setting;
68      }
69      {
70        final OptionSet setting = new OptionSet("Class diagram on small display");
71        setting.setLayoutStyle(MultiPageLayoutOptionHandler.LAYOUT_HIERARCHIC);
72        setting.setMaximumHeight(800);
73        setting.setMaximumWidth(500);
74        OPTIONS_CLASS_DIAGRAM_SMALL_DISPLAY = setting;
75      }
76      {
77        final OptionSet setting = new OptionSet("Class diagram on large display");
78        setting.setLayoutStyle(MultiPageLayoutOptionHandler.LAYOUT_HIERARCHIC);
79        setting.setMaximumHeight(2000);
80        setting.setMaximumWidth(2000);
81        OPTIONS_CLASS_DIAGRAM_LARGE_DISPLAY = setting;
82      }
83    }
84  
85  
86    MultiPageLayoutOptionHandler() {
87      super("Option Table");
88  
89      useSection("General");
90      final Object[] layoutStyles = {
91              LAYOUT_HIERARCHIC,
92              LAYOUT_ORGANIC,
93              LAYOUT_COMPACT_ORTHOGONAL,
94              LAYOUT_ORTHOGONAL,
95              LAYOUT_CIRCULAR
96      };
97      addEnum(LAYOUT, layoutStyles, 0);
98      final OptionItem singleLayoutItem = addBool(SINGLE_PAGE_LAYOUT, false);
99      final ConstraintManager cm = new ConstraintManager(this);
100     final ConstraintManager.Condition pageLayoutCondition =
101             cm.createConditionValueEquals(singleLayoutItem, Boolean.FALSE);
102     final Object[] groupingModes = {
103             GROUPING_IGNORE_GROUPS,
104             GROUPING_ONLY_COMMON_NODES,
105             GROUPING_INCLUDE_CONNECTORS
106     };
107     final OptionItem groupStyleItem = addEnum(GROUPING, groupingModes, 2);
108     cm.setEnabledOnCondition(pageLayoutCondition, groupStyleItem);
109 
110     //restricting the maximum page size to at most 4000x4000 because
111     //multi-page layout calculation time increases greatly when the maximum
112     //page size grows    
113     final OptionItem maxWidthItem = addInt(MAXIMUM_WIDTH, 600, 200, 4000);
114     cm.setEnabledOnCondition(pageLayoutCondition, maxWidthItem);
115     final OptionItem maxHeightItem = addInt(MAXIMUM_HEIGHT, 600, 200, 4000);
116     cm.setEnabledOnCondition(pageLayoutCondition, maxHeightItem);
117 
118     final OptionItem maxDurationItem = addInt(MAXIMAL_DURATION, 30, 5, 5000);
119     cm.setEnabledOnCondition(pageLayoutCondition, maxDurationItem);
120     final OptionItem drawPageItem = addBool(DRAW_PAGE, true);
121     cm.setEnabledOnCondition(pageLayoutCondition, drawPageItem);
122 
123     useSection("Connector Representation");
124     final OptionItem separateTypesItem = addBool(SEPARATE_TYPES, false);
125     cm.setEnabledOnCondition(pageLayoutCondition, separateTypesItem);
126     final OptionItem separateDirectionItem = addBool(SEPARATE_DIRECTION, false);
127     cm.setEnabledOnCondition(pageLayoutCondition, separateDirectionItem);
128     final OptionItem separateMultiedgesItem = addBool(SEPARATE_MULTIEDGES, false);
129     cm.setEnabledOnCondition(pageLayoutCondition, separateMultiedgesItem);
130   }
131 
132   boolean isLayout(final String layout) {
133     return getString(LAYOUT).equals(layout);
134   }
135 
136   int getSeparationMask() {
137     int mask = 0;
138     if (getBool(SEPARATE_TYPES)) {
139       mask = mask | MultiPageLayouter.EDGE_BUNDLE_DISTINGUISH_TYPES;
140     }
141     if (getBool(SEPARATE_DIRECTION)) {
142       mask = mask | MultiPageLayouter.EDGE_BUNDLE_DISTINGUISH_DIRECTIONS;
143     }
144     if (getBool(SEPARATE_MULTIEDGES)) {
145       mask = mask | MultiPageLayouter.EDGE_BUNDLE_DISTINGUISH_MULTIEDGES;
146     }
147     return mask;
148   }
149 
150   boolean isDrawingPage() {
151     return getBool(DRAW_PAGE) && !getBool(SINGLE_PAGE_LAYOUT);
152   }
153 
154   boolean isUseSinglePageLayout() {
155     return getBool(SINGLE_PAGE_LAYOUT);
156   }
157 
158   byte getGroupingMode() {
159     if (getString(GROUPING).equals(GROUPING_IGNORE_GROUPS)) {
160       return MultiPageLayouter.GROUP_MODE_IGNORE;
161     } else if(getString(GROUPING).equals(GROUPING_ONLY_COMMON_NODES)) {
162       return MultiPageLayouter.GROUP_MODE_ORIGINAL_NODES_ONLY;
163     } else {
164       return MultiPageLayouter.GROUP_MODE_ALL_NODES;
165     }
166   }
167 
168   long getMaximalDuration() {
169     return getInt(MAXIMAL_DURATION);
170   }
171 
172   int getMaximumWidth() {
173     return getInt(MAXIMUM_WIDTH);
174   }
175 
176   int getMaximumHeight() {
177     return getInt(MAXIMUM_HEIGHT);
178   }
179 
180   void addDrawPageChangeListener( final PropertyChangeListener pcl ) {
181     final String property = OptionItem.PROPERTY_VALUE;
182     getItem(DRAW_PAGE).addPropertyChangeListener(property, pcl);
183     getItem(MAXIMUM_WIDTH).addPropertyChangeListener(property, pcl);
184     getItem(MAXIMUM_HEIGHT).addPropertyChangeListener(property, pcl);
185     getItem(SINGLE_PAGE_LAYOUT).addPropertyChangeListener(property, pcl);
186   }
187 
188 
189   /**
190    * Encapsulates a set of sample options for
191    * {@link MultiPageLayoutOptionHandler}.
192    */
193   static final class OptionSet {
194     private final String name;
195     private String layoutStyle;
196     private int maximumWidth;
197     private int maximumHeight;
198 
199     private OptionSet( final String name ) {
200       this.name = name;
201       layoutStyle = MultiPageLayoutOptionHandler.LAYOUT_HIERARCHIC;
202       maximumWidth = 1000;
203       maximumHeight = 1000;
204     }
205 
206     private void setLayoutStyle( final String layoutStyle ) {
207       this.layoutStyle = layoutStyle;
208     }
209 
210     private void setMaximumHeight( final int maximumHeight ) {
211       this.maximumHeight = maximumHeight;
212     }
213 
214     private void setMaximumWidth( final int maximumWidth ) {
215       this.maximumWidth = maximumWidth;
216     }
217 
218     void apply( final MultiPageLayoutOptionHandler oh ) {
219       oh.set(MultiPageLayoutOptionHandler.LAYOUT, layoutStyle);
220       oh.set(MultiPageLayoutOptionHandler.SINGLE_PAGE_LAYOUT, Boolean.FALSE);
221       oh.set(MultiPageLayoutOptionHandler.GROUPING, MultiPageLayoutOptionHandler.GROUPING_INCLUDE_CONNECTORS);
222       oh.set(MultiPageLayoutOptionHandler.MAXIMUM_WIDTH, new Integer(maximumWidth));
223       oh.set(MultiPageLayoutOptionHandler.MAXIMUM_HEIGHT, new Integer(maximumHeight));
224       oh.set(MultiPageLayoutOptionHandler.MAXIMAL_DURATION, new Integer(30));
225       oh.set(MultiPageLayoutOptionHandler.DRAW_PAGE, Boolean.TRUE);
226       oh.set(MultiPageLayoutOptionHandler.SEPARATE_TYPES, Boolean.FALSE);
227       oh.set(MultiPageLayoutOptionHandler.SEPARATE_DIRECTION, Boolean.FALSE);
228       oh.set(MultiPageLayoutOptionHandler.SEPARATE_MULTIEDGES, Boolean.FALSE);
229     }
230 
231     String getName() {
232       return name;
233     }
234   }
235 }
236