/** | |
* <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) { | |
} | |
}); | |
IModel activeModel = ModelViewManager.getInstance().getActiveModel(); | |
if (activeModel != null) { | |
engine = activeModel.getEngine(); | |
} | |
ModelViewManager.getInstance().getManagerListeners().addModelManagerListener(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) { | |
} | |
} |