/*
* Copyright (c) 2005-2006 Substance Kirill Grouchnikov. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* o Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* o Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* o Neither the name of Substance Kirill Grouchnikov nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package test.check;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.util.ArrayList;
import java.util.Iterator;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.border.TitledBorder;
public class TwoColumnPanel extends JPanel {
private static class ComponentRow {
public Component left;
public Component right;
public ComponentRow(Component left, Component right) {
this.left = left;
this.right = right;
}
}
private ArrayList rows;
private TwoColumnLayout layout;
public TwoColumnPanel() {
super();
this.rows = new ArrayList();
this.layout = new TwoColumnLayout();
this.setLayout(this.layout);
}
public void addRow(Component left, Component right) {
if ((left == null) && (right == null))
return;
ComponentRow newRow = new ComponentRow(left, right);
if (left != null)
this.add(left);
if (right != null)
this.add(right);
this.rows.add(newRow);
}
private class TwoColumnLayout implements LayoutManager {
private int verticalSpacing;
private int horizontalSpacing;
private int minimumLeftWidth;
private int minimumRightWidth;
public void setHorizontalSpacing(int horizontalSpacing) {
this.horizontalSpacing = horizontalSpacing;
}
public void setMinimumLeftWidth(int minimumLeftWidth) {
this.minimumLeftWidth = minimumLeftWidth;
}
public void setMinimumRightWidth(int minimumRightWidth) {
this.minimumRightWidth = minimumRightWidth;
}
public void setVerticalSpacing(int verticalSpacing) {
this.verticalSpacing = verticalSpacing;
}
public TwoColumnLayout() {
this.horizontalSpacing = 3;
this.verticalSpacing = 3;
this.minimumLeftWidth = 0;
this.minimumRightWidth = 0;
}
public void addLayoutComponent(String name, Component comp) {
}
public void layoutContainer(Container parent) {
Insets insets = parent.getInsets();
int y = this.horizontalSpacing + insets.top;
int leftPref = this.getPreferredLeftWidth();
int rightPref = this.getPreferredRightWidth();
double coef = (double) (parent.getWidth() - insets.left
- insets.right - 3 * this.verticalSpacing)
/ (double) (leftPref + rightPref);
int leftFinal = (int) (coef * leftPref);
int rightFinal = (int) (coef * rightPref);
int leftStart = insets.left + this.verticalSpacing;
int rightStart = leftStart + leftFinal + this.verticalSpacing;
for (Iterator it = TwoColumnPanel.this.rows.iterator(); it
.hasNext();) {
ComponentRow row = (ComponentRow) it.next();
Component left = row.left;
int hLeft = (row.left == null) ? 0
: left.getPreferredSize().height;
Component right = row.right;
int hRight = (row.right == null) ? 0
: right.getPreferredSize().height;
int h = Math.max(hLeft, hRight);
if (left != null) {
left.setBounds(leftStart, y + (h - hLeft) / 2, leftFinal,
hLeft);
}
if (right != null) {
right.setBounds(rightStart, y + (h - hRight) / 2,
rightFinal, hRight);
}
y += (this.horizontalSpacing + Math.max(hLeft, hRight));
}
}
public Dimension minimumLayoutSize(Container parent) {
return this.preferredLayoutSize(parent);
}
public Dimension preferredLayoutSize(Container parent) {
int width = 3 * this.verticalSpacing + this.getPreferredLeftWidth()
+ this.getPreferredRightWidth();
int height = this.horizontalSpacing;
for (Iterator it = TwoColumnPanel.this.rows.iterator(); it
.hasNext();) {
ComponentRow row = (ComponentRow) it.next();
int hLeft = (row.left == null) ? 0 : row.left
.getPreferredSize().height;
int hRight = (row.right == null) ? 0 : row.right
.getPreferredSize().height;
height += (this.horizontalSpacing + Math.max(hLeft, hRight));
}
return new Dimension(width, height);
}
public void removeLayoutComponent(Component comp) {
}
private int getPreferredLeftWidth() {
int maxPreferredWidth = 0;
for (Iterator it = TwoColumnPanel.this.rows.iterator(); it
.hasNext();) {
ComponentRow row = (ComponentRow) it.next();
if (row.left == null)
continue;
maxPreferredWidth = Math.max(maxPreferredWidth, row.left
.getPreferredSize().width);
}
return Math.max(maxPreferredWidth, this.minimumLeftWidth);
}
private int getPreferredRightWidth() {
int maxPreferredWidth = 0;
for (Iterator it = TwoColumnPanel.this.rows.iterator(); it
.hasNext();) {
ComponentRow row = (ComponentRow) it.next();
if (row.right == null)
continue;
maxPreferredWidth = Math.max(maxPreferredWidth, row.right
.getPreferredSize().width);
}
return Math.max(maxPreferredWidth, this.minimumRightWidth);
}
}
public void setHorizontalSpacing(int horizontalSpacing) {
this.layout.setHorizontalSpacing(horizontalSpacing);
}
public void setMinimumLeftWidth(int minimumLeftWidth) {
this.layout.setMinimumLeftWidth(minimumLeftWidth);
}
public void setMinimumRightWidth(int minimumRightWidth) {
this.layout.setMinimumRightWidth(minimumRightWidth);
}
public void setVerticalSpacing(int verticalSpacing) {
this.layout.setVerticalSpacing(verticalSpacing);
}
public static void main(String[] args) {
TwoColumnPanel panel = new TwoColumnPanel();
JPasswordField jpf1 = new JPasswordField("password", 10);
panel.addRow(new JLabel("Enabled"), jpf1);
JPasswordField jpf2 = new JPasswordField("password", 10);
jpf2.setEditable(false);
panel.addRow(new JLabel("Non-editable"), jpf2);
JPasswordField jpf3 = new JPasswordField("password", 10);
jpf3.setEnabled(false);
panel.addRow(new JLabel("Disabled"), jpf3);
JPasswordField jpf4 = new JPasswordField("password", 10);
jpf4.setEchoChar((char) 0);
panel.addRow(new JLabel("Echo char 0"), jpf4);
JPasswordField jpf5 = new JPasswordField("password", 10);
panel.addRow(new JLabel("With strength check"), jpf5);
panel.setBorder(new TitledBorder("Password field"));
JFrame frame = new JFrame();
frame.setLayout(new BorderLayout());
frame.add(panel, BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
frame.setLocation(300, 300);
frame.setVisible(true);
}
}