package com.vzome.desktop.controller; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Hashtable; import javax.swing.BorderFactory; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSlider; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.vorthmann.ui.Controller; /** * Description here. * * @author Scott Vorthmann 2003 */ public class ViewPlatformControlPanel extends JPanel { protected JSlider zslider; // protected final ViewPlatformTrackball mTrackball; // // protected ViewPlatformTrackball.Snapper mSnapper; // // private ViewPlatformModel mView; private static final float MAG_PER_TICKS = -50f, MAX_MAG = 4f, MIN_MAG = -2f; private JPanel trackpad; private static int magToTicks( float magnification ) { magnification = Math.max( magnification, MIN_MAG ); magnification = Math.min( magnification, MAX_MAG ); return Math.round( MAG_PER_TICKS * ( magnification - 1f ) ); } private static float ticksToMag( int ticks ) { return ( ticks / MAG_PER_TICKS ) + 1f; } // public float zoomAdjusted( int amt ) // { // int curAmt = zslider .getValue(); // zslider .setValue( curAmt - amt ); // return ticksToMag( zslider .getValue() ); // } public ViewPlatformControlPanel( Component modelPanel, final Controller controller ) { this .setBorder( BorderFactory .createTitledBorder( "viewing" ) ); int nearTicks = magToTicks( MAX_MAG ); int farTicks = magToTicks( MIN_MAG ); float startMag = Float .parseFloat( controller .getProperty( "magnification" ) ); int startTicks = magToTicks( startMag ); final boolean isEditor = controller .userHasEntitlement( "lesson.edit" ) && ! controller .propertyIsTrue( "reader.preview" ); zslider = new JSlider( JSlider .VERTICAL, nearTicks, farTicks, startTicks ); zslider .addChangeListener( new ChangeListener() { @Override public void stateChanged( ChangeEvent e ) { controller .setProperty( "magnification", Float .toString( ticksToMag( zslider .getValue() ) ) ); // if ( mView != null ) // mView .setMagnification( ticksToMag( zslider .getValue() ) ); } } ); zslider .setBorder( BorderFactory .createTitledBorder( "distance" ) ); zslider .setMajorTickSpacing( 50 ); zslider .setMinorTickSpacing( 10 ); Hashtable<Integer, JComponent> labelTable = new Hashtable<>(); labelTable.put( nearTicks, new JLabel("far") ); // I don't know why these are reversed labelTable.put( farTicks, new JLabel("near") ); zslider.setLabelTable( labelTable ); zslider .setPaintTicks( true ); zslider .setPaintLabels( true ); zslider .setToolTipText( "adjust viewing distance" ); setLayout( new BorderLayout() ); if ( isEditor ) add( zslider, BorderLayout .EAST ); trackpad = new JPanel( new BorderLayout() ); trackpad .add( modelPanel, BorderLayout.CENTER ); trackpad .setAlignmentX( JLabel .CENTER_ALIGNMENT ); trackpad .setBorder( BorderFactory .createTitledBorder( "rotation trackball" ) ); trackpad .setMinimumSize( new Dimension( 100, 100 ) ); trackpad .setPreferredSize( new Dimension( 200, 200 ) ); if ( isEditor ) add( trackpad, BorderLayout .CENTER ); JPanel topPanel = new JPanel( new BorderLayout() ); add( topPanel, BorderLayout .NORTH ); JPanel checkboxesPanel = new JPanel(); topPanel .add( checkboxesPanel, BorderLayout.CENTER ); final JCheckBox perspectiveCheckbox = new JCheckBox( "perspective" ); // checkbox .setHorizontalAlignment( SwingConstants.LEFT ); perspectiveCheckbox .addActionListener( controller ); perspectiveCheckbox .setActionCommand( "togglePerspective" ); perspectiveCheckbox .setSelected( "true" .equals( controller .getProperty( "perspective" ) ) ); checkboxesPanel .add( perspectiveCheckbox ); final JCheckBox snapperCheckbox = new JCheckBox( "snap" ); // checkbox .setHorizontalAlignment( SwingConstants.LEFT ); snapperCheckbox .addActionListener( controller ); snapperCheckbox .setActionCommand( "toggleSnap" ); snapperCheckbox .setSelected( "true" .equals( controller .getProperty( "snap" ) ) ); checkboxesPanel .add( snapperCheckbox ); final JCheckBox stereoCheckbox = new JCheckBox( "stereo" ); // checkbox .setHorizontalAlignment( SwingConstants.LEFT ); stereoCheckbox .addActionListener( controller ); stereoCheckbox .setActionCommand( "toggleStereo" ); stereoCheckbox .setSelected( "true" .equals( controller .getProperty( "stereo" ) ) ); // stereoCheckbox .setEnabled( false ); checkboxesPanel .add( stereoCheckbox ); this .addMouseWheelListener( new MouseWheelListener() { @Override public void mouseWheelMoved( MouseWheelEvent e ) { int amt = e .getWheelRotation(); int curAmt = zslider .getValue(); zslider .setValue( curAmt - amt ); // controller .setProperty( "magnification", Float .toString( ticksToMag( curAmt - amt ) ) ); } } ); // TODO this is silly, to have both getProperty and addPropertyListener perspectiveCheckbox .setSelected( "true" .equals( controller .getProperty( "perspective" ) ) ); snapperCheckbox .setSelected( "true" .equals( controller .getProperty( "snap" ) ) ); stereoCheckbox .setSelected( "true" .equals( controller .getProperty( "stereo" ) ) ); controller .addPropertyListener( new PropertyChangeListener() { @Override public void propertyChange( PropertyChangeEvent e ) { if ( "magnification" .equals( e .getPropertyName() ) ) { float mag = Float .parseFloat( (String) e .getNewValue() ); zslider .setValue( magToTicks( mag ) ); } else if ( "perspective" .equals( e .getPropertyName() ) ) { boolean enabling = ((Boolean) e .getNewValue()) .booleanValue(); perspectiveCheckbox .setSelected( enabling ); } else if ( "snap" .equals( e .getPropertyName() ) ) { boolean enabling = ((Boolean) e .getNewValue()) .booleanValue(); snapperCheckbox .setSelected( enabling ); } else if ( "stereo" .equals( e .getPropertyName() ) ) { boolean enabling = ((Boolean) e .getNewValue()) .booleanValue(); stereoCheckbox .setSelected( enabling ); } else if ( "editor.mode" .equals( e .getPropertyName() ) ) { if ( isEditor ) switchToMode( (String) e .getNewValue() ); } } } ); } protected void switchToMode( String mode ) { if ( "model" .equals( mode ) ) { this .trackpad .setVisible( true ); this .zslider .setVisible( true ); } else { this .trackpad .setVisible( false ); this .zslider .setVisible( false ); } } }