/*******************************************************************************
* 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 java.util.Arrays;
import java.util.List;
import org.jboss.tools.common.model.ui.*;
import org.jboss.tools.common.model.ui.attribute.*;
import org.jboss.tools.common.model.ui.attribute.adapter.DefaultValueAdapter;
import org.eclipse.jface.util.*;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.jboss.tools.common.model.ui.widgets.BorderedControl;
import org.jboss.tools.common.model.ui.widgets.IWidgetSettings;
import org.jboss.tools.common.model.ui.widgets.border.Border;
public class RadioArrayFieldEditor extends ExtendedFieldEditor implements IFieldEditor, IPropertyFieldEditor, IPropertyChangeListener, PropertyChangeListener {
IPropertyEditor propertyEditor;
IValueChangeListener valueChangeListener;
IValueProvider valueProvider;
ILabelProvider labelProvider;
IListContentProvider listContentProvider;
private String stringValue = ""; //$NON-NLS-1$
private boolean isValid;
private Composite panel;
private Button[] radioButtons;
private String[] tags = new String[0];
private int style = SWT.NONE;
boolean modifyLock = false;
public RadioArrayFieldEditor() {
// setStyle(SWT.DROP_DOWN | SWT.BORDER);
}
public RadioArrayFieldEditor(IWidgetSettings settings) {
super(settings);
// setStyle(SWT.DROP_DOWN | SWT.BORDER);
}
public RadioArrayFieldEditor(String name, String labelText, List<String> tags, Composite parent) {
init(name, labelText);
if (tags != null) {
this.tags = tags.toArray(new String[tags.size()]);
}
createControl(parent);
}
protected void adjustForNumColumns(int numColumns) {
GridData gd = (GridData)panel.getLayoutData();
gd.horizontalSpan = numColumns - 1;
gd.grabExcessHorizontalSpace = gd.horizontalSpan == 1;
}
protected void doFillIntoGrid(Composite parent, int numColumns) {
getLabelComposite(parent);
panel = getPanelControl(parent);
GridData gd = new GridData();
gd.horizontalSpan = numColumns - 1;
gd.horizontalAlignment = GridData.FILL;
gd.grabExcessHorizontalSpace = true;
panel.setLayoutData(gd);
}
public int getNumberOfControls() {
return 2;
}
public Control[] getControls(Composite parent) {
Control label = null;
if (makeGroup() || hideLabel()) {
label = new Label(parent,SWT.NONE);
} else {
label = getLabelComposite(parent);
}
return new Control[] {label, getPanelControl(parent)};
}
public Composite getPanelControl(Composite parent) {
if (panel == null) {
/*
int style = getSettings().getInt("Combo.Style");
Color bg = getSettings().getColor("Combo.Background");
if (bg==null) bg = Display.getCurrent().getSystemColor(SWT.COLOR_WHITE);// bug with gray bg
Color fg = getSettings().getColor("Combo.Foreground");
Font font = getSettings().getFont("Combo.Font");
*/
Border border = getSettings().getBorder("Combo.Border"); //$NON-NLS-1$
boolean makeGroup = makeGroup();
if (border!=null) {
BorderedControl borderedControl = new BorderedControl(parent, SWT.NONE, border);
if(!makeGroup) {
panel = new Composite(borderedControl, SWT.FLAT);
} else {
Group g = new Group(borderedControl, SWT.SHADOW_ETCHED_IN);
g.setText(propertyEditor.getLabelText());
panel = g;
}
} else {
if(!makeGroup) {
panel = new Composite(parent, getStyle());
} else {
Group g = new Group(parent, SWT.SHADOW_ETCHED_IN);
g.setText(propertyEditor.getLabelText());
panel = g;
}
}
/// change!
int k = getTags().length;
if(!isHorizontalLayout()) {
if(k != 3 || makeGroup) k = 1;
}
GridLayout layout = new GridLayout(k, false);
panel.setLayout(layout);
// panel.setFont(font);
// panel.setBackground(bg);
// panel.setForeground(fg);
modifyLock = true;
setItems(getTags());
stringValue = valueProvider.getStringValue(true);
setSelectedValue(stringValue);
modifyLock = false;
panel.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent event) {
panel = null;
radioButtons = new Button[0];
}
});
} else {
///checkParent(panel, parent);
}
return panel;
}
boolean makeGroup() {
Object input = propertyEditor.getInput();
if(input instanceof DefaultValueAdapter) {
DefaultValueAdapter adapter = (DefaultValueAdapter)input;
return "true".equals(adapter.getAttribute().getProperty("border")); //$NON-NLS-1$ //$NON-NLS-2$
}
return false;
}
boolean hideLabel() {
Object input = propertyEditor.getInput();
if(input instanceof DefaultValueAdapter) {
DefaultValueAdapter adapter = (DefaultValueAdapter)input;
return "false".equals(adapter.getAttribute().getProperty("label")); //$NON-NLS-1$ //$NON-NLS-2$
}
return false;
}
boolean isHorizontalLayout() {
Object input = propertyEditor.getInput();
if(input instanceof DefaultValueAdapter) {
DefaultValueAdapter adapter = (DefaultValueAdapter)input;
return "true".equals(adapter.getAttribute().getProperty("horizontal")); //$NON-NLS-1$ //$NON-NLS-2$
}
return false;
}
protected void valueChanged() {
setPresentsDefaultValue(false);
boolean oldState = isValid;
refreshValidState();
if (isValid != oldState)
fireStateChanged(IS_VALID, oldState, isValid);
String oldValue = stringValue;
String newValue = getSelectedValue();
this.valueProvider.removeValueChangeListener(this);
PropertyChangeEvent event = new PropertyChangeEvent(this, IPropertyEditor.VALUE, oldValue, newValue);
valueChangeListener.valueChange(event);
stringValue = newValue;
this.valueProvider.addValueChangeListener(this);
}
Object[] elements;
private String[] getTags() {
elements = listContentProvider.getElements(this);
tags = new String[elements.length];
for(int i=0;i<elements.length;++i){
tags[i] = labelProvider.getText(elements[i]);
}
return tags;
}
public int getStyle() {
return style;
}
public void setStyle(int i) {
style = i;
}
protected void setStringValue(String newValue) {
String oldValue = this.stringValue;
stringValue = newValue;
modifyLock = true;
setSelectedValue(newValue);
modifyLock = false;
PropertyChangeEvent event = new PropertyChangeEvent(this, IPropertyEditor.VALUE, oldValue, newValue);
valueChangeListener.valueChange(event);
}
static private Object mapFromTo(Object[] from, Object[] to,Object value) {
if(from==null || from.length==0 || to==null || to.length==0) return value;
int index = Arrays.asList(from).indexOf(value);
return index==-1?value:to[index];
}
// IPropertyFieldEditor
public void setPropertyEditor(IPropertyEditor propertyEditor) {
this.propertyEditor = propertyEditor;
if (propertyEditor!=null) {
valueProvider = (IValueProvider)propertyEditor.getAdapter(IValueProvider.class);
valueChangeListener = (IValueChangeListener)propertyEditor.getAdapter(IValueChangeListener.class);
labelProvider = (ILabelProvider)propertyEditor.getAdapter(ILabelProvider.class);
listContentProvider = (IListContentProvider)propertyEditor.getAdapter(IListContentProvider.class);
}
setPropertyChangeListener(this);
valueProvider.addValueChangeListener(this);
}
// IPropertyChangeListener
public void propertyChange(org.eclipse.jface.util.PropertyChangeEvent event) {
if(ExtendedFieldEditor.VALUE.equals(event.getProperty())) {
setPropertyChangeListener(null);
PropertyChangeEvent e = new PropertyChangeEvent(this, IPropertyEditor.VALUE, mapFromTo(tags,elements,event.getOldValue()), mapFromTo(tags,elements,event.getNewValue()));
valueChangeListener.valueChange(e);
setPropertyChangeListener(this);
}
}
// PropertyChangeListener
public void propertyChange(PropertyChangeEvent evt) {
if (IPropertyEditor.VALUE.equals(evt.getPropertyName())) {
Object v = evt.getNewValue();
valueProvider.removeValueChangeListener(this);
this.setStringValue((v == null) ? "" : v.toString()); //$NON-NLS-1$
valueProvider.addValueChangeListener(this);
}
if (IPropertyEditor.LIST_CONTENT.equals(evt.getPropertyName())) {
String v = getSelectedValue();
valueProvider.removeValueChangeListener(this);
String[] tags = getTags();
setItems(tags);
setSelectedValue(v);
}
}
private void setItems(String[] tags) {
this.tags = tags;
if(radioButtons != null) {
for (int i = 0; i < radioButtons.length; i++) {
radioButtons[i].dispose();
}
}
if(panel == null) return;
radioButtons = new Button[tags.length];
for (int i = 0; i < tags.length; i++) {
radioButtons[i] = createRadio(tags[i]);
}
}
private Button createRadio(String tag) {
Button b = new Button(panel, SWT.RADIO);
GridData d = new GridData(GridData.FILL_HORIZONTAL);
b.setLayoutData(d);
b.setText(tag);
b.addSelectionListener(new SL(b));
return b;
}
class SL implements SelectionListener {
Button b;
SL(Button b) {
this.b = b;
}
public void widgetSelected(SelectionEvent e) {
if(modifyLock || radioButtons == null) return;
modifyLock = true;
for (int i = 0; i < radioButtons.length; i++) {
if(radioButtons[i] != b) radioButtons[i].setSelection(false);
}
setSelectedValue(b.getText());
valueChanged();
modifyLock = false;
}
public void widgetDefaultSelected(SelectionEvent e) {}
}
private String getSelectedValue() {
if(radioButtons == null) return ""; //$NON-NLS-1$
for (int i = 0; i < radioButtons.length; i++) {
if(radioButtons[i].getSelection()) return tags[i];
}
return ""; //$NON-NLS-1$
}
private void setSelectedValue(String v) {
if(radioButtons == null) return;
for (int i = 0; i < radioButtons.length; i++) {
radioButtons[i].setSelection(v.equals(tags[i]));
}
}
public void setEnabled(boolean enabled, Composite parent) {
if(radioButtons == null) return;
for (int i = 0; i < radioButtons.length; i++) {
radioButtons[i].setEnabled(enabled);
}
}
protected void doLoad() {}
protected void doLoadDefault() {}
protected void doStore() {}
public void cut() {}
public void copy() {}
public void paste() {}
public void delete() {}
}