| /* |
| * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. Oracle designates this |
| * particular file as subject to the "Classpath" exception as provided |
| * by Oracle in the LICENSE file that accompanied this code. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| package sun.tools.jconsole; |
| |
| import java.awt.*; |
| |
| import javax.swing.*; |
| |
| @SuppressWarnings("serial") |
| public class VariableGridLayout extends GridLayout { |
| |
| private boolean fillRows, fillColumns; |
| |
| public VariableGridLayout(int rows, int cols, |
| int hgap, int vgap, |
| boolean fillRows, boolean fillColumns) { |
| super(rows, cols, hgap, vgap); |
| |
| this.fillRows = fillRows; |
| this.fillColumns = fillColumns; |
| } |
| |
| public void setFillRow(JComponent c, boolean b) { |
| c.putClientProperty("VariableGridLayout.fillRow", b); |
| } |
| |
| public void setFillColumn(JComponent c, boolean b) { |
| c.putClientProperty("VariableGridLayout.fillColumn", b); |
| } |
| |
| public boolean getFillRow(JComponent c) { |
| Boolean b = (Boolean)c.getClientProperty("VariableGridLayout.fillRow"); |
| return (b != null) ? b : fillRows; |
| } |
| |
| public boolean getFillColumn(JComponent c) { |
| Boolean b = (Boolean)c.getClientProperty("VariableGridLayout.fillColumn"); |
| return (b != null) ? b : fillColumns; |
| } |
| |
| public void layoutContainer(Container parent) { |
| Insets insets = parent.getInsets(); |
| int ncomponents = parent.getComponentCount(); |
| int nrows = getRows(); |
| int ncols = getColumns(); |
| int hgap = getHgap(); |
| int vgap = getVgap(); |
| |
| if (nrows > 0) { |
| ncols = (ncomponents + nrows - 1) / nrows; |
| } else { |
| nrows = (ncomponents + ncols - 1) / ncols; |
| } |
| |
| // Set heights |
| int x; |
| int y; |
| int nFills = 0; |
| boolean[] fills = new boolean[nrows]; |
| int lastFillRow = -1; |
| int nComps = parent.getComponentCount(); |
| |
| y = insets.top; |
| for (int row = 0; row < nrows; row++) { |
| // Find largest minimum height for this row |
| int h = 0; |
| for (int col = 0; col < ncols; col++) { |
| if (row * ncols + col < nComps) { |
| Component c = parent.getComponent(row * ncols + col); |
| h = Math.max(h, c.getMinimumSize().height); |
| } |
| } |
| // Set heights for this row |
| x = insets.left; |
| for (int col = 0; col < ncols; col++) { |
| if (row * ncols + col < nComps) { |
| JComponent c = (JComponent)parent.getComponent(row * ncols + col); |
| int w = c.getWidth(); |
| c.setBounds(x, y, w, h); |
| x += w + hgap; |
| if (col == 0 && getFillRow(c)) { |
| fills[row] = true; |
| } |
| } |
| } |
| y += h + vgap; |
| if (fills[row]) { |
| nFills++; |
| lastFillRow = row; |
| } |
| } |
| |
| // Fill heights |
| if (nFills > 0 && y < parent.getHeight()) { |
| // How much height to add |
| int hAdd = (parent.getHeight() - y) / nFills; |
| int hAdded = 0; |
| for (int row = 0; row < nrows; row++) { |
| if (fills[row]) { |
| if (row == lastFillRow) { |
| // Compensate for rounding error |
| hAdd = parent.getHeight() - (y+hAdded); |
| } |
| for (int col = 0; col < ncols; col++) { |
| if (row * ncols + col < nComps) { |
| Component c = parent.getComponent(row * ncols + col); |
| Rectangle b = c.getBounds(); |
| c.setBounds(b.x, b.y + hAdded, b.width, b.height + hAdd); |
| } |
| } |
| hAdded += hAdd; |
| } |
| } |
| } |
| |
| // Set widths |
| nFills = 0; |
| fills = new boolean[ncols]; |
| int lastFillCol = -1; |
| |
| x = insets.left; |
| for (int col = 0; col < ncols; col++) { |
| // Find largest minimum width for this column |
| int w = 0; |
| for (int row = 0; row < nrows; row++) { |
| if (row * ncols + col < nComps) { |
| Component c = parent.getComponent(row * ncols + col); |
| w = Math.max(w, c.getMinimumSize().width); |
| } |
| } |
| // Set widths for this column |
| y = insets.top; |
| for (int row = 0; row < nrows; row++) { |
| if (row * ncols + col < nComps) { |
| JComponent c = (JComponent)parent.getComponent(row * ncols + col); |
| int h = c.getHeight(); |
| c.setBounds(x, y, w, h); |
| y += h + vgap; |
| if (row == 0 && getFillColumn(c)) { |
| fills[col] = true; |
| } |
| } |
| } |
| x += w + hgap; |
| if (fills[col]) { |
| nFills++; |
| lastFillCol = col; |
| } |
| } |
| |
| // Fill widths |
| if (nFills > 0 && x < parent.getWidth()) { |
| // How much width to add |
| int wAdd = (parent.getWidth() - x) / nFills; |
| int wAdded = 0; |
| for (int col = 0; col < ncols; col++) { |
| if (fills[col]) { |
| if (col == lastFillCol) { |
| wAdd = parent.getWidth() - (x+wAdded); |
| } |
| for (int row = 0; row < nrows; row++) { |
| if (row * ncols + col < nComps) { |
| Component c = parent.getComponent(row * ncols + col); |
| Rectangle b = c.getBounds(); |
| c.setBounds(b.x + wAdded, b.y, b.width + wAdd, b.height); |
| } |
| } |
| wAdded += wAdd; |
| } |
| } |
| } |
| } |
| |
| public Dimension preferredLayoutSize(Container parent) { |
| Insets insets = parent.getInsets(); |
| int ncomponents = parent.getComponentCount(); |
| int nrows = getRows(); |
| int ncols = getColumns(); |
| int hgap = getHgap(); |
| int vgap = getVgap(); |
| |
| if (nrows > 0) { |
| ncols = (ncomponents + nrows - 1) / nrows; |
| } else { |
| nrows = (ncomponents + ncols - 1) / ncols; |
| } |
| |
| int nComps = parent.getComponentCount(); |
| |
| int y = insets.top; |
| for (int row = 0; row < nrows; row++) { |
| int h = 0; |
| for (int col = 0; col < ncols; col++) { |
| if (row * ncols + col < nComps) { |
| Component c = parent.getComponent(row * ncols + col); |
| h = Math.max(h, c.getMinimumSize().height); |
| } |
| } |
| y += h + vgap; |
| } |
| |
| int x = insets.left; |
| for (int col = 0; col < ncols; col++) { |
| int w = 0; |
| for (int row = 0; row < nrows; row++) { |
| if (row * ncols + col < nComps) { |
| Component c = parent.getComponent(row * ncols + col); |
| w = Math.max(w, c.getMinimumSize().width); |
| } |
| } |
| x += w + hgap; |
| } |
| return new Dimension(x, y); |
| } |
| } |