/*******************************************************************************
* 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 org.jboss.tools.common.model.ui.IAttributeErrorProvider;
import org.jboss.tools.common.model.ui.IValueChangeListener;
import org.jboss.tools.common.model.ui.IValueProvider;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
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.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.jboss.tools.common.model.ui.ModelUIPlugin;
import org.jboss.tools.common.model.ui.widgets.IWidgetSettings;
public class StringTwoButtonFieldEditor extends StringButtonFieldEditor implements IFieldEditor, IPropertyChangeListener, PropertyChangeListener, IPropertyFieldEditor {
protected PropertyEditorDialog editorDialog;
protected IPropertyEditor propertyEditor;
protected IValueProvider valueProvider;
protected IValueChangeListener valueChangeListener;
protected Composite composite;
protected String[] buttonLabels;
protected Button button1;
protected Button button2;
public StringTwoButtonFieldEditor() {}
public StringTwoButtonFieldEditor(IWidgetSettings settings) {
super(settings);
}
public void setPropertyEditor(IPropertyEditor propertyEditor) {
this.propertyEditor = propertyEditor;
valueProvider = (IValueProvider)propertyEditor.getAdapter(IValueProvider.class);
valueChangeListener = (IValueChangeListener)propertyEditor.getAdapter(IValueChangeListener.class);
setPropertyChangeListener(this);
valueProvider.addValueChangeListener(this);
setErrorProvider((IAttributeErrorProvider)propertyEditor.getAdapter(IAttributeErrorProvider.class));
}
protected String changePressed() {
editorDialog = new PropertyEditorDialog(ModelUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getShell(), propertyEditor);
int i = editorDialog.open();
return (i != PropertyEditorDialog.OK) ? null : valueProvider.getStringValue(false);
}
protected String change2Pressed() {
return valueProvider.getStringValue(false);
}
protected void doFillIntoGrid(Composite parent, int numColumns) {
getLabelComposite(parent);
Control control = getTextChangeControl(parent);
control.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
}
protected Composite getTextChangeControl(Composite parent)
{
if (composite == null) createTextChangeControl(parent);
return composite;
}
protected Control getChange1Control(Composite parent) {
button1 = this.getChangeControl(parent);
// openBrowse=Browse
// open=Open
String buttonLabel;
if ((this.buttonLabels!=null)&&(buttonLabels.length>1)) {
buttonLabel = buttonLabels[0];
} else {
buttonLabel = JFaceResources.getString("openBrowse"); //$NON-NLS-1$
}
button1.setText(buttonLabel);
return button1;
}
protected Control getChange2Control(Composite parent) {
if (button2 == null) {
int style = getSettings().getStyle("Button.Style"); //$NON-NLS-1$
if (style==SWT.DEFAULT) style = SWT.NONE;
if (style==0) style = SWT.PUSH;
Color bg = getSettings().getColor("Button.Background"); //$NON-NLS-1$
Color fg = getSettings().getColor("Button.Foreground"); //$NON-NLS-1$
Font font = getSettings().getFont("Button.Font"); //$NON-NLS-1$
button2 = new Button(parent, style);
button2.setFont(font);
button2.setBackground(bg);
button2.setBackground(bg);
button2.setForeground(fg);
// openBrowse=Browse
// open=Open
String buttonLabel;
if ((this.buttonLabels!=null)&&(buttonLabels.length>1)) {
buttonLabel = buttonLabels[1];
} else {
buttonLabel = JFaceResources.getString("open"); //$NON-NLS-1$
}
button2.setText(buttonLabel);
button2.setFont(parent.getFont());
button2.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent evt) {
String newValue = change2Pressed();
if (newValue != null) {
setStringValue(newValue);
}
}
});
button2.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent event) {
button2 = null;
}
});
} else {
checkParent(button2, parent);
}
return button2;
}
protected Control createTextChangeControl(Composite parent) {
GridData gd;
Control control;
composite = new Composite(parent, SWT.NONE);
composite.setBackground(parent.getBackground());
GridLayout gridLayout = new GridLayout(5, false);
gridLayout.marginHeight = 0;
gridLayout.marginWidth = 0;
gridLayout.horizontalSpacing = 0;
gridLayout.verticalSpacing = 0;
composite.setLayout(gridLayout);
// text control
Control textControl = createTextControl(composite);
gd = new GridData(GridData.FILL_HORIZONTAL);
textControl.setLayoutData(gd);
// separator
control = new Composite(composite, SWT.NONE);
control.setBackground(parent.getBackground());
gd = new GridData();
gd.widthHint = 5;
gd.heightHint = 5;
control.setLayoutData(gd);
// button1 control
control = getChange1Control(composite);
gd = new GridData();
//gd.widthHint = convertHorizontalDLUsToPixels(control, IDialogConstants.BUTTON_WIDTH);
gd.heightHint = textControl.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
control.setLayoutData(gd);
// separator
control = new Composite(composite, SWT.NONE);
control.setBackground(parent.getBackground());
gd = new GridData();
gd.widthHint = 5;
gd.heightHint = 5;
control.setLayoutData(gd);
// button2 control
control = getChange2Control(composite);
gd = new GridData();
//gd.widthHint = convertHorizontalDLUsToPixels(control, IDialogConstants.BUTTON_WIDTH);
gd.heightHint = textControl.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
control.setLayoutData(gd);
// initialize
if (this.valueProvider!=null) {
getTextField().setText(""+valueProvider.getValue()); //$NON-NLS-1$
}
return composite;
}
// IPropertyChangeListener
public void propertyChange(PropertyChangeEvent event) {
if (valueChangeListener!=null) {
if (ExtendedFieldEditor.VALUE.equals(event.getProperty())) {
setPropertyChangeListener(null);
Object oldValue = event.getOldValue();
Object newValue = event.getNewValue();
java.beans.PropertyChangeEvent e = new java.beans.PropertyChangeEvent(this, IPropertyEditor.VALUE, oldValue, newValue);
valueChangeListener.valueChange(e);
setPropertyChangeListener(this);
}
}
}
public void propertyChange(java.beans.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);
}
}
public int getNumberOfControls() {
return 2;
}
public void setEnabled(boolean enabled, Composite parent) {
Control controls[] = getControls(parent);
for (int i = 0; i < controls.length; i++) {
if (controls[i] instanceof Composite) {
Control compositeChildren[] = ((Composite)controls[i]).getChildren();
for (int j = 0; j < compositeChildren.length; compositeChildren[j++].setEnabled(enabled));
}
controls[i].setEnabled(enabled);
}
}
// IFieldEditor
public Control[] getControls(Composite parent)
{
return new Control[] {getLabelComposite(parent), getTextChangeControl(parent)};
/*
Control mainPanelChildren[] = getTextChangeControl(parent).getChildren();
Control result[] = new Control[mainPanelChildren.length + 1];
result[0] = getLabelComposite(parent);
System.arraycopy(mainPanelChildren, 0, result, 1, mainPanelChildren.length);
return result;
*/
}
/**
* @return
*/
public String[] getButtonLabels() {
return buttonLabels;
}
/**
* @param strings
*/
public void setButtonLabels(String[] strings) {
buttonLabels = strings;
}
public void setEnabled(boolean enabled){
super.setEnabled(enabled);
if (getTextControl()!=null) {
getTextControl().setEnabled(enabled);
}
if (this.button1!=null) {
this.button1.setEnabled(enabled);
}
if (this.button2!=null) {
this.button2.setEnabled(enabled);
}
}
}