Package de.sciss.eisenkraut.net

Source Code of de.sciss.eisenkraut.net.OSCGUI$OSCMenuCheck

/*
*  OSCGUI.java
*  Eisenkraut
*
*  Copyright (c) 2004-2014 Hanns Holger Rutz. All rights reserved.
*
*  This software is published under the GNU General Public License v3+
*
*
*  For further information, please contact Hanns Holger Rutz at
*  contact@sciss.de
*
*
*  Changelog:
*    10-Sep-06  created
*    07-May-08  removing necessity to compile with SwingOSC (just using reflection)
*/

package de.sciss.eisenkraut.net;

import java.awt.event.ActionEvent;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.InetSocketAddress;
import java.net.MalformedURLException;
import java.net.SocketAddress;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.regex.Pattern;
import javax.swing.KeyStroke;

import de.sciss.app.AbstractApplication;
import de.sciss.common.BasicApplication;
import de.sciss.common.BasicWindowHandler;
import de.sciss.gui.BooleanPrefsMenuAction;
import de.sciss.gui.KeyStrokeTextField;
import de.sciss.gui.MenuAction;
import de.sciss.gui.MenuCheckItem;
import de.sciss.gui.MenuGroup;
import de.sciss.gui.MenuItem;
import de.sciss.gui.MenuNode;
import de.sciss.gui.MenuRoot;
import de.sciss.gui.MenuSeparator;
import de.sciss.net.OSCChannel;
import de.sciss.net.OSCMessage;
//import de.sciss.swingosc.SwingOSC;
import de.sciss.util.Disposable;
import de.sciss.util.DynamicURLClassLoader;

