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
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
116
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 }