/* Copyright (c) 2011, Geert Bergman (geert@scrivo.nl)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of "Scrivo" nor the names of its contributors may be
* used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* $Id: RGBColorPicker.js 616 2013-04-22 23:48:38Z geert $
*/
"use strict";
SUI.control.RGBColorPicker = SUI.defineClass(
/** @lends SUI.control.RGBColorPicker.prototype */{
/** @ignore */ baseClass: SUI.AnchorLayout,
/**
* @class
* SUI.control.RGBColorPicker is a control for selection colors by setting
* the red, green and blue components of the color separately: thus
* blending the color yourself. It is also possible to set the HTML color
* code directly and direct visual feedback of the created color is
* provided.
*
* @augments SUI.AnchorLayout
*
* @description
* Create an RGB color picker control.
*
* @constructs
* @param see base class
* @param {Function} arg.onChange Listener function that is executed each
* time the control's color selection changes.
*/
initializer: function(arg) {
SUI.control.RGBColorPicker.initializeBase(this, arg);
// Set the size of the control
this.width(this.WIDTH);
this.height(this.HEIGHT);
var that = this;
// start at the top
var top = this.PADDING;
// create a red intensity bar and a label
this._red = new SUI.control.ColorIntensityBar({
top: top,
right: this.PADDING,
anchor: {right: true},
color: "r",
onChange: function(c) {
that._setColor();
that.callListener("onChange", that._color);
}
});
this._lblRed = new SUI.form.Label({
width: this.LABEL_WIDTH,
left: this.PADDING,
top: top,
title: SUI.i18n.rgbRed
});
// move to next row
top += this.ROW_HEIGHT;
// create a green intensity bar and a label
this._green = new SUI.control.ColorIntensityBar({
top: top,
right: this.PADDING,
anchor: {right: true},
color: "g",
onChange: function(c) {
that._setColor();
that.callListener("onChange", that._color);
}
});
this._lblGreen = new SUI.form.Label({
width: this.LABEL_WIDTH,
left: this.PADDING,
top: top,
title: SUI.i18n.rgbGreen
});
// move to next row
top += this.ROW_HEIGHT;
// create a blue intensity bar and a label
this._blue = new SUI.control.ColorIntensityBar({
top: top,
right: this.PADDING,
anchor: {right: true},
color: "b",
onChange: function(c) {
that._setColor();
that.callListener("onChange", that._color);
}
});
this._lblBlue = new SUI.form.Label({
width: this.LABEL_WIDTH,
left: this.PADDING,
top: top,
title: SUI.i18n.rgbBlue
});
// move to next row
top += this.ROW_HEIGHT;
// create an input box and label for the HTML color code
this._inpCode = new SUI.form.Input({
width: this.COLBOX_WIDTH,
right: this.PADDING,
top: top,
anchor: {right: true}
});
this._inpCode.el().maxLength = 7;
this._inpCode.el().style.textAlign = "right";
this._inpCode.el().style.fontFamily = "mono";
this._lblCode = new SUI.form.Label({
width: this.LABEL_WIDTH,
left: this.LABEL_LEFT,
top: top,
forBox: this._inpCode,
title: SUI.i18n.hsvCode
});
// after entering the color set control's color selection so that
// it will reflect the changes
SUI.browser.addEventListener(this._inpCode.el(), "blur",
function(e) {
that.colorCode(this.value);
that.callListener("onChange", that._color);
SUI.browser.noPropagation(e);
}
);
// move to next row
top += this.ROW_HEIGHT;
// create a colored box and label to display the color
this._boxCol = new SUI.Box({
width: this.COLBOX_WIDTH,
height: this.COLBOX_HEIGHT,
right: this.PADDING,
top: top,
anchor: {right: true}
});
this._boxCol.border(new SUI.Border(1));
this._boxCol.el().style.borderColor = "black";
this._lblColor = new SUI.form.Label({
width: this.LABEL_WIDTH,
left: this.LABEL_LEFT,
top: top,
title: SUI.i18n.hsvColor
});
// set the onChange listener
if (arg.onChange) {
this.addListener("onChange", arg.onChange);
}
// now add all components to the control's container box
this.add(this._lblRed);
this.add(this._lblGreen);
this.add(this._lblBlue);
this.add(this._lblCode);
this.add(this._lblColor);
this.add(this._red);
this.add(this._green);
this.add(this._blue);
this.add(this._inpCode);
this.add(this._boxCol);
// set the default color of the control
this.colorCode(this._color);
},
/**
* The height of the boxes in which the color an HTML color code are shown.
*/
COLBOX_HEIGHT: 20,
/**
* The Width of the boxes in which the color an HTML color code are shown.
*/
COLBOX_WIDTH: 64,
/**
* The total height of the control.
*/
HEIGHT: 158,
/**
* The left position of the labels.
*/
LABEL_LEFT: 200,
/**
* The width of the labels.
*/
LABEL_WIDTH: 100,
/**
* The padding of the control.
*/
PADDING: 15,
/**
* The row height for the rows with hue, saturation, value and color boxes.
*/
ROW_HEIGHT: 27,
/**
* The total width of the control.
*/
WIDTH: 335,
/**
* Set or get the HTML color code selection of the control.
* @param {String} val An HTML color code (#FF7700), or none to get the
* current color selection from the control.
* @return {String} An HTML color code (#FF7700), if no argument was given
* this method acts as a getter and value will be returned.
*/
colorCode: function(val) {
if (val == undefined) {
return this._hsv.colorCode();
}
// got here? the method is a setter
// strip the # of the color value and try to convert it to a number ...
var v = parseInt(val.substr(1), 16);
// ... if that works and the is in the valid range ...
if (!isNaN(v) && (v >= 0 && v <= 0xFFFFFF)) {
var c = SUI.color.colToRgb(val);
// ... set the rgb intensity bars ...
this._red.value(c.r);
this._green.value(c.g);
this._blue.value(c.b);
// ... and set the color from the bar settings
this._setColor();
} else {
// ... throw an exception
throw "SUI.control.RGBColorPicker: colorCode, invalid color";
}
return null;
},
// the blue intensity bar
_blue: null,
// the color picker's color selection
_color: "#CCCCCC",
// box to display the selected color
_boxCol: null,
// the gree intensity bar
_green: null,
// the input field to enter the color code directly
_inpCode: null,
// label for the blue intensity bar
_lblBlue: null,
// label for color code input field
_lblCode: null,
// label for the color display box
_lblColor: null,
// label for the green intensity bar
_lblGreen: null,
// label for the red intensity bar
_lblRed: null,
// the red intensity bar
_red: null,
// set the control's color: set the inensity value of the three color
// bars, set the color input field and color display box. If requested
_setColor: function() {
// set the selected color, ...
this._color = SUI.color.rgbToCol({
r: this._red.value(),
g: this._green.value(),
b: this._blue.value()
});
// ... set color code in the input field ...
this._inpCode.el().value = this._color.toUpperCase();
// ... and display the color in the color box
this._boxCol.el().style.backgroundColor = this._color;
}
});