/*******************************************************************************
* 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.beans.PropertyChangeSupport;
import java.text.MessageFormat;
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.jboss.tools.common.model.ui.attribute.AttributeContentProposalProviderFactory;
import org.jboss.tools.common.model.ui.attribute.adapter.DefaultValueAdapter;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
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.eclipse.swt.widgets.Text;
import org.jboss.tools.common.meta.key.WizardKeys;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.ui.ModelUIPlugin;
import org.jboss.tools.common.model.ui.actions.IActionProvider;
import org.jboss.tools.common.model.ui.widgets.IWidgetSettings;
import org.jboss.tools.common.model.ui.widgets.WhiteSettings;
public class StringButtonFieldEditorEx extends StringButtonFieldEditor implements IFieldEditor, IPropertyChangeListener, PropertyChangeListener, IPropertyFieldEditor {
public final static String BUTTON_SELECTED = "Button.Selected"; //$NON-NLS-1$
protected PropertyEditorDialog editorDialog;
protected IPropertyEditor propertyEditor;
protected IValueProvider valueProvider;
protected IValueChangeListener valueChangeListener;
protected Composite composite;
private PropertyChangeSupport pcs = new PropertyChangeSupport(this);
// private IAction buttonAction;
public StringButtonFieldEditorEx() {
this.setChangeButtonText(EditorMessages.getString("StringButtonFieldEditorEx_Browse")); //$NON-NLS-1$
}
public StringButtonFieldEditorEx(IWidgetSettings settings) {
super(settings);
this.setChangeButtonText(EditorMessages.getString("StringButtonFieldEditorEx_Browse")); //$NON-NLS-1$
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
pcs.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
pcs.removePropertyChangeListener(listener);
}
public void firePropertyChange(java.beans.PropertyChangeEvent event) {
pcs.firePropertyChange(event);
}
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);
IActionProvider actionProvider = (IActionProvider)propertyEditor.getAdapter(IActionProvider.class);
setErrorProvider((IAttributeErrorProvider)propertyEditor.getAdapter(IAttributeErrorProvider.class));
if (actionProvider != null) {
if (getSettings() instanceof WhiteSettings) {
setLabelAction(actionProvider.getAction(StringButtonFieldEditorEx.LABEL_SELECTED));
} else {
// none
}
// buttonAction = actionProvider.getAction(StringButtonFieldEditorEx.BUTTON_SELECTED);
}
}
public IPropertyEditor getPropertyEditor() {
return propertyEditor;
}
protected String changePressed() {
if (propertyEditor != null) {
if(propertyEditor.getInput() instanceof DefaultValueAdapter) {
((DefaultValueAdapter)propertyEditor.getInput()).fireEvent(BUTTON_SELECTED, "false", "true");
}
if(((PropertyEditor)propertyEditor).callsExternal()) {
Object result = ((PropertyEditor)propertyEditor).callExternal(getShell());
return result != null ? result.toString() : null;
}
editorDialog = new PropertyEditorDialog(ModelUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getShell(), propertyEditor);
//editorDialog.create();
//ExtendedFieldEditor fieldEditor = propertyEditor.getFieldEditor(null);
DefaultValueAdapter adapter = (DefaultValueAdapter)propertyEditor.getInput();
String title = MessageFormat.format("Edit {0}", propertyEditor.getAttributeName());
if(adapter != null && adapter.getAttribute() != null) {
String key = "" + adapter.getAttribute().getModelEntity().getName() + "." + adapter.getAttribute().getName().replace(' ', '_') + ".edit"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
String t = WizardKeys.getLabelText(key);
if(t != null) {
title = t;
} else {
title = MessageFormat.format("Edit {0}", WizardKeys.getAttributeDisplayName(adapter.getAttribute(), true));
}
}
editorDialog.create();
editorDialog.getShell().setText(title);
adapter.setStoreLocked(true);
int i = editorDialog.open();
if (PropertyEditorDialog.OK == i) {
adapter.setStoreLocked(false);
adapter.store();
} else {
adapter.load();
adapter.setStoreLocked(false);
}
return valueProvider.getStringValue(false);
} else {
java.beans.PropertyChangeEvent event = new java.beans.PropertyChangeEvent(this, BUTTON_SELECTED, Boolean.TRUE, Boolean.FALSE);
firePropertyChange(event);
return ""; //$NON-NLS-1$
}
}
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 createTextChangeControl(Composite parent) {
GridData gd;
Control control;
if(composite == null)
composite = new Composite(parent, SWT.NONE);
composite.setBackgroundMode(SWT.INHERIT_DEFAULT);
/// composite.setBackground(parent.getBackground());
GridLayout gridLayout = new GridLayout(3, false);
gridLayout.marginHeight = 0;
gridLayout.marginWidth = 0;
gridLayout.horizontalSpacing = 0;
gridLayout.verticalSpacing = 0;
composite.setLayout(gridLayout);
Control textControl = createTextControl(composite);
gd = new GridData(GridData.FILL_HORIZONTAL);
textControl.setLayoutData(gd);
control = new Label(composite, SWT.NONE);
/// control.setBackground(parent.getBackground());
gd = new GridData();
gd.widthHint = 5;
control.setLayoutData(gd);
control = getChangeControl(composite);
gd = new GridData();
gd.widthHint = convertHorizontalDLUsToPixels(control, IDialogConstants.BUTTON_WIDTH);
gd.heightHint = textControl.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
control.setLayoutData(gd);
// init data
if (valueProvider!=null) {
String value = valueProvider.getStringValue(Boolean.TRUE.booleanValue());
getTextField().setText(value);
if (getLabelAction()!=null) {
getLabelAction().setEnabled((value!=null/* && value.length()>0*/));
}
}
// deprecated - now addContentAssist works
// IContentAssistProcessor processor = (IContentAssistProcessor)propertyEditor.getAdapter(IContentAssistProcessor.class);
// if(processor != null) {
// ControlContentAssistHelper.createTextContentAssistant(getTextField(), processor);
// }
return composite;
}
protected void valueChanged() {
super.valueChanged();
if(isSelectableLabel() && getLabelControl() != null && !getLabelControl().isDisposed()) {
boolean enabled = getLabelAction() != null && getLabelAction().isEnabled();
getLabelControl().setToolTipText(enabled ? getHyperlinkLableToolTip() : null);
}
}
// 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) {
super.propertyChange(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;
}
// IFieldEditor
public Control[] getControls(Composite parent) {
return new Control[] {getLabelComposite(parent), getTextChangeControl(parent)};
}
public void setEnabled(boolean enabled){
super.setEnabled(enabled); // label
}
protected boolean isAlwaysReadOnly() {
if(propertyEditor == null) return false;
Object input = propertyEditor.getInput();
if(input instanceof DefaultValueAdapter) {
DefaultValueAdapter a = (DefaultValueAdapter)input;
XModelObject o = a.getModelObject();
if(o == null || o.isObjectEditable()) return false;
while(o != null && o.getFileType() < XModelObject.FOLDER) {
o = o.getParent();
}
if(o == null) return false;
String entity = o.getModelEntity().getName();
if(entity.indexOf("Jar") >= 0) return true; //$NON-NLS-1$
}
return false;
}
public void setStringValue(String value) {
if(!isSameValue(value)) {
super.setStringValue(value);
}
}
boolean isSameValue(String newValue) {
Text text = getTextField();
if(text == null || text.isDisposed() || newValue == null) return false;
String oldTextValue = text.getText();
if(propertyEditor != null && propertyEditor.getInput() instanceof DefaultValueAdapter) {
DefaultValueAdapter a = (DefaultValueAdapter)propertyEditor.getInput();
if(a != null && a.getAttribute() != null && a.getAttribute().isTrimmable()) {
return oldTextValue != null && oldTextValue.trim().equals(newValue.trim());
}
}
return oldTextValue != null && oldTextValue.equals(newValue);
}
protected void addContentAssist(Text text) {
if(propertyEditor != null && propertyEditor.getInput() instanceof DefaultValueAdapter) {
DefaultValueAdapter valueAdapter = (DefaultValueAdapter)propertyEditor.getInput();
AttributeContentProposalProviderFactory.registerContentAssist(valueAdapter, text);
}
}
}