]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.simulation.ui/src/org/simantics/simulation/ui/handlers/TimerContribution.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.simulation.ui / src / org / simantics / simulation / ui / handlers / TimerContribution.java
index 3cee539a46324ae84c78a5ee62cb7dc50b6eeddd..e3734876297cfc2eec19d4f81f2b602df79435d4 100644 (file)
-/*******************************************************************************\r
- * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
- * in Industry THTH ry.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- *     VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.simulation.ui.handlers;\r
-\r
-import java.util.concurrent.ScheduledFuture;\r
-import java.util.concurrent.TimeUnit;\r
-\r
-import org.eclipse.jface.action.IContributionItem;\r
-import org.eclipse.jface.resource.ColorDescriptor;\r
-import org.eclipse.jface.resource.JFaceResources;\r
-import org.eclipse.jface.resource.LocalResourceManager;\r
-import org.eclipse.jface.resource.ResourceManager;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.graphics.Color;\r
-import org.eclipse.swt.graphics.Point;\r
-import org.eclipse.swt.graphics.RGB;\r
-import org.eclipse.swt.widgets.Event;\r
-import org.eclipse.swt.widgets.Listener;\r
-import org.eclipse.swt.widgets.Text;\r
-import org.eclipse.swt.widgets.ToolBar;\r
-import org.eclipse.swt.widgets.ToolItem;\r
-import org.eclipse.ui.PlatformUI;\r
-import org.eclipse.ui.actions.CompoundContributionItem;\r
-import org.simantics.project.IProject;\r
-import org.simantics.simulation.experiment.ExperimentState;\r
-import org.simantics.simulation.experiment.IDynamicExperiment;\r
-import org.simantics.simulation.experiment.IDynamicExperimentListener;\r
-import org.simantics.simulation.experiment.IExperiment;\r
-import org.simantics.simulation.experiment.IExperimentListener;\r
-import org.simantics.simulation.experiment.SimulationTimeUtil;\r
-import org.simantics.simulation.project.IExperimentManager;\r
-import org.simantics.simulation.project.IExperimentManagerListener;\r
-import org.simantics.ui.SimanticsUI;\r
-import org.simantics.utils.threads.ThreadUtils;\r
-\r
-\r
-public class TimerContribution extends CompoundContributionItem {\r
-\r
-    private static final long LABEL_UPDATE_MIN_PERIOD_MS = 100;\r
-\r
-    enum Mode {\r
-        HMS,\r
-        SECONDS;\r
-        Mode next() {\r
-            switch (this) {\r
-                case HMS: return SECONDS;\r
-                case SECONDS: return HMS;\r
-                default: return HMS;\r
-            }\r
-        }\r
-    }\r
-\r
-    boolean              disposed = false;\r
-    Text                 label;\r
-    int                  width;\r
-    double               time     = 0.0;\r
-    private Mode         mode     = Mode.HMS;\r
-    private ToolItem     ti;\r
-    private IExperimentManager experimentManager;\r
-    private IExperimentManagerListener experimentManagerListener;\r
-    private ExperimentState currentState;\r
-\r
-    private ResourceManager            resourceManager;\r
-\r
-    private static ColorDescriptor     RUNNING_BG = ColorDescriptor.createFrom(new RGB(0, 128, 0));\r
-    private static ColorDescriptor     RUNNING_FG = ColorDescriptor.createFrom(new RGB(255, 255, 255));\r
-\r
-    public TimerContribution() {\r
-        super("org.simantics.simulation.ui.timer");\r
-    }\r
-\r
-    @Override\r
-    protected IContributionItem[] getContributionItems() {\r
-        return new IContributionItem[0];\r
-    }\r
-\r
-    String getTime() {\r
-        if (mode == Mode.SECONDS)\r
-            return SimulationTimeUtil.formatSeconds(time);\r
-        return SimulationTimeUtil.formatHMSS(time);\r
-    }\r
-\r
-    @Override\r
-    public void fill(final ToolBar parent, final int index) {\r
-        //System.out.println(this + "(" + System.identityHashCode(this) + ") FILL");\r
-\r
-        IProject project = SimanticsUI.peekProject();\r
-        if (project == null)\r
-            return;\r
-\r
-        IExperimentManager manager = project.getHint(IExperimentManager.KEY_EXPERIMENT_MANAGER);\r
-        if(manager == null)\r
-            return;\r
-\r
-        IExperiment active = manager.getActiveExperiment();\r
-        if (!(active instanceof IDynamicExperiment))\r
-            return;\r
-\r
-        //System.out.println(this + "(" + System.identityHashCode(this) + ") got DynamicExperiment: " + active);\r
-\r
-        ti = new ToolItem(parent, SWT.SEPARATOR, index);\r
-        ti.setText("Simulation Timer");\r
-        ti.setToolTipText("Simulation Timer");\r
-        label = new Text(parent, SWT.BORDER | SWT.CENTER | SWT.READ_ONLY);\r
-        label.setText(getTime());\r
-\r
-        this.resourceManager = new LocalResourceManager(JFaceResources.getResources(), label);\r
-\r
-        updateTooltip();\r
-\r
-        Listener labelListener = new Listener() {\r
-            boolean pressed = false;\r
-            boolean inside = false;\r
-            @Override\r
-            public void handleEvent(Event event) {\r
-                switch (event.type) {\r
-                    case SWT.MouseDown:\r
-                        if (inside && (event.button == 1 || event.button == 2))\r
-                            pressed = true;\r
-                        break;\r
-                    case SWT.MouseUp:\r
-                        if (pressed && inside) {\r
-                            pressed = false;\r
-                            toggleMode();\r
-                        }\r
-                        break;\r
-                    case SWT.MouseEnter:\r
-                        inside = true;\r
-                        break;\r
-                    case SWT.MouseExit:\r
-                        inside = false;\r
-                        break;\r
-                }\r
-            }\r
-        };\r
-        label.addListener(SWT.MouseDown, labelListener);\r
-        label.addListener(SWT.MouseEnter, labelListener);\r
-        label.addListener(SWT.MouseExit, labelListener);\r
-        label.addListener(SWT.MouseUp, labelListener);\r
-\r
-        width = label.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x;\r
-        ti.setWidth(width);\r
-        ti.setControl(label);\r
-\r
-        if (currentState != null)\r
-            setLabelVisualsByState(currentState);\r
-\r
-        attachToExperimentManager(manager);\r
-    }\r
-\r
-    private void attachToExperimentManager(final IExperimentManager manager) {\r
-        if (experimentManager != null) {\r
-            if (experimentManager.equals(manager))\r
-                return;\r
-            experimentManager.removeListener(experimentManagerListener);\r
-        }\r
-        if (manager == null)\r
-            return;\r
-\r
-        //System.out.println(this + "(" + System.identityHashCode(this) + ") ATTACH TO EXPERIMENT MANAGER " + manager);\r
-\r
-        experimentManagerListener = new IExperimentManagerListener() {\r
-            IDynamicExperiment currentExperiment;\r
-            IExperimentListener currentListener;\r
-\r
-            @Override\r
-            public void managerDisposed() {\r
-                manager.removeListener(this);\r
-            }\r
-            @Override\r
-            public void activeExperimentUnloaded() {\r
-                attachToExperiment(null);\r
-            }\r
-            @Override\r
-            public void activeExperimentLoaded(IExperiment experiment) {\r
-                attachToExperiment(experiment);\r
-            }\r
-            synchronized void attachToExperiment(final IExperiment experiment) {\r
-                if (currentExperiment != null) {\r
-                    currentExperiment.removeListener(currentListener);\r
-                    currentExperiment = null;\r
-                    currentListener = null;\r
-                }\r
-\r
-                if (experiment == null)\r
-                    return;\r
-                if (!(experiment instanceof IDynamicExperiment))\r
-                    return;\r
-\r
-                IDynamicExperiment dynExp = (IDynamicExperiment) experiment;\r
-                //System.out.println(TimerContribution.this + "(" + System.identityHashCode(TimerContribution.this) + ") ATTACH TO EXPERIMENT " + dynExp);\r
-\r
-                IDynamicExperimentListener listener = new IDynamicExperimentListener() {\r
-                    final IExperimentListener _this = this;\r
-                    long lastUpdateTime = 0;\r
-                    ScheduledFuture<?> timedUpdate = null;\r
-                    ExperimentState lastState = null;\r
-                    @Override\r
-                    public void timeChanged(double newTime) {\r
-                        //System.out.println(this + ".timeChanged: " + newTime);\r
-                        time = newTime;\r
-\r
-                        ScheduledFuture<?> f = timedUpdate;\r
-                        if (f != null && !f.isDone())\r
-                            return;\r
-\r
-                        long timeSinceLastUpdate = System.currentTimeMillis() - lastUpdateTime;\r
-\r
-                        if (timeSinceLastUpdate > LABEL_UPDATE_MIN_PERIOD_MS) {\r
-                            scheduleLabelUpdate();\r
-                        } else {\r
-                            timedUpdate = ThreadUtils.getNonBlockingWorkExecutor().schedule(new Runnable() {\r
-                                @Override\r
-                                public void run() {\r
-                                    scheduleLabelUpdate();\r
-                                }\r
-                            }, LABEL_UPDATE_MIN_PERIOD_MS - timeSinceLastUpdate, TimeUnit.MILLISECONDS);\r
-                        }\r
-                    }\r
-                    private void scheduleLabelUpdate() {\r
-                        lastUpdateTime = System.currentTimeMillis();\r
-                        timedUpdate = null;\r
-\r
-                        PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {\r
-                            @Override\r
-                            public void run() {\r
-                                //System.out.println("updating time label: " + time);\r
-                                //System.out.println("label isdisposed: " + label.isDisposed());\r
-                                if (!label.isDisposed())\r
-                                    updateLabel();\r
-\r
-                                if (lastState != currentState) {\r
-                                    setLabelVisualsByState(currentState);\r
-                                    lastState = currentState;\r
-                                }\r
-                            }\r
-                        });\r
-                    }\r
-                    @Override\r
-                    public void stateChanged(ExperimentState state) {\r
-                        //System.out.println("TimerContribution: state changed: " + state);\r
-                        currentState = state;\r
-                        if (state == ExperimentState.DISPOSED)\r
-                            experiment.removeListener(_this);\r
-                        else\r
-                            scheduleLabelUpdate();\r
-                    }\r
-                };\r
-                experiment.addListener(listener);\r
-\r
-                currentExperiment = dynExp;\r
-                currentListener = listener;\r
-            }\r
-        };\r
-\r
-        experimentManager = manager;\r
-        manager.addListener(experimentManagerListener);\r
-    }\r
-\r
-    private void toggleMode() {\r
-        mode = mode.next();\r
-        if (label.isDisposed())\r
-            return;\r
-        updateLabel();\r
-        updateTooltip();\r
-    }\r
-\r
-    private void updateTooltip() {\r
-        if (label.isDisposed())\r
-            return;\r
-        switch (mode) {\r
-            case HMS:\r
-                label.setToolTipText("Shows simulation time in HMS");\r
-                break;\r
-            case SECONDS:\r
-                label.setToolTipText("Shows simulation time in seconds");\r
-                break;\r
-        }\r
-    }\r
-\r
-    private void updateLabel() {\r
-        // Try to keep selection.\r
-        Point selection = label.getSelection();\r
-        String oldText = label.getText();\r
-        String newText = getTime();\r
-        if (selection.y == oldText.length())\r
-            selection.y = newText.length();\r
-        else\r
-            selection.y = Math.min(selection.y, newText.length());\r
-\r
-        label.setText(newText);\r
-        label.setSelection(selection);\r
-        int newWidth = label.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x;\r
-        if (newWidth != width) {\r
-            label.pack();\r
-            width = newWidth;\r
-            if (!ti.isDisposed()) {\r
-                ti.setWidth(width);\r
-                if (!ti.getParent().isDisposed())\r
-                    ti.getParent().pack();\r
-            }\r
-        }\r
-    }\r
-\r
-    @Override\r
-    public void dispose() {\r
-        disposed = true;\r
-        //System.out.println(this + "(" + System.identityHashCode(this) + ") DISPOSE");\r
-        attachToExperimentManager(null);\r
-    }\r
-\r
-    @Override\r
-    public boolean isDynamic() {\r
-        return true;\r
-    }\r
-\r
-    /**\r
-     * @param currentState\r
-     * @thread SWT\r
-     */\r
-    private void setLabelVisualsByState(ExperimentState currentState) {\r
-        if (label.isDisposed())\r
-            return;\r
-        switch (currentState) {\r
-            case RUNNING:\r
-                label.setBackground((Color) resourceManager.get(RUNNING_BG));\r
-                label.setForeground((Color) resourceManager.get(RUNNING_FG));\r
-                //label.setFont((Font) resourceManager.get(FontDescriptor.createFrom(label.getFont()).setStyle(SWT.BOLD)));\r
-                label.setEnabled(true);\r
-                break;\r
-            case STOPPED:\r
-                label.setBackground(null);\r
-                label.setForeground(null);\r
-                label.setFont(null);\r
-                label.setEnabled(true);\r
-                break;\r
-            case INITIALIZING:\r
-                label.setBackground(null);\r
-                label.setForeground(null);\r
-                label.setFont(null);\r
-                label.setEnabled(false);\r
-                break;\r
-        }\r
-    }\r
-\r
-}\r
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management
+ * in Industry THTH ry.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     VTT Technical Research Centre of Finland - initial API and implementation
+ *******************************************************************************/
+package org.simantics.simulation.ui.handlers;
+
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.resource.ColorDescriptor;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.resource.LocalResourceManager;
+import org.eclipse.jface.resource.ResourceManager;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.CompoundContributionItem;
+import org.simantics.project.IProject;
+import org.simantics.simulation.experiment.ExperimentState;
+import org.simantics.simulation.experiment.IDynamicExperiment;
+import org.simantics.simulation.experiment.IDynamicExperimentListener;
+import org.simantics.simulation.experiment.IExperiment;
+import org.simantics.simulation.experiment.IExperimentListener;
+import org.simantics.simulation.experiment.SimulationTimeUtil;
+import org.simantics.simulation.project.IExperimentManager;
+import org.simantics.simulation.project.IExperimentManagerListener;
+import org.simantics.ui.SimanticsUI;
+import org.simantics.utils.threads.ThreadUtils;
+
+
+public class TimerContribution extends CompoundContributionItem {
+
+    private static final long LABEL_UPDATE_MIN_PERIOD_MS = 100;
+
+    enum Mode {
+        HMS,
+        SECONDS;
+        Mode next() {
+            switch (this) {
+                case HMS: return SECONDS;
+                case SECONDS: return HMS;
+                default: return HMS;
+            }
+        }
+    }
+
+    boolean              disposed = false;
+    Text                 label;
+    int                  width;
+    double               time     = 0.0;
+    private Mode         mode     = Mode.HMS;
+    private ToolItem     ti;
+    private IExperimentManager experimentManager;
+    private IExperimentManagerListener experimentManagerListener;
+    private ExperimentState currentState;
+
+    private ResourceManager            resourceManager;
+
+    private static ColorDescriptor     RUNNING_BG = ColorDescriptor.createFrom(new RGB(0, 128, 0));
+    private static ColorDescriptor     RUNNING_FG = ColorDescriptor.createFrom(new RGB(255, 255, 255));
+
+    public TimerContribution() {
+        super("org.simantics.simulation.ui.timer");
+    }
+
+    @Override
+    protected IContributionItem[] getContributionItems() {
+        return new IContributionItem[0];
+    }
+
+    String getTime() {
+        if (mode == Mode.SECONDS)
+            return SimulationTimeUtil.formatSeconds(time);
+        return SimulationTimeUtil.formatHMSS(time);
+    }
+
+    @Override
+    public void fill(final ToolBar parent, final int index) {
+        //System.out.println(this + "(" + System.identityHashCode(this) + ") FILL");
+
+        IProject project = SimanticsUI.peekProject();
+        if (project == null)
+            return;
+
+        IExperimentManager manager = project.getHint(IExperimentManager.KEY_EXPERIMENT_MANAGER);
+        if(manager == null)
+            return;
+
+        IExperiment active = manager.getActiveExperiment();
+        if (!(active instanceof IDynamicExperiment))
+            return;
+
+        //System.out.println(this + "(" + System.identityHashCode(this) + ") got DynamicExperiment: " + active);
+
+        ti = new ToolItem(parent, SWT.SEPARATOR, index);
+        ti.setText("Simulation Timer");
+        ti.setToolTipText("Simulation Timer");
+        label = new Text(parent, SWT.BORDER | SWT.CENTER | SWT.READ_ONLY);
+        label.setText(getTime());
+
+        this.resourceManager = new LocalResourceManager(JFaceResources.getResources(), label);
+
+        updateTooltip();
+
+        Listener labelListener = new Listener() {
+            boolean pressed = false;
+            boolean inside = false;
+            @Override
+            public void handleEvent(Event event) {
+                switch (event.type) {
+                    case SWT.MouseDown:
+                        if (inside && (event.button == 1 || event.button == 2))
+                            pressed = true;
+                        break;
+                    case SWT.MouseUp:
+                        if (pressed && inside) {
+                            pressed = false;
+                            toggleMode();
+                        }
+                        break;
+                    case SWT.MouseEnter:
+                        inside = true;
+                        break;
+                    case SWT.MouseExit:
+                        inside = false;
+                        break;
+                }
+            }
+        };
+        label.addListener(SWT.MouseDown, labelListener);
+        label.addListener(SWT.MouseEnter, labelListener);
+        label.addListener(SWT.MouseExit, labelListener);
+        label.addListener(SWT.MouseUp, labelListener);
+
+        width = label.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x;
+        ti.setWidth(width);
+        ti.setControl(label);
+
+        if (currentState != null)
+            setLabelVisualsByState(currentState);
+
+        attachToExperimentManager(manager);
+    }
+
+    private void attachToExperimentManager(final IExperimentManager manager) {
+        if (experimentManager != null) {
+            if (experimentManager.equals(manager))
+                return;
+            experimentManager.removeListener(experimentManagerListener);
+        }
+        if (manager == null)
+            return;
+
+        //System.out.println(this + "(" + System.identityHashCode(this) + ") ATTACH TO EXPERIMENT MANAGER " + manager);
+
+        experimentManagerListener = new IExperimentManagerListener() {
+            IDynamicExperiment currentExperiment;
+            IExperimentListener currentListener;
+
+            @Override
+            public void managerDisposed() {
+                manager.removeListener(this);
+            }
+            @Override
+            public void activeExperimentUnloaded() {
+                attachToExperiment(null);
+            }
+            @Override
+            public void activeExperimentLoaded(IExperiment experiment) {
+                attachToExperiment(experiment);
+            }
+            synchronized void attachToExperiment(final IExperiment experiment) {
+                if (currentExperiment != null) {
+                    currentExperiment.removeListener(currentListener);
+                    currentExperiment = null;
+                    currentListener = null;
+                }
+
+                if (experiment == null)
+                    return;
+                if (!(experiment instanceof IDynamicExperiment))
+                    return;
+
+                IDynamicExperiment dynExp = (IDynamicExperiment) experiment;
+                //System.out.println(TimerContribution.this + "(" + System.identityHashCode(TimerContribution.this) + ") ATTACH TO EXPERIMENT " + dynExp);
+
+                IDynamicExperimentListener listener = new IDynamicExperimentListener() {
+                    final IExperimentListener _this = this;
+                    long lastUpdateTime = 0;
+                    ScheduledFuture<?> timedUpdate = null;
+                    ExperimentState lastState = null;
+                    @Override
+                    public void timeChanged(double newTime) {
+                        //System.out.println(this + ".timeChanged: " + newTime);
+                        time = newTime;
+
+                        ScheduledFuture<?> f = timedUpdate;
+                        if (f != null && !f.isDone())
+                            return;
+
+                        long timeSinceLastUpdate = System.currentTimeMillis() - lastUpdateTime;
+
+                        if (timeSinceLastUpdate > LABEL_UPDATE_MIN_PERIOD_MS) {
+                            scheduleLabelUpdate();
+                        } else {
+                            timedUpdate = ThreadUtils.getNonBlockingWorkExecutor().schedule(new Runnable() {
+                                @Override
+                                public void run() {
+                                    scheduleLabelUpdate();
+                                }
+                            }, LABEL_UPDATE_MIN_PERIOD_MS - timeSinceLastUpdate, TimeUnit.MILLISECONDS);
+                        }
+                    }
+                    private void scheduleLabelUpdate() {
+                        lastUpdateTime = System.currentTimeMillis();
+                        timedUpdate = null;
+
+                        PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+                            @Override
+                            public void run() {
+                                //System.out.println("updating time label: " + time);
+                                //System.out.println("label isdisposed: " + label.isDisposed());
+                                if (!label.isDisposed())
+                                    updateLabel();
+
+                                if (lastState != currentState) {
+                                    setLabelVisualsByState(currentState);
+                                    lastState = currentState;
+                                }
+                            }
+                        });
+                    }
+                    @Override
+                    public void stateChanged(ExperimentState state) {
+                        //System.out.println("TimerContribution: state changed: " + state);
+                        currentState = state;
+                        if (state == ExperimentState.DISPOSED)
+                            experiment.removeListener(_this);
+                        else
+                            scheduleLabelUpdate();
+                    }
+                };
+                experiment.addListener(listener);
+
+                currentExperiment = dynExp;
+                currentListener = listener;
+            }
+        };
+
+        experimentManager = manager;
+        manager.addListener(experimentManagerListener);
+    }
+
+    private void toggleMode() {
+        mode = mode.next();
+        if (label.isDisposed())
+            return;
+        updateLabel();
+        updateTooltip();
+    }
+
+    private void updateTooltip() {
+        if (label.isDisposed())
+            return;
+        switch (mode) {
+            case HMS:
+                label.setToolTipText("Shows simulation time in HMS");
+                break;
+            case SECONDS:
+                label.setToolTipText("Shows simulation time in seconds");
+                break;
+        }
+    }
+
+    private void updateLabel() {
+        // Try to keep selection.
+        Point selection = label.getSelection();
+        String oldText = label.getText();
+        String newText = getTime();
+        if (selection.y == oldText.length())
+            selection.y = newText.length();
+        else
+            selection.y = Math.min(selection.y, newText.length());
+
+        label.setText(newText);
+        label.setSelection(selection);
+        int newWidth = label.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x;
+        if (newWidth != width) {
+            label.pack();
+            width = newWidth;
+            if (!ti.isDisposed()) {
+                ti.setWidth(width);
+                if (!ti.getParent().isDisposed())
+                    ti.getParent().pack();
+            }
+        }
+    }
+
+    @Override
+    public void dispose() {
+        disposed = true;
+        //System.out.println(this + "(" + System.identityHashCode(this) + ") DISPOSE");
+        attachToExperimentManager(null);
+    }
+
+    @Override
+    public boolean isDynamic() {
+        return true;
+    }
+
+    /**
+     * @param currentState
+     * @thread SWT
+     */
+    private void setLabelVisualsByState(ExperimentState currentState) {
+        if (label.isDisposed())
+            return;
+        switch (currentState) {
+            case RUNNING:
+                label.setBackground((Color) resourceManager.get(RUNNING_BG));
+                label.setForeground((Color) resourceManager.get(RUNNING_FG));
+                //label.setFont((Font) resourceManager.get(FontDescriptor.createFrom(label.getFont()).setStyle(SWT.BOLD)));
+                label.setEnabled(true);
+                break;
+            case STOPPED:
+                label.setBackground(null);
+                label.setForeground(null);
+                label.setFont(null);
+                label.setEnabled(true);
+                break;
+            case INITIALIZING:
+                label.setBackground(null);
+                label.setForeground(null);
+                label.setFont(null);
+                label.setEnabled(false);
+                break;
+        }
+    }
+
+}