/*******************************************************************************
* 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.PropertyChangeListener;
import java.util.Arrays;
import org.jboss.tools.common.model.ui.IAttributeErrorProvider;
import org.jboss.tools.common.model.ui.IListEditor;
import org.jboss.tools.common.model.ui.IListValueAdapter;
import org.jboss.tools.common.model.ui.ISelectionEditor;
import org.jboss.tools.common.model.ui.IValueChangeListener;
import org.jboss.tools.common.model.ui.IValueEditor;
import org.jboss.tools.common.model.ui.IValueProvider;
import org.jboss.tools.common.model.ui.attribute.IListContentProvider;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.jboss.tools.common.model.ui.widgets.IWidgetSettings;
public class ListSelectionFieldEditor extends ExtendedFieldEditor implements IFieldEditor, IValueEditor, IListEditor, ISelectionEditor, IPropertyFieldEditor, IPropertyChangeListener, PropertyChangeListener {
protected ListViewer listViewer;
protected int style = SWT.H_SCROLL | SWT.V_SCROLL | SWT.SINGLE | SWT.BORDER;
// IValueEditor
protected IValueChangeListener valueChangeListener;
protected IValueProvider valueProvider;
// IListEditor
protected ILabelProvider labelProvider;
protected IListContentProvider listContentProvider;
protected IListValueAdapter listValueAdapter;
// ISelectionEditor
protected ISelectionProvider selectionProvider;
protected ISelectionChangedListener selectionChangedListener;
public ListSelectionFieldEditor() {}
public ListSelectionFieldEditor(IWidgetSettings settings) {
super(settings);
}
//public ListSelectionFieldEditor(String name, String labelText, Composite parent, IWidgetSettings settings) {
// super(name, labelText, parent, settings);
//}
protected void adjustForNumColumns(int numColumns) {
}
protected void doFillIntoGrid(Composite parent, int numColumns) {
getLabelComposite(parent);
numColumns--;
Control list = createListControl(parent);
GridData gd = new GridData(GridData.FILL_BOTH);
gd.horizontalSpan = numColumns;
list.setLayoutData(gd);
}
protected void doLoad() {
}
protected void doLoadDefault() {
}
protected void doStore() {
}
public int getNumberOfControls() {
return 2;
}
protected Control getListControl() {
if (listViewer!=null) return listViewer.getList();
return null;
}
protected Control createListControl(Composite parent) {
listViewer = new ListViewer(parent, getStyle());
// init model
listViewer.setLabelProvider(labelProvider);
listViewer.setContentProvider(listContentProvider);
if (selectionProvider!=null) {
listViewer.setSelection(selectionProvider.getSelection()); // its set value
}
if (selectionChangedListener!=null) {
listViewer.addPostSelectionChangedListener(selectionChangedListener);
}
listViewer.setInput(this);
if(valueProvider != null) {
String v = ("" + valueProvider.getValue()).toString(); //$NON-NLS-1$
listViewer.setSelection(new StructuredSelection(v));
}
listViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
valueChanged();
}
});
return listViewer.getList();
}
public int getStyle() {
return style;
}
public void setStyle(int i) {
style = i;
}
// ISelectionEditor
public void setSelectionChangedListener(ISelectionChangedListener selectionChangedListener) {
this.selectionChangedListener = selectionChangedListener;
}
public void setSelectionProvider(ISelectionProvider selectionProvider) {
this.selectionProvider = selectionProvider;
}
// IListEditor
public void setLabelProvider(ILabelProvider labelProvider) {
this.labelProvider = labelProvider;
}
public void setListContentProvider(IListContentProvider listContentProvider) {
this.listContentProvider = listContentProvider;
}
public void setListValueAdapter(IListValueAdapter listValueAdapter) {
this.listValueAdapter = listValueAdapter;
}
// IValueEditor
public void setValueChangeListener(IValueChangeListener valueChangeListener) {
this.valueChangeListener = valueChangeListener;
}
public void setValueProvider(IValueProvider valueProvider) {
this.valueProvider = valueProvider;
}
// IFieldEditor
public Control[] getControls(Composite parent) {
return new Control[] {getLabelComposite(parent), createListControl(parent)};
}
public void setEnabled(boolean enabled){
super.setEnabled(enabled);
if (getListControl()!=null) {
getListControl().setEnabled(enabled);
}
}
public void cut() {}
public void copy() {}
public void paste() {}
public void delete() {
}
IPropertyEditor propertyEditor;
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);
setErrorProvider((IAttributeErrorProvider)propertyEditor.getAdapter(IAttributeErrorProvider.class));
}
setPropertyChangeListener(this);
valueProvider.addValueChangeListener(this);
}
public void propertyChange(PropertyChangeEvent event) {
if(ExtendedFieldEditor.VALUE.equals(event.getProperty())) {
setPropertyChangeListener(null);
java.beans.PropertyChangeEvent e = new java.beans.PropertyChangeEvent(this, IPropertyEditor.VALUE, mapFromTo(tags,elements,event.getOldValue()), mapFromTo(tags,elements,event.getNewValue()));
valueChangeListener.valueChange(e);
setPropertyChangeListener(this);
}
}
public void propertyChange(java.beans.PropertyChangeEvent evt) {
super.propertyChange(evt);
if (IPropertyEditor.VALUE.equals(evt.getPropertyName())) {
Object v = evt.getNewValue();
valueProvider.removeValueChangeListener(this);
if(v != null) {
listViewer.setSelection(new StructuredSelection(v));
} else {
listViewer.setSelection(new StructuredSelection());
}
valueProvider.addValueChangeListener(this);
}
}
Object[] elements;
String[] tags = new String[0];
protected 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;
}
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];
}
protected void valueChanged() {
setPresentsDefaultValue(false);
String oldValue = ""; //$NON-NLS-1$
String newValue = getSelection();
this.valueProvider.removeValueChangeListener(this);
java.beans.PropertyChangeEvent event = new java.beans.PropertyChangeEvent(this, IPropertyEditor.VALUE, oldValue, newValue);
valueChangeListener.valueChange(event);
this.valueProvider.addValueChangeListener(this);
}
String getSelection() {
ISelection s = listViewer.getSelection();
if(s == null || s.isEmpty()) return ""; //$NON-NLS-1$
if(!(s instanceof StructuredSelection)) return ""; //$NON-NLS-1$
return ((StructuredSelection)s).getFirstElement().toString();
}
}