package org.vorthmann.zome.ui;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.net.URL;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.SwingConstants;
import org.vorthmann.ui.CardPanel;
import org.vorthmann.ui.Controller;
import com.jogamp.newt.event.KeyEvent;
public class ToolConfigDialog extends JDialog implements ActionListener
{
private final JButton iconButton;
private final JTextField toolName;
private final JLabel toolLabel;
private final CardPanel namePanel;
private final JTabbedPane tabs;
private final JCheckBox selectInputsCheckbox, deleteInputsCheckbox, selectOutputsCheckbox, createOutputsCheckbox;
private Controller controller;
private PropertyChangeListener checkboxChanges;
private final ActionListener closer;
public ToolConfigDialog( JFrame frame )
{
super( frame, true );
// setDefaultCloseOperation( DO_NOTHING_ON_CLOSE );
WindowListener closeEvents = new WindowAdapter()
{
@Override
public void windowClosed( WindowEvent e )
{
closer .actionPerformed( new ActionEvent( e .getSource(), 0, null ) );
super .windowClosed( e );
}
};
addWindowListener( closeEvents );
//setUndecorated( true );
setResizable( false );
setLayout( new BorderLayout() );
setTitle( "tool configuration" );
checkboxChanges = new PropertyChangeListener()
{
@Override
public void propertyChange( PropertyChangeEvent evt )
{
if ( ! ( evt .getNewValue() instanceof String ) )
return;
boolean value = Boolean .parseBoolean( (String) evt .getNewValue() );
switch ( evt .getPropertyName() ) {
case "deleteInputs":
selectInputsCheckbox .setEnabled( !value );
break;
case "selectInputs":
selectInputsCheckbox .setSelected( value );
break;
case "selectOutputs":
selectOutputsCheckbox .setSelected( value );
break;
case "createOutputs":
selectOutputsCheckbox .setEnabled( value );
break;
default:
break;
}
}
};
closer = new ActionListener()
{
@Override
public void actionPerformed( ActionEvent e )
{
setVisible( false );
controller .removePropertyListener( checkboxChanges );
controller = null;
}
};
getRootPane() .registerKeyboardAction( closer, KeyStroke.getKeyStroke( KeyEvent.VK_ESCAPE, 0 ), JComponent.WHEN_IN_FOCUSED_WINDOW );
JPanel iconAndLabel = new JPanel();
this .add( iconAndLabel, BorderLayout .NORTH );
iconAndLabel .setLayout( new BorderLayout() );
{
iconButton = new JButton();
URL imageURL = getClass() .getResource( "/icons/tools/small/scaling.png" ); // any would work; will get replaced
Icon icon = new ImageIcon( imageURL );
iconButton .setIcon( icon );
Dimension dim = new Dimension( icon .getIconWidth()+13, icon .getIconHeight()+13 );
iconButton .setPreferredSize( dim );
iconButton .setMaximumSize( dim );
iconButton .setActionCommand( "apply" );
iconButton .addActionListener( this );
iconAndLabel .add( iconButton, BorderLayout .WEST );
namePanel = new CardPanel();
{
toolName = new JTextField();
toolName .setHorizontalAlignment( SwingConstants .CENTER );
toolName .addActionListener( new ActionListener()
{
@Override
public void actionPerformed( ActionEvent e )
{
String name = toolName .getText();
controller .setProperty( "label", name );
closer .actionPerformed( e );
}
});
namePanel .add( "editable", toolName );
toolLabel = new JLabel();
toolLabel .setHorizontalAlignment( SwingConstants .CENTER );
namePanel .add( "builtin", toolLabel );
}
iconAndLabel .add( namePanel, BorderLayout .CENTER );
}
tabs = new JTabbedPane();
this .add( tabs, BorderLayout .CENTER );
{
JPanel inputsOutputs = new JPanel();
tabs .addTab( "behavior", inputsOutputs );
tabs .setSelectedIndex( 0 ); // should be "behavior" tab
inputsOutputs .setLayout( new GridLayout( 1, 2 ) );
{
JPanel inputs = new JPanel();
inputs .setBorder( BorderFactory .createTitledBorder( "inputs" ) );
inputsOutputs .add( inputs );
inputs .setLayout( new GridLayout( 2, 1 ) );
selectInputsCheckbox = new JCheckBox( "select" );
selectInputsCheckbox .setActionCommand( "selectInputs" );
selectInputsCheckbox .addActionListener( this );
inputs .add( selectInputsCheckbox );
deleteInputsCheckbox = new JCheckBox( "delete" );
deleteInputsCheckbox .setActionCommand( "deleteInputs" );
deleteInputsCheckbox .addActionListener( this );
inputs .add( deleteInputsCheckbox );
}
{
JPanel outputs = new JPanel();
outputs .setBorder( BorderFactory .createTitledBorder( "outputs" ) );
inputsOutputs .add( outputs );
outputs .setLayout( new GridLayout( 2, 1 ) );
selectOutputsCheckbox = new JCheckBox( "select" );
selectOutputsCheckbox .setActionCommand( "selectOutputs" );
selectOutputsCheckbox .addActionListener( this );
outputs .add( selectOutputsCheckbox );
createOutputsCheckbox = new JCheckBox( "create" );
createOutputsCheckbox .setActionCommand( "createOutputs" );
createOutputsCheckbox .addActionListener( this );
outputs .add( createOutputsCheckbox );
}
JPanel showParamsPanel = new JPanel();
tabs .add( "parameters", showParamsPanel );
showParamsPanel .setLayout( new BorderLayout() );
JButton showParamsButton = new JButton( "Show and select parameters" );
showParamsPanel .add( showParamsButton, BorderLayout .SOUTH );
showParamsButton .setActionCommand( "selectParams" );
showParamsButton .addActionListener( this );
}
pack();
}
public void showTool( JButton button, Controller controller )
{
this.controller = controller;
this.controller .addPropertyListener( checkboxChanges );
iconButton .setIcon( button .getIcon() );
String label = controller .getProperty( "label" ) ;
toolName .setText( label );
toolLabel .setText(label );
namePanel .showCard( controller .propertyIsTrue( "predefined" )? "builtin" : "editable" );
boolean selectInputs = controller .propertyIsTrue( "selectInputs" );
selectInputsCheckbox .setSelected( selectInputs );
boolean deleteInputs = controller .propertyIsTrue( "deleteInputs" );
deleteInputsCheckbox .setSelected( deleteInputs );
selectInputsCheckbox .setEnabled( ! deleteInputs );
boolean selectOutputs = controller .propertyIsTrue( "selectOutputs" );
selectOutputsCheckbox .setSelected( selectOutputs );
boolean createOutputs = controller .propertyIsTrue( "createOutputs" );
createOutputsCheckbox .setSelected( createOutputs );
selectOutputsCheckbox .setEnabled( createOutputs );
tabs .setSelectedIndex( 0 ); // should be "behavior" tab
setLocationRelativeTo( button );
setVisible( true );
}
@Override
public void actionPerformed( ActionEvent e )
{
this .controller .actionPerformed( e );
switch ( e .getActionCommand() ) {
case "apply":
case "selectParams":
closer .actionPerformed( e );
break;
default:
break;
}
}
}