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