1////////////////////////////////////////////////////////////////////////////////
2//
3//  ADOBE SYSTEMS INCORPORATED
4//  Copyright 2004-2006 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 mx.skins.halo
13{
14
15import flash.display.Graphics;
16import mx.collections.IList;
17import mx.core.UIComponent;
18import mx.core.mx_internal;
19
20use namespace mx_internal;
21
22/**
23 *  The skin used for all color swatches in a ColorPicker.
24 */
25public class SwatchSkin extends UIComponent
26{
27    include "../../core/Version.as";
28
29    //--------------------------------------------------------------------------
30    //
31    //  Constructor
32    //
33    //--------------------------------------------------------------------------
34
35    /**
36	 *  Constructor.
37     */
38    public function SwatchSkin()
39    {
40        super();
41    }
42
43    //--------------------------------------------------------------------------
44    //
45    //  Variables
46    //
47    //--------------------------------------------------------------------------
48
49    /**
50     *  @private
51     */
52    mx_internal var color:uint = 0x000000;
53
54    /**
55     *  @private
56     */
57    mx_internal var colorField:String = "color";
58
59    //--------------------------------------------------------------------------
60    //
61    //  Overridden methods
62    //
63    //--------------------------------------------------------------------------
64
65    /**
66     *  @private
67     */
68    override protected function updateDisplayList(w:Number, h:Number):void
69    {
70		super.updateDisplayList(w, h);
71
72		mx_internal::updateSkin(mx_internal::color);
73    }
74
75    //--------------------------------------------------------------------------
76    //
77    //  Methods
78    //
79    //--------------------------------------------------------------------------
80
81    /**
82     *  @private
83     */
84    mx_internal function updateGrid(dp:IList):void
85    {
86        if (name == "swatchGrid")
87        {
88            graphics.clear();
89            drawGrid(dp, mx_internal::colorField);
90        }
91    }
92
93    /**
94     *  @private
95     */
96    mx_internal function updateSkin(c:Number):void
97    {
98        var g:Graphics = graphics;
99
100		switch (name)
101        {
102            case "colorPickerSwatch":
103            {
104                var w:Number = UIComponent(parent).width /
105							   Math.abs(UIComponent(parent).scaleX);
106                var h:Number = UIComponent(parent).height /
107							   Math.abs(UIComponent(parent).scaleY);
108
109				g.clear();
110                drawSwatch(0, 0, w, h, c);
111                break;
112            }
113
114            case "swatchPreview":
115            {
116                var previewWidth:Number = getStyle("previewWidth");
117                var previewHeight:Number = getStyle("previewHeight");
118
119                g.clear();
120                drawSwatch(0, 0, previewWidth, previewHeight, c);
121                drawBorder(0, 0, previewWidth, previewHeight,
122						   0x999999, 0xFFFFFF, 1, 1.0);
123                break;
124            }
125
126            case "swatchHighlight":
127            {
128                var swatchWidth:Number = getStyle("swatchWidth");
129                var swatchHeight:Number = getStyle("swatchHeight");
130                var swatchHighlightColor:uint =
131					getStyle("swatchHighlightColor");
132                var swatchHighlightSize:Number =
133					getStyle("swatchHighlightSize");
134
135                g.clear();
136                drawBorder(0, 0, swatchWidth, swatchHeight,
137						   swatchHighlightColor, swatchHighlightColor,
138						   swatchHighlightSize, 1.0);
139                break;
140            }
141        }
142    }
143
144    /**
145     *  @private
146     */
147    private function drawGrid(dp:IList, cf:String):void
148    {
149		var columnCount:int = getStyle("columnCount");
150        var horizontalGap:Number = getStyle("horizontalGap");
151        var previewWidth:Number = getStyle("previewWidth");
152        var swatchGridBackgroundColor:uint =
153			getStyle("swatchGridBackgroundColor");
154        var swatchGridBorderSize:Number =
155			getStyle("swatchGridBorderSize");
156        var swatchHeight:Number = getStyle("swatchHeight");
157        var swatchWidth:Number = getStyle("swatchWidth");
158        var textFieldWidth:Number = getStyle("textFieldWidth");
159        var verticalGap:Number = getStyle("verticalGap");
160
161        var cellOffset:int = 1;
162        var itemOffset:int = 3;
163
164        // Adjust for dataProviders that are less than the columnCount.
165        var length:int = dp.length;
166        if (columnCount > length)
167            columnCount = length;
168
169        // Define local values.
170        var rows:Number = Math.ceil(length / columnCount);
171        if (isNaN(rows))
172        	rows = 0;
173        var totalWidth:Number = columnCount * (swatchWidth - cellOffset) +
174								cellOffset +
175								(columnCount - 1) * horizontalGap +
176								2 * swatchGridBorderSize;
177        var totalHeight:Number = rows * (swatchHeight - cellOffset) +
178								 cellOffset +
179								 (rows - 1) * verticalGap +
180								 2 * swatchGridBorderSize;
181
182        // Adjust width if it falls shorter than the width of the preview area.
183        var previewArea:Number = previewWidth + textFieldWidth + itemOffset;
184        if (totalWidth < previewArea)
185            totalWidth = previewArea;
186
187        // Draw the background for the swatches
188        drawFill(0, 0, totalWidth, totalHeight, swatchGridBackgroundColor, 100);
189		setActualSize(totalWidth, totalHeight);
190
191        // Draw the swatches
192        var cNum:int = 0;
193		var rNum:int = 0;
194		for (var n:int = 0; n < length; n++)
195        {
196            var swatchX:Number = swatchGridBorderSize + cNum *
197								(swatchWidth + horizontalGap - cellOffset);
198
199			var swatchY:Number = swatchGridBorderSize + rNum *
200								 (swatchHeight + verticalGap - cellOffset);
201
202			var c:Number = typeof(dp.getItemAt(n)) != "object" ?
203						   Number(dp.getItemAt(n)) :
204						   Number((dp.getItemAt(n))[mx_internal::colorField]);
205
206            // Draw rectangle...
207            drawSwatch(swatchX, swatchY, swatchWidth, swatchHeight, c);
208
209			if (cNum < columnCount - 1)
210            {
211                cNum++
212            }
213            else
214            {
215                cNum = 0;
216                rNum++
217            }
218        }
219    }
220
221    /**
222     *  @private
223     */
224    private function drawSwatch(x:Number, y:Number, w:Number, h:Number,
225							    c:Number):void
226    {
227        // Load styles...
228        var swatchBorderColor:uint =
229			getStyle("swatchBorderColor");
230        var swatchBorderSize:Number =
231			getStyle("swatchBorderSize");
232
233        if (swatchBorderSize == 0)
234        {
235            // Don't show a border...
236            drawFill(x, y, w, h, c, 1.0);
237        }
238        else if (swatchBorderSize < 0 || isNaN(swatchBorderSize))
239        {
240            // Default to a border size of 1 if invalid.
241            drawFill(x, y, w, h, swatchBorderColor, 1.0);
242            drawFill(x + 1, y + 1, w - 2, h - 2, c, 1.0);
243        }
244        else
245        {
246            // Otherwise use specified border size.
247            drawFill(x, y, w, h, swatchBorderColor, 1.0);
248            drawFill(x + swatchBorderSize, y + swatchBorderSize,
249					 w - 2 * swatchBorderSize, h - 2 * swatchBorderSize,
250					 c, 1.0);
251        }
252    }
253
254    /**
255     *  @private
256     */
257    private function drawBorder(x:Number, y:Number, w:Number, h:Number,
258								c1:Number, c2:Number, s:Number, a:Number):void
259    {
260        // border line on the left side
261        drawFill(x, y, s, h, c1, a);
262
263        // border line on the top side
264        drawFill(x, y, w, s, c1, a);
265
266        // border line on the right side
267        drawFill(x + (w - s), y, s, h, c2, a);
268
269        // border line on the bottom side
270        drawFill(x, y + (h - s), w, s, c2, a);
271    }
272
273    /**
274     *  @private
275     */
276    private function drawFill(x:Number, y:Number, w:Number, h:Number,
277							  c:Number, a:Number):void
278    {
279        var g:Graphics = graphics;
280        g.moveTo(x, y);
281        g.beginFill(c, a);
282        g.lineTo(x + w, y);
283        g.lineTo(x + w, h + y);
284        g.lineTo(x, h + y);
285        g.lineTo(x, y);
286        g.endFill();
287    }
288}
289
290}
291