www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | Submodules | README | LICENSE

commit d2118dc5fc90e4ee6e48deb2608e028f4c31da4d
parent 692cc31ad545732dfc3ba0856adde520ecef00c1
Author: Dan Stillman <dstillman@zotero.org>
Date:   Sat, 25 Oct 2008 10:47:01 +0000

Apparently we still use this (in csledit.xul and cslpreview.xul)


Diffstat:
Achrome/content/zotero/bindings/timedtextarea.xml | 294+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 294 insertions(+), 0 deletions(-)

diff --git a/chrome/content/zotero/bindings/timedtextarea.xml b/chrome/content/zotero/bindings/timedtextarea.xml @@ -0,0 +1,293 @@ +<?xml version="1.0"?> +<!-- + A combination of Mozilla's textarea, timed-textbox, input-box, and + input-box-spell bindings, with the timed-textbox's Return key + event handler removed + + Note: It would be much nicer if a) Mozilla offered this natively or + b) we just extended the timed-textbox binding directly, but since it's based + on html:input rather than html:textarea, doing so breaks things in various + ways (though it may be possible with some tweaking) + + Also note: spellcheck code here is a slightly adjusted version + of a patch by Neil Deakin on Bugzilla that wasn't approved in time for + Firefox 2.0 (https://bugzilla.mozilla.org/show_bug.cgi?id=346787). + When there's native support for spellcheck="true" in XUL, we'll hopefully be + able to use that, though it'll still need to work as a timed textarea... +--> + +<!DOCTYPE bindings [ + <!ENTITY % textcontextDTD SYSTEM "chrome://global/locale/textcontext.dtd" > + %textcontextDTD; + + <!-- These aren't yet included in textcontext.dtd in Minefield, so we reproduce them here + (rather than including the massive browser.dtd) --> + <!ENTITY spellAddToDictionary.label "Add to dictionary"> + <!ENTITY spellAddToDictionary.accesskey "o"> + <!ENTITY spellEnable.label "Spell check this field"> + <!ENTITY spellEnable.accesskey "S"> + <!ENTITY spellNoSuggestions.label "(No spelling suggestions)"> + <!ENTITY spellDictionaries.label "Languages"> + <!ENTITY spellDictionaries.accesskey "l"> + <!ENTITY spellAddDictionaries.label "Add dictionaries..."> + <!ENTITY spellAddDictionaries.accesskey "A"> +]> + +<bindings xmlns="http://www.mozilla.org/xbl" + xmlns:html="http://www.w3.org/1999/xhtml" + xmlns:xbl="http://www.mozilla.org/xbl" + xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> + <binding id="timed-textarea" extends="chrome://global/content/bindings/textbox.xml#textbox"> + <implementation> + <field name="mInputField">null</field> + <property name="inputField" readonly="true"> + <getter><![CDATA[ + if (!this.mInputField) + this.mInputField = document.getAnonymousElementByAttribute(this, "anonid", "input"); + return this.mInputField; + ]]></getter> + </property> + + <field name="_timer">null</field> + <property name="timeout" + onset="this.setAttribute('timeout', val); return val;" + onget="return parseInt(this.getAttribute('timeout')) || 0;"/> + <property name="value"> + <getter> + return this.inputField.value; + </getter> + <setter> + <![CDATA[ + this.inputField.value = val; + if (this._timer) + clearTimeout(this._timer); + return val; + ]]> + </setter> + </property> + <method name="_fireCommand"> + <parameter name="me"/> + <body> + <![CDATA[ + me._timer = null; + me.doCommand(); + ]]> + </body> + </method> + + + <!-- Spellcheck code --> + <field name="_spellCheckInitialized">false</field> + <property name="spellCheckerUI" readonly="true"> + <getter><![CDATA[ + if (!this._spellCheckInitialized) { + this._spellCheckInitialized = true; + + const CI = Components.interfaces; + if (!document instanceof CI.nsIDOMXULDocument) + return null; + + var textbox = this; + + if (!textbox || !textbox instanceof CI.nsIDOMXULTextBoxElement) + return null; + + try { + var loader = Components.classes["@mozilla.org/moz/jssubscript-loader;1"]. + getService(CI.mozIJSSubScriptLoader); + loader.loadSubScript("chrome://global/content/inlineSpellCheckUI.js", this); + + if ("InlineSpellCheckerUI" in this) + this.InlineSpellCheckerUI.init( + textbox.inputField.QueryInterface(CI.nsIDOMNSEditableElement).editor + ); + } catch(ex) { + // this throws an error on window open... + } + } + + return this.InlineSpellCheckerUI; + ]]></getter> + </property> + + <constructor> + <![CDATA[ + // can't initialize the spell checker in the constructor as not + // everything is initialized and the editor will fail to create the + // inline spell checker object + setTimeout(this._delayedInitSpellCheck, 0, this) + + // oninput doesn't seem to fire on text drag + this.inputField.addEventListener('dragdrop', function(event) { + document.getBindingParent(event.target).doInput(); + }, false); + ]]> + </constructor> + + <method name="_delayedInitSpellCheck"> + <parameter name="me"/> + <body><![CDATA[ + var spellui = me.spellCheckerUI; + if (spellui) + spellui.enabled = true; + ]]></body> + </method> + + <method name="_doPopupItemEnabling"> + <parameter name="popupNode"/> + <body> + <![CDATA[ + var children = popupNode.childNodes; + for (var i = 0; i < children.length; i++) { + var command = children[i].getAttribute("cmd"); + if (command) { + var controller = document.commandDispatcher.getControllerForCommand(command); + var enabled = controller.isCommandEnabled(command); + if (enabled) { + children[i].removeAttribute("disabled"); + } + else { + children[i].setAttribute("disabled", "true"); + } + } + } + ]]> + </body> + </method> + + <method name="_doPopupItemEnablingSpell"> + <parameter name="popupNode"/> + <body> + <![CDATA[ + var spellui = this.spellCheckerUI; + if (!spellui || !spellui.canSpellCheck) { + this._setMenuItemVisibility("spell-no-suggestions", false); + this._setMenuItemVisibility("spell-check-enabled", false); + this._setMenuItemVisibility("spell-check-separator", false); + this._setMenuItemVisibility("spell-add-to-dictionary", false); + this._setMenuItemVisibility("spell-suggestions-separator", false); + this._setMenuItemVisibility("spell-dictionaries", false); + return; + } + + spellui.initFromEvent(document.popupRangeParent, + document.popupRangeOffset); + + var enabled = spellui.enabled; + document.getAnonymousElementByAttribute(this, "anonid", + "spell-check-enabled").setAttribute("checked", enabled); + + var overMisspelling = spellui.overMisspelling; + this._setMenuItemVisibility("spell-add-to-dictionary", overMisspelling); + this._setMenuItemVisibility("spell-suggestions-separator", overMisspelling); + + // suggestion list + var suggestionsSeparator = document.getAnonymousElementByAttribute(this, + "anonid", "spell-add-to-dictionary"); + var numsug = spellui.addSuggestionsToMenu(popupNode, suggestionsSeparator, 5); + this._setMenuItemVisibility("spell-no-suggestions", overMisspelling && numsug == 0); + + // dictionary list + var dictmenu = document.getAnonymousElementByAttribute(this, "anonid", + "spell-dictionaries-menu"); + var addsep = document.getAnonymousElementByAttribute(this, "anonid", + "spell-language-separator"); + + var numdicts = spellui.addDictionaryListToMenu(dictmenu, addsep); + this._setMenuItemVisibility("spell-dictionaries", enabled); + + this._doPopupItemEnabling(popupNode); + ]]> + </body> + </method> + + <method name="_doPopupItemDisabling"> + <body><![CDATA[ + if (this.spellCheckerUI) { + this.spellCheckerUI.clearSuggestionsFromMenu(); + this.spellCheckerUI.clearDictionaryListFromMenu(); + } + ]]></body> + </method> + + <method name="_setMenuItemVisibility"> + <parameter name="anonid"/> + <parameter name="visible"/> + <body><![CDATA[ + document.getAnonymousElementByAttribute(this, "anonid", anonid). + hidden = ! visible; + ]]></body> + </method> + + + <method name="doTextCommand"> + <parameter name="command"/> + <body> + <![CDATA[ + var controller = document.commandDispatcher.getControllerForCommand(command); + controller.doCommand(command); + ]]> + </body> + </method> + + <method name="doInput"> + <body> + <![CDATA[ + if (this._timer) { + clearTimeout(this._timer); + } + this._timer = this.timeout && setTimeout(this._fireCommand, this.timeout, this); + ]]> + </body> + </method> + </implementation> + + + <handlers> + <handler event="input"> + <![CDATA[ + this.doInput(); + ]]> + </handler> + </handlers> + + + <content context="_child"> + <xul:hbox class="textbox-input-box" flex="1"> + <html:textarea class="textbox-textarea" flex="1" anonid="input" + xbl:inherits="onfocus,onblur,xbl:text=value,disabled,tabindex,rows,cols,readonly,wrap"><children/></html:textarea> + <xul:menupopup anonid="input-box-contextmenu" + onpopupshowing="if (document.commandDispatcher.focusedElement != this.parentNode.firstChild) { this.parentNode.firstChild.focus(); } this.parentNode.parentNode._doPopupItemEnablingSpell(this);" + onpopuphiding="this.parentNode.parentNode._doPopupItemDisabling(this);" + oncommand="var cmd = event.originalTarget.getAttribute('cmd'); if(cmd) { this.parentNode.parentNode.doTextCommand(cmd); event.stopPropagation(); }"> + <xul:menuitem label="&spellNoSuggestions.label;" anonid="spell-no-suggestions" disabled="true"/> + <xul:menuitem label="&spellAddToDictionary.label;" accesskey="&spellAddToDictionary.accesskey;" anonid="spell-add-to-dictionary" + oncommand="this.parentNode.parentNode.parentNode.spellCheckerUI.addToDictionary();"/> + <xul:menuseparator anonid="spell-suggestions-separator"/> + <xul:menuitem label="&undoCmd.label;" accesskey="&undoCmd.accesskey;" cmd="cmd_undo"/> + <xul:menuseparator/> + <xul:menuitem label="&cutCmd.label;" accesskey="&cutCmd.accesskey;" cmd="cmd_cut"/> + <xul:menuitem label="&copyCmd.label;" accesskey="&copyCmd.accesskey;" cmd="cmd_copy"/> + <xul:menuitem label="&pasteCmd.label;" accesskey="&pasteCmd.accesskey;" cmd="cmd_paste"/> + <xul:menuitem label="&deleteCmd.label;" accesskey="&deleteCmd.accesskey;" cmd="cmd_delete"/> + <xul:menuseparator/> + <xul:menuitem label="&selectAllCmd.label;" accesskey="&selectAllCmd.accesskey;" cmd="cmd_selectAll"/> + <xul:menuseparator anonid="spell-check-separator"/> + <xul:menuitem label="&spellEnable.label;" type="checkbox" accesskey="&spellEnable.accesskey;" anonid="spell-check-enabled" + oncommand="this.parentNode.parentNode.parentNode.spellCheckerUI.toggleEnabled();"/> + <xul:menu label="&spellDictionaries.label;" accesskey="&spellDictionaries.accesskey;" anonid="spell-dictionaries"> + <xul:menupopup anonid="spell-dictionaries-menu" + onpopupshowing="event.stopPropagation();" + onpopuphiding="event.stopPropagation();"> + <xul:menuseparator anonid="spell-language-separator"/> + <xul:menuitem anonid="spell-add-dictionaries-main" label="&spellAddDictionaries.label;" + accesskey="&spellAddDictionaries.accesskey;" + oncommand="nsContextMenu.prototype.addDictionaries();"/> + </xul:menupopup> + </xul:menu> + </xul:menupopup> + </xul:hbox> + + </content> + </binding> +</bindings> +\ No newline at end of file