/******************************************************************************* * 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.List; import org.jboss.tools.common.meta.XAttribute; 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.IAttributeContentProposalProvider; import org.jboss.tools.common.model.ui.attribute.adapter.DefaultValueAdapter; import org.eclipse.jface.fieldassist.ContentProposalAdapter; import org.eclipse.jface.fieldassist.IContentProposalProvider; import org.eclipse.jface.fieldassist.TextContentAdapter; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Text; import org.jboss.tools.common.model.XModelObject; import org.jboss.tools.common.model.ui.widgets.IWidgetSettings; public class StringFieldEditorEx extends StringFieldEditor implements IFieldEditor, IPropertyFieldEditor, IPropertyChangeListener, PropertyChangeListener { protected IPropertyEditor propertyEditor; protected IValueProvider valueProvider; protected IValueChangeListener valueChangeListener; public StringFieldEditorEx() {} public StringFieldEditorEx(IWidgetSettings settings) { super(settings); } public StringFieldEditorEx(IPropertyEditor propertyEditor) { this.propertyEditor = propertyEditor; } protected void init() { setStringValue(valueProvider.getStringValue(true)); setPropertyChangeListener(this); valueProvider.addValueChangeListener(this); } // IPropertyFieldEditor public void setPropertyEditor(IPropertyEditor propertyEditor) { this.propertyEditor = propertyEditor; if (propertyEditor!=null) { valueProvider = (IValueProvider)propertyEditor.getAdapter(IValueProvider.class); valueChangeListener = (IValueChangeListener)propertyEditor.getAdapter(IValueChangeListener.class); setErrorProvider((IAttributeErrorProvider)propertyEditor.getAdapter(IAttributeErrorProvider.class)); } init(); } // 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, event.getOldValue(), event.getNewValue()); valueChangeListener.valueChange(e); setPropertyChangeListener(this); } } // PropertyChangeListener public void propertyChange(PropertyChangeEvent evt) { super.propertyChange(evt); valueProvider.removeValueChangeListener(this); if (IPropertyEditor.VALUE.equals(evt.getPropertyName())) { Object v = evt.getNewValue(); this.setStringValue((v == null) ? "" : v.toString()); //$NON-NLS-1$ } valueProvider.addValueChangeListener(this); } public Control createTextControl(Composite parent) { Control control = super.createTextControl(parent); Text text = getTextField(); if (valueProvider!=null) { String value = valueProvider.getStringValue(true); if (!value.equals(text.getText())) { text.setText(value.toString()); } } return control; } // IFieldEditor public Control[] getControls(Composite parent) { return new Control[] {getLabelComposite(parent), createTextControl(parent)}; } 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.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); } } }