001    /*
002     * Copyright 2002-2004 the original author or authors.
003     * 
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of 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,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.springframework.richclient.command.config;
017    
018    import java.awt.Image;
019    
020    import javax.swing.AbstractButton;
021    import javax.swing.Icon;
022    import javax.swing.ImageIcon;
023    
024    import org.springframework.core.style.ToStringCreator;
025    import org.springframework.richclient.core.VisualizedElement;
026    import org.springframework.richclient.factory.ButtonConfigurer;
027    import org.springframework.util.Assert;
028    import org.springframework.util.ObjectUtils;
029    
030    /**
031     * A parameter object consisting of the various icons that may be displayed on a
032     * single command button depending on its state.
033     * 
034     * <p>
035     * The set of states for which this object maintains icons are as follows:
036     * 
037     * <ul>
038     * <li>default</li>
039     * <li>selected</li>
040     * <li>disabled</li>
041     * <li>pressed</li>
042     * <li>rollover</li>
043     * </ul>
044     * 
045     * </p>
046     * 
047     * @author Keith Donald
048     * 
049     */
050    public class CommandButtonIconInfo implements ButtonConfigurer, VisualizedElement {
051    
052            /**
053             * A {@code CommandButtonIconInfo} instance that can be used for command
054             * buttons that have no icon information associated with them.
055             */
056            // FIXME this is a mutable object so we probably shouldn't be reusing the
057            // same instance for
058            // a blank IconInfo. What happens if multiple blanks have been dished out
059            // and one of them is modified?
060            public static final CommandButtonIconInfo BLANK_ICON_INFO = new CommandButtonIconInfo(null);
061    
062            private Icon icon;
063    
064            private Icon selectedIcon;
065    
066            private Icon disabledIcon;
067    
068            private Icon pressedIcon;
069    
070            private Icon rolloverIcon;
071    
072            /**
073             * Creates a new {@code CommandButtonIconInfo} with the given icon. No
074             * optional icons will be associated with this instance.
075             * 
076             * @param icon The main displayable icon.
077             */
078            public CommandButtonIconInfo(Icon icon) {
079                    this.icon = icon;
080            }
081    
082            /**
083             * Creates a new {@code CommandButtonIconInfo} with the given icons.
084             * 
085             * @param icon The main default icon. May be null.
086             * @param selectedIcon The icon to be displayed when the command button is
087             * in a selected state. May be null.
088             */
089            public CommandButtonIconInfo(Icon icon, Icon selectedIcon) {
090                    this.icon = icon;
091                    this.selectedIcon = selectedIcon;
092            }
093    
094            /**
095             * Creates a new {@code CommandButtonIconInfo} with the given icons.
096             * 
097             * @param icon The main default icon. May be null.
098             * @param selectedIcon The icon to be displayed when the command button is
099             * in a selected state.
100             * @param rolloverIcon The icon to be displayed when the mouse pointer rolls
101             * over the command button. May be null.
102             */
103            public CommandButtonIconInfo(Icon icon, Icon selectedIcon, Icon rolloverIcon) {
104                    this.icon = icon;
105                    this.selectedIcon = selectedIcon;
106                    this.rolloverIcon = rolloverIcon;
107            }
108    
109            /**
110             * Creates a new {@code CommandButtonIconInfo} with the given icons.
111             * 
112             * @param icon The main default icon. May be null.
113             * @param selectedIcon The icon to be displayed when the command button is
114             * in a selected state.
115             * @param rolloverIcon The icon to be displayed when the mouse pointer rolls
116             * over the command button. May be null.
117             * @param disabledIcon The icon to be displayed when the command button is
118             * in a disabled state. May be null.
119             * @param pressedIcon The icon to be displayed when the command button is in
120             * a pressed state. May be null.
121             */
122            public CommandButtonIconInfo(Icon icon, Icon selectedIcon, Icon rolloverIcon, Icon disabledIcon, Icon pressedIcon) {
123                    this.icon = icon;
124                    this.selectedIcon = selectedIcon;
125                    this.rolloverIcon = rolloverIcon;
126                    this.disabledIcon = disabledIcon;
127                    this.pressedIcon = pressedIcon;
128            }
129    
130            /**
131             * Configures the given command button with the icon values from this
132             * instance.
133             * 
134             * @param button The button to be configured with icons. Must not be null.
135             * 
136             * @throws IllegalArgumentException if {@code button} is null.
137             */
138            public AbstractButton configure(AbstractButton button) {
139                    Assert.notNull(button, "The button to configure is required");
140    
141                    button.setIcon(icon);
142                    button.setSelectedIcon(selectedIcon);
143                    button.setDisabledIcon(disabledIcon);
144                    button.setPressedIcon(pressedIcon);
145                    button.setRolloverIcon(rolloverIcon);
146    
147                    return button;
148            }
149    
150            /**
151             * Returns the image from the main default icon of this instance if it is
152             * actually an instance of an {@link ImageIcon}.
153             * 
154             * @return The image from the main default icon, or null if there is no
155             * default icon or it is not an {@link ImageIcon}.
156             */
157            public Image getImage() {
158                    if (getIcon() instanceof ImageIcon) {
159                            return ((ImageIcon) getIcon()).getImage();
160                    }
161    
162                    return null;
163            }
164    
165            /**
166             * {@inheritDoc}
167             */
168            public Icon getIcon() {
169                    return icon;
170            }
171    
172            /**
173             * Returns the icon to be displayed when the command button is in a disabled
174             * state.
175             * 
176             * @return The icon for the command button in disabled state, or null.
177             */
178            public Icon getDisabledIcon() {
179                    return disabledIcon;
180            }
181    
182            /**
183             * Returns the icon to be displayed when the command button is in a pressed
184             * state.
185             * 
186             * @return The icon for the command button in pressed state, or null.
187             */
188            public Icon getPressedIcon() {
189                    return pressedIcon;
190            }
191    
192            /**
193             * Returns the icon to be displayed when the mouse pointer rolls over the
194             * command button.
195             * 
196             * @return The icon for the command button when rolled over by the mouse
197             * pointer, or null.
198             */
199            public Icon getRolloverIcon() {
200                    return rolloverIcon;
201            }
202    
203            /**
204             * Returns the icon to be displayed when the command button is in a selected
205             * state.
206             * 
207             * @return The icon for the command button in selected state, or null.
208             */
209            public Icon getSelectedIcon() {
210                    return selectedIcon;
211            }
212    
213            /**
214             * Sets the main default icon for the command button.
215             * 
216             * @param icon The main default icon for the command button. May be null.
217             */
218            public void setIcon(Icon icon) {
219                    this.icon = icon;
220            }
221    
222            /**
223             * Sets the icon to be displayed when the command button is in a disabled
224             * state.
225             * 
226             * @param disabledIcon The icon for the button in a disabled state. May be
227             * null.
228             */
229            public void setDisabledIcon(Icon disabledIcon) {
230                    this.disabledIcon = disabledIcon;
231            }
232    
233            /**
234             * Sets the icon to be displayed when the command button is in a pressed
235             * state.
236             * 
237             * @param pressedIcon The icon for the button in a pressed state. May be
238             * null.
239             */
240            public void setPressedIcon(Icon pressedIcon) {
241                    this.pressedIcon = pressedIcon;
242            }
243    
244            /**
245             * Sets the icon to be displayed when the mouse pointer rolls over the
246             * command button.
247             * 
248             * @param rolloverIcon The icon for the button in a rolled over. May be
249             * null.
250             */
251            public void setRolloverIcon(Icon rolloverIcon) {
252                    this.rolloverIcon = rolloverIcon;
253            }
254    
255            /**
256             * Sets the icon to be displayed when the command button is in a pressed
257             * state.
258             * 
259             * @param selectedIcon The icon for the button in a pressed state. May be
260             * null.
261             */
262            public void setSelectedIcon(Icon selectedIcon) {
263                    this.selectedIcon = selectedIcon;
264            }
265    
266            /**
267             * {@inheritDoc}
268             */
269            public String toString() {
270                    return new ToStringCreator(this).toString();
271            }
272    
273            /**
274             * {@inheritDoc}
275             */
276            public boolean equals(Object o) {
277                    if (!(o instanceof CommandButtonIconInfo)) {
278                            return false;
279                    }
280                    CommandButtonIconInfo other = (CommandButtonIconInfo) o;
281                    return ObjectUtils.nullSafeEquals(icon, other.icon)
282                                    && ObjectUtils.nullSafeEquals(disabledIcon, other.disabledIcon)
283                                    && ObjectUtils.nullSafeEquals(pressedIcon, other.pressedIcon)
284                                    && ObjectUtils.nullSafeEquals(rolloverIcon, other.rolloverIcon)
285                                    && ObjectUtils.nullSafeEquals(selectedIcon, other.selectedIcon);
286            }
287    
288            /**
289             * {@inheritDoc}
290             */
291            public int hashCode() {
292                    int hash = 1;
293                    hash = hash * 31 + (icon == null ? 0 : icon.hashCode());
294                    hash = hash * 31 + (disabledIcon == null ? 0 : disabledIcon.hashCode());
295                    hash = hash * 31 + (pressedIcon == null ? 0 : pressedIcon.hashCode());
296                    hash = hash * 31 + (rolloverIcon == null ? 0 : rolloverIcon.hashCode());
297                    hash = hash * 31 + (selectedIcon == null ? 0 : selectedIcon.hashCode());
298                    return hash;
299            }
300    
301    }