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