/*******************************************************************************
* Copyright (c) 2007 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.ui.widget.editor;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.runtime.Assert;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
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.jboss.tools.common.ui.CommonUIMessages;
/**
*
* @author eskimo
*
*/
public abstract class BaseFieldEditor implements IFieldEditor {
protected PropertyChangeSupport pcs = new PropertyChangeSupport(this);
Set<DisposeListener> disposeListeners = new HashSet<DisposeListener>();
private Object value = new Object();
private String labelText = CommonUIMessages.BASE_FIELD_EDITOR_NO_LABEL;
private String nameText = null;
Label labelControl = null;
protected Map<Object, Object> data = null;
private boolean enabled = true;
String description = null;
/**
*
* @param name
* @param label
* @param defaultValue
*/
public BaseFieldEditor(String name, String label,Object defaultValue) {
this.value = defaultValue;
this.labelText = label;
this.nameText = name;
}
/**
*
* @param parent
*/
public void doFillIntoGrid(Object parent) {
Assert.isTrue(parent instanceof Composite, CommonUIMessages.BASE_FIELD_EDITOR_PARENT_CONTROL_SHOULD_BE_COMPOSITE);
Assert.isTrue(((Composite)parent).getLayout() instanceof GridLayout,CommonUIMessages.BASE_FIELD_EDITOR_EDITOR_SUPPORTS_ONLY_GRID_LAYOUT);
Composite aComposite = (Composite) parent;
final Control[] controls = (Control[])getEditorControls(aComposite);
GridLayout gl = (GridLayout)((Composite)parent).getLayout();
doFillIntoGrid(aComposite,gl.numColumns);
if(controls.length>0) {
controls[0].addDisposeListener(new DisposeListener(){
public void widgetDisposed(DisposeEvent e) {
dispose();
controls[0].removeDisposeListener(this);
}
});
}
}
/**
* @param composite
* @param numColumns
*/
protected void doFillIntoGrid(Composite composite, int numColumns) {
}
/**
*
*/
public void addPropertyChangeListener(PropertyChangeListener listener) {
pcs.addPropertyChangeListener(listener);
}
/**
*
*/
public void removePropertyChangeListener(PropertyChangeListener listener) {
pcs.removePropertyChangeListener(listener);
}
/**
*
* @param parent
* @return
*/
public Label createLabelControl(Composite parent) {
if(labelControl==null) {
labelControl = new Label(parent,SWT.NO_BACKGROUND);
labelControl.setText(this.labelText);
if(description != null) {
labelControl.setToolTipText(description);
}
} else if(parent!=null) {
if(labelControl.getParent()!=parent)
throw new IllegalArgumentException(CommonUIMessages.BASE_FIELD_EDITOR_PARENT_FOR_LABEL_IS_DIFFERENT);
}
return labelControl;
}
/**
*
* @return
*/
public Label getLabelControl() {
return createLabelControl(null);
}
/**
*
*/
public abstract Object[] getEditorControls(Object composite);
/**
*
*/
public abstract Object[] getEditorControls();
/**
*
* @return
*/
public Control[] getSwtControls() {
return (Control[])getEditorControls();
}
/**
*
*/
public abstract int getNumberOfControls();
/**
*
*/
public Object getValue() {
return value;
}
/**
*
*/
public String getValueAsString() {
return getValue().toString();
}
/**
*
*/
public boolean isEnabled() {
return this.enabled ;
}
/**
*
*/
public void setEnabled(boolean enabled) {
this.enabled = enabled;
Control[] controls = getSwtControls();
if(controls==null) {
return;
}
for(int i=0;i<controls.length;i++) {
Control control = controls[i];
if(control != null){
control.setEnabled(enabled);
if(control instanceof Composite) {
setEnabled((Composite)control, enabled);
}
}
}
}
private void setEnabled(Composite composite, boolean enabled) {
Control[] controls = composite.getChildren();
for(int i=0;i<controls.length;i++) {
Control control = controls[i];
control.setEnabled(enabled);
if(control instanceof Composite) {
setEnabled((Composite)control, enabled);
}
}
}
/**
*
*/
public boolean setFocus() {
return true;
}
/**
*
* @param newValue
*/
public void setValue(Object newValue) {
Object oldValue = value;
value = newValue;
pcs.firePropertyChange(nameText,oldValue,newValue);
}
/**
*
*/
public void setValueAsString(String stringValue) {
value = stringValue;
}
/**
*
*/
public String getName() {
return nameText;
}
/*
* (non-Javadoc)
* @see org.jboss.tools.seam.ui.widget.editor.IFieldEditor#dispose()
*/
public void dispose() {
PropertyChangeListener[] listeners = pcs.getPropertyChangeListeners();
for (int i = 0; i < listeners.length; i++) {
PropertyChangeListener propertyChangeListener = listeners[i];
pcs.removePropertyChangeListener(propertyChangeListener);
}
}
/*
* (non-Javadoc)
* @see org.jboss.tools.seam.ui.widget.editor.IFieldEditor#dispose(org.eclipse.swt.events.DisposeEvent)
*/
public void dispose(DisposeEvent e) {
dispose();
for (DisposeListener disposeListener : disposeListeners) {
disposeListener.widgetDisposed(e);
}
disposeListeners.clear();
}
/*
* (non-Javadoc)
* @see org.jboss.tools.seam.ui.widget.editor.IFieldEditor#addDisposeListener(org.eclipse.swt.events.DisposeListener)
*/
public void addDisposeListener(DisposeListener listener) {
disposeListeners.add(listener);
}
/*
* (non-Javadoc)
* @see org.jboss.tools.seam.ui.widget.editor.IFieldEditor#removeDisposeListener(org.eclipse.swt.events.DisposeListener)
*/
public void removeDisposeListener(DisposeListener listener) {
disposeListeners.remove(listener);
}
/**
*
* @return
*/
public String getLabelText() {
return labelText;
}
/**
*
* @param labelText
*/
public void setLabelText(String labelText) {
this.labelText = labelText;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
if(labelControl != null && !labelControl.isDisposed()) {
labelControl.setToolTipText(description);
}
}
/**
*
*/
private boolean editable = true;
/**
*
*/
public boolean isEditable() {
return editable;
}
/**
*
*/
public void setEditable(boolean aEditable) {
this.editable = aEditable;
}
public Object getData(Object key) {
if(data==null) {
return null;
}
return data.get(key);
}
public void setData(Object key, Object value) {
if(data==null) {
data = new HashMap<Object, Object>();
}
data.put(key, value);
}
}