/*****************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
****************************************************************/
package org.apache.cayenne.modeler.util;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.FlowLayout;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.FormLayout;
/**
* Implements a set of utility methods for laying out components on the panels.
*
*/
// TODO: get rid of PanelFactory in favor of JGoodies Forms
public class PanelFactory {
/**
* Creates and returns a panel with right-centered buttons.
*/
public static JPanel createButtonPanel(JButton[] buttons) {
JPanel panel = new JPanel();
panel.setBorder(BorderFactory.createEmptyBorder(3, 20, 3, 7));
panel.setLayout(new FlowLayout(FlowLayout.RIGHT));
for (JButton button : buttons) {
panel.add(button);
}
return panel;
}
public static JPanel createForm(
String title,
String[] labels,
Component[] components) {
Component[] jlabels = new Component[labels.length];
for (int i = 0; i < labels.length; i++) {
jlabels[i] = new JLabel(labels[i]);
}
return createForm(title, jlabels, components);
}
public static JPanel createForm(
Component[] leftComponents,
Component[] rightComponents) {
return createForm(null, leftComponents, rightComponents);
}
/**
* Create panel with aligned labels on the right and fields on the left.
*/
public static JPanel createForm(
String title,
Component[] leftComponents,
Component[] rightComponents) {
if (leftComponents.length != rightComponents.length) {
throw new IllegalArgumentException(
"Arrays must be the same size, instead got "
+ leftComponents.length
+ "and "
+ rightComponents.length);
}
int numRows = leftComponents.length;
if (numRows == 0) {
throw new IllegalArgumentException("Zero components.");
}
FormLayout layout = new FormLayout("right:100, 3dlu, left:300", "");
DefaultFormBuilder builder = new DefaultFormBuilder(layout);
builder.setDefaultDialogBorder();
if (title != null) {
builder.appendSeparator(title);
}
for (int i = 0; i < numRows; i++) {
builder.append(leftComponents[i], rightComponents[i]);
builder.nextLine();
}
return builder.getPanel();
}
/**
* Creates panel with table within scroll panel and buttons in the bottom.
* Also sets the resizing and selection policies of the table to
* AUTO_RESIZE_OFF and SINGLE_SELECTION respectively.
*/
public static JPanel createTablePanel(JTable table, JButton[] buttons) {
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout(5, 5));
// Create table with two columns and no rows.
table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
// Panel to add space between table and EAST/WEST borders
panel.add(new JScrollPane(table), BorderLayout.CENTER);
// Add Add and Remove buttons
if (buttons != null) {
panel.add(createButtonPanel(buttons), BorderLayout.SOUTH);
}
return panel;
}
/** Creates panel with table within scroll panel and buttons in the bottom.
* Also sets the resizing and selection policies of the table to
* AUTO_RESIZE_OFF and SINGLE_SELECTION respectively.*/
public static JPanel createTablePanel(
JTable table,
JComponent[] components,
JButton[] buttons) {
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout(5, 5));
JPanel temp_panel = new JPanel(new BorderLayout());
// Create table with two columns and no rows.
table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
JScrollPane scroll_pane = new JScrollPane(table);
temp_panel.add(scroll_pane, BorderLayout.CENTER);
for (JComponent component : components) {
JPanel temp = new JPanel(new BorderLayout());
temp.add(temp_panel, BorderLayout.CENTER);
temp.add(component, BorderLayout.SOUTH);
temp_panel = temp;
}
panel.add(temp_panel, BorderLayout.CENTER);
if (buttons != null) {
panel.add(createButtonPanel(buttons), BorderLayout.SOUTH);
}
return panel;
}
}