/**
*   A basic management for custom menus via OSC and access to SwingOSC
*
@author    Hanns Holger Rutz
@version  0.71, 13-Jul-09
*/
public class OSCGUI
implements OSCRouter, Disposable
{
  private static final String    OSC_GUI      = "gui";
//  private static final String    OSC_ID      = "id";
 
  private static final int    SWING_PORT    = 12345;
 
  public static final String    KEY_SWINGAPP  = "swingapp";
 
  private final OSCRouterWrapper  osc;
  private final MenuBuilder    mb;
//  private final WindowBuilder    wb;
 
  private Object          swingOSC    = null;
//  private SwingOSC        swingOSC    = null;
 
  public OSCGUI()
  {
    osc      = new OSCRouterWrapper( OSCRoot.getInstance(), this );
    mb      = new MenuBuilder( this );
// SwingOSC should be used now for windows
//    wb      = new WindowBuilder( this );
  }

  // ------------ Disposable interface ------------
 
  public void dispose()
  {
    mb.dispose();
//    wb.dispose();
    osc.remove();
  }
 
  public Object getSwingOSC()
  {
    return swingOSC;
  }

  // ------------ OSCRouter interface ------------

  public String oscGetPathComponent()
  {
    return OSC_GUI;
  }
 
  public void oscRoute( RoutedOSCMessage rom )
  {
//    if( rom.hasNext() ) {
//      oscRouteNext( rom.next() );
//    } else {
      osc.oscRoute( rom );
//    }
  }
 
  public void oscAddRouter( OSCRouter subRouter )
  {
    osc.oscAddRouter( subRouter );
  }
 
  public void oscRemoveRouter( OSCRouter subRouter )
  {
    osc.oscRemoveRouter( subRouter );
  }

  public void oscCmd_initSwing( RoutedOSCMessage rom )
  {
    if( swingOSC != null ) return;
 
    final DynamicURLClassLoader  cl = new DynamicURLClassLoader( getClass().getClassLoader() );
    final Class          clz;
   
    try {
      cl.addURL( new File( OSCRoot.getInstance().getPreferences().get( KEY_SWINGAPP, null )).toURI().toURL() );
      clz = Class.forName( "de.sciss.swingosc.SwingOSC", true, cl );
//      swingOSC = new SwingOSC();
      swingOSC = clz.newInstance();
      // start( String protocol, int port, boolean loopBack, int bufSize, boolean initSwing, SocketAddress helloAddr)
//      swingOSC.start( OSCChannel.TCP, 12345, true, 8192, false, null );
      final Method m = clz.getMethod( "start", new Class[] {
        String.class, Integer.TYPE, Boolean.TYPE, Integer.TYPE,
        Boolean.TYPE, InetSocketAddress.class });
      m.invoke( swingOSC, new Object[] { OSCChannel.TCP, new Integer( SWING_PORT ),
        Boolean.TRUE, new Integer( 65536 ), Boolean.FALSE, null });
    }
    catch( MalformedURLException e1 ) {
      OSCRoot.failed( rom, e1 );
    }
    catch( ClassNotFoundException e1 ) {
      OSCRoot.failed( rom, e1 );
    }
    catch( IllegalAccessException e1 ) {
      OSCRoot.failed( rom, e1 );
    }
    catch( InstantiationException e1 ) {
      OSCRoot.failed( rom, e1 );
    }
    catch( NoSuchMethodException e1 ) {
      OSCRoot.failed( rom, e1 );
    }
    catch( InvocationTargetException e1 ) {
      OSCRoot.failed( rom, e1 );
    }
//    catch( IOException e1 ) {
//      OSCRoot.failed( rom, e1 );
//    }
  }

  public Object oscQuery_swingPort()
  {
//    return new Integer( swingOSC == null ? 0 : swingOSC.getLocalAddress().getPort() );
    return new Integer( swingOSC == null ? 0 : SWING_PORT );
  }

  public Object oscQuery_swingProtocol()
  {
//    return( swingOSC == null ? (Object) new Integer( 0 ) : (Object) swingOSC.getProtocol() );
    return( swingOSC == null ? (Object) new Integer( 0 ) : (Object) OSCChannel.TCP );
  }

  public Object oscQuery_swingRunning()
  {
    return new Integer( swingOSC != null ? 1 : 0 );
  }

  // ===================================================================================================
  // --------------- internal classes ---------------
 
  protected static class MenuBuilder
  implements OSCRouter, Disposable
  {
    private static final String    OSC_MENU    = "menu";

    private static final Pattern  ptrnPeriod    = Pattern.compile( "\\." );
   
//    private int            uniqueID    = 0;

    private final OSCRouterWrapper  osc;
//    private final OSCGUI      gui;
    private final MenuRoot      mr;
    private final Map        mapNodes    = new HashMap();

    protected MenuBuilder( OSCRouter superRouter )
    {
//      this.gui  = gui;
      osc      = new OSCRouterWrapper( superRouter, this );
      mr      = ((BasicApplication) AbstractApplication.getApplication()).getMenuBarRoot();
    }

    // ------------ Disposable interface ------------

    public void dispose()
    {
      for( Iterator iter = mapNodes.values().iterator(); iter.hasNext(); ) {
        ((OSCMenuNode) iter.next()).dispose();
      }
      mapNodes.clear();
      osc.remove();
    }

    // ------------ OSCRouter interface ------------

    public String oscGetPathComponent()
    {
      return OSC_MENU;
    }
   
    public void oscRoute( RoutedOSCMessage rom )
    {
      osc.oscRoute( rom );
    }
   
    public void oscAddRouter( OSCRouter subRouter )
    {
      osc.oscAddRouter( subRouter );
    }

    public void oscRemoveRouter( OSCRouter subRouter )
    {
      osc.oscRemoveRouter( subRouter );
    }

    // add <(int) id> <(String) type> <(String) menuHierarchy> [<(String) text> <(String) keyStroke|(int) 0>]
    // where type is one of "item", "check" (n.y.i.), "separator"
    public void oscCmd_add( RoutedOSCMessage rom )
    {
      final int      id;
      final Object    idObj;
      final String    type;
      final int      typeIdx;
      final String[]    hierarchy;
      final String    text;
      final KeyStroke    stroke;
      final OSCMenuNode  n;
      MenuGroup      mg, parent;
      int          argIdx    = 1;
     
      try {
        id      = ((Number) rom.msg.getArg( argIdx )).intValue();
        idObj    = new Integer( id );
        if( mapNodes.containsKey( idObj )) {
          OSCRoot.failed( rom.msg, OSCRoot.getResourceString( "errOSCNodeExists" ));
          return;
        }
        argIdx++;
        typeIdx    = argIdx;
        type    = rom.msg.getArg( typeIdx ).toString();
        argIdx++;
        hierarchy  = ptrnPeriod.split( rom.msg.getArg( argIdx ).toString() );
        if( hierarchy.length < 1 ) {
          OSCRoot.failedArgValue( rom, argIdx );
          return;
        }
        parent  = mr;
        for( int i = 0; i < hierarchy.length; i++ ) {
          mg  = (MenuGroup) parent.get( hierarchy[ i ]);
//          if( mg == null ) {
//            mg = new MenuGroup( "oscAuto_" + (uniqueID++), hierarchy[ i ]);
//            parent.add( mg );
//          }
          if( mg == null ) {
            OSCRoot.failed( rom.msg, OSCRoot.getResourceString( "errOSCParentNotFound" ) + " (" + idObj + ")" );
            return;
          }
          parent  = mg;
        }
       
        if( rom.msg.getArgCount() > (argIdx + 1) ) {
          argIdx++;
          text  = rom.msg.getArg( argIdx ).toString();
          if( rom.msg.getArgCount() > (argIdx + 1) ) {
            argIdx++;
            stroke  = KeyStrokeTextField.prefsToStroke( rom.msg.getArg( argIdx ).toString() );
          } else {
            stroke  = null;
          }
        } else {
          text  = null;
          stroke  = null;
        }
       
        if( type.equals( "item" )) {
          n = new OSCMenuItem( this, id, rom.addr, parent, text, stroke );
        } else if( type.equals( "group" )) {
          n = new OSCMenuGroup( this, id, rom.addr, parent, text, stroke );
        } else if( type.equals( "separator" )) {
          n = new OSCMenuSeparator( this, id, rom.addr, parent );
        } else if( type.equals( "check" )) {
          n = new OSCMenuCheck( this, id, rom.addr, parent, text, stroke );
        } else {
          OSCRoot.failedArgValue( rom, typeIdx );
          return;
        }
        n.install();
        mapNodes.put( idObj, n );
      }
      catch( ClassCastException e1 ) {
        OSCRoot.failedArgValue( rom, argIdx );
      }
      catch( IndexOutOfBoundsException e1 ) {
        OSCRoot.failedArgCount( rom );
      }
    }
   
    // remove <(int) id>
    public void oscCmd_remove( RoutedOSCMessage rom )
    {
      final Object    idObj;
      final OSCMenuNode  n;
      int          argIdx    = 1;
     
      try {
        idObj    = new Integer( ((Number) rom.msg.getArg( argIdx )).intValue() );
        n      = (OSCMenuNode) mapNodes.remove( idObj );
        if( n == null ) {
          OSCRoot.failed( rom.msg, OSCRoot.getResourceString( "errOSCNodeNotFound" ) + " (" + idObj + ")" );
          return;
        }
        n.dispose();
      }
      catch( IndexOutOfBoundsException e1 ) {
        OSCRoot.failedArgCount( rom );
      }
    }

    protected void reply( OSCMenuNode n )
    {
      reply( n, null );
    }

    protected void reply( OSCMenuNode n, Object[] extraArgs )
    {
      final OSCRoot server  = OSCRoot.getInstance();
     
      if( !server.isRunning() ) return;
     
      final Object[]  args  = new Object[ extraArgs == null ? 2 : extraArgs.length + 2 ];
   
      args[ 0 ] = new Integer( n.getID() );
      args[ 1 ] = "action";
      for( int i = 0, j = 2; j < args.length; i++, j++ ) {
        args[ j ] = extraArgs[ i ];
      }
   
      try {
        server.send( new OSCMessage( "/gui/menu", args ), n.getAddress() );
      }
      catch( IOException e1 ) {
        BasicWindowHandler.showErrorDialog( null, e1, n.getText() );
      }
    }
  }
 
  private static interface OSCMenuNode
  extends Disposable
  {
    public abstract void install();
    public abstract int getID();
    public abstract String getText();
    public abstract SocketAddress getAddress();
  }
 
  private static class OSCMenuItem
  extends MenuAction
  implements OSCMenuNode
  {
    private final MenuBuilder  mb;
    private final int      id;
    protected final MenuGroup  parent;
    private final SocketAddress  addr;
    protected MenuNode      n;
 
    protected OSCMenuItem( MenuBuilder mb, int id, SocketAddress addr, MenuGroup parent, String text, KeyStroke stroke )
    {
      super( text, stroke );
      this.mb    = mb;
      this.id    = id;
      this.addr  = addr;
      this.parent  = parent;
    }
   
    public void install()
    {
      n = new MenuItem( "osc_" + id, this );
      parent.add( n );
    }

    public void dispose()
    {
      parent.remove( n );
    }
   
    public int getID()
    {
      return id;
    }
   
    public String getText()
    {
      return getValue( NAME ).toString();
    }
   
    public SocketAddress getAddress()
    {
      return addr;
    }
   
    public void actionPerformed( ActionEvent e )
    {
      mb.reply( this );
    }
  }

  private static class OSCMenuGroup
  extends OSCMenuItem
  {
    protected OSCMenuGroup( MenuBuilder mb, int id, SocketAddress addr, MenuGroup parent, String text, KeyStroke stroke )
    {
      super( mb, id, addr, parent, text, stroke );
    }
   
    // override superclass
    public void install()
    {
      n = new MenuGroup( "osc_" + getID(), this );
      parent.add( n );
    }
  }

  private static class OSCMenuSeparator
  implements OSCMenuNode
  {
//    private final MenuBuilder  mb;
    private final int      id;
    private final SocketAddress  addr;
    private final MenuGroup    parent;
    private MenuNode      n;
 
    protected OSCMenuSeparator( MenuBuilder mb, int id, SocketAddress addr, MenuGroup parent )
    {
//      this.mb    = mb;
      this.id    = id;
      this.addr  = addr;
      this.parent  = parent;
    }
   
    public void install()
    {
      n = new MenuSeparator();
      parent.add( n );
    }

    public void dispose()
    {
      parent.remove( n );
    }

    public int getID()
    {
      return id;
    }
   
    public String getText()
    {
      return null;
    }
   
    public SocketAddress getAddress()
    {
      return addr;
    }
  }

  private static class OSCMenuCheck
  extends BooleanPrefsMenuAction
  implements OSCMenuNode
  {
    private final MenuBuilder  mb;
    private final int      id;
//    private MenuNode      n;
    private MenuCheckItem    n;
    private final MenuGroup    parent;
    private final SocketAddress  addr;
 
    protected OSCMenuCheck( MenuBuilder mb, int id, SocketAddress addr, MenuGroup parent, String text, KeyStroke stroke )
    {
      super( text, stroke );
      this.mb    = mb;
      this.id    = id;
      this.addr  = addr;
      this.parent  = parent;
    }
   
    public void install()
    {
      n = new MenuCheckItem( "osc_" + id, this );
      parent.add( n );
      setCheckItem( n );
    }

    public void dispose()
    {
      parent.remove( n );
    }
   
    public int getID()
    {
      return id;
    }
   
    public String getText()
    {
      return getValue( NAME ).toString();
    }
   
    public SocketAddress getAddress()
    {
      return addr;
    }
   
    public void actionPerformed( ActionEvent e )
    {
      super.actionPerformed( e );
     
      mb.reply( this, new Object[] { "selected", new Integer( n.isSelected() ? 1 : 0 )});
    }
  }
 
  // ===================================================================================================

/*
  private static class WindowBuilder
  implements OSCRouter, Disposable
  {
    private static final String    OSC_WINDOW    = "window";

    private final OSCRouterWrapper  osc;
//    private final OSCGUI      gui;
    private final Map        mapNodes    = new HashMap();
 
    private WindowBuilder( OSCRouter superRouter )
    {
//      this.gui  = gui;
      osc      = new OSCRouterWrapper( superRouter, this );
    }

    // ------------ Disposable interface ------------

    public void dispose()
    {
      for( Iterator iter = mapNodes.values().iterator(); iter.hasNext(); ) {
        ((OSCWindow) iter.next()).dispose();
      }
      mapNodes.clear();
      osc.remove();
    }
   
    // ------------ OSCRouter interface ------------

    public String oscGetPathComponent()
    {
      return OSC_WINDOW;
    }
   
    public void oscRoute( RoutedOSCMessage rom )
    {
      osc.oscRoute( rom );
    }
   
    public void oscAddRouter( OSCRouter subRouter )
    {
      osc.oscAddRouter( subRouter );
    }

    public void oscRemoveRouter( OSCRouter subRouter )
    {
      osc.oscRemoveRouter( subRouter );
    }

    // add <(int) id> <(String) type> <(String) title> [<(int) resizable=0|1>]
    // where type is one of "frame", "palette"
    public void oscCmd_add( RoutedOSCMessage rom )
    {
      final int      id;
      final Object    idObj;
      final String    typeStr;
      final int      type;
      final String    title;
      final boolean    resizable;
      final OSCWindow    n;
      int          argIdx    = 1;
     
      try {
        id      = ((Number) rom.msg.getArg( argIdx )).intValue();
        idObj    = new Integer( id );
        if( mapNodes.containsKey( idObj )) {
          OSCRoot.failed( rom.msg, OSCRoot.getResourceString( "errOSCNodeExists" ));
          return;
        }
        argIdx++;
        typeStr    = rom.msg.getArg( argIdx ).toString();
        if( typeStr.equals( "frame" )) {
          type  = AbstractWindow.SUPPORT;
        } else if( typeStr.equals( "palette" )) {
          type  = AbstractWindow.PALETTE;
        } else{
          OSCRoot.failedArgValue( rom, argIdx );
          return;
        }
        argIdx++;
        title    = rom.msg.getArg( argIdx ).toString();
 
        if( rom.msg.getArgCount() > (argIdx + 1) ) {
          argIdx++;
          resizable  = ((Number) rom.msg.getArg( argIdx )).intValue() != 0;
        } else {
          resizable  = false;
        }
       
        n  = new OSCWindow( this, id, rom.addr, type, title, resizable );
//        n.install();
        mapNodes.put( idObj, n );
      }
      catch( ClassCastException e1 ) {
        OSCRoot.failedArgValue( rom, argIdx );
      }
      catch( IndexOutOfBoundsException e1 ) {
        OSCRoot.failedArgCount( rom );
      }
    }

    // remove <(int) id>
    public void oscCmd_remove( RoutedOSCMessage rom )
    {
      final Object    idObj;
      final OSCWindow    n;
      int          argIdx    = 1;
     
      try {
        idObj    = new Integer( ((Number) rom.msg.getArg( argIdx )).intValue() );
        n      = (OSCWindow) mapNodes.remove( idObj );
        if( n == null ) {
          OSCRoot.failed( rom.msg, OSCRoot.getResourceString( "errOSCNodeNotFound" ) + " (" + idObj + ")" );
          return;
        }
        n.dispose();
      }
      catch( IndexOutOfBoundsException e1 ) {
        OSCRoot.failedArgCount( rom );
      }
    }
  }

  private static class OSCWindow
  extends AppWindow
  implements OSCRouter
  {
    private final WindowBuilder    wb;
    private final int        id;
    private final String      idStr;
    private final String      fullOSCAddr;
    private final SocketAddress    addr;
    private final OSCRouterWrapper  osc;
    private final SpringPanel    panel;
    private final Map        mapNodes  = new HashMap();
    private boolean          layoutDirty  = false;
 
    private OSCWindow( WindowBuilder wb, int id, SocketAddress addr, int type, String title, boolean resizable )
    {
      super( type );
      setTitle( title );
      setResizable( resizable );
     
      this.wb    = wb;
      this.id    = id;
      idStr    = String.valueOf( id );
      fullOSCAddr  = "/gui/window/" + idStr;
      this.addr  = addr;
      osc      = new OSCRouterWrapper( wb, this );
      panel    = new SpringPanel( 2, 1, 2, 1 );
     
//      setSize( new Dimension( 400, 400 ));
      setLocationRelativeTo( null );
     
      getContentPane().add( panel, BorderLayout.CENTER );
     
      init();
    }
 
    public void dispose()
    {
      for( Iterator iter = mapNodes.values().iterator(); iter.hasNext(); ) {
        ((OSCGadgetNode) iter.next()).dispose();
      }
      mapNodes.clear();
      osc.remove();
      super.dispose();
    }

    protected boolean restoreVisibility()
    {
      return false;
    }

    private void reply( OSCGadgetNode n )
    {
      reply( n, null );
    }

    private void reply( OSCGadgetNode n, Object[] extraArgs )
    {
      final OSCRoot server  = OSCRoot.getInstance();
     
      if( !server.isRunning() ) return;
     
      final Object[]  args  = new Object[ extraArgs == null ? 2 : extraArgs.length + 2 ];
   
      args[ 0 ] = new Integer( n.getID() );
      args[ 1 ] = "action";
      for( int i = 0, j = 2; j < args.length; i++, j++ ) {
        args[ j ] = extraArgs[ i ];
      }
   
      try {
        server.send( new OSCMessage( fullOSCAddr, args ), n.getAddress() );
      }
      catch( IOException e1 ) {
        GUIUtil.displayError( getWindow(), e1, n.getText() );
      }
    }


    // ------------ OSCRouter interface ------------

    public String oscGetPathComponent()
    {
      return idStr;
    }
   
    public void oscRoute( RoutedOSCMessage rom )
    {
      osc.oscRoute( rom );
    }
   
    public void oscAddRouter( OSCRouter subRouter )
    {
      osc.oscAddRouter( subRouter );
    }

    public void oscRemoveRouter( OSCRouter subRouter )
    {
      osc.oscRemoveRouter( subRouter );
    }
   
    public void oscCmd_show( RoutedOSCMessage rom )
    {
      if( isVisible() ) return;
     
      if( layoutDirty ) {
        panel.makeCompactGrid();
        pack();
        layoutDirty = false;
      }
      setVisible( true );
      toFront();
    }
   
    public void oscCmd_hide( RoutedOSCMessage rom )
    {
      setVisible( false );
    }

    // add <(int) id> <(String) type> <(int) x> <(int) y> [<(int) w> [<(int) h> [<(int) fill> [<float> alignH> [<float> alignV>]]]]]
    // where type is one of "label", "hslider", "vslider", "knob", "choice", "check", "button", "text", "number", "help"
    // ; where fill is one of 0 (NONE), 1 (BOTH), 2 (HORIZONTAL), 3 (VERTICAL)
    // ; where alignH and alignV = 0 (top/left) ... 1 (bottom/right)
    public void oscCmd_add( RoutedOSCMessage rom )
    {
      final int      id;
      final Object    idObj;
      final String    type;
      final int      typeIdx;
      final int      gridX, gridY, gridW, gridH;
      final boolean    fillH, fillV;
      final float      alignH, alignV;
      final JComponent  jc;
      final OSCGadgetNode  n;
      int          argIdx    = 1;
     
      try {
        id      = ((Number) rom.msg.getArg( argIdx )).intValue();
        idObj    = new Integer( id );
        if( mapNodes.containsKey( idObj )) {
          OSCRoot.failed( rom.msg, OSCRoot.getResourceString( "errOSCNodeExists" ));
          return;
        }
        argIdx++;
        typeIdx    = argIdx;
        type    = rom.msg.getArg( typeIdx ).toString();
        argIdx++;
        gridX    = ((Number) rom.msg.getArg( argIdx )).intValue();
        argIdx++;
        gridY    = ((Number) rom.msg.getArg( argIdx )).intValue();
        if( rom.msg.getArgCount() > (argIdx + 1) ) {
          argIdx++;
          gridW  = ((Number) rom.msg.getArg( argIdx )).intValue();
          if( gridW < 1 ) {
            OSCRoot.failedArgValue( rom, argIdx );
            return;
          }
          if( rom.msg.getArgCount() > (argIdx + 1) ) {
            argIdx++;
            gridH  = ((Number) rom.msg.getArg( argIdx )).intValue();
            if( gridH < 1 ) {
              OSCRoot.failedArgValue( rom, argIdx );
              return;
            }
            if( rom.msg.getArgCount() > (argIdx + 1) ) {
              argIdx++;
              switch( ((Number) rom.msg.getArg( argIdx )).intValue() ) {
              case 0:
                fillH  = false;
                fillV  = false;
                break;
              case 1:
                fillH  = true;
                fillV  = true;
                break;
              case 2:
                fillH  = true;
                fillV  = false;
                break;
              case 3:
                fillH  = false;
                fillV  = true;
                break;
              default:
                OSCRoot.failedArgValue( rom, argIdx );
                return;
              }
              if( rom.msg.getArgCount() > (argIdx + 1) ) {
                argIdx++;
                alignH = ((Number) rom.msg.getArg( argIdx )).floatValue();
                if( alignH < 0f || alignH > 1f ) {
                  OSCRoot.failedArgValue( rom, argIdx );
                  return;
                }
                if( rom.msg.getArgCount() > (argIdx + 1) ) {
                  argIdx++;
                  alignV = ((Number) rom.msg.getArg( argIdx )).floatValue();
                  if( alignV < 0f || alignV > 1f ) {
                    OSCRoot.failedArgValue( rom, argIdx );
                    return;
                  }
                } else {
                  alignV  = 0f;
                }
              } else {
                alignH  = 0f;
                alignV  = 0f;
              }
            } else {
              fillH  = false;
              fillV  = false;
              alignH  = 0f;
              alignV  = 0f;
            }
          } else {
            gridH  = 1;
            fillH  = false;
            fillV  = false;
            alignH  = 0f;
            alignV  = 0f;
          }
        } else {
          gridW  = 1;
          gridH  = 1;
          fillH  = false;
          fillV  = false;
          alignH  = 0f;
          alignV  = 0f;
        }
       
        if( type.equals( "label" )) {
          n = new OSCGadgetLabel( this, id, rom.addr );
        } else if( type.equals( "hslider" )) {
          n = new OSCGadgetSlider( this, id, rom.addr, JSlider.HORIZONTAL );
        } else if( type.equals( "vslider" )) {
          n = new OSCGadgetSlider( this, id, rom.addr, JSlider.VERTICAL );
//        } else if( type.equals( "knob" )) {
//          n = new OSCGadgetKnob( this, id, rom.addr );
        } else if( type.equals( "choice" )) {
          n = new OSCGadgetChoice( this, id, rom.addr );
        } else if( type.equals( "check" )) {
          n = new OSCGadgetCheck( this, id, rom.addr );
        } else if( type.equals( "button" )) {
          n = new OSCGadgetButton( this, id, rom.addr );
//        } else if( type.equals( "text" )) {
//          n = new OSCGadgetText( this, id, rom.addr );
//        } else if( type.equals( "number" )) {
//          n = new OSCGadgetNumber( this, id, rom.addr );
//        } else if( type.equals( "help" )) {
//          n = new OSCGadgetHelp( this, id, rom.addr );
        } else {
          OSCRoot.failedArgValue( rom, typeIdx );
          return;
        }
//        n.install();
        jc = n.createGadget();
        jc.setFont( AbstractApplication.getApplication().getGraphicsHandler().getFont( GraphicsHandler.FONT_SYSTEM | GraphicsHandler.FONT_SMALL ));
jc.setAlignmentX( alignH );
jc.setAlignmentY( alignV );
        panel.gridAdd( jc, gridX, gridY, fillH ? gridW : -gridW, fillV ? gridH : -gridH );
        // XXX deal with alignment
        mapNodes.put( idObj, n );
        if( isVisible() ) {
          panel.makeCompactGrid();
        } else {
          layoutDirty  = true;
        }
      }
      catch( ClassCastException e1 ) {
        OSCRoot.failedArgValue( rom, argIdx );
      }
      catch( IndexOutOfBoundsException e1 ) {
        OSCRoot.failedArgCount( rom );
      }
    }
  }

//  private static interface OSCGadgetNode
//  extends Disposable
//  {
//    public abstract void install();
//    public abstract int getID();
//    public abstract String getText();
//    public abstract SocketAddress getAddress();
//  }
 
  private static abstract class OSCGadgetNode
  implements OSCRouter, Disposable
  {
    protected final OSCWindow    parent;
    private final int        id;
    private final String      idStr;
    private final SocketAddress    addr;
    private final OSCRouterWrapper  osc;
 
    protected OSCGadgetNode( OSCWindow parent, int id, SocketAddress addr )
    {
      this.parent  = parent;
      this.id    = id;
      idStr    = String.valueOf( id );
      this.addr  = addr;
      osc      = new OSCRouterWrapper( parent, this );
    }
 
    public int getID()
    {
      return id;
    }
   
   
    public SocketAddress getAddress()
    {
      return addr;
    }
   
    public void dispose()
    {
      parent.getContentPane().remove( getGadget() );
      osc.remove();
    }

    public abstract JComponent createGadget();
    public abstract String getText();
    protected abstract JComponent getGadget();

    // ------------ OSCRouter interface ------------

    public String oscGetPathComponent()
    {
      return idStr;
    }
   
    public void oscRoute( RoutedOSCMessage rom )
    {
      osc.oscRoute( rom );
    }
   
    public void oscAddRouter( OSCRouter subRouter )
    {
      osc.oscAddRouter( subRouter );
    }
   
    public void oscRemoveRouter( OSCRouter subRouter )
    {
      osc.oscRemoveRouter( subRouter );
    }

    public void oscCmd_setEnabled( RoutedOSCMessage rom )
    {
      if( rom.msg.getArgCount() == 2 ) {
        if( rom.msg.getArg( 1 ) instanceof Number ) {
          getGadget().setEnabled( ((Number) rom.msg.getArg( 1 )).intValue() != 0 );
        } else {
          OSCRoot.failedArgType( rom, 1 );
        }
      } else {
        OSCRoot.failedArgCount( rom );
      }
    }
  }
 
  private static class OSCGadgetLabel
  extends OSCGadgetNode
  {
    private JLabel  gg  = null;
 
    private OSCGadgetLabel( OSCWindow parent, int id, SocketAddress addr )
    {
      super( parent, id, addr );
    }
   
    public JComponent createGadget()
    {
      if( gg != null ) throw new IllegalStateException();
      gg = new JLabel();
      return gg;
    }
   
    protected JComponent getGadget()
    {
      return gg;
    }

    public String getText()
    {
      return gg.getText();
    }
   
//    public void dispose()
//    {
//      super.dispose();
//    }
   
    public void oscCmd_setText( RoutedOSCMessage rom )
    {
      if( rom.msg.getArgCount() == 2 ) {
        gg.setText( rom.msg.getArg( 1 ).toString() );
      } else {
        OSCRoot.failedArgCount( rom );
      }
    }
  }

  private static class OSCGadgetSlider
  extends OSCGadgetNode
  implements ChangeListener
  {
    private JSlider    gg    = null;
    private final int  orient;
 
    private OSCGadgetSlider( OSCWindow parent, int id, SocketAddress addr, int orient )
    {
      super( parent, id, addr );
      this.orient  = orient;
    }
   
    public JComponent createGadget()
    {
      if( gg != null ) throw new IllegalStateException();
      gg = new JSlider( orient );
      gg.setMaximum( 0x10000 );
      gg.addChangeListener( this );
      return gg;
    }
   
    protected JComponent getGadget()
    {
      return gg;
    }

    public String getText()
    {
      return( "Slider (" + getID() + ")" );
    }
   
    public void dispose()
    {
      if( gg != null ) gg.removeChangeListener( this );
      super.dispose();
    }
   
    public void oscCmd_setValue( RoutedOSCMessage rom )
    {
      if( rom.msg.getArgCount() == 2 ) {
        if( rom.msg.getArg( 1 ) instanceof Number ) {
          gg.setValue( (int) (((Number) rom.msg.getArg( 1 )).doubleValue() * 0x10000 + 0.5) );
        } else {
          OSCRoot.failedArgType( rom, 1 );
        }
      } else {
        OSCRoot.failedArgCount( rom );
      }
    }
   
    // ---------- ChangeListener interface ----------
   
    public void stateChanged( ChangeEvent e )
    {
      parent.reply( this, new Object[] { "value", new Double( (double) gg.getValue() / 0x10000 ), "adjusting",
        new Integer( gg.getValueIsAdjusting() ? 1 : 0 )});
    }
  }

  private static class OSCGadgetChoice
  extends OSCGadgetNode
  implements ActionListener
  {
    private JComboBox  gg  = null;
 
    private OSCGadgetChoice( OSCWindow parent, int id, SocketAddress addr )
    {
      super( parent, id, addr );
    }
   
    public JComponent createGadget()
    {
      if( gg != null ) throw new IllegalStateException();
      gg = new JComboBox();
      gg.addActionListener( this );
      return gg;
    }
   
    protected JComponent getGadget()
    {
      return gg;
    }

    public String getText()
    {
      return( "Choice (" + getID() + ")" );
    }
   
    public void dispose()
    {
      if( gg != null ) gg.removeActionListener( this );
      super.dispose();
    }
   
    public void oscCmd_setValue( RoutedOSCMessage rom )
    {
      if( rom.msg.getArgCount() == 2 ) {
        if( rom.msg.getArg( 1 ) instanceof Number ) {
          gg.setSelectedIndex( (int) (((Number) rom.msg.getArg( 1 )).intValue()) );
        } else {
          OSCRoot.failedArgType( rom, 1 );
        }
      } else {
        OSCRoot.failedArgCount( rom );
      }
    }
   
    public void oscCmd_setItems( RoutedOSCMessage rom )
    {
      gg.removeAllItems();
      for( int i = 1; i < rom.msg.getArgCount(); i++ ) {
        gg.addItem( rom.msg.getArg( i ));
      }
    }
   
    // ---------- ActionListener interface ----------
   
    public void actionPerformed( ActionEvent e )
    {
      parent.reply( this, new Object[] { "value", new Integer( gg.getSelectedIndex() )});
    }
  }

  private static class OSCGadgetCheck
  extends OSCGadgetNode
  implements ActionListener
  {
    private JCheckBox  gg  = null;
 
    private OSCGadgetCheck( OSCWindow parent, int id, SocketAddress addr )
    {
      super( parent, id, addr );
    }
   
    public JComponent createGadget()
    {
      if( gg != null ) throw new IllegalStateException();
      gg = new JCheckBox();
      gg.addActionListener( this );
      return gg;
    }
   
    protected JComponent getGadget()
    {
      return gg;
    }

    public String getText()
    {
      return( gg.getText() );
    }
   
    public void dispose()
    {
      if( gg != null ) gg.removeActionListener( this );
      super.dispose();
    }
   
    public void oscCmd_setValue( RoutedOSCMessage rom )
    {
      if( rom.msg.getArgCount() == 2 ) {
        if( rom.msg.getArg( 1 ) instanceof Number ) {
          gg.setSelected( (int) ((Number) rom.msg.getArg( 1 )).intValue() != 0 );
        } else {
          OSCRoot.failedArgType( rom, 1 );
        }
      } else {
        OSCRoot.failedArgCount( rom );
      }
    }

    public void oscCmd_setText( RoutedOSCMessage rom )
    {
      if( rom.msg.getArgCount() == 2 ) {
        gg.setText( rom.msg.getArg( 1 ).toString() );
      } else {
        OSCRoot.failedArgCount( rom );
      }
    }
   
    // ---------- ActionListener interface ----------
   
    public void actionPerformed( ActionEvent e )
    {
      parent.reply( this, new Object[] { "value", new Integer( gg.isSelected() ? 1 : 0 )});
    }
  }

  private static class OSCGadgetButton
  extends OSCGadgetNode
  implements ActionListener
  {
    private JButton  gg  = null;
 
    private OSCGadgetButton( OSCWindow parent, int id, SocketAddress addr )
    {
      super( parent, id, addr );
    }
   
    public JComponent createGadget()
    {
      if( gg != null ) throw new IllegalStateException();
      gg = new JButton();
      gg.addActionListener( this );
      return gg;
    }
   
    protected JComponent getGadget()
    {
      return gg;
    }

    public String getText()
    {
      return( gg.getText() );
    }
   
    public void dispose()
    {
      if( gg != null ) gg.removeActionListener( this );
      super.dispose();
    }
   
    public void oscCmd_setText( RoutedOSCMessage rom )
    {
      if( rom.msg.getArgCount() == 2 ) {
        gg.setText( rom.msg.getArg( 1 ).toString() );
      } else {
        OSCRoot.failedArgCount( rom );
      }
    }
   
    // ---------- ActionListener interface ----------
   
    public void actionPerformed( ActionEvent e )
    {
      parent.reply( this );
    }
  }
*/
}
TOP

Related Classes of de.sciss.eisenkraut.net.OSCGUI$OSCMenuCheck

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.