ColorPicker.js
上传用户:snow1005
上传日期:2015-11-10
资源大小:3151k
文件大小:22k
源码类别:

Ajax

开发平台:

JavaScript

  1. /**
  2.  * Original code is taken from vtswingkid's (Ext JS Forum member) form.ux.ColorPickerField
  3.  * URL: http://extjs.com/forum/showthread.php?t=47450
  4.  * 
  5.  * Additional modifications have been made to the Ext.ux.ColorDialog by Todd Murdock.
  6.  */
  7. /**
  8.  * @class Ext.ux.ColorPicker
  9.  * @extends Ext.BoxComponent
  10.  * This is a color picker.
  11.  * @license: LGPLv3
  12.  * @author: Amon
  13.  * @constructor
  14.  * Creates a new ColorPicker
  15.  * @param {Object} config Configuration options
  16.  * @version 1.1.2
  17.  */
  18. Ext.namespace("Ext.ux", "Ext.ux.menu");
  19. Ext.ux.ColorPicker = Ext.extend( Ext.BoxComponent, {
  20. // will need to update css 'height' if more than one color box is enabled
  21. showWebSafeColorbox : false,
  22. showInverseColorbox : false,
  23. showColorbox : true,
  24. initComponent: function() {
  25. this.applyDefaultsCP();
  26. Ext.ux.ColorPicker.superclass.initComponent.apply( this, arguments );
  27. this.addEvents('select');
  28. },
  29. onRender: function() {
  30. Ext.ux.ColorPicker.superclass.onRender.apply( this, arguments );
  31. // check if container, self-container or renderTo exists
  32. this.body = this.body || ( this.container || ( this.renderTo || Ext.DomHelper.append( Ext.getBody(), {}, true ) ) );
  33. if( !this.el ) {
  34. this.el = this.body;
  35. if( this.cls ) { Ext.get( this.el ).addClass( this.cls ); }
  36. }
  37. // render this component
  38. this.renderComponent();
  39. },
  40. applyDefaultsCP: function() {
  41. Ext.apply( this, {
  42. 'cls': 'x-cp-mainpanel',
  43. 'resizable': this.resizable || false,
  44. 'HSV': {
  45. h: 0,
  46. s: 0,
  47. v: 0
  48. },
  49. updateMode: null
  50. });
  51. },
  52. renderComponent: function() {
  53. // create RGB Slider
  54. Ext.DomHelper.append( this.body, {
  55. 'id': this.cpGetId( 'rgb' ),
  56. 'cls': 'x-cp-rgbpicker'
  57. });
  58. // Create HUE Slider
  59. Ext.DomHelper.append( this.body, {
  60. 'id': this.cpGetId( 'hue' ),
  61. 'cls': 'x-cp-huepicker'
  62. });
  63. // Initialize HUE Picker DD
  64. this.huePicker = Ext.DomHelper.append( this.body, { 'cls': 'x-cp-hueslider' });
  65. this.hueDD = new Ext.dd.DD( this.huePicker, 'huePicker' );
  66. this.hueDD.constrainTo( this.cpGetId( 'hue' ), {'top':-7,'right':-3,'bottom':-7,'left':-3} );
  67. this.hueDD.onDrag = this.moveHuePicker.createDelegate( this );
  68. // initialize onclick on the rgb picker
  69. Ext.get( this.cpGetId( 'hue' ) ).on( 'mousedown', this.clickHUEPicker.createDelegate( this ) );
  70. // initialize start position
  71. Ext.get( this.huePicker ).moveTo( Ext.get( this.cpGetId( 'hue' ) ).getLeft() - 3, Ext.get( this.cpGetId( 'hue' ) ).getTop() - 7 );
  72. // Initialize RGB Picker DD
  73. this.rgbPicker = Ext.DomHelper.append( this.body, { 'cls': 'x-cp-rgbslider' });
  74. this.rgbDD = new Ext.dd.DD( this.rgbPicker, 'rgbPicker' );
  75. this.rgbDD.constrainTo( this.cpGetId( 'rgb' ), -7 );
  76. this.rgbDD.onDrag = this.moveRGBPicker.createDelegate( this );
  77. // initialize onclick on the rgb picker
  78. Ext.get( this.cpGetId( 'rgb' ) ).on( 'mousedown', this.clickRGBPicker.createDelegate( this ) );
  79. // initialize start position
  80. Ext.get( this.rgbPicker ).moveTo( Ext.get( this.cpGetId( 'rgb' ) ).getLeft() - 7, Ext.get( this.cpGetId( 'rgb' ) ).getTop() - 7 );
  81. // Create color divs and Form elements
  82. this.formPanel = new Ext.form.FormPanel({
  83. 'border': false,
  84. 'renderTo': Ext.DomHelper.append( this.body, {
  85. 'id': this.cpGetId( 'fCont' ),
  86. 'cls': 'x-cp-formcontainer'
  87. }, true ),
  88. 'frame': false,
  89. 'labelAlign': 'left',
  90. 'labelWidth': 10,
  91. 'items': [{ // Color box
  92. 'border': false,
  93. 'layout': 'form',
  94. 'id': this.cpGetId( 'cCont' )
  95. },{
  96. 'bodyStyle': 'padding-top:10px;',
  97. 'border': false,
  98. 'layout': 'column',
  99. 'items': [{ // RGB fields
  100. 'border': false,
  101. 'columnWidth': .5,
  102. 'layout': 'form',
  103. 'defaultType': 'numberfield',
  104. 'defaults': {
  105. 'width': 30,
  106. 'value': 0,
  107. 'minValue': 0,
  108. 'maxValue': 255,
  109. 'allowBlank': false,
  110. 'labelSeparator': '',
  111. 'enableKeyEvents': true
  112. },
  113. 'items': [{
  114. 'fieldLabel': 'R',
  115. 'id': this.cpGetId( 'iRed' )
  116. },{
  117. 'fieldLabel': 'G',
  118. 'id': this.cpGetId( 'iGreen' )
  119. },{
  120. 'fieldLabel': 'B',
  121. 'id': this.cpGetId( 'iBlue' )
  122. }]
  123. },{ // HSV Fields
  124. 'border': false,
  125. 'columnWidth': .5,
  126. 'layout': 'form',
  127. 'defaultType': 'numberfield',
  128. 'defaults': {
  129. 'width': 30,
  130. 'value': 0,
  131. 'minValue': 0,
  132. 'maxValue': 255,
  133. 'allowBlank': false,
  134. 'labelSeparator': '',
  135. 'enableKeyEvents': true
  136. },
  137. 'items': [{
  138. 'fieldLabel': 'H',
  139. 'maxValue': 360,
  140. 'id': this.cpGetId( 'iHue' )
  141. },{
  142. 'fieldLabel': 'S',
  143. 'id': this.cpGetId( 'iSat' )
  144. },{
  145. 'fieldLabel': 'V',
  146. 'id': this.cpGetId( 'iVal' )
  147. }]
  148. },{ // HEX field panel
  149. 'border': false,
  150. 'layout': 'form',
  151. 'labelAlign': 'left',
  152. 'items': [{
  153. 'width': 88,
  154. 'value': '000000',
  155. 'labelSeparator': '',
  156. 'allowBlank': false,
  157. 'fieldLabel': '#',
  158. 'id': this.cpGetId( 'iHexa' ),
  159. 'value': '000000',
  160. 'xtype': 'hexfield',
  161. 'enableKeyEvents': true
  162. // 'regex': /^[0-9a-fA-F]{6}$/
  163. }]
  164. }]
  165. }]
  166. });
  167. Ext.getCmp( this.cpGetId( 'iRed' ) ).on( 'keyup', this.updateFromIRGB.createDelegate( this ), {buffer: 750} );
  168. Ext.getCmp( this.cpGetId( 'iGreen' ) ).on( 'keyup', this.updateFromIRGB.createDelegate( this ), {buffer: 750} );
  169. Ext.getCmp( this.cpGetId( 'iBlue' ) ).on( 'keyup', this.updateFromIRGB.createDelegate( this ), {buffer: 750} );
  170. Ext.getCmp( this.cpGetId( 'iHue' ) ).on( 'keyup', this.updateFromIHSV.createDelegate( this ), {buffer: 750} );
  171. Ext.getCmp( this.cpGetId( 'iSat' ) ).on( 'keyup', this.updateFromIHSV.createDelegate( this ), {buffer: 750} );
  172. Ext.getCmp( this.cpGetId( 'iVal' ) ).on( 'keyup', this.updateFromIHSV.createDelegate( this ), {buffer: 750} );
  173. Ext.getCmp( this.cpGetId( 'iHexa' ) ).on( 'keyup', this.updateFromIHexa.createDelegate( this ), {buffer: 750} );
  174. var cContBody = Ext.getCmp( this.cpGetId( 'cCont' ) ).body;
  175. if(this.showWebSafeColorbox === true){ // show web save color box
  176. Ext.DomHelper.append( cContBody, { 'cls': 'x-cp-colorbox', 'id': this.cpGetId( 'cWebSafe' ) }, true ).update( 'Websafe' );
  177. Ext.get( this.cpGetId( 'cWebSafe' ) ).on( 'click', this.updateFromBox.createDelegate( this ) );
  178. }
  179. if(this.showInverseColorbox === true){ // show inverse color box
  180. Ext.DomHelper.append( cContBody, { 'cls': 'x-cp-colorbox', 'id': this.cpGetId( 'cInverse' ) }, true ).update( 'Inverse' );
  181. Ext.get( this.cpGetId( 'cInverse' ) ).on( 'click', this.updateFromBox.createDelegate( this ) );
  182. }
  183. if(this.showColorbox === true){ // show color box
  184. Ext.DomHelper.append( cContBody, { 'cls': 'x-cp-colorbox', 'id': this.cpGetId( 'cColor' ) }, true );//.update( 'Pick Color' );
  185. Ext.get( this.cpGetId( 'cColor' ) ).on( 'click', this.selectColor.createDelegate( this ) );
  186. }
  187. Ext.DomHelper.append( this.body, {'tag':'br','cls':'x-cp-clearfloat'});
  188. },
  189. cpGetId: function( postfix ) {
  190. return this.getId() + '__' + ( postfix || 'cp' );
  191. },
  192. updateRGBPosition: function( x, y ) {
  193. this.updateMode = 'click';
  194. x = x < 0 ? 0 : x;
  195. x = x > 181 ? 181 : x;
  196. y = y < 0 ? 0 : y;
  197. y = y > 181 ? 181 : y;
  198. this.HSV.s = this.getSaturation( x );
  199. this.HSV.v = this.getValue( y );
  200. Ext.get( this.rgbPicker ).moveTo( Ext.get( this.cpGetId( 'rgb' ) ).getLeft() + x - 7, Ext.get( this.cpGetId( 'rgb' ) ).getTop() + y - 7, ( this.animateMove || true ) );
  201. this.updateColor();
  202. },
  203. updateHUEPosition: function( y ) {
  204. this.updateMode = 'click';
  205. y = y < 1 ? 1 : y;
  206. y = y > 181 ? 181 : y;
  207. this.HSV.h = Math.round( 360 / 181 * ( 181 - y ) );
  208. Ext.get( this.huePicker ).moveTo( Ext.get( this.huePicker ).getLeft(), Ext.get( this.cpGetId( 'hue' ) ).getTop() + y - 7, ( this.animateMove || true ) );
  209. this.updateRGBPicker( this.HSV.h );
  210. this.updateColor();
  211. },
  212. clickRGBPicker: function( event, element ) {
  213. this.updateRGBPosition( event.xy[0] - Ext.get( this.cpGetId( 'rgb' ) ).getLeft() , event.xy[1] - Ext.get( this.cpGetId( 'rgb' ) ).getTop() );
  214. },
  215. clickHUEPicker: function( event, element ) {
  216. this.updateHUEPosition( event.xy[1] - Ext.get( this.cpGetId( 'hue' ) ).getTop() );
  217. },
  218. moveRGBPicker: function( event ) {
  219. this.rgbDD.constrainTo( this.cpGetId( 'rgb' ), -7 );
  220. this.updateRGBPosition( Ext.get( this.rgbPicker ).getLeft() - Ext.get( this.cpGetId( 'rgb' ) ).getLeft() + 7 , Ext.get( this.rgbPicker ).getTop() - Ext.get( this.cpGetId( 'rgb' ) ).getTop() + 7 );
  221. },
  222. moveHuePicker: function( event ) {
  223. this.hueDD.constrainTo( this.cpGetId( 'hue' ), {'top':-7,'right':-3,'bottom':-7,'left':-3} );
  224. this.updateHUEPosition( Ext.get( this.huePicker ).getTop() - Ext.get( this.cpGetId( 'hue' ) ).getTop() + 7 );
  225. },
  226. updateRGBPicker: function( newValue ) {
  227. this.updateMode = 'click';
  228. Ext.get( this.cpGetId( 'rgb' ) ).setStyle({ 'background-color': '#' + this.rgbToHex( this.hsvToRgb( newValue, 1, 1 ) ) });
  229. this.updateColor();
  230. },
  231. updateColor: function() {
  232. var rgb = this.hsvToRgb( this.HSV.h, this.HSV.s, this.HSV.v );
  233. var websafe = this.websafe( rgb );
  234. var invert = this.invert( rgb );
  235. var wsInvert = this.invert( websafe );
  236. if( this.updateMode !== 'hexa' ) {
  237. Ext.getCmp( this.cpGetId( 'iHexa' ) ).setValue( this.rgbToHex( rgb ) );
  238. }
  239. if( this.updateMode !== 'rgb' ) {
  240. Ext.getCmp( this.cpGetId( 'iRed' ) ).setValue( rgb[0] );
  241. Ext.getCmp( this.cpGetId( 'iGreen' ) ).setValue( rgb[1] );
  242. Ext.getCmp( this.cpGetId( 'iBlue' ) ).setValue( rgb[2] );
  243. }
  244. if( this.updateMode !== 'hsv' ) {
  245. Ext.getCmp( this.cpGetId( 'iHue' ) ).setValue( Math.round( this.HSV.h ) );
  246. Ext.getCmp( this.cpGetId( 'iSat' ) ).setValue( Math.round( this.HSV.s * 100 ) );
  247. Ext.getCmp( this.cpGetId( 'iVal' ) ).setValue( Math.round( this.HSV.v * 100 ) );
  248. }
  249. if(this.showColorbox === true){
  250. Ext.get( this.cpGetId( 'cColor' ) ).setStyle({
  251. 'background': '#' + this.rgbToHex( rgb ),
  252. 'color': '#' + this.rgbToHex( invert )
  253. });
  254. //Ext.getDom( this.cpGetId( 'cColor' ) ).title = '#'+this.rgbToHex( rgb );
  255. }
  256. if(this.showInverseColorbox === true){
  257. Ext.get( this.cpGetId( 'cInverse' ) ).setStyle({
  258. 'background': '#' + this.rgbToHex( invert ),
  259. 'color': '#' + this.rgbToHex( rgb )
  260. });
  261. //Ext.getDom( this.cpGetId( 'cInverse' ) ).title = '#'+this.rgbToHex( invert );
  262. }
  263. if(this.showWebSafeColorbox === true){
  264. Ext.get( this.cpGetId( 'cWebSafe' ) ).setStyle({
  265. 'background': '#' + this.rgbToHex( websafe ),
  266. 'color': '#' + this.rgbToHex( wsInvert )
  267. });
  268. //Ext.getDom( this.cpGetId( 'cWebSafe' ) ).title = '#'+this.rgbToHex( websafe );
  269. }
  270. if( this.updateMode !== 'click' ) {
  271. Ext.get( this.huePicker ).moveTo( Ext.get( this.huePicker ).getLeft(), Ext.get( this.cpGetId( 'hue' ) ).getTop() + this.getHPos( Ext.getCmp( this.cpGetId( 'iHue' ) ).getValue() ) - 7, ( this.animateMove || true ) );
  272. Ext.get( this.rgbPicker ).moveTo( Ext.get( this.cpGetId( 'rgb' ) ).getLeft() + this.getSPos( Ext.getCmp( this.cpGetId( 'iSat' ) ).getValue() / 100 ) - 7, Ext.get( this.cpGetId( 'hue' ) ).getTop() + this.getVPos( Ext.getCmp( this.cpGetId( 'iVal' ) ).getValue() / 100 ) - 7, ( this.animateMove || true ) );
  273. }
  274. Ext.get( this.cpGetId( 'rgb' ) ).setStyle({ 'background-color': '#' + this.rgbToHex( this.hsvToRgb( Ext.getCmp( this.cpGetId( 'iHue' ) ).getValue(), 1, 1 ) ) });
  275. this.selectColor(); // fire the 'select' event now
  276. },
  277. setColor: function(c) {
  278. if(!/^[0-9a-fA-F]{6}$/.test(c))return;
  279. Ext.getCmp( this.cpGetId( 'iHexa' ) ).setValue(c);
  280. this.updateFromIHexa();
  281. },
  282. getColor: function(){
  283. return Ext.getCmp( this.cpGetId( 'iHexa' ) ).getValue();
  284. },
  285. updateFromIRGB: function( input, newValue, oldValue ) {
  286. this.updateMode = 'rgb';
  287. var temp = this.rgbToHsv( Ext.getCmp( this.cpGetId( 'iRed' ) ).getValue(), Ext.getCmp( this.cpGetId( 'iGreen' ) ).getValue(), Ext.getCmp( this.cpGetId( 'iBlue' ) ).getValue() );
  288. this.HSV = { h: temp[0], s:temp[1], v:temp[2]};
  289. this.updateColor();
  290. },
  291. updateFromIHSV: function( input, newValue, oldValue ) {
  292. this.updateMode = 'hsv';
  293. this.HSV = { h: Ext.getCmp( this.cpGetId( 'iHue' ) ).getValue(), s:Ext.getCmp( this.cpGetId( 'iSat' ) ).getValue() / 100, v:Ext.getCmp( this.cpGetId( 'iVal' ) ).getValue() / 100};
  294. this.updateColor();
  295. },
  296. updateFromIHexa: function( input, e) {
  297. var value = Ext.getCmp( this.cpGetId( 'iHexa' ) ).getValue();
  298. if(!/^[0-9a-fA-F]{6}$/.test(value))return;
  299. this.updateMode = 'hexa';
  300. var temp = this.rgbToHsv( this.hexToRgb( value ) );
  301. this.HSV = { h: temp[0], s:temp[1], v:temp[2]};
  302. this.updateColor();
  303. },
  304. updateFromBox: function( event, element ) {
  305. this.updateMode = 'click';
  306. var temp = this.rgbToHsv( this.hexToRgb( Ext.get( element ).getColor( 'backgroundColor', '', '' ) ) );
  307. this.HSV = { h: temp[0], s:temp[1], v:temp[2]};
  308. this.updateColor();
  309. },
  310. selectColor: function( event, element ) {
  311. //this.fireEvent('select', this, Ext.get( element ).getColor( 'backgroundColor', '', '' ));
  312. this.fireEvent( 'select', this, this.getColor() );
  313. },
  314. /**
  315.  * Convert HSV color format to RGB color format
  316.  * @param {Integer/Array( h, s, v )} h
  317.  * @param {Integer} s (optional)
  318.  * @param {Integer} v (optional)
  319.  * @return {Array}
  320.  */
  321. hsvToRgb: function( h, s, v ) {
  322. if( h instanceof Array ) { return this.hsvToRgb.call( this, h[0], h[1], h[2] ); }
  323. var r, g, b, i, f, p, q, t;
  324.     i = Math.floor( ( h / 60 ) % 6 );
  325.     f = ( h / 60 ) - i;
  326.     p = v * ( 1 - s );
  327.     q = v * ( 1 - f * s );
  328.     t = v * ( 1 - ( 1 - f ) * s );
  329.     switch(i) {
  330.         case 0: r=v; g=t; b=p; break;
  331.         case 1: r=q; g=v; b=p; break;
  332.         case 2: r=p; g=v; b=t; break;
  333.         case 3: r=p; g=q; b=v; break;
  334.         case 4: r=t; g=p; b=v; break;
  335.         case 5: r=v; g=p; b=q; break;
  336.     }
  337.     return [this.realToDec( r ), this.realToDec( g ), this.realToDec( b )];
  338. },
  339. /**
  340.  * Convert RGB color format to HSV color format
  341.  * @param {Integer/Array( r, g, b )} r
  342.  * @param {Integer} g (optional)
  343.  * @param {Integer} b (optional)
  344.  * @return {Array}
  345.  */
  346. rgbToHsv: function( r, g, b ) {
  347. if( r instanceof Array ) { return this.rgbToHsv.call( this, r[0], r[1], r[2] ); }
  348.         r = r / 255;
  349.         g = g / 255;
  350.         b = b / 255;
  351.         var min, max, delta, h, s, v;
  352.         min = Math.min( Math.min( r, g ), b );
  353.         max = Math.max( Math.max( r, g ), b );
  354.         delta = max - min;
  355.         switch (max) {
  356.             case min: h = 0; break;
  357.             case r:   h = 60 * ( g - b ) / delta;
  358.                       if ( g < b ) { h += 360; }
  359.                       break;
  360.             case g:   h = ( 60 * ( b - r ) / delta ) + 120; break;
  361.             case b:   h = ( 60 * ( r - g ) / delta ) + 240; break;
  362.         }
  363.         s = ( max === 0 ) ? 0 : 1 - ( min / max );
  364.         return [Math.round( h ), s, max];
  365. },
  366. /**
  367.  * Convert a float to decimal
  368.  * @param {Float} n
  369.  * @return {Integer}
  370.  */
  371. realToDec: function( n ) {
  372. return Math.min( 255, Math.round( n * 256 ) );
  373. },
  374. /**
  375.  * Convert RGB color format to Hexa color format
  376.  * @param {Integer/Array( r, g, b )} r
  377.  * @param {Integer} g (optional)
  378.  * @param {Integer} b (optional)
  379.  * @return {String}
  380.  */
  381. rgbToHex: function( r, g, b ) {
  382. if( r instanceof Array ) { return this.rgbToHex.call( this, r[0], r[1], r[2] ); }
  383. return this.decToHex( r ) + this.decToHex( g ) + this.decToHex( b );
  384. },
  385. /**
  386.  * Convert an integer to hexa
  387.  * @param {Integer} n
  388.  * @return {String}
  389.  */
  390. decToHex: function( n ) {
  391. var HCHARS = '0123456789ABCDEF';
  392.         n = parseInt(n, 10);
  393.         n = ( !isNaN( n )) ? n : 0;
  394.         n = (n > 255 || n < 0) ? 0 : n;
  395.         return HCHARS.charAt( ( n - n % 16 ) / 16 ) + HCHARS.charAt( n % 16 );
  396. },
  397. /**
  398.  * Return with position of a character in this.HCHARS string
  399.  * @private
  400.  * @param {Char} c
  401.  * @return {Integer}
  402.  */
  403. getHCharPos: function( c ) {
  404. var HCHARS = '0123456789ABCDEF';
  405. return HCHARS.indexOf( c.toUpperCase() );
  406. },
  407. /**
  408.  * Convert a hexa string to decimal
  409.  * @param {String} hex
  410.  * @return {Integer}
  411.  */
  412. hexToDec: function( hex ) {
  413.         var s = hex.split('');
  414.         return ( ( this.getHCharPos( s[0] ) * 16 ) + this.getHCharPos( s[1] ) );
  415. },
  416. /**
  417.  * Convert a hexa string to RGB color format
  418.  * @param {String} hex
  419.  * @return {Array}
  420.  */
  421. hexToRgb: function( hex ) {
  422. return [ this.hexToDec( hex.substr(0, 2) ), this.hexToDec( hex.substr(2, 2) ), this.hexToDec( hex.substr(4, 2) ) ];
  423. },
  424. /**
  425.  * Convert Y coordinate to HUE value
  426.  * @private
  427.  * @param {Integer} y
  428.  * @return {Integer}
  429.  */
  430. getHue: function( y ) {
  431. var hue = 360 - Math.round( ( ( 181 - y ) / 181 ) * 360 );
  432. return hue === 360 ? 0 : hue;
  433. },
  434. /**
  435.  * Convert HUE value to Y coordinate
  436.  * @private
  437.  * @param {Integer} hue
  438.  * @return {Integer}
  439.  */
  440. getHPos: function( hue ) {
  441. return 181 - hue * ( 181 / 360 );
  442. },
  443. /**
  444.  * Convert X coordinate to Saturation value
  445.  * @private
  446.  * @param {Integer} x
  447.  * @return {Integer}
  448.  */
  449. getSaturation: function( x ) {
  450. return x / 181;
  451. },
  452. /**
  453.  * Convert Saturation value to Y coordinate
  454.  * @private
  455.  * @param {Integer} saturation
  456.  * @return {Integer}
  457.  */
  458. getSPos: function( saturation ) {
  459. return saturation * 181;
  460. },
  461. /**
  462.  * Convert Y coordinate to Brightness value
  463.  * @private
  464.  * @param {Integer} y
  465.  * @return {Integer}
  466.  */
  467. getValue: function( y ) {
  468. return ( 181 - y ) / 181;
  469. },
  470. /**
  471.  * Convert Brightness value to Y coordinate
  472.  * @private
  473.  * @param {Integer} value
  474.  * @return {Integer}
  475.  */
  476. getVPos: function( value ) {
  477. return 181 - ( value * 181 );
  478. },
  479. /**
  480.  * Not documented yet
  481.  */
  482. checkSafeNumber: function( v ) {
  483.     if ( !isNaN( v ) ) {
  484.         v = Math.min( Math.max( 0, v ), 255 );
  485.         var i, next;
  486.         for( i=0; i<256; i=i+51 ) {
  487.             next = i + 51;
  488.             if ( v>=i && v<=next ) { return ( v - i > 25 ) ? next : i; }
  489.         }
  490.     }
  491.     return v;
  492. },
  493. /**
  494.  * Not documented yet
  495.  */
  496. websafe: function( r, g, b ) {
  497. if( r instanceof Array ) { return this.websafe.call( this, r[0], r[1], r[2] ); }
  498. return [this.checkSafeNumber( r ), this.checkSafeNumber( g ), this.checkSafeNumber( b )];
  499. },
  500. /**
  501.  * Not documented yet
  502.  */
  503. invert: function( r, g, b ) {
  504. if( r instanceof Array ) { return this.invert.call( this, r[0], r[1], r[2] ); }
  505. return [255-r,255-g,255-b];
  506. }
  507. });
  508. /**
  509.  *
  510.  */
  511. Ext.ux.ColorDialog = Ext.extend( Ext.Window, {
  512. constructor: function(config){
  513. config = config || {};
  514. Ext.applyIf(config, {
  515. buttons: [{
  516. handler: this.onOk,
  517. scope: this,
  518. text: 'Ok'
  519. },{
  520. handler: this[this.closeAction].createDelegate(this, []),
  521. scope: this,
  522. text: 'Cancel'
  523. }]
  524. });
  525. Ext.ux.ColorDialog.superclass.constructor.apply(this, [config]);
  526. },
  527. initComponent: function() {
  528. this.width = ( !this.width || this.width < 353 ) ? 353 : this.width;
  529. this.applyDefaultsCP();
  530. Ext.ux.ColorDialog.superclass.initComponent.apply( this, arguments );
  531. },
  532. onRender: function() {
  533. Ext.ux.ColorDialog.superclass.onRender.apply( this, arguments );
  534. this.renderComponent();
  535. },
  536. onOk: function(){
  537. //this.selectColor(); // will fire the 'select' event
  538. if(this.callback && this.scope){
  539. this.callback.call( this.scope, this.getColor() );
  540. }
  541. this[this.closeAction]();
  542. },
  543. show : function(hex, cb, scope){ // override the superclass show() so the callback is not called from show()
  544. if(!this.rendered){
  545.             this.render(Ext.getBody());
  546.         }
  547.         if(this.hidden === false){
  548.             this.toFront();
  549.             return;
  550.         }
  551.         if(this.fireEvent("beforeshow", this) === false){
  552.             return;
  553.         }
  554.         if(cb){
  555.             this.callback = cb;
  556.         }
  557.         if(scope){
  558.          this.scope = scope;
  559.         }
  560.         this.hidden = false;
  561.         this.beforeShow();
  562.         this.afterShow();
  563.         hex = hex || '000000';
  564.         this.setColor(hex);
  565. }
  566. });
  567. Ext.applyIf( Ext.ux.ColorDialog.prototype, Ext.ux.ColorPicker.prototype );
  568. /**
  569.  *
  570.  */
  571. Ext.ux.ColorPanel = Ext.extend( Ext.Panel, {
  572. initComponent: function() {
  573. this.width = ( !this.width || this.width < 300 ) ? 300 : this.width;
  574. this.applyDefaultsCP();
  575. Ext.ux.ColorPanel.superclass.initComponent.apply( this, arguments );
  576. },
  577. onRender: function() {
  578. Ext.ux.ColorPanel.superclass.onRender.apply( this, arguments );
  579. this.renderComponent();
  580. }
  581. });
  582. Ext.applyIf( Ext.ux.ColorPanel.prototype, Ext.ux.ColorPicker.prototype );
  583. /**
  584.  * Register Color* for Lazy Rendering
  585.  */
  586. Ext.reg( 'colorpicker', Ext.ux.ColorPicker );
  587. Ext.reg( 'colordialog', Ext.ux.ColorDialog );
  588. Ext.reg( 'colorpanel', Ext.ux.ColorPanel );
  589. /**
  590.  * @class Ext.ux.form.ColorPickerField
  591.  * @extends Ext.form.TriggerField
  592.  * This class makes Ext.ux.ColorPicker available as a form field.
  593.  * @license: BSD
  594.  * @author: Robert B. Williams (extjs id: vtswingkid)
  595.  * @constructor
  596.  * Creates a new ColorPickerField
  597.  * @param {Object} config Configuration options
  598.  * @version 1.1.2
  599.  */
  600. Ext.ux.menu.ColorItem = function(config){
  601. if(!config)config={};
  602. config.style="width:350px;";
  603.     Ext.ux.menu.ColorItem.superclass.constructor.call(this, new Ext.ux.ColorPicker(config), config);
  604.     this.picker = this.component;
  605. this.addEvents('select');
  606.     this.picker.on("render", function(picker){
  607.         picker.getEl().swallowEvent("click");
  608.     });
  609. this.picker.on("select", this.onSelect, this);
  610. };
  611. Ext.extend(Ext.ux.menu.ColorItem, Ext.menu.Adapter, {
  612.     // private
  613.     onSelect : function(picker, color){
  614.         this.fireEvent("select", this, color, picker);
  615.         Ext.ux.menu.ColorItem.superclass.handleClick.call(this);
  616.     }
  617. });
  618. Ext.ux.menu.ColorMenu = function(config){
  619.     Ext.ux.menu.ColorMenu.superclass.constructor.call(this, config);
  620.     this.plain = true;
  621.     var ci = new Ext.ux.menu.ColorItem(config);
  622.     this.add(ci);
  623.     this.picker = ci.picker;
  624.     this.relayEvents(ci, ["select"]);
  625. };
  626. Ext.extend(Ext.ux.menu.ColorMenu, Ext.menu.Menu, {
  627.     beforeDestroy : function() {
  628.         this.picker.destroy();
  629.     }
  630. });