diff options
Diffstat (limited to 'includes/js/dijit/_editor/plugins/FontChoice.js')
-rw-r--r-- | includes/js/dijit/_editor/plugins/FontChoice.js | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/includes/js/dijit/_editor/plugins/FontChoice.js b/includes/js/dijit/_editor/plugins/FontChoice.js new file mode 100644 index 0000000..642237b --- /dev/null +++ b/includes/js/dijit/_editor/plugins/FontChoice.js @@ -0,0 +1,167 @@ +if(!dojo._hasResource["dijit._editor.plugins.FontChoice"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dijit._editor.plugins.FontChoice"] = true; +dojo.provide("dijit._editor.plugins.FontChoice"); + +dojo.require("dijit._editor._Plugin"); +dojo.require("dijit.form.FilteringSelect"); +dojo.require("dojo.data.ItemFileReadStore"); +dojo.require("dojo.i18n"); + +dojo.requireLocalization("dijit._editor", "FontChoice", null, "zh,pt,da,tr,ru,de,sv,ja,he,ROOT,fi,nb,el,ar,pt-pt,cs,fr,es,ko,nl,zh-tw,pl,it,hu"); + +dojo.declare("dijit._editor.plugins.FontChoice", + dijit._editor._Plugin, + { + // summary: + // This plugin provides three dropdowns for setting font information in the editor + // + // description: + // The commands provided by this plugin are: + // + // * fontName + // | Provides a dropdown to select from a list of generic font names + // * fontSize + // | Provides a dropdown to select from a list of pre-defined font sizes + // * formatBlock + // | Provides a dropdown to select from a list of styles + // | + // + // which can easily be added to an editor by including one or more of the above commands + // in the `plugins` attribute as follows: + // + // | plugins="['fontName','fontSize',...]" + // + // It is possible to override the default dropdown list by providing an Array for the `custom` property when + // instantiating this plugin, e.g. + // + // | plugins="[{name:'dijit._editor.plugins.FontChoice', command:'fontName', custom:['Verdana','Myriad','Garamond']},...]" + // + // Alternatively, for `fontName` only, `generic:true` may be specified to provide a dropdown with + // [CSS generic font families](http://www.w3.org/TR/REC-CSS2/fonts.html#generic-font-families) + // + // Note that the editor is often unable to properly handle font styling information defined outside + // the context of the current editor instance, such as pre-populated HTML. + + _uniqueId: 0, + + buttonClass: dijit.form.FilteringSelect, + + _initButton: function(){ + //TODO: would be nice to be able to handle comma-separated font lists and search within them + var cmd = this.command; + var names = this.custom || + { + fontName: this.generic ? ["serif", "sans-serif", "monospace", "cursive", "fantasy"] : // CSS font-family generics + ["Arial", "Times New Roman", "Comic Sans MS", "Courier New"], + fontSize: [1,2,3,4,5,6,7], // sizes according to the old HTML FONT SIZE + formatBlock: ["p", "h1", "h2", "h3", "pre"] + }[cmd]; + var strings = dojo.i18n.getLocalization("dijit._editor", "FontChoice"); + var items = dojo.map(names, function(value){ + var name = strings[value] || value; + var label = name; + switch(cmd){ + case "fontName": + label = "<div style='font-family: "+value+"'>" + name + "</div>"; + break; + case "fontSize": + // we're stuck using the deprecated FONT tag to correspond with the size measurements used by the editor + label = "<font size="+value+"'>"+name+"</font>"; + break; + case "formatBlock": + label = "<" + value + ">" + name + "</" + value + ">"; + } + return { label: label, name: name, value: value }; + }); + items.push({label: "", name:"", value:""}); // FilteringSelect doesn't like unmatched blank strings + + dijit._editor.plugins.FontChoice.superclass._initButton.apply(this, + [{ labelType: "html", labelAttr: "label", searchAttr: "name", store: new dojo.data.ItemFileReadStore( + { data: { identifier: "value", items: items } })}]); + + this.button.setValue(""); + + this.connect(this.button, "onChange", function(choice){ + if(this.updating){ return; } + // FIXME: IE is really messed up here!! + if(dojo.isIE && "_savedSelection" in this){ + var b = this._savedSelection; + delete this._savedSelection; + this.editor.focus(); + this.editor._moveToBookmark(b); + }else{ +// this.editor.focus(); + dijit.focus(this._focusHandle); + } + if(this.command == "fontName" && choice.indexOf(" ") != -1){ choice = "'" + choice + "'"; } + this.editor.execCommand(this.editor._normalizeCommand(this.command), choice); + }); + }, + + updateState: function(){ + this.inherited(arguments); + var _e = this.editor; + var _c = this.command; + if(!_e || !_e.isLoaded || !_c.length){ return; } + if(this.button){ + var value = _e.queryCommandValue(this.editor._normalizeCommand(_c)) || ""; + // strip off single quotes, if any + var quoted = dojo.isString(value) && value.match(/'([^']*)'/); + if(quoted){ value = quoted[1]; } +//console.log("selected " + value); + if(this.generic && _c == "fontName"){ + var map = { + "Arial": "sans-serif", + "Helvetica": "sans-serif", + "Myriad": "sans-serif", + "Times": "serif", + "Times New Roman": "serif", + "Comic Sans MS": "cursive", + "Apple Chancery": "cursive", + "Courier": "monospace", + "Courier New": "monospace", + "Papyrus": "fantasy" +// ,"????": "fantasy" TODO: IE doesn't map fantasy font-family? + }; +//console.log("mapped to " + map[value]); + value = map[value] || value; + }else if(_c == "fontSize" && value.indexOf && value.indexOf("px") != -1){ + var pixels = parseInt(value); + value = {10:1, 13:2, 16:3, 18:4, 24:5, 32:6, 48:7}[pixels] || value; + } + this.updating = true; + this.button.setValue(value); + delete this.updating; + } + + // FIXME: IE is *really* b0rken + if(dojo.isIE){ + this._savedSelection = this.editor._getBookmark(); + } + this._focusHandle = dijit.getFocus(this.editor.iframe); + }, + + setToolbar: function(){ + this.inherited(arguments); + + var forRef = this.button; + if(!forRef.id){ forRef.id = dijit._scopeName+"EditorButton-"+this.command+(this._uniqueId++); } //TODO: is this necessary? FilteringSelects always seem to have an id? + var label = dojo.doc.createElement("label"); + dojo.addClass(label, "dijit dijitReset dijitLeft dijitInline"); + label.setAttribute("for", forRef.id); + var strings = dojo.i18n.getLocalization("dijit._editor", "FontChoice"); + label.appendChild(dojo.doc.createTextNode(strings[this.command])); + dojo.place(label, this.button.domNode, "before"); + } + } +); + +dojo.subscribe(dijit._scopeName + ".Editor.getPlugin",null,function(o){ + if(o.plugin){ return; } + switch(o.args.name){ + case "fontName": case "fontSize": case "formatBlock": + o.plugin = new dijit._editor.plugins.FontChoice({command: o.args.name}); + } +}); + +} |