# MultiList (Javadocs: controlP5)
Date: 2014-04-27

controlP5

## Class MultiList

- java.lang.Object
- - controlP5.Controller<MultiList>
  - - controlP5.MultiList

All Implemented Interfaces:
  CDrawable, ControllerInterface<MultiList>, ControlListener, ControlP5Constants

    public class MultiList
    extends Controller<MultiList>
    implements ControlListener

A Multilist is a multi-menu-tree controller. see the example for more information and how to use.

+Example
  `

      /**
       * ControlP5 MultiList
       * by andreas schlegel, 2009
       */

      import controlP5.*;

      ControlP5 controlP5;
      MultiList l;

      void setup() {
        size(700,400);
        frameRate(30);
        controlP5 = new ControlP5(this);

        // add a multiList to controlP5.
        // elements of the list have default dimensions
        // here, a width of 100 and a height of 12
        l = controlP5.addMultiList("myList",20,20,100,12);

        // create a multiListButton which we will use to
        // add new buttons to the multilist
        MultiListButton b;
        b = l.add("level1",1);

        // add items to a sublist of button "level1"
        b.add("level11",11).setLabel("level1 item1");
        b.add("level12",12).setLabel("level1 item2");

        b = l.add("level2",2);

        int cnt = 100;

        // add some more sublists.
        for(int i=0;i<10;i++) {
          MultiListButton c = b.add("level2"+(i+1),20+i+1);
          c.setLabel("level2 item"+(i+1));
          c.setColorBackground(color(64 + 18*i,0,0));

          if(i==4) {
          // changing the width and the height of a button
          // will be inherited by its sublists.
          c.setWidth(100);
          c.setHeight(20);
          }
          cnt++;

          if(i==4) {
            for(int j=0;j<10;j++) {
              cnt++;
              MultiListButton d;
              d = c.add("level2"+i+""+j,250+j+1);
              d.setLabel("level2 item"+(i+1)+" "+"item"+(j+1));
              d.setColorBackground(color(64 + 18*j,(64 + 18*j)/2,0));
              d.setId(cnt);
              d.setWidth(200);
            }
          }
        }

        MultiListButton cc = (MultiListButton)controlP5.controller("level21");
        cc.setHeight(40);
      }

      void controlEvent(ControlEvent theEvent) {
        println(theEvent.controller().name()+" = "+theEvent.value());
        // uncomment the line below to remove a multilist item when clicked.
        // theEvent.controller().remove();
      }

      void draw() {
        background(0);
      }

      void keyPressed() {
        if(controlP5.controller("level23")!=null) {
          println("removing multilist button level23.");
          controlP5.controller("level23").remove();
        }
      }

  `

### Field Summary

Fields
`int` `closeDelay`

### Fields inherited from class controlP5.Controller

`autoHeight, autoSpacing, autoWidth`

### Fields inherited from interface controlP5.ControlP5Constants

`acceptClassList, ACTION_BROADCAST, ACTION_CLICK, ACTION_DRAG, ACTION_ENTER, ACTION_EXIT, ACTION_LEAVE, ACTION_MOVE, ACTION_PRESS, ACTION_PRESSED, ACTION_RELEASE, ACTION_RELEASED, ACTION_RELEASEDOUTSIDE, ACTION_WHEEL, ACTIVE, ALL, ALT, AQUA, ARC, ARRAY, BACKSPACE, BASELINE, BITFONT, BLACK, BLUE, BOOLEAN, BOTTOM, BOTTOM_OUTSIDE, CAPTIONLABEL, CENTER, CHECKBOX, COMMANDKEY, CONTROL, controlEventClass, CUSTOM, DECREASE, DEFAULT, DELETE, DONE, DOWN, DROPDOWN, ELLIPSE, ENTER, ESCAPE, EVENT, eventMethod, FADEIN, FADEOUT, FIELD, FLOAT, FUCHSIA, GRAY, GREEN, grixel, HALF_PI, HIDE, HIGHLIGHT, HORIZONTAL, IDLE, IMAGE, INACTIVE, INCREASE, INTEGER, INVALID, J2D, KEYCONTROL, LEFT, LEFT_OUTSIDE, LIME, LINE, LIST, LOAD, MAROON, MENU, METHOD, MOVE, MULTI, MULTIPLES, NAVY, OLIVE, ORANGE, OVER, P2D, P3D, PI, PRESSED, PRINT, PURPLE, RED, RELEASE, RESET, RIGHT, RIGHT_OUTSIDE, SAVE, SHIFT, SILVER, SINGLE, SINGLE_COLUMN, SINGLE_ROW, SPRITE, standard56, standard58, STRING, SWITCH, SWITCH_BACK, SWITCH_FORE, synt24, TAB, TEAL, THEME_A, THEME_CP52014, THEME_CP5BLUE, THEME_RED, THEME_RETRO, THEME_WHITE, TOP, TOP_OUTSIDE, TRANSITION_WAIT_FADEIN, TREE, TWO_PI, UP, VALUELABEL, VERBOSE, VERTICAL, WAIT, WHITE, YELLOW`

