blob: f89df9eb8ec6774fe83b0619d30a30001784f7d7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.views.properties;
/**
* Interface to an object which is capable of supplying properties for display by
* the standard property sheet page implementation (<code>PropertySheetPage</code>).
* <p>
* This interface should be implemented by clients.
* <code>PropertySheetPage</code> discovers the properties to display from
* currently selected elements. Elements that implement <code>IPropertySource</code>
* directly are included, as are elements that implement <code>IAdaptable</code>
* and have an <code>IPropertySource</code> adapter. Clients should implement
* this interface for any newly-defined elements that are to have properties
* displayable by <code>PropertySheetPage</code>. Note that in the latter case,
* the client will also need to register a suitable adapter factory with the
* platform's adapter manager (<code>Platform.getAdapterManager</code>).
* </p>
*
* @see org.eclipse.core.runtime.IAdaptable
* @see org.eclipse.core.runtime.Platform#getAdapterManager()
* @see org.eclipse.ui.views.properties.PropertySheetPage
*/
public interface IPropertySource {
/**
* Returns a value for this property source that can be edited in a
* property sheet.
* <p>
* This value is used when this <code>IPropertySource</code> is appearing
* in the property sheet as the value of a property of some other
* <code>IPropertySource</code>
* </p>
* <p>
* This value is passed as the input to a cell editor opening on an
* <code>IPropertySource</code>.
* </p>
* <p>
* This value is also used when an <code>IPropertySource</code> is being
* used as the value in a <code>setPropertyValue</code> message. The reciever
* of the message would then typically use the editable value to update the
* original property source or construct a new instance.
* </p>
* <p>
* For example an email address which is a property source may have an
* editable value which is a string so that it can be edited in a text
* cell editor. The email address would also have a constructor or setter
* that takes the edited string so that an appropriate instance can be created
* or the original instance modified when the edited value is set.
* </p>
* <p>
* This behavior is important for another reason. When the property sheet is
* showing properties for more than one object (multiple selection), a property
* sheet entry will display and edit a single value (typically coming from
* the first selected object). After a property has been edited in a cell editor,
* the same value is set as the property value for all of the objects. This is
* fine for primitive types but otherwise all of the objects end up with a
* reference to the same value. Thus by creating an editable value and using it
* to update the state of the original property source object, one is able to
* edit several property source objects at once (multiple selection).
* @return a value that can be edited
*/
public Object getEditableValue();
/**
* Returns the list of property descriptors for this property source.
* The <code>getPropertyValue</code> and <code>setPropertyValue</code> methods
* are used to read and write the actual property values by specifying
* the property ids from these property descriptors.
* <p>
* Implementors should cache the descriptors as they will be asked for
* the descriptors with any edit/update. Since descriptors provide
* cell editors, returning the same descriptors if possible allows
* for efficient updating.
* </p>
*
* @return the property descriptors
*/
public IPropertyDescriptor[] getPropertyDescriptors();
/**
* Returns the value of the property with the given id if it has one.
* Returns <code>null</code> if the property's value is <code>null</code>
* value or if this source does not have the specified property.
*
* @see #setPropertyValue
*
* @param id the id of the property being set
* @return the value of the property, or <code>null</code>
*/
public Object getPropertyValue(Object id);
/**
* Returns whether the value of the property with the given id has changed from
* its default value. Returns <code>false</code> if the notion of default value
* is not meaningful for the specified property, or if this source does not have
* the specified property.
*
* @param id the id of the property
* @return <code>true</code> if the value of the specified property has changed
* from its original default value, and <code>false</code> otherwise
*/
public boolean isPropertySet(Object id);
/**
* Resets the property with the given id to its default value if possible.
* Does nothing if the notion of default value is not meaningful for
* the specified property, or if the property's value cannot be changed,
* or if this source does not have the specified property.
*
* @param id the id of the property being reset
*/
public void resetPropertyValue(Object id);
/**
* Sets the property with the given id if possible. Does nothing if the
* property's value cannot be changed or if this source does not have the
* specified property.
* <p>
* In general, a property source should not directly reference the value
* parameter unless it is an atomic object that can be shared, such as a
* string.
* </p>
* <p>
* An important reason for this is that several property sources with
* compatible descriptors could be appearing in the property sheet at
* the same time. An editor produces a single edited value which is passed
* as the value parameter of this message to all the property sources.
* Thus to avoid a situation where all of the property sources reference
* the same value they should use the value parameter to create a
* new instance of the real value for the given property.
* </p>
* <p>
* There is another reason why a level of indirection is useful. The real
* value of property may be a type that cannot be edited with a standard cell
* editor. However instead of returning the real value in <code>getPropertyValue</code>,
* the value could be converted to a <code>String</code> which could be edited
* with a standard cell editor. The edited value will be passed to this method
* which can then turn it back into the real property value.
* </p>
* <p>Another variation on returning a value other than the real property value in
* <code>getPropertyValue</code> is to return a value which is an
* <code>IPropertySource</code> (or for which the property sheet can obtain an
* <code>IPropertySource</code>). In this case the value to edit is obtained from the
* child property source using <code>getEditableValue</code>. It is this editable value
* that will be passed back via this method when it has been editted
* </p>
*
* @see #getPropertyValue
* @see #getEditableValue
*
* @param id the id of the property being set
* @param value the new value for the property; <code>null</code> is allowed
*/
public void setPropertyValue(Object id, Object value);
}