001 package data.ooimpl; 002 003 import data.*; 004 005 import java.beans.*; 006 007 /** 008 * Pure Java implementation of the {@link CatalogItem} interface. See the documentation for 009 * {@link CatalogItem} for a description of the semantics of this class. 010 * 011 * @author Steffen Zschaler 012 * @version 2.0 19/08/1999 013 * @since v2.0 014 */ 015 public abstract class CatalogItemImpl extends AbstractNameable implements CatalogItem, DataBasketKeys, Cloneable { 016 017 /** 018 * The Catalog that owns this CatalogItem, if any. 019 * 020 * @serial 021 */ 022 private CatalogImpl<?> m_ciOwner; 023 024 /** 025 * The value of this CatalogItem. 026 * 027 * @serial 028 */ 029 private Value m_vValue; 030 031 /** 032 * Create a new CatalogItemImpl. The item's value defaults to an {@link IntegerValue} of 0. 033 * 034 * @param sName the name of the new item. 035 */ 036 public CatalogItemImpl(String sName) { 037 this(sName, new IntegerValue(0)); 038 } 039 040 /** 041 * Create a new CatalogItemImpl. 042 * 043 * @param sName the name of the new item. 044 * @param vValue the value of the item. 045 */ 046 public CatalogItemImpl(String sName, Value vValue) { 047 super(sName); 048 049 m_vValue = vValue; 050 } 051 052 /** 053 * Get the item's value. 054 * 055 * @override Never 056 * 057 * @return a clone of the item's value. 058 */ 059 public Value getValue() { 060 return (Value)m_vValue.clone(); 061 } 062 063 /** 064 * Set the item's value. This method is protected so that subclasses can decide whether or not to allow 065 * clients to set the value of a CatalogItem once it has been created. 066 * 067 * <p>The method will fire a property change event for the "value" property.</p> 068 * 069 * @override Sometimes 070 */ 071 protected void setValue(Value vNew) { 072 Value v = m_vValue; 073 074 m_vValue = vNew; 075 076 m_pcsPropertyListeners.firePropertyChange(VALUE_PROPERTY, v, m_vValue); 077 } 078 079 /** 080 * Return true if this CatalogItem is editable. 081 * 082 * @override Never 083 */ 084 public boolean isEditable() { 085 return ((getCatalog() == null) || 086 (((CatalogImpl<?>)getCatalog()).getEditingItemsContainer().get(getName()) == this)); 087 } 088 089 /** 090 * Get the Catalog of this CatalogItem. 091 * 092 * @override Never 093 */ 094 public Catalog getCatalog() { 095 return m_ciOwner; 096 } 097 098 /** 099 * Set the Catalog of this CatalogItem. Used internally only. 100 * 101 * @override Never 102 */ 103 void setCatalog(CatalogImpl ci) { 104 m_ciOwner = ci; 105 attach(ci); 106 } 107 108 /** 109 * Return a String representation of the item. 110 * 111 * @override Sometimes 112 */ 113 public String toString() { 114 return "Abstract CatalogItem \"" + getName() + "\""; 115 } 116 117 /** 118 * Get a shallow clone of the CatalogItem. For normal CatalogItems there is no difference between a shallow 119 * and a deep clone. 120 * 121 * @override Always 122 */ 123 protected abstract CatalogItemImpl getShallowClone(); 124 125 /** 126 * Get a shallow clone of the CatalogItem. This is for internal use only. 127 * 128 * @override Never 129 */ 130 @SuppressWarnings("unchecked") 131 protected <T extends CatalogItemImpl> T getInternalShallowClone() { 132 return (T) getShallowClone(); 133 } 134 135 136 /** 137 * Compare this CatalogItem to an object. 138 * 139 * @override Sometimes The default implementation assumes that the given object is also a CatalogItem and 140 * compares the {@link #getName() names} of these two CatalogItems. 141 * 142 * @exception ClassCastException if the given object cannot be cast into a CatalogItem. 143 */ 144 public int compareTo(Object o) { 145 return getName().compareTo(((CatalogItem)o).getName()); 146 } 147 148 /** 149 * Check whether two objects are equal. 150 * 151 * @override Sometimes The default implementation returns true iff <code>o</code> is identical to this 152 * object. 153 */ 154 public boolean equals(Object o) { 155 return (this == o); 156 } 157 158 /** 159 * Add a PropertyChangeListener that will receive events whenever the "value" property changes. 160 * 161 * @override Never 162 */ 163 public void addValueListener(PropertyChangeListener pcl) { 164 m_pcsPropertyListeners.addPropertyChangeListener(VALUE_PROPERTY, pcl); 165 } 166 167 /** 168 * Remove a PropertyChangeListener for the "value" property. 169 * 170 * @override Never 171 */ 172 public void removeValueListener(PropertyChangeListener pcl) { 173 m_pcsPropertyListeners.removePropertyChangeListener(VALUE_PROPERTY, pcl); 174 } 175 }