/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and 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
*
* Contributors:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.model.ui.attribute.editor;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.jboss.tools.common.MethodNotImplementedException;
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 CheckBoxFieldEditor extends ExtendedFieldEditor implements IFieldEditor, IPropertyFieldEditor, IPropertyChangeListener, PropertyChangeListener {
public static final int DEFAULT= 0;
public static final int SEPARATE_LABEL= 1;
public static final int SKIP_LABEL= 2;
private int style = SKIP_LABEL;
private Button checkBox = null;
protected String trueValue = "true"; //$NON-NLS-1$
protected String falseValue = "false"; //$NON-NLS-1$
protected boolean booleanValue = false;
protected IPropertyEditor propertyEditor;
protected IValueProvider valueProvider;
protected IValueChangeListener valueChangeListener;
public CheckBoxFieldEditor() {}
public CheckBoxFieldEditor(IWidgetSettings settings) {
super(settings);
}
protected void adjustForNumColumns(int numColumns) {
if (style == SEPARATE_LABEL) numColumns--;
if (style == SKIP_LABEL) numColumns--;
((GridData)checkBox.getLayoutData()).horizontalSpan = numColumns;
}
protected void doFillIntoGrid(Composite parent, int numColumns) {
String text = getLabelText();
if (style == SKIP_LABEL) {
Label label = new Label(parent,SWT.NONE);
label.setText(""); //$NON-NLS-1$
numColumns--;
}
if (style == SEPARATE_LABEL) {
getLabelComposite(parent);
numColumns--;
text = null;
}
checkBox = createChangeControl(parent);
GridData gd = new GridData();
gd.horizontalSpan = numColumns;
checkBox.setLayoutData(gd);
if (text != null) checkBox.setText(text);
}
protected Control createCheckBoxLabelControl (Composite parent) {
Button checkBox = createChangeControl(parent);
if (getLabelText() != null) checkBox.setText(getLabelText());
return checkBox;
}
protected void doLoad() {
throw new MethodNotImplementedException();
}
protected void doLoadDefault() {
throw new MethodNotImplementedException();
}
protected void doStore() {
// getPreferenceStore().setValue(getPreferenceName(), checkBox.getSelection());
}
protected Button createChangeControl(Composite parent) {
if (checkBox != null) {
checkParent(checkBox, parent);
return checkBox;
}
int style = 0;
if (getSettings() != null) {
style = getSettings().getStyle("CheckBox.Style"); //$NON-NLS-1$
}
if (style == SWT.DEFAULT) {
style = SWT.CHECK | SWT.LEFT;
}
checkBox = new Button(parent, style);
checkBox.setFont(parent.getFont());
createSelectionListener();
createDisposeListener();
checkBox.setSelection(booleanValue);
return checkBox;
}
private void createSelectionListener() {
checkBox.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
boolean isSelected = checkBox.getSelection();
valueChanged(booleanValue, isSelected);
booleanValue = isSelected;
}
});
}
private void createDisposeListener() {
checkBox.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent event) {
checkBox = null;
}
});
}
public int getNumberOfControls() {
return (style == SKIP_LABEL || style == SEPARATE_LABEL) ? 2 : 1;
}
public void setFocus() {
if (checkBox != null) {
checkBox.setFocus();
}
}
public void setLabelText(String text) {
super.setLabelText(text);
Control label = getLabelComposite();
if (label == null && checkBox != null) {
checkBox.setText(text);
}
}
protected void valueChanged(boolean oldValue, boolean newValue) {
setPresentsDefaultValue(false);
if (oldValue != newValue)
fireStateChanged(VALUE, oldValue, newValue);
}
public Control getChangeControl() {
return checkBox;
}
public void setEnabled(boolean enabled){
//Only call super if there is a label already
if(style == SEPARATE_LABEL)
super.setEnabled(enabled);
if (this.getChangeControl()!=null) {
getChangeControl().setEnabled(enabled);
}
}
public void setBooleanValue(boolean isChecked) {
booleanValue = isChecked;
if (checkBox != null) {
boolean oldValue = checkBox.getSelection();
if (oldValue!=booleanValue) {
checkBox.setSelection(booleanValue);
valueChanged(oldValue, booleanValue);
}
}
}
public boolean getBooleanValue() {
if (checkBox != null)
return checkBox.getSelection();
else
return getPreferenceStore().getBoolean(getPreferenceName());
}
public int getStyle() {
return style;
}
public void setStyle(int style) {
this.style = style;
}
private void initValue(Object value) {
if (value instanceof String) {
if ("yes".equalsIgnoreCase(value.toString()) || "no".equalsIgnoreCase(value.toString())) { //$NON-NLS-1$ //$NON-NLS-2$
trueValue = "yes"; //$NON-NLS-1$
falseValue = "no"; //$NON-NLS-1$
}
}
}
private boolean isTrue(Object value) {
if (value instanceof Boolean) return ((Boolean)value).booleanValue();
if (value instanceof String) {
if ("yes".equalsIgnoreCase(value.toString()) || "true".equalsIgnoreCase(value.toString())) return true; //$NON-NLS-1$ //$NON-NLS-2$
}
return false;
}
// IPropertyChangeListener
public void propertyChange(org.eclipse.jface.util.PropertyChangeEvent e) {
if(ExtendedFieldEditor.VALUE.equals(e.getProperty())) {
setPropertyChangeListener(null);
boolean newBooleanValue = ((Boolean)e.getNewValue()).booleanValue();
boolean oldBooleanValue = ((Boolean)e.getOldValue()).booleanValue();
String oldValue = (oldBooleanValue)?trueValue:falseValue;
String newValue = (newBooleanValue)?trueValue:falseValue;
PropertyChangeEvent event = new PropertyChangeEvent(this, VALUE, oldValue, newValue);
valueChangeListener.valueChange(event);
setPropertyChangeListener(this);
}
}
protected void init() {
initValue(valueProvider.getValue());
setBooleanValue(isTrue(valueProvider.getValue()));
setPropertyChangeListener(this);
valueProvider.addValueChangeListener(this);
}
public void dispose() {
super.dispose();
if (checkBox!=null && !checkBox.isDisposed()) checkBox.dispose();
if (valueProvider!=null) valueProvider.removeValueChangeListener(this);
checkBox = null;
propertyEditor = null;
valueProvider = null;
valueChangeListener = null;
}
// IPropertyFieldEditor
public void setPropertyEditor(IPropertyEditor propertyEditor) {
this.propertyEditor = propertyEditor;
if (propertyEditor!=null) {
valueProvider = (IValueProvider)propertyEditor.getAdapter(IValueProvider.class);
valueChangeListener = (IValueChangeListener)propertyEditor.getAdapter(IValueChangeListener.class);
}
init();
}
// IFieldEditor
public Control[] getControls(Composite parent) {
return new Control[] {new Label(parent,SWT.NONE), createCheckBoxLabelControl(parent)};
}
// PropertyChangeListener
public void propertyChange(PropertyChangeEvent evt) {
valueProvider.removeValueChangeListener(this);
setBooleanValue(isTrue(evt.getNewValue()));
valueProvider.addValueChangeListener(this);
}
public void setIndent(int width) {
if(checkBox == null || checkBox.isDisposed()) return;
GridData gd = (GridData)checkBox.getLayoutData();
gd.horizontalIndent = width;
checkBox.getParent().update();
}
public void cut() {
}
public void copy() {
}
public void paste() {
}
public void delete() {
}
}