jdk/test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/JGridPanel.java
changeset 36744 a00905527ec2
equal deleted inserted replaced
36743:bdc3f1b79fb7 36744:a00905527ec2
       
     1 /*
       
     2  * Copyright (c) 2007, 2016, 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.
       
     8  *
       
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
       
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    12  * version 2 for more details (a copy is included in the LICENSE file that
       
    13  * accompanied this code).
       
    14  *
       
    15  * You should have received a copy of the GNU General Public License version
       
    16  * 2 along with this work; if not, write to the Free Software Foundation,
       
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    18  *
       
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
       
    20  * or visit www.oracle.com if you need additional information or have any
       
    21  * questions.
       
    22  */
       
    23 package com.sun.swingset3.demos;
       
    24 
       
    25 import java.awt.*;
       
    26 import javax.swing.*;
       
    27 
       
    28 /**
       
    29  * JGridPanel
       
    30  *
       
    31  * @author Pavel Porvatov
       
    32  */
       
    33 public class JGridPanel extends JPanel {
       
    34 
       
    35     public static final int DEFAULT_GAP = 5;
       
    36 
       
    37     public enum Layout {
       
    38         FIRST,
       
    39         CENTER,
       
    40         LAST,
       
    41         FILL
       
    42     }
       
    43 
       
    44     private enum ComponentType {
       
    45         NO_RESIZABLE,
       
    46         HORIZONTAL_FILL,
       
    47         FULL
       
    48     }
       
    49 
       
    50     private final int cols;
       
    51 
       
    52     private int bigCol = -1;
       
    53 
       
    54     private int bigRow = -1;
       
    55 
       
    56     private int vGap = -1;
       
    57 
       
    58     private int hGap = -1;
       
    59 
       
    60     public JGridPanel(int cols) {
       
    61         this(cols, -1, -1);
       
    62     }
       
    63 
       
    64     public JGridPanel(int cols, int bigCol) {
       
    65         this(cols, bigCol, -1);
       
    66     }
       
    67 
       
    68     public JGridPanel(int cols, int bigCol, int bigRow) {
       
    69         super(new GridBagLayout());
       
    70 
       
    71         assert cols > 0;
       
    72         assert bigCol >= -1 && bigCol < cols;
       
    73         assert bigRow >= -1;
       
    74 
       
    75         this.cols = cols;
       
    76         this.bigCol = bigCol;
       
    77         this.bigRow = bigRow;
       
    78     }
       
    79 
       
    80     public void setVGap(int vGap) {
       
    81         this.vGap = vGap;
       
    82     }
       
    83 
       
    84     public void setHGap(int hGap) {
       
    85         this.hGap = hGap;
       
    86     }
       
    87 
       
    88     public JGridPanel cell() {
       
    89         return cell(null, getHLayout(null), getVLayout(null), null);
       
    90     }
       
    91 
       
    92     public JGridPanel cell(Component component) {
       
    93         return cell(component, getHLayout(component), getVLayout(component), null);
       
    94     }
       
    95 
       
    96     public JGridPanel cell(Component component, Layout hLayout) {
       
    97         return cell(component, hLayout, getVLayout(component), null);
       
    98     }
       
    99 
       
   100     public JGridPanel cell(Component component, Layout hLayout, Layout vLayout) {
       
   101         return cell(component, hLayout, vLayout, null);
       
   102     }
       
   103 
       
   104     public JGridPanel cell(Component component, Insets insets) {
       
   105         assert insets != null;
       
   106 
       
   107         return cell(component, getHLayout(component), getVLayout(component), insets);
       
   108     }
       
   109 
       
   110     private JGridPanel cell(Component component, Layout hLayout, Layout vLayout, Insets insets) {
       
   111         int componentCount = getComponentCount();
       
   112         int x = componentCount % cols;
       
   113         int y = componentCount / cols;
       
   114 
       
   115         int weightx = x == bigCol || (bigCol < 0 && hLayout == Layout.FILL) ? 1 : 0;
       
   116         int weighty = y == bigRow || (bigRow < 0 && vLayout == Layout.FILL) ? 1 : 0;
       
   117 
       
   118         if (insets == null) {
       
   119             int topGap = y == 0 ? 0 : vGap;
       
   120             int leftGap = x == 0 ? 0 : hGap;
       
   121 
       
   122             insets = new Insets(topGap < 0 ? DEFAULT_GAP : topGap,
       
   123                     leftGap < 0 ? DEFAULT_GAP : leftGap, 0, 0);
       
   124         }
       
   125 
       
   126         add(component == null ? createSeparator() : component,
       
   127                 new GridBagConstraints(x, y,
       
   128                         1, 1,
       
   129                         weightx, weighty,
       
   130                         getAnchor(hLayout, vLayout), getFill(hLayout, vLayout),
       
   131                         insets, 0, 0));
       
   132 
       
   133         return this;
       
   134     }
       
   135 
       
   136     public void setComponent(Component component, int col, int row) {
       
   137         assert col >= 0 && col < cols;
       
   138         assert row >= 0;
       
   139 
       
   140         GridBagLayout layout = (GridBagLayout) getLayout();
       
   141 
       
   142         for (int i = 0; i < getComponentCount(); i++) {
       
   143             Component oldComponent = getComponent(i);
       
   144 
       
   145             GridBagConstraints constraints = layout.getConstraints(oldComponent);
       
   146 
       
   147             if (constraints.gridx == col && constraints.gridy == row) {
       
   148                 remove(i);
       
   149 
       
   150                 add(component == null ? createSeparator() : component, constraints);
       
   151 
       
   152                 validate();
       
   153                 repaint();
       
   154 
       
   155                 return;
       
   156             }
       
   157         }
       
   158 
       
   159         // Cell not found
       
   160         assert false;
       
   161     }
       
   162 
       
   163     private static JComponent createSeparator() {
       
   164         return new JLabel();
       
   165     }
       
   166 
       
   167     private static int getFill(Layout hLayout, Layout vLayout) {
       
   168         if (hLayout == Layout.FILL) {
       
   169             return vLayout == Layout.FILL ? GridBagConstraints.BOTH : GridBagConstraints.HORIZONTAL;
       
   170         }
       
   171 
       
   172         return vLayout == Layout.FILL ? GridBagConstraints.VERTICAL : GridBagConstraints.NONE;
       
   173     }
       
   174 
       
   175     private static ComponentType getComponentType(Component component) {
       
   176         if (component == null
       
   177                 || component instanceof JLabel
       
   178                 || component instanceof JRadioButton
       
   179                 || component instanceof JCheckBox
       
   180                 || component instanceof JButton) {
       
   181             return ComponentType.NO_RESIZABLE;
       
   182         }
       
   183 
       
   184         if (component instanceof JComboBox
       
   185                 || component instanceof JTextField) {
       
   186             return ComponentType.HORIZONTAL_FILL;
       
   187         }
       
   188 
       
   189         return ComponentType.FULL;
       
   190     }
       
   191 
       
   192     private static Layout getHLayout(Component component) {
       
   193         if (getComponentType(component) == ComponentType.NO_RESIZABLE) {
       
   194             return Layout.FIRST;
       
   195         } else {
       
   196             return Layout.FILL;
       
   197         }
       
   198     }
       
   199 
       
   200     private static Layout getVLayout(Component component) {
       
   201         if (getComponentType(component) == ComponentType.FULL) {
       
   202             return Layout.FILL;
       
   203         } else {
       
   204             return Layout.CENTER;
       
   205         }
       
   206     }
       
   207 
       
   208     private static final int[][] ANCHORS = new int[][]{
       
   209         {GridBagConstraints.NORTHWEST, GridBagConstraints.NORTH, GridBagConstraints.NORTHEAST},
       
   210         {GridBagConstraints.WEST, GridBagConstraints.CENTER, GridBagConstraints.EAST},
       
   211         {GridBagConstraints.SOUTHWEST, GridBagConstraints.SOUTH, GridBagConstraints.SOUTHEAST}
       
   212     };
       
   213 
       
   214     private static int getAnchorIndex(Layout layout) {
       
   215         if (layout == Layout.CENTER) {
       
   216             return 1;
       
   217         } else if (layout == Layout.LAST) {
       
   218             return 2;
       
   219         } else {
       
   220             return 0;
       
   221         }
       
   222     }
       
   223 
       
   224     private static int getAnchor(Layout hLayout, Layout vLayout) {
       
   225         return ANCHORS[getAnchorIndex(vLayout)][getAnchorIndex(hLayout)];
       
   226     }
       
   227 
       
   228     public void setBorderEqual(int border) {
       
   229         setBorder(BorderFactory.createEmptyBorder(border, border, border, border));
       
   230     }
       
   231 }