Package com.neophob.sematrix.gui

Source Code of com.neophob.sematrix.gui.GeneratorGui

/**
* Copyright (C) 2011-2013 Michael Vogt <michu@neophob.com>
*
* This file is part of PixelController.
*
* PixelController is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PixelController is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PixelController.  If not, see <http://www.gnu.org/licenses/>.
*/
package com.neophob.sematrix.gui;


import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.text.WordUtils;
import org.apache.commons.lang3.time.DurationFormatUtils;

import processing.core.PApplet;
import processing.core.PImage;

import com.neophob.sematrix.core.color.ColorSet;
import com.neophob.sematrix.core.effect.Effect.EffectName;
import com.neophob.sematrix.core.generator.ColorScroll.ScrollMode;
import com.neophob.sematrix.core.generator.Generator.GeneratorName;
import com.neophob.sematrix.core.glue.Collector;
import com.neophob.sematrix.core.glue.FileUtils;
import com.neophob.sematrix.core.glue.OutputMapping;
import com.neophob.sematrix.core.glue.PresetSettings;
import com.neophob.sematrix.core.glue.ShufflerOffset;
import com.neophob.sematrix.core.glue.Visual;
import com.neophob.sematrix.core.jmx.TimeMeasureItemGlobal;
import com.neophob.sematrix.core.mixer.Mixer.MixerName;
import com.neophob.sematrix.core.output.IOutput;
import com.neophob.sematrix.core.properties.ConfigConstant;
import com.neophob.sematrix.core.properties.ValidCommands;
import com.neophob.sematrix.core.resize.Resize.ResizeName;
import com.neophob.sematrix.core.sound.BeatToAnimation;
import com.neophob.sematrix.core.sound.ISound;
import com.neophob.sematrix.gui.callback.GuiUpdateFeedback;
import com.neophob.sematrix.gui.handler.KeyboardHandler;
import com.neophob.sematrix.gui.model.WindowSizeCalculator;

import controlP5.Button;
import controlP5.CheckBox;
import controlP5.ControlP5;
import controlP5.ControllerInterface;
import controlP5.DropdownList;
import controlP5.Label;
import controlP5.RadioButton;
import controlP5.Slider;
import controlP5.Tab;
import controlP5.Textfield;
import controlP5.Textlabel;
import controlP5.Toggle;


/**
* Display the internal Visual buffers in full resolution
*
* @author michu
*/
public class GeneratorGui extends PApplet implements GuiCallbackAction {

    /** The Constant serialVersionUID. */
    private static final long serialVersionUID = 2344499301021L;

    private static final int SELECTED_MARKER = 10;

    private static final int MINIMAL_VISUAL_WIDTH = 120;

    private static final int GENERIC_X_OFS = 5;
    private static final int GENERIC_Y_OFS = 8;

    private static final int NR_OF_WIDGETS = 4;
    private static final int WIDGET_BOARDER = 10;
    private static final int WIDGET_BAR_SIZE = 6;
   
    private static final String ALWAYS_VISIBLE_TAB = "global"; //$NON-NLS-1$

    /** The log. */
    private static final Logger LOG = Logger.getLogger(GeneratorGui.class.getName());

    /** The y. */
    private int windowWidth,windowHeight;

    /** The p image. */
    private PImage pImage=null;
    private PImage logo;

    private ControlP5 cp5;
    private DropdownList generatorListOne, effectListOne;
    private DropdownList generatorListTwo, effectListTwo;
    private DropdownList mixerList;
    private RadioButton selectedVisualList;
    private RadioButton selectedOutputs;
    private Button randomSelection, randomPresets;
    private RadioButton randomButtons;
    private Textfield textGenerator;

    private Slider brightnessControll;
    private Toggle freeze;
   
    //Effect Tab   
    private Slider thresholdSlider, fxRotoSlider; 
    private DropdownList textureDeformOptions, zoomOptions;
   
    //Generator Tab
    private DropdownList blinkenLightsList, imageList, textwriterOption, beatWorkmode; 
    private Label passThroughMode;
    private Slider generatorSpeedSlider;
   
    //Output Tab
    private DropdownList dropdownOutputVisual;
    private DropdownList dropdownOutputFader;   

    //All Output Tab
    private DropdownList allOutputTabVis;
    private DropdownList allOutputTabFader;
    private DropdownList colorScrollList;
    private DropdownList colorSetList;

    //preset tab
    private RadioButton presetButtons;
    private Button loadPreset, savePreset;
    private Label presetInfo;
    private Textfield presetName;
   
    private CheckBox randomCheckbox;
   
    //info tab
    private List<Tab> allTabs = new ArrayList<Tab>();
    private Label currentFps;
    private Label currentVolume;
    private Label runtime;
    private Label sentFrames;
    private Label outputErrorCounter;
    private Label outputState;
    private Label oscStatistic;
   
    /** The target y size. */
    private int singleVisualXSize, singleVisualYSize;
    private int p5GuiYOffset;

    private int[] buffer = null;
   
    private boolean initialized = false;
   
    private Messages messages;
   
    private long frames=0;

   
    /**
     * Instantiates a new internal buffer.
     *
     * @param displayHoriz the display horiz
     * @param x the x
     * @param y the y
     * @param singleVisualXSize the target x size
     * @param singleVisualYSize the target y size
     */
    public GeneratorGui(WindowSizeCalculator wsc) {
      super();       
        this.windowWidth = wsc.getWindowWidth();
        this.windowHeight = wsc.getWindowHeight();
        this.singleVisualXSize = wsc.getSingleVisualWidth();
        this.singleVisualYSize = wsc.getSingleVisualHeight();
        this.p5GuiYOffset = this.singleVisualYSize + 110;
       
        messages = new Messages();
    }

