001: /*
002: The contents of this file are subject to the Common Public Attribution License
003: Version 1.0 (the "License"); you may not use this file except in compliance with
004: the License. You may obtain a copy of the License at
005: http://www.projity.com/license . The License is based on the Mozilla Public
006: License Version 1.1 but Sections 14 and 15 have been added to cover use of
007: software over a computer network and provide for limited attribution for the
008: Original Developer. In addition, Exhibit A has been modified to be consistent
009: with Exhibit B.
010:
011: Software distributed under the License is distributed on an "AS IS" basis,
012: WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the
013: specific language governing rights and limitations under the License. The
014: Original Code is OpenProj. The Original Developer is the Initial Developer and
015: is Projity, Inc. All portions of the code written by Projity are Copyright (c)
016: 2006, 2007. All Rights Reserved. Contributors Projity, Inc.
017:
018: Alternatively, the contents of this file may be used under the terms of the
019: Projity End-User License Agreeement (the Projity License), in which case the
020: provisions of the Projity License are applicable instead of those above. If you
021: wish to allow use of your version of this file only under the terms of the
022: Projity License and not to allow others to use your version of this file under
023: the CPAL, indicate your decision by deleting the provisions above and replace
024: them with the notice and other provisions required by the Projity License. If
025: you do not delete the provisions above, a recipient may use your version of this
026: file under either the CPAL or the Projity License.
027:
028: [NOTE: The text of this license may differ slightly from the text of the notices
029: in Exhibits A and B of the license at http://www.projity.com/license. You should
030: use the latest text at http://www.projity.com/license for your modifications.
031: You may not remove this license text from the source files.]
032:
033: Attribution Information: Attribution Copyright Notice: Copyright © 2006, 2007
034: Projity, Inc. Attribution Phrase (not exceeding 10 words): Powered by OpenProj,
035: an open source solution from Projity. Attribution URL: http://www.projity.com
036: Graphic Image as provided in the Covered Code as file: openproj_logo.png with
037: alternatives listed on http://www.projity.com/logo
038:
039: Display of Attribution Information is required in Larger Works which are defined
040: in the CPAL as a work which combines Covered Code or portions thereof with code
041: not governed by the terms of the CPAL. However, in addition to the other notice
042: obligations, all copies of the Covered Code in Executable and Source Code form
043: distributed must, as a form of attribution of the original author, include on
044: each user interface screen the "OpenProj" logo visible to all users. The
045: OpenProj logo should be located horizontally aligned with the menu bar and left
046: justified on the top left of the screen adjacent to the File menu. The logo
047: must be at least 100 x 25 pixels. When users click on the "OpenProj" logo it
048: must direct them back to http://www.projity.com.
049: */
050: package com.projity.pm.graphic.views.synchro;
051:
052: import java.awt.Dimension;
053: import java.awt.Point;
054:
055: import javax.swing.JComponent;
056: import javax.swing.JScrollPane;
057: import javax.swing.JSplitPane;
058: import javax.swing.JViewport;
059: import javax.swing.event.ChangeEvent;
060: import javax.swing.event.ChangeListener;
061:
062: /**
063: *
064: */
065: public class ScrollPaneSynchronizer {
066: public static final int HORIZONTAL = JSplitPane.VERTICAL_SPLIT;
067:
068: public static final int VERTICAL = JSplitPane.HORIZONTAL_SPLIT;
069:
070: protected JScrollPane scrollPane1;
071:
072: protected JScrollPane scrollPane2;
073:
074: protected int orientation;
075:
076: protected ChangeListener listener = null;
077:
078: protected int defaultScrollBarPolicy1;
079:
080: protected int defaultScrollBarPolicy2;
081:
082: protected boolean bottomBarActivated = true;
083: protected boolean bottomBarEnabled = false;
084:
085: /**
086: * @param scrollPane1
087: * @param scrollPane2
088: * @param position
089: */
090: public ScrollPaneSynchronizer(JScrollPane scrollPane1,
091: JScrollPane scrollPane2, int orientation) {
092: this .scrollPane1 = scrollPane1;
093: this .scrollPane2 = scrollPane2;
094: this .orientation = orientation;
095: }
096:
097: /**
098: * @return Returns the bottomBarActivated.
099: */
100: public boolean isBottomBarActivated() {
101: return bottomBarActivated;
102: }
103:
104: /**
105: * @param bottomBarActivated The bottomBarActivated to set.
106: */
107: public void setBottomBarActivated(boolean bottomBarActivated) {
108: this .bottomBarActivated = bottomBarActivated;
109: }
110:
111: /**
112: * @return Returns the bottomBarEnabled.
113: */
114: public boolean isBottomBarEnabled() {
115: return bottomBarEnabled;
116: }
117:
118: /**
119: * @param bottomBarEnabled The bottomBarEnabled to set.
120: */
121: public void setBottomBarEnabled(boolean bottomBarEnabled) {
122: this .bottomBarEnabled = bottomBarEnabled;
123: }
124:
125: public void activateSynchro() {
126: if (listener == null) {
127: if (orientation == HORIZONTAL) {
128: defaultScrollBarPolicy1 = scrollPane1
129: .getVerticalScrollBarPolicy();
130: defaultScrollBarPolicy2 = scrollPane2
131: .getVerticalScrollBarPolicy();
132: scrollPane1
133: .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
134: scrollPane2
135: .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
136: scrollPane1
137: .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
138: scrollPane2
139: .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
140:
141: scrollPane1.getViewport().addChangeListener(
142: new ChangeListener() {
143: public void stateChanged(ChangeEvent e) {
144: JViewport vp1 = scrollPane1
145: .getViewport();
146: JViewport vp2 = scrollPane2
147: .getViewport();
148: Point p1 = vp1.getViewPosition();
149: Point p2 = vp2.getViewPosition();
150: p2.setLocation((int) p2.getX(),
151: (int) p1.getY());
152: vp2.setViewPosition(p2);
153: vp2.revalidate();
154: }
155: });
156:
157: scrollPane2.getViewport().addChangeListener(
158: new ChangeListener() {
159: public void stateChanged(ChangeEvent e) {
160: JViewport vp1 = scrollPane1
161: .getViewport();
162: JViewport vp2 = scrollPane2
163: .getViewport();
164: Point p1 = vp1.getViewPosition();
165: Point p2 = vp2.getViewPosition();
166: p1.setLocation((int) p1.getX(),
167: (int) p2.getY());
168: vp1.setViewPosition(p1);
169: vp1.revalidate();
170: }
171: });
172:
173: } else if (orientation == VERTICAL) {
174: defaultScrollBarPolicy1 = scrollPane1
175: .getHorizontalScrollBarPolicy();
176: defaultScrollBarPolicy2 = scrollPane2
177: .getHorizontalScrollBarPolicy();
178: scrollPane1
179: .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
180: scrollPane2
181: .setHorizontalScrollBarPolicy((bottomBarActivated) ? JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS
182: : JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
183: scrollPane2.getHorizontalScrollBar().setEnabled(
184: bottomBarEnabled);
185:
186: listener = new ChangeListener() {
187: public void stateChanged(ChangeEvent e) {
188: JViewport vp1 = scrollPane1.getViewport();
189: JViewport vp2 = scrollPane2.getViewport();
190:
191: Point p1 = vp1.getViewPosition();
192: Point p2 = vp2.getViewPosition();
193: p2
194: .setLocation((int) p1.getX(), (int) p2
195: .getY());
196: vp2.setViewPosition(p2);
197:
198: //test
199: Dimension d1 = vp1.getViewSize();
200: Dimension d2 = vp2.getViewSize();
201: d2.setSize((int) d1.getWidth(), (int) d2
202: .getHeight());
203:
204: vp2.setViewSize(d2);
205: ((JComponent) vp2.getView())
206: .setPreferredSize(d2);
207:
208: vp2.revalidate();
209: }
210: };
211: scrollPane1.getViewport().addChangeListener(listener);
212:
213: }
214: }
215: }
216:
217: public void deactivateSynchro() {
218: if (listener != null) {
219: scrollPane2.getViewport().removeChangeListener(listener);
220: if (orientation == HORIZONTAL) {
221: scrollPane1
222: .setVerticalScrollBarPolicy(defaultScrollBarPolicy1);
223: scrollPane2
224: .setVerticalScrollBarPolicy(defaultScrollBarPolicy2);
225: } else if (orientation == VERTICAL) {
226: scrollPane1
227: .setHorizontalScrollBarPolicy(defaultScrollBarPolicy1);
228: scrollPane2
229: .setHorizontalScrollBarPolicy(defaultScrollBarPolicy2);
230: scrollPane2.getHorizontalScrollBar().setEnabled(true);
231: }
232: }
233: }
234:
235: /**
236: * @return Returns the orientation.
237: */
238: public int getOrientation() {
239: return orientation;
240: }
241:
242: /**
243: * @param orientation The orientation to set.
244: */
245: public void setOrientation(int orientation) {
246: this .orientation = orientation;
247: }
248:
249: /**
250: * @return Returns the scrollPane1.
251: */
252: public JScrollPane getScrollPane1() {
253: return scrollPane1;
254: }
255:
256: /**
257: * @param scrollPane1 The scrollPane1 to set.
258: */
259: public void setScrollPane1(JScrollPane scrollPane1) {
260: this .scrollPane1 = scrollPane1;
261: }
262:
263: /**
264: * @return Returns the scrollPane2.
265: */
266: public JScrollPane getScrollPane2() {
267: return scrollPane2;
268: }
269:
270: /**
271: * @param scrollPane2 The scrollPane2 to set.
272: */
273: public void setScrollPane2(JScrollPane scrollPane2) {
274: this.scrollPane2 = scrollPane2;
275: }
276: }
|