package org.javabuilders.swing;
import static org.javabuilders.swing.SwingJavaBuilder.*;
import java.applet.Applet;
import java.awt.Button;
import java.awt.Canvas;
import java.awt.CardLayout;
import java.awt.Checkbox;
import java.awt.Choice;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dialog;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Image;
import java.awt.Label;
import java.awt.LayoutManager;
import java.awt.Panel;
import java.awt.ScrollPane;
import java.awt.Scrollbar;
import java.awt.TextArea;
import java.awt.TextComponent;
import java.awt.TextField;
import java.awt.Window;
import java.beans.PropertyChangeSupport;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.swing.AbstractButton;
import javax.swing.Action;
import javax.swing.Box;
import javax.swing.ButtonGroup;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JColorChooser;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JDesktopPane;
import javax.swing.JDialog;
import javax.swing.JEditorPane;
import javax.swing.JFileChooser;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JPopupMenu;
import javax.swing.JProgressBar;
import javax.swing.JRadioButton;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JSlider;
import javax.swing.JSpinner;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.JToggleButton;
import javax.swing.JToolBar;
import javax.swing.JTree;
import javax.swing.JViewport;
import javax.swing.JWindow;
import javax.swing.ListModel;
import javax.swing.ListSelectionModel;
import javax.swing.border.Border;
import javax.swing.event.SwingPropertyChangeSupport;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import javax.swing.text.JTextComponent;
import net.miginfocom.swing.MigLayout;
import org.javabuilders.BuildResult;
import org.javabuilders.Builder;
import org.javabuilders.BuilderConfig;
import org.javabuilders.ICustomCommand;
import org.javabuilders.IStringLiteralControlConfig;
import org.javabuilders.PrefixControlDefinition;
import org.javabuilders.TypeDefinition;
import org.javabuilders.event.IBindingListener;
import org.javabuilders.event.IBindingListenerProvider;
import org.javabuilders.handler.type.FontAsValueHandler;
import org.javabuilders.handler.type.IconAsValueHandler;
import org.javabuilders.handler.type.ImageAsValueHandler;
import org.javabuilders.layout.DefaultResize;
import org.javabuilders.swing.controls.JBSeparator;
import org.javabuilders.swing.handler.SwingValidationMessageHandler;
import org.javabuilders.swing.handler.binding.BeansBindingTypeHandler;
import org.javabuilders.swing.handler.event.CommonActionListenerHandler;
import org.javabuilders.swing.handler.event.ComponentFocusListenerHandler;
import org.javabuilders.swing.handler.event.ComponentKeyListenerHandler;
import org.javabuilders.swing.handler.event.ComponentMouseListenerHandler;
import org.javabuilders.swing.handler.event.ComponentMouseMotionListenerHandler;
import org.javabuilders.swing.handler.event.ComponentMouseWheelListenerHandler;
import org.javabuilders.swing.handler.event.JFrameWindowListenerHandler;
import org.javabuilders.swing.handler.event.JListSelectionListenerHandler;
import org.javabuilders.swing.handler.event.JTabbedPaneChangeListenerHandler;
import org.javabuilders.swing.handler.event.JTableSelectionListenerHandler;
import org.javabuilders.swing.handler.event.JTreeSelectionListenerHandler;
import org.javabuilders.swing.handler.event.WindowListenerHandler;
import org.javabuilders.swing.handler.event.background.SwingBackgroundProcessingHandler;
import org.javabuilders.swing.handler.property.AbstractButtonActionCommandHandler;
import org.javabuilders.swing.handler.property.AbstractButtonTextHandler;
import org.javabuilders.swing.handler.property.ComponentSizeHandler;
import org.javabuilders.swing.handler.property.FrameExtendedStateHandler;
import org.javabuilders.swing.handler.property.JComponentGroupTitleHandler;
import org.javabuilders.swing.handler.property.JMenuItemAcceleratorHandler;
import org.javabuilders.swing.handler.property.JTextFieldActionCommandHandler;
import org.javabuilders.swing.handler.property.SwingActionTextHandler;
import org.javabuilders.swing.handler.type.ActionAsValueHandler;
import org.javabuilders.swing.handler.type.BorderAsValueHandler;
import org.javabuilders.swing.handler.type.ButtonGroupTypeHandler;
import org.javabuilders.swing.handler.type.ColorAsValueHandler;
import org.javabuilders.swing.handler.type.ContainerTypeHandler;
import org.javabuilders.swing.handler.type.DimensionAsValueHandler;
import org.javabuilders.swing.handler.type.Focus;
import org.javabuilders.swing.handler.type.FocusFinishProcessor;
import org.javabuilders.swing.handler.type.JComboBoxFinishProcessor;
import org.javabuilders.swing.handler.type.JDialogTypeHandler;
import org.javabuilders.swing.handler.type.JFormattedTextFieldTypeHandler;
import org.javabuilders.swing.handler.type.JFrameTypeHandler;
import org.javabuilders.swing.handler.type.JInternalFrameFinishProcessor;
import org.javabuilders.swing.handler.type.JListFinishProcessor;
import org.javabuilders.swing.handler.type.JSpiltPaneTypeHandler;
import org.javabuilders.swing.handler.type.JTabbedPaneTypeHandler;
import org.javabuilders.swing.handler.type.JTableFinishProcessor;
import org.javabuilders.swing.handler.type.SwingActionHandler;
import org.javabuilders.swing.handler.type.TableColumnTypeHandler;
import org.javabuilders.swing.handler.type.layout.CardLayoutTypeHandler;
import org.javabuilders.swing.handler.type.layout.FlowLayoutTypeHandler;
import org.javabuilders.swing.handler.type.layout.MigLayoutHandler;
import org.javabuilders.swing.handler.type.model.DefaultComboBoxModelHandler;
import org.jdesktop.beansbinding.Binding;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SwingJavaBuilderConfig extends BuilderConfig implements IStringLiteralControlConfig,
IBindingListenerProvider<Binding<? extends Object,? extends Object,? extends Object,? extends Object>> {
private static final Logger LOGGER = LoggerFactory.getLogger(SwingJavaBuilderConfig.class);
private Map<String,Integer> hScrollbars = new HashMap<String, Integer>();
private Map<String,Integer> vScrollbars = new HashMap<String, Integer>();
private Set<IBindingListener<Binding<? extends Object,? extends Object,? extends Object,? extends Object>>> bindingListeners =
new LinkedHashSet<IBindingListener<Binding<? extends Object,? extends Object,? extends Object,? extends Object>>>();
{
hScrollbars.put("always", JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
hScrollbars.put("asNeeded", JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
hScrollbars.put("never", JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
vScrollbars.put("always", JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
vScrollbars.put("asNeeded", JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
vScrollbars.put("never", JScrollPane.VERTICAL_SCROLLBAR_NEVER);
}
/**
* Constructor
*/
public SwingJavaBuilderConfig() {
super(SwingBackgroundProcessingHandler.getInstance(),
SwingValidationMessageHandler.getInstance(),
new ConfirmCommand());
//define aliases for AWT types
addType(
Applet.class,
Button.class,
Canvas.class,
Checkbox.class,
Choice.class,
Container.class,
Dialog.class,
Frame.class,
Label.class,
List.class,
Panel.class,
Scrollbar.class,
ScrollPane.class,
TableColumn.class,
TextArea.class,
TextComponent.class,
TextField.class,
Window.class);
//define aliases for Swing types and models
addType(
Box.class,
ButtonGroup.class,
JButton.class,
JCheckBox.class,
JCheckBoxMenuItem.class,
DefaultComboBoxModel.class,
JColorChooser.class,
JComboBox.class,
JDialog.class,
JDesktopPane.class,
JEditorPane.class,
JFrame.class,
JFileChooser.class,
JFormattedTextField.class,
JInternalFrame.class,
JLabel.class,
JLayeredPane.class,
JList.class,
JMenu.class,
JMenuBar.class,
JMenuItem.class,
JPanel.class,
JPasswordField.class,
JPopupMenu.class,
JProgressBar.class,
JRadioButton.class,
JRadioButtonMenuItem.class,
JScrollBar.class,
JScrollPane.class,
JSeparator.class,
JSlider.class,
JSpinner.class,
JSplitPane.class,
JTabbedPane.class,
JTable.class,
JTextArea.class,
JTextPane.class,
JTextField.class,
JToolBar.class,
JTree.class,
JToggleButton.class,
JViewport.class,
JWindow.class,
JBSeparator.class,
TableCellEditor.class,
TableCellRenderer.class
);
//define aliases for Swing layout managers
addType(MigLayout.class,CardLayout.class,FlowLayout.class);
addType("Action",SwingAction.class);
addType(Focus.class);
//define metadata about types
forType(AbstractButton.class)
.localize(TEXT)
.propertyHandler(AbstractButtonActionCommandHandler.getInstance(),CommonActionListenerHandler.getInstance(),
new AbstractButtonTextHandler());
forType(ButtonGroup.class)
.finishProcessor(ButtonGroupTypeHandler.getInstance())
.ignore(Builder.CONTENT)
.childrenOverride(true)
.children(AbstractButton.class,0,Integer.MAX_VALUE);
forType(Component.class)
.ignore(LAYOUT_DATA)
.propertyHandler(ComponentSizeHandler.getInstance(), ComponentFocusListenerHandler.getInstance(),
ComponentKeyListenerHandler.getInstance(), ComponentMouseListenerHandler.getInstance(),
ComponentMouseWheelListenerHandler.getInstance(), ComponentMouseMotionListenerHandler.getInstance());
forType(Container.class)
.ignore(Builder.CONSTRAINTS)
.delay(TypeDefinition.DEFAULT_DELAY_WEIGHT,LayoutManager.class)
.finishProcessor(ContainerTypeHandler.getInstance())
.defaultResize(DefaultResize.BOTH)
.children(Component.class, 0,Integer.MAX_VALUE)
.children(LayoutManager.class, 0,1)
.children(ButtonGroup.class, 0, Integer.MAX_VALUE)
.children(Action.class,0,Integer.MAX_VALUE);
forType(Dimension.class)
.valueHandler(DimensionAsValueHandler.getInstance());
forType(Font.class)
.valueHandler(FontAsValueHandler.getInstance());
forType(Frame.class).localize(TITLE)
.delay(Integer.MAX_VALUE,ComponentSizeHandler.SIZE)
.propertyHandler(FrameExtendedStateHandler.getInstance());
forType(TableColumn.class).ignore(Builder.NAME)
.localize("headerValue")
.ignore("source")
.children(TableCellEditor.class, 0,1)
.children(TableCellRenderer.class,0,2)
.children(JComboBox.class,0,1)
.children(JTextField.class,0,1)
.children(JCheckBox.class,0,1)
.typeHandler(TableColumnTypeHandler.getInstance());
forType(Window.class).localize(TITLE)
.delay(Integer.MAX_VALUE,ComponentSizeHandler.SIZE)
.propertyHandler(WindowListenerHandler.getInstance());
forType(JBSeparator.class)
.localize(TEXT)
.defaultResize(DefaultResize.X_AXIS)
.childrenOverride(true).children(0);
forType(JButton.class)
.childrenOverride(true).children(0);
forType(JComboBox.class)
.defaultResize(DefaultResize.X_AXIS)
.propertyHandler(CommonActionListenerHandler.getInstance())
.finishProcessor(new JComboBoxFinishProcessor())
.childrenOverride(true).children(ComboBoxModel.class, 0,1);
forType(DefaultComboBoxModel.class)
.afterCreationProcessor(new DefaultComboBoxModelHandler());
forType(JComponent.class)
.localize(TOOL_TIP_TEXT, JComponentGroupTitleHandler.GROUP_TITLE,
JTabbedPaneTypeHandler.TAB_ICON,
JTabbedPaneTypeHandler.TAB_TITLE,
JTabbedPaneTypeHandler.TAB_TOOLTIP)
.ignore(JTabbedPaneTypeHandler.TAB_ICON, JTabbedPaneTypeHandler.TAB_TITLE,
JTabbedPaneTypeHandler.TAB_TOOLTIP, JTabbedPaneTypeHandler.TAB_ENABLED)
.propertyHandler(JComponentGroupTitleHandler.getInstance());
forType(JDialog.class)
.typeAsMethod(JMenuBar.class, "setJMenuBar")
.finishProcessor(JDialogTypeHandler.getInstance())
.children(Action.class,0,Integer.MAX_VALUE)
.children(JMenuBar.class, 0,1);
forType(JDesktopPane.class)
.defaultResize(DefaultResize.BOTH);
forType(JFormattedTextField.class)
.defaultResize(DefaultResize.X_AXIS)
.typeHandler(JFormattedTextFieldTypeHandler.getInstance());
forType(JFrame.class)
.typeAsMethod(JMenuBar.class, "setJMenuBar")
.typeAsMethod(JDesktopPane.class, "setContentPane")
.finishProcessor(JFrameTypeHandler.getInstance())
.propertyHandler(JFrameWindowListenerHandler.getInstance())
.children(Action.class, 0,Integer.MAX_VALUE)
.children(JMenuBar.class, 0,1)
.children(JDesktopPane.class,0,1);
forType(JInternalFrame.class)
.finishProcessor(new JInternalFrameFinishProcessor());
forType(JLabel.class)
.localize(TEXT)
.childrenOverride(true).children(0);
forType(JList.class)
.defaultResize(DefaultResize.BOTH)
.finishProcessor(new JListFinishProcessor())
.propertyHandler(JListSelectionListenerHandler.getInstance())
.childrenOverride(true).children(ListModel.class,0,1);
forType(JMenu.class)
.children(ButtonGroup.class,0,Integer.MAX_VALUE);
forType(JMenuBar.class)
.allowParent(JFrame.class,JDialog.class);
forType(JMenuItem.class)
.localize(ACCELERATOR)
.propertyHandler(JMenuItemAcceleratorHandler.getInstance())
.children(JMenuItem.class,0,Integer.MAX_VALUE);
forType(JPanel.class)
.defaultResize(DefaultResize.BOTH);
forType(JPopupMenu.class)
.children(JMenuItem.class,0,Integer.MAX_VALUE);
forType(JProgressBar.class)
.defaultResize(DefaultResize.X_AXIS)
.childrenOverride(true).children(0);
forType(JSeparator.class)
.defaultResize(DefaultResize.X_AXIS)
.childrenOverride(true).children(0);
forType(JScrollPane.class)
.defaultResize(DefaultResize.BOTH)
.asMapped("verticalScrollBarPolicy", vScrollbars)
.asMapped("horizontalScrollBarPolicy", hScrollbars)
.typeAsMethod(Component.class, "setViewportView")
.propertyAlias("verticalScrollBarPolicy","vScrollBar").propertyAlias("horizontalScrollBarPolicy", "hScrollBar")
.childrenOverride(true)
.children(Component.class,0,1);
forType(JSlider.class)
.defaultResize(DefaultResize.BOTH)
.childrenOverride(true).children(0);
forType(JSpinner.class)
.defaultResize(DefaultResize.X_AXIS)
.childrenOverride(true).children(0);
forType(JSplitPane.class)
.defaultResize(DefaultResize.BOTH)
.afterCreationProcessor(JSpiltPaneTypeHandler.getInstance())
.finishProcessor(JSpiltPaneTypeHandler.getInstance())
.childrenOverride(true)
.children(Component.class, 0, 2);
forType(JTabbedPane.class)
.finishProcessor(JTabbedPaneTypeHandler.getInstance())
.defaultResize(DefaultResize.BOTH)
.propertyHandler(JTabbedPaneChangeListenerHandler.getInstance());
forType(JTable.class)
.finishProcessor(JTableFinishProcessor.getInstance())
.propertyConstants("selectionMode", ListSelectionModel.class)
.typeAsMethod(TableModel.class, "setModel")
.propertyHandler(JTableSelectionListenerHandler.getInstance())
.children(TableColumn.class, 0, Integer.MAX_VALUE)
.children(TableModel.class,0,1);
forType(JTextComponent.class)
.defaultResize(DefaultResize.BOTH);
forType(JTextField.class)
.defaultResize(DefaultResize.X_AXIS)
.propertyAlias("horizontalAlignment","hAlign")
.propertyHandler(JTextFieldActionCommandHandler.getInstance(),CommonActionListenerHandler.getInstance())
.childrenOverride(true).children(0);
forType(JToggleButton.class)
.childrenOverride(true).children(0);
forType(JTree.class)
.defaultResize(DefaultResize.BOTH)
.propertyHandler(JTreeSelectionListenerHandler.getInstance());
forType(TableCellRenderer.class)
.ignore(TableColumnTypeHandler.FOR_HEADER);
forType(MigLayout.class)
.typeHandler(MigLayoutHandler.getInstance());
forType(CardLayout.class)
.ignore(Builder.CONTENT,Builder.NAME)
.finishProcessor(CardLayoutTypeHandler.getInstance());
forType(FlowLayout.class)
.ignore(Builder.CONTENT,Builder.NAME)
.finishProcessor(FlowLayoutTypeHandler.getInstance());
forType(Action.class)
.valueHandler(ActionAsValueHandler.getInstance());
forType(Border.class)
.valueHandler(BorderAsValueHandler.getInstance());
forType(Color.class)
.valueHandler(ColorAsValueHandler.getInstance());
forType(Icon.class)
.valueHandler(IconAsValueHandler.getInstance());
forType(Image.class)
.valueHandler(ImageAsValueHandler.getInstance());
forType(SwingAction.class)
.localize(SwingJavaBuilder.TEXT, SwingJavaBuilder.TOOL_TIP_TEXT, SwingActionHandler.LONG_DESCRIPTION)
.propertyAlias(SwingActionHandler.LONG_DESCRIPTION, SwingActionHandler.LONG_DESC)
.typeHandler(SwingActionHandler.getInstance())
.propertyHandler(CommonActionListenerHandler.getInstance(),SwingActionTextHandler.getInstance())
.childrenOverride(true).children(0);
forType(Focus.class)
.finishProcessor(new FocusFinishProcessor());
//setStringLiteralControlSuffix("Label");
setStringLiteralControlPrefix("lbl");
initializeBeansBinding();
//auto-creation of controls
PrefixControlDefinition.addReservedPrefix("add"); // to avoid conflict with JPanel.add(JContainer)
Map<String,String> buttonDefaults = new HashMap<String, String>();
buttonDefaults.put("onAction", PrefixControlDefinition.SUFFIX_PASCAL_CASE);
buttonDefaults.put("text", PrefixControlDefinition.SUFFIX_LABEL);
prefix("btn",JButton.class, buttonDefaults);
prefix("tgl",JToggleButton.class, buttonDefaults);
prefix("txt",JTextField.class);
prefix("cbx",JCheckBox.class);
prefix("rb", JRadioButton.class);
prefix("cmb",JComboBox.class);
prefix("lst",JList.class);
prefix("txa",JTextArea.class);
prefix("tbl",JTable.class);
prefix("tr", JTree.class);
prefix("sld",JSlider.class);
prefix("prg",JProgressBar.class);
prefix("pwd",JPasswordField.class);
prefix("spn",JSpinner.class);
prefix("sep",JSeparator.class);
}
/**
* Adds BeansBinding support, if in path
*/
private void initializeBeansBinding() {
//allow alternate implementations of data binding for Swing
try {
Class.forName("org.jdesktop.beansbinding.Bindings");
//Beans Binding was found in path, use default binding handler
forType(BeansBindingTypeHandler.getInstance().getApplicableClass()).typeHandler(BeansBindingTypeHandler.getInstance());
} catch (ClassNotFoundException e) {
LOGGER.info("Beans Binding (JSR 295) not found in path, default BeansBindingTypeHandler not initialized.");
}
}
/* (non-Javadoc)
* @see org.javabuilders.BuilderConfig#getPropertyChangeSupport(java.lang.Object)
*/
@Override
public PropertyChangeSupport createPropertyChangeSupport(Object source) {
return new SwingPropertyChangeSupport(source);
}
private static class ConfirmCommand implements ICustomCommand<Boolean> {
public Boolean process(BuildResult result, Object source) {
Component c = null;
if (result.getCaller() instanceof Component) {
c = (Component) result.getCaller();
}
int value = JOptionPane.showConfirmDialog(c, result.getResource("question.areYouSure"),
result.getResource("title.confirmation"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
if (value == JOptionPane.YES_OPTION) {
return true;
} else {
return false;
}
}
}
/* (non-Javadoc)
* @see org.javabuilders.IStringLiteralControlConfig#getStringLiteralControlPrefix()
*/
public String getStringLiteralControlPrefix() {
return (String) getCustomProperties().get(PROPERY_STRING_LITERAL_CONTROL_PREFIX);
}
/* (non-Javadoc)
* @see org.javabuilders.IStringLiteralControlConfig#getStringLiteralControlSuffix()
*/
public String getStringLiteralControlSuffix() {
return (String) getCustomProperties().get(PROPERY_STRING_LITERAL_CONTROL_SUFFIX);
}
/* (non-Javadoc)
* @see org.javabuilders.IStringLiteralControlConfig#setStringLiteralControlPrefix(java.lang.String)
*/
public void setStringLiteralControlPrefix(String prefix) {
getCustomProperties().put(PROPERY_STRING_LITERAL_CONTROL_PREFIX, prefix);
}
/* (non-Javadoc)
* @see org.javabuilders.IStringLiteralControlConfig#setStringLiteralControlSuffix(java.lang.String)
*/
public void setStringLiteralControlSuffix(String suffix) {
getCustomProperties().put(PROPERY_STRING_LITERAL_CONTROL_SUFFIX, suffix);
}
/* (non-Javadoc)
* @see org.javabuilders.event.IBindingListenerProvider#addBindingListener(org.javabuilders.event.IBindingListener)
*/
@Override
public void addBindingListener(
IBindingListener<Binding<? extends Object, ? extends Object, ? extends Object, ? extends Object>> listener) {
bindingListeners.add(listener);
}
/* (non-Javadoc)
* @see org.javabuilders.event.IBindingListenerProvider#removeBindingListener(org.javabuilders.event.IBindingListener)
*/
@Override
public void removeBindingListener(
IBindingListener<Binding<? extends Object, ? extends Object, ? extends Object, ? extends Object>> listener) {
bindingListeners.remove(listener);
}
/* (non-Javadoc)
* @see org.javabuilders.event.IBindingListenerProvider#getBindingListeners()
*/
@SuppressWarnings("unchecked")
@Override
public IBindingListener<Binding<? extends Object, ? extends Object, ? extends Object, ? extends Object>>[] getBindingListeners() {
return bindingListeners.toArray(new IBindingListener[bindingListeners.size()]);
}
}