/[svn]/jsampler/trunk/src/org/jsampler/view/fantasia/basic/FantasiaFaderUI.java
ViewVC logotype

Annotation of /jsampler/trunk/src/org/jsampler/view/fantasia/basic/FantasiaFaderUI.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2146 - (hide annotations) (download)
Mon Oct 11 09:31:27 2010 UTC (13 years, 7 months ago) by iliev
File size: 15849 byte(s)
* Fantasia: Migrated to substance 6.1
* Fantasia: Some minor GUI enhancements

1 iliev 1785 /*
2     * JSampler - a java front-end for LinuxSampler
3     *
4 iliev 2146 * Copyright (C) 2005-2010 Grigor Iliev <grigor@grigoriliev.com>
5 iliev 1785 *
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 iliev 2146 import java.awt.Component;
28 iliev 1785 import java.awt.Dimension;
29     import java.awt.GradientPaint;
30     import java.awt.Graphics;
31     import java.awt.Graphics2D;
32     import java.awt.RenderingHints;
33    
34     import java.awt.event.MouseEvent;
35 iliev 2146 import java.awt.event.MouseListener;
36     import java.awt.event.MouseMotionListener;
37 iliev 1785
38     import java.awt.geom.Arc2D;
39     import java.awt.geom.Line2D;
40     import java.awt.geom.Rectangle2D;
41     import java.awt.geom.RoundRectangle2D;
42    
43     import javax.swing.ButtonModel;
44     import javax.swing.DefaultButtonModel;
45     import javax.swing.JSlider;
46    
47     import javax.swing.event.ChangeEvent;
48     import javax.swing.event.ChangeListener;
49    
50     import javax.swing.plaf.basic.BasicSliderUI;
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     }
374 iliev 2146
375    
376    
377     /*
378     * Copyright (c) 2005-2009 Substance Kirill Grouchnikov. All Rights Reserved.
379     *
380     * Redistribution and use in source and binary forms, with or without
381     * modification, are permitted provided that the following conditions are met:
382     *
383     * o Redistributions of source code must retain the above copyright notice,
384     * this list of conditions and the following disclaimer.
385     *
386     * o Redistributions in binary form must reproduce the above copyright notice,
387     * this list of conditions and the following disclaimer in the documentation
388     * and/or other materials provided with the distribution.
389     *
390     * o Neither the name of Substance Kirill Grouchnikov nor the names of
391     * its contributors may be used to endorse or promote products derived
392     * from this software without specific prior written permission.
393     *
394     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
395     * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
396     * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
397     * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
398     * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
399     * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
400     * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
401     * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
402     * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
403     * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
404     * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
405     */
406    
407     /** @author Kirill Grouchnikov */
408     interface Trackable { public boolean isInside(MouseEvent me); }
409    
410     /**
411     * Control listener for rollover effects. Tracks the mouse motion interaction
412     * for the associated {@link org.jvnet.substance.utils.Trackable} control. This
413     * class is <b>for internal use only</b>.
414     *
415     * @author Kirill Grouchnikov
416     */
417     class RolloverControlListener implements MouseListener,
418     MouseMotionListener {
419     /**
420     * If the mouse pointer is currently inside the designated area (fetched
421     * from the associated {@link #trackableUI}), <code>this</code> flag is
422     * <code>true</code>.
423     */
424     private boolean isMouseInside;
425    
426     /**
427     * Surrogate model for tracking control status.
428     */
429     private ButtonModel model;
430    
431     /**
432     * Object that is queried for mouse events. This object is responsible for
433     * handling the designated (hot-spot) area of the associated control.
434     */
435     private Trackable trackableUI;
436    
437     /**
438     * Simple constructor.
439     *
440     * @param trackableUI
441     * Object that is queried for mouse events.
442     * @param model
443     * Surrogate model for tracking control status.
444     */
445     public RolloverControlListener(Trackable trackableUI, ButtonModel model) {
446     this.trackableUI = trackableUI;
447     this.model = model;
448     this.isMouseInside = false;
449     }
450    
451     /*
452     * (non-Javadoc)
453     *
454     * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
455     */
456     public void mouseEntered(MouseEvent e) {
457     Component component = (Component) e.getSource();
458     if (!component.isEnabled())
459     return;
460     boolean isInside = this.trackableUI.isInside(e);
461     // boolean isInsideChanged = (this.isMouseInside != isInside);
462     this.isMouseInside = isInside;
463     this.model.setRollover(isInside);
464     this.model.setEnabled(component.isEnabled());
465     }
466    
467     /*
468     * (non-Javadoc)
469     *
470     * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
471     */
472     public void mouseExited(MouseEvent e) {
473     Component component = (Component) e.getSource();
474     if (!component.isEnabled())
475     return;
476     // boolean isInsideChanged = (this.isMouseInside != false);
477     this.isMouseInside = false;
478     this.model.setRollover(false);
479     this.model.setEnabled(component.isEnabled());
480     }
481    
482     /*
483     * (non-Javadoc)
484     *
485     * @see
486     * java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
487     */
488     public void mouseReleased(MouseEvent e) {
489     // System.out.println("mouse released [" + e.getX() + ":" + e.getY() +
490     // "]");
491     Component component = (Component) e.getSource();
492     if (!component.isEnabled())
493     return;
494     boolean isInside = this.trackableUI.isInside(e);
495     // boolean isInsideChanged = (this.isMouseInside != isInside);
496     this.isMouseInside = isInside;
497     this.model.setRollover(this.isMouseInside);
498     this.model.setPressed(false);
499     this.model.setArmed(false);
500     this.model.setSelected(false);
501     this.model.setEnabled(component.isEnabled());
502     }
503    
504     /*
505     * (non-Javadoc)
506     *
507     * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
508     */
509     public void mousePressed(MouseEvent e) {
510     // System.out.println("mouse pressed [" + e.getX() + ":" + e.getY() +
511     // "]");
512     Component component = (Component) e.getSource();
513     if (!component.isEnabled())
514     return;
515     boolean isInside = this.trackableUI.isInside(e);
516     // boolean isInsideChanged = (this.isMouseInside != isInside);
517     this.isMouseInside = isInside;
518     this.model.setRollover(this.isMouseInside);
519     if (this.isMouseInside) {
520     this.model.setPressed(true);
521     this.model.setArmed(true);
522     this.model.setSelected(true);
523     }
524     this.model.setEnabled(component.isEnabled());
525     }
526    
527     /*
528     * (non-Javadoc)
529     *
530     * @see
531     * java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent
532     * )
533     */
534     public void mouseDragged(MouseEvent e) {
535     // System.out.println("mouse dragged [" + e.getX() + ":" + e.getY() +
536     // "]");
537     Component component = (Component) e.getSource();
538     if (!component.isEnabled())
539     return;
540     boolean isInside = this.trackableUI.isInside(e);
541     // boolean isInsideChanged = (this.isMouseInside != isInside);
542     this.isMouseInside = isInside;
543     this.model.setEnabled(component.isEnabled());
544     }
545    
546     /*
547     * (non-Javadoc)
548     *
549     * @see
550     * java.awt.event.MouseMotionListener#mouseMoved(java.awt.event.MouseEvent)
551     */
552     public void mouseMoved(MouseEvent e) {
553     // System.out.println("mouse moved [" + e.getX() + ":" + e.getY() +
554     // "]");
555     Component component = (Component) e.getSource();
556     if (!component.isEnabled())
557     return;
558     boolean isInside = this.trackableUI.isInside(e);
559     // System.out.println("inside");
560     // boolean isInsideChanged = (this.isMouseInside != isInside);
561     this.isMouseInside = isInside;
562     this.model.setRollover(isInside);
563     this.model.setEnabled(component.isEnabled());
564     }
565    
566     /*
567     * (non-Javadoc)
568     *
569     * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
570     */
571     public void mouseClicked(MouseEvent e) {
572     }
573     }

  ViewVC Help
Powered by ViewVC