/******************************************************************************* * 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.meta.ui.attribute.editor; import java.beans.PropertyChangeListener; import java.util.StringTokenizer; import org.jboss.tools.common.model.ui.*; import org.jboss.tools.common.model.ui.attribute.editor.*; import org.jboss.tools.common.model.ui.objecteditor.*; import org.eclipse.jface.util.Assert; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; import org.jboss.tools.common.model.*; import org.jboss.tools.common.model.options.PreferenceModelUtilities; import org.jboss.tools.common.model.util.AbstractTableHelper; import org.jboss.tools.common.model.ui.widgets.IWidgetSettings; public class PropertiesStringFieldEditor extends ExtendedFieldEditor implements IFieldEditor, IPropertyFieldEditor, IPropertyChangeListener, PropertyChangeListener { protected IPropertyEditor propertyEditor; protected IValueChangeListener valueChangeListener; protected IValueProvider valueProvider; public static final int VALIDATE_ON_KEY_STROKE = 0; public static final int VALIDATE_ON_FOCUS_LOST = 1; public static int UNLIMITED = -1; private boolean isValid; protected String stringValue; private String oldValue; private XModelObject object; private XChildrenEditor table; private boolean emptyStringAllowed = true; private int validateStrategy = VALIDATE_ON_KEY_STROKE; public PropertiesStringFieldEditor() { this(null); } public PropertiesStringFieldEditor(IWidgetSettings settings) { super(settings); object = PreferenceModelUtilities.getPreferenceModel().createModelObject("FilePROPERTIES", null); //$NON-NLS-1$ table = new XChildrenEditorImpl(); table.setObject(object); } protected void adjustForNumColumns(int numColumns) { GridData gd = (GridData)table.getControl().getLayoutData(); gd.horizontalSpan = numColumns - 1; gd.grabExcessHorizontalSpace = gd.horizontalSpan == 1; } public void fillIntoGrid(Composite parent, int numColumns) { //Assert.isTrue(numColumns >= getNumberOfControls()); Assert.isTrue(parent.getLayout() instanceof GridLayout); doFillIntoGrid(parent, numColumns); } protected void doFillIntoGrid(Composite parent, int numColumns) { Control control = getLabelComposite(parent); GridData gd = new GridData(); gd.horizontalSpan = numColumns; gd.verticalAlignment = GridData.GRAB_VERTICAL; control.setLayoutData(gd); Control c = createObjectControl(parent); gd = new GridData(GridData.FILL_BOTH); gd.horizontalSpan = numColumns; gd.horizontalAlignment = GridData.FILL; gd.grabExcessHorizontalSpace = true; c.setLayoutData(gd); } protected void doLoad() {} public String getStringValue() { return stringValue; } public void setStringValue(String value) { if(stringValue != null && stringValue.equals(value)) return; stringValue = value; XModelObject[] cs = object.getChildren(); for (int i = 0; i < cs.length; i++) { cs[i].removeFromParent(); } StringTokenizer st = new StringTokenizer(value, ",;"); //$NON-NLS-1$ while(st.hasMoreTokens()) { String t = st.nextToken(); int h = t.indexOf('='); String n = (h < 0) ? t : t.substring(0, h); String v = t.substring(h + 1); XModelObject p = object.getModel().createModelObject("Property", null); //$NON-NLS-1$ p.setAttributeValue("name", n); //$NON-NLS-1$ p.setAttributeValue("value", v); //$NON-NLS-1$ object.addChild(p); } table.update(); } protected void doLoadDefault() {} protected void doStore() {} public int getNumberOfControls() { return 2; } public void cut() {} public void copy() {} public void paste() {} public void delete() {} public Control[] getControls(Composite parent) { return new Control[] {getLabelComposite(parent), createObjectControl(parent)}; } protected Control createObjectControl(Composite parent) { if(table.getControl() != null && !table.getControl().isDisposed()) return table.getControl(); return table.createControl(parent); } public void setPropertyEditor(IPropertyEditor propertyEditor) { this.propertyEditor = propertyEditor; if (propertyEditor!=null) { valueProvider = (IValueProvider)propertyEditor.getAdapter(IValueProvider.class); valueChangeListener = (IValueChangeListener)propertyEditor.getAdapter(IValueChangeListener.class); } init(); valueProvider.addValueChangeListener(this); } protected void init() { setStringValue(valueProvider.getStringValue(true)); setPropertyChangeListener(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, event.getOldValue(), event.getNewValue()); valueChangeListener.valueChange(e); setPropertyChangeListener(this); } } public void propertyChange(java.beans.PropertyChangeEvent evt) { } class XChildrenEditorImpl extends XChildrenEditor { protected AbstractTableHelper createHelper() { return new Helper(); } protected String getAddActionPath() { return "CreateActions.CreateProperty"; //$NON-NLS-1$ } public void action(String command) { super.action(command); String oldValue = stringValue; recomputeStringValue(); if(oldValue == null || !oldValue.equals(stringValue)) { fireValueChanged(VALUE, oldValue, stringValue); } } } private void recomputeStringValue() { StringBuffer sb = new StringBuffer(); XModelObject[] os = object.getChildren(); for (int i = 0; i < os.length; i++) { String n = os[i].getAttributeValue("name"); //$NON-NLS-1$ String v = os[i].getAttributeValue("value"); //$NON-NLS-1$ if(n.length() == 0 && v.length() == 0) continue; if(sb.length() > 0) sb.append(';'); sb.append(n).append('=').append(v); } stringValue = sb.toString(); } class Helper extends AbstractTableHelper { String[] HEADER = new String[]{"name", "value"}; //$NON-NLS-1$ //$NON-NLS-2$ public String[] getHeader() { return HEADER; } public int size() { return (object == null) ? 0 : object.getChildren().length; } public XModelObject getModelObject(int r) { if(object == null) return null; XModelObject[] cs = object.getChildren(); return (r < 0 || r >= cs.length) ? null : cs[r]; } } }