/* * Copyright 2003-2010 Tufts University Licensed under the * Educational Community License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may * obtain a copy of the License at * * http://www.osedu.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an "AS IS" * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing * permissions and limitations under the License. */ package tufts.vue.gui; import tufts.vue.DEBUG; import java.awt.Window; import java.util.Comparator; import java.util.Iterator; /** * A "loose" grouping of DockWindow's: membership is assinged * whenver a DockWindow's relvant edge is placed in the the region * while visible. * * @version $Revision: 1.7 $ / $Date: 2010-02-03 19:15:47 $ / $Author: mike $ * @author Scott Fraize */ class DockRegion { private static final org.apache.log4j.Logger Log = org.apache.log4j.Logger.getLogger(DockRegion.class); static final int TOP = 1; static final int BOTTOM = 2; private static java.util.List sAllRegions = new java.util.ArrayList(); private java.util.List mDockedWindows = new java.util.ArrayList(); private int mDockY; final int mGravity; final String mName; DockRegion(int y, int gravity, String name) { mDockY = y; mGravity = gravity; mName = name; if (gravity < TOP || gravity > BOTTOM) throw new UnsupportedOperationException("illegal DockRegion gravity " + gravity); sAllRegions.add(this); if (DEBUG.DOCK || DEBUG.INIT) out("CREATED"); } public boolean isEmpty() { return mDockedWindows.size() == 0; } void moveToY(int y) { if (DEBUG.DOCK) out("moved to line " + y); mDockY = y; } int getY() { return mDockY; } java.util.List getDockedWindows() { return mDockedWindows; } private static DockRegion findRegion(int y, int height) { Iterator i = sAllRegions.iterator(); while (i.hasNext()) { DockRegion r = (DockRegion) i.next(); if (r.mGravity == TOP) { if (r.mDockY == y) return r; } else { // If either the whole window, or the // title is riding along the bottom, include // it in the bottom dock. if (r.mDockY == y + height || r.mDockY == y + DockWindow.CollapsedHeight) return r; } } return null; } static DockRegion findRegion(Window w) { if (w.isVisible()) return findRegion(w.getY(), w.getHeight()); else return null; } private static void clearAll() { Iterator i = sAllRegions.iterator(); while (i.hasNext()) ((DockRegion)i.next()).mDockedWindows.clear(); } private static void updateAll() { Iterator i = sAllRegions.iterator(); while (i.hasNext()) { DockRegion region = (DockRegion) i.next(); region.sortByX(); region.updateRolledWidths(); } } static void assignAllMembers() { clearAll(); if (DEBUG.DOCK) Log.debug("assignAllMemebers"); for (DockWindow dockWindow : DockWindow.AllWindows) { DockRegion dockRegion = findRegion(dockWindow.window()); // dockRegion may, of course, be null dockWindow.assignDockRegion(dockRegion); if (dockRegion != null) dockRegion.mDockedWindows.add(dockWindow); } updateAll(); } //------------------------------------------------------------------ // End of static DockRegion methods //------------------------------------------------------------------ /* void assignMembers() { mDockedWindows.clear(); Iterator i = DockWindow.sAllWindows.iterator(); while (i.hasNext()) { DockWindow dw = (DockWindow) i.next(); if (contains(dw)) { if (dw.mDockRegion != this) { if (dw.mDockRegion != null) dw.mDockRegion.remove(dw); dw.mDockRegion = this; } mDockedWindows.add(dw); } else if (dw.mDockRegion == this) { dw.mDockRegion = null; } } sortByX(); out("windows: " + mDockedWindows); updateRolledWidths(); } private boolean contains(DockWindow dw) { return dw.isVisible() && dw.getY() == mDockY; } */ int getRolledWidth(DockWindow dw) { DockWindow rightSibling = getSiblingToRight(dw); if (rightSibling == null) return dw.getWidth(); //return GUI.GScreenWidth - dw.getX(); else return rightSibling.getX() - dw.getX(); } private void updateRolledWidths() { Iterator i = mDockedWindows.iterator(); while (i.hasNext()) { DockWindow dw = (DockWindow) i.next(); if (dw.isRolledUp()) dw.setSize(getRolledWidth(dw), dw.getHeight()); } } private static Comparator SortByX = new Comparator() { public int compare(Object w1, Object w2) { return ((Window)w1).getX() - ((Window)w2).getX(); }}; private void sortByX() { Object windows[] = mDockedWindows.toArray(); java.util.Arrays.sort(windows, SortByX); java.util.ListIterator i = mDockedWindows.listIterator(); for (int j = 0; j < windows.length; j++) { i.next(); i.set(windows[j]); } DockWindow prev = null; DockWindow next = null; for (int k = 0; k < windows.length; k++) { DockWindow dw = (DockWindow) windows[k]; if (k > 0) prev = (DockWindow) windows[k - 1]; if (k + 1 < windows.length) next = (DockWindow) windows[k + 1]; else next = null; dw.assignDockSiblings(prev, next); } if (DEBUG.DOCK) out("windows: " + mDockedWindows); } /* void add(DockWindow dw) { if (dw.mDockRegion == this) return; out("adding " + dw); if (dw.mDockRegion != null) dw.mDockRegion.remove(dw); dw.mDockRegion = this; mWindows.add(dw); sortByX(); out("windows: " + mWindows); } private void remove(DockWindow dw) { if (dw.mDockRegion == this) { mDockedWindows.remove(dw); out("removed " + dw); updateRolledWidths(); } } */ private DockWindow getSiblingToRight(DockWindow dw) { int next = mDockedWindows.indexOf(dw) + 1; if (mDockedWindows.size() > next) return (DockWindow) mDockedWindows.get(next); else return null; } private void out(String s) { System.out.println(this + " " + s); } public String toString() { return "DockRegion[" + mName + " y=" + mDockY + " sticky=" + (mGravity == TOP ? "top":"bot") + "]"; } }