1 /*
   2  * Copyright (c) 1995, 2013, Oracle and/or its affiliates. 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.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 package java.awt;
  26 
  27 /**
  28  * The <code>GridBagConstraints</code> class specifies constraints
  29  * for components that are laid out using the
  30  * <code>GridBagLayout</code> class.
  31  *
  32  * @author Doug Stein
  33  * @author Bill Spitzak (orignial NeWS &amp; OLIT implementation)
  34  * @see java.awt.GridBagLayout
  35  * @since JDK1.0
  36  */
  37 public class GridBagConstraints implements Cloneable, java.io.Serializable {
  38 
  39     /**
  40      * Specifies that this component is the next-to-last component in its
  41      * column or row (<code>gridwidth</code>, <code>gridheight</code>),
  42      * or that this component be placed next to the previously added
  43      * component (<code>gridx</code>, <code>gridy</code>).
  44      * @see      java.awt.GridBagConstraints#gridwidth
  45      * @see      java.awt.GridBagConstraints#gridheight
  46      * @see      java.awt.GridBagConstraints#gridx
  47      * @see      java.awt.GridBagConstraints#gridy
  48      */
  49     public static final int RELATIVE = -1;
  50 
  51     /**
  52      * Specifies that this component is the
  53      * last component in its column or row.
  54      */
  55     public static final int REMAINDER = 0;
  56 
  57     /**
  58      * Do not resize the component.
  59      */
  60     public static final int NONE = 0;
  61 
  62     /**
  63      * Resize the component both horizontally and vertically.
  64      */
  65     public static final int BOTH = 1;
  66 
  67     /**
  68      * Resize the component horizontally but not vertically.
  69      */
  70     public static final int HORIZONTAL = 2;
  71 
  72     /**
  73      * Resize the component vertically but not horizontally.
  74      */
  75     public static final int VERTICAL = 3;
  76 
  77     /**
  78      * Put the component in the center of its display area.
  79      */
  80     public static final int CENTER = 10;
  81 
  82     /**
  83      * Put the component at the top of its display area,
  84      * centered horizontally.
  85      */
  86     public static final int NORTH = 11;
  87 
  88     /**
  89      * Put the component at the top-right corner of its display area.
  90      */
  91     public static final int NORTHEAST = 12;
  92 
  93     /**
  94      * Put the component on the right side of its display area,
  95      * centered vertically.
  96      */
  97     public static final int EAST = 13;
  98 
  99     /**
 100      * Put the component at the bottom-right corner of its display area.
 101      */
 102     public static final int SOUTHEAST = 14;
 103 
 104     /**
 105      * Put the component at the bottom of its display area, centered
 106      * horizontally.
 107      */
 108     public static final int SOUTH = 15;
 109 
 110     /**
 111      * Put the component at the bottom-left corner of its display area.
 112      */
 113     public static final int SOUTHWEST = 16;
 114 
 115     /**
 116      * Put the component on the left side of its display area,
 117      * centered vertically.
 118      */
 119     public static final int WEST = 17;
 120 
 121     /**
 122      * Put the component at the top-left corner of its display area.
 123      */
 124     public static final int NORTHWEST = 18;
 125 
 126     /**
 127      * Place the component centered along the edge of its display area
 128      * associated with the start of a page for the current
 129      * {@code ComponentOrientation}.  Equal to NORTH for horizontal
 130      * orientations.
 131      */
 132     public static final int PAGE_START = 19;
 133 
 134     /**
 135      * Place the component centered along the edge of its display area
 136      * associated with the end of a page for the current
 137      * {@code ComponentOrientation}.  Equal to SOUTH for horizontal
 138      * orientations.
 139      */
 140     public static final int PAGE_END = 20;
 141 
 142     /**
 143      * Place the component centered along the edge of its display area where
 144      * lines of text would normally begin for the current
 145      * {@code ComponentOrientation}.  Equal to WEST for horizontal,
 146      * left-to-right orientations and EAST for horizontal, right-to-left
 147      * orientations.
 148      */
 149     public static final int LINE_START = 21;
 150 
 151     /**
 152      * Place the component centered along the edge of its display area where
 153      * lines of text would normally end for the current
 154      * {@code ComponentOrientation}.  Equal to EAST for horizontal,
 155      * left-to-right orientations and WEST for horizontal, right-to-left
 156      * orientations.
 157      */
 158     public static final int LINE_END = 22;
 159 
 160     /**
 161      * Place the component in the corner of its display area where
 162      * the first line of text on a page would normally begin for the current
 163      * {@code ComponentOrientation}.  Equal to NORTHWEST for horizontal,
 164      * left-to-right orientations and NORTHEAST for horizontal, right-to-left
 165      * orientations.
 166      */
 167     public static final int FIRST_LINE_START = 23;
 168 
 169     /**
 170      * Place the component in the corner of its display area where
 171      * the first line of text on a page would normally end for the current
 172      * {@code ComponentOrientation}.  Equal to NORTHEAST for horizontal,
 173      * left-to-right orientations and NORTHWEST for horizontal, right-to-left
 174      * orientations.
 175      */
 176     public static final int FIRST_LINE_END = 24;
 177 
 178     /**
 179      * Place the component in the corner of its display area where
 180      * the last line of text on a page would normally start for the current
 181      * {@code ComponentOrientation}.  Equal to SOUTHWEST for horizontal,
 182      * left-to-right orientations and SOUTHEAST for horizontal, right-to-left
 183      * orientations.
 184      */
 185     public static final int LAST_LINE_START = 25;
 186 
 187     /**
 188      * Place the component in the corner of its display area where
 189      * the last line of text on a page would normally end for the current
 190      * {@code ComponentOrientation}.  Equal to SOUTHEAST for horizontal,
 191      * left-to-right orientations and SOUTHWEST for horizontal, right-to-left
 192      * orientations.
 193      */
 194     public static final int LAST_LINE_END = 26;
 195 
 196     /**
 197      * Possible value for the <code>anchor</code> field.  Specifies
 198      * that the component should be horizontally centered and
 199      * vertically aligned along the baseline of the prevailing row.
 200      * If the component does not have a baseline it will be vertically
 201      * centered.
 202      *
 203      * @since 1.6
 204      */
 205     public static final int BASELINE = 0x100;
 206 
 207     /**
 208      * Possible value for the <code>anchor</code> field.  Specifies
 209      * that the component should be horizontally placed along the
 210      * leading edge.  For components with a left-to-right orientation,
 211      * the leading edge is the left edge.  Vertically the component is
 212      * aligned along the baseline of the prevailing row.  If the
 213      * component does not have a baseline it will be vertically
 214      * centered.
 215      *
 216      * @since 1.6
 217      */
 218     public static final int BASELINE_LEADING = 0x200;
 219 
 220     /**
 221      * Possible value for the <code>anchor</code> field.  Specifies
 222      * that the component should be horizontally placed along the
 223      * trailing edge.  For components with a left-to-right
 224      * orientation, the trailing edge is the right edge.  Vertically
 225      * the component is aligned along the baseline of the prevailing
 226      * row.  If the component does not have a baseline it will be
 227      * vertically centered.
 228      *
 229      * @since 1.6
 230      */
 231     public static final int BASELINE_TRAILING = 0x300;
 232 
 233     /**
 234      * Possible value for the <code>anchor</code> field.  Specifies
 235      * that the component should be horizontally centered.  Vertically
 236      * the component is positioned so that its bottom edge touches
 237      * the baseline of the starting row.  If the starting row does not
 238      * have a baseline it will be vertically centered.
 239      *
 240      * @since 1.6
 241      */
 242     public static final int ABOVE_BASELINE = 0x400;
 243 
 244     /**
 245      * Possible value for the <code>anchor</code> field.  Specifies
 246      * that the component should be horizontally placed along the
 247      * leading edge.  For components with a left-to-right orientation,
 248      * the leading edge is the left edge.  Vertically the component is
 249      * positioned so that its bottom edge touches the baseline of the
 250      * starting row.  If the starting row does not have a baseline it
 251      * will be vertically centered.
 252      *
 253      * @since 1.6
 254      */
 255     public static final int ABOVE_BASELINE_LEADING = 0x500;
 256 
 257     /**
 258      * Possible value for the <code>anchor</code> field.  Specifies
 259      * that the component should be horizontally placed along the
 260      * trailing edge.  For components with a left-to-right
 261      * orientation, the trailing edge is the right edge.  Vertically
 262      * the component is positioned so that its bottom edge touches
 263      * the baseline of the starting row.  If the starting row does not
 264      * have a baseline it will be vertically centered.
 265      *
 266      * @since 1.6
 267      */
 268     public static final int ABOVE_BASELINE_TRAILING = 0x600;
 269 
 270     /**
 271      * Possible value for the <code>anchor</code> field.  Specifies
 272      * that the component should be horizontally centered.  Vertically
 273      * the component is positioned so that its top edge touches the
 274      * baseline of the starting row.  If the starting row does not
 275      * have a baseline it will be vertically centered.
 276      *
 277      * @since 1.6
 278      */
 279     public static final int BELOW_BASELINE = 0x700;
 280 
 281     /**
 282      * Possible value for the <code>anchor</code> field.  Specifies
 283      * that the component should be horizontally placed along the
 284      * leading edge.  For components with a left-to-right orientation,
 285      * the leading edge is the left edge.  Vertically the component is
 286      * positioned so that its top edge touches the baseline of the
 287      * starting row.  If the starting row does not have a baseline it
 288      * will be vertically centered.
 289      *
 290      * @since 1.6
 291      */
 292     public static final int BELOW_BASELINE_LEADING = 0x800;
 293 
 294     /**
 295      * Possible value for the <code>anchor</code> field.  Specifies
 296      * that the component should be horizontally placed along the
 297      * trailing edge.  For components with a left-to-right
 298      * orientation, the trailing edge is the right edge.  Vertically
 299      * the component is positioned so that its top edge touches the
 300      * baseline of the starting row.  If the starting row does not
 301      * have a baseline it will be vertically centered.
 302      *
 303      * @since 1.6
 304      */
 305     public static final int BELOW_BASELINE_TRAILING = 0x900;
 306 
 307     /**
 308      * Specifies the cell containing the leading edge of the component's
 309      * display area, where the first cell in a row has <code>gridx=0</code>.
 310      * The leading edge of a component's display area is its left edge for
 311      * a horizontal, left-to-right container and its right edge for a
 312      * horizontal, right-to-left container.
 313      * The value
 314      * <code>RELATIVE</code> specifies that the component be placed
 315      * immediately following the component that was added to the container
 316      * just before this component was added.
 317      * <p>
 318      * The default value is <code>RELATIVE</code>.
 319      * <code>gridx</code> should be a non-negative value.
 320      * @serial
 321      * @see #clone()
 322      * @see java.awt.GridBagConstraints#gridy
 323      * @see java.awt.ComponentOrientation
 324      */
 325     public int gridx;
 326 
 327     /**
 328      * Specifies the cell at the top of the component's display area,
 329      * where the topmost cell has <code>gridy=0</code>. The value
 330      * <code>RELATIVE</code> specifies that the component be placed just
 331      * below the component that was added to the container just before
 332      * this component was added.
 333      * <p>
 334      * The default value is <code>RELATIVE</code>.
 335      * <code>gridy</code> should be a non-negative value.
 336      * @serial
 337      * @see #clone()
 338      * @see java.awt.GridBagConstraints#gridx
 339      */
 340     public int gridy;
 341 
 342     /**
 343      * Specifies the number of cells in a row for the component's
 344      * display area.
 345      * <p>
 346      * Use <code>REMAINDER</code> to specify that the component's
 347      * display area will be from <code>gridx</code> to the last
 348      * cell in the row.
 349      * Use <code>RELATIVE</code> to specify that the component's
 350      * display area will be from <code>gridx</code> to the next
 351      * to the last one in its row.
 352      * <p>
 353      * <code>gridwidth</code> should be non-negative and the default
 354      * value is 1.
 355      * @serial
 356      * @see #clone()
 357      * @see java.awt.GridBagConstraints#gridheight
 358      */
 359     public int gridwidth;
 360 
 361     /**
 362      * Specifies the number of cells in a column for the component's
 363      * display area.
 364      * <p>
 365      * Use <code>REMAINDER</code> to specify that the component's
 366      * display area will be from <code>gridy</code> to the last
 367      * cell in the column.
 368      * Use <code>RELATIVE</code> to specify that the component's
 369      * display area will be from <code>gridy</code> to the next
 370      * to the last one in its column.
 371      * <p>
 372      * <code>gridheight</code> should be a non-negative value and the
 373      * default value is 1.
 374      * @serial
 375      * @see #clone()
 376      * @see java.awt.GridBagConstraints#gridwidth
 377      */
 378     public int gridheight;
 379 
 380     /**
 381      * Specifies how to distribute extra horizontal space.
 382      * <p>
 383      * The grid bag layout manager calculates the weight of a column to
 384      * be the maximum <code>weightx</code> of all the components in a
 385      * column. If the resulting layout is smaller horizontally than the area
 386      * it needs to fill, the extra space is distributed to each column in
 387      * proportion to its weight. A column that has a weight of zero receives
 388      * no extra space.
 389      * <p>
 390      * If all the weights are zero, all the extra space appears between
 391      * the grids of the cell and the left and right edges.
 392      * <p>
 393      * The default value of this field is <code>0</code>.
 394      * <code>weightx</code> should be a non-negative value.
 395      * @serial
 396      * @see #clone()
 397      * @see java.awt.GridBagConstraints#weighty
 398      */
 399     public double weightx;
 400 
 401     /**
 402      * Specifies how to distribute extra vertical space.
 403      * <p>
 404      * The grid bag layout manager calculates the weight of a row to be
 405      * the maximum <code>weighty</code> of all the components in a row.
 406      * If the resulting layout is smaller vertically than the area it
 407      * needs to fill, the extra space is distributed to each row in
 408      * proportion to its weight. A row that has a weight of zero receives no
 409      * extra space.
 410      * <p>
 411      * If all the weights are zero, all the extra space appears between
 412      * the grids of the cell and the top and bottom edges.
 413      * <p>
 414      * The default value of this field is <code>0</code>.
 415      * <code>weighty</code> should be a non-negative value.
 416      * @serial
 417      * @see #clone()
 418      * @see java.awt.GridBagConstraints#weightx
 419      */
 420     public double weighty;
 421 
 422     /**
 423      * This field is used when the component is smaller than its
 424      * display area. It determines where, within the display area, to
 425      * place the component.
 426      * <p> There are three kinds of possible values: orientation
 427      * relative, baseline relative and absolute.  Orientation relative
 428      * values are interpreted relative to the container's component
 429      * orientation property, baseline relative values are interpreted
 430      * relative to the baseline and absolute values are not.  The
 431      * absolute values are:
 432      * <code>CENTER</code>, <code>NORTH</code>, <code>NORTHEAST</code>,
 433      * <code>EAST</code>, <code>SOUTHEAST</code>, <code>SOUTH</code>,
 434      * <code>SOUTHWEST</code>, <code>WEST</code>, and <code>NORTHWEST</code>.
 435      * The orientation relative values are: <code>PAGE_START</code>,
 436      * <code>PAGE_END</code>,
 437      * <code>LINE_START</code>, <code>LINE_END</code>,
 438      * <code>FIRST_LINE_START</code>, <code>FIRST_LINE_END</code>,
 439      * <code>LAST_LINE_START</code> and <code>LAST_LINE_END</code>.  The
 440      * baseline relative values are:
 441      * <code>BASELINE</code>, <code>BASELINE_LEADING</code>,
 442      * <code>BASELINE_TRAILING</code>,
 443      * <code>ABOVE_BASELINE</code>, <code>ABOVE_BASELINE_LEADING</code>,
 444      * <code>ABOVE_BASELINE_TRAILING</code>,
 445      * <code>BELOW_BASELINE</code>, <code>BELOW_BASELINE_LEADING</code>,
 446      * and <code>BELOW_BASELINE_TRAILING</code>.
 447      * The default value is <code>CENTER</code>.
 448      * @serial
 449      * @see #clone()
 450      * @see java.awt.ComponentOrientation
 451      */
 452     public int anchor;
 453 
 454     /**
 455      * This field is used when the component's display area is larger
 456      * than the component's requested size. It determines whether to
 457      * resize the component, and if so, how.
 458      * <p>
 459      * The following values are valid for <code>fill</code>:
 460      *
 461      * <ul>
 462      * <li>
 463      * <code>NONE</code>: Do not resize the component.
 464      * <li>
 465      * <code>HORIZONTAL</code>: Make the component wide enough to fill
 466      *         its display area horizontally, but do not change its height.
 467      * <li>
 468      * <code>VERTICAL</code>: Make the component tall enough to fill its
 469      *         display area vertically, but do not change its width.
 470      * <li>
 471      * <code>BOTH</code>: Make the component fill its display area
 472      *         entirely.
 473      * </ul>
 474      * <p>
 475      * The default value is <code>NONE</code>.
 476      * @serial
 477      * @see #clone()
 478      */
 479     public int fill;
 480 
 481     /**
 482      * This field specifies the external padding of the component, the
 483      * minimum amount of space between the component and the edges of its
 484      * display area.
 485      * <p>
 486      * The default value is <code>new Insets(0, 0, 0, 0)</code>.
 487      * @serial
 488      * @see #clone()
 489      */
 490     public Insets insets;
 491 
 492     /**
 493      * This field specifies the internal padding of the component, how much
 494      * space to add to the minimum width of the component. The width of
 495      * the component is at least its minimum width plus
 496      * <code>ipadx</code> pixels.
 497      * <p>
 498      * The default value is <code>0</code>.
 499      * @serial
 500      * @see #clone()
 501      * @see java.awt.GridBagConstraints#ipady
 502      */
 503     public int ipadx;
 504 
 505     /**
 506      * This field specifies the internal padding, that is, how much
 507      * space to add to the minimum height of the component. The height of
 508      * the component is at least its minimum height plus
 509      * <code>ipady</code> pixels.
 510      * <p>
 511      * The default value is 0.
 512      * @serial
 513      * @see #clone()
 514      * @see java.awt.GridBagConstraints#ipadx
 515      */
 516     public int ipady;
 517 
 518     /**
 519      * Temporary place holder for the x coordinate.
 520      * @serial
 521      */
 522     int tempX;
 523     /**
 524      * Temporary place holder for the y coordinate.
 525      * @serial
 526      */
 527     int tempY;
 528     /**
 529      * Temporary place holder for the Width of the component.
 530      * @serial
 531      */
 532     int tempWidth;
 533     /**
 534      * Temporary place holder for the Height of the component.
 535      * @serial
 536      */
 537     int tempHeight;
 538     /**
 539      * The minimum width of the component.  It is used to calculate
 540      * <code>ipady</code>, where the default will be 0.
 541      * @serial
 542      * @see #ipady
 543      */
 544     int minWidth;
 545     /**
 546      * The minimum height of the component. It is used to calculate
 547      * <code>ipadx</code>, where the default will be 0.
 548      * @serial
 549      * @see #ipadx
 550      */
 551     int minHeight;
 552 
 553     // The following fields are only used if the anchor is
 554     // one of BASELINE, BASELINE_LEADING or BASELINE_TRAILING.
 555     // ascent and descent include the insets and ipady values.
 556     transient int ascent;
 557     transient int descent;
 558     transient Component.BaselineResizeBehavior baselineResizeBehavior;
 559     // The folllowing two fields are used if the baseline type is
 560     // CENTER_OFFSET.
 561     // centerPadding is either 0 or 1 and indicates if
 562     // the height needs to be padded by one when calculating where the
 563     // baseline lands
 564     transient int centerPadding;
 565     // Where the baseline lands relative to the center of the component.
 566     transient int centerOffset;
 567 
 568     /*
 569      * JDK 1.1 serialVersionUID
 570      */
 571     private static final long serialVersionUID = -1000070633030801713L;
 572 
 573     /**
 574      * Creates a <code>GridBagConstraint</code> object with
 575      * all of its fields set to their default value.
 576      */
 577     public GridBagConstraints () {
 578         gridx = RELATIVE;
 579         gridy = RELATIVE;
 580         gridwidth = 1;
 581         gridheight = 1;
 582 
 583         weightx = 0;
 584         weighty = 0;
 585         anchor = CENTER;
 586         fill = NONE;
 587 
 588         insets = new Insets(0, 0, 0, 0);
 589         ipadx = 0;
 590         ipady = 0;
 591     }
 592 
 593     /**
 594      * Creates a <code>GridBagConstraints</code> object with
 595      * all of its fields set to the passed-in arguments.
 596      *
 597      * Note: Because the use of this constructor hinders readability
 598      * of source code, this constructor should only be used by
 599      * automatic source code generation tools.
 600      *
 601      * @param gridx     The initial gridx value.
 602      * @param gridy     The initial gridy value.
 603      * @param gridwidth The initial gridwidth value.
 604      * @param gridheight        The initial gridheight value.
 605      * @param weightx   The initial weightx value.
 606      * @param weighty   The initial weighty value.
 607      * @param anchor    The initial anchor value.
 608      * @param fill      The initial fill value.
 609      * @param insets    The initial insets value.
 610      * @param ipadx     The initial ipadx value.
 611      * @param ipady     The initial ipady value.
 612      *
 613      * @see java.awt.GridBagConstraints#gridx
 614      * @see java.awt.GridBagConstraints#gridy
 615      * @see java.awt.GridBagConstraints#gridwidth
 616      * @see java.awt.GridBagConstraints#gridheight
 617      * @see java.awt.GridBagConstraints#weightx
 618      * @see java.awt.GridBagConstraints#weighty
 619      * @see java.awt.GridBagConstraints#anchor
 620      * @see java.awt.GridBagConstraints#fill
 621      * @see java.awt.GridBagConstraints#insets
 622      * @see java.awt.GridBagConstraints#ipadx
 623      * @see java.awt.GridBagConstraints#ipady
 624      *
 625      * @since 1.2
 626      */
 627     public GridBagConstraints(int gridx, int gridy,
 628                               int gridwidth, int gridheight,
 629                               double weightx, double weighty,
 630                               int anchor, int fill,
 631                               Insets insets, int ipadx, int ipady) {
 632         this.gridx = gridx;
 633         this.gridy = gridy;
 634         this.gridwidth = gridwidth;
 635         this.gridheight = gridheight;
 636         this.fill = fill;
 637         this.ipadx = ipadx;
 638         this.ipady = ipady;
 639         this.insets = insets;
 640         this.anchor  = anchor;
 641         this.weightx = weightx;
 642         this.weighty = weighty;
 643     }
 644 
 645     /**
 646      * Creates a copy of this grid bag constraint.
 647      * @return     a copy of this grid bag constraint
 648      */
 649     public Object clone () {
 650         try {
 651             GridBagConstraints c = (GridBagConstraints)super.clone();
 652             c.insets = (Insets)insets.clone();
 653             return c;
 654         } catch (CloneNotSupportedException e) {
 655             // this shouldn't happen, since we are Cloneable
 656             throw new InternalError(e);
 657         }
 658     }
 659 
 660     boolean isVerticallyResizable() {
 661         return (fill == BOTH || fill == VERTICAL);
 662     }
 663 }