GNU Classpath (0.20) | |
Frames | No Frames |
1: /* ViewportLayout.java -- 2: Copyright (C) 2002, 2004 Free Software Foundation, Inc. 3: 4: This file is part of GNU Classpath. 5: 6: GNU Classpath is free software; you can redistribute it and/or modify 7: it under the terms of the GNU General Public License as published by 8: the Free Software Foundation; either version 2, or (at your option) 9: any later version. 10: 11: GNU Classpath is distributed in the hope that it will be useful, but 12: WITHOUT ANY WARRANTY; without even the implied warranty of 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14: General Public License for more details. 15: 16: You should have received a copy of the GNU General Public License 17: along with GNU Classpath; see the file COPYING. If not, write to the 18: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 19: 02110-1301 USA. 20: 21: Linking this library statically or dynamically with other modules is 22: making a combined work based on this library. Thus, the terms and 23: conditions of the GNU General Public License cover the whole 24: combination. 25: 26: As a special exception, the copyright holders of this library give you 27: permission to link this library with independent modules to produce an 28: executable, regardless of the license terms of these independent 29: modules, and to copy and distribute the resulting executable under 30: terms of your choice, provided that you also meet, for each linked 31: independent module, the terms and conditions of the license of that 32: module. An independent module is a module which is not derived from 33: or based on this library. If you modify this library, you may extend 34: this exception to your version of the library, but you are not 35: obligated to do so. If you do not wish to do so, delete this 36: exception statement from your version. */ 37: 38: package javax.swing; 39: 40: import java.awt.Component; 41: import java.awt.Container; 42: import java.awt.Dimension; 43: import java.awt.LayoutManager; 44: import java.awt.Point; 45: import java.awt.Rectangle; 46: import java.io.Serializable; 47: 48: /** 49: * ViewportLayout 50: * @author Andrew Selkirk 51: * @author Graydon Hoare 52: */ 53: public class ViewportLayout implements LayoutManager, Serializable 54: { 55: private static final long serialVersionUID = -788225906076097229L; 56: 57: public ViewportLayout() 58: { 59: // Nothing to do here. 60: } 61: 62: public void addLayoutComponent(String name, Component c) 63: { 64: // Nothing to do here. 65: } 66: 67: public void removeLayoutComponent(Component c) 68: { 69: // Nothing to do here. 70: } 71: 72: public Dimension preferredLayoutSize(Container parent) 73: { 74: JViewport vp = (JViewport)parent; 75: Component view = vp.getView(); 76: if (view != null) 77: { 78: if (view instanceof Scrollable) 79: return ((Scrollable)view).getPreferredScrollableViewportSize(); 80: return view.getPreferredSize(); 81: } 82: else 83: return new Dimension(); 84: } 85: 86: public Dimension minimumLayoutSize(Container parent) 87: { 88: JViewport vp = (JViewport)parent; 89: Component view = vp.getView(); 90: if (view != null) 91: return view.getMinimumSize(); 92: else 93: return new Dimension(); 94: } 95: 96: /** 97: * Layout the view and viewport to respect the following rules. These are 98: * not precisely the rules described in sun's javadocs, but they are the 99: * rules which sun's swing implementation follows, if you watch its 100: * behavior: 101: * 102: * <ol> 103: * 104: * <li>If the port is larger than the view's minimum size, put the port 105: * at view position <code>(0,0)</code> and make the view's size equal to 106: * the port's.</li> 107: * 108: * <li>If the port is smaller than the view, leave the view at its 109: * minimum size. also, do not move the port, <em>unless</em> the port 110: * extends into space <em>past</em> the edge of the view. If so, move the 111: * port up or to the left, in view space, by the amount of empty space 112: * (keep the lower and right edges lined up)</li> 113: * 114: * </ol> 115: * 116: * @see JViewport#getViewSize 117: * @see JViewport#setViewSize 118: * @see JViewport#getViewPosition 119: * @see JViewport#setViewPosition 120: */ 121: 122: public void layoutContainer(Container parent) 123: { 124: // The way to interpret this function is basically to ignore the names 125: // of methods it calls, and focus on the variable names here. getViewRect 126: // doesn't, for example, return the view; it returns the port bounds in 127: // view space. Likwise setViewPosition doesn't reposition the view; it 128: // positions the port, in view coordinates. 129: 130: JViewport port = (JViewport) parent; 131: Component view = port.getView(); 132: 133: if (view == null) 134: return; 135: 136: // These dimensions and positions are in *view space*. Do not mix 137: // variables in here from port space (eg. parent.getBounds()). This 138: // function should be entirely in view space, because the methods on 139: // the viewport require inputs in view space. 140: 141: Rectangle portBounds = port.getViewRect(); 142: Dimension viewPref = view.getPreferredSize(); 143: Dimension viewMinimum = view.getMinimumSize(); 144: Point portLowerRight = new Point(portBounds.x + portBounds.width, 145: portBounds.y + portBounds.height); 146: 147: // vertical implementation of the above rules 148: if ((! (view instanceof Scrollable) && viewPref.height < portBounds.height 149: || (view instanceof Scrollable 150: && ((Scrollable) view).getScrollableTracksViewportHeight()))) 151: viewPref.height = portBounds.height; 152: 153: if (portBounds.height >= viewMinimum.height) 154: portBounds.y = 0; 155: else 156: { 157: int overextension = portLowerRight.y - viewPref.height; 158: if (overextension > 0) 159: portBounds.y -= overextension; 160: } 161: 162: // horizontal implementation of the above rules 163: if ((! (view instanceof Scrollable) && viewPref.width < portBounds.width 164: || (view instanceof Scrollable 165: && ((Scrollable) view).getScrollableTracksViewportWidth()))) 166: viewPref.width = portBounds.width; 167: 168: if (portBounds.width >= viewMinimum.width) 169: portBounds.x = 0; 170: else 171: { 172: int overextension = portLowerRight.x - viewPref.width; 173: if (overextension > 0) 174: portBounds.x -= overextension; 175: } 176: 177: port.setViewPosition(portBounds.getLocation()); 178: port.setViewSize(viewPref); 179: } 180: }
GNU Classpath (0.20) |