View Javadoc
1   package com.bric.multislider;
2   
3   import java.awt.BasicStroke;
4   import java.awt.Color;
5   import java.awt.Dimension;
6   import java.awt.GradientPaint;
7   import java.awt.Graphics2D;
8   import java.awt.LinearGradientPaint;
9   import java.awt.Paint;
10  import java.awt.Point;
11  import java.awt.Rectangle;
12  import java.awt.RenderingHints;
13  import java.awt.Shape;
14  import java.awt.geom.Point2D;
15  import java.awt.geom.Rectangle2D;
16  
17  import javax.swing.SwingConstants;
18  
19  public class AquaMultiThumbSliderUI<T> extends DefaultMultiThumbSliderUI<T>
20  {
21  
22      private static Color UPPER_GRAY = new Color(168, 168, 168);
23  
24      private static Color LOWER_GRAY = new Color(218, 218, 218);
25  
26      private static Color OUTLINE_OPACITY = new Color(0, 0, 0, 75);
27  
28      public AquaMultiThumbSliderUI(MultiThumbSlider<T> slider)
29      {
30          super(slider);
31          DEPTH = 4;
32          FOCUS_PADDING = 2;
33          trackHighlightColor = new Color(0x3a99fc);
34      }
35  
36      @Override
37      protected int getPreferredComponentDepth()
38      {
39          return 24;
40      }
41  
42      @Override
43      protected void paintFocus(Graphics2D g)
44      {
45          // do nothing, this is really handled in paintThumb now
46      }
47  
48      @Override
49      protected Dimension getThumbSize(int thumbIndex)
50      {
51          Thumb thumb = getThumb(thumbIndex);
52          if (Thumb.Hourglass.equals(thumb))
53          {
54              return new Dimension(5, 16);
55          }
56          else if (Thumb.Triangle.equals(thumb))
57          {
58              return new Dimension(14, 20);
59          }
60          else if (Thumb.Rectangle.equals(thumb))
61          {
62              return new Dimension(10, 20);
63          }
64          else
65          {
66              return new Dimension(16, 16);
67          }
68      }
69  
70      @Override
71      protected void paintTrack(Graphics2D g)
72      {
73          g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
74          Shape trackShape = getTrackOutline();
75  
76          GradientPaint gradient;
77          if (slider.getOrientation() == SwingConstants.HORIZONTAL)
78          {
79              gradient =
80                      new GradientPaint(new Point(trackRect.x, trackRect.y), UPPER_GRAY, new Point(trackRect.x,
81                              trackRect.y + trackRect.height), LOWER_GRAY);
82          }
83          else
84          {
85              gradient =
86                      new GradientPaint(new Point(trackRect.x, trackRect.y), UPPER_GRAY, new Point(trackRect.x
87                              + trackRect.width, trackRect.y), LOWER_GRAY);
88          }
89          g.setPaint(gradient);
90          g.fill(trackShape);
91  
92          paintTrackHighlight(g);
93  
94          g.setPaint(OUTLINE_OPACITY);
95          g.setStroke(new BasicStroke(1));
96          g.draw(trackShape);
97  
98          if (slider.isPaintTicks())
99          {
100             g.setColor(new Color(0x777777));
101             g.setStroke(new BasicStroke(1));
102             paintTick(g, .25f, 4, 9, false);
103             paintTick(g, .5f, 4, 9, false);
104             paintTick(g, .75f, 4, 9, false);
105             paintTick(g, 0f, 4, 9, false);
106             paintTick(g, 1f, 4, 9, false);
107         }
108     }
109 
110     @Override
111     protected Rectangle calculateTrackRect()
112     {
113         Rectangle r = super.calculateTrackRect();
114 
115         // why so much dead space? I don't know. This only tries to emulate
116         // what Apple is doing.
117         int k = 22;
118         if (slider.getOrientation() == SwingConstants.HORIZONTAL)
119         {
120             r.x = k;
121             r.width = slider.getWidth() - k * 2;
122         }
123         else
124         {
125             r.y = k;
126             r.height = slider.getHeight() - k * 2;
127         }
128         return r;
129 
130     }
131 
132     @Override
133     protected void paintThumb(Graphics2D g, int thumbIndex, float selected)
134     {
135         Shape outline = getThumbShape(thumbIndex);
136 
137         Rectangle2D thumbBounds = ShapeBounds.getBounds(outline);
138 
139         g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
140         g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
141         Paint fill =
142                 new LinearGradientPaint(new Point2D.Double(0, thumbBounds.getMinY()), new Point2D.Double(0,
143                         thumbBounds.getMaxY()), new float[]{0, .5f, .501f, 1}, new Color[]{new Color(0xFFFFFF),
144                         new Color(0xF4F4F4), new Color(0xECECEC), new Color(0xEDEDED)});
145         g.setPaint(fill);
146         g.fill(outline);
147 
148         if (mouseIsDown && thumbIndex == slider.getSelectedThumb())
149         {
150             g.setPaint(new Color(0, 0, 0, 28));
151             g.fill(outline);
152         }
153 
154         g.setStroke(new BasicStroke(1f));
155         g.setPaint(new Color(0, 0, 0, 110));
156         g.draw(outline);
157 
158         if (thumbIndex == slider.getSelectedThumb())
159         {
160             Color focusColor = new Color(0xa7, 0xd5, 0xff, 240);
161             PlafPaintUtils.paintFocus(g, outline, FOCUS_PADDING, focusColor, false);
162             g.setStroke(new BasicStroke(1f));
163             g.setPaint(new Color(0, 0, 0, 23));
164             g.draw(outline);
165         }
166     }
167 }