dojox
Version:
Dojo eXtensions, a rollup of many useful sub-projects and varying states of maturity – from very stable and robust, to alpha and experimental. See individual projects contain README files for details.
214 lines (186 loc) • 6.09 kB
JavaScript
define([
"dojo",
"dijit",
"dojox",
"dijit/_base/popup",
"dijit/_Widget",
"dijit/_TemplatedMixin",
"dijit/_WidgetsInTemplateMixin",
"dijit/_editor/_Plugin",
"dijit/TooltipDialog",
"dijit/form/Button",
"dijit/form/DropDownButton",
"dojox/widget/ColorPicker",
"dojo/_base/connect",
"dojo/_base/declare",
"dojo/i18n",
"dojo/i18n!dojox/editor/plugins/nls/TextColor"
], function(dojo, dijit, dojox, popup, _Widget, _TemplatedMixin, _WidgetsInTemplateMixin, _Plugin) {
dojo.experimental("dojox.editor.plugins.TextColor");
var TextColorDropDown = dojo.declare("dojox.editor.plugins._TextColorDropDown", [_Widget, _TemplatedMixin, _WidgetsInTemplateMixin], {
// summary:
// A sample widget that uses/creates a dropdown with a dojox.widget.ColorPicker. Also provides
// passthroughs to the value of the color picker and convenient hook points.
// tags:
// private
// templateString: String
// The template used to create the ColorPicker.
templateString: "<div style='display: none; position: absolute; top: -10000; z-index: -10000'>" +
"<div dojoType='dijit.TooltipDialog' dojoAttachPoint='dialog' class='dojoxEditorColorPicker'>" +
"<div dojoType='dojox.widget.ColorPicker' dojoAttachPoint='_colorPicker'></div>" +
"<br>" +
"<center>" +
"<button dojoType='dijit.form.Button' type='button' dojoAttachPoint='_setButton'>${setButtonText}</button>" +
" " +
"<button dojoType='dijit.form.Button' type='button' dojoAttachPoint='_cancelButton'>${cancelButtonText}</button>" +
"</center>" +
"</div>" +
"</div>",
// widgetsInTemplate: Boolean
// Flag denoting widgets are contained in the template.
widgetsInTemplate: true,
constructor: function(){
// summary:
// Constructor over-ride so that the translated strings are mixsed in so
// the template fills out.
var strings = dojo.i18n.getLocalization("dojox.editor.plugins", "TextColor");
dojo.mixin(this, strings);
},
startup: function(){
// summary:
// Over-ride of startup to do the basic connect setups and such.
if(!this._started){
this.inherited(arguments);
this.connect(this._setButton, "onClick", dojo.hitch(this, function(){
this.onChange(this.get("value"));
}));
this.connect(this._cancelButton, "onClick", dojo.hitch(this, function(){
dijit.popup.close(this.dialog);
this.onCancel();
}));
// Fully statred, so go ahead and remove the hide.
dojo.style(this.domNode, "display", "block");
}
},
_setValueAttr: function(value, priorityChange){
// summary:
// Passthrough function for the color picker value.
// value: String
// The value to set in the color picker
// priorityChange:
// Value to indicate whether or not to trigger an onChange event.
this._colorPicker.set("value", value, priorityChange);
},
_getValueAttr: function(){
// summary:
// Passthrough function for the color picker value.
return this._colorPicker.get("value");
},
onChange: function(value){
// summary:
// Hook point to get the value when the color picker value is selected.
// value: String
// The value from the color picker.
},
onCancel: function(){
// summary:
// Hook point to get when the dialog is canceled.
}
});
var TextColor = dojo.declare("dojox.editor.plugins.TextColor", _Plugin, {
// summary:
// This plugin provides dropdown color pickers for setting text color and background color
// and makes use of the nicer-looking (though not entirely accessible), dojox.widget.ColorPicker.
//
// description:
// The commands provided by this plugin are:
//
// - foreColor - sets the text color
// - hiliteColor - sets the background color
// Override _Plugin.buttonClass to use DropDownButton (with ColorPalette) to control this plugin
buttonClass: dijit.form.DropDownButton,
// False as we do not use the default editor command/click behavior.
useDefaultCommand: false,
constructor: function(){
this._picker = new TextColorDropDown();
dojo.body().appendChild(this._picker.domNode);
this._picker.startup();
this.dropDown = this._picker.dialog;
this.connect(this._picker, "onChange", function(color){
this.editor.execCommand(this.command, color);
});
this.connect(this._picker, "onCancel", function(){
this.editor.focus();
});
},
updateState: function(){
// summary:
// Overrides _Plugin.updateState(). This updates the ColorPalette
// to show the color of the currently selected text.
// tags:
// protected
var _e = this.editor;
var _c = this.command;
if(!_e || !_e.isLoaded || !_c.length){
return;
}
var disabled = this.get("disabled");
var value;
if(this.button){
this.button.set("disabled", disabled);
if(disabled){
return;
}
try{
value = _e.queryCommandValue(_c)|| "";
}catch(e){
//Firefox may throw error above if the editor is just loaded, ignore it
value = "";
}
}
if(value == ""){
value = "#000000";
}
if(value == "transparent"){
value = "#ffffff";
}
if(typeof value == "string"){
//if RGB value, convert to hex value
if(value.indexOf("rgb")> -1){
value = dojo.colorFromRgb(value).toHex();
}
}else{ //it's an integer(IE returns an MS access #)
value =((value & 0x0000ff)<< 16)|(value & 0x00ff00)|((value & 0xff0000)>>> 16);
value = value.toString(16);
value = "#000000".slice(0, 7 - value.length)+ value;
}
if(value !== this._picker.get('value')){
this._picker.set('value', value, false);
}
},
destroy: function(){
// summary:
// Over-ride cleanup function.
this.inherited(arguments);
this._picker.destroyRecursive();
delete this._picker;
}
});
// For monkey-patching
TextColor._TextColorDropDown = TextColorDropDown;
// Register this plugin. Uses the same name as the dijit one, so you
// use one or the other, not both.
dojo.subscribe(dijit._scopeName + ".Editor.getPlugin", null, function(o){
if(o.plugin){
return;
}
switch(o.args.name){
case "foreColor":
case "hiliteColor":
o.plugin = new TextColor({
command: o.args.name
});
}
});
return TextColor;
});