1+ /* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */
2+
3+ /*
4+ Part of the Processing project - http://processing.org
5+ Copyright (c) 2015 The Processing Foundation
6+
7+ This program is free software; you can redistribute it and/or modify
8+ it under the terms of the GNU General Public License version 2
9+ as published by the Free Software Foundation.
10+
11+ This program 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 this program; if not, write to the Free Software Foundation, Inc.
18+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19+ */
20+
21+ package processing .app ;
22+
23+ import java .awt .*;
24+ import java .awt .event .*;
25+
26+ import javax .swing .*;
27+
28+
29+ abstract public class EditorButton extends JComponent
30+ implements MouseListener , MouseMotionListener , ActionListener {
31+ static public final int DIM = 46 ;
32+
33+ /** Button's description. */
34+ String title ;
35+ /** Description of alternate behavior when shift is down. */
36+ String titleShift ;
37+
38+ boolean pressed ;
39+ boolean selected ;
40+ boolean rollover ;
41+ JLabel rolloverLabel ;
42+ boolean shift ;
43+
44+ // boolean enabled;
45+ // State state;
46+ // Map<State, Image> imageMap = new HashMap<>();
47+
48+ Image enabledImage ;
49+ Image disabledImage ;
50+ Image selectedImage ;
51+ Image rolloverImage ;
52+ Image pressedImage ;
53+
54+
55+ public EditorButton (Mode mode , String name , String title ) {
56+ this (mode , name , title , title );
57+ }
58+
59+
60+ public EditorButton (Mode mode , String name , String title , String titleShift ) {
61+ this .title = title ;
62+ this .titleShift = titleShift ;
63+
64+ final int res = Toolkit .highResDisplay () ? 2 : 1 ;
65+
66+ disabledImage = mode .loadImage (name + "-enabled-" + res + "x.png" );
67+ enabledImage = mode .loadImage (name + "-enabled-" + res + "x.png" );
68+ selectedImage = mode .loadImage (name + "-enabled-" + res + "x.png" );
69+ pressedImage = mode .loadImage (name + "-enabled-" + res + "x.png" );
70+ rolloverImage = mode .loadImage (name + "-enabled-" + res + "x.png" );
71+
72+ if (disabledImage == null ) {
73+ disabledImage = enabledImage ;
74+ }
75+ if (selectedImage == null ) {
76+ selectedImage = enabledImage ;
77+ }
78+ if (pressedImage == null ) {
79+ pressedImage = enabledImage ; // could be selected image
80+ }
81+ if (rolloverImage == null ) {
82+ rolloverImage = enabledImage ; // could be pressed image
83+ }
84+ }
85+
86+
87+ @ Override
88+ public void paintComponent (Graphics g ) {
89+ Image image = enabledImage ;
90+ if (!isEnabled ()) {
91+ image = disabledImage ;
92+ } else if (selected ) {
93+ image = selectedImage ;
94+ } else if (pressed ) {
95+ image = pressedImage ;
96+ } else if (rollover ) {
97+ image = rolloverImage ;
98+ }
99+ g .drawImage (image , 0 , 0 , DIM , DIM , this );
100+ }
101+
102+
103+ // public String toString() {
104+ // switch (this) {
105+ // case DISABLED: return "disabled";
106+ // case ENABLED: return "enabled";
107+ // case SELECTED: return "selected";
108+ // case ROLLOVER: return "rollover";
109+ // case PRESSED: return "pressed";
110+ //
111+ //// for (State bs : State.values()) {
112+ //// Image image = mode.loadImage(bs.getFilename(name));
113+ //// if (image != null) {
114+ //// imageMap.put(bs, image);
115+ //// }
116+ //// }
117+ ////
118+ //// enabled = true;
119+ //// //updateState();
120+ //// setState(State.ENABLED);
121+ // }
122+
123+
124+ public void setRolloverLabel (JLabel label ) {
125+ rolloverLabel = label ;
126+ }
127+
128+
129+ @ Override
130+ public void mouseClicked (MouseEvent e ) {
131+ if (isEnabled ()) {
132+ shift = e .isShiftDown ();
133+ actionPerformed (new ActionEvent (this , ActionEvent .ACTION_PERFORMED ,
134+ null , e .getModifiers ()));
135+ }
136+ }
137+
138+
139+ public boolean isShiftDown () {
140+ return shift ;
141+ }
142+
143+
144+ @ Override
145+ public void mousePressed (MouseEvent e ) {
146+ if (isEnabled ()) {
147+ pressed = true ;
148+ repaint ();
149+ }
150+ }
151+
152+
153+ @ Override
154+ public void mouseReleased (MouseEvent e ) {
155+ if (isEnabled ()) {
156+ pressed = false ;
157+ repaint ();
158+ }
159+ }
160+
161+
162+ @ Override
163+ public void mouseEntered (MouseEvent e ) {
164+ rollover = true ;
165+ if (rolloverLabel != null ) {
166+ rolloverLabel .setText (e .isShiftDown () ? titleShift : title );
167+ }
168+ repaint ();
169+ }
170+
171+
172+ @ Override
173+ public void mouseExited (MouseEvent e ) {
174+ rollover = false ;
175+ if (rolloverLabel != null ) {
176+ rolloverLabel .setText ("" );
177+ }
178+ repaint ();
179+ }
180+
181+
182+ @ Override
183+ public void mouseDragged (MouseEvent e ) { }
184+
185+
186+ @ Override
187+ public void mouseMoved (MouseEvent e ) { }
188+
189+
190+ abstract public void actionPerformed (ActionEvent e );
191+
192+ // @Override
193+ // public void actionPerformed(ActionEvent e) {
194+ // // To be overridden by all subclasses
195+ // }
196+
197+
198+ @ Override
199+ public Dimension getPreferredSize () {
200+ return new Dimension (DIM , DIM );
201+ }
202+
203+
204+ @ Override
205+ public Dimension getMinimumSize () {
206+ return getPreferredSize ();
207+ }
208+
209+
210+ @ Override
211+ public Dimension getMaximumSize () {
212+ return getPreferredSize ();
213+ }
214+
215+
216+ // public Image getImage() {
217+ // return imageMap.get(state);
218+ // }
219+ //
220+ //
221+ //// protected void updateState() {
222+ //// state = ButtonState.ENABLED;
223+ //// }
224+ //
225+ //
226+ // public void setEnabled(boolean enabled) {
227+ // this.enabled = enabled;
228+ // if (enabled) {
229+ // if (state == State.DISABLED) {
230+ // setState(State.ENABLED);
231+ // }
232+ // } else {
233+ // if (state == State.ENABLED) {
234+ // setState(State.DISABLED);
235+ // }
236+ // }
237+ // }
238+ //
239+ //
240+ // public void setState(State state) {
241+ // this.state = state;
242+ // }
243+
244+
245+ // public enum State {
246+ // DISABLED, ENABLED, SELECTED, ROLLOVER, PRESSED;
247+ //
248+ // /**
249+ // * @param name the root name
250+ // * @return
251+ // */
252+ // public String getFilename(String name) {
253+ // final int res = Toolkit.highResDisplay() ? 2 : 1;
254+ // return name + "-" + toString() + "-" + res + "x.png";
255+ // }
256+ //
257+ // public String toString() {
258+ // switch (this) {
259+ // case DISABLED: return "disabled";
260+ // case ENABLED: return "enabled";
261+ // case SELECTED: return "selected";
262+ // case ROLLOVER: return "rollover";
263+ // case PRESSED: return "pressed";
264+ // }
265+ // return null;
266+ // }
267+ // }
268+ }
0 commit comments