package org.vorthmann.zome.ui;
import java.awt.BorderLayout;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.BorderFactory;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import org.vorthmann.ui.Controller;
@SuppressWarnings("serial")
public class StrutBuilderPanel extends JPanel
{
private final Controller controller;
private final NewLengthPanel lengthPanel;
private final OrbitPanel orbitPanel;
public StrutBuilderPanel( JFrame frame, final String symmName, final Controller controller, ControlActions enabler )
{
this .controller = controller;
this .setLayout( new BorderLayout() );
// here's the containment layout...
JPanel constraintsPanel = new JPanel();
constraintsPanel .setLayout( new BorderLayout() );
final Controller symmController = this .controller .getSubController( "symmetry." + symmName );
final Controller orbitController = symmController .getSubController( "buildOrbits" );
{
orbitPanel = new OrbitPanel( orbitController, symmController .getSubController( "availableOrbits" ), enabler );
orbitPanel .setBorder( BorderFactory .createTitledBorder( "strut directions" ) );
orbitPanel .setToolTipText( "Click and drag on a ball to create a strut, using directions selected here." );
constraintsPanel .add( orbitPanel, BorderLayout.CENTER );
}
JPanel usePlanePanel = new JPanel();
usePlanePanel .setLayout( new BorderLayout() );
final JCheckBox usePlaneCheckbox = new JCheckBox( "Use working plane" );
usePlaneCheckbox .setEnabled( controller .propertyIsTrue( "workingPlaneDefined" ) );
usePlaneCheckbox .setSelected( controller .propertyIsTrue( "useWorkingPlane" ) );
usePlaneCheckbox .addActionListener( controller );
usePlaneCheckbox .setActionCommand( "toggleWorkingPlane" );
usePlanePanel .add( usePlaneCheckbox, BorderLayout.EAST );
constraintsPanel .add( usePlanePanel, BorderLayout.NORTH );
this .add( constraintsPanel, BorderLayout.CENTER );
{
lengthPanel = new NewLengthPanel( frame );
controller .addPropertyListener( lengthPanel );
lengthPanel .setBorder( BorderFactory .createTitledBorder( "strut size" ) );
this .add( lengthPanel, BorderLayout.SOUTH );
}
systemChanged( symmName );
this .controller .addPropertyListener( new PropertyChangeListener()
{
@Override
public void propertyChange( PropertyChangeEvent event )
{
switch ( event .getPropertyName() ) {
case "symmetry":
String system = (String) event .getNewValue();
systemChanged( system );
break;
case "useGraphicalViews":
orbitPanel .modeChanged( Boolean.TRUE .equals( event .getNewValue() ) );
break;
case "workingPlaneDefined":
usePlaneCheckbox .setEnabled( Boolean.TRUE .equals( event .getNewValue() ) );
break;
case "useWorkingPlane":
usePlaneCheckbox .setSelected( Boolean.TRUE .equals( event .getNewValue() ) );
break;
default:
break;
}
}
} );
}
private void systemChanged( String system )
{
Controller symmController = this .controller .getSubController( "symmetry." + system );
orbitPanel .systemChanged( symmController .getSubController( "buildOrbits" ), symmController .getSubController( "availableOrbits" ) );
final Controller orbitController = symmController .getSubController( "buildOrbits" );
String dirName = orbitController .getProperty( "selectedOrbit" );
if ( dirName == null )
lengthPanel .setVisible( false );
else {
lengthPanel .setController( orbitController .getSubController( "currentLength" ) );
lengthPanel .setVisible( true );
}
}
}