1 /*
   2  * Copyright 2003-2005 Sun Microsystems, Inc.  All Rights Reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Sun designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Sun in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  22  * CA 95054 USA or visit www.sun.com if you need additional information or
  23  * have any questions.
  24  */
  25 package sun.awt.X11;
  26 
  27 import java.awt.*;
  28 
  29 class WindowDimensions {
  30     private Point loc;
  31     private Dimension size;
  32     private Insets insets;
  33     private boolean isClientSizeSet;
  34 
  35     /**
  36      * If isClient is true, the bounds represent the client window area.
  37      * Otherwise, they represent the entire window area, with the insets included
  38      */
  39     public WindowDimensions(int x, int y, int width, int height, boolean isClient) {
  40         this(new Rectangle(x, y, width, height), null, isClient);
  41     }
  42 
  43     /**
  44      * If isClient is true, the bounds represent the client window area.
  45      * Otherwise, they represent the entire window area, with the insets included
  46      */
  47     public WindowDimensions(Rectangle rec, Insets ins, boolean isClient) {
  48         if (rec == null) {
  49             throw new IllegalArgumentException("Client bounds can't be null");
  50         }
  51         isClientSizeSet = isClient;
  52         this.loc = rec.getLocation();
  53         this.size = rec.getSize();
  54         setInsets(ins);
  55     }
  56 
  57     /**
  58      * If isClient is true, the bounds represent the client window area.
  59      * Otherwise, they represent the entire window area, with the insets included
  60      */
  61     public WindowDimensions(Point loc, Dimension size, Insets in, boolean isClient) {
  62         this(new Rectangle(loc, size), in, isClient);
  63     }
  64 
  65     /**
  66      * If isClient is true, the bounds represent the client window area.
  67      * Otherwise, they represent the entire window area, with the insets included
  68      */
  69     public WindowDimensions(Rectangle bounds, boolean isClient) {
  70         this(bounds, null, isClient);
  71     }
  72 
  73     public WindowDimensions(final WindowDimensions dims) {
  74         this.loc = new Point(dims.loc);
  75         this.size = new Dimension(dims.size);
  76         this.insets = cloneOrZero(dims.insets);
  77         this.isClientSizeSet = dims.isClientSizeSet;
  78     }
  79 
  80     public Rectangle getClientRect() {
  81         if (isClientSizeSet) {
  82             return new Rectangle(loc, size);
  83         } else {
  84             // Calculate client bounds
  85             if (insets != null) {
  86                 return new Rectangle(loc.x, loc.y,
  87                                      size.width-(insets.left+insets.right),
  88                                      size.height-(insets.top+insets.bottom));
  89             } else {
  90                 return new Rectangle(loc, size);
  91             }
  92         }
  93     }
  94 
  95     public void setClientSize(Dimension size) {
  96         this.size = new Dimension(size);
  97         isClientSizeSet = true;
  98     }
  99 
 100     public void setClientSize(int width, int height) {
 101         size = new Dimension(width, height);
 102         isClientSizeSet = true;
 103     }
 104 
 105     public Dimension getClientSize() {
 106         return getClientRect().getSize();
 107     }
 108 
 109     public void setSize(int width, int height) {
 110         size = new Dimension(width, height);
 111         isClientSizeSet = false;
 112     }
 113 
 114     public Dimension getSize() {
 115         return getBounds().getSize();
 116     }
 117 
 118     public Insets getInsets() {
 119         return cloneOrZero(insets);
 120     }
 121     public Rectangle getBounds() {
 122         if (isClientSizeSet) {
 123             Rectangle res = new Rectangle(loc, size);
 124             res.width += (insets.left + insets.right);
 125             res.height += (insets.top + insets.bottom);
 126             return res;
 127         } else {
 128             return new Rectangle(loc, size);
 129         }
 130     }
 131 
 132     public Point getLocation() {
 133         return new Point(loc);
 134     }
 135     public void setLocation(int x, int y) {
 136         loc = new Point(x, y);
 137     }
 138 
 139     public Rectangle getScreenBounds() {
 140         Dimension size = getClientSize();
 141         Point location = getLocation(); // this is Java location
 142         location.x += insets.left;
 143         location.y += insets.top;
 144         return new Rectangle(location, size);
 145     }
 146 
 147     public void setInsets(Insets in) {
 148         insets = cloneOrZero(in);
 149         if (!isClientSizeSet) {
 150             if (size.width < (insets.left+insets.right)) {
 151                 size.width = (insets.left+insets.right);
 152             }
 153             if (size.height < (insets.top+insets.bottom)) {
 154                 size.height = (insets.top+insets.bottom);
 155             }
 156         }
 157     }
 158 
 159     public boolean isClientSizeSet() {
 160         return isClientSizeSet;
 161     }
 162 
 163     public String toString() {
 164         return "[" + loc + ", " + size + "(" +(isClientSizeSet?"client":"bounds") + ")+" + insets + "]";
 165     }
 166 
 167     public boolean equals(Object o) {
 168         if (!(o instanceof WindowDimensions)) {
 169             return false;
 170         }
 171         WindowDimensions dims = (WindowDimensions)o;
 172         return ((dims.insets.equals(insets)))
 173             && (getClientRect().equals(dims.getClientRect()))
 174             && (getBounds().equals(dims.getBounds()));
 175     }
 176 
 177     public int hashCode() {
 178         return ((insets == null)? (0):(insets.hashCode())) ^ getClientRect().hashCode() ^ getBounds().hashCode();
 179     }
 180 
 181     private static Insets cloneOrZero(Insets insets) {
 182         return insets == null ? new Insets(0, 0, 0, 0) :
 183             (Insets)insets.clone();
 184     }
 185 }