    /* (non-Javadoc)
     * @see processing.core.PApplet#setup()
     */
    public void setup() {
        size(windowWidth, windowHeight);        
      LOG.log(Level.INFO, "Create GUI Window with size "+this.getWidth()+"/"+this.getHeight()); //$NON-NLS-1$ //$NON-NLS-2$

        frameRate(Collector.getInstance().getFps());
        smooth();
        background(0,0,0);   
        int i=0;
       
        cp5 = new ControlP5(this);
        cp5.setAutoDraw(false);
       
        //press alt and you can move gui elements arround. disable this *should* work but does not...
        cp5.setMoveable(false);

        //alt-h hide all controls - I don't want that!
        cp5.disableShortcuts();
       
        cp5.getTooltip().setDelay(200);
        P5EventListener listener = new P5EventListener(this);

        //selected visual
        Collector col = Collector.getInstance();
        int nrOfVisuals = col.getAllVisuals().size();
     
        int w = singleVisualXSize < MINIMAL_VISUAL_WIDTH ? MINIMAL_VISUAL_WIDTH-1 : singleVisualXSize-1;
        selectedVisualList = cp5.addRadioButton(GuiElement.CURRENT_VISUAL.guiText(), getVisualCenter(col), p5GuiYOffset-58);
        selectedVisualList.setItemsPerRow(nrOfVisuals);
        selectedVisualList.setNoneSelectedAllowed(false);   
        for (i=0; i<nrOfVisuals; i++) {
            String s = messages.getString("GeneratorGui.GUI_SELECTED_VISUAL")+(1+i);       //$NON-NLS-1$
            Toggle t = cp5.addToggle(s, 0, 0, w, 13);
            t.setCaptionLabel(s);
            selectedVisualList.addItem(t, i);     
            cp5.getTooltip().register(s, messages.getString("GeneratorGui.GUI_SELECTED_VISUAL_TOOLTIP_PREFIX")+(1+i)+messages.getString("GeneratorGui.GUI_SELECTED_VISUAL_TOOLTIP_POSTFIX"));       //$NON-NLS-1$ //$NON-NLS-2$
        }
        selectedVisualList.moveTo(ALWAYS_VISIBLE_TAB);

        cp5.addTextlabel("gen1", messages.getString("GeneratorGui.GUI_GENERATOR_LAYER_1"), GENERIC_X_OFS+3, 3+p5GuiYOffset).moveTo(ALWAYS_VISIBLE_TAB).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        cp5.addTextlabel("gen2", messages.getString("GeneratorGui.GUI_GENERATOR_LAYER_2"), GENERIC_X_OFS+3+3*Theme.DROPBOX_XOFS, 3+p5GuiYOffset).moveTo(ALWAYS_VISIBLE_TAB).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        cp5.addTextlabel("fx1", messages.getString("GeneratorGui.GUI_EFFECT_LAYER_1"), GENERIC_X_OFS+3+1*Theme.DROPBOX_XOFS, 3+p5GuiYOffset).moveTo(ALWAYS_VISIBLE_TAB).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        cp5.addTextlabel("fx2", messages.getString("GeneratorGui.GUI_EFFECT_LAYER_2"), GENERIC_X_OFS+3+4*Theme.DROPBOX_XOFS, 3+p5GuiYOffset).moveTo(ALWAYS_VISIBLE_TAB).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        cp5.addTextlabel("mix2", messages.getString("GeneratorGui.GUI_LAYER_MIXER"), GENERIC_X_OFS+3+2*Theme.DROPBOX_XOFS, 3+p5GuiYOffset).moveTo(ALWAYS_VISIBLE_TAB).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$

        cp5.getTooltip().register("gen1", messages.getString("GeneratorGui.GUI_TOOLTIP_GENERATOR_1")); //$NON-NLS-1$ //$NON-NLS-2$
        cp5.getTooltip().register("gen2", messages.getString("GeneratorGui.GUI_TOOLTIP_GENERATOR_2")); //$NON-NLS-1$ //$NON-NLS-2$
        cp5.getTooltip().register("fx1", messages.getString("GeneratorGui.GUI_TOOLTIP_EFFECT_1")); //$NON-NLS-1$ //$NON-NLS-2$
        cp5.getTooltip().register("fx2", messages.getString("GeneratorGui.GUI_TOOLTIP_EFFECT_2")); //$NON-NLS-1$ //$NON-NLS-2$
        cp5.getTooltip().register("mix2", messages.getString("GeneratorGui.GUI_TOOLTIP_MIXER")); //$NON-NLS-1$ //$NON-NLS-2$

        //Generator
        generatorListOne = cp5.addDropdownList(GuiElement.GENERATOR_ONE_DROPDOWN.guiText(),
            GENERIC_X_OFS, p5GuiYOffset, Theme.DROPBOXLIST_LENGTH, 140);
        generatorListTwo = cp5.addDropdownList(GuiElement.GENERATOR_TWO_DROPDOWN.guiText(),
            GENERIC_X_OFS+3*Theme.DROPBOX_XOFS, p5GuiYOffset, Theme.DROPBOXLIST_LENGTH, 140);
        Theme.themeDropdownList(generatorListOne);
        Theme.themeDropdownList(generatorListTwo);
       
        for (GeneratorName gn: GeneratorName.values()) {
            generatorListOne.addItem(gn.guiText(), gn.getId());
            generatorListTwo.addItem(gn.guiText(), gn.getId());
        }
       
        generatorListOne.setLabel(generatorListOne.getItem(1).getName());
        generatorListTwo.setLabel(generatorListTwo.getItem(1).getName());
        generatorListOne.moveTo(ALWAYS_VISIBLE_TAB);
        generatorListTwo.moveTo(ALWAYS_VISIBLE_TAB);
        generatorListOne.setHeight(Theme.DROPBOXLIST_LARGE_HEIGHT);
        generatorListTwo.setHeight(Theme.DROPBOXLIST_LARGE_HEIGHT);

        //Effect
        effectListOne = cp5.addDropdownList(GuiElement.EFFECT_ONE_DROPDOWN.guiText(),
            GENERIC_X_OFS+1*Theme.DROPBOX_XOFS, p5GuiYOffset, Theme.DROPBOXLIST_LENGTH, 140);
        effectListTwo = cp5.addDropdownList(GuiElement.EFFECT_TWO_DROPDOWN.guiText(),
            GENERIC_X_OFS+4*Theme.DROPBOX_XOFS, p5GuiYOffset, Theme.DROPBOXLIST_LENGTH, 140);
        Theme.themeDropdownList(effectListOne);
        Theme.themeDropdownList(effectListTwo);

        for (EffectName gn: EffectName.values()) {
            effectListOne.addItem(gn.guiText(), gn.getId());
            effectListTwo.addItem(gn.guiText(), gn.getId());
        }
        effectListOne.setLabel(effectListOne.getItem(0).getName());
        effectListTwo.setLabel(effectListTwo.getItem(0).getName());
        effectListOne.moveTo(ALWAYS_VISIBLE_TAB);
        effectListTwo.moveTo(ALWAYS_VISIBLE_TAB);
        effectListOne.setHeight(Theme.DROPBOXLIST_LARGE_HEIGHT);
        effectListTwo.setHeight(Theme.DROPBOXLIST_LARGE_HEIGHT);
       
        //Mixer
        mixerList = cp5.addDropdownList(GuiElement.MIXER_DROPDOWN.guiText(),
            GENERIC_X_OFS+2*Theme.DROPBOX_XOFS, p5GuiYOffset, Theme.DROPBOXLIST_LENGTH, 140);
        Theme.themeDropdownList(mixerList);

        for (MixerName gn: MixerName.values()) {
            mixerList.addItem(gn.guiText(), gn.getId());
        }
        mixerList.setLabel(mixerList.getItem(0).getName());
        mixerList.setHeight(Theme.DROPBOXLIST_LARGE_HEIGHT);
        mixerList.moveTo(ALWAYS_VISIBLE_TAB);


        //---------------------------------
        //TABS
        //---------------------------------

        final int yPosStartLabel = p5GuiYOffset+50;
        final int yPosStartDrowdown = p5GuiYOffset+36;

        cp5.getWindow().setPositionOfTabs(GENERIC_X_OFS, this.getHeight()-20);

        //there a default tab which is present all the time. rename this tab
        Tab generatorTab = cp5.getTab("default"); //$NON-NLS-1$
        allTabs.add(generatorTab);
        generatorTab.setLabel(messages.getString("GeneratorGui.TAB_GENERATOR_EFFECT"));     //$NON-NLS-1$
        Tab outputTab = cp5.addTab(messages.getString("GeneratorGui.TAB_SINGLE_OUTPUT_MAPPING")); //$NON-NLS-1$
        allTabs.add(outputTab);
        Tab allOutputTab = null;
       
        //add all output mapping only if multiple output panels exist
        if (nrOfVisuals>2) {
            allOutputTab = cp5.addTab(messages.getString("GeneratorGui.TAB_ALL_OUTPUT_MAPPING"));     //$NON-NLS-1$
            allOutputTab.setColorForeground(0xffff0000);
            allTabs.add(allOutputTab);
        }

        Tab randomTab = cp5.addTab(messages.getString("GeneratorGui.TAB_RANDOMIZE"));     //$NON-NLS-1$
        allTabs.add(randomTab);
        Tab presetTab = cp5.addTab(messages.getString("GeneratorGui.TAB_PRESETS")); //$NON-NLS-1$
        allTabs.add(presetTab);
        Tab infoTab = cp5.addTab(messages.getString("GeneratorGui.TAB_INFO")); //$NON-NLS-1$
        allTabs.add(infoTab);
        Tab helpTab = cp5.addTab(messages.getString("GeneratorGui.TAB_HELP")); //$NON-NLS-1$
        allTabs.add(helpTab);
       
        generatorTab.setColorForeground(0xffff0000);
        outputTab.setColorForeground(0xffff0000);
        randomTab.setColorForeground(0xffff0000);
        presetTab.setColorForeground(0xffff0000);
        helpTab.setColorForeground(0xffff0000);
       
        generatorTab.bringToFront();
       
        //-------------
        //Generic Options
        //-------------
        //generator speed slider
        generatorSpeedSlider = cp5.addSlider(GuiElement.GENERATOR_SPEED.guiText(),
            0f, 2.0f, 1f, 38+GENERIC_X_OFS, p5GuiYOffset+97, 140, 14);
        generatorSpeedSlider.setSliderMode(Slider.FIX);
        generatorSpeedSlider.setGroup(generatorTab)
        generatorSpeedSlider.setDecimalPrecision(0);
        generatorSpeedSlider.setRange(0, 200);
        generatorSpeedSlider.setLabelVisible(true);

        //beat animation
        cp5.addTextlabel("beatWorkmode", messages.getString("GeneratorGui.BEAT_WORKMODE"),
            38+GENERIC_X_OFS+2*Theme.DROPBOX_XOFS, p5GuiYOffset+113+5).moveTo(generatorTab).getValueLabel();
        beatWorkmode = cp5.addDropdownList(GuiElement.BEAT_WORKMODE.guiText(),
            38+GENERIC_X_OFS+2*Theme.DROPBOX_XOFS, p5GuiYOffset+113, Theme.DROPBOXLIST_LENGTH, 140);
        Theme.themeDropdownList(beatWorkmode);
        for (BeatToAnimation bta: BeatToAnimation.values()) {
            beatWorkmode.addItem(bta.guiText(), bta.getId());         
        }
        beatWorkmode.setLabel(beatWorkmode.getItem(0).getName());
        beatWorkmode.setGroup(generatorTab);
        beatWorkmode.setHeight(Theme.DROPBOXLIST_HEIGHT);

       
        //freeze update
        freeze = cp5.addToggle(GuiElement.BUTTON_TOGGLE_FREEZE.guiText(), 730, 2, 15, 15).moveTo(ALWAYS_VISIBLE_TAB);
        freeze.setLabelVisible(false);
        cp5.addTextlabel("freezeUpdateTxt", messages.getString("GeneratorGui.GUI_TOGGLE_FREEZE"), 745, 5).moveTo(ALWAYS_VISIBLE_TAB);
        cp5.getTooltip().register(GuiElement.BUTTON_TOGGLE_FREEZE.guiText(),messages.getString("GeneratorGui.TOOLTIP_FREEZE")); //$NON-NLS-1$
       
        //toggle internal visuals
        Toggle t2 = cp5.addToggle(GuiElement.BUTTON_TOGGLE_INTERNAL_VISUALS.guiText(), 730, 20, 15, 15).moveTo(ALWAYS_VISIBLE_TAB);
        t2.setLabelVisible(false);
        cp5.addTextlabel("toggleIKnternalVisualsTxt", messages.getString("GeneratorGui.GUI_TOGGLE_INTERNAL_BUFFER"), 745, 23).moveTo(ALWAYS_VISIBLE_TAB);; //$NON-NLS-1$
        cp5.getTooltip().register(GuiElement.BUTTON_TOGGLE_INTERNAL_VISUALS.guiText(),messages.getString("GeneratorGui.TOOLTIP_GUI_TOGGLE_INTERNAL_BUFFER")); //$NON-NLS-1$

       
        //-------------
        //GENERATOR/EFFECT tab
        //-------------
       
        int genFxXOfs = 38+GENERIC_X_OFS;
       
        //EFFECTS OPTIONS
        //---------------
        int genElYOfs = yPosStartDrowdown+105;
        cp5.addTextlabel("genOptionsFx", messages.getString("GeneratorGui.EFFECT_OPTIONS"), GENERIC_X_OFS, genElYOfs).moveTo(generatorTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$       
       
        //threshold slider
        thresholdSlider = cp5.addSlider(GuiElement.THRESHOLD.guiText(),
            0, 255, 255, genFxXOfs, genElYOfs+60, 140, 14);
        thresholdSlider.setSliderMode(Slider.FIX);
        thresholdSlider.setGroup(generatorTab)
        thresholdSlider.setDecimalPrecision(0);   

        //rotozoom slider
        fxRotoSlider = cp5.addSlider(GuiElement.FX_ROTOZOOMER.guiText(),
                -127, 127, 0, genFxXOfs+2*Theme.DROPBOX_XOFS, genElYOfs+60, 140, 14);
        fxRotoSlider.setSliderMode(Slider.FIX);
        fxRotoSlider.setGroup(generatorTab);
        fxRotoSlider.setDecimalPrecision(0);
        fxRotoSlider.setCaptionLabel(messages.getString("GeneratorGui.EFFECT_ROTOZOOM_SPEED")); //$NON-NLS-1$

       
       
        genElYOfs += 25;

        //texturedeform options
        cp5.addTextlabel("genTextdefOpt", messages.getString("GeneratorGui.TEXTUREDDEFORM_OPTIONS"), genFxXOfs+3+0*Theme.DROPBOX_XOFS, genElYOfs+16).moveTo(generatorTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        textureDeformOptions = cp5.addDropdownList(GuiElement.TEXTUREDEFORM_OPTIONS.guiText(),
            genFxXOfs+0*Theme.DROPBOX_XOFS, genElYOfs+11, Theme.DROPBOXLIST_LENGTH, 80);
        Theme.themeDropdownList(textureDeformOptions);           
        textureDeformOptions.addItem(messages.getString("GeneratorGui.TEXTUREDEFORM_ANAMORPHOSIS"), 1); //$NON-NLS-1$
        textureDeformOptions.addItem(messages.getString("GeneratorGui.TEXTUREDEFORM_SPIRAL"), 2); //$NON-NLS-1$
        textureDeformOptions.addItem(messages.getString("GeneratorGui.TEXTUREDEFORM_ROTATINGTUNNEL"), 3); //$NON-NLS-1$
        textureDeformOptions.addItem(messages.getString("GeneratorGui.TEXTUREDEFORM_START"), 4); //$NON-NLS-1$
        textureDeformOptions.addItem(messages.getString("GeneratorGui.TEXTUREDEFORM_TUNNEL"), 5); //$NON-NLS-1$
        textureDeformOptions.addItem(messages.getString("GeneratorGui.TEXTUREDEFORM_FLOWER"), 6); //$NON-NLS-1$
        textureDeformOptions.addItem(messages.getString("GeneratorGui.TEXTUREDEFORM_CLOUD"), 7); //$NON-NLS-1$
        textureDeformOptions.addItem(messages.getString("GeneratorGui.TEXTUREDEFORM_PLANAR"), 8); //$NON-NLS-1$
        textureDeformOptions.addItem(messages.getString("GeneratorGui.TEXTUREDEFORM_CIRCLE"), 9); //$NON-NLS-1$
        textureDeformOptions.addItem(messages.getString("GeneratorGui.TEXTUREDEFORM_SPIRAL"), 10); //$NON-NLS-1$
        textureDeformOptions.addItem(messages.getString("GeneratorGui.TEXTUREDEFORM_3D"), 11); //$NON-NLS-1$
        textureDeformOptions.setLabel(textureDeformOptions.getItem(1).getName());
        textureDeformOptions.setGroup(generatorTab);   

       
        cp5.addTextlabel("genZoomOpt", messages.getString("GeneratorGui.ZOOM_OPTIONS"), genFxXOfs+3+1*Theme.DROPBOX_XOFS, genElYOfs+16).moveTo(generatorTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        zoomOptions = cp5.addDropdownList(GuiElement.ZOOM_OPTIONS.guiText(),
            genFxXOfs+1*Theme.DROPBOX_XOFS, genElYOfs+11, Theme.DROPBOXLIST_LENGTH, 80);
        Theme.themeDropdownList(zoomOptions);           
        zoomOptions.addItem(messages.getString("GeneratorGui.ZOOM_IN"), 0); //$NON-NLS-1$
        zoomOptions.addItem(messages.getString("GeneratorGui.ZOOM_OUT"), 1); //$NON-NLS-1$
        zoomOptions.addItem(messages.getString("GeneratorGui.ZOOM_HORIZONTAL"), 2); //$NON-NLS-1$
        zoomOptions.addItem(messages.getString("GeneratorGui.ZOOM_VERTICAL"), 3); //$NON-NLS-1$
        zoomOptions.setLabel(zoomOptions.getItem(0).getName());
        zoomOptions.setGroup(generatorTab);   
          
        //GENERATOR OPTIONS
        //-----------------
       
        FileUtils fu = new FileUtils();
       
        genElYOfs = p5GuiYOffset+35;
        cp5.addTextlabel("genOptionsGen", messages.getString("GeneratorGui.GENERATOR_OPTIONS"), GENERIC_X_OFS, genElYOfs).moveTo(generatorTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
       
        genElYOfs=yPosStartLabel+5;
       
        //blinkenlights
        cp5.addTextlabel("genBlinken", messages.getString("GeneratorGui.BLINKENLIGHT_LOAD"), genFxXOfs+3, genElYOfs+16).moveTo(generatorTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        blinkenLightsList = cp5.addDropdownList(GuiElement.BLINKENLIGHTS_DROPDOWN.guiText(),
            genFxXOfs, genElYOfs+11, Theme.DROPBOXLIST_LENGTH, 140);
        Theme.themeDropdownList(blinkenLightsList);
        blinkenLightsList.addItems(fu.findBlinkenFiles());
        blinkenLightsList.setLabel(blinkenLightsList.getItem(1).getName());
        blinkenLightsList.setGroup(generatorTab);
        blinkenLightsList.setHeight(Theme.DROPBOXLIST_HEIGHT);

       
        //images
        cp5.addTextlabel("genImg", messages.getString("GeneratorGui.IMAGE_LOAD"), genFxXOfs+3+1*Theme.DROPBOX_XOFS, genElYOfs+16).moveTo(generatorTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        imageList = cp5.addDropdownList(GuiElement.IMAGE_DROPDOWN.guiText(),
            genFxXOfs+Theme.DROPBOX_XOFS, genElYOfs+11, Theme.DROPBOXLIST_LENGTH, 140);
        Theme.themeDropdownList(imageList);   
        imageList.addItems(fu.findImagesFiles());
        imageList.setLabel(imageList.getItem(1).getName());
        imageList.setGroup(generatorTab);   
        imageList.setHeight(Theme.DROPBOXLIST_HEIGHT);

        //colorscroll options
        cp5.addTextlabel("genColorScroll", messages.getString("GeneratorGui.COLORSCROLL_OPTIONS"), genFxXOfs+3+2*Theme.DROPBOX_XOFS, genElYOfs+16).moveTo(generatorTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$       
        colorScrollList = cp5.addDropdownList(GuiElement.COLORSCROLL_OPTIONS.guiText(),
            genFxXOfs+2*Theme.DROPBOX_XOFS, genElYOfs+11, Theme.DROPBOXLIST_LENGTH, 140);
        Theme.themeDropdownList(colorScrollList);   

        for (ScrollMode sm: ScrollMode.values()) {
            colorScrollList.addItem(sm.getDisplayName(), sm.getMode()); //$NON-NLS-1$ //$NON-NLS-2$
        }
        colorScrollList.setGroup(generatorTab);   
        colorScrollList.setHeight(Theme.DROPBOXLIST_HEIGHT);
        colorScrollList.setLabel(col.getPixelControllerGenerator().getScrollMode().getDisplayName());
               
        //add textfield options
        cp5.addTextlabel("genTextwriterOpt", messages.getString("GeneratorGui.TEXTWRITER_OPTION"), genFxXOfs+3+3*Theme.DROPBOX_XOFS, genElYOfs+16).moveTo(generatorTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$       
        textwriterOption = cp5.addDropdownList(GuiElement.TEXTWR_OPTION.guiText(),
            genFxXOfs+3*Theme.DROPBOX_XOFS, genElYOfs+11, Theme.DROPBOXLIST_LENGTH, 140);
        Theme.themeDropdownList(textwriterOption);
        textwriterOption.addItem(messages.getString("GeneratorGui.TEXTWRITER_PINGPONG"), 0); //$NON-NLS-1$
        textwriterOption.addItem(messages.getString("GeneratorGui.TEXTWRITER_LEFT"), 1); //$NON-NLS-1$
        textwriterOption.setLabel(textwriterOption.getItem(0).getName());
        textwriterOption.setGroup(generatorTab);
        textwriterOption.setHeight(Theme.DROPBOXLIST_HEIGHT);

        //add textfield
        textGenerator = cp5.addTextfield(GuiElement.TEXTFIELD, GuiElement.TEXTFIELD.guiText(), GuiElement.TEXTFIELD.guiText(), genFxXOfs+3+4*Theme.DROPBOX_XOFS, genElYOfs-6, Theme.DROPBOXLIST_LENGTH, 16); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
                     
        passThroughMode = cp5.addTextlabel("passThroughMode", "", genFxXOfs, yPosStartDrowdown+50).moveTo(generatorTab).getValueLabel();
        passThroughMode.setColor(0xffff0000);
 

        //-----------------
        //Single Output tab
        //-----------------       

        //brightness control
        cp5.addTextlabel("brightnessControllTxt", messages.getString("GeneratorGui.BRIGHTNESS"), 5, yPosStartDrowdown+95).moveTo(outputTab);

        brightnessControll = cp5.addSlider(GuiElement.BRIGHTNESS.guiText(), 0, 255, 255, 38, yPosStartDrowdown+110, 160, 14);
        brightnessControll.setSliderMode(Slider.FIX);
        brightnessControll.setGroup(outputTab)
        brightnessControll.setDecimalPrecision(0);
        brightnessControll.setNumberOfTickMarks(11);
        brightnessControll.setRange(0, 100);
        brightnessControll.setLabelVisible(false);       

        int nrOfOutputs = Collector.getInstance().getAllOutputMappings().size();
        selectedOutputs = cp5.addRadioButton(GuiElement.CURRENT_OUTPUT.guiText(), GENERIC_X_OFS, yPosStartDrowdown);
        selectedOutputs.setItemsPerRow(nrOfOutputs);
        selectedOutputs.setNoneSelectedAllowed(false);   
        for (i=0; i<nrOfOutputs; i++) {
            String s = messages.getString("GeneratorGui.OUTPUT_NR")+(1+i);       //$NON-NLS-1$
            Toggle t = cp5.addToggle(s, 0, 0, singleVisualXSize, 13);
            t.setCaptionLabel(s);
            selectedOutputs.addItem(t, i);     
            cp5.getTooltip().register(s, messages.getString("GeneratorGui.TOOLTIP_OUTPUT_PREFIX")+(1+i)+messages.getString("GeneratorGui.TOOLTIP_OUTPUT_POSTFIX"));       //$NON-NLS-1$ //$NON-NLS-2$
        }
        selectedOutputs.moveTo(outputTab);

        //visual
        cp5.addTextlabel("singleOutputVisual", messages.getString("GeneratorGui.OUTPUT_VISUAL"), 38, yPosStartDrowdown+60).moveTo(outputTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        dropdownOutputVisual = GeneratorGuiHelper.createVisualDropdown(cp5,
                GuiElement.OUTPUT_SELECTED_VISUAL_DROPDOWN.guiText(), yPosStartDrowdown+10, nrOfVisuals);
        dropdownOutputVisual.moveTo(outputTab);

        //Fader        
        cp5.addTextlabel("singleOutputTransition", messages.getString("GeneratorGui.OUTPUT_TRANSITION"), 38+Theme.DROPBOX_XOFS*2, yPosStartDrowdown+60).moveTo(outputTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        dropdownOutputFader = GeneratorGuiHelper.createFaderDropdown(cp5,
                GuiElement.OUTPUT_FADER_DROPDOWN.guiText(), yPosStartDrowdown+10);
        dropdownOutputFader.moveTo(outputTab);
       
       
        //--------------
        //All Output tab
        //--------------       
       
        if (allOutputTab!=null) {
            cp5.addTextlabel("allOutputTabLabel", messages.getString("GeneratorGui.TEXT_CHANGE_ALL_OUTPUT_MAPPINGS"), 20, yPosStartDrowdown) //$NON-NLS-1$ //$NON-NLS-2$
            .moveTo(allOutputTab).getValueLabel();

            cp5.addTextlabel("allOutputVisual", messages.getString("GeneratorGui.ALL_OUTPUT_VISUAL"), 38, yPosStartDrowdown+68).moveTo(allOutputTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
            allOutputTabVis = GeneratorGuiHelper.createVisualDropdown(cp5,
                    GuiElement.OUTPUT_ALL_SELECTED_VISUAL_DROPDOWN.guiText(), yPosStartDrowdown+20, nrOfVisuals);
            allOutputTabVis.moveTo(allOutputTab);

            //Fader        
            cp5.addTextlabel("allOutputTransition", messages.getString("GeneratorGui.ALL_OUTPUT_TRANSITION"), 38+Theme.DROPBOX_XOFS*2, yPosStartDrowdown+68).moveTo(allOutputTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
            allOutputTabFader = GeneratorGuiHelper.createFaderDropdown(cp5,
                    GuiElement.OUTPUT_ALL_FADER_DROPDOWN.guiText(), yPosStartDrowdown+20);
            allOutputTabFader.moveTo(allOutputTab);                   
        }


        //palette dropdown list 
        cp5.addTextlabel("colSet", messages.getString("GeneratorGui.SELECT_COLORSET"), GENERIC_X_OFS+5*Theme.DROPBOX_XOFS, p5GuiYOffset+3).moveTo(ALWAYS_VISIBLE_TAB).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$

        colorSetList = cp5.addDropdownList(GuiElement.COLOR_SET_DROPDOWN.guiText(),
            GENERIC_X_OFS+5*Theme.DROPBOX_XOFS, p5GuiYOffset, Theme.DROPBOXLIST_LENGTH, 140);
        Theme.themeDropdownList(colorSetList);   
        i=0;
        for (ColorSet cs: Collector.getInstance().getColorSets()) {
            colorSetList.addItem(cs.getName(), i);
            i++;
        }   
        colorSetList.setLabel(colorSetList.getItem(1).getName());
        colorSetList.setHeight(Theme.DROPBOXLIST_LARGE_HEIGHT);
        colorSetList.moveTo(ALWAYS_VISIBLE_TAB);
        cp5.getTooltip().register("colSet", messages.getString("GeneratorGui.TOOLTIP_COLORSET")); //$NON-NLS-1$ //$NON-NLS-2$

       
        //----------
        //RANDOM Tab
        //----------       

        Textlabel tRnd = cp5.addTextlabel("rndDesc"//$NON-NLS-1$
            messages.getString("GeneratorGui.TEXT_RANDOM_MODE_SELECT_ELEMENTS")//$NON-NLS-1$
            20, yPosStartDrowdown);
        tRnd.moveTo(randomTab).getValueLabel();
       
       
        randomCheckbox = cp5.addCheckBox(GuiElement.RANDOM_ELEMENT.guiText())
                .setPosition(35, 20+yPosStartDrowdown)
                .setSize(40, 20)
                .setColorForeground(color(120))
                .setColorActive(color(255))
                .setColorLabel(color(255))
                .setItemsPerRow(5)
                .setSpacingColumn(90)
    ;
   
        for (ShufflerOffset so: ShufflerOffset.values()) {
            randomCheckbox.addItem(so.guiText(), i);
        }
        randomCheckbox.activateAll();
        randomCheckbox.moveTo(randomTab);


        //Button
        randomSelection = cp5.addButton(GuiElement.BUTTON_RANDOM_CONFIGURATION.guiText(), 0,
            GENERIC_X_OFS+5*Theme.DROPBOX_XOFS, p5GuiYOffset+30, 110, 15);
        randomSelection.setCaptionLabel(messages.getString("GeneratorGui.RANDOMIZE")); //$NON-NLS-1$
        randomSelection.moveTo(randomTab);
        cp5.getTooltip().register(GuiElement.BUTTON_RANDOM_CONFIGURATION.guiText(), messages.getString("GeneratorGui.TOOLTIP_RANDOMIZE")); //$NON-NLS-1$

        randomPresets = cp5.addButton(GuiElement.BUTTON_RANDOM_PRESET.guiText(), 0,
            GENERIC_X_OFS+5*Theme.DROPBOX_XOFS, p5GuiYOffset+55, 110, 15);
        randomPresets.setCaptionLabel(messages.getString("GeneratorGui.RANDOM_PRESET")); //$NON-NLS-1$
        randomPresets.moveTo(randomTab);
        cp5.getTooltip().register(GuiElement.BUTTON_RANDOM_PRESET.guiText(),messages.getString("GeneratorGui.TOOLTIP_RANDOM_PRESET")); //$NON-NLS-1$

        randomButtons = cp5.addRadioButton(GuiElement.BUTTONS_RANDOM_MODE.guiText())
                .setPosition(GENERIC_X_OFS+5*Theme.DROPBOX_XOFS, p5GuiYOffset+85)
                .setSize(45, 15)
                .setColorForeground(color(120))
                .setColorActive(color(255))
                .setColorLabel(color(255))
                .setItemsPerRow(1)
                .setSpacingColumn(26)
                .setNoneSelectedAllowed(true)
                .moveTo(randomTab);
        randomButtons.addItem(messages.getString("GeneratorGui.RANDOM_MODE"), 0);
        randomButtons.addItem(messages.getString("GeneratorGui.RANDOM_MODE_PRESET"), 1);
       
        //----------
        //PRESET Tab
        //----------

        presetButtons = cp5.addRadioButton(GuiElement.PRESET_BUTTONS.guiText())
                .setPosition(10, yPosStartDrowdown)
                .setSize(24, 14)
                .setColorForeground(color(120))
                .setColorActive(color(255))
                .setColorLabel(color(255))
                .setItemsPerRow(16)
                .setSpacingColumn(26)
                .setNoneSelectedAllowed(false);

        for (i=0; i<96+48; i++) {
            String label = ""+i; //$NON-NLS-1$
            if (i<10) {
                label = "0"+i; //$NON-NLS-1$
            }
            presetButtons.addItem(label, i);
        }
        presetButtons.activate(col.getSelectedPreset());
        presetButtons.moveTo(presetTab);               
       
        loadPreset = cp5.addButton(GuiElement.LOAD_PRESET.guiText(), 0,
            GENERIC_X_OFS+2*Theme.DROPBOX_XOFS, yPosStartDrowdown+170, 100, 15);
        loadPreset.setCaptionLabel(GuiElement.LOAD_PRESET.guiText());
        loadPreset.moveTo(presetTab);
        cp5.getTooltip().register(GuiElement.LOAD_PRESET.guiText(),messages.getString("GeneratorGui.TOOLTIP_LOAD_PRESET")); //$NON-NLS-1$

        savePreset = cp5.addButton(GuiElement.SAVE_PRESET.guiText(), 0,
            GENERIC_X_OFS+3*Theme.DROPBOX_XOFS, yPosStartDrowdown+170, 100, 15);
        savePreset.setCaptionLabel(GuiElement.SAVE_PRESET.guiText());
        savePreset.moveTo(presetTab);
        cp5.getTooltip().register(GuiElement.SAVE_PRESET.guiText(),messages.getString("GeneratorGui.TOOLTIP_SAVE_PRESET")); //$NON-NLS-1$

        presetName = cp5.addTextfield("presetName", 20, yPosStartDrowdown+170, Theme.DROPBOXLIST_LENGTH*2, 16).moveTo(presetTab); //$NON-NLS-1$
        presetInfo = cp5.addTextlabel("presetInfo", "", 160, yPosStartDrowdown+170+18).moveTo(presetTab).getValueLabel();         //$NON-NLS-1$ //$NON-NLS-2$
       
        updateCurrentPresetState();
       
        //-------------
        //Info tab
        //-------------
       
        int yposAdd = 18;
        int xposAdd = 200;

        //center it, we have 3 row which are 160 pixels wide
        int xOfs = (this.getWidth()-3*xposAdd)/2;
        int nfoYPos = yPosStartDrowdown+20;
        int nfoXPos = xOfs;

        cp5.addTextlabel("nfoFpsConf", messages.getString("GeneratorGui.CONF_FPS")+col.getFps(), nfoXPos, nfoYPos).moveTo(infoTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        nfoYPos+=yposAdd;
        currentFps = cp5.addTextlabel("nfoFpsCurrent", "", nfoXPos, nfoYPos).moveTo(infoTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        nfoYPos+=yposAdd;
        runtime = cp5.addTextlabel("nfoRuntime", "", nfoXPos, nfoYPos).moveTo(infoTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        nfoYPos+=yposAdd;
        cp5.addTextlabel("nfoSrvVersion", messages.getString("GeneratorGui.SERVER_VERSION")+Collector.getInstance().getPixConStat().getVersion(), nfoXPos, nfoYPos).moveTo(infoTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        nfoYPos+=yposAdd;
        float volNorm = Collector.getInstance().getSound().getVolumeNormalized();
        currentVolume = cp5.addTextlabel("nfoVolumeCurrent", messages.getString("GeneratorGui.CURRENT_VOLUME")+volNorm, nfoXPos, nfoYPos).moveTo(infoTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        nfoYPos+=yposAdd;
        cp5.addTextlabel("nfoWindowHeight", messages.getString("GeneratorGui.INFO_WINDOW_HEIGHT")+this.getHeight(), nfoXPos, nfoYPos).moveTo(infoTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        nfoYPos+=yposAdd;
        int ibsX= col.getPixelControllerGenerator().getGenerator(0).getInternalBufferXSize();
        int ibsY= col.getPixelControllerGenerator().getGenerator(0).getInternalBufferYSize();
        cp5.addTextlabel("nfoInternalBuffer", messages.getString("GeneratorGui.INFO_INTERNAL_BUFFERSIZE")+ibsX+"/"+ibsY, nfoXPos, nfoYPos).moveTo(infoTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        nfoYPos+=yposAdd;
       
        Button saveScreenshot = cp5.addButton(GuiElement.SAVE_SCREENSHOT.guiText(), 0,
            nfoXPos, nfoYPos, 110, 15);
        saveScreenshot.setCaptionLabel(messages.getString("GeneratorGui.SAVE_SCREENSHOT")); //$NON-NLS-1$
        saveScreenshot.moveTo(infoTab);
        cp5.getTooltip().register(GuiElement.SAVE_SCREENSHOT.guiText(), messages.getString("GeneratorGui.TOOLTIP_SAVE_SCREENSHOT")); //$NON-NLS-1$

       
        nfoXPos += xposAdd;
        nfoYPos = yPosStartDrowdown+20;
        IOutput output = col.getOutputDevice();
        if (output!=null) {
            String gammaText = WordUtils.capitalizeFully(StringUtils.replace(output.getGammaType().toString(), "_", " "));
            cp5.addTextlabel("nfoGamma", messages.getString("GeneratorGui.GAMMA_CORRECTION")+gammaText, nfoXPos, nfoYPos).moveTo(infoTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$         
            nfoYPos+=yposAdd;
            cp5.addTextlabel("nfoBps", messages.getString("GeneratorGui.OUTPUT_BPP")+output.getBpp(), nfoXPos, nfoYPos).moveTo(infoTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
            nfoYPos+=yposAdd;
        }
        sentFrames = cp5.addTextlabel("nfoSentFrames", "", nfoXPos, nfoYPos).moveTo(infoTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        nfoYPos+=yposAdd;       
        outputErrorCounter = cp5.addTextlabel("nfoErrorFrames", "", nfoXPos, nfoYPos).moveTo(infoTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        nfoYPos+=yposAdd;                           
        outputState = cp5.addTextlabel("nfoOutputState", "", nfoXPos, nfoYPos).moveTo(infoTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        nfoYPos+=yposAdd;                 
       
        nfoXPos += xposAdd;
        nfoYPos = yPosStartDrowdown+20;
        String oscPort = col.getPh().getProperty(ConfigConstant.NET_OSC_LISTENING_PORT, ""); //$NON-NLS-1$ //$NON-NLS-2$
        cp5.addTextlabel("nfoOscPort", messages.getString("GeneratorGui.OSC_PORT")+oscPort, nfoXPos, nfoYPos).moveTo(infoTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        nfoYPos+=yposAdd;
        oscStatistic = cp5.addTextlabel("nfoOscStatistic", messages.getString("GeneratorGui.OSC_STATISTIC"), nfoXPos, nfoYPos).moveTo(infoTab).getValueLabel();
        nfoYPos+=yposAdd;
       
       
       
        //-------------
        //Help tab
        //-------------
       
        int hlpYOfs = yPosStartDrowdown;
        int hlpXOfs1 = 20;
        int hlpXOfs2 = 240;
        int hlpYposAdd = 15;
       
        cp5.addTextlabel("hlpHeader1", messages.getString("GeneratorGui.HLP_HEADER1"), hlpXOfs1, hlpYOfs).moveTo(helpTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        hlpYOfs += hlpYposAdd/2;
        cp5.addTextlabel("hlpHeader2", messages.getString("GeneratorGui.HLP_HEADER2"), hlpXOfs1, hlpYOfs).moveTo(helpTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        hlpYOfs += hlpYposAdd;
        cp5.addTextlabel("hlpHeader3", messages.getString("GeneratorGui.HLP_HEADER3"), hlpXOfs1, hlpYOfs).moveTo(helpTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        hlpYOfs += hlpYposAdd;
        cp5.addTextlabel("hlpHeader4", messages.getString("GeneratorGui.HLP_HEADER4"), hlpXOfs1, hlpYOfs).moveTo(helpTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        hlpYOfs += hlpYposAdd;
        hlpYOfs += hlpYposAdd/2;
        cp5.addTextlabel("hlpKeyHeader", messages.getString("GeneratorGui.HLP_KEYBINDING_HEADER"), hlpXOfs1, hlpYOfs).moveTo(helpTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
       
        hlpXOfs1 *=2 ;
        hlpYOfs += hlpYposAdd;
        cp5.addTextlabel("HLP_KEY_19", messages.getString("GeneratorGui.HLP_KEY_19"), hlpXOfs1, hlpYOfs).moveTo(helpTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$

        hlpYOfs += hlpYposAdd;
        cp5.addTextlabel("HLP_KEY_F", messages.getString("GeneratorGui.HLP_KEY_F"), hlpXOfs1, hlpYOfs).moveTo(helpTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        cp5.addTextlabel("HLP_KEY_G", messages.getString("GeneratorGui.HLP_KEY_G"), hlpXOfs2, hlpYOfs).moveTo(helpTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$

        hlpYOfs += hlpYposAdd;
        cp5.addTextlabel("HLP_KEY_W", messages.getString("GeneratorGui.HLP_KEY_W"), hlpXOfs1, hlpYOfs).moveTo(helpTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        cp5.addTextlabel("HLP_KEY_E", messages.getString("GeneratorGui.HLP_KEY_E"), hlpXOfs2, hlpYOfs).moveTo(helpTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$

        hlpYOfs += hlpYposAdd;
        cp5.addTextlabel("HLP_KEY_M", messages.getString("GeneratorGui.HLP_KEY_M"), hlpXOfs1, hlpYOfs).moveTo(helpTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
       
        hlpYOfs += hlpYposAdd;
        cp5.addTextlabel("HLP_KEY_C", messages.getString("GeneratorGui.HLP_KEY_C"), hlpXOfs1, hlpYOfs).moveTo(helpTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$

        hlpYOfs += hlpYposAdd;
        cp5.addTextlabel("HLP_KEY_R", messages.getString("GeneratorGui.HLP_KEY_R"), hlpXOfs1, hlpYOfs).moveTo(helpTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
       
        hlpYOfs += hlpYposAdd;
        cp5.addTextlabel("HLP_KEY_LEFT", messages.getString("GeneratorGui.HLP_KEY_LEFT"), hlpXOfs1, hlpYOfs).moveTo(helpTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        cp5.addTextlabel("HLP_KEY_RIGHT", messages.getString("GeneratorGui.HLP_KEY_RIGHT"), hlpXOfs2, hlpYOfs).moveTo(helpTab).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        //----------
        // LOGO
        //----------   

        try {
            logo = loadImage(fu.getDataDir()+File.separator+"gui"+File.separatorChar+"guilogo.jpg");  
            LOG.log(Level.INFO, "GUI logo loaded");
        } catch (Exception e) {
            LOG.log(Level.INFO, "Failed to load gui logo!",e);
        }
       

        //----------
        // MISC
        //----------   

        int xSizeForEachWidget = (windowWidth-2*GENERIC_X_OFS)/NR_OF_WIDGETS;       
       
        cp5.addTextlabel("frameDesc", messages.getString("GeneratorGui.FRAME_PROGRESS"), GENERIC_X_OFS, GENERIC_Y_OFS).moveTo(ALWAYS_VISIBLE_TAB).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        cp5.addTextlabel("sndDesc", messages.getString("GeneratorGui.SOUND_DESC"), GENERIC_X_OFS+xSizeForEachWidget, GENERIC_Y_OFS).moveTo(ALWAYS_VISIBLE_TAB).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        cp5.addTextlabel("sndVol", messages.getString("GeneratorGui.INPUT_VOLUME"), GENERIC_X_OFS+xSizeForEachWidget*2, GENERIC_Y_OFS).moveTo(ALWAYS_VISIBLE_TAB).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        cp5.addTextlabel("outputDevice", messages.getString("GeneratorGui.OUTPUT_DEVICE"), GENERIC_X_OFS+xSizeForEachWidget*3, GENERIC_Y_OFS).moveTo(ALWAYS_VISIBLE_TAB).getValueLabel(); //$NON-NLS-1$ //$NON-NLS-2$
        cp5.addTextlabel("outputDeviceName", col.getOutputDeviceName(), 15+GENERIC_X_OFS+xSizeForEachWidget*3, 2+GENERIC_Y_OFS+10).moveTo(ALWAYS_VISIBLE_TAB).getValueLabel(); //$NON-NLS-1$
       
        //register event listener
        cp5.addListener(listener);

        //select first visual
        selectedVisualList.activate(0);
        selectedOutputs.activate(0);
       
        //register callback function
    GuiUpdateFeedback guf = new GuiUpdateFeedback(this);
    col.addObserver(guf);
    col.notifyGuiUpdate();
   
        initialized = true;
    }

    public void RANDOM_ELEMENT(int val) {
        //unused
    }
   
    /**
     * this callback method is needed by the library but unused
     * @param val
     */
    public void CURRENT_OUTPUT(int val) {
        //unused
    }
   
    /**
     * this callback method is needed by the library but unused
     * @param val
     */
    public void PRESET_BUTTONS(int val) {
        LOG.log(Level.INFO, "choose new preset "+val); //$NON-NLS-1$
        updateCurrentPresetState();
    }

    /**
     * this callback method is needed by the library but unused
     * @param val
     */
    public void CURRENT_VISUAL(int val) {
        //unused
    }
   
   
    /**
     *
     * @param col
     * @return
     */
    private int getVisualCenter(Collector col) {
      if (singleVisualXSize<MINIMAL_VISUAL_WIDTH) {
          return (windowWidth - (col.getAllVisuals().size() * MINIMAL_VISUAL_WIDTH))/2;       
      }
      return (windowWidth - (col.getAllVisuals().size() * singleVisualXSize))/2;
    }
   
    /**
     * draw the whole internal buffer on screen.
     * this method is quite cpu intensive
     */
    public void draw() {
      //background(0);
        long l = System.currentTimeMillis();
        Collector col = Collector.getInstance();
        int localX = getVisualCenter(col);
        int localY=40;

        frames++;

        //clear screen each 2nd frame and put logo on it
        if (frames%2==1) {
            background(0);       
            if (logo!=null) {
                image(logo, width-logo.width, height-logo.height);
            }
        }

        //draw internal buffer only if enabled
        if (col.isInternalVisualsVisible()) {
            //lazy init
            if (pImage==null) {
                //create an image out of the buffer
             
                pImage = this.createImage(singleVisualXSize, singleVisualYSize, PApplet.RGB );
            }

            //set used to find out if visual is on screen
            Set<Integer> outputId = new HashSet<Integer>();
            for (OutputMapping om: col.getAllOutputMappings()) {
                outputId.add(om.getVisualId());
            }
           
            //draw output buffer and marker
            int ofs=0;
            for (Visual v: col.getAllVisuals()) {

                //use always the pixel resize option to reduce cpu load
              buffer = col.getMatrix().resizeBufferForDevice(v.getBuffer(), ResizeName.PIXEL_RESIZE, singleVisualXSize, singleVisualYSize);
             
              pImage.loadPixels();
              System.arraycopy(buffer, 0, pImage.pixels, 0, singleVisualXSize*singleVisualYSize);
              pImage.updatePixels();

              //display the image
              image(pImage, localX, localY);         

              //highlight current output
              if (outputId.contains(ofs)) {
                fill(20, 235, 20);
              } else {
                fill(235, 20, 20);
             
              rect(localX+5, localY+5, 10, 10);       

              //make sure the visuals are not too tight
              if (pImage.width<MINIMAL_VISUAL_WIDTH) {
                    localX += MINIMAL_VISUAL_WIDTH;
              } else {
                    localX += pImage.width;
              }
                ofs++;
            }         
        }       
       
        //beat detection
        displayWidgets(GENERIC_Y_OFS);
       
        //update more details, mostly info tab
        if (frames%10==1) {
            //INFO TAB
            int fps10 = (int)(col.getPixConStat().getCurrentFps()*10);
            currentFps.setText(messages.getString("GeneratorGui.CURRENT_FPS")+fps10/10f); //$NON-NLS-1$
            String runningSince = DurationFormatUtils.formatDuration(System.currentTimeMillis() - col.getPixConStat().getStartTime(), "H:mm:ss");             //$NON-NLS-1$
            runtime.setText(messages.getString("GeneratorGui.RUNNING_SINCE")+runningSince);          //$NON-NLS-1$
            sentFrames.setText(messages.getString("GeneratorGui.SENT_FRAMES")+frames); //$NON-NLS-1$
            int snd1000 = (int)(1000f*Collector.getInstance().getSound().getVolumeNormalized());
            currentVolume.setText(messages.getString("GeneratorGui.CURRENT_VOLUME")+(snd1000/1000f));
           
            IOutput output = col.getOutputDevice();
            if (output!=null) {
                String outputStateStr = WordUtils.capitalizeFully(output.getConnectionStatus());
                outputState.setText(outputStateStr);
                outputErrorCounter.setText(messages.getString("GeneratorGui.IO_ERRORS")+output.getErrorCounter());             //$NON-NLS-1$             
            }
            long recievedMB = col.getPixConStat().getRecievedOscBytes()/1024/1024;
            String oscStat  = messages.getString("GeneratorGui.OSC_STATISTIC")+col.getPixConStat().getRecievedOscPakets()+"/"+recievedMB;
            oscStatistic.setText(oscStat);
           
            Visual v = col.getVisual(col.getCurrentVisual());
            if (v!=null) {       
                if (v.getGenerator1().isPassThoughModeActive() || v.getGenerator2().isPassThoughModeActive()) {
                  passThroughMode.setText(messages.getString("GeneratorGui.PASSTHROUGH_MODE"));
                } else {
                  passThroughMode.setText("");
                }
            }

        }
       
        //update gui
        cp5.draw();

        //track used time
        col.getPixConStat().trackTime(TimeMeasureItemGlobal.DEBUG_WINDOW, System.currentTimeMillis()-l);
    }

   
    /**
     * update preset stuff
     */
    public void updateCurrentPresetState() {
        Collector col = Collector.getInstance();
        PresetSettings preset = col.getPresets().get(col.getSelectedPreset());
        if (preset!=null) {
            String presetState;
            if (preset.isSlotUsed()) {
                presetState = messages.getString("GeneratorGui.STR_TRUE"); //$NON-NLS-1$
            } else {
                presetState = messages.getString("GeneratorGui.STR_FALSE"); //$NON-NLS-1$
            }

            presetInfo.setText(messages.getString("GeneratorGui.VALID_ENTRY_EMPTY")+presetState); //$NON-NLS-1$
            presetName.setText(preset.getName());               
        } else {
            presetInfo.setText(messages.getString("GeneratorGui.VALID_ENTRY_FALSE")); //$NON-NLS-1$
            presetName.setText("");                             //$NON-NLS-1$
        }
       
    }
   
    /**
     *
     * @param localY
     */
    private void displayWidgets(int localY) {
        int xSizeForEachWidget = (windowWidth-2*GENERIC_X_OFS)/NR_OF_WIDGETS;
       
        //display frame progress
        int frames = Collector.getInstance().getFrames() % (xSizeForEachWidget-WIDGET_BOARDER);       
        fill(0, 180, 234);
        rect(GENERIC_X_OFS, localY+SELECTED_MARKER+4, frames, WIDGET_BAR_SIZE);
        fill(2, 52, 77);
        rect(GENERIC_X_OFS+frames, localY+SELECTED_MARKER+4, xSizeForEachWidget-frames-WIDGET_BOARDER, WIDGET_BAR_SIZE);

        //draw sound stats
        ISound snd = Collector.getInstance().getSound();
        int xofs = GENERIC_X_OFS+xSizeForEachWidget;
        int xx = (xSizeForEachWidget-WIDGET_BOARDER*2)/3;

        colorSelect(snd.isKick());
        rect(xofs, localY+SELECTED_MARKER+4, xx, WIDGET_BAR_SIZE);

        xofs+=xx+WIDGET_BOARDER/2;
        colorSelect(snd.isSnare());
        rect(xofs, localY+SELECTED_MARKER+4, xx, WIDGET_BAR_SIZE);

        xofs+=xx+WIDGET_BOARDER/2;
        colorSelect(snd.isHat());       
        rect(xofs, localY+SELECTED_MARKER+4, xx, WIDGET_BAR_SIZE);       
       
        //Draw input volume
        int vol = (int)((xSizeForEachWidget-WIDGET_BOARDER)*snd.getVolumeNormalized());       
        fill(0, 180, 234);
        rect(GENERIC_X_OFS+2*xSizeForEachWidget, localY+SELECTED_MARKER+4, vol, WIDGET_BAR_SIZE);
        fill(2, 52, 77);
        rect(GENERIC_X_OFS+2*xSizeForEachWidget+vol, localY+SELECTED_MARKER+4, xSizeForEachWidget-WIDGET_BOARDER-vol, WIDGET_BAR_SIZE);
       
        //draw output device
        Boolean isConnected = Collector.getInstance().isOutputDeviceConnected();
        if (isConnected!=null) {
            //highlight current output
            if (isConnected) {
                fill(20, 235, 20);
            } else {
                fill(235, 20, 20);
            }  
            rect(3+GENERIC_X_OFS+3*xSizeForEachWidget, localY+SELECTED_MARKER, 10, 10);              
        }
       
    }


    /**
     *
     * @param b
     */
    private void colorSelect(boolean b) {
        if (b) {
            fill(0, 180, 234)
        } else {
            fill(2, 52, 77)
        }   
    }


    /**
     * mouse listener, used to close dropdown lists
     *
     */
    public void mousePressed() {
     
      if (!initialized) {
        return;
      }
     
        // print the current mouseoverlist on mouse pressed
        List <GuiElement> clickedOn = new ArrayList<GuiElement>();
        List<ControllerInterface<?>> lci = cp5.getWindow().getMouseOverList();
        for (ControllerInterface<?> ci: lci) {
            GuiElement ge = GuiElement.getGuiElement(ci.getName());
            if (ge!=null) {
                clickedOn.add(ge);       
            }
        }

        //close all open tabs
        if (!clickedOn.contains(GuiElement.GENERATOR_ONE_DROPDOWN)) {
            generatorListOne.setOpen(false);
        }
        if (!clickedOn.contains(GuiElement.GENERATOR_TWO_DROPDOWN)) {
            generatorListTwo.setOpen(false);
        }
        if (!clickedOn.contains(GuiElement.EFFECT_ONE_DROPDOWN)) {
            effectListOne.setOpen(false);
        }
        if (!clickedOn.contains(GuiElement.EFFECT_TWO_DROPDOWN)) {
            effectListTwo.setOpen(false);
        }
        if (!clickedOn.contains(GuiElement.MIXER_DROPDOWN)) {
            mixerList.setOpen(false);
        }
        if (!clickedOn.contains(GuiElement.COLOR_SET_DROPDOWN)) {
            colorSetList.setOpen(false);
        }

        if (!clickedOn.contains(GuiElement.BLINKENLIGHTS_DROPDOWN)) {
            blinkenLightsList.setOpen(false);
        }
        if (!clickedOn.contains(GuiElement.IMAGE_DROPDOWN)) {
            imageList.setOpen(false);
        }
        if (!clickedOn.contains(GuiElement.OUTPUT_FADER_DROPDOWN)) {
            dropdownOutputFader.setOpen(false);
        }
        if (!clickedOn.contains(GuiElement.OUTPUT_SELECTED_VISUAL_DROPDOWN)) {
            dropdownOutputVisual.setOpen(false);
        }
        if (!clickedOn.contains(GuiElement.TEXTUREDEFORM_OPTIONS)) {
            textureDeformOptions.setOpen(false);
        }
        if (!clickedOn.contains(GuiElement.TEXTWR_OPTION)) {
            textwriterOption.setOpen(false);
        }
        if (!clickedOn.contains(GuiElement.COLORSCROLL_OPTIONS)) {
            colorScrollList.setOpen(false);
        }
        if (!clickedOn.contains(GuiElement.ZOOM_OPTIONS)) {
            zoomOptions.setOpen(false);
        }

        if (allOutputTabVis!=null && !clickedOn.contains(GuiElement.OUTPUT_ALL_SELECTED_VISUAL_DROPDOWN)) {
            allOutputTabVis.setOpen(false);
        }
       
        if (allOutputTabFader!=null && !clickedOn.contains(GuiElement.OUTPUT_ALL_FADER_DROPDOWN)) {
            allOutputTabFader.setOpen(false);
        }

    }


    /**
     * Keyhandler
     *
     * select visual by keypress
     */
    public void keyPressed() {
      //ignore escape key
      if (keyCode==ESC) {
        key=0;
      } else {
            KeyboardHandler.keyboardHandler(key, keyCode);       
      }
    }

    /* (non-Javadoc)
     * @see com.neophob.sematrix.core.output.gui.GuiCallbackAction#activeVisual(int)
     */
    public void activeVisual(int n) {
        selectedVisualList.activate(n);
    }


  /**
   *
   * @return the user specific preset name
   */
    public String getCurrentPresetName() {
        return presetName.getText();
    }

    public boolean isTextfieldInEditMode() {
      if (!initialized) {
        return false;
      }

      return textGenerator.isFocus() || presetName.isFocus();
    }


  public void selectPreviousTab() {
    Tab currentTab = cp5.getWindow().getCurrentTab();
    Tab lastTab=null;
    for (Tab t: allTabs) {
      if (t==currentTab && lastTab!=null) {
        lastTab.bringToFront();
        return;
      }
      lastTab = t;
    }
    //activate the last tab
    allTabs.get(allTabs.size()-1).bringToFront();
  }
 

  public void selectNextTab() {
    boolean activateNextTab = false;   
    Tab currentTab = cp5.getWindow().getCurrentTab();   
   
    for (Tab t: allTabs) {
      if (activateNextTab) {
        //active next tab and return
        t.bringToFront();
        return;
      }
     
      if (t==currentTab) {
        activateNextTab = true;
      }
    }
   
    //active the first tab
    if (activateNextTab) {
      allTabs.get(0).bringToFront();
    }
  }
 

  @Override
  public void updateGuiElements(Map<String, String> diff) {
    for (Map.Entry<String, String> s: diff.entrySet()) {
      try {
        ValidCommands cmd = ValidCommands.valueOf(s.getKey());
        switch (cmd) {
        case CHANGE_GENERATOR_A:         
          generatorListOne.setLabel(generatorListOne.getItem(Integer.parseInt(s.getValue())).getName());         
          break;

        case CHANGE_GENERATOR_B:
          generatorListTwo.setLabel(generatorListTwo.getItem(Integer.parseInt(s.getValue())).getName());         
          break;

        case CHANGE_EFFECT_A:         
          effectListOne.setLabel(effectListOne.getItem(Integer.parseInt(s.getValue())).getName());
          break;

        case CHANGE_EFFECT_B:
          effectListTwo.setLabel(effectListTwo.getItem(Integer.parseInt(s.getValue())).getName());         
          break;

        case CURRENT_VISUAL:
          //nothing todo
          break;
         
        case CHANGE_MIXER:
          mixerList.setLabel(mixerList.getItem(Integer.parseInt(s.getValue())).getName());         
          break;
         
        case BLINKEN:
          blinkenLightsList.setLabel(s.getValue());
          break
         
        case IMAGE:
          imageList.setLabel(s.getValue());
          break;
       
        case CURRENT_COLORSET:
          colorSetList.setLabel(s.getValue());
          break;
         
        case CHANGE_PRESET:
          presetButtons.activate(Integer.parseInt(s.getValue()));
          updateCurrentPresetState();
          break;
         
        case CHANGE_THRESHOLD_VALUE:
          thresholdSlider.changeValue(Float.parseFloat(s.getValue()));
          break;
         
        case CHANGE_ROTOZOOM:
          fxRotoSlider.changeValue(Float.parseFloat(s.getValue()));
          break;
         
        case COLOR_SCROLL_OPT:         
          colorScrollList.setLabel(colorScrollList.getItem(Integer.parseInt(s.getValue())).getName());
          break;
       
        case ZOOMOPT:         
          zoomOptions.setLabel(zoomOptions.getItem(Integer.parseInt(s.getValue())).getName());
          break;
         
        case TEXTWR_OPTION:   
          textwriterOption.setLabel(textwriterOption.getItem(Integer.parseInt(s.getValue())).getName());
          break;
         
        case TEXTDEF:           
          int i = Integer.parseInt(s.getValue());
          textureDeformOptions.setLabel(textureDeformOptions.getItem(i-1).getName());
          break;
       
        case CHANGE_BRIGHTNESS:
          brightnessControll.changeValue(Float.parseFloat(s.getValue()));
          break;
       
        case CHANGE_OUTPUT_FADER:
          dropdownOutputFader.setLabel(dropdownOutputFader.getItem(Integer.parseInt(s.getValue())).getName());
          break;

        case CHANGE_OUTPUT_VISUAL:
          dropdownOutputVisual.setLabel(dropdownOutputVisual.getItem(Integer.parseInt(s.getValue())).getName());
          break;
         
        case TEXTWR:
          textGenerator.setText(s.getValue());
          break;
         
        case GENERATOR_SPEED:
          generatorSpeedSlider.changeValue(Float.parseFloat(s.getValue()));           
          break;
         
        case BEAT_WORKMODE:
          beatWorkmode.setLabel(beatWorkmode.getItem(Integer.parseInt(s.getValue())).getName());
          break;
         
        case FREEZE:
          if (s.getValue().equals("true")) {
            freeze.setBroadcast(false);
            freeze.setState(true);
            freeze.setBroadcast(true);
          } else {
            freeze.setBroadcast(false);
            freeze.setState(false);
            freeze.setBroadcast(true);
          }
         
          break;
         
        default:
          LOG.log(Level.WARNING, "Not implemented: "+s.getKey()+" "+s.getValue());
          break;
        }
      } catch (Exception e) {
        LOG.log(Level.WARNING, "Unknown entry: "+s.getKey(), e);
      }
    }

   
  }

}
TOP

Related Classes of com.neophob.sematrix.gui.GeneratorGui

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.