001 /*
002 * Copyright 2002-2004 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005 * use this file except in compliance with the License. You may obtain a copy of
006 * the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013 * License for the specific language governing permissions and limitations under
014 * the License.
015 */
016 package org.springframework.richclient.core;
017
018 import java.awt.Image;
019 import java.beans.PropertyChangeListener;
020 import java.beans.PropertyChangeSupport;
021
022 import javax.swing.Icon;
023 import javax.swing.ImageIcon;
024 import javax.swing.KeyStroke;
025 import javax.swing.event.SwingPropertyChangeSupport;
026
027 import org.apache.commons.logging.Log;
028 import org.apache.commons.logging.LogFactory;
029 import org.springframework.core.style.ToStringCreator;
030 import org.springframework.richclient.application.support.ApplicationServicesAccessor;
031 import org.springframework.richclient.command.config.CommandButtonLabelInfo;
032 import org.springframework.richclient.command.config.CommandLabelConfigurable;
033 import org.springframework.richclient.image.config.ImageConfigurable;
034 import org.springframework.util.Assert;
035 import org.springframework.util.ObjectUtils;
036
037 /**
038 * A convenient super class for objects that can be labeled for display in a
039 * GUI.
040 *
041 * @author Keith Donald
042 */
043 public class LabeledObjectSupport extends ApplicationServicesAccessor implements DescribedElement, VisualizedElement,
044 CommandLabelConfigurable, ImageConfigurable, DescriptionConfigurable, TitleConfigurable {
045 protected final Log logger = LogFactory.getLog(getClass());
046
047 private CommandButtonLabelInfo label;
048
049 private String title;
050
051 private String caption;
052
053 private String description;
054
055 private Image image;
056
057 private PropertyChangeSupport propertyChangeSupport;
058
059 public void setLabelInfo(CommandButtonLabelInfo label) {
060 String oldDisplayName = null;
061 if (this.title != null || this.label != null) {
062 oldDisplayName = getDisplayName();
063 }
064
065 int oldMnemonic = getMnemonic();
066 int oldMnemonicIndex = getMnemonicIndex();
067 KeyStroke oldAccelerator = getAccelerator();
068 this.label = label;
069 firePropertyChange(DISPLAY_NAME_PROPERTY, oldDisplayName, getDisplayName());
070 firePropertyChange("mnemonic", oldMnemonic, getMnemonic());
071 firePropertyChange("mnemonicIndex", oldMnemonicIndex, getMnemonicIndex());
072 firePropertyChange("accelerator", oldAccelerator, getAccelerator());
073 }
074
075 public void setCaption(String caption) {
076 String oldValue = caption;
077 this.caption = caption;
078 firePropertyChange(CAPTION_PROPERTY, oldValue, caption);
079 }
080
081 public void setDescription(String description) {
082 String oldValue = this.description;
083 this.description = description;
084 firePropertyChange(DESCRIPTION_PROPERTY, oldValue, description);
085 }
086
087 public void setTitle(String title) {
088 String oldValue = null;
089 if (this.title != null || this.label != null) {
090 oldValue = getDisplayName();
091 }
092
093 this.title = title;
094 firePropertyChange(DISPLAY_NAME_PROPERTY, oldValue, getDisplayName());
095 }
096
097 public void setImage(Image image) {
098 Image oldValue = image;
099 this.image = image;
100 firePropertyChange("image", oldValue, image);
101 }
102
103 public String getDisplayName() {
104 if (title != null) {
105 return title;
106 }
107
108 if (label == null) {
109 if (logger.isInfoEnabled()) {
110 logger.info("This labeled object's display name is not configured; returning 'displayName'");
111 }
112 return "displayName";
113 }
114 return label.getText();
115 }
116
117 public String getCaption() {
118 return caption;
119 }
120
121 public String getDescription() {
122 return description;
123 }
124
125 public Image getImage() {
126 return image;
127 }
128
129 public Icon getIcon() {
130 if (image != null)
131 return new ImageIcon(image);
132
133 return null;
134 }
135
136 public int getMnemonic() {
137 if (label != null)
138 return label.getMnemonic();
139
140 return 0;
141 }
142
143 public int getMnemonicIndex() {
144 if (label != null)
145 return label.getMnemonicIndex();
146
147 return 0;
148 }
149
150 public KeyStroke getAccelerator() {
151 if (label != null)
152 return label.getAccelerator();
153
154 return null;
155 }
156
157 public CommandButtonLabelInfo getLabel() {
158 return label;
159 }
160
161 public void addPropertyChangeListener(PropertyChangeListener l) {
162 getOrCreatePropertyChangeSupport().addPropertyChangeListener(l);
163 }
164
165 public void addPropertyChangeListener(String propertyName, PropertyChangeListener l) {
166 getOrCreatePropertyChangeSupport().addPropertyChangeListener(propertyName, l);
167 }
168
169 public void removePropertyChangeListener(PropertyChangeListener l) {
170 getPropertyChangeSupport().removePropertyChangeListener(l);
171 }
172
173 public void removePropertyChangeListener(String propertyName, PropertyChangeListener l) {
174 getPropertyChangeSupport().removePropertyChangeListener(propertyName, l);
175 }
176
177 private PropertyChangeSupport getPropertyChangeSupport() {
178 Assert.notNull(propertyChangeSupport,
179 "Property change support has not yet been initialized; add a listener first!");
180 return propertyChangeSupport;
181 }
182
183 private PropertyChangeSupport getOrCreatePropertyChangeSupport() {
184 if (propertyChangeSupport == null) {
185 propertyChangeSupport = new SwingPropertyChangeSupport(this);
186 }
187 return propertyChangeSupport;
188 }
189
190 protected void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {
191 if (propertyChangeSupport != null) {
192 propertyChangeSupport.firePropertyChange(propertyName, oldValue, newValue);
193 }
194 }
195
196 protected void firePropertyChange(String propertyName, int oldValue, int newValue) {
197 if (propertyChangeSupport != null) {
198 propertyChangeSupport.firePropertyChange(propertyName, oldValue, newValue);
199 }
200 }
201
202 protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
203 if (propertyChangeSupport != null) {
204 propertyChangeSupport.firePropertyChange(propertyName, oldValue, newValue);
205 }
206 }
207
208 protected boolean hasChanged(Object currentValue, Object proposedValue) {
209 return !ObjectUtils.nullSafeEquals(currentValue, proposedValue);
210 }
211
212 protected boolean hasChanged(boolean currentValue, boolean proposedValue) {
213 return currentValue != proposedValue;
214 }
215
216 protected boolean hasChanged(int currentValue, int proposedValue) {
217 return currentValue != proposedValue;
218 }
219
220 public String toString() {
221 return new ToStringCreator(this).toString();
222 }
223
224 }