1 /* ====================================================================
2 * The Apache Software License, Version 1.1
3 *
4 * Copyright (c) 2000 The Apache Software Foundation. All rights
5 * reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 *
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in
16 * the documentation and/or other materials provided with the
17 * distribution.
18 *
19 * 3. The end-user documentation included with the redistribution,
20 * if any, must include the following acknowledgment:
21 * "This product includes software developed by the
22 * Apache Software Foundation (http://www.apache.org/)."
23 * Alternately, this acknowledgment may appear in the software itself,
24 * if and wherever such third-party acknowledgments normally appear.
25 *
26 * 4. The names "Apache" and "Apache Software Foundation" must
27 * not be used to endorse or promote products derived from this
28 * software without prior written permission. For written
29 * permission, please contact apache@apache.org.
30 *
31 * 5. Products derived from this software may not be called "Apache",
32 * nor may "Apache" appear in their name, without prior written
33 * permission of the Apache Software Foundation.
34 *
35 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
36 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
37 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
38 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
39 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
41 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
42 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
43 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
44 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
45 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
46 * SUCH DAMAGE.
47 * ====================================================================
48 *
49 * This software consists of voluntary contributions made by many
50 * individuals on behalf of the Apache Software Foundation. For more
51 * information on the Apache Software Foundation, please see
52 * <http://www.apache.org/>.
53 *
54 * Portions of this software are based upon public domain software
55 * originally written at the National Center for Supercomputing Applications,
56 * University of Illinois, Urbana-Champaign.
57 */
58 package com.bonevich.eclipse.cvsgrapher.editors;
59
60 import com.bonevich.eclipse.cvsgrapher.model.*;
61
62 import org.eclipse.draw2d.FreeformLayout;
63 import org.eclipse.draw2d.IFigure;
64 import org.eclipse.draw2d.geometry.Dimension;
65 import org.eclipse.draw2d.geometry.Point;
66 import org.eclipse.gef.GraphicalEditPart;
67
68 import java.util.Iterator;
69
70 /***
71 * The layout manager for the CVS Graph Editor. Basically it is a <code>FreeformLayout</code>
72 * but with an initializing routine to layout the tree. Also allows the layout to
73 * be reset ("snap" back to original layout).
74 *
75 * @author jbonevic
76 */
77 public final class CvsGraphLayout extends FreeformLayout
78 {
79 private final CvsGraphModel _model;
80 private final CvsGraphEditPart _editPart;
81
82 private static final int BEGIN_X = 10;
83 private static final int BEGIN_Y = 10;
84 private static final int OFFSET_X = 40;
85 private static final int OFFSET_Y = 40;
86
87 private volatile boolean _initialized = false;
88
89 public CvsGraphLayout(CvsGraphEditPart editPart)
90 {
91 _editPart = editPart;
92 _model = (CvsGraphModel) editPart.getModel();
93 }
94
95 /***
96 * Rules for layout of CVS graph:
97 * <ul>
98 * <li>Rule 1: Root node must be branch node ("MAIN")</li>
99 * <li>Rule 2: Any node may have at most one child version node</li>
100 * <li>Rule 3: Any version node may have any number of child nodes (i.e. one version, n branches)</li>
101 * </ul>
102 */
103 private void initializeLayout()
104 {
105 // Rule 1
106 CvsGraphBranchModel root = _model.getRootBranch();
107 traverseTree(root, BEGIN_X, BEGIN_Y);
108
109 setInitialized(true);
110 }
111
112 private int traverseTree(ICvsGraphNodeModel entry, int x, int y)
113 {
114 ICvsGraphNodeEditPart part = (ICvsGraphNodeEditPart) getEditPartForModel(entry);
115 CvsGraphNodeViewHelper view = part.getViewHelper();
116 Point entryLocation = new Point(x, y);
117 view.setLocation(entryLocation);
118
119 Dimension size = part.getFigure().getPreferredSize(-1,-1);
120 int width = size.width;
121 int height = size. height;
122 int nextY = y + height + OFFSET_Y;
123
124 int nextX = x;
125 int childNodesWidth = 0;
126
127 // Rule 2 and 3
128 Iterator children = entry.getChildNodes().iterator();
129 while (children.hasNext())
130 {
131 ICvsGraphNodeModel child = (ICvsGraphNodeModel) children.next();
132 childNodesWidth += traverseTree(child, nextX, nextY);
133 if (children.hasNext())
134 {
135 childNodesWidth += OFFSET_X;
136 nextX = x + childNodesWidth;
137 }
138 }
139
140 int subTreeWidth = Math.max(childNodesWidth, width);
141 int shiftX = (subTreeWidth - width) / 2;
142 Point adjustedLocation = entryLocation.translate(shiftX, 0);
143 view.setLocation(adjustedLocation);
144
145 return subTreeWidth;
146 }
147
148 private GraphicalEditPart getEditPartForModel(ICvsGraphNodeModel model)
149 {
150 return (GraphicalEditPart) _editPart.getRoot().getViewer().getEditPartRegistry().get(model);
151 }
152
153 /***
154 * @see org.eclipse.draw2d.LayoutManager#layout(org.eclipse.draw2d.IFigure)
155 */
156 public void layout(IFigure parent)
157 {
158 super.layout(parent);
159 if (!isInitialized())
160 {
161 initializeLayout();
162 }
163 }
164
165 public void reset()
166 {
167 initializeLayout();
168 }
169
170 private synchronized boolean isInitialized()
171 {
172 return _initialized;
173 }
174
175 private synchronized void setInitialized(boolean initialized)
176 {
177 _initialized = initialized;
178 }
179
180 }
This page was automatically generated by Maven