### Constructor Summary

Constructors
Constructor and Description
`MultiList(ControlP5 theControlP5, java.lang.String theName)` Convenience constructor to extend MultiList.
`MultiList(ControlP5 theControlP5, Tab theParent, java.lang.String theName, int theX, int theY, int theWidth, int theHeight)`

### Method Summary

Methods
`MultiListButton` `add(java.lang.String theName, int theValue)` adds multilist buttons to the multilist.
`void` `close()`
`void` `close(controlP5.MultiListInterface theInterface)`
`void` `controlEvent(ControlEvent theEvent)` controlEvent is called by controlP5's ControlBroadcaster to inform available listeners about value changes.
`void` `draw(processing.core.PGraphics theGraphics)` the default draw function for each controller extending superclass Controller.
`java.util.List<MultiListButton>` `getChildren()` Deprecated.
`int` `getDirection()`
`java.lang.String` `name()`
`boolean` `observe()`
`void` `occupied(boolean theFlag)`
`void` `open()`
`void` `remove()` removes the multilist.
`void` `setup()`
`MultiList` `setValue(float theValue)`
`java.util.List<MultiListButton>` `subelements()` Deprecated.
`MultiList` `toUpperCase(boolean theValue)`
`MultiList` `update()` updates the value of the controller without having to set the value explicitly.
`boolean` `update(processing.core.PApplet theApplet)`
`void` `updateLocation(float theX, float theY)`

### Methods inherited from class controlP5.Controller

`add, addCallback, addListener, align, bringToFront, bringToFront, changeValue, continuousUpdateEvents, getAbsolutePosition, getAddress, getArrayValue, getArrayValue, getBehavior, getCaptionLabel, getColor, getControllerPlugList, getControlWindow, getDecimalPrecision, getDefaultValue, getHeight, getId, getInfo, getLabel, getMax, getMin, getName, getParent, getPickingColor, getPointer, getPosition, getProperty, getProperty, getStringValue, getTab, getValue, getValueLabel, getView, getWidth, getWindow, hide, init, isActive, isBroadcast, isInside, isLabelVisible, isListening, isLock, isMouseOver, isMousePressed, isMoveable, isUpdate, isUserInteraction, isVisible, keyEvent, linebreak, listen, listenerSize, lock, moveTo, moveTo, moveTo, moveTo, moveTo, moveTo, moveTo, moveTo, moveTo, plugTo, plugTo, plugTo, plugTo, registerProperty, registerProperty, registerTooltip, remove, removeBehavior, removeCallback, removeCallback, removeListener, removeProperty, removeProperty, setAbsolutePosition, setAddress, setArrayValue, setArrayValue, setBehavior, setBroadcast, setCaptionLabel, setColor, setColorActive, setColorBackground, setColorCaptionLabel, setColorForeground, setColorValueLabel, setDecimalPrecision, setDefaultValue, setGroup, setGroup, setHeight, setId, setImage, setImage, setImages, setImages, setImages, setLabelVisible, setLock, setMax, setMin, setMouseOver, setMousePressed, setMoveable, setParent, setPosition, setPosition, setSize, setSize, setStringValue, setTab, setTab, setUpdate, setUserInteraction, setValueLabel, setValueSelf, setView, setView, setVisible, setWidth, show, toString, unlock, unplugFrom, unplugFrom, unregisterTooltip, updateAbsolutePosition, updateEvents, updateInternalEvents, updateSize`

