diff options
author | Tod Creasey | 2006-04-03 18:00:05 +0000 |
---|---|---|
committer | Tod Creasey | 2006-04-03 18:00:05 +0000 |
commit | 1ccb6f8ddf35b3b40ebd3ebe3e7982aa947ec045 (patch) | |
tree | 476b3e460f719cc7eb1b357a26209ae6d7b22d18 | |
parent | c95b7315eddfacd79bf326fbe85878b599cc78a3 (diff) | |
download | eclipse.platform.ui-1ccb6f8ddf35b3b40ebd3ebe3e7982aa947ec045.tar.gz eclipse.platform.ui-1ccb6f8ddf35b3b40ebd3ebe3e7982aa947ec045.tar.xz eclipse.platform.ui-1ccb6f8ddf35b3b40ebd3ebe3e7982aa947ec045.zip |
Fix for Bug 133941[Properties] Can't contribute properties page for non IAdaptable
-rw-r--r-- | bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertySheetEntry.java | 1307 |
1 files changed, 661 insertions, 646 deletions
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertySheetEntry.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertySheetEntry.java index 35d3993112d..8427435ed42 100644 --- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertySheetEntry.java +++ b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertySheetEntry.java @@ -20,6 +20,7 @@ import java.util.Map; import org.eclipse.core.commands.common.EventManager; import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.core.runtime.Platform; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.ICellEditorListener; import org.eclipse.jface.viewers.ILabelProvider; @@ -32,15 +33,15 @@ import org.eclipse.swt.widgets.Composite; * and <code>IPropertyDescriptor</code> to interact with domain model objects. * <p> * Every property sheet entry has a single descriptor (except the root entry - * which has none). This descriptor determines what property - * of its objects it will display/edit. + * which has none). This descriptor determines what property of its objects it + * will display/edit. * </p> * <p> * Entries do not listen for changes in their objects. Since there is no - * restriction on properties being independent, a change in one property - * may affect other properties. The value of a parent's property may also - * change. As a result we are forced to refresh the entire entry tree - * when a property changes value. + * restriction on properties being independent, a change in one property may + * affect other properties. The value of a parent's property may also change. As + * a result we are forced to refresh the entire entry tree when a property + * changes value. * </p> * * @since 3.0 (was previously internal) @@ -48,208 +49,209 @@ import org.eclipse.swt.widgets.Composite; public class PropertySheetEntry extends EventManager implements IPropertySheetEntry { - /** - * The values we are displaying/editing. - * These objects repesent the value of one of the - * properties of the values of our parent entry. - * Except for the root entry where they represent the - * input (selected) objects. - */ - private Object[] values = new Object[0]; + /** + * The values we are displaying/editing. These objects repesent the value of + * one of the properties of the values of our parent entry. Except for the + * root entry where they represent the input (selected) objects. + */ + private Object[] values = new Object[0]; - /** - * The property sources for the values we are displaying/editing. - */ - private Map sources = new HashMap(0); + /** + * The property sources for the values we are displaying/editing. + */ + private Map sources = new HashMap(0); - /** - * The value of this entry is defined as the the first object - * in its value array or, if that object is an - * <code>IPropertySource</code>, the value it returns when sent - * <code>getEditableValue</code> - */ - private Object editValue; + /** + * The value of this entry is defined as the the first object in its value + * array or, if that object is an <code>IPropertySource</code>, the value + * it returns when sent <code>getEditableValue</code> + */ + private Object editValue; - private PropertySheetEntry parent; + private PropertySheetEntry parent; - private IPropertySourceProvider propertySourceProvider; + private IPropertySourceProvider propertySourceProvider; - private IPropertyDescriptor descriptor; + private IPropertyDescriptor descriptor; - private CellEditor editor; + private CellEditor editor; - private String errorText; + private String errorText; - private PropertySheetEntry[] childEntries = null; + private PropertySheetEntry[] childEntries = null; - /** - * Create the CellEditorListener for this entry. It listens for - * value changes in the CellEditor, and cancel and finish requests. - */ - private ICellEditorListener cellEditorListener = new ICellEditorListener() { - public void editorValueChanged(boolean oldValidState, - boolean newValidState) { - if (!newValidState) { + /** + * Create the CellEditorListener for this entry. It listens for value + * changes in the CellEditor, and cancel and finish requests. + */ + private ICellEditorListener cellEditorListener = new ICellEditorListener() { + public void editorValueChanged(boolean oldValidState, + boolean newValidState) { + if (!newValidState) { // currently not valid so show an error message - setErrorText(editor.getErrorMessage()); + setErrorText(editor.getErrorMessage()); } else { - // currently valid - setErrorText(null); + // currently valid + setErrorText(null); } - } - - public void cancelEditor() { - setErrorText(null); - } - - public void applyEditorValue() { - PropertySheetEntry.this.applyEditorValue(); - } - }; - - /* (non-Javadoc) - * Method declared on IPropertySheetEntry. - */ - public void addPropertySheetEntryListener( - IPropertySheetEntryListener listener) { - addListenerObject(listener); - } - - /* (non-Javadoc) - * Method declared on IPropertySheetEntry. - */ - public void applyEditorValue() { - if (editor == null) { + } + + public void cancelEditor() { + setErrorText(null); + } + + public void applyEditorValue() { + PropertySheetEntry.this.applyEditorValue(); + } + }; + + /* + * (non-Javadoc) Method declared on IPropertySheetEntry. + */ + public void addPropertySheetEntryListener( + IPropertySheetEntryListener listener) { + addListenerObject(listener); + } + + /* + * (non-Javadoc) Method declared on IPropertySheetEntry. + */ + public void applyEditorValue() { + if (editor == null) { return; } - // Check if editor has a valid value - if (!editor.isValueValid()) { - setErrorText(editor.getErrorMessage()); - return; - } + // Check if editor has a valid value + if (!editor.isValueValid()) { + setErrorText(editor.getErrorMessage()); + return; + } - setErrorText(null); + setErrorText(null); - // See if the value changed and if so update - Object newValue = editor.getValue(); - boolean changed = false; - if (values.length > 1) { - changed = true; - } else if (editValue == null) { - if (newValue != null) { + // See if the value changed and if so update + Object newValue = editor.getValue(); + boolean changed = false; + if (values.length > 1) { + changed = true; + } else if (editValue == null) { + if (newValue != null) { changed = true; } - } else if (!editValue.equals(newValue)) { + } else if (!editValue.equals(newValue)) { changed = true; } - // Set the editor value - if (changed) { + // Set the editor value + if (changed) { setValue(newValue); } - } + } + + /** + * Return the unsorted intersection of all the + * <code>IPropertyDescriptor</code>s for the objects. + * + * @return List + */ + private List computeMergedPropertyDescriptors() { + if (values.length == 0) { + return new ArrayList(0); + } - /** - * Return the unsorted intersection of all the <code>IPropertyDescriptor</code>s - * for the objects. - * @return List - */ - private List computeMergedPropertyDescriptors() { - if (values.length == 0) { + IPropertySource firstSource = getPropertySource(values[0]); + if (firstSource == null) { return new ArrayList(0); } - IPropertySource firstSource = getPropertySource(values[0]); - if (firstSource == null) { - return new ArrayList(0); - } - - if (values.length == 1) { - return Arrays.asList(firstSource.getPropertyDescriptors()); - } - - // get all descriptors from each object - Map[] propertyDescriptorMaps = new Map[values.length]; - for (int i = 0; i < values.length; i++) { - Object object = values[i]; - IPropertySource source = getPropertySource(object); - if (source == null) { - // if one of the selected items is not a property source - // then we show no properties - return new ArrayList(0); - } - // get the property descriptors keyed by id - propertyDescriptorMaps[i] = computePropertyDescriptorsFor(source); - } - - // intersect - Map intersection = propertyDescriptorMaps[0]; - for (int i = 1; i < propertyDescriptorMaps.length; i++) { - // get the current ids - Object[] ids = intersection.keySet().toArray(); - for (int j = 0; j < ids.length; j++) { - Object object = propertyDescriptorMaps[i].get(ids[j]); - if (object == null - || - // see if the descriptors (which have the same id) are compatible - !((IPropertyDescriptor) intersection.get(ids[j])) - .isCompatibleWith((IPropertyDescriptor) object)) { + if (values.length == 1) { + return Arrays.asList(firstSource.getPropertyDescriptors()); + } + + // get all descriptors from each object + Map[] propertyDescriptorMaps = new Map[values.length]; + for (int i = 0; i < values.length; i++) { + Object object = values[i]; + IPropertySource source = getPropertySource(object); + if (source == null) { + // if one of the selected items is not a property source + // then we show no properties + return new ArrayList(0); + } + // get the property descriptors keyed by id + propertyDescriptorMaps[i] = computePropertyDescriptorsFor(source); + } + + // intersect + Map intersection = propertyDescriptorMaps[0]; + for (int i = 1; i < propertyDescriptorMaps.length; i++) { + // get the current ids + Object[] ids = intersection.keySet().toArray(); + for (int j = 0; j < ids.length; j++) { + Object object = propertyDescriptorMaps[i].get(ids[j]); + if (object == null || + // see if the descriptors (which have the same id) are + // compatible + !((IPropertyDescriptor) intersection.get(ids[j])) + .isCompatibleWith((IPropertyDescriptor) object)) { intersection.remove(ids[j]); } - } - } - - // sorting is handled in the PropertySheetViewer, return unsorted (in the original order) - ArrayList result = new ArrayList(intersection.size()); - IPropertyDescriptor[] firstDescs = firstSource.getPropertyDescriptors(); - for (int i = 0; i < firstDescs.length; i++) { - IPropertyDescriptor desc = firstDescs[i]; - if (intersection.containsKey(desc.getId())) { - result.add(desc); - } - } - return result; - } - - /** - * Returns an map of property descritptors (keyed on id) for the - * given property source. - * - * @param source a property source for which to obtain descriptors - * @return a table of decriptors keyed on their id - */ - private Map computePropertyDescriptorsFor(IPropertySource source) { - IPropertyDescriptor[] descriptors = source.getPropertyDescriptors(); - Map result = new HashMap(descriptors.length * 2 + 1); - for (int i = 0; i < descriptors.length; i++) { - result.put(descriptors[i].getId(), descriptors[i]); - } - return result; - } - - /** - * Create our child entries. - */ - private void createChildEntries() { - // get the current descriptors - List descriptors = computeMergedPropertyDescriptors(); - - // rebuild child entries using old when possible - PropertySheetEntry[] newEntries = new PropertySheetEntry[descriptors.size()]; + } + } + + // sorting is handled in the PropertySheetViewer, return unsorted (in + // the original order) + ArrayList result = new ArrayList(intersection.size()); + IPropertyDescriptor[] firstDescs = firstSource.getPropertyDescriptors(); + for (int i = 0; i < firstDescs.length; i++) { + IPropertyDescriptor desc = firstDescs[i]; + if (intersection.containsKey(desc.getId())) { + result.add(desc); + } + } + return result; + } + + /** + * Returns an map of property descritptors (keyed on id) for the given + * property source. + * + * @param source + * a property source for which to obtain descriptors + * @return a table of decriptors keyed on their id + */ + private Map computePropertyDescriptorsFor(IPropertySource source) { + IPropertyDescriptor[] descriptors = source.getPropertyDescriptors(); + Map result = new HashMap(descriptors.length * 2 + 1); + for (int i = 0; i < descriptors.length; i++) { + result.put(descriptors[i].getId(), descriptors[i]); + } + return result; + } + + /** + * Create our child entries. + */ + private void createChildEntries() { + // get the current descriptors + List descriptors = computeMergedPropertyDescriptors(); + + // rebuild child entries using old when possible + PropertySheetEntry[] newEntries = new PropertySheetEntry[descriptors + .size()]; for (int i = 0; i < descriptors.size(); i++) { - IPropertyDescriptor d = (IPropertyDescriptor) descriptors.get(i); - // create new entry - PropertySheetEntry entry = createChildEntry(); + IPropertyDescriptor d = (IPropertyDescriptor) descriptors.get(i); + // create new entry + PropertySheetEntry entry = createChildEntry(); entry.setDescriptor(d); - entry.setParent(this); - entry.setPropertySourceProvider(propertySourceProvider); - entry.refreshValues(); - newEntries[i] = entry; - } - // only assign if successful - childEntries = newEntries; - } + entry.setParent(this); + entry.setPropertySourceProvider(propertySourceProvider); + entry.refreshValues(); + newEntries[i] = entry; + } + // only assign if successful + childEntries = newEntries; + } /** * Factory method to create a new child <code>PropertySheetEntry</code> @@ -260,524 +262,537 @@ public class PropertySheetEntry extends EventManager implements * * @return a new <code>PropertySheetEntry</code> instance for the * descriptor passed in - * @since 3.1 + * @since 3.1 */ protected PropertySheetEntry createChildEntry() { return new PropertySheetEntry(); } - /* (non-Javadoc) - * Method declared on IPropertySheetEntry. - */ - public void dispose() { - if (editor != null) { - editor.dispose(); - editor = null; - } - // recursive call to dispose children - PropertySheetEntry[] entriesToDispose = childEntries; - childEntries = null; - if (entriesToDispose != null) { + /* + * (non-Javadoc) Method declared on IPropertySheetEntry. + */ + public void dispose() { + if (editor != null) { + editor.dispose(); + editor = null; + } + // recursive call to dispose children + PropertySheetEntry[] entriesToDispose = childEntries; + childEntries = null; + if (entriesToDispose != null) { for (int i = 0; i < entriesToDispose.length; i++) { - // an error in a property source may cause refreshChildEntries - // to fail. Since the Workbench handles such errors we - // can be left in a state where a child entry is null. - if (entriesToDispose[i] != null) { + // an error in a property source may cause refreshChildEntries + // to fail. Since the Workbench handles such errors we + // can be left in a state where a child entry is null. + if (entriesToDispose[i] != null) { entriesToDispose[i].dispose(); } - } - } - } - - /** - * The child entries of this entry have changed - * (children added or removed). - * Notify all listeners of the change. - */ - private void fireChildEntriesChanged() { - Object[] array = getListeners(); - for (int i = 0; i < array.length; i++) { - IPropertySheetEntryListener listener = (IPropertySheetEntryListener) array[i]; - listener.childEntriesChanged(this); - } - } - - /** - * The error message of this entry has changed. - * Notify all listeners of the change. - */ - private void fireErrorMessageChanged() { - Object[] array = getListeners(); - for (int i = 0; i < array.length; i++) { - IPropertySheetEntryListener listener = (IPropertySheetEntryListener) array[i]; - listener.errorMessageChanged(this); - } - } - - /** - * The values of this entry have changed. - * Notify all listeners of the change. - */ - private void fireValueChanged() { - Object[] array = getListeners(); - for (int i = 0; i < array.length; i++) { - IPropertySheetEntryListener listener = (IPropertySheetEntryListener) array[i]; - listener.valueChanged(this); - } - } - - /* (non-Javadoc) - * Method declared on IPropertySheetEntry. - */ - public String getCategory() { - return descriptor.getCategory(); - } - - /* (non-Javadoc) - * Method declared on IPropertySheetEntry. - */ - public IPropertySheetEntry[] getChildEntries() { - if (childEntries == null) { + } + } + } + + /** + * The child entries of this entry have changed (children added or removed). + * Notify all listeners of the change. + */ + private void fireChildEntriesChanged() { + Object[] array = getListeners(); + for (int i = 0; i < array.length; i++) { + IPropertySheetEntryListener listener = (IPropertySheetEntryListener) array[i]; + listener.childEntriesChanged(this); + } + } + + /** + * The error message of this entry has changed. Notify all listeners of the + * change. + */ + private void fireErrorMessageChanged() { + Object[] array = getListeners(); + for (int i = 0; i < array.length; i++) { + IPropertySheetEntryListener listener = (IPropertySheetEntryListener) array[i]; + listener.errorMessageChanged(this); + } + } + + /** + * The values of this entry have changed. Notify all listeners of the + * change. + */ + private void fireValueChanged() { + Object[] array = getListeners(); + for (int i = 0; i < array.length; i++) { + IPropertySheetEntryListener listener = (IPropertySheetEntryListener) array[i]; + listener.valueChanged(this); + } + } + + /* + * (non-Javadoc) Method declared on IPropertySheetEntry. + */ + public String getCategory() { + return descriptor.getCategory(); + } + + /* + * (non-Javadoc) Method declared on IPropertySheetEntry. + */ + public IPropertySheetEntry[] getChildEntries() { + if (childEntries == null) { createChildEntries(); } - return childEntries; - } - - /* (non-Javadoc) - * Method declared on IPropertySheetEntry. - */ - public String getDescription() { - return descriptor.getDescription(); - } - - /** - * Returns the descriptor for this entry. - * - * @return the descriptor for this entry - * @since 3.1 (was previously private) - */ - protected IPropertyDescriptor getDescriptor() { - return descriptor; - } - - /* (non-Javadoc) - * Method declared on IPropertySheetEntry. - */ - public String getDisplayName() { - return descriptor.getDisplayName(); - } - - /* - * (non-Javadoc) - * @see org.eclipse.ui.views.properties.IPropertySheetEntry#getEditor(org.eclipse.swt.widgets.Composite) - */ - public CellEditor getEditor(Composite parent) { - - if (editor == null) { - editor = descriptor.createPropertyEditor(parent); - if (editor != null) { - editor.addListener(cellEditorListener); - } - } - if (editor != null) { - editor.setValue(editValue); - setErrorText(editor.getErrorMessage()); - } - return editor; - } - - /** - * Returns the edit value for the object at the given index. - * - * @param index the value object index - * @return the edit value for the object at the given index - */ - protected Object getEditValue(int index) { - Object value = values[index]; - IPropertySource source = getPropertySource(value); - if (source != null) { - value = source.getEditableValue(); - } - return value; - } - - /* (non-Javadoc) - * Method declared on IPropertySheetEntry. - */ - public String getErrorText() { - return errorText; - } - - /* (non-Javadoc) - * Method declared on IPropertySheetEntry. - */ - public String getFilters()[] { - return descriptor.getFilterFlags(); - } - - /* (non-Javadoc) - * Method declared on IPropertySheetEntry. - */ - public Object getHelpContextIds() { - return descriptor.getHelpContextIds(); - } - - /* (non-Javadoc) - * Method declared on IPropertySheetEntry. - */ - public Image getImage() { - ILabelProvider provider = descriptor.getLabelProvider(); - if (provider == null) { + return childEntries; + } + + /* + * (non-Javadoc) Method declared on IPropertySheetEntry. + */ + public String getDescription() { + return descriptor.getDescription(); + } + + /** + * Returns the descriptor for this entry. + * + * @return the descriptor for this entry + * @since 3.1 (was previously private) + */ + protected IPropertyDescriptor getDescriptor() { + return descriptor; + } + + /* + * (non-Javadoc) Method declared on IPropertySheetEntry. + */ + public String getDisplayName() { + return descriptor.getDisplayName(); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.ui.views.properties.IPropertySheetEntry#getEditor(org.eclipse.swt.widgets.Composite) + */ + public CellEditor getEditor(Composite parent) { + + if (editor == null) { + editor = descriptor.createPropertyEditor(parent); + if (editor != null) { + editor.addListener(cellEditorListener); + } + } + if (editor != null) { + editor.setValue(editValue); + setErrorText(editor.getErrorMessage()); + } + return editor; + } + + /** + * Returns the edit value for the object at the given index. + * + * @param index + * the value object index + * @return the edit value for the object at the given index + */ + protected Object getEditValue(int index) { + Object value = values[index]; + IPropertySource source = getPropertySource(value); + if (source != null) { + value = source.getEditableValue(); + } + return value; + } + + /* + * (non-Javadoc) Method declared on IPropertySheetEntry. + */ + public String getErrorText() { + return errorText; + } + + /* + * (non-Javadoc) Method declared on IPropertySheetEntry. + */ + public String getFilters()[] { + return descriptor.getFilterFlags(); + } + + /* + * (non-Javadoc) Method declared on IPropertySheetEntry. + */ + public Object getHelpContextIds() { + return descriptor.getHelpContextIds(); + } + + /* + * (non-Javadoc) Method declared on IPropertySheetEntry. + */ + public Image getImage() { + ILabelProvider provider = descriptor.getLabelProvider(); + if (provider == null) { return null; } - return provider.getImage(editValue); - } - - /** - * Returns the parent of this entry. - * - * @return the parent entry, or <code>null</code> if it has no parent - * @since 3.1 - */ - protected PropertySheetEntry getParent() { - return parent; - } - - /** - * Returns an property source for the given object. - * - * @param object an object for which to obtain a property source or - * <code>null</code> if a property source is not available - * @return an property source for the given object - * @since 3.1 (was previously private) - */ - protected IPropertySource getPropertySource(Object object) { - if (sources.containsKey(object)) { + return provider.getImage(editValue); + } + + /** + * Returns the parent of this entry. + * + * @return the parent entry, or <code>null</code> if it has no parent + * @since 3.1 + */ + protected PropertySheetEntry getParent() { + return parent; + } + + /** + * Returns an property source for the given object. + * + * @param object + * an object for which to obtain a property source or + * <code>null</code> if a property source is not available + * @return an property source for the given object + * @since 3.1 (was previously private) + */ + protected IPropertySource getPropertySource(Object object) { + if (sources.containsKey(object)) return (IPropertySource) sources.get(object); - } - IPropertySource result = null; - if (propertySourceProvider != null) { - result = propertySourceProvider.getPropertySource(object); + IPropertySource result = null; + IPropertySourceProvider provider = propertySourceProvider; + + if (provider == null && object != null) + provider = (IPropertySourceProvider) Platform.getAdapterManager() + .getAdapter(object, IPropertySourceProvider.class); + + if (provider != null) { + result = provider.getPropertySource(object); } else if (object instanceof IPropertySource) { result = (IPropertySource) object; } else if (object instanceof IAdaptable) { result = (IPropertySource) ((IAdaptable) object) - .getAdapter(IPropertySource.class); + .getAdapter(IPropertySource.class); + } else { + if (object != null) + result = (IPropertySource) Platform.getAdapterManager() + .getAdapter(object, IPropertySource.class); } - sources.put(object, result); - return result; - } + sources.put(object, result); + return result; + } - /* (non-Javadoc) - * Method declared on IPropertySheetEntry. - */ - public String getValueAsString() { - if (editValue == null) { + /* + * (non-Javadoc) Method declared on IPropertySheetEntry. + */ + public String getValueAsString() { + if (editValue == null) { return "";//$NON-NLS-1$ } - ILabelProvider provider = descriptor.getLabelProvider(); - if (provider == null) { + ILabelProvider provider = descriptor.getLabelProvider(); + if (provider == null) { return editValue.toString(); } - String text = provider.getText(editValue); - if(text == null) { + String text = provider.getText(editValue); + if (text == null) { return "";//$NON-NLS-1$ } - return text; - } - - /** - * Returns the value objects of this entry. - * - * @return the value objects of this entry - * @since 3.1 (was previously private) - */ - public Object[] getValues() { - return values; - } - - /* (non-Javadoc) - * Method declared on IPropertySheetEntry. - */ - public boolean hasChildEntries() { - if (childEntries != null && childEntries.length > 0) { + return text; + } + + /** + * Returns the value objects of this entry. + * + * @return the value objects of this entry + * @since 3.1 (was previously private) + */ + public Object[] getValues() { + return values; + } + + /* + * (non-Javadoc) Method declared on IPropertySheetEntry. + */ + public boolean hasChildEntries() { + if (childEntries != null && childEntries.length > 0) { return true; } - // see if we could have entires if we were asked - return computeMergedPropertyDescriptors().size() > 0; - } - - /** - * Update our child entries. - * This implementation tries to reuse child entries if possible - * (if the id of the new descriptor matches the descriptor id of the - * old entry). - */ - private void refreshChildEntries() { - if (childEntries == null) { + // see if we could have entires if we were asked + return computeMergedPropertyDescriptors().size() > 0; + } + + /** + * Update our child entries. This implementation tries to reuse child + * entries if possible (if the id of the new descriptor matches the + * descriptor id of the old entry). + */ + private void refreshChildEntries() { + if (childEntries == null) { // no children to refresh - return; - } - - // get the current descriptors - List descriptors = computeMergedPropertyDescriptors(); - - // cache old entries by their descriptor id - Map entryCache = new HashMap(childEntries.length * 2 + 1); - for (int i = 0; i < childEntries.length; i++) { - PropertySheetEntry childEntry = childEntries[i]; - if (childEntry != null) { - entryCache.put(childEntry.getDescriptor().getId(), childEntry); - } - } - - // create a list of entries to dispose - List entriesToDispose = new ArrayList(Arrays.asList(childEntries)); - - // clear the old entries - this.childEntries = null; - - // rebuild child entries using old when possible - PropertySheetEntry[] newEntries = new PropertySheetEntry[descriptors.size()]; - boolean entriesChanged = descriptors.size() != entryCache.size(); - for (int i = 0; i < descriptors.size(); i++) { - IPropertyDescriptor d = (IPropertyDescriptor) descriptors.get(i); - // see if we have an entry matching this descriptor - PropertySheetEntry entry = (PropertySheetEntry) entryCache.get(d - .getId()); - if (entry != null) { - // reuse old entry - entry.setDescriptor(d); - entriesToDispose.remove(entry); - } else { - // create new entry - entry = createChildEntry(); - entry.setDescriptor(d); - entry.setParent(this); - entry.setPropertySourceProvider(propertySourceProvider); - entriesChanged = true; - } - entry.refreshValues(); - newEntries[i] = entry; - } - - // only assign if successful - this.childEntries = newEntries; - - if (entriesChanged) { + return; + } + + // get the current descriptors + List descriptors = computeMergedPropertyDescriptors(); + + // cache old entries by their descriptor id + Map entryCache = new HashMap(childEntries.length * 2 + 1); + for (int i = 0; i < childEntries.length; i++) { + PropertySheetEntry childEntry = childEntries[i]; + if (childEntry != null) { + entryCache.put(childEntry.getDescriptor().getId(), childEntry); + } + } + + // create a list of entries to dispose + List entriesToDispose = new ArrayList(Arrays.asList(childEntries)); + + // clear the old entries + this.childEntries = null; + + // rebuild child entries using old when possible + PropertySheetEntry[] newEntries = new PropertySheetEntry[descriptors + .size()]; + boolean entriesChanged = descriptors.size() != entryCache.size(); + for (int i = 0; i < descriptors.size(); i++) { + IPropertyDescriptor d = (IPropertyDescriptor) descriptors.get(i); + // see if we have an entry matching this descriptor + PropertySheetEntry entry = (PropertySheetEntry) entryCache.get(d + .getId()); + if (entry != null) { + // reuse old entry + entry.setDescriptor(d); + entriesToDispose.remove(entry); + } else { + // create new entry + entry = createChildEntry(); + entry.setDescriptor(d); + entry.setParent(this); + entry.setPropertySourceProvider(propertySourceProvider); + entriesChanged = true; + } + entry.refreshValues(); + newEntries[i] = entry; + } + + // only assign if successful + this.childEntries = newEntries; + + if (entriesChanged) { fireChildEntriesChanged(); } - //Dispose of entries which are no longer needed - for (int i = 0; i < entriesToDispose.size(); i++) { - ((IPropertySheetEntry) entriesToDispose.get(i)).dispose(); - } - } + // Dispose of entries which are no longer needed + for (int i = 0; i < entriesToDispose.size(); i++) { + ((IPropertySheetEntry) entriesToDispose.get(i)).dispose(); + } + } - /** - * Refresh the entry tree from the root down. - * - * @since 3.1 (was previously private) - */ - protected void refreshFromRoot() { - if (parent == null) { + /** + * Refresh the entry tree from the root down. + * + * @since 3.1 (was previously private) + */ + protected void refreshFromRoot() { + if (parent == null) { refreshChildEntries(); } else { parent.refreshFromRoot(); } - } - - /** - * Update our value objects. - * We ask our parent for the property values based on - * our descriptor. - */ - private void refreshValues() { - // get our parent's value objects - Object[] currentSources = parent.getValues(); - - // loop through the objects getting our property value from each - Object[] newValues = new Object[currentSources.length]; - for (int i = 0; i < currentSources.length; i++) { - IPropertySource source = parent - .getPropertySource(currentSources[i]); - newValues[i] = source.getPropertyValue(descriptor.getId()); - } - - // set our new values - setValues(newValues); - } - - /* (non-Javadoc) - * Method declared on IPropertySheetEntry. - */ - public void removePropertySheetEntryListener( - IPropertySheetEntryListener listener) { - removeListenerObject(listener); - } - - /* (non-Javadoc) - * Method declared on IPropertySheetEntry. - */ - public void resetPropertyValue() { - if (parent == null) { + } + + /** + * Update our value objects. We ask our parent for the property values based + * on our descriptor. + */ + private void refreshValues() { + // get our parent's value objects + Object[] currentSources = parent.getValues(); + + // loop through the objects getting our property value from each + Object[] newValues = new Object[currentSources.length]; + for (int i = 0; i < currentSources.length; i++) { + IPropertySource source = parent + .getPropertySource(currentSources[i]); + newValues[i] = source.getPropertyValue(descriptor.getId()); + } + + // set our new values + setValues(newValues); + } + + /* + * (non-Javadoc) Method declared on IPropertySheetEntry. + */ + public void removePropertySheetEntryListener( + IPropertySheetEntryListener listener) { + removeListenerObject(listener); + } + + /* + * (non-Javadoc) Method declared on IPropertySheetEntry. + */ + public void resetPropertyValue() { + if (parent == null) { // root does not have a default value - return; - } - - // Use our parent's values to reset our values. - boolean change = false; - Object[] objects = parent.getValues(); - for (int i = 0; i < objects.length; i++) { - IPropertySource source = getPropertySource(objects[i]); - if (source.isPropertySet(descriptor.getId())) { - // fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=21756 - if (source instanceof IPropertySource2) { - IPropertySource2 extendedSource = (IPropertySource2) source; - // continue with next if property is not resettable - if (!extendedSource - .isPropertyResettable(descriptor.getId())) { + return; + } + + // Use our parent's values to reset our values. + boolean change = false; + Object[] objects = parent.getValues(); + for (int i = 0; i < objects.length; i++) { + IPropertySource source = getPropertySource(objects[i]); + if (source.isPropertySet(descriptor.getId())) { + // fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=21756 + if (source instanceof IPropertySource2) { + IPropertySource2 extendedSource = (IPropertySource2) source; + // continue with next if property is not resettable + if (!extendedSource + .isPropertyResettable(descriptor.getId())) { continue; } - } - source.resetPropertyValue(descriptor.getId()); - change = true; - } - } - if (change) { + } + source.resetPropertyValue(descriptor.getId()); + change = true; + } + } + if (change) { refreshFromRoot(); } - } - - /** - * Set the descriptor. - * @param newDescriptor - */ - private void setDescriptor(IPropertyDescriptor newDescriptor) { - // if our descriptor is changing, we have to get rid - // of our current editor if there is one - if (descriptor != newDescriptor && editor != null) { - editor.dispose(); - editor = null; - } - descriptor = newDescriptor; - } - - /** - * Set the error text. This should be set to null when - * the current value is valid, otherwise it should be - * set to a error string - */ - private void setErrorText(String newErrorText) { - errorText = newErrorText; - // inform listeners - fireErrorMessageChanged(); - } - - /** - * Sets the parent of the entry to be propertySheetEntry. - * @param propertySheetEntry - */ - private void setParent(PropertySheetEntry propertySheetEntry) { - parent = propertySheetEntry; - } - - /** - * Sets a property source provider for this entry. - * This provider is used to obtain an <code>IPropertySource</code> - * for each of this entries objects. If no provider is - * set then a default provider is used. - * @param provider IPropertySourceProvider - */ - public void setPropertySourceProvider(IPropertySourceProvider provider) { - propertySourceProvider = provider; - } - - /** - * Set the value for this entry. - * <p> - * We set the given value as the value for all our value objects. - * We then call our parent to update the property we represent - * with the given value. - * We then trigger a model refresh. - * <p> - * - * @param newValue the new value - */ - private void setValue(Object newValue) { - // Set the value - for (int i = 0; i < values.length; i++) { - values[i] = newValue; - } - - // Inform our parent - parent.valueChanged(this); - - // Refresh the model - refreshFromRoot(); - } - - /** - * The <code>PropertySheetEntry</code> implmentation of this - * method declared on<code>IPropertySheetEntry</code> will - * obtain an editable value for the given objects and update - * the child entries. - * <p> - * Updating the child entries will typically call this method - * on the child entries and thus the entire entry tree is updated - * </p> - * @param objects the new values for this entry - */ - public void setValues(Object[] objects) { - values = objects; - sources = new HashMap(values.length * 2 + 1); - - if (values.length == 0) { + } + + /** + * Set the descriptor. + * + * @param newDescriptor + */ + private void setDescriptor(IPropertyDescriptor newDescriptor) { + // if our descriptor is changing, we have to get rid + // of our current editor if there is one + if (descriptor != newDescriptor && editor != null) { + editor.dispose(); + editor = null; + } + descriptor = newDescriptor; + } + + /** + * Set the error text. This should be set to null when the current value is + * valid, otherwise it should be set to a error string + */ + private void setErrorText(String newErrorText) { + errorText = newErrorText; + // inform listeners + fireErrorMessageChanged(); + } + + /** + * Sets the parent of the entry to be propertySheetEntry. + * + * @param propertySheetEntry + */ + private void setParent(PropertySheetEntry propertySheetEntry) { + parent = propertySheetEntry; + } + + /** + * Sets a property source provider for this entry. This provider is used to + * obtain an <code>IPropertySource</code> for each of this entries + * objects. If no provider is set then a default provider is used. + * + * @param provider + * IPropertySourceProvider + */ + public void setPropertySourceProvider(IPropertySourceProvider provider) { + propertySourceProvider = provider; + } + + /** + * Set the value for this entry. + * <p> + * We set the given value as the value for all our value objects. We then + * call our parent to update the property we represent with the given value. + * We then trigger a model refresh. + * <p> + * + * @param newValue + * the new value + */ + private void setValue(Object newValue) { + // Set the value + for (int i = 0; i < values.length; i++) { + values[i] = newValue; + } + + // Inform our parent + parent.valueChanged(this); + + // Refresh the model + refreshFromRoot(); + } + + /** + * The <code>PropertySheetEntry</code> implmentation of this method + * declared on<code>IPropertySheetEntry</code> will obtain an editable + * value for the given objects and update the child entries. + * <p> + * Updating the child entries will typically call this method on the child + * entries and thus the entire entry tree is updated + * </p> + * + * @param objects + * the new values for this entry + */ + public void setValues(Object[] objects) { + values = objects; + sources = new HashMap(values.length * 2 + 1); + + if (values.length == 0) { editValue = null; } else { - // set the first value object as the entry's value - Object newValue = values[0]; + // set the first value object as the entry's value + Object newValue = values[0]; - // see if we should convert the value to an editable value - IPropertySource source = getPropertySource(newValue); - if (source != null) { + // see if we should convert the value to an editable value + IPropertySource source = getPropertySource(newValue); + if (source != null) { newValue = source.getEditableValue(); } - editValue = newValue; - } - - // update our child entries - refreshChildEntries(); - - // inform listeners that our value changed - fireValueChanged(); - } - - /** - * The value of the given child entry has changed. - * Therefore we must set this change into our value objects. - * <p> - * We must inform our parent so that it can update its value objects - * </p> - * <p> - * Subclasses may override to set the property value in some - * custom way. - * </p> - * - * @param child the child entry that changed its value - */ - protected void valueChanged(PropertySheetEntry child) { - for (int i = 0; i < values.length; i++) { - IPropertySource source = getPropertySource(values[i]); - source.setPropertyValue(child.getDescriptor().getId(), child - .getEditValue(i)); - } - - // inform our parent - if (parent != null) { + editValue = newValue; + } + + // update our child entries + refreshChildEntries(); + + // inform listeners that our value changed + fireValueChanged(); + } + + /** + * The value of the given child entry has changed. Therefore we must set + * this change into our value objects. + * <p> + * We must inform our parent so that it can update its value objects + * </p> + * <p> + * Subclasses may override to set the property value in some custom way. + * </p> + * + * @param child + * the child entry that changed its value + */ + protected void valueChanged(PropertySheetEntry child) { + for (int i = 0; i < values.length; i++) { + IPropertySource source = getPropertySource(values[i]); + source.setPropertyValue(child.getDescriptor().getId(), child + .getEditValue(i)); + } + + // inform our parent + if (parent != null) { parent.valueChanged(this); } - } + } } |