/*******************************************************************************
* 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.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
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.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.jboss.tools.common.ui.CommonUIMessages;
/**
* @author eskimo
*
*/
public class CompositeEditor extends BaseFieldEditor implements PropertyChangeListener {
public CompositeEditor(String name, String label, Object defaultValue) {
super(name, label, defaultValue);
}
@Override
public void doFillIntoGrid(Object parent) {
Assert.isTrue(parent instanceof Composite,
CommonUIMessages.COMPOSITE_EDITOR_PARENT_CONTROL_SHOULD_BE_COMPOSITE);
Assert.isTrue(((Composite) parent).getLayout() instanceof GridLayout,
CommonUIMessages.COMPOSITE_EDITOR_EDITOR_SUPPORTS_ONLY_GRID_LAYOUT);
Composite aComposite = (Composite) parent;
final Control[] controls = (Control[]) getEditorControls(aComposite);
GridLayout gl = (GridLayout) ((Composite) parent).getLayout();
for (int i = 0; i < controls.length; i++) {
GridData gd = new GridData();
gd.horizontalSpan = i == 1 ? gl.numColumns - controls.length + 1 : 1;
if (controls[i] instanceof Combo && i == (controls.length - 1)) {
gd.horizontalAlignment = SWT.BEGINNING;
if(controls[i].computeSize(-1, -1, true).x > 200) {
//Restrict combo length!!!
gd.widthHint = 200;
}
} else {
gd.horizontalAlignment = GridData.FILL;
gd.grabExcessHorizontalSpace = (i == 1);
}
controls[i].setLayoutData(gd);
controls[i].setEnabled(isEnabled());
if(i==0) {
controls[i].addDisposeListener(new DisposeListener(){
public void widgetDisposed(DisposeEvent e) {
dispose();
controls[0].removeDisposeListener(this);
}
});
}
}
}
List<Control> controls = new ArrayList<Control>();
@Override
public Object[] getEditorControls() {
if(!controls.isEmpty()) return controls.toArray();
else throw new IllegalStateException(CommonUIMessages.COMPOSITE_EDITOR_THIS_METOD_CAN_BE_INVOKED);
}
@Override
public Object[] getEditorControls(Object parent) {
for (IFieldEditor editor : editors) {
controls.addAll(Arrays.asList((Control[])editor.getEditorControls(parent)));
}
return controls.toArray(new Control[]{});
}
@Override
public int getNumberOfControls() {
return editors.size();
}
@Override
public boolean isEditable() {
return true;
}
public void save(Object object) {
}
@Override
public void setEditable(boolean ediatble) {
}
List<IFieldEditor> editors = new ArrayList<IFieldEditor>();
public CompositeEditor addFieldEditors(IFieldEditor[] editors) {
this.editors.addAll( Arrays.asList(editors));
for (IFieldEditor editor : Arrays.asList(editors)) {
editor.addPropertyChangeListener(this);
}
return this;
}
@Override
public void setValue(Object newValue) {
for (IFieldEditor editor : editors) {
editor.removePropertyChangeListener(this);
editor.setValue(newValue);
editor.addPropertyChangeListener(this);
}
super.setValue(newValue);
}
public void propertyChange(PropertyChangeEvent event) {
for (IFieldEditor editor : editors) {
if(event.getSource()!=editor) {
editor.removePropertyChangeListener(this);
editor.setValue(event.getNewValue());
editor.addPropertyChangeListener(this);
}
}
super.setValue(event.getNewValue());
}
@Override
public void setEnabled(boolean set) {
for (IFieldEditor editor : editors) {
editor.setEnabled(set);
}
}
public List<IFieldEditor> getEditors() {
return Collections.unmodifiableList(editors);
}
public IFieldEditor getEditorByName(String name) {
for (IFieldEditor editor : editors) {
if(name.equals(editor.getName())) {
return editor;
}
}
return null;
}
public void setData(Object key, Object value) {
super.setData(key, value);
for (IFieldEditor editor : editors) {
editor.setData(key, value);
}
}
}