### Methods inherited from class java.lang.Object

`equals, getClass, hashCode, notify, notifyAll, wait, wait, wait`

### Methods inherited from interface controlP5.ControllerInterface

`parent, setColorLabel, setColorValue, setLabel`

### Field Detail

#### closeDelay

    public int closeDelay

### Constructor Detail

#### MultiList

    public MultiList(ControlP5 theControlP5,
             java.lang.String theName)

Convenience constructor to extend MultiList.

Parameters:
  `theControlP5` -
  `theName` -

+Example
  `

      /**
       * ControlP5 extending Controllers
       *
       * the following example shows how to extend the Controller class to
       * create customizable Controllers. You can either extend the Controller class itself,
       * or any class that extends Controller itself like the Slider, Button, DropdownList, etc.
       *
       * How to:
       *
       * 1) do a super call to the convenience constructor requiring
       * 2 parameter (ControlP5 instance, name)
       *
       * 2) the Controller class has a set of empty methods that allow you to capture
       * inputs from the mouse including
       * onEnter(), onLeave(), onPress(), onRelease(), onClick(), onScroll(int), onDrag()
       * These you can override and include functionality as needed.
       *
       * 3) use method getPointer() to return the local (relative)
       * xy-coordinates of the controller
       *
       * 4) after instantiation custom controllers are treated the same
       * as default controlP5 controllers.
       *
       * by Andreas Schlegel, 2012
       * www.sojamo.de/libraries/controlp5
       *
       */

      import controlP5.*;

      ControlP5 cp5;
      PApplet p;

      void setup() {
        size(400, 400);
        cp5 = new ControlP5(this);

        // create 2 groups to show nesting of custom controllers and
        //
        Group g1 = cp5.addGroup("a").setPosition(0,100).setWidth(180);
        Group g2 = cp5.addGroup("b").setPosition(0,10).setWidth(180);
        g2.moveTo(g1);

        // create 2 custom Controllers from class MyButton
        // MyButton extends Controller and inherits all methods accordingly.
        new MyButton(cp5, "b1").setPosition(0, 0).setSize(180, 200).moveTo(g2);
        new MyButton(cp5, "b2").setPosition(205, 15).setSize(180, 200);

      }

      void draw() {
        background(0);
      }

      // b1 will be called from Controller b1
      public void b1(float theValue) {
        println("yay button "+theValue);
      }

      public void controlEvent(ControlEvent theEvent) {
        println("controlEvent : "+theEvent);
      }

      // Create a custom Controller, please not that
      // MyButton extends Controller<MyButton>, <MyButton>
      // is an indicator for the super class about the type of
      // custom controller to be created.

      class MyButton extends Controller<MyButton> {

        int current = 0xffff0000;

        float a = 128;

        float na;

        int y;

        // use the convenience constructor of super class Controller
        // MyButton will automatically registered and move to the
        // default controlP5 tab.

        MyButton(ControlP5 cp5, String theName) {
          super(cp5, theName);

          // replace the default view with a custom view.
          setView(new ControllerView() {
            public void display(PApplet p, Object b) {
              // draw button background
              na += (a-na) * 0.1;
              p.fill(current,na);
              p.rect(0, 0, getWidth(), getHeight());

              // draw horizontal line which can be moved on the x-axis
              // using the scroll wheel.
              p.fill(0,255,0);
              p.rect(0,y,width,10);

              // draw the custom label
              p.fill(128);
              translate(0,getHeight()+14);
              p.text(getName(),0,0);
              p.text(getName(),0,0);

            }
          }
          );
        }

        // override various input methods for mouse input control
        void onEnter() {
          cursor(HAND);
          println("enter");
          a = 255;
        }

        void onScroll(int n) {
          println("scrolling");
          y -= n;
          y = constrain(y,0,getHeight()-10);
        }

        void onPress() {
          println("press");
          current = 0xffffff00;
        }

        void onClick() {
          Pointer p1 = getPointer();
          println("clicked at "+p1.x()+", "+p1.y());
          current = 0xffffff00;
          setValue(y);
        }

        void onRelease() {
          println("release");
          current = 0xffffffff;
        }

        void onMove() {
          println("moving "+this+" "+_myControlWindow.getMouseOverList());
        }

        void onDrag() {
          current = 0xff0000ff;
          Pointer p1 = getPointer();
          float dif = dist(p1.px(),p1.py(),p1.x(),p1.y());
          println("dragging at "+p1.x()+", "+p1.y()+" "+dif);
        }

        void onReleaseOutside() {
          onLeave();
        }

        void onLeave() {
          println("leave");
          cursor(ARROW);
          a = 128;
        }
      }

  `

