1   /****************************************************************************
2    * This demo file is part of yFiles for Java 2.14.
3    * Copyright (c) 2000-2017 by yWorks GmbH, Vor dem Kreuzberg 28,
4    * 72070 Tuebingen, Germany. All rights reserved.
5    * 
6    * yFiles demo files exhibit yFiles for Java functionalities. Any redistribution
7    * of demo files in source code or binary form, with or without
8    * modification, is not permitted.
9    * 
10   * Owners of a valid software license for a yFiles for Java version that this
11   * demo is shipped with are allowed to use the demo source code as basis
12   * for their own yFiles for Java powered applications. Use of such programs is
13   * governed by the rights and conditions as set out in the yFiles for Java
14   * license agreement.
15   * 
16   * THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESS OR IMPLIED
17   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18   * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
19   * NO EVENT SHALL yWorks BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
21   * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22   * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23   * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24   * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25   * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26   *
27   ***************************************************************************/
28  package demo.layout.multipage;
29  
30  import y.layout.multipage.MultiPageLayouter;
31  import y.option.ConstraintManager;
32  import y.option.OptionHandler;
33  import y.option.OptionItem;
34  
35  import java.beans.PropertyChangeListener;
36  
37  /**
38   * Provides settings for multi-page layout.
39   */
40  class MultiPageLayoutOptionHandler extends OptionHandler {
41    private static final String LAYOUT = "Page Layout";
42    static final String LAYOUT_ORGANIC = "Organic";
43    static final String LAYOUT_HIERARCHIC = "Hierarchic";
44    static final String LAYOUT_ORTHOGONAL = "Orthogonal";
45    static final String LAYOUT_COMPACT_ORTHOGONAL = "Compact Orthogonal";
46    static final String LAYOUT_CIRCULAR = "Circular";
47  
48    private static final String GROUPING = "Grouping";
49    private static final String GROUPING_IGNORE_GROUPS = "Ignore Groups";
50    private static final String GROUPING_ONLY_COMMON_NODES = "Common Nodes Only";
51    private static final String GROUPING_INCLUDE_CONNECTORS = "Include Connectors";
52  
53    private static final String SEPARATE_MULTIEDGES = "Separate Multi-edges";
54    private static final String SEPARATE_TYPES = "Separate Types";
55    private static final String SEPARATE_DIRECTION = "Separate Direction";
56  
57    private static final String MAXIMUM_WIDTH = "Maximum Width";
58    private static final String MAXIMUM_HEIGHT = "Maximum Height";
59    private static final String SINGLE_PAGE_LAYOUT = "Single Page Layout";
60    private static final String MAXIMAL_DURATION = "Max. Duration (sec)";
61    private static final String DRAW_PAGE = "Draw Page";
62  
63  
64    static final OptionSet OPTIONS_NETWORK_SMALL_DISPLAY;
65    static final OptionSet OPTIONS_NETWORK_LARGE_DISPLAY;
66    static final OptionSet OPTIONS_CLASS_DIAGRAM_SMALL_DISPLAY;
67    static final OptionSet OPTIONS_CLASS_DIAGRAM_LARGE_DISPLAY;
68    static {
69      {
70        final OptionSet setting = new OptionSet("Network on small display");
71        setting.setLayoutStyle(MultiPageLayoutOptionHandler.LAYOUT_ORGANIC);
72        setting.setMaximumHeight(800);
73        setting.setMaximumWidth(500);
74        OPTIONS_NETWORK_SMALL_DISPLAY = setting;
75      }
76      {
77        final OptionSet setting = new OptionSet("Network on large display");
78        setting.setLayoutStyle(MultiPageLayoutOptionHandler.LAYOUT_ORGANIC);
79        setting.setMaximumHeight(2000);
80        setting.setMaximumWidth(2000);
81        OPTIONS_NETWORK_LARGE_DISPLAY = setting;
82      }
83      {
84        final OptionSet setting = new OptionSet("Class diagram on small display");
85        setting.setLayoutStyle(MultiPageLayoutOptionHandler.LAYOUT_HIERARCHIC);
86        setting.setMaximumHeight(800);
87        setting.setMaximumWidth(500);
88        OPTIONS_CLASS_DIAGRAM_SMALL_DISPLAY = setting;
89      }
90      {
91        final OptionSet setting = new OptionSet("Class diagram on large display");
92        setting.setLayoutStyle(MultiPageLayoutOptionHandler.LAYOUT_HIERARCHIC);
93        setting.setMaximumHeight(2000);
94        setting.setMaximumWidth(2000);
95        OPTIONS_CLASS_DIAGRAM_LARGE_DISPLAY = setting;
96      }
97    }
98  
99  
100   MultiPageLayoutOptionHandler() {
101     super("Option Table");
102 
103     useSection("General");
104     final Object[] layoutStyles = {
105             LAYOUT_HIERARCHIC,
106             LAYOUT_ORGANIC,
107             LAYOUT_COMPACT_ORTHOGONAL,
108             LAYOUT_ORTHOGONAL,
109             LAYOUT_CIRCULAR
110     };
111     addEnum(LAYOUT, layoutStyles, 0);
112     final OptionItem singleLayoutItem = addBool(SINGLE_PAGE_LAYOUT, false);
113     final ConstraintManager cm = new ConstraintManager(this);
114     final ConstraintManager.Condition pageLayoutCondition =
115             cm.createConditionValueEquals(singleLayoutItem, Boolean.FALSE);
116     final Object[] groupingModes = {
117             GROUPING_IGNORE_GROUPS,
118             GROUPING_ONLY_COMMON_NODES,
119             GROUPING_INCLUDE_CONNECTORS
120     };
121     final OptionItem groupStyleItem = addEnum(GROUPING, groupingModes, 2);
122     cm.setEnabledOnCondition(pageLayoutCondition, groupStyleItem);
123 
124     //restricting the maximum page size to at most 4000x4000 because
125     //multi-page layout calculation time increases greatly when the maximum
126     //page size grows    
127     final OptionItem maxWidthItem = addInt(MAXIMUM_WIDTH, 600, 200, 4000);
128     cm.setEnabledOnCondition(pageLayoutCondition, maxWidthItem);
129     final OptionItem maxHeightItem = addInt(MAXIMUM_HEIGHT, 600, 200, 4000);
130     cm.setEnabledOnCondition(pageLayoutCondition, maxHeightItem);
131 
132     final OptionItem maxDurationItem = addInt(MAXIMAL_DURATION, 30, 5, 5000);
133     cm.setEnabledOnCondition(pageLayoutCondition, maxDurationItem);
134     final OptionItem drawPageItem = addBool(DRAW_PAGE, true);
135     cm.setEnabledOnCondition(pageLayoutCondition, drawPageItem);
136 
137     useSection("Connector Representation");
138     final OptionItem separateTypesItem = addBool(SEPARATE_TYPES, false);
139     cm.setEnabledOnCondition(pageLayoutCondition, separateTypesItem);
140     final OptionItem separateDirectionItem = addBool(SEPARATE_DIRECTION, false);
141     cm.setEnabledOnCondition(pageLayoutCondition, separateDirectionItem);
142     final OptionItem separateMultiedgesItem = addBool(SEPARATE_MULTIEDGES, false);
143     cm.setEnabledOnCondition(pageLayoutCondition, separateMultiedgesItem);
144   }
145 
146   boolean isLayout(final String layout) {
147     return getString(LAYOUT).equals(layout);
148   }
149 
150   int getSeparationMask() {
151     int mask = 0;
152     if (getBool(SEPARATE_TYPES)) {
153       mask = mask | MultiPageLayouter.EDGE_BUNDLE_DISTINGUISH_TYPES;
154     }
155     if (getBool(SEPARATE_DIRECTION)) {
156       mask = mask | MultiPageLayouter.EDGE_BUNDLE_DISTINGUISH_DIRECTIONS;
157     }
158     if (getBool(SEPARATE_MULTIEDGES)) {
159       mask = mask | MultiPageLayouter.EDGE_BUNDLE_DISTINGUISH_MULTIEDGES;
160     }
161     return mask;
162   }
163 
164   boolean isDrawingPage() {
165     return getBool(DRAW_PAGE) && !getBool(SINGLE_PAGE_LAYOUT);
166   }
167 
168   boolean isUseSinglePageLayout() {
169     return getBool(SINGLE_PAGE_LAYOUT);
170   }
171 
172   byte getGroupingMode() {
173     if (getString(GROUPING).equals(GROUPING_IGNORE_GROUPS)) {
174       return MultiPageLayouter.GROUP_MODE_IGNORE;
175     } else if(getString(GROUPING).equals(GROUPING_ONLY_COMMON_NODES)) {
176       return MultiPageLayouter.GROUP_MODE_ORIGINAL_NODES_ONLY;
177     } else {
178       return MultiPageLayouter.GROUP_MODE_ALL_NODES;
179     }
180   }
181 
182   long getMaximalDuration() {
183     return getInt(MAXIMAL_DURATION);
184   }
185 
186   int getMaximumWidth() {
187     return getInt(MAXIMUM_WIDTH);
188   }
189 
190   int getMaximumHeight() {
191     return getInt(MAXIMUM_HEIGHT);
192   }
193 
194   void addDrawPageChangeListener( final PropertyChangeListener pcl ) {
195     final String property = OptionItem.PROPERTY_VALUE;
196     getItem(DRAW_PAGE).addPropertyChangeListener(property, pcl);
197     getItem(MAXIMUM_WIDTH).addPropertyChangeListener(property, pcl);
198     getItem(MAXIMUM_HEIGHT).addPropertyChangeListener(property, pcl);
199     getItem(SINGLE_PAGE_LAYOUT).addPropertyChangeListener(property, pcl);
200   }
201 
202 
203   /**
204    * Encapsulates a set of sample options for
205    * {@link MultiPageLayoutOptionHandler}.
206    */
207   static final class OptionSet {
208     private final String name;
209     private String layoutStyle;
210     private int maximumWidth;
211     private int maximumHeight;
212 
213     private OptionSet( final String name ) {
214       this.name = name;
215       layoutStyle = MultiPageLayoutOptionHandler.LAYOUT_HIERARCHIC;
216       maximumWidth = 1000;
217       maximumHeight = 1000;
218     }
219 
220     private void setLayoutStyle( final String layoutStyle ) {
221       this.layoutStyle = layoutStyle;
222     }
223 
224     private void setMaximumHeight( final int maximumHeight ) {
225       this.maximumHeight = maximumHeight;
226     }
227 
228     private void setMaximumWidth( final int maximumWidth ) {
229       this.maximumWidth = maximumWidth;
230     }
231 
232     void apply( final MultiPageLayoutOptionHandler oh ) {
233       oh.set(MultiPageLayoutOptionHandler.LAYOUT, layoutStyle);
234       oh.set(MultiPageLayoutOptionHandler.SINGLE_PAGE_LAYOUT, Boolean.FALSE);
235       oh.set(MultiPageLayoutOptionHandler.GROUPING, MultiPageLayoutOptionHandler.GROUPING_INCLUDE_CONNECTORS);
236       oh.set(MultiPageLayoutOptionHandler.MAXIMUM_WIDTH, new Integer(maximumWidth));
237       oh.set(MultiPageLayoutOptionHandler.MAXIMUM_HEIGHT, new Integer(maximumHeight));
238       oh.set(MultiPageLayoutOptionHandler.MAXIMAL_DURATION, new Integer(30));
239       oh.set(MultiPageLayoutOptionHandler.DRAW_PAGE, Boolean.TRUE);
240       oh.set(MultiPageLayoutOptionHandler.SEPARATE_TYPES, Boolean.FALSE);
241       oh.set(MultiPageLayoutOptionHandler.SEPARATE_DIRECTION, Boolean.FALSE);
242       oh.set(MultiPageLayoutOptionHandler.SEPARATE_MULTIEDGES, Boolean.FALSE);
243     }
244 
245     String getName() {
246       return name;
247     }
248   }
249 }
250