/******************************************************************************* * Copyright (c) 2008 Olivier Moises * * 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: * Olivier Moises- initial API and implementation *******************************************************************************/ package org.eclipse.wazaabi.engine.swt.commons.views; import org.eclipse.emf.ecore.EClass; 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.Widget; import org.eclipse.wazaabi.engine.core.editparts.AbstractComponentEditPart; import org.eclipse.wazaabi.engine.core.editparts.ScaleEditPart; import org.eclipse.wazaabi.engine.core.views.ScaleView; import org.eclipse.wazaabi.mm.core.Orientation; import org.eclipse.wazaabi.mm.core.styles.BooleanRule; import org.eclipse.wazaabi.mm.core.styles.IntRule; import org.eclipse.wazaabi.mm.core.styles.OrientationRule; import org.eclipse.wazaabi.mm.core.styles.StyleRule; import org.eclipse.wazaabi.mm.core.widgets.Scale; import org.eclipse.wazaabi.mm.swt.descriptors.SWTDescriptorsPackage; public class SWTScaleView extends SWTControlView implements ScaleView { private SelectionListener selectionListener = new SelectionListener() { public void widgetSelected(SelectionEvent e) { int newValue = ((org.eclipse.swt.widgets.Scale) e.widget) .getSelection(); if (((Scale) getHost().getModel()).getValue() != newValue) ((Scale) getHost().getModel()).setValue(newValue); } public void widgetDefaultSelected(SelectionEvent e) { } }; protected SelectionListener getSelectionListener() { return this.selectionListener; } public EClass getWidgetViewEClass() { return SWTDescriptorsPackage.Literals.SCALE; } @Override protected boolean needReCreateWidgetView(StyleRule rule, org.eclipse.swt.widgets.Widget widget) { if (rule instanceof OrientationRule && ScaleEditPart.ORIENTATION_PROPERTY_NAME.equals(rule .getPropertyName())) { return !(isStyleBitCorrectlySet(widget, org.eclipse.swt.SWT.HORIZONTAL, Orientation.HORIZONTAL == ((OrientationRule) rule) .getValue()) & isStyleBitCorrectlySet(widget, org.eclipse.swt.SWT.VERTICAL, Orientation.VERTICAL == ((OrientationRule) rule).getValue())); // we catch the border rule since apparently this SWT widget does // not manage it } else if (rule instanceof BooleanRule && AbstractComponentEditPart.BORDER_PROPERTY_NAME.equals(rule .getPropertyName())) return false; else return super.needReCreateWidgetView(rule, widget); } @Override protected int computeSWTCreationStyle(StyleRule rule) { final String propertyName = rule.getPropertyName(); if (rule instanceof OrientationRule && ScaleEditPart.ORIENTATION_PROPERTY_NAME .equals(propertyName)) if (((OrientationRule) rule).getValue() == Orientation.HORIZONTAL) return SWT.HORIZONTAL; else return SWT.VERTICAL; // we catch the border rule since apparently this SWT widget does not // manage it else if (rule instanceof BooleanRule && ScaleEditPart.BORDER_PROPERTY_NAME.equals(rule .getPropertyName())) return SWT.None; return super.computeSWTCreationStyle(rule); } protected Widget createSWTWidget(Widget parent, int swtStyle, int index) { int style = computeSWTCreationStyle(getHost()); // if no orientation has been given, we set it by default to HORIZONTAL if ((style & SWT.HORIZONTAL) == 0 && ((style & SWT.VERTICAL) == 0)) style |= SWT.HORIZONTAL; final org.eclipse.swt.widgets.Scale scale = new org.eclipse.swt.widgets.Scale( (org.eclipse.swt.widgets.Composite) parent, style); if (getSelectionListener() != null) scale.addSelectionListener(getSelectionListener()); return wrapForSpecificParent((Composite) parent, scale); } public void setValue(int value) { ((org.eclipse.swt.widgets.Scale) getSWTWidget()).setSelection(value); } public int getValue() { return ((org.eclipse.swt.widgets.Scale) getSWTWidget()).getSelection(); } // FIXME : rename this ugly named method !! protected void widgetDisposed() { super.widgetDisposed(); if (getSWTControl() != null && !getSWTControl().isDisposed() && getSelectionListener() != null) ((org.eclipse.swt.widgets.Scale) getSWTControl()) .removeSelectionListener(getSelectionListener()); } @Override public void updateStyleRule(StyleRule rule) { if (rule == null) return; if (ScaleEditPart.MAXIMUM_PROPERTY_NAME.equals(rule.getPropertyName())) if (rule instanceof IntRule) setMaximum((IntRule) rule); else setMaximum(null); else if (ScaleEditPart.MINIMUM_PROPERTY_NAME.equals(rule .getPropertyName())) if (rule instanceof IntRule) setMinimum((IntRule) rule); else setMinimum(null); else if (ScaleEditPart.INCREMENT_PROPERTY_NAME.equals(rule .getPropertyName())) if (rule instanceof IntRule) setIncrement((IntRule) rule); else setIncrement(null); else if (ScaleEditPart.PAGEINCREMENT_PROPERTY_NAME.equals(rule .getPropertyName())) if (rule instanceof IntRule) setPageIncrement((IntRule) rule); else setPageIncrement(null); else super.updateStyleRule(rule); } protected void setMaximum(IntRule rule) { int currentValue = ((org.eclipse.swt.widgets.Scale) getSWTControl()) .getMaximum(); if (rule == null && currentValue != 100) ((org.eclipse.swt.widgets.Scale) getSWTControl()).setMaximum(100); else ((org.eclipse.swt.widgets.Scale) getSWTControl()).setMaximum(rule .getValue()); } protected void setMinimum(IntRule rule) { int currentValue = ((org.eclipse.swt.widgets.Scale) getSWTControl()) .getMinimum(); if (rule == null && currentValue != 0) ((org.eclipse.swt.widgets.Scale) getSWTControl()).setMinimum(0); else ((org.eclipse.swt.widgets.Scale) getSWTControl()).setMinimum(rule .getValue()); } protected void setIncrement(IntRule rule) { int currentValue = ((org.eclipse.swt.widgets.Scale) getSWTControl()) .getIncrement(); if (rule == null && currentValue != 1) ((org.eclipse.swt.widgets.Scale) getSWTControl()).setIncrement(1); else ((org.eclipse.swt.widgets.Scale) getSWTControl()).setIncrement(rule .getValue()); } protected void setPageIncrement(IntRule rule) { int currentValue = ((org.eclipse.swt.widgets.Scale) getSWTControl()) .getIncrement(); if (rule == null && currentValue != 10) ((org.eclipse.swt.widgets.Scale) getSWTControl()).setPageIncrement(10); else ((org.eclipse.swt.widgets.Scale) getSWTControl()).setPageIncrement(rule .getValue()); } }