1 /*
2 * Copyright (c) 2003-2008 by Cosylab d. d.
3 *
4 * This file is part of CosyBeans-Common.
5 *
6 * CosyBeans-Common is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * CosyBeans-Common is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with CosyBeans-Common. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 package com.cosylab.gui.components.util;
21
22 import java.awt.event.ActionEvent;
23
24 import javax.swing.AbstractAction;
25 import javax.swing.Icon;
26
27 import com.cosylab.util.Debug;
28
29
30 /**
31 * An extension of the <code>javax.swing.Action</code> interface which provides
32 * <code>selected</code> bound property. It can be used to specify an action
33 * which switches between two different states. GUI components will render
34 * these actions with check boxes or toggle buttons.
35 *
36 * <p>
37 * To use this action, either instantiate this class and register as a
38 * propertyChangeListener, responding to events that denote a change in
39 * "selected" property, or extend this class, overriding actionPerformed()
40 * method.
41 * </p>
42 *
43 * @author <a href="mailto:miha.kadunc@cosylab.com">Miha Kadunc</a>
44 * @version $id$
45 */
46 public class ToggleAction extends AbstractAction {
47
48 private static final long serialVersionUID = 1L;
49 /** Icon used when the action is selected */
50 public static final String SMALL_SELECTED_ICON = "SmallSelectedIcon";
51 /** Large icon used when the action is selected */
52 public static final String LARGE_SELECTED_ICON = "LargeSelectedIcon";
53 private boolean selected = false;
54 private boolean internal = false;
55
56 /**
57 * Constructor with default values.
58 */
59 public ToggleAction() {
60 super();
61 }
62
63 /**
64 * Constructor with name.
65 *
66 * @param name the name of the action
67 */
68 public ToggleAction(String name) {
69 super(name);
70 }
71
72 /**
73 * Constructor with name and selection flag.
74 *
75 * @param name the name of the action
76 * @param selected the selection flag
77 */
78 public ToggleAction(String name, boolean selected) {
79 super(name);
80 this.selected = selected;
81 }
82
83 /**
84 * Contructor with name and icon.
85 *
86 * @param name
87 * @param icon
88 */
89 public ToggleAction(String name, Icon icon) {
90 super(name, icon);
91 }
92
93 /**
94 * Contructor with name, icon and selection flag.
95 *
96 * @param name the name of action
97 * @param icon the icon to be used GUI element
98 * @param selected the selection flag
99 */
100 public ToggleAction(String name, Icon icon, boolean selected) {
101 super(name, icon);
102 this.selected = selected;
103 }
104
105 /**
106 * Sets the <code>selected</code> property. Fires propertyChange events and
107 * calls actionPerformed() method with <code>this</code> as event source.
108 *
109 * @param selected
110 */
111 public void setSelected(boolean selected) {
112 if (this.selected != selected) {
113 if (!internal) {
114 actionPerformed(new ActionEvent(this, selected ? 1 : 0,
115 "selection_changed"));
116 } else {
117 internal = false;
118 this.selected = selected;
119 selectionChanged(selected);
120 firePropertyChange("selected", new Boolean(!selected),
121 new Boolean(selected));
122 }
123 }
124 }
125
126 /**
127 * @return whether this toggle action is selected.
128 */
129 public boolean isSelected() {
130 return selected;
131 }
132
133 /**
134 * Overriden to modify selection status. Called by the GUI when invoked.
135 */
136 public void actionPerformed(ActionEvent e) {
137 internal = true;
138 setSelected(!selected);
139 }
140
141 /**
142 * Override this method to provide custom event handling when selection
143 * changes.
144 *
145 * @param newSelected
146 */
147 protected void selectionChanged(boolean selected) {
148 Debug.out(""+selected);
149 }
150 }
151
152
153 /* __oOo__ */