1 /* 2 * Copyright (c) 1998, 2014, 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 26 package javax.swing.colorchooser; 27 28 import javax.swing.*; 29 import java.awt.*; 30 import java.awt.event.*; 31 import javax.swing.event.*; 32 import javax.swing.text.*; 33 import java.io.Serializable; 34 35 36 /** 37 * A better GridLayout class 38 * 39 * @author Steve Wilson 40 */ 41 class SmartGridLayout implements LayoutManager, Serializable { 42 private static final long serialVersionUID = -8480277825494401985L; 43 44 int rows = 2; 45 int columns = 2; 46 int xGap = 2; 47 int yGap = 2; 48 int componentCount = 0; 49 Component[][] layoutGrid; 50 51 52 public SmartGridLayout(int numColumns, int numRows) { 53 rows = numRows; 54 columns = numColumns; 55 layoutGrid = new Component[numColumns][numRows]; 56 57 } 58 59 60 public void layoutContainer(Container c) { 61 62 buildLayoutGrid(c); 63 64 int[] rowHeights = new int[rows]; 65 int[] columnWidths = new int[columns]; 66 67 for (int row = 0; row < rows; row++) { 68 rowHeights[row] = computeRowHeight(row); 69 } 70 71 for (int column = 0; column < columns; column++) { 72 columnWidths[column] = computeColumnWidth(column); 73 } 74 75 76 Insets insets = c.getInsets(); 77 78 if (c.getComponentOrientation().isLeftToRight()) { 79 int horizLoc = insets.left; 80 for (int column = 0; column < columns; column++) { 81 int vertLoc = insets.top; 82 83 for (int row = 0; row < rows; row++) { 84 Component current = layoutGrid[column][row]; 85 86 current.setBounds(horizLoc, vertLoc, columnWidths[column], rowHeights[row]); 87 // System.out.println(current.getBounds()); 88 vertLoc += (rowHeights[row] + yGap); 89 } 90 horizLoc += (columnWidths[column] + xGap ); 91 } 92 } else { 93 int horizLoc = c.getWidth() - insets.right; 94 for (int column = 0; column < columns; column++) { 95 int vertLoc = insets.top; 96 horizLoc -= columnWidths[column]; 97 98 for (int row = 0; row < rows; row++) { 99 Component current = layoutGrid[column][row]; 100 101 current.setBounds(horizLoc, vertLoc, columnWidths[column], rowHeights[row]); 102 // System.out.println(current.getBounds()); 103 vertLoc += (rowHeights[row] + yGap); 104 } 105 horizLoc -= xGap; 106 } 107 } 108 109 110 111 } 112 113 public Dimension minimumLayoutSize(Container c) { 114 115 buildLayoutGrid(c); 116 Insets insets = c.getInsets(); 117 118 119 120 int height = 0; 121 int width = 0; 122 123 for (int row = 0; row < rows; row++) { 124 height += computeRowHeight(row); 125 } 126 127 for (int column = 0; column < columns; column++) { 128 width += computeColumnWidth(column); 129 } 130 131 height += (yGap * (rows - 1)) + insets.top + insets.bottom; 132 width += (xGap * (columns - 1)) + insets.right + insets.left; 133 134 return new Dimension(width, height); 135 136 137 } 138 139 public Dimension preferredLayoutSize(Container c) { 140 return minimumLayoutSize(c); 141 } 142 143 144 public void addLayoutComponent(String s, Component c) {} 145 146 public void removeLayoutComponent(Component c) {} 147 148 149 private void buildLayoutGrid(Container c) { 150 151 Component[] children = c.getComponents(); 152 153 for (int componentCount = 0; componentCount < children.length; componentCount++) { 154 // System.out.println("Children: " +componentCount); 155 int row = 0; 156 int column = 0; 157 158 if (componentCount != 0) { 159 column = componentCount % columns; 160 row = (componentCount - column) / columns; 161 } 162 163 // System.out.println("inserting into: "+ column + " " + row); 164 165 layoutGrid[column][row] = children[componentCount]; 166 } 167 } 168 169 private int computeColumnWidth(int columnNum) { 170 int maxWidth = 1; 171 for (int row = 0; row < rows; row++) { 172 int width = layoutGrid[columnNum][row].getPreferredSize().width; 173 if (width > maxWidth) { 174 maxWidth = width; 175 } 176 } 177 return maxWidth; 178 } 179 180 private int computeRowHeight(int rowNum) { 181 int maxHeight = 1; 182 for (int column = 0; column < columns; column++) { 183 int height = layoutGrid[column][rowNum].getPreferredSize().height; 184 if (height > maxHeight) { 185 maxHeight = height; 186 } 187 } 188 return maxHeight; 189 } 190 191 }