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