1////////////////////////////////////////////////////////////////////////////////
2//
3//  ADOBE SYSTEMS INCORPORATED
4//  Copyright 2004-2007 Adobe Systems Incorporated
5//  All Rights Reserved.
6//
7//  NOTICE: Adobe permits you to use, modify, and distribute this file
8//  in accordance with the terms of the license agreement accompanying it.
9//
10////////////////////////////////////////////////////////////////////////////////
11
12package haloclassic
13{
14
15import flash.display.Graphics;
16import flash.display.GradientType;
17import mx.skins.Border;
18import mx.styles.StyleManager;
19import mx.utils.ColorUtil;
20
21/**
22 *  The skin for all the states of a thumb in a Slider.
23 */
24public class SliderThumbSkin extends Border
25{
26	include "../mx/core/Version.as";
27
28	//--------------------------------------------------------------------------
29	//
30	//  Class variables
31	//
32	//--------------------------------------------------------------------------
33
34	/**
35	 *  @private
36	 */
37	private static var cache:Object = {};
38
39	//--------------------------------------------------------------------------
40	//
41	//  Class methods
42	//
43	//--------------------------------------------------------------------------
44
45	/**
46	 *  @private
47	 *  Several colors used for drawing are calculated from the base colors
48	 *  of the component (themeColor, borderColor and fillColors).
49	 *  Since these calculations can be a bit expensive,
50	 *  we calculate once per color set and cache the results.
51	 */
52	private static function calcDerivedStyles(themeColor:uint,
53											  borderColor:uint,
54											  fillColor0:uint,
55											  fillColor1:uint):Object
56	{
57		var key:String = HaloColors.getCacheKey(themeColor, borderColor,
58												fillColor0, fillColor1);
59
60		if (!cache[key])
61		{
62			var o:Object = cache[key] = {};
63
64			// Cross-Component styles.
65			HaloColors.addHaloColors(o, themeColor, fillColor0, fillColor1);
66
67			// SliderThumb-unique styles.
68			o.borderColorDrk1 = ColorUtil.adjustBrightness2(borderColor, -60);
69		}
70
71		return cache[key];
72	}
73
74	//--------------------------------------------------------------------------
75	//
76	//  Constructor
77	//
78	//--------------------------------------------------------------------------
79
80    /**
81	 *  Constructor.
82	 */
83	public function SliderThumbSkin()
84	{
85		super();
86	}
87
88	//--------------------------------------------------------------------------
89	//
90	//  Overridden properties
91	//
92	//--------------------------------------------------------------------------
93
94	//----------------------------------
95	//  measuredWidth
96	//----------------------------------
97
98	/**
99	 *  @private
100	 */
101	override public function get measuredWidth():Number
102	{
103		return 12;
104	}
105
106	//----------------------------------
107	//  measuredHeight
108	//----------------------------------
109
110	/**
111	 *  @private
112	 */
113	override public function get measuredHeight():Number
114	{
115		return 12;
116	}
117
118	//--------------------------------------------------------------------------
119	//
120	//  Overridden methods
121	//
122	//--------------------------------------------------------------------------
123
124    /**
125	 *  @private
126	 */
127	override protected function updateDisplayList(w:Number, h:Number):void
128	{
129		super.updateDisplayList(w, h);
130
131		// User-defined styles.
132		var borderColor:uint = getStyle("borderColor");
133		var fillColors:Array = getStyle("fillColors");
134		StyleManager.getColorNames(fillColors);
135		var themeColor:uint = getStyle("themeColor");
136
137		// Derivative styles.
138		var derStyles:Object = calcDerivedStyles(themeColor, borderColor,
139												 fillColors[0], fillColors[1]);
140
141		var g:Graphics = graphics;
142
143		g.clear();
144
145		switch (name)
146		{
147			case "thumbUpSkin":
148			{
149				// Border
150				g.beginGradientFill(
151					GradientType.LINEAR,
152					[ borderColor, derStyles.borderColorDrk1 ],
153					[ 1.0, 1.0 ], [ 0, 0xFF ],
154					verticalGradientMatrix(0, 0, w, h));
155				g.moveTo(w / 2, 0);
156				g.curveTo(w / 2, 0, w / 2 - 2, 2);
157				g.lineTo(0, h - 2);
158				g.curveTo(0, h - 2, 2, h);
159				g.lineTo(w - 2, h);
160				g.curveTo(w - 2, h, w, h - 2);
161				g.lineTo(w / 2 + 2, 2);
162				g.curveTo(w / 2 + 2, 2, w / 2, 0);
163				g.endFill();
164
165				// Fill
166				g.beginGradientFill(
167					GradientType.LINEAR,
168					[ fillColors[0], fillColors[1] ],
169					[ 1.0, 1.0 ], [ 0, 0xFF ],
170					verticalGradientMatrix(0, 0, w, h));
171				g.moveTo(w / 2, 1);
172				g.curveTo(w / 2, 0, w / 2 - 1, 2);
173				g.lineTo(1, h - 1);
174				g.curveTo(1, h - 1, 1, h - 1);
175				g.lineTo(w - 1, h - 1);
176				g.curveTo(w - 1, h - 1, w - 1, h - 2);
177				g.lineTo(w / 2 + 1, 2);
178				g.curveTo(w / 2 + 1, 2, w / 2, 1);
179				g.endFill();
180
181				break;
182			}
183
184			case "thumbOverSkin":
185			{
186				// Border
187				g.beginGradientFill(
188					GradientType.LINEAR,
189					[ derStyles.themeColDrk2, derStyles.themeColDrk1 ],
190					[ 1.0, 1.0 ], [ 0, 0xFF ],
191					verticalGradientMatrix(0, 0, w, h));
192				g.moveTo(w / 2, 0);
193				g.curveTo(w / 2, 0, w / 2 - 2, 2);
194				g.lineTo(0, h - 2);
195				g.curveTo(0, h - 2, 2, h);
196				g.lineTo(w - 2, h);
197				g.curveTo(w - 2, h, w, h - 2);
198				g.lineTo(w / 2 + 2, 2);
199				g.curveTo(w / 2 + 2, 2, w / 2, 0);
200				g.endFill();
201
202				// Fill
203				g.beginGradientFill(
204					GradientType.LINEAR,
205					[ derStyles.fillColorBright1, derStyles.fillColorBright2 ],
206					[ 1.0, 1.0 ], [ 0, 0xFF ],
207					verticalGradientMatrix(0, 0, w, h));
208				g.moveTo(w / 2, 1);
209				g.curveTo(w / 2, 0, w / 2 - 1, 2);
210				g.lineTo(1, h - 1);
211				g.curveTo(1, h - 1, 1, h - 1);
212				g.lineTo(w - 1, h - 1);
213				g.curveTo(w - 1, h - 1, w - 1, h - 2);
214				g.lineTo(w / 2 + 1, 2);
215				g.curveTo(w / 2 + 1, 2, w / 2, 1);
216				g.endFill();
217
218				break;
219			}
220
221			case "thumbDownSkin":
222			{
223				// Border
224				g.beginGradientFill(
225					GradientType.LINEAR,
226					[ derStyles.themeColDrk2, derStyles.themeColDrk1 ],
227					[ 1.0, 1.0 ], [ 0, 0xFF ],
228					verticalGradientMatrix(0, 0, w, h));
229				g.moveTo(w / 2, 0);
230				g.curveTo(w / 2, 0, w / 2 - 2, 2);
231				g.lineTo(0, h - 2);
232				g.curveTo(0, h - 2, 2, h);
233				g.lineTo(w - 2, h);
234				g.curveTo(w - 2, h, w, h - 2);
235				g.lineTo(w / 2 + 2, 2);
236				g.curveTo(w / 2 + 2, 2, w / 2, 0);
237				g.endFill();
238
239				// Fill
240				g.beginGradientFill(
241					GradientType.LINEAR,
242					[ derStyles.fillColorPress1, derStyles.fillColorPress2 ],
243					[ 1.0, 1.0 ], [ 0, 0xFF ],
244					verticalGradientMatrix(0, 0, w, h));
245				g.moveTo(w / 2, 1);
246				g.curveTo(w / 2, 0, w / 2 - 1, 2);
247				g.lineTo(1, h - 1);
248				g.curveTo(1, h - 1, 1, h - 1);
249				g.lineTo(w - 1, h - 1);
250				g.curveTo(w - 1, h - 1, w - 1, h - 2);
251				g.lineTo(w / 2 + 1, 2);
252				g.curveTo(w / 2 + 1, 2, w / 2, 1);
253				g.endFill();
254
255				break;
256			}
257
258			case "thumbDisabledSkin":
259			{
260				// Border
261				g.beginFill(0x999999, 0.5);
262				g.moveTo(w / 2, 0);
263				g.curveTo(w / 2, 0, w / 2 - 2, 2);
264				g.lineTo(0, h - 2);
265				g.curveTo(0, h - 2, 2, h);
266				g.lineTo(w - 2, h);
267				g.curveTo(w - 2, h, w, h - 2);
268				g.lineTo(w / 2 + 2, 2);
269				g.curveTo(w / 2 + 2, 2, w / 2, 0);
270				g.endFill();
271
272				// Fill
273				g.beginFill(0xFFFFFF, 0.5);
274				g.moveTo(w / 2, 1);
275				g.curveTo(w / 2, 0, w / 2 - 1, 2);
276				g.lineTo(1, h - 1);
277				g.curveTo(1, h - 1, 1, h - 1);
278				g.lineTo(w - 1, h - 1);
279				g.curveTo(w - 1, h - 1, w - 1, h - 2);
280				g.lineTo(w / 2 + 1, 2);
281				g.curveTo(w / 2 + 1, 2, w / 2, 1);
282				g.endFill();
283
284				break;
285			}
286		}
287	}
288}
289
290}
291