source: josm/trunk/src/org/openstreetmap/josm/gui/IconToggleButton.java@ 6070

Last change on this file since 6070 was 5926, checked in by bastiK, 11 years ago

clean up imports

  • Property svn:eol-style set to native
File size: 5.3 KB
Line 
1// License: GPL. Copyright 2007 by Immanuel Scholz and others
2package org.openstreetmap.josm.gui;
3
4import java.awt.event.MouseAdapter;
5import java.awt.event.MouseEvent;
6import java.beans.PropertyChangeEvent;
7import java.beans.PropertyChangeListener;
8
9import javax.swing.Action;
10import javax.swing.Icon;
11import javax.swing.JToggleButton;
12
13import org.openstreetmap.josm.Main;
14import org.openstreetmap.josm.actions.ExpertToggleAction;
15import org.openstreetmap.josm.actions.ExpertToggleAction.ExpertModeChangeListener;
16import org.openstreetmap.josm.tools.Destroyable;
17
18/**
19 * Just a toggle button, with smaller border and icon only to display in
20 * MapFrame toolbars.
21 * Also provides methods for storing hidden state in preferences
22 * @author imi, akks
23 */
24public class IconToggleButton extends JToggleButton implements HideableButton, PropertyChangeListener, Destroyable, ExpertModeChangeListener {
25
26 public boolean groupbutton;
27 private ShowHideButtonListener listener;
28 private boolean hideIfDisabled = false;
29 private boolean isExpert;
30
31 /**
32 * Construct the toggle button with the given action.
33 */
34 public IconToggleButton(Action action) {
35 this(action, false);
36 }
37
38 /**
39 * Construct the toggle button with the given action.
40 */
41 public IconToggleButton(Action action, boolean isExpert) {
42 super(action);
43 this.isExpert = isExpert;
44 setText(null);
45
46 Object o = action.getValue(Action.SHORT_DESCRIPTION);
47 if (o != null) {
48 setToolTipText(o.toString());
49 }
50
51 action.addPropertyChangeListener(this);
52
53 addMouseListener(new MouseAdapter(){
54 @Override public void mousePressed(MouseEvent e) {
55 groupbutton = e.getX() > getWidth()/2 && e.getY() > getHeight()/2;
56 }
57 });
58
59 ExpertToggleAction.addExpertModeChangeListener(this);
60 }
61
62 public void propertyChange(PropertyChangeEvent evt) {
63 if (evt.getPropertyName().equals("active")) {
64 setSelected((Boolean)evt.getNewValue());
65 requestFocusInWindow();
66 } else if (evt.getPropertyName().equals("selected")) {
67 setSelected((Boolean)evt.getNewValue());
68 }
69 }
70
71 public void destroy() {
72 Action action = getAction();
73 if (action instanceof Destroyable) {
74 ((Destroyable) action).destroy();
75 }
76 if (action != null) {
77 action.removePropertyChangeListener(this);
78 }
79 }
80
81 String getPreferenceKey() {
82 String s = (String) getSafeActionValue("toolbar");
83 if (s == null) {
84 if (getAction()!=null) {
85 s = getAction().getClass().getName();
86 }
87 }
88 return "sidetoolbar.hidden."+s;
89
90 }
91
92 @Override
93 public void expertChanged(boolean isExpert) {
94 applyButtonHiddenPreferences();
95 }
96
97 @Override
98 public void applyButtonHiddenPreferences() {
99 boolean alwaysHideDisabled = Main.pref.getBoolean("sidetoolbar.hideDisabledButtons", false);
100 if (!isEnabled() && (hideIfDisabled || alwaysHideDisabled)) {
101 setVisible(false); // hide because of disabled button
102 } else {
103 boolean hiddenFlag = false;
104 String hiddenFlagStr = Main.pref.get(getPreferenceKey(), null);
105 if (hiddenFlagStr == null) {
106 if (isExpert && !ExpertToggleAction.isExpert()) {
107 hiddenFlag = true;
108 }
109 } else {
110 hiddenFlag = Boolean.parseBoolean(hiddenFlagStr);
111 }
112 setVisible( !hiddenFlag ); // show or hide, do what preferences say
113 }
114 }
115
116 @Override
117 public void setButtonHidden(boolean b) {
118 setVisible(!b);
119 if (listener!=null) { // if someone wants to know about changes of visibility
120 if (!b) listener.buttonShown(); else listener.buttonHidden();
121 }
122 if ((b && isExpert && !ExpertToggleAction.isExpert()) ||
123 (!b && isExpert && ExpertToggleAction.isExpert())) {
124 Main.pref.put(getPreferenceKey(), null);
125 } else {
126 Main.pref.put(getPreferenceKey(), b);
127 }
128 }
129
130 /*
131 * This fuction should be called for plugins that want to enable auto-hiding
132 * custom buttons when they are disabled (because of incorrect layer, for example)
133 */
134 public void setAutoHideDisabledButton(boolean b) {
135 hideIfDisabled = b;
136 if (b && !isEnabled()) {
137 setVisible(false);
138 }
139 }
140
141 @Override
142 public void showButton() {
143 setButtonHidden(false);
144 }
145
146 @Override
147 public void hideButton() {
148 setButtonHidden(true);
149 }
150
151 @Override
152 public String getActionName() {
153 return (String) getSafeActionValue(Action.NAME);
154 }
155
156 @Override
157 public Icon getIcon() {
158 return (Icon) getSafeActionValue(Action.SMALL_ICON);
159 }
160
161 @Override
162 public boolean isButtonVisible() {
163 return isVisible();
164 }
165
166 @Override
167 public void setShowHideButtonListener(ShowHideButtonListener l) {
168 listener = l;
169 }
170
171 protected final Object getSafeActionValue(String key) {
172 // Mac OS X Aqua L&F can call accessors from constructor, so getAction() can be null in those cases
173 return getAction() != null ? getAction().getValue(key) : null;
174 }
175}
Note: See TracBrowser for help on using the repository browser.