topical media & game development

talk show tell print

lib-flex-style-explorer-components-advancedColorPicker.mx

lib-flex-style-explorer-components-advancedColorPicker.mx (swf ) [ flash ] flex


  <?xml version="1.0" encoding="utf-8"?>
  <mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" styleName="colorPickerPanel" 
          layout="absolute" width="436" height="352" title="Color Picker" creationComplete="onCreationComplete()" showCloseButton="true" close="closeMe();">
          <mx:Script>
                  <![CDATA[
                          import mx.core.Application;
                          import mx.managers.PopUpManager;
                          import mx.managers.CursorManager;
                          import mx.events.MoveEvent;
                          import mx.events.ResizeEvent;
                          import mx.events.DragEvent;
                          import mx.events.FlexEvent;
                          import mx.core.UIComponent;
                          import mx.binding.utils.ChangeWatcher;
                          import mx.binding.utils.BindingUtils;
                          import mx.controls.Alert;
                          import flash.utils.getTimer;
                          import mx.graphics.GradientEntry;
                          import mx.graphics.RadialGradient;
                          
                          private static const CS_HUE:String = "hue";
                          private static const CS_SATURATION:String = "saturation";
                          private static const CS_LIGHTNESS:String = "lightness";
                          private static const CS_RED:String = "red";
                          private static const CS_GREEN:String = "green";
                          private static const CS_BLUE:String = "blue";
                          
                          private static var whatColorSpace:String = CS_HUE;
                          
                          private static function rgb2int(r:Number, g:Number, b:Number):uint
                          {
                                  return         uint((Math.round(r*255))<<16) | 
                                                  uint((Math.round(g*255))<<8) | 
                                                  uint(Math.round(b*255));
                          }
                          
                          private static function rgb2hsl(r:Number, g:Number, b:Number):Array
                          {
                                  var H:Number;
                      var S:Number;
                      var B:Number;
                      
                      var cmax:Number = (r > g) ? r : g;
                      if (b > cmax) {
                          cmax = b;
                      }
                      var cmin:Number = (r < g) ? r : g;
                      if (b < cmin) {
                          cmin = b;
                      }
                      B = cmax;
                      if (cmax != 0) {
                          S = (cmax - cmin)/cmax;
                      } else {
                          S = 0;
                      }
                      if (S == 0) {
                          H = 0;
                      } else {
                          var redc:Number   = (cmax - r)/(cmax - cmin);
                          var greenc:Number = (cmax - g)/(cmax - cmin);
                          var bluec:Number  = (cmax - b)/(cmax - cmin);
                          if (r == cmax) {
                              H = bluec - greenc;
                          } else if (g == cmax) {
                              H = 2.0 + redc - bluec;
                          } else {
                              H = 4.0 + greenc - redc;
                          }
                          H = H / 6.0;
                          if (H < 0) {
                              H = H + 1.0;
                          }
                      }
                      return [ H, S, B ];
                          }
                          
                          private static function hsl2rgb(H:Number, S:Number, B:Number):Array
                          {   
                      var r:Number = 0;
                      var g:Number = 0;
                      var b:Number = 0;
                      
                      if (S == 0) {
                          r = B;
                          g = r;
                          b = r;
                      } else {
                          var h:Number = (H - Math.floor(H)) * 6.0;
                          var f:Number =  h - Math.floor(h);
                      
                          var p:Number = B * (1.0 - S);
                          var q:Number = B * (1.0 - S * f);
                          var t:Number = B * (1.0 - (S * (1.0 - f)));
                      
                          switch(Math.floor(h)) {
                              case 0:
                                  r = B; g = t; b = p;
                                  break;
                              case 1:
                                  r = q; g = B; b = p;
                                  break;
                              case 2:
                                  r = p; g = B; b = t;
                                  break;
                              case 3:
                                  r = p; g = q; b = B;
                                  break;
                              case 4:
                                  r = t; g = p; b = B;
                                  break;
                              case 5:
                                  r = B; g = p; b = q;
                                  break;
                          }
                      }
                      return [r,g,b];
                          }
                          
                          private var updateColorSpace:Function = drawHueColorspace;
                          private var updateColorSpace2:Function = drawHueColorspace2;
  
                          private var colorArea:Sprite = new Sprite();
                          private var blackArea:Sprite = new Sprite();
                          private var whiteArea:Sprite = new Sprite();
                          
                          private var colorArea2:Sprite = new Sprite();
                          
                          private var pickerHandle:Sprite;
                          private var pickerHandleLeft:UIComponent;
                          private var pickerHandleRight:UIComponent;
                          
                          private var draggingPickerHandle:Boolean = false;
                          private var draggingPickers2:Boolean = false;
                          
                          private var hue:Number = 0;
                          private var saturation:Number = 1;
                          private var lightness:Number = 1;
                          
                          private var red:Number = 1;
                          private var green:Number = 0;
                          private var blue:Number = 0;
                          
                          private var ored:Number = 1;
                          private var ogreen:Number = 0;
                          private var oblue:Number = 0;
                          
                          private function initPickerHandle():void
                          {
                                  pickerHandle = new Sprite();
                                  pickerHandle.graphics.lineStyle(2,0x000000,1);
                                  pickerHandle.graphics.drawCircle(0,0,4.5);
                                  pickerHandle.graphics.endFill();
                                  pickerHandle.graphics.lineStyle(1,0xFFFFFF,1);
                                  pickerHandle.graphics.drawCircle(0,0,4);
                                  
                                  pickerHandle.graphics.lineStyle();
                                  pickerHandle.graphics.beginFill(0xFFFFFF, 0);
                                  pickerHandle.graphics.drawRect(-3, -3, 6, 6);
                                  pickerHandle.graphics.endFill();
                                  maincp.addChild(pickerHandle);
                          }
                          
                          private function initPickerHandles():void
                          {
                                  pickerHandleLeft = new UIComponent();
                  
                  pickerHandleLeft.graphics.beginFill(0x000000, .2 );
                  pickerHandleLeft.graphics.moveTo(-1,-4);
                  pickerHandleLeft.graphics.lineTo( 7, 2);
                  pickerHandleLeft.graphics.lineTo(-1, 8);
                  pickerHandleLeft.graphics.endFill();
                  pickerHandleLeft.graphics.beginFill(0x000000, .2);
                  pickerHandleLeft.graphics.moveTo(-1,-5);
                  pickerHandleLeft.graphics.lineTo( 7, 1);
                  pickerHandleLeft.graphics.lineTo(-1, 7);
                  pickerHandleLeft.graphics.endFill();
                  pickerHandleLeft.graphics.beginFill(0x000000);
                  pickerHandleLeft.graphics.moveTo(-1,-6);
                  pickerHandleLeft.graphics.lineTo( 7, 0);
                  pickerHandleLeft.graphics.lineTo(-1, 6);
                  pickerHandleLeft.graphics.endFill();
                  pickerHandleLeft.graphics.beginFill(0xcccccc);
                  pickerHandleLeft.graphics.moveTo( 0,-4);
                  pickerHandleLeft.graphics.lineTo( 5, 0);
                  pickerHandleLeft.graphics.lineTo( 0, 4);
                  pickerHandleLeft.graphics.beginFill(0xffffff);
                  pickerHandleLeft.graphics.moveTo( 0,-4);
                  pickerHandleLeft.graphics.lineTo( 3, -2);
                  pickerHandleLeft.graphics.lineTo( 0, 0);
                  pickerHandleLeft.graphics.endFill();
                  pickerHandleLeft.x = subcp.parent.x+3;
                  pickerHandleLeft.y = subcp.parent.y + 2;
                  this.addChild(pickerHandleLeft);
  
                  pickerHandleRight = new UIComponent();
                  pickerHandleRight.graphics.beginFill(0x000000, .2);
                  pickerHandleRight.graphics.moveTo( 4,-4);
                  pickerHandleRight.graphics.lineTo(-4, 2);
                  pickerHandleRight.graphics.lineTo( 4, 8);
                  pickerHandleRight.graphics.endFill();
                  pickerHandleRight.graphics.beginFill(0x000000, .2);
                  pickerHandleRight.graphics.moveTo( 4,-5);
                  pickerHandleRight.graphics.lineTo(-4, 1);
                  pickerHandleRight.graphics.lineTo( 4, 7);
                  pickerHandleRight.graphics.endFill();
                  pickerHandleRight.graphics.beginFill(0x000000);
                  pickerHandleRight.graphics.moveTo( 4,-6);
                  pickerHandleRight.graphics.lineTo(-4, 0);
                  pickerHandleRight.graphics.lineTo( 4, 6);
                  pickerHandleRight.graphics.endFill();
                  pickerHandleRight.graphics.beginFill(0xcccccc);
                  pickerHandleRight.graphics.moveTo( 3,-4);
                  pickerHandleRight.graphics.lineTo(-2, 0);
                  pickerHandleRight.graphics.lineTo( 3, 4);
                  pickerHandleRight.graphics.beginFill(0xffffff);
                  pickerHandleRight.graphics.moveTo( 3,-4);
                  pickerHandleRight.graphics.lineTo(0, -2);
                  pickerHandleRight.graphics.lineTo( 3, 0);
                  pickerHandleRight.graphics.endFill();
                  pickerHandleRight.x = subcp.parent.x+subcp.parent.width-6;
                  pickerHandleRight.y = subcp.parent.y + 2;
                  this.addChild(pickerHandleRight);
                          }                        
                          
                          private function bringToFront(child:Sprite):void
                          {
                                  var parent:* = child.parent;
                                  parent.removeChild(child);
                                  parent.addChild(child);
                          }
                          
                          private function c(num:String, min:Number, max:Number):Number
                          {
                                  var theNum:Number = Number(num);
                                  
                                  if ( isNaN(theNum) )
                                          return NaN;
                                  
                                  return Math.min(Math.max(theNum, min), max);
                          }
                          
                          /*
                          Getter Functions
                          
                          You will notice in the getters I am checking if the textbox
                          is currently focused, I do this because if I return the actual
                          value it interferes with typing because I am clamping the value
                          between 0 and 255.
  			*/
                          
                          [Bindable("colorChanged")]
                          private function get displayHue():*
                          {
                                  if ( focusManager.getFocus() == t_hue )
                                  {
                                          return t_hue.text;
                                  }
                                  
                                  return Math.round( 360*hue );
                          }
                          
                          [Bindable("colorChanged")]
                          private function get displaySaturation():*
                          {
                                  if ( focusManager.getFocus() == t_saturation )
                                  {
                                          return t_saturation.text;
                                  }
                                  
                                  return Math.round( 100*saturation );
                          }
                          
                          [Bindable("colorChanged")]
                          private function get displayLightness():*
                          {
                                  if ( focusManager.getFocus() == t_saturation )
                                  {
                                          return t_lightness.text;
                                  }
                                  
                                  return Math.round( 100*lightness );
                          }
                          
                          [Bindable("colorChanged")]
                          private function get displayRed():*
                          {
                                  if ( focusManager.getFocus() == t_red )
                                  {
                                          return t_red.text;
                                  }
                                  return Math.round( 255*red );
                          }
                          
                          [Bindable("colorChanged")]
                          private function get displayGreen():*
                          {
                                  if ( focusManager.getFocus() == t_green )
                                  {
                                          return t_green.text;
                                  }
                                  return Math.round( 255*green );
                          }
                          
                          [Bindable("colorChanged")]
                          private function get displayBlue():*
                          {
                                  if ( focusManager.getFocus() == t_blue )
                                  {
                                          return t_blue.text;
                                  }
                                  return Math.round( 255*blue );
                          }
                          
                          [Bindable("colorChanged")]
                          public function get hex():String
                          {
                                  if ( focusManager.getFocus() == t_hex )
                                  {
                                          return t_hex.text;
                                  }
                                  else
                                  {
                                          var hex:String = toHex(displayRed) + toHex(displayGreen) + toHex(displayBlue);
                              return hex;
                                     }
              }
              
              [Bindable("prevColorChanged")]
                          public function get prevhex():String
                          {
                                  var hex:String = toHex(Math.round(255*ored)) + toHex(Math.round(255*ogreen)) + toHex(Math.round(255*oblue));
                      return hex;
              }
              
              [Bindable("colorChanged")]
              private function get currentColor():uint
              {
                      return rgb2int(red, green, blue);
              }
              
              [Bindable("colorChanged")]
              private function get previousColor():uint
              {
                      return rgb2int(ored, ogreen, oblue);
              }
              
              //just for reverse compatibility
              public function get lastColor():Number
              {
                      return rgb2int(ored, ogreen, oblue);
              }
              
              public function set lastColor(color:Number):void
              {
                      ored  = ((color>>16)&0xFF)/255;
                  ogreen  = ((color>>8)&0xFF)/255;
                  oblue  = ((color)&0xFF)/255;
                  var hsl:Array = rgb2hsl(ored, ogreen, oblue);
                  hue = hsl[0];
                  saturation = hsl[1];
                  lightness = hsl[2];
            
                  dispatchEvent(new Event("colorChanged"));
              }
                         
                          
                          /*
                          Setter Functions
  			*/
                          private function set displayHue(value:Number):void
                          {
                                  if ( isNaN(value) )
                                          return;
                                          
                                  hue = value/360;
                                  var rgb:Array = hsl2rgb(hue, saturation, lightness);
                                  red = rgb[0];
                                  green = rgb[1];
                                  blue = rgb[2];
                                  dispatchEvent(new Event("colorChanged"));
                          }
                          
                          private function set displaySaturation(value:Number):void
                          {
                                  if ( isNaN(value) )
                                          return;
                                          
                                  saturation = value/100;
                                  var rgb:Array = hsl2rgb(hue, saturation, lightness);
                                  red = rgb[0];
                                  green = rgb[1];
                                  blue = rgb[2];
                                  dispatchEvent(new Event("colorChanged"));
                          }
                          
                          private function set displayLightness(value:Number):void
                          {
                                  if ( isNaN(value) )
                                          return;
                                          
                                  lightness = value/100;
                                  var rgb:Array = hsl2rgb(hue, saturation, lightness);
                                  red = rgb[0];
                                  green = rgb[1];
                                  blue = rgb[2];
                                  dispatchEvent(new Event("colorChanged"));
                          }
                          
                          private function set displayRed(value:Number):void
                          {
                                  if ( isNaN(value) )
                                          return;
                                          
                                  red = value/255;
                                  var hsl:Array = rgb2hsl(red, green, blue);
                                  hue = hsl[0];
                                  saturation = hsl[1];
                                  lightness = hsl[2];
                                  dispatchEvent(new Event("colorChanged"));
                          }
                          
                          private function set displayGreen(value:Number):void
                          {
                                  if ( isNaN(value) )
                                          return;
                                          
                                  green = value/255;
                                  var hsl:Array = rgb2hsl(red, green, blue);
                                  hue = hsl[0];
                                  saturation = hsl[1];
                                  lightness = hsl[2];
                                  dispatchEvent(new Event("colorChanged"));
                          }
                          
                          private function set displayBlue(value:Number):void
                          {
                                  if ( isNaN(value) )
                                          return;
                                          
                                  blue = value/255;
                                  var hsl:Array = rgb2hsl(red, green, blue);
                                  hue = hsl[0];
                                  saturation = hsl[1];
                                  lightness = hsl[2];
                                  dispatchEvent(new Event("colorChanged"));
                          }
                          
                          public function set hex(value:String):void
                          {
                                  fromHex(value);
                                  dispatchEvent(new Event("colorChanged"));
                          }
                          
                          private function fromHex(value:String):void
                         {
                                 if ( value.indexOf("#") == 0 )
                                         value = value.substr(1);
                                         
                                 while ( value.length < 6 )
                                         value = "0"+value;
                                         
                                 if ( value.length > 6 )
                                         value = value.substr(0,6);
                                         
                                 red = parseInt( value.substr(0,2), 16 ) / 255;
                                 green = parseInt( value.substr(2,2), 16 ) / 255;
                                 blue = parseInt( value.substr(4,2), 16 ) / 255;
                                 
                  var hsb:Array = rgb2hsl(red, green, blue);
                  hue = hsb[0];
                  saturation = hsb[1];
                  lightness = hsb[2];
                         }
                         
                         private function handleHexChange():void
                         {
                                 hex = t_hex.text;
                         }
                          
                          private function toHex(value:Number):String
                         {
                                 if ( isNaN(value) )
                                         return "00";
                                         
                                 value = Math.round(Math.max(Math.min(value, 255), 0));
                                 
                                 var mask:String = "0123456789ABCDEF";
                                 
                                 var pos1:Number = (value-(value%16))/16;
                                 var pos2:Number = value%16;
                                 
                                 return mask.charAt(pos1) + mask.charAt(pos2);
                         }
                         
                         private function updatePickerLocation():void
                          {
                                  switch ( whatColorSpace )
                                  {
                                          case CS_HUE:
                                                  pickerHandleLeft.y = subcp.parent.y+(subcp.height*hue) + 2;
                                                  pickerHandleRight.y = subcp.parent.y+(subcp.height*hue) + 2;
                                                  pickerHandle.x = Math.round(maincp.width*saturation);
                                                  pickerHandle.y = Math.round(maincp.height - (maincp.height*lightness));
                                                  break;
                                                  
                                          case CS_SATURATION:
                                                  pickerHandleLeft.y = subcp.parent.y+(subcp.height-(subcp.height*saturation)) + 2;
                                                  pickerHandleRight.y = subcp.parent.y+(subcp.height-(subcp.height*saturation)) + 2;
                                                  pickerHandle.x = Math.round(maincp.width*hue);
                                                  pickerHandle.y = Math.round(maincp.height - (maincp.height*lightness));
                                                  break;
                                                  
                                          case CS_LIGHTNESS:
                                                  pickerHandleLeft.y = subcp.parent.y+(subcp.height-(subcp.height*lightness)) + 2;
                                                  pickerHandleRight.y = subcp.parent.y+(subcp.height-(subcp.height*lightness)) + 2;
                                                  pickerHandle.x = Math.round(maincp.width*hue);
                                                  pickerHandle.y = Math.round(maincp.height - (maincp.height*saturation));
                                                  break;
                                                  
                                          case CS_RED:
                                                  pickerHandleLeft.y = subcp.parent.y+(subcp.height-(subcp.height*red)) + 2;
                                                  pickerHandleRight.y = subcp.parent.y+(subcp.height-(subcp.height*red)) + 2;
                                                  pickerHandle.x = Math.round(maincp.width*blue);
                                                  pickerHandle.y = Math.round(maincp.height - (maincp.height*green));
                                                  break;
                                                  
                                          case CS_GREEN:
                                                  pickerHandleLeft.y = subcp.parent.y+(subcp.height-(subcp.height*green)) + 2;
                                                  pickerHandleRight.y = subcp.parent.y+(subcp.height-(subcp.height*green)) + 2;
                                                  pickerHandle.x = Math.round(maincp.width*blue);
                                                  pickerHandle.y = Math.round(maincp.height - (maincp.height*red));
                                                  break;
                                                  
                                          case CS_BLUE:
                                                  pickerHandleLeft.y = subcp.parent.y+(subcp.height-(subcp.height*blue)) + 2;
                                                  pickerHandleRight.y = subcp.parent.y+(subcp.height-(subcp.height*blue)) + 2;
                                                  pickerHandle.x = Math.round(maincp.width*red);
                                                  pickerHandle.y = Math.round(maincp.height - (maincp.height*green));
                                                  break;
                                  }
                          }                       
                          
                          private function changeColorSpace(what:String):void
                          {
                                  whatColorSpace = what;
                                  
                                  switch ( what )
                                  {
                                          case CS_HUE:
                                                  updateColorSpace = drawHueColorspace;
                                                  updateColorSpace2 = drawHueColorspace2;
                                                  break;
                                                  
                                          case CS_SATURATION:
                                                  updateColorSpace = drawSaturationColorspace;
                                                  updateColorSpace2 = drawSaturationColorspace2;
                                                  break;
                                                  
                                          case CS_LIGHTNESS:
                                                  updateColorSpace = drawLightnessColorspace;
                                                  updateColorSpace2 = drawLightnessColorspace2;
                                                  break;
                                                  
                                          case CS_RED:
                                                  updateColorSpace = drawRedColorspace;
                                                  updateColorSpace2 = drawRedColorspace2;
                                                  break;
                                                  
                                          case CS_GREEN:
                                                  updateColorSpace = drawGreenColorspace;
                                                  updateColorSpace2 = drawGreenColorspace2;
                                                  break;
                                                  
                                          case CS_BLUE:
                                                  updateColorSpace = drawBlueColorspace;
                                                  updateColorSpace2 = drawBlueColorspace2;
                                                  break;
                                  }
                                  
                                  updatePickerLocation();
                                  updateColorSpace();
                                  updateColorSpace2();        
                                  bringToFront(pickerHandle);
                          }
                          
                          private function drawHueColorspace():void
                          {                
                                  if ( !maincp.contains(whiteArea) )
                                  {
                                          if ( maincp.contains(blackArea) )
                                                  maincp.removeChild(blackArea);
                                                  
                                          maincp.addChild(whiteArea);
                                  }
                                          
                                  if ( !maincp.contains(blackArea) )
                                          maincp.addChild(blackArea);
                                          
                                  var w:Number = maincp.width;
                                  var h:Number = maincp.height;
                                  
                                  var rgb:Array = hsl2rgb(hue, 1, 1);
                                  colorArea.graphics.clear();
                                  colorArea.graphics.beginFill(rgb2int(rgb[0], rgb[1], rgb[2]));
                                  colorArea.graphics.drawRect(0, 0, w, h);
                                  
                  var matrix:Matrix = new Matrix();
                  matrix.createGradientBox(w, h, 0, 0, 0);
                  whiteArea.graphics.clear();
                  whiteArea.graphics.beginGradientFill(GradientType.LINEAR, [0xFFFFFF, 0x000000], [1, 1], [0, 255], matrix);
                  whiteArea.graphics.drawRect(0, 0, w, h);
                  whiteArea.blendMode = "screen";
  
                  matrix.createGradientBox(w, h, Math.PI/2, 0, 0);
                  blackArea.graphics.clear();
                  blackArea.graphics.beginGradientFill(GradientType.LINEAR, [0xFFFFFF, 0x000000], [1, 1], [0, 255], matrix);
                  blackArea.graphics.drawRect(0, 0, w, h);
                  blackArea.blendMode = "multiply";
                          }
                          
                          private function drawHueColorspace2():void
                          {
                                  var w:Number = subcp.width;
                                  var h:Number = subcp.height;
                                  
                                  colorArea2.graphics.clear();
                                  for ( var y:int=0; y<h; y++ )
                                  {
                                          var drawHue:Number = (y/h);
                                          var rgb:Array = hsl2rgb(drawHue, 1, 1);
                                          var color:uint = rgb2int(rgb[0], rgb[1], rgb[2]);
                                          colorArea2.graphics.beginFill(color);
                                          colorArea2.graphics.drawRect(0, y, w, 1);
                                  }
                          }
                          
                          private function drawSaturationColorspace():void
                          {
                                  if ( maincp.contains(whiteArea) )
                                          maincp.removeChild(whiteArea);
                                          
                                  if ( !maincp.contains(blackArea) )
                                          maincp.addChild(blackArea);
                                          
                                  var w:Number = maincp.width;
                                  var h:Number = maincp.height;
                                  
                                  colorArea.graphics.clear();
                                  for ( var i:int=0; i<w; i++ )
                                  {
                                          var drawHue:Number = (1/255)*i;
                                          var rgb:Array = hsl2rgb(drawHue, saturation, 1);
                                          colorArea.graphics.beginFill(rgb2int(rgb[0], rgb[1], rgb[2]));
                                          colorArea.graphics.drawRect(i, 0, 1, h);
                                  }
  
                                  var matrix:Matrix = new Matrix();
                  matrix.createGradientBox(w, h, Math.PI/2, 0, 0);
                  blackArea.graphics.clear();
                  blackArea.graphics.beginGradientFill(GradientType.LINEAR, [0xFFFFFF, 0x000000], [1, 1], [0, 255], matrix);
                  blackArea.graphics.drawRect(0, 0, w, h);
                  blackArea.blendMode = "multiply";
                          }
                          
                          private function drawSaturationColorspace2():void
                          {
                                  var w:Number = subcp.width;
                                  var h:Number = subcp.height;
                                  
                                  var rgb:Array = hsl2rgb(hue, 1, lightness);
                                  var color1:uint = rgb2int(rgb[0], rgb[1], rgb[2]);
                                  
                                  rgb = hsl2rgb(hue, 0, lightness);
                                  var color2:uint = rgb2int(rgb[0], rgb[1], rgb[2]);
                                  
                                  var matrix:Matrix = new Matrix();
                                  matrix.createGradientBox(w, h, Math.PI/2, 0, 0);
                                  
                                  colorArea2.graphics.clear();
                                  colorArea2.graphics.beginGradientFill(GradientType.LINEAR, [color1, color2], [1, 1], [0, 255], matrix);
                                  colorArea2.graphics.drawRect(0, 0, w, h);
                          }
                          
                          private function drawLightnessColorspace():void
                          {
                                  if ( maincp.contains(blackArea) )
                                          maincp.removeChild(blackArea);
                                          
                                  if ( maincp.contains(whiteArea) )
                                          maincp.removeChild(whiteArea);
                                  
                                  var w:Number = maincp.width;
                                  var h:Number = maincp.height;
                                  
                                  var matrix:Matrix = new Matrix();
                                  matrix.createGradientBox(w, h, Math.PI/2, 0, 0);
                                  
                                  colorArea.graphics.clear();
                                  for ( var i:int=0; i<w; i++ )
                                  {
                                          var drawHue:Number = (1/255)*i;
                                          var rgb:Array = hsl2rgb(drawHue, 1, lightness);
                                          var color1:uint = rgb2int(rgb[0], rgb[1], rgb[2]);
                                          rgb = hsl2rgb(0, 0, lightness);
                                          var color2:uint = rgb2int(rgb[0], rgb[1], rgb[2]);
                                          
                                          colorArea.graphics.beginGradientFill(GradientType.LINEAR, [color1, color2], [1, 1], [0, 255], matrix);
                                          colorArea.graphics.drawRect(i, 0, 1, h);
                                  }
                          }
                          
                          private function drawLightnessColorspace2():void
                          {
                                  var w:Number = subcp.width;
                                  var h:Number = subcp.height;
                                  
                                  var rgb:Array = hsl2rgb(hue, saturation, 1);
                                  var color:uint = rgb2int(rgb[0], rgb[1], rgb[2]);
                                  
                                  var matrix:Matrix = new Matrix();
                                  matrix.createGradientBox(w, h, Math.PI/2, 0, 0);
                                  
                                  colorArea2.graphics.clear();
                                  colorArea2.graphics.beginGradientFill(GradientType.LINEAR, [color, 0x000000], [1, 1], [0, 255], matrix);
                                  colorArea2.graphics.drawRect(0, 0, w, h);
                          }
                          
                          private function drawRedColorspace():void
                          {
                                  if ( maincp.contains(whiteArea) )
                                          maincp.removeChild(whiteArea);
                                          
                                  if ( maincp.contains(blackArea) )
                                          maincp.removeChild(blackArea);
                                  
                                  var w:Number = maincp.width;
                                  var h:Number = maincp.height;
                                  
                                  var matrix:Matrix = new Matrix();
                                  matrix.createGradientBox(w, h, Math.PI/2, 0, 0);
                                  
                                  colorArea.graphics.clear();
                                  for ( var x:int=0; x<w; x++ )
                                  {
                                          var endColor:uint = rgb2int(red, 0, x/w);
                                          var startColor:uint = rgb2int(red, 1, x/w);
                                          colorArea.graphics.beginGradientFill(GradientType.LINEAR, [startColor, endColor], [1, 1], [0, 255], matrix);
                                          colorArea.graphics.drawRect(x, 0, 1, h);
                                  }
                          }
                          
                          private function drawRedColorspace2():void
                          {
                                  var w:Number = subcp.width;
                                  var h:Number = subcp.height;
                                  
                                  var color1:uint = rgb2int(1, green, blue);
                                  var color2:uint = rgb2int(0, green, blue);
                                  
                                  var matrix:Matrix = new Matrix();
                                  matrix.createGradientBox(w, h, Math.PI/2, 0, 0);
                                  
                                  colorArea2.graphics.clear();
                                  colorArea2.graphics.beginGradientFill(GradientType.LINEAR, [color1, color2], [1, 1], [0, 255], matrix);
                                  colorArea2.graphics.drawRect(0, 0, w, h);
                          }
                          
                          private function drawGreenColorspace():void
                          {
                                  if ( maincp.contains(whiteArea) )
                                          maincp.removeChild(whiteArea);
                                          
                                  if ( maincp.contains(blackArea) )
                                          maincp.removeChild(blackArea);
                                  
                                  var w:Number = maincp.width;
                                  var h:Number = maincp.height;
                                  
                                  var matrix:Matrix = new Matrix();
                                  matrix.createGradientBox(w, h, Math.PI/2, 0, 0);
                                  
                                  colorArea.graphics.clear();
                                  for ( var x:int=0; x<w; x++ )
                                  {
                                          var endColor:uint = rgb2int(0, green, x/w);
                                          var startColor:uint = rgb2int(1, green, x/w);
                                          colorArea.graphics.beginGradientFill(GradientType.LINEAR, [startColor, endColor], [1, 1], [0, 255], matrix);
                                          colorArea.graphics.drawRect(x, 0, 1, h);
                                  }
                          }
                          
                          private function drawGreenColorspace2():void
                          {
                                  var w:Number = subcp.width;
                                  var h:Number = subcp.height;
                                  
                                  var color1:uint = rgb2int(red, 1, blue);
                                  var color2:uint = rgb2int(red, 0, blue);
                                  
                                  var matrix:Matrix = new Matrix();
                                  matrix.createGradientBox(w, h, Math.PI/2, 0, 0);
                                  
                                  colorArea2.graphics.clear();
                                  colorArea2.graphics.beginGradientFill(GradientType.LINEAR, [color1, color2], [1, 1], [0, 255], matrix);
                                  colorArea2.graphics.drawRect(0, 0, w, h);
                          }
                          
                          private function drawBlueColorspace():void
                          {
                                  if ( maincp.contains(whiteArea) )
                                          maincp.removeChild(whiteArea);
                                          
                                  if ( maincp.contains(blackArea) )
                                          maincp.removeChild(blackArea);
                                  
                                  var w:Number = maincp.width;
                                  var h:Number = maincp.height;
                                  
                                  var matrix:Matrix = new Matrix();
                                  matrix.createGradientBox(w, h, Math.PI/2, 0, 0);
                                  
                                  colorArea.graphics.clear();
                                  for ( var x:int=0; x<w; x++ )
                                  {
                                          var endColor:uint = rgb2int(x/w, 0, blue);
                                          var startColor:uint = rgb2int(x/w, 1, blue);
                                          colorArea.graphics.beginGradientFill(GradientType.LINEAR, [startColor, endColor], [1, 1], [0, 255], matrix);
                                          colorArea.graphics.drawRect(x, 0, 1, h);
                                  }
                          }
                          
                          private function drawBlueColorspace2():void
                          {
                                  var w:Number = subcp.width;
                                  var h:Number = subcp.height;
                                  
                                  var color1:uint = rgb2int(red, green, 1);
                                  var color2:uint = rgb2int(red, green, 0);
                                  
                                  var matrix:Matrix = new Matrix();
                                  matrix.createGradientBox(w, h, Math.PI/2, 0, 0);
                                  
                                  colorArea2.graphics.clear();
                                  colorArea2.graphics.beginGradientFill(GradientType.LINEAR, [color1, color2], [1, 1], [0, 255], matrix);
                                  colorArea2.graphics.drawRect(0, 0, w, h);
                          }
  
                          private function onCreationComplete():void
                          {
                                  this.x = 250;
                                  this.y = 140;
                                  
                                  initPickerHandle();
                                  initPickerHandles();
                                  
                                  maincp.addEventListener(MouseEvent.MOUSE_OVER, addPickerCursor);
                                  maincp.addEventListener(MouseEvent.MOUSE_OUT, removePickerCursor);
                                  
                                  maincp.addEventListener(MouseEvent.MOUSE_DOWN, startPickerDrag);
                                  this.addEventListener(MouseEvent.MOUSE_UP, stopPickerDrag);
                                  this.addEventListener(MouseEvent.MOUSE_MOVE, findColor);
                                  maincp.addEventListener(MouseEvent.CLICK, findColor);
                                  
                                  subcp.addEventListener(MouseEvent.MOUSE_DOWN, startPickers2Drag);
                                  this.addEventListener(MouseEvent.MOUSE_UP, stopPickers2Drag);
                                  this.addEventListener(MouseEvent.MOUSE_MOVE, findColor2);
                                  subcp.addEventListener(MouseEvent.CLICK, findColor2);
                                  
                                  maincp.addChild(colorArea);
                                  subcp.addChild(colorArea2);
                                  
                                  changeColorSpace(whatColorSpace);
                                  addEventListener("colorChanged", onColorChange);
                                  
                                  bringToFront(pickerHandle);
                                  
                                  dispatchEvent(new Event("colorChanged"));
                          }
                          
                          private function onColorChange(e:Event):void
                          {
                                  updatePickerLocation();
                                  updateColorSpace();
                                  updateColorSpace2();
                                  bringToFront(pickerHandle);
                          }
                          
                          private function restorePreviousColor():void
                          {
                                  red = ored;
                                  green = ogreen;
                                  blue = oblue;
                                  
                                  var hsl:Array = rgb2hsl(red, green, blue);
                                  hue = hsl[0];
                                  saturation = hsl[1];
                                  lightness = hsl[2];
                                  
                                  dispatchEvent(new Event("colorChanged"));
                          }
                          
                          private function addPickerCursor(e:MouseEvent):void
                          {
                                  CursorManager.setCursor(lib_flex_style_explorer_components_PickerCursor, 2);
                          }
                          
                          private function removePickerCursor(e:MouseEvent):void
                          {
                                  if ( !draggingPickerHandle )
                                          CursorManager.removeAllCursors();
                          }
                          
                          private function startPickerDrag(e:MouseEvent):void
                          {
                                  //change the docus so all the values update correctly...
                                  focusManager.setFocus(btnok);
                                  draggingPickerHandle = true;
                          }
                          
                          private function startPickers2Drag(e:MouseEvent):void
                          {
                                  //change the docus so all the values update correctly...
                                  focusManager.setFocus(btnok);
                                  draggingPickers2 = true;
                          }
                          
                          private function findColor(e:MouseEvent):void
                          {        
                                  if ( draggingPickerHandle || e.type == MouseEvent.CLICK )
                                  {
                                          //find the color...
                                          var x:Number = Math.min(Math.max(maincp.mouseX, 0), maincp.width);
                                          var y:Number = Math.min(Math.max(maincp.mouseY, 0), maincp.height);
                                          
                                          var rgb:Array;
                                          var hsl:Array;
                                          
                                          switch ( whatColorSpace )
                                          {
                                                  case CS_HUE:
                                                  {
                                                          //lightness: vert
                                                          //saturation: horz
                                                          saturation = x/maincp.width;
                                                          lightness = (maincp.height-y)/maincp.height;
                                                          rgb = hsl2rgb(hue, saturation, lightness);
                                                          red = rgb[0];
                                                          green = rgb[1];
                                                          blue = rgb[2];
                                                          break;
                                                  }
                                                  
                                                  case CS_SATURATION:
                                                  {
                                                          //hue: horx
                                                          //lightness: vert
                                                          hue = x/maincp.width;
                                                          lightness = (maincp.height-y)/maincp.height;
                                                          rgb = hsl2rgb(hue, saturation, lightness);
                                                          red = rgb[0];
                                                          green = rgb[1];
                                                          blue = rgb[2];
                                                          break;
                                                  }
                                                  
                                                  case CS_LIGHTNESS:
                                                  {
                                                          hue = x/maincp.width;
                                                          saturation = (maincp.height-y)/maincp.height;
                                                          rgb = hsl2rgb(hue, saturation, lightness);
                                                          red = rgb[0];
                                                          green = rgb[1];
                                                          blue = rgb[2];
                                                          break;
                                                  }
                                                  
                                                  case CS_RED:
                                                  {
                                                          //blue: x, green: y
                                                          blue = x/maincp.width;
                                                          green = (maincp.height-y)/maincp.height;
                                                          hsl = rgb2hsl(red, green, blue);
                                                          hue = hsl[0];
                                                          saturation = hsl[1];
                                                          lightness = hsl[2];
                                                          break;
                                                  }
                                                  
                                                  case CS_GREEN:
                                                  {
                                                          //blue: x, red: y
                                                          blue = x/maincp.width;
                                                          red = (maincp.height-y)/maincp.height;
                                                          hsl = rgb2hsl(red, green, blue);
                                                          hue = hsl[0];
                                                          saturation = hsl[1];
                                                          lightness = hsl[2];
                                                          break;
                                                  }
                                                  
                                                  case CS_BLUE:
                                                  {
                                                          //blue: x, red: y
                                                          red = x/maincp.width;
                                                          green = (maincp.height-y)/maincp.height;
                                                          hsl = rgb2hsl(red, green, blue);
                                                          hue = hsl[0];
                                                          saturation = hsl[1];
                                                          lightness = hsl[2];
                                                          break;
                                                  }
                                          }
                                          
                                          dispatchEvent(new Event("colorChanged"));
                                          
                                          pickerHandle.x = Math.min(Math.max(maincp.mouseX, 0), maincp.width);
                                          pickerHandle.y = Math.min(Math.max(maincp.mouseY, 0), maincp.height);
                                  }
                          }
                          
                          private function findColor2(e:MouseEvent):void
                          {        
                                  if ( draggingPickers2 || e.type == MouseEvent.CLICK )
                                  {
                                          //find the color...
                                          var y:Number = Math.min(Math.max(subcp.mouseY, 0), subcp.height);
                                          
                                          var rgb:Array;
                                          var hsl:Array;
                                          
                                          switch ( whatColorSpace )
                                          {
                                                  case CS_HUE:
                                                  {
                                                          hue = y/subcp.height;
                                                          rgb = hsl2rgb(hue, saturation, lightness);
                                                          red = rgb[0];
                                                          green = rgb[1];
                                                          blue = rgb[2];
                                                          break;
                                                  }
                                                  
                                                  case CS_SATURATION:
                                                  {
                                                          saturation = (subcp.height-y)/subcp.height;
                                                          rgb = hsl2rgb(hue, saturation, lightness);
                                                          red = rgb[0];
                                                          green = rgb[1];
                                                          blue = rgb[2];
                                                          break;
                                                  }
                                                  
                                                  case CS_LIGHTNESS:
                                                  {
                                                          lightness = (subcp.height-y)/subcp.height;
                                                          rgb = hsl2rgb(hue, saturation, lightness);
                                                          red = rgb[0];
                                                          green = rgb[1];
                                                          blue = rgb[2];
                                                          break;
                                                  }
                                                  
                                                  case CS_RED:
                                                  {
                                                          red = (subcp.height-y)/subcp.height;
                                                          hsl = rgb2hsl(red, green, blue);
                                                          hue = hsl[0];
                                                          saturation = hsl[1];
                                                          lightness = hsl[2];
                                                          break;
                                                  }
                                                  
                                                  case CS_GREEN:
                                                  {
                                                          green = (subcp.height-y)/subcp.height;
                                                          hsl = rgb2hsl(red, green, blue);
                                                          hue = hsl[0];
                                                          saturation = hsl[1];
                                                          lightness = hsl[2];
                                                          break;
                                                  }
                                                  
                                                  case CS_BLUE:
                                                  {
                                                          blue = (subcp.height-y)/subcp.height;
                                                          hsl = rgb2hsl(red, green, blue);
                                                          hue = hsl[0];
                                                          saturation = hsl[1];
                                                          lightness = hsl[2];
                                                          break;
                                                  }
                                          }
                                          
                                          dispatchEvent(new Event("colorChanged"));
                                  }
                          }
                          
                          private function stopPickerDrag(e:MouseEvent):void
                          {
                                  draggingPickerHandle = false;
                                  
                                  if ( maincp.mouseX < 0 || maincp.mouseX > maincp.width )
                                          removePickerCursor(null);
                                          
                                  if ( maincp.mouseY < 0 || maincp.mouseY > maincp.height )
                                          removePickerCursor(null);
                          }
                          
                          private function stopPickers2Drag(e:MouseEvent):void
                          {
                                  draggingPickers2 = false;
                          }
                          
                          public function getColorRGB():uint
                          {
                                  return rgb2int(red, green, blue);
                          }
                          
                          public function setColorRGB(color:uint):void 
                          {
                  ored = red = ((color>>16)&0xFF)/255;
                  ogreen = green = ((color>>8)&0xFF)/255;
                  oblue = blue = ((color)&0xFF)/255;
                  var hsl:Array = rgb2hsl(red, green, blue);
                  hue = hsl[0];
                  saturation = hsl[1];
                  lightness = hsl[2];
            
                  dispatchEvent(new Event("colorChanged"));
                  }
                  
                  private function cancelMe():void
                  {
                          setColorRGB(rgb2int(ored, ogreen, oblue));
                          PopUpManager.removePopUp(this);
                  }
                  
                  private function closeMe():void
                  {
                          PopUpManager.removePopUp(this);
                  }
                  
                  private function addSwatch():void {
                          mx.core.Application.application.globalColors.push(getColorRGB());
                  }
                  
                  ]]>
          </mx:Script>
          <mx:Box width="100%" height="100%" backgroundColor="#FFFFFF" backgroundAlpha="0.95"  color="#000000"/>
          <mx:Canvas x="10" y="10" width="259" height="255" borderStyle="inset">
                  <mx:Image top="0" bottom="0" left="0" id="maincp" right="0"/>
          </mx:Canvas>
          <mx:Canvas x="277" y="10" width="29" height="255" borderStyle="inset">
                  <mx:Image left="0" top="0" bottom="0" right="0" id="subcp"/>
          </mx:Canvas>
          <mx:Canvas x="335" y="24" width="62" height="67" borderStyle="solid" cornerRadius="0" borderColor="#000000" borderThickness="1">
                  <mx:Canvas borderStyle="solid" cornerRadius="0" borderColor="#000000" borderThickness="1" left="1" right="1" top="1" backgroundColor="{currentColor}" height="32" id="cvsCurr">
                  </mx:Canvas>
                  <mx:Canvas borderStyle="solid" cornerRadius="0" borderColor="#000000" borderThickness="1" left="1" right="1" top="32" bottom="1" backgroundColor="{previousColor}" id="cvsPrev" click="restorePreviousColor();">
                  </mx:Canvas>
          </mx:Canvas>
          <mx:Label x="335" y="8" text="new" width="62" textAlign="center"/>
          <mx:Label x="335" y="89" text="current" width="62" textAlign="center"/>
          <mx:RadioButton x="325" y="117" width="36" selected="true" id="csHue" groupName="colorspace" click="changeColorSpace(CS_HUE);" tabIndex="1" label="H:" fontWeight="normal" horizontalGap="0"/>
          <mx:Label x="399" y="117" text="°"/>
          <mx:Label x="399" y="143" text="%"/>
          <mx:Label x="399" y="169" text="%"/>
          <mx:TextInput x="363" y="115" width="34" text="{displayHue}" id="t_hue" change="displayHue=c(t_hue.text, 0, 360);" maxChars="3" tabIndex="7"/>
          <mx:RadioButton x="325" y="143" width="36" id="csSaturation" groupName="colorspace" click="changeColorSpace(CS_SATURATION);" tabIndex="2" label="S:" fontWeight="normal" horizontalGap="0"/>
          <mx:TextInput x="363" y="141" width="34" text="{displaySaturation}" id="t_saturation" change="displaySaturation=c(t_saturation.text, 0, 100);" maxChars="3" tabIndex="8"/>
          <mx:RadioButton x="325" y="169" width="36" id="csLightness" groupName="colorspace" tabIndex="3" label="B:" fontWeight="normal" horizontalGap="0">
                  <mx:click>changeColorSpace(CS_HUE);changeColorSpace(CS_LIGHTNESS);</mx:click>
          </mx:RadioButton>
          <mx:TextInput x="363" y="167" width="34" text="{displayLightness}" id="t_lightness" change="displayLightness=c(t_lightness.text, 0, 100);" maxChars="3" tabIndex="9"/>
          <mx:Label x="10" y="288" text="#:"/>
          <mx:TextInput x="29" y="286" width="54" tabIndex="13" id="t_hex" change="handleHexChange();" text="{hex}"/>
          <mx:RadioButton x="325" y="200" width="36" id="csRed" groupName="colorspace" click="changeColorSpace(CS_RED);" tabIndex="4" label="R" fontWeight="normal" horizontalGap="0"/>
          <mx:TextInput x="363" y="198" width="34" text="{displayRed}" change="displayRed=c(t_red.text, 0, 255);" id="t_red" maxChars="3" tabIndex="10"/>
          <mx:RadioButton x="325" y="226" width="36" id="csGreen" groupName="colorspace" click="changeColorSpace(CS_GREEN);" tabIndex="5" label="G:" fontWeight="normal" horizontalGap="0"/>
          <mx:TextInput x="363" y="224" width="34" text="{displayGreen}" id="t_green" change="displayGreen=c(t_green.text, 0, 255);" maxChars="3" tabIndex="11"/>
          <mx:RadioButton x="325" y="252" width="36" id="csBlue" groupName="colorspace" click="changeColorSpace(CS_BLUE);" tabIndex="6" label="B:" fontWeight="normal" horizontalGap="0"/>
          <mx:TextInput x="363" y="250" width="34" text="{displayBlue}" change="displayBlue=c(t_blue.text, 0, 255);" id="t_blue" maxChars="3" tabIndex="12"/>
          <mx:Button x="244" y="286" label="Add Swatch" width="90" tabIndex="22" id="btnswatch" click="addSwatch();" fontWeight="normal"/>
          <mx:Button x="339" y="286" label="OK" width="80" click="closeMe()" tabIndex="21" id="btnok"/>
          <mx:Button x="160" y="286" label="Cancel" width="80" tabIndex="22" id="btncancel" click="cancelMe();" fontWeight="normal"/>
          
          
  </mx:TitleWindow>
  


(C) Æliens 18/6/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.