/* GNU GENERAL LICENSE Copyright (C) 2006 The Lobo Project. Copyright (C) 2014 - 2017 Lobo Evolution This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either verion 3 of the License, or (at your option) any later version. This program 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 License for more details. You should have received a copy of the GNU General Public along with this program. If not, see <http://www.gnu.org/licenses/>. Contact info: lobochief@users.sourceforge.net; ivan.difrancesco@yahoo.it */ package org.lobobrowser.primary.gui; import java.awt.Component; import java.awt.Dimension; import java.util.ArrayList; import java.util.Collection; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingConstants; /** * The Class FormPanel. */ public class FormPanel extends JComponent { /** The Constant serialVersionUID. */ private static final long serialVersionUID = 1L; /** The fields. */ private final Collection<FormField> fields = new ArrayList<FormField>(); /** The fields invalid. */ private boolean fieldsInvalid = false; /** * Instantiates a new form panel. */ public FormPanel() { this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); } /** * Adds the field. * * @param field * the field */ public void addField(FormField field) { // Call in GUI thread only. this.fields.add(field); this.fieldsInvalid = true; } /* * (non-Javadoc) * * @see javax.swing.JComponent#revalidate() */ @Override public void revalidate() { this.fieldsInvalid = true; super.revalidate(); } /** The min label width. */ private int minLabelWidth = 0; /** * Gets the min label width. * * @return the min label width */ public int getMinLabelWidth() { return minLabelWidth; } /** * Sets the min label width. * * @param minLabelWidth * the new min label width */ public void setMinLabelWidth(int minLabelWidth) { this.minLabelWidth = minLabelWidth; } /** * Populate components. */ private void populateComponents() { this.removeAll(); int maxWidth = this.minLabelWidth; Collection<JLabel> labels = new ArrayList<JLabel>(); boolean firstTime = true; for (FormField field : this.fields) { if (firstTime) { firstTime = false; } else { this.add(Box.createRigidArea(new Dimension(1, 4))); } JLabel label = field.getLabel(); label.setEnabled(this.isEnabled()); labels.add(label); label.setHorizontalAlignment(SwingConstants.RIGHT); String tooltip = field.getToolTip(); if (tooltip != null) { label.setToolTipText(tooltip); } Dimension prefSize = label.getPreferredSize(); if (prefSize.width > maxWidth) { maxWidth = prefSize.width; } JComponent entryPanel = new JPanel(); entryPanel.setOpaque(false); entryPanel.setLayout(new BoxLayout(entryPanel, BoxLayout.X_AXIS)); entryPanel.add(label); // entryPanel.add(new FillerComponent(label, new Dimension(100, 24), // new Dimension(100, 24), new Dimension(100, 24))); entryPanel.add(Box.createRigidArea(new Dimension(4, 1))); Component editor = field.getFieldEditor(); // Dimension eps = editor.getPreferredSize(); // editor.setPreferredSize(new Dimension(100, eps.height)); editor.setEnabled(this.isEnabled()); entryPanel.add(editor); Dimension epps = entryPanel.getPreferredSize(); entryPanel.setPreferredSize(new Dimension(100, epps.height)); this.add(entryPanel); } for (JLabel label : labels) { Dimension psize = label.getPreferredSize(); Dimension newSize = new Dimension(maxWidth, psize.height); label.setPreferredSize(newSize); label.setMinimumSize(newSize); label.setMaximumSize(newSize); } this.fieldsInvalid = false; } /* * (non-Javadoc) * * @see java.awt.Container#doLayout() */ @Override public void doLayout() { if (this.fieldsInvalid) { this.populateComponents(); } super.doLayout(); } /* * (non-Javadoc) * * @see javax.swing.JComponent#getPreferredSize() */ @Override public Dimension getPreferredSize() { if (this.fieldsInvalid) { this.populateComponents(); } return super.getPreferredSize(); } /* * (non-Javadoc) * * @see javax.swing.JComponent#getMinimumSize() */ @Override public Dimension getMinimumSize() { if (this.fieldsInvalid) { this.populateComponents(); } return super.getMinimumSize(); } /* * (non-Javadoc) * * @see javax.swing.JComponent#getMaximumSize() */ @Override public Dimension getMaximumSize() { if (this.fieldsInvalid) { this.populateComponents(); } return super.getMaximumSize(); } }