1 |
iliev |
1785 |
/* |
2 |
|
|
* JSampler - a java front-end for LinuxSampler |
3 |
|
|
* |
4 |
|
|
* Copyright (C) 2005-2008 Grigor Iliev <grigor@grigoriliev.com> |
5 |
|
|
* |
6 |
|
|
* This file is part of JSampler. |
7 |
|
|
* |
8 |
|
|
* JSampler is free software; you can redistribute it and/or modify |
9 |
|
|
* it under the terms of the GNU General Public License version 2 |
10 |
|
|
* as published by the Free Software Foundation. |
11 |
|
|
* |
12 |
|
|
* JSampler is distributed in the hope that it will be useful, |
13 |
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 |
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 |
|
|
* GNU General Public License for more details. |
16 |
|
|
* |
17 |
|
|
* You should have received a copy of the GNU General Public License |
18 |
|
|
* along with JSampler; if not, write to the Free Software |
19 |
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
20 |
|
|
* MA 02111-1307 USA |
21 |
|
|
*/ |
22 |
|
|
|
23 |
|
|
package org.jsampler.view.fantasia.basic; |
24 |
|
|
|
25 |
|
|
import java.awt.AlphaComposite; |
26 |
|
|
import java.awt.Color; |
27 |
|
|
import java.awt.Dimension; |
28 |
|
|
import java.awt.GradientPaint; |
29 |
|
|
import java.awt.Graphics; |
30 |
|
|
import java.awt.Graphics2D; |
31 |
|
|
import java.awt.RenderingHints; |
32 |
|
|
|
33 |
|
|
import java.awt.event.MouseEvent; |
34 |
|
|
|
35 |
|
|
import java.awt.geom.Arc2D; |
36 |
|
|
import java.awt.geom.Line2D; |
37 |
|
|
import java.awt.geom.Rectangle2D; |
38 |
|
|
import java.awt.geom.RoundRectangle2D; |
39 |
|
|
|
40 |
|
|
import javax.swing.ButtonModel; |
41 |
|
|
import javax.swing.DefaultButtonModel; |
42 |
|
|
import javax.swing.JSlider; |
43 |
|
|
|
44 |
|
|
import javax.swing.event.ChangeEvent; |
45 |
|
|
import javax.swing.event.ChangeListener; |
46 |
|
|
|
47 |
|
|
import javax.swing.plaf.basic.BasicSliderUI; |
48 |
|
|
|
49 |
|
|
import org.jvnet.substance.utils.RolloverControlListener; |
50 |
|
|
import org.jvnet.substance.utils.Trackable; |
51 |
|
|
|
52 |
|
|
/** |
53 |
|
|
* |
54 |
|
|
* @author Grigor Iliev |
55 |
|
|
*/ |
56 |
|
|
public class FantasiaFaderUI extends BasicSliderUI implements Trackable { |
57 |
|
|
private ButtonModel knobModel = new DefaultButtonModel(); |
58 |
|
|
private RolloverControlListener rolloverListener = |
59 |
|
|
new RolloverControlListener(this, knobModel); |
60 |
|
|
|
61 |
|
|
public |
62 |
|
|
FantasiaFaderUI(JSlider slider) { |
63 |
|
|
super(slider); |
64 |
|
|
slider.setOpaque(false); |
65 |
|
|
} |
66 |
|
|
|
67 |
|
|
@Override |
68 |
|
|
protected void |
69 |
|
|
installListeners(JSlider slider) { |
70 |
|
|
super.installListeners(slider); |
71 |
|
|
|
72 |
|
|
rolloverListener = new RolloverControlListener(this, knobModel); |
73 |
|
|
slider.addMouseListener(rolloverListener); |
74 |
|
|
slider.addMouseMotionListener(rolloverListener); |
75 |
|
|
|
76 |
|
|
knobModel.addChangeListener(getHandler()); |
77 |
|
|
} |
78 |
|
|
|
79 |
|
|
@Override |
80 |
|
|
protected void |
81 |
|
|
uninstallListeners(JSlider slider) { |
82 |
|
|
super.uninstallListeners(slider); |
83 |
|
|
slider.removeMouseListener(rolloverListener); |
84 |
|
|
slider.removeMouseMotionListener(rolloverListener); |
85 |
|
|
rolloverListener = null; |
86 |
|
|
|
87 |
|
|
knobModel.removeChangeListener(getHandler()); |
88 |
|
|
} |
89 |
|
|
|
90 |
|
|
@Override |
91 |
|
|
public void |
92 |
|
|
paintTrack(Graphics g) { |
93 |
|
|
Graphics2D g2 = (Graphics2D)g; |
94 |
|
|
|
95 |
|
|
if(slider.getOrientation() == JSlider.HORIZONTAL) { |
96 |
|
|
int cy = (trackRect.height / 2) - 3; |
97 |
|
|
int cw = trackRect.width; |
98 |
|
|
|
99 |
|
|
g.translate(trackRect.x, trackRect.y + cy); |
100 |
|
|
|
101 |
|
|
Rectangle2D.Double rect = new Rectangle2D.Double(0, 0, cw - 1, 3); |
102 |
|
|
g2.setPaint(new Color(0x4b4b4b)); |
103 |
|
|
g2.fill(rect); |
104 |
|
|
|
105 |
|
|
FantasiaPainter.paintBoldInnerBorder(g2, 0, 0, cw - 1, 3); |
106 |
|
|
|
107 |
|
|
g.translate(-trackRect.x, -(trackRect.y + cy)); |
108 |
|
|
|
109 |
|
|
|
110 |
|
|
} else { |
111 |
|
|
int cx = (trackRect.width / 2) - 2; |
112 |
|
|
int ch = trackRect.height; |
113 |
|
|
|
114 |
|
|
g.translate(trackRect.x + cx, trackRect.y); |
115 |
|
|
|
116 |
|
|
Rectangle2D.Double rect = new Rectangle2D.Double(0, 0, 3, ch - 1); |
117 |
|
|
g2.setPaint(new Color(0x4b4b4b)); |
118 |
|
|
g2.fill(rect); |
119 |
|
|
|
120 |
|
|
FantasiaPainter.paintBoldInnerBorder(g2, 0, 0, 3, ch - 1); |
121 |
|
|
|
122 |
|
|
g.translate(-(trackRect.x + cx), -trackRect.y); |
123 |
|
|
|
124 |
|
|
|
125 |
|
|
} |
126 |
|
|
|
127 |
|
|
} |
128 |
|
|
|
129 |
|
|
Color c1 = new Color(0x888888); |
130 |
|
|
Color c2 = new Color(0x555555); |
131 |
|
|
Color c3 = new Color(0xf5f5f5); |
132 |
|
|
Color c4 = new Color(0.0f, 0.0f, 0.0f, 0.10f); |
133 |
|
|
Color c6 = new Color(0.0f, 0.0f, 0.0f, 0.50f); |
134 |
|
|
Color c8 = new Color(0.0f, 0.0f, 0.0f, 0.78f); |
135 |
|
|
|
136 |
|
|
Color c12 = new Color(1.0f, 1.0f, 1.0f, 0.02f); |
137 |
|
|
Color c14 = new Color(1.0f, 1.0f, 1.0f, 0.22f); |
138 |
|
|
Color c16 = new Color(1.0f, 1.0f, 1.0f, 0.50f); |
139 |
|
|
Color c18 = new Color(1.0f, 1.0f, 1.0f, 0.78f); |
140 |
|
|
|
141 |
|
|
public void |
142 |
|
|
paintHorizontalLine(Graphics2D g2, double cy, double x1, double x2, Color c) { |
143 |
|
|
float r = c.getRed(); |
144 |
|
|
r /= 255; |
145 |
|
|
float g = c.getGreen(); |
146 |
|
|
g /= 255; |
147 |
|
|
float b = c.getBlue(); |
148 |
|
|
b /= 255; |
149 |
|
|
|
150 |
|
|
GradientPaint gr = new GradientPaint ( |
151 |
|
|
(float)x1, (float)cy, new Color(r, g, b, 0.40f), |
152 |
|
|
(float)x1 + 3, (float)cy, c |
153 |
|
|
); |
154 |
|
|
|
155 |
|
|
Line2D.Double l; |
156 |
|
|
l = new Line2D.Double(x1, cy, x1 + 3, cy); |
157 |
|
|
|
158 |
|
|
g2.setPaint(gr); |
159 |
|
|
g2.draw(l); |
160 |
|
|
|
161 |
|
|
g2.setPaint(c); |
162 |
|
|
l = new Line2D.Double(x1 + 4, cy, x2 - 5, cy); |
163 |
|
|
g2.draw(l); |
164 |
|
|
|
165 |
|
|
gr = new GradientPaint ( |
166 |
|
|
(float)x2 - 4, (float)cy, c, |
167 |
|
|
(float)x2, (float)cy, new Color(r, g, b, 0.10f) |
168 |
|
|
); |
169 |
|
|
|
170 |
|
|
l = new Line2D.Double(x2 - 4, cy, x2, cy); |
171 |
|
|
g2.setPaint(gr); |
172 |
|
|
g2.draw(l); |
173 |
|
|
} |
174 |
|
|
|
175 |
|
|
public void |
176 |
|
|
paintVerticalLine(Graphics2D g2, double cx, double y1, double y2, Color c) { |
177 |
|
|
float r = c.getRed(); |
178 |
|
|
r /= 255; |
179 |
|
|
float g = c.getGreen(); |
180 |
|
|
g /= 255; |
181 |
|
|
float b = c.getBlue(); |
182 |
|
|
b /= 255; |
183 |
|
|
|
184 |
|
|
GradientPaint gr = new GradientPaint ( |
185 |
|
|
(float)cx, (float)y1, new Color(r, g, b, 0.40f), |
186 |
|
|
(float)cx, (float)y1 + 3, c |
187 |
|
|
); |
188 |
|
|
|
189 |
|
|
Line2D.Double l = new Line2D.Double(cx, y1, cx, y1 + 3); |
190 |
|
|
g2.setPaint(gr); |
191 |
|
|
g2.draw(l); |
192 |
|
|
|
193 |
|
|
g2.setPaint(c); |
194 |
|
|
l = new Line2D.Double(cx, y1 + 4, cx, y2 - 7); |
195 |
|
|
g2.draw(l); |
196 |
|
|
|
197 |
|
|
gr = new GradientPaint ( |
198 |
|
|
(float)cx, (float)y2 - 6, c, |
199 |
|
|
(float)cx, (float)y2, new Color(r, g, b, 0.00f) |
200 |
|
|
); |
201 |
|
|
|
202 |
|
|
l = new Line2D.Double(cx, y2 - 6, cx, y2); |
203 |
|
|
g2.setPaint(gr); |
204 |
|
|
g2.draw(l); |
205 |
|
|
} |
206 |
|
|
|
207 |
|
|
@Override |
208 |
|
|
public void |
209 |
|
|
paintThumb(Graphics g) { |
210 |
|
|
Graphics2D g2 = (Graphics2D)g; |
211 |
|
|
|
212 |
|
|
g2.setRenderingHint ( |
213 |
|
|
RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON |
214 |
|
|
); |
215 |
|
|
|
216 |
|
|
double h = thumbRect.getHeight(); |
217 |
|
|
double w = thumbRect.getWidth(); |
218 |
|
|
|
219 |
|
|
double x1 = thumbRect.x + 2; |
220 |
|
|
double y1 = thumbRect.y + 1; |
221 |
|
|
double x2 = thumbRect.x + w - 3; |
222 |
|
|
double y2 = thumbRect.y + h - 5; |
223 |
|
|
|
224 |
|
|
// body |
225 |
|
|
|
226 |
|
|
RoundRectangle2D.Double rect = new RoundRectangle2D.Double ( |
227 |
|
|
x1, y1, x2 - x1 + 1, y2 - y1 + 1, 8, 8 |
228 |
|
|
); |
229 |
|
|
|
230 |
|
|
Color color = knobModel.isRollover() ? new Color(0x999999) : c1; |
231 |
|
|
if(knobModel.isPressed()) color = new Color(0x777777); |
232 |
|
|
GradientPaint gr = new GradientPaint ( |
233 |
|
|
(float)x1, (float)y1, color, |
234 |
|
|
(float)x1, (float)y2, c2 |
235 |
|
|
); |
236 |
|
|
|
237 |
|
|
g2.setPaint(gr); |
238 |
|
|
g2.fill(rect); |
239 |
|
|
|
240 |
|
|
//border |
241 |
|
|
AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.50f); |
242 |
|
|
g2.setComposite(ac); |
243 |
|
|
g2.setPaint(Color.BLACK); |
244 |
|
|
|
245 |
|
|
rect = new RoundRectangle2D.Double ( |
246 |
|
|
x1 - 1, y1 - 1, x2 - x1 + 2, y2 - y1 + 1, 6, 6 |
247 |
|
|
); |
248 |
|
|
g2.draw(rect); |
249 |
|
|
|
250 |
|
|
g2.setComposite(ac.derive(1.0f)); |
251 |
|
|
gr = new GradientPaint ( |
252 |
|
|
(float)x1, (float)y1 + 1, c14, (float)x1, (float)y1 + 3, c12 |
253 |
|
|
); |
254 |
|
|
|
255 |
|
|
g2.setPaint(gr); |
256 |
|
|
|
257 |
|
|
Arc2D.Double arc = new Arc2D.Double(x1, y1, x2 - x1, 4, 0, 180, Arc2D.OPEN); |
258 |
|
|
//g2.setPaint(Color.WHITE); |
259 |
|
|
g2.draw(arc); |
260 |
|
|
/////// |
261 |
|
|
|
262 |
|
|
|
263 |
|
|
// Shadow down |
264 |
|
|
gr = new GradientPaint ( |
265 |
|
|
(float)x1, (float)y2 - 4, c6, (float)x1, (float)y2 + 4, c4 |
266 |
|
|
); |
267 |
|
|
|
268 |
|
|
g2.setPaint(gr); |
269 |
|
|
|
270 |
|
|
g2.setComposite(ac.derive(0.70f)); |
271 |
|
|
arc = new Arc2D.Double(x1 - 1, y2 - 4, x2 - x1 + 3, 7, 180, 180, Arc2D.PIE); |
272 |
|
|
g2.fill(arc); |
273 |
|
|
|
274 |
|
|
g2.setPaint(Color.BLACK); |
275 |
|
|
g2.setComposite(ac.derive(0.07f)); |
276 |
|
|
arc = new Arc2D.Double(x1 - 1, y2 - 3, x2 - x1 + 2, 5, 180, 180, Arc2D.OPEN); |
277 |
|
|
g2.draw(arc); |
278 |
|
|
|
279 |
|
|
g2.setPaint(Color.BLACK); |
280 |
|
|
g2.setComposite(ac.derive(0.20f)); |
281 |
|
|
Line2D.Double l = new Line2D.Double(x1 + 3, y2 + 1, x2 - 3, y2 + 1); |
282 |
|
|
g2.draw(l); // right |
283 |
|
|
/////// |
284 |
|
|
|
285 |
|
|
|
286 |
|
|
|
287 |
|
|
g2.setPaint(c3); |
288 |
|
|
g2.setComposite(ac.derive(0.06f)); |
289 |
|
|
l = new Line2D.Double(x1 + 6, y1 - 1, x1 + 8, y1 - 1); |
290 |
|
|
g2.draw(l); |
291 |
|
|
|
292 |
|
|
|
293 |
|
|
|
294 |
|
|
if(slider.getOrientation() == JSlider.HORIZONTAL) { |
295 |
|
|
double cx = (int)thumbRect.x + w / 2; |
296 |
|
|
|
297 |
|
|
// center line |
298 |
|
|
g2.setComposite(ac.derive(1.0f)); |
299 |
|
|
paintVerticalLine(g2, cx, y1, y2, c3); |
300 |
|
|
|
301 |
|
|
// center down line |
302 |
|
|
g2.setComposite(ac.derive(0.30f)); |
303 |
|
|
paintVerticalLine(g2, cx - 1, y1, y2, Color.BLACK); |
304 |
|
|
/// |
305 |
|
|
|
306 |
|
|
// center up line |
307 |
|
|
g2.setPaint(Color.WHITE); |
308 |
|
|
g2.setComposite(ac.derive(0.10f)); |
309 |
|
|
paintVerticalLine(g2, cx + 1, y1, y2, Color.WHITE); |
310 |
|
|
} else { |
311 |
|
|
double cy = (int) thumbRect.y + h / 2 - 2; |
312 |
|
|
// center line |
313 |
|
|
g2.setComposite(ac.derive(1.0f)); |
314 |
|
|
paintHorizontalLine(g2, cy, x1, x2, c3); |
315 |
|
|
|
316 |
|
|
// center down line |
317 |
|
|
g2.setComposite(ac.derive(0.30f)); |
318 |
|
|
paintHorizontalLine(g2, cy - 1, x1, x2, Color.BLACK); |
319 |
|
|
/// |
320 |
|
|
|
321 |
|
|
// center up line |
322 |
|
|
g2.setPaint(Color.WHITE); |
323 |
|
|
g2.setComposite(ac.derive(0.10f)); |
324 |
|
|
paintHorizontalLine(g2, cy + 1, x1, x2, Color.WHITE); |
325 |
|
|
/// |
326 |
|
|
} |
327 |
|
|
|
328 |
|
|
// border shadow |
329 |
|
|
g2.setPaint(Color.BLACK); |
330 |
|
|
g2.setComposite(ac.derive(0.10f)); |
331 |
|
|
l = new Line2D.Double(x2, y1 + 1, x2, y2 - 2); |
332 |
|
|
g2.draw(l); // right |
333 |
|
|
|
334 |
|
|
|
335 |
|
|
g2.setComposite(ac.derive(0.06f)); |
336 |
|
|
l = new Line2D.Double(x1 - 2, y1 + 2, x1 - 2, y2 - 2); |
337 |
|
|
g2.draw(l);// left |
338 |
|
|
|
339 |
|
|
l = new Line2D.Double(x2 + 2, y1 + 2, x2 + 2, y2 - 2); |
340 |
|
|
g2.draw(l); // right |
341 |
|
|
/// |
342 |
|
|
} |
343 |
|
|
|
344 |
|
|
@Override |
345 |
|
|
public boolean |
346 |
|
|
isInside(MouseEvent e) { |
347 |
|
|
if(thumbRect == null) return false; |
348 |
|
|
return thumbRect.contains(e.getX(), e.getY()); |
349 |
|
|
} |
350 |
|
|
|
351 |
|
|
private final Handler handler = new Handler(); |
352 |
|
|
|
353 |
|
|
private Handler |
354 |
|
|
getHandler() { return handler; } |
355 |
|
|
|
356 |
|
|
private class Handler implements ChangeListener { |
357 |
|
|
@Override |
358 |
|
|
public void stateChanged(ChangeEvent e) { |
359 |
|
|
slider.repaint(thumbRect); |
360 |
|
|
} |
361 |
|
|
|
362 |
|
|
} |
363 |
|
|
|
364 |
|
|
|
365 |
|
|
@Override |
366 |
|
|
protected Dimension |
367 |
|
|
getThumbSize() { |
368 |
|
|
Dimension d = (Dimension)slider.getClientProperty("Fader.knobSize"); |
369 |
|
|
if(d != null) return d; |
370 |
|
|
return slider.getOrientation() == JSlider.VERTICAL ? |
371 |
|
|
new Dimension(27, 20) : new Dimension(17, 27); |
372 |
|
|
} |
373 |
|
|
} |