Bug fixed: scale is disposed when updating it
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/view/ScaleGranularityControl.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/view/ScaleGranularityControl.java
index a4b861e..a4cbeb8 100644
--- a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/view/ScaleGranularityControl.java
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/view/ScaleGranularityControl.java
@@ -1,180 +1,191 @@
-/**
- * <copyright>
- *
- * Copyright (c) 2009 Metascape, LLC.
- * 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:
- * Metascape - Initial API and Implementation
- *
- * </copyright>
- *
- */
-
-package org.eclipse.amp.axf.ide.view;
-
-import org.eclipse.amp.axf.core.IEngine;
-import org.eclipse.amp.axf.core.IModel;
-import org.eclipse.amp.axf.ide.IModelWorkbenchListener;
-import org.eclipse.amp.axf.ide.ModelViewManager;
-import org.eclipse.amp.axf.time.TimeGranularity;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Scale;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.menus.WorkbenchWindowControlContribution;
-
-/**
- *
- * @author mparker
- * @author jonas.ruettimann
- */
-public class ScaleGranularityControl extends WorkbenchWindowControlContribution implements IModelWorkbenchListener {
-
- IEngine engine;
-
- Scale scale;
-
- private static int SCALE_MID = 50;
-
- private static int SCALE_MAX = 110;
-
- // Around the center area we want to have scale snap to middle.
- private static int CENTER_RANGE = 5;
-
- @Override
- protected Control createControl(Composite parent) {
- scale = new Scale(parent, SWT.HORIZONTAL);
- scale.setMaximum(SCALE_MAX);
- scale.setSelection(SCALE_MID);
- scale.addSelectionListener(new SelectionListener() {
- public void widgetSelected(SelectionEvent e) {
- scaleToEngineGranularity();
- }
-
- public void widgetDefaultSelected(SelectionEvent e) {
- }
- });
-
- ModelViewManager.getInstance().getManagerListeners().addModelManagerListener(ScaleGranularityControl.this);
- return scale;
- }
-
- void scaleToEngineGranularity() {
- TimeGranularity newGranularity = null;
-
- if (Math.abs(scale.getSelection() - SCALE_MID) > CENTER_RANGE) {
- if (scale.getSelection() == scale.getMaximum()) {
- newGranularity = TimeGranularity.createFrequencyGranularity(Integer.MAX_VALUE);
- } else if (scale.getSelection() > SCALE_MID) {
- newGranularity = TimeGranularity.createFrequencyGranularity((scale.getSelection() - SCALE_MID - CENTER_RANGE) * 2);
- } else {
- if (scale.getSelection() > 0) {
- newGranularity = TimeGranularity.createDelayGranularity((SCALE_MID - scale.getSelection()) * 50);
- }
- }
-
- } else {
- if (scale.getSelection() != SCALE_MID) {
- // recursive call w/o blocking
- setScaleSelection(SCALE_MID);
- } else {
- newGranularity = TimeGranularity.DEFAULT_GRANULARITY;
- }
- }
-
- if (newGranularity != null && engine != null) {
- engine.setUpdateGranularity(newGranularity);
- }
- }
-
- /**
- *
- */
- private void engineGranularityToScale() {
- if (engine.getUpdateGranularity() instanceof TimeGranularity) {
- TimeGranularity granularity = (TimeGranularity) engine.getUpdateGranularity();
- if (granularity.getUpdateDelay() > 0) {
- setScaleSelection((int) (granularity.getUpdateDelay() / 50));
- } else if (granularity.getUpdateFrequency() > 1) {
- setScaleSelection((granularity.getUpdateFrequency() / 2 + SCALE_MID));
- } else {
- setScaleSelection(SCALE_MID);
- }
- }
- }
-
- protected void setScaleSelection(final int value) {
- Display.getDefault().asyncExec(new Runnable() {
- public void run() {
- scale.setSelection(value);
- }
- });
- }
-
- /**
- * @param model
- * @see org.eclipse.amp.axf.ide.IModelWorkbenchListener#modelActivated(IModel)
- */
- public void modelActivated(IModel model) {
- if (model != null) {
- Display.getDefault().asyncExec(new Runnable() {
- public void run() {
- scale.setEnabled(true);
- }
- });
- engine = model.getEngine();
- engineGranularityToScale();
- } else {
- engine = null;
- Display.getDefault().asyncExec(new Runnable() {
- public void run() {
- scale.setEnabled(false);
- }
- });
- }
-
- }
-
- /**
- * @param model
- * @see org.eclipse.amp.axf.ide.IModelWorkbenchListener#modelAdded(IModel)
- */
- public void modelAdded(IModel model) {
- }
-
- /**
- * @param model
- * @see org.eclipse.amp.axf.ide.IModelWorkbenchListener#modelRemoved(IModel)
- */
- public void modelRemoved(IModel model) {
- }
-
- /**
- * @param part
- * @see org.eclipse.amp.axf.ide.IModelWorkbenchListener#viewActivated(org.eclipse.ui.IWorkbenchPart)
- */
- public void viewActivated(IWorkbenchPart part) {
- }
-
- /**
- * @param part
- * @see org.eclipse.amp.axf.ide.IModelWorkbenchListener#viewAdded(org.eclipse.ui.IWorkbenchPart)
- */
- public void viewAdded(IWorkbenchPart part) {
- }
-
- /**
- * @param part
- * @see org.eclipse.amp.axf.ide.IModelWorkbenchListener#viewRemoved(org.eclipse.ui.IWorkbenchPart)
- */
- public void viewRemoved(IWorkbenchPart part) {
- }
-}
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2009 Metascape, LLC.
+ * 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:
+ * Metascape - Initial API and Implementation
+ *
+ * </copyright>
+ *
+ */
+
+package org.eclipse.amp.axf.ide.view;
+
+import org.eclipse.amp.axf.core.IEngine;
+import org.eclipse.amp.axf.core.IModel;
+import org.eclipse.amp.axf.ide.IModelWorkbenchListener;
+import org.eclipse.amp.axf.ide.ModelViewManager;
+import org.eclipse.amp.axf.time.TimeGranularity;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Scale;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.menus.WorkbenchWindowControlContribution;
+
+/**
+ *
+ * @author mparker
+ * @author jonas.ruettimann
+ */
+public class ScaleGranularityControl extends WorkbenchWindowControlContribution implements IModelWorkbenchListener {
+
+ IEngine engine;
+
+ Scale scale;
+
+ private static int SCALE_MID = 50;
+
+ private static int SCALE_MAX = 110;
+
+ // Around the center area we want to have scale snap to middle.
+ private static int CENTER_RANGE = 5;
+
+ @Override
+ protected Control createControl(Composite parent) {
+ scale = new Scale(parent, SWT.HORIZONTAL);
+ scale.setMaximum(SCALE_MAX);
+ scale.setSelection(SCALE_MID);
+ scale.addSelectionListener(new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent e) {
+ scaleToEngineGranularity();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+ });
+
+ ModelViewManager.getInstance().getManagerListeners().addModelManagerListener(ScaleGranularityControl.this);
+ return scale;
+ }
+
+ void scaleToEngineGranularity() {
+ TimeGranularity newGranularity = null;
+
+ if (Math.abs(scale.getSelection() - SCALE_MID) > CENTER_RANGE) {
+ if (scale.getSelection() == scale.getMaximum()) {
+ newGranularity = TimeGranularity.createFrequencyGranularity(Integer.MAX_VALUE);
+ } else if (scale.getSelection() > SCALE_MID) {
+ newGranularity = TimeGranularity
+ .createFrequencyGranularity((scale.getSelection() - SCALE_MID - CENTER_RANGE) * 2);
+ } else {
+ if (scale.getSelection() > 0) {
+ newGranularity = TimeGranularity.createDelayGranularity((SCALE_MID - scale.getSelection()) * 50);
+ }
+ }
+
+ } else {
+ if (scale.getSelection() != SCALE_MID) {
+ // recursive call w/o blocking
+ setScaleSelection(SCALE_MID);
+ } else {
+ newGranularity = TimeGranularity.DEFAULT_GRANULARITY;
+ }
+ }
+
+ if (newGranularity != null && engine != null) {
+ engine.setUpdateGranularity(newGranularity);
+ }
+ }
+
+ /**
+ *
+ */
+ private void engineGranularityToScale() {
+ if (engine.getUpdateGranularity() instanceof TimeGranularity) {
+ TimeGranularity granularity = (TimeGranularity) engine.getUpdateGranularity();
+ if (granularity.getUpdateDelay() > 0) {
+ setScaleSelection((int) (granularity.getUpdateDelay() / 50));
+ } else if (granularity.getUpdateFrequency() > 1) {
+ setScaleSelection((granularity.getUpdateFrequency() / 2 + SCALE_MID));
+ } else {
+ setScaleSelection(SCALE_MID);
+ }
+ }
+ }
+
+ protected void setScaleSelection(final int value) {
+ Display.getDefault().asyncExec(new Runnable() {
+
+ public void run() {
+ if (scale != null && !scale.isDisposed()) {
+ scale.setSelection(value);
+ }
+ }
+ });
+ }
+
+ /**
+ * @param model
+ * @see org.eclipse.amp.axf.ide.IModelWorkbenchListener#modelActivated(IModel)
+ */
+ public void modelActivated(IModel model) {
+ if (model != null) {
+ Display.getDefault().asyncExec(new Runnable() {
+
+ public void run() {
+ if (scale != null && !scale.isDisposed()) {
+ scale.setEnabled(true);
+ }
+ }
+ });
+ engine = model.getEngine();
+ engineGranularityToScale();
+ } else {
+ engine = null;
+ Display.getDefault().asyncExec(new Runnable() {
+
+ public void run() {
+ if (scale != null && !scale.isDisposed()) {
+ scale.setEnabled(false);
+ }
+ }
+ });
+ }
+
+ }
+
+ /**
+ * @param model
+ * @see org.eclipse.amp.axf.ide.IModelWorkbenchListener#modelAdded(IModel)
+ */
+ public void modelAdded(IModel model) {
+ }
+
+ /**
+ * @param model
+ * @see org.eclipse.amp.axf.ide.IModelWorkbenchListener#modelRemoved(IModel)
+ */
+ public void modelRemoved(IModel model) {
+ }
+
+ /**
+ * @param part
+ * @see org.eclipse.amp.axf.ide.IModelWorkbenchListener#viewActivated(org.eclipse.ui.IWorkbenchPart)
+ */
+ public void viewActivated(IWorkbenchPart part) {
+ }
+
+ /**
+ * @param part
+ * @see org.eclipse.amp.axf.ide.IModelWorkbenchListener#viewAdded(org.eclipse.ui.IWorkbenchPart)
+ */
+ public void viewAdded(IWorkbenchPart part) {
+ }
+
+ /**
+ * @param part
+ * @see org.eclipse.amp.axf.ide.IModelWorkbenchListener#viewRemoved(org.eclipse.ui.IWorkbenchPart)
+ */
+ public void viewRemoved(IWorkbenchPart part) {
+ }
+}