#### MultiList

    public MultiList(ControlP5 theControlP5,
             Tab theParent,
             java.lang.String theName,
             int theX,
             int theY,
             int theWidth,
             int theHeight)

### Method Detail

#### add

    public MultiListButton add(java.lang.String theName,
                      int theValue)

adds multilist buttons to the multilist.

Parameters:
  `theName` - String
  `theValue` - int
Returns:
  MultiListButton

#### close

    public void close()

#### close

    public void close(controlP5.MultiListInterface theInterface)

Parameters:
  `theInterface` - MultiListInterface

#### controlEvent

    public void controlEvent(ControlEvent theEvent)

Description copied from interface: `ControlListener`
controlEvent is called by controlP5's ControlBroadcaster to inform available listeners about value changes. Use the CallbackListener to get informed when actions such as pressed, release, drag, etc are performed.

Specified by:
  `controlEvent` in interface `ControlListener`
Parameters:
  `theEvent` -
See Also:
  `CallbackListener`, `CallbackEvent`

#### draw

    public void draw(processing.core.PGraphics theGraphics)

the default draw function for each controller extending superclass Controller. This draw function will take care of default matrix operations and will call the display function of the current ControllerView object active for this particular controller.

Specified by:
  `draw` in interface `CDrawable`
Specified by:
  `draw` in interface `ControllerInterface<MultiList>`
Overrides:
  `draw` in class `Controller<MultiList>`
See Also:
  `ControllerView`

#### getChildren

    @Deprecated
    public java.util.List<MultiListButton> getChildren()

Deprecated.

#### getDirection

    public int getDirection()

#### observe

    public boolean observe()

Returns:
  boolean

#### occupied

    public void occupied(boolean theFlag)

Parameters:
  `theFlag` - boolean

#### open

    public void open()

#### remove

    public void remove()

removes the multilist.

Specified by:
  `remove` in interface `ControllerInterface<MultiList>`
Overrides:
  `remove` in class `Controller<MultiList>`

#### setup

    public void setup()

#### setValue

    public MultiList setValue(float theValue)

Specified by:
  `setValue` in interface `ControllerInterface<MultiList>`
Overrides:
  `setValue` in class `Controller<MultiList>`
Parameters:
  `theValue` - float

#### subelements

    @Deprecated
    public java.util.List<MultiListButton> subelements()

Deprecated.

#### toUpperCase

    public MultiList toUpperCase(boolean theValue)

#### update

    public MultiList update()

updates the value of the controller without having to set the value explicitly. update does not visually update the controller. the updating status can be set with setUpdate(true/false) and checked with isUpdate().

Specified by:
  `update` in interface `ControllerInterface<MultiList>`
Overrides:
  `update` in class `Controller<MultiList>`
Returns:
  Controller
See Also:
  `Controller.setUpdate(boolean)`, `Controller.isUpdate()`

#### update

    public boolean update(processing.core.PApplet theApplet)

Parameters:
  `theApplet` -
Returns:
  boolean

#### updateLocation

    public void updateLocation(float theX,
                      float theY)

Parameters:
  `theX` - float
  `theY` - float

#### name

    public java.lang.String name()