001    package data;
002    
003    import java.beans.PropertyChangeListener;
004    
005    /**
006     * An item in a {@link Catalog}.
007     *
008     * <p>CatalogItems describe available objects by their attributes. The only attribute that is mandatory is
009     * a {@link Nameable#getName key} ({@link String}), usually a name, but it could be an ID-Number or
010     * anything. A CatalogItem can have a {@link #getValue value} attribute.<p>
011     *
012     * <p><strong>Note</strong> that the name as obtained via {@link Nameable#getName} is used as the
013     * CatalogItem's key when inserting the CatalogItem inside a Catalog.</p>
014     *
015     * <p>CatalogItems are contained in {@link Catalog Catalogs}.</p>
016     *
017     * @author Steffen Zschaler
018     * @version 2.0 18/08/1999
019     * @since v0.5
020     */
021    public interface CatalogItem extends Nameable, Comparable<Object> {
022    
023        /**
024         * The programmatical name for the &quot;value&quot; property. This is &quot;value&quot;.
025         */
026        public static final String VALUE_PROPERTY = "value";
027    
028        /**
029         * Get the default value of this CatalogItem. Although CatalogItems have a default value, you can use any
030         * other value through the {@link CatalogItemValue} adapter.
031         *
032         * @override Always
033         */
034        public Value getValue();
035    
036        /**
037         * Get the Catalog that currently contains this CatalogItem.
038         *
039         * @override Always
040         */
041        public Catalog getCatalog();
042    
043        /**
044         * Add a PropertyChangeListener that will receive events whenever the &quot;value&quot; property changes.
045         *
046         * @override Always
047         */
048        public void addValueListener(PropertyChangeListener pcl);
049    
050        /**
051         * Remove a PropertyChangeListener for the &quot;value&quot; property.
052         *
053         * @override Always
054         */
055        public void removeValueListener(PropertyChangeListener pcl);
056    }