/*******************************************************************************
* 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.SpinnerEditPart;
import org.eclipse.wazaabi.engine.core.views.SpinnerView;
import org.eclipse.wazaabi.mm.core.styles.BooleanRule;
import org.eclipse.wazaabi.mm.core.styles.IntRule;
import org.eclipse.wazaabi.mm.core.styles.StyleRule;
import org.eclipse.wazaabi.mm.core.widgets.Spinner;
import org.eclipse.wazaabi.mm.swt.descriptors.SWTDescriptorsPackage;
public class SWTSpinnerView extends SWTControlView implements SpinnerView {
private SelectionListener selectionListener = new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
int newValue = ((org.eclipse.swt.widgets.Spinner) e.widget)
.getSelection();
if (((Spinner) getHost().getModel()).getValue() != newValue)
((Spinner) getHost().getModel()).setValue(newValue);
}
public void widgetDefaultSelected(SelectionEvent e) {
}
};
protected SelectionListener getSelectionListener() {
return this.selectionListener;
}
public EClass getWidgetViewEClass() {
return SWTDescriptorsPackage.Literals.SPINNER;
}
@Override
protected int computeSWTCreationStyle(StyleRule rule) {
final String propertyName = rule.getPropertyName();
if (rule instanceof BooleanRule
&& SpinnerEditPart.BORDER_PROPERTY_NAME.equals(propertyName)
&& ((BooleanRule) rule).isValue())
return SWT.BORDER;
return super.computeSWTCreationStyle(rule);
}
protected Widget createSWTWidget(Widget parent, int swtStyle, int index) {
int style = computeSWTCreationStyle(getHost());
final org.eclipse.swt.widgets.Spinner spinner = new org.eclipse.swt.widgets.Spinner(
(org.eclipse.swt.widgets.Composite) parent, style);
if (getSelectionListener() != null)
spinner.addSelectionListener(getSelectionListener());
IntRule max = (IntRule) ((Spinner) getHost().getModel())
.getFirstStyleRule(SpinnerEditPart.MAXIMUM_PROPERTY_NAME, null);
if (max != null) {
spinner.setMaximum(max.getValue());
}
IntRule min = (IntRule) ((Spinner) getHost().getModel())
.getFirstStyleRule(SpinnerEditPart.MINIMUM_PROPERTY_NAME, null);
if (min != null) {
spinner.setMinimum(min.getValue());
}
return wrapForSpecificParent((Composite) parent, spinner);
}
public void setValue(int value) {
IntRule max = (IntRule) ((Spinner) getHost().getModel())
.getFirstStyleRule(SpinnerEditPart.MAXIMUM_PROPERTY_NAME, null);
IntRule min = (IntRule) ((Spinner) getHost().getModel())
.getFirstStyleRule(SpinnerEditPart.MINIMUM_PROPERTY_NAME, null);
if (max != null && value <= max.getValue() || max == null) {
if ((min != null && value >= min.getValue()) || min == null) {
((org.eclipse.swt.widgets.Spinner) getSWTWidget())
.setSelection(value);
}
}
}
public int getValue() {
return ((org.eclipse.swt.widgets.Spinner) getSWTWidget())
.getSelection();
}
// FIXME : rename this ugly named method !!
protected void widgetDisposed() {
super.widgetDisposed();
if (getSWTControl() != null && !getSWTControl().isDisposed()
&& getSelectionListener() != null)
((org.eclipse.swt.widgets.Spinner) getSWTControl())
.removeSelectionListener(getSelectionListener());
}
@Override
public void updateStyleRule(StyleRule rule) {
if (rule == null)
return;
if (SpinnerEditPart.MAXIMUM_PROPERTY_NAME
.equals(rule.getPropertyName()))
if (rule instanceof IntRule)
setMaximum((IntRule) rule);
else
setMaximum(null);
else if (SpinnerEditPart.MINIMUM_PROPERTY_NAME.equals(rule
.getPropertyName()))
if (rule instanceof IntRule)
setMinimum((IntRule) rule);
else
setMinimum(null);
else if (SpinnerEditPart.INCREMENT_PROPERTY_NAME.equals(rule
.getPropertyName()))
if (rule instanceof IntRule)
setIncrement((IntRule) rule);
else
setIncrement(null);
else if (SpinnerEditPart.DIGITS_PROPERTY_NAME.equals(rule
.getPropertyName()))
if (rule instanceof IntRule)
setDigits((IntRule) rule);
else
setDigits(null);
else if (SpinnerEditPart.TEXTLIMIT_PROPERTY_NAME.equals(rule
.getPropertyName()))
if (rule instanceof IntRule)
setTextLimit((IntRule) rule);
else
setTextLimit(null);
else
super.updateStyleRule(rule);
}
protected void setMaximum(IntRule rule) {
int currentValue = ((org.eclipse.swt.widgets.Spinner) getSWTControl())
.getMaximum();
if (rule == null && currentValue != 100)
((org.eclipse.swt.widgets.Spinner) getSWTControl()).setMaximum(100);
else
((org.eclipse.swt.widgets.Spinner) getSWTControl()).setMaximum(rule
.getValue());
}
protected void setMinimum(IntRule rule) {
int currentValue = ((org.eclipse.swt.widgets.Spinner) getSWTControl())
.getMinimum();
if (rule == null && currentValue != 0)
((org.eclipse.swt.widgets.Spinner) getSWTControl()).setMinimum(0);
else
((org.eclipse.swt.widgets.Spinner) getSWTControl()).setMinimum(rule
.getValue());
}
protected void setIncrement(IntRule rule) {
int currentValue = ((org.eclipse.swt.widgets.Spinner) getSWTControl())
.getIncrement();
if (rule == null && currentValue != 1)
((org.eclipse.swt.widgets.Spinner) getSWTControl()).setIncrement(1);
else
((org.eclipse.swt.widgets.Spinner) getSWTControl())
.setIncrement(rule.getValue());
}
protected void setDigits(IntRule rule) {
int currentValue = ((org.eclipse.swt.widgets.Spinner) getSWTControl())
.getDigits();
if (rule == null && currentValue != 0)
((org.eclipse.swt.widgets.Spinner) getSWTControl()).setDigits(0);
else
((org.eclipse.swt.widgets.Spinner) getSWTControl()).setDigits(rule
.getValue());
}
protected void setTextLimit(IntRule rule) {
int currentValue = ((org.eclipse.swt.widgets.Spinner) getSWTControl())
.getTextLimit();
if (rule == null && currentValue != 0)
((org.eclipse.swt.widgets.Spinner) getSWTControl()).setDigits(100);
else
((org.eclipse.swt.widgets.Spinner) getSWTControl())
.setTextLimit(rule.getValue());
}
}