/*******************************************************************************
* Copyright (c) 2007-2008 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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
*
* Contributor:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.model.ui.attribute.editor;
import java.beans.PropertyChangeListener;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Slider;
import org.jboss.tools.common.model.ui.IAttributeErrorProvider;
import org.jboss.tools.common.model.ui.IValueChangeListener;
import org.jboss.tools.common.model.ui.IValueProvider;
import org.jboss.tools.common.model.ui.widgets.IWidgetSettings;
public class SliderFieldEditor2 extends ExtendedFieldEditor implements
IFieldEditor, IPropertyFieldEditor, IPropertyChangeListener,
PropertyChangeListener {
protected IPropertyEditor propertyEditor;
protected IValueProvider valueProvider;
protected IValueChangeListener valueChangeListener;
private static final String SLIDER_LABEL_DEFAULT_TEXT = "50% "; //$NON-NLS-1$
private static final int MAX_SLIDER_VALUE = 1000;
private static final int MIN_SLIDER_VALUE = 0;
private static final int INCREMENT_SLIDER_VALUE = 10;
private static final int DEFAULT_SLIDER_VALUE = 500;
private Composite composite = null;
private Label sliderLabel = null;
private Slider slider = null;
private SelectionListener selectionListener = null;
private int intValue = 0;
public SliderFieldEditor2() {
super();
}
public SliderFieldEditor2(IWidgetSettings settings) {
super(settings);
}
public SliderFieldEditor2(IPropertyEditor propertyEditor) {
super();
this.propertyEditor = propertyEditor;
}
/**
* Initializes the slider.
*/
protected void init() {
/*
* Initialize slider selection value with stored value
*/
try {
intValue = Integer.parseInt(valueProvider.getStringValue(true));
} catch (NumberFormatException e) {
// Do nothing
}
setPropertyChangeListener(this);
valueProvider.addValueChangeListener(this);
}
@Override
protected void adjustForNumColumns(int numColumns) {
if (null != composite) {
if (null != composite.getLayoutData()) {
((GridData)slider.getLayoutData()).horizontalSpan = numColumns;
}
}
}
@Override
protected void doFillIntoGrid(Composite parent, int numColumns) {
getLabelComposite(parent);
Control control = createSpinnerControl(parent);
GridData gd;
gd = new GridData(GridData.FILL_HORIZONTAL);
control.setLayoutData(gd);
}
@Override
protected void doLoad() {
if (null != slider) {
slider.setSelection(getPreferenceStore().getInt(getPreferenceName()));
valueChanged();
}
}
@Override
protected void doLoadDefault() {
if (null != slider) {
slider.setSelection(getPreferenceStore().getDefaultInt(getPreferenceName()));
valueChanged();
}
}
@Override
protected void doStore() {
if (null != slider) {
getPreferenceStore().setValue(getPreferenceName(), slider.getSelection());
}
}
public int getNumberOfControls() {
return 2;
}
public Control[] getControls(Composite parent) {
return new Control[] {
getLabelComposite(parent),
createSpinnerControl(parent)
};
}
public void setPropertyEditor(IPropertyEditor propertyEditor) {
this.propertyEditor = propertyEditor;
if (null != propertyEditor) {
valueProvider = (IValueProvider)propertyEditor.getAdapter(IValueProvider.class);
valueChangeListener = (IValueChangeListener)propertyEditor.getAdapter(IValueChangeListener.class);
setErrorProvider((IAttributeErrorProvider)propertyEditor.getAdapter(IAttributeErrorProvider.class));
}
init();
}
public void propertyChange(PropertyChangeEvent event) {
if(ExtendedFieldEditor.VALUE.equals(event.getProperty())) {
setPropertyChangeListener(null);
java.beans.PropertyChangeEvent e = new java.beans.PropertyChangeEvent(this, IPropertyEditor.VALUE, event.getOldValue(), event.getNewValue());
valueChangeListener.valueChange(e);
setPropertyChangeListener(this);
}
}
public void propertyChange(java.beans.PropertyChangeEvent evt) {
valueProvider.removeValueChangeListener(this);
if (IPropertyEditor.VALUE.equals(evt.getPropertyName())) {
Object v = evt.getNewValue();
if (null != v) {
this.setStringValue(v.toString());
}
}
valueProvider.addValueChangeListener(this);
}
protected Control createSpinnerControl(Composite parent) {
/*
* Create composite control with label and slider in it.
*/
composite = new Composite(parent, SWT.NONE);
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 2;
gridLayout.marginWidth = 0;
gridLayout.marginHeight = 0;
gridLayout.horizontalSpacing = HORIZONTAL_GAP;
composite.setLayout(gridLayout);
GridData gd;
gd = new GridData(GridData.FILL_HORIZONTAL);
composite.setLayoutData(gd);
/*
* Create label
*/
sliderLabel = new Label(composite,SWT.NONE);
gd = new GridData(SWT.LEFT);
sliderLabel.setLayoutData(gd);
sliderLabel.setText(SLIDER_LABEL_DEFAULT_TEXT);
Point size = sliderLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT);
sliderLabel.setSize(size);
/*
* Create slider
*/
slider = new Slider(composite, SWT.HORIZONTAL);
gd = new GridData(SWT.RIGHT | GridData.FILL_HORIZONTAL);
slider.setLayoutData(gd);
slider.setMaximum(MAX_SLIDER_VALUE + slider.getThumb());
slider.setMinimum(MIN_SLIDER_VALUE);
slider.setIncrement(INCREMENT_SLIDER_VALUE);
/*
* Add listener to handle value change
*/
selectionListener = new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
valueChanged();
}
public void widgetDefaultSelected(SelectionEvent e) {
// Do nothing
}
};
slider.addSelectionListener(selectionListener);
try {
intValue = Integer.parseInt(valueProvider.getStringValue(true).toString());
} catch (NumberFormatException e) {
intValue = DEFAULT_SLIDER_VALUE;
}
/*
* Initialize slider presentation
*/
slider.setSelection(intValue);
String weightsString = "" + (intValue /10) + "%"; //$NON-NLS-1$ //$NON-NLS-2$
slider.setToolTipText(weightsString);
sliderLabel.setText(weightsString);
slider.pack();
sliderLabel.pack();
return composite;
}
/**
* Notifies listeners of value change.
*/
protected void valueChanged() {
int newValue = slider.getSelection();
int oldValue = this.intValue;
intValue = newValue;
java.beans.PropertyChangeEvent event = new java.beans.PropertyChangeEvent(
this, IPropertyEditor.VALUE, oldValue, newValue);
valueChangeListener.valueChange(event);
}
/**
* Sets the value to slider and updates controls presentation.
*
* @param stringValue the new slider value
*/
private void setStringValue(String stringValue) {
if (null != slider) {
try {
intValue = Integer.parseInt(stringValue);
slider.setSelection(intValue);
/*
* Show value in percents.
*/
String weightsString = "" + (intValue / 10) + "%"; //$NON-NLS-1$ //$NON-NLS-2$
slider.setToolTipText(weightsString);
if (null != sliderLabel) {
sliderLabel.setText(weightsString);
}
} catch (NumberFormatException e) {
// Do nothing
}
}
}
@Override
public void copy() {
}
@Override
public void cut() {
}
@Override
public void delete() {
}
@Override
public void paste() {
}
}