toolkit/content/widgets/wizard.xml

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 <?xml version="1.0"?>
     2 <!-- This Source Code Form is subject to the terms of the Mozilla Public
     3    - License, v. 2.0. If a copy of the MPL was not distributed with this
     4    - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
     7 <!DOCTYPE bindings [
     8   <!ENTITY % wizardDTD SYSTEM "chrome://global/locale/wizard.dtd">
     9   %wizardDTD;
    10 ]>
    12 <bindings id="wizardBindings"
    13    xmlns="http://www.mozilla.org/xbl"
    14    xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
    15    xmlns:xbl="http://www.mozilla.org/xbl">
    17   <binding id="wizard-base">
    18     <resources>
    19       <stylesheet src="chrome://global/skin/wizard.css"/>
    20     </resources>
    21   </binding>
    23   <binding id="wizard" extends="chrome://global/content/bindings/general.xml#root-element">
    24     <resources>
    25       <stylesheet src="chrome://global/skin/wizard.css"/>
    26     </resources>
    27     <content>
    28       <xul:hbox class="wizard-header" anonid="Header"/>
    30       <xul:deck class="wizard-page-box" flex="1" anonid="Deck">
    31         <children includes="wizardpage"/>
    32       </xul:deck>
    33       <children/>
    35       <xul:hbox class="wizard-buttons" anonid="Buttons" xbl:inherits="pagestep,firstpage,lastpage"/>
    36     </content>
    38     <implementation>
    39       <property name="title" onget="return document.title;"
    40                              onset="return document.title = val;"/>
    42       <property name="canAdvance" onget="return this._canAdvance;"
    43                                   onset="this._nextButton.disabled = !val; return this._canAdvance = val;"/>
    44       <property name="canRewind" onget="return this._canRewind;"
    45                                  onset="this._backButton.disabled = !val; return this._canRewind = val;"/>
    47       <property name="pageStep" readonly="true" onget="return this._pageStack.length"/>
    49       <field name="pageCount">0</field>
    51       <field name="_accessMethod">null</field>
    52       <field name="_pageStack">null</field>
    53       <field name="_currentPage">null</field>
    55       <property name="wizardPages">
    56         <getter>
    57         <![CDATA[
    58           var xulns = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
    59           return this.getElementsByTagNameNS(xulns, "wizardpage");
    60         ]]>
    61         </getter>
    62       </property>
    64       <property name="currentPage" onget="return this._currentPage">
    65         <setter>
    66         <![CDATA[
    67           if (!val)
    68             return val;
    70           this._currentPage = val;
    72           // Setting this attribute allows wizard's clients to dynamically
    73           // change the styles of each page based on purpose of the page. 
    74           this.setAttribute("currentpageid", val.pageid);
    76           if (this.onFirstPage) {
    77             this.canRewind = false;
    78             this.setAttribute("firstpage", "true");
    79 #ifdef XP_UNIX
    80 #ifndef XP_MACOSX
    81             this._backButton.setAttribute('hidden', 'true');
    82 #endif
    83 #endif
    84           } else {
    85             this.canRewind = true;
    86             this.setAttribute("firstpage", "false");
    87 #ifdef XP_UNIX
    88 #ifndef XP_MACOSX
    89             this._backButton.setAttribute('hidden', 'false');
    90 #endif
    91 #endif
    92           }
    94           if (this.onLastPage) {
    95             this.canAdvance = true;
    96             this.setAttribute("lastpage", "true");
    97           } else {
    98             this.setAttribute("lastpage", "false");
    99           }
   101           this._deck.setAttribute("selectedIndex", val.pageIndex);
   102           this._advanceFocusToPage(val);
   104           this._adjustWizardHeader();
   105           this._wizardButtons.onPageChange();
   107           this._fireEvent(val, "pageshow");
   109           return val;
   110         ]]>
   111         </setter>
   112       </property>
   114       <property name="pageIndex"
   115                 onget="return this._currentPage ? this._currentPage.pageIndex : -1;">
   116         <setter>
   117         <![CDATA[
   118           if (val < 0 || val >= this.pageCount)
   119             return val;
   121           var page = this.wizardPages[val];
   122           this._pageStack[this._pageStack.length-1] = page;
   123           this.currentPage = page;
   125           return val;
   126         ]]>
   127         </setter>
   128       </property>
   130       <property name="onFirstPage" readonly="true"
   131                 onget="return this._pageStack.length == 1;"/>
   133       <property name="onLastPage" readonly="true">
   134         <getter><![CDATA[
   135           var cp = this.currentPage;
   136           return cp && ((this._accessMethod == "sequential" && cp.pageIndex == this.pageCount-1) ||
   137                        (this._accessMethod == "random" && cp.next == ""));
   138          ]]></getter>
   139       </property>
   141       <method name="getButton">
   142         <parameter name="aDlgType"/>
   143         <body>
   144         <![CDATA[
   145           var btns = this.getElementsByAttribute("dlgtype", aDlgType);
   146           return btns.item(0) ? btns[0] : document.getAnonymousElementByAttribute(this._wizardButtons, "dlgtype", aDlgType);
   147         ]]>
   148         </body>
   149       </method>
   151       <field name="_canAdvance"/>
   152       <field name="_canRewind"/>
   153       <field name="_wizardHeader"/>
   154       <field name="_wizardButtons"/>
   155       <field name="_deck"/>
   156       <field name="_backButton"/>
   157       <field name="_nextButton"/>
   158       <field name="_cancelButton"/>
   160       <!-- functions to be added as oncommand listeners to the wizard buttons -->
   161       <field name="_backFunc">(function() { document.documentElement.rewind(); })</field>
   162       <field name="_nextFunc">(function() { document.documentElement.advance(); })</field>
   163       <field name="_finishFunc">(function() { document.documentElement.advance(); })</field>
   164       <field name="_cancelFunc">(function() { document.documentElement.cancel(); })</field>
   165       <field name="_extra1Func">(function() { document.documentElement.extra1(); })</field>
   166       <field name="_extra2Func">(function() { document.documentElement.extra2(); })</field>
   168       <field name="_closeHandler">(function(event) {
   169         if (document.documentElement.cancel())
   170           event.preventDefault();
   171       })</field>
   173       <constructor><![CDATA[
   174         this._canAdvance = true;
   175         this._canRewind = false;
   176         this._hasLoaded = false;
   178         this._pageStack = [];
   180         try {
   181           // need to create string bundle manually instead of using <xul:stringbundle/>
   182           // see bug 63370 for details
   183           this._bundle = Components.classes["@mozilla.org/intl/stringbundle;1"]
   184                                    .getService(Components.interfaces.nsIStringBundleService)
   185                                    .createBundle("chrome://global/locale/wizard.properties");
   186         } catch (e) {
   187           // This fails in remote XUL, which has to provide titles for all pages
   188           // see bug 142502
   189         }
   191         // get anonymous content references
   192         this._wizardHeader = document.getAnonymousElementByAttribute(this, "anonid", "Header");
   193         this._wizardButtons = document.getAnonymousElementByAttribute(this, "anonid", "Buttons");
   194         this._deck = document.getAnonymousElementByAttribute(this, "anonid", "Deck");
   196         this._initWizardButton("back");
   197         this._initWizardButton("next");
   198         this._initWizardButton("finish");
   199         this._initWizardButton("cancel");
   200         this._initWizardButton("extra1");
   201         this._initWizardButton("extra2");
   203         this._initPages();
   205         window.addEventListener("close", this._closeHandler, false);
   207         // start off on the first page
   208         this.pageCount = this.wizardPages.length;
   209         this.advance();
   211         // give focus to the first focusable element in the dialog
   212         window.addEventListener("load", this._setInitialFocus, false);
   213       ]]></constructor>
   215       <method name="getPageById">
   216         <parameter name="aPageId"/>
   217         <body><![CDATA[
   218           var els = this.getElementsByAttribute("pageid", aPageId);
   219           return els.item(0);
   220         ]]></body>
   221       </method>
   223       <method name="extra1">
   224         <body><![CDATA[
   225           if (this.currentPage) 
   226             this._fireEvent(this.currentPage, "extra1");
   227         ]]></body>
   228       </method>
   230       <method name="extra2">
   231         <body><![CDATA[
   232           if (this.currentPage) 
   233             this._fireEvent(this.currentPage, "extra2");
   234         ]]></body>
   235       </method>
   237       <method name="rewind">
   238         <body><![CDATA[
   239           if (!this.canRewind)
   240             return;
   242           if (this.currentPage && !this._fireEvent(this.currentPage, "pagehide"))
   243             return;
   245           if (this.currentPage && !this._fireEvent(this.currentPage, "pagerewound"))
   246             return;
   248           if (!this._fireEvent(this, "wizardback"))
   249             return;
   252           this._pageStack.pop();
   253           this.currentPage = this._pageStack[this._pageStack.length-1];
   254           this.setAttribute("pagestep", this._pageStack.length);
   255         ]]></body>
   256       </method>
   258       <method name="advance">
   259         <parameter name="aPageId"/>
   260         <body><![CDATA[
   261           if (!this.canAdvance)
   262             return; 
   264           if (this.currentPage && !this._fireEvent(this.currentPage, "pagehide"))
   265             return;
   267           if (this.currentPage && !this._fireEvent(this.currentPage, "pageadvanced"))
   268             return;
   270           if (this.onLastPage && !aPageId) {
   271             if (this._fireEvent(this, "wizardfinish"))
   272               window.setTimeout(function() {window.close();}, 1);
   273           } else {
   274             if (!this._fireEvent(this, "wizardnext"))
   275               return; 
   277             var page;
   278             if (aPageId)
   279               page = this.getPageById(aPageId);
   280             else {
   281               if (this.currentPage) {
   282                 if (this._accessMethod == "random")
   283                   page = this.getPageById(this.currentPage.next);
   284                 else
   285                   page = this.wizardPages[this.currentPage.pageIndex+1];
   286               } else
   287                 page = this.wizardPages[0];
   288             }
   290             if (page) {
   291               this._pageStack.push(page);
   292               this.setAttribute("pagestep", this._pageStack.length);
   294               this.currentPage = page;
   295             }
   296           }
   297         ]]></body>
   298       </method>
   300       <method name="goTo">
   301         <parameter name="aPageId"/>
   302         <body><![CDATA[
   303           var page = this.getPageById(aPageId);
   304           if (page) {
   305             this._pageStack[this._pageStack.length-1] = page;
   306             this.currentPage = page;
   307           }
   308         ]]></body>
   309       </method>
   311       <method name="cancel">
   312         <body><![CDATA[
   313           if (!this._fireEvent(this, "wizardcancel"))
   314             return true;
   316           window.close();
   317           window.setTimeout(function() {window.close();}, 1);
   318           return false;
   319         ]]></body>
   320       </method>
   322       <method name="_setInitialFocus">
   323         <parameter name="aEvent"/>
   324         <body>
   325         <![CDATA[
   326           document.documentElement._hasLoaded = true;
   327           var focusInit = 
   328             function() {
   329               // give focus to the first focusable element in the dialog
   330               if (!document.commandDispatcher.focusedElement)
   331                 document.commandDispatcher.advanceFocusIntoSubtree(document.documentElement);
   333               try {
   334                 var button =
   335                       document.documentElement._wizardButtons.defaultButton;
   336                 if (button)
   337                   window.notifyDefaultButtonLoaded(button);
   338               } catch (e) { }
   339             };
   341           // Give focus after onload completes, see bug 103197.
   342           setTimeout(focusInit, 0);
   343         ]]>
   344         </body>
   345       </method>                
   347       <method name="_advanceFocusToPage">
   348         <parameter name="aPage"/>
   349         <body>
   350         <![CDATA[
   351           if (!this._hasLoaded)
   352             return;
   354           document.commandDispatcher.advanceFocusIntoSubtree(aPage);
   356           // if advanceFocusIntoSubtree tries to focus one of our
   357           // dialog buttons, then remove it and put it on the root
   358           var focused = document.commandDispatcher.focusedElement;
   359           if (focused && focused.hasAttribute("dlgtype"))
   360             this.focus();
   361         ]]>
   362         </body>
   363       </method>                
   365       <method name="_initPages">
   366         <body><![CDATA[
   367           var meth = "sequential";
   368           var pages = this.wizardPages;
   369           for (var i = 0; i < pages.length; ++i) {
   370             var page = pages[i];
   371             page.pageIndex = i;
   372             if (page.next != "")
   373               meth = "random";
   374           }
   375           this._accessMethod = meth;
   376         ]]></body>
   377       </method>
   379       <method name="_initWizardButton">
   380         <parameter name="aName"/>
   381         <body><![CDATA[
   382          var btn = document.getAnonymousElementByAttribute(this._wizardButtons, "dlgtype", aName);
   383          if (btn) {
   384            btn.addEventListener("command", this["_"+aName+"Func"], false);
   385            this["_"+aName+"Button"] = btn;
   386          }
   387          return btn;
   388         ]]></body>
   389       </method>
   391       <method name="_adjustWizardHeader">
   392         <body><![CDATA[
   393           var label = this.currentPage.getAttribute("label");
   394           if (!label && this.onFirstPage && this._bundle)
   395 #ifdef XP_MACOSX
   396             label = this._bundle.GetStringFromName("default-first-title-mac");
   397 #else
   398             label = this._bundle.formatStringFromName("default-first-title", [this.title], 1);
   399 #endif
   400           else if (!label && this.onLastPage && this._bundle)
   401 #ifdef XP_MACOSX
   402             label = this._bundle.GetStringFromName("default-last-title-mac");
   403 #else
   404             label = this._bundle.formatStringFromName("default-last-title", [this.title], 1);
   405 #endif
   406           this._wizardHeader.setAttribute("label", label);
   407           this._wizardHeader.setAttribute("description", this.currentPage.getAttribute("description"));
   408         ]]></body>
   409       </method>
   411       <method name="_hitEnter">
   412         <parameter name="evt"/>
   413         <body>
   414         <![CDATA[
   415           if (!evt.defaultPrevented)
   416             this.advance();
   417         ]]>
   418         </body>
   419       </method>
   421       <method name="_fireEvent">
   422         <parameter name="aTarget"/>
   423         <parameter name="aType"/>
   424         <body>
   425         <![CDATA[
   426           var event = document.createEvent("Events");
   427           event.initEvent(aType, true, true);
   429           // handle dom event handlers
   430           var noCancel = aTarget.dispatchEvent(event);
   432           // handle any xml attribute event handlers
   433           var handler = aTarget.getAttribute("on"+aType);
   434           if (handler != "") {
   435             var fn = new Function("event", handler);
   436             var returned = fn.apply(aTarget, [event]);
   437             if (returned == false)
   438               noCancel = false;
   439           }
   441           return noCancel;
   442         ]]>
   443         </body>
   444       </method>
   446     </implementation>
   448     <handlers>
   449       <handler event="keypress" keycode="VK_RETURN"
   450                group="system" action="this._hitEnter(event)"/>
   451       <handler event="keypress" keycode="VK_ESCAPE" group="system">
   452         if (!event.defaultPrevented)
   453           this.cancel();
   454       </handler>
   455     </handlers>
   456   </binding>
   458   <binding id="wizardpage" extends="chrome://global/content/bindings/wizard.xml#wizard-base">
   459     <implementation>
   460       <field name="pageIndex">-1</field>
   462       <property name="pageid" onget="return this.getAttribute('pageid');"
   463                               onset="this.setAttribute('pageid', val);"/>
   465       <property name="next"   onget="return this.getAttribute('next');"
   466                               onset="this.setAttribute('next', val);
   467                                      this.parentNode._accessMethod = 'random';
   468                                      return val;"/>
   469     </implementation>
   470   </binding>
   472 #ifdef XP_MACOSX
   473   <binding id="wizard-header" extends="chrome://global/content/bindings/wizard.xml#wizard-base">
   474     <content>
   475       <xul:stack class="wizard-header-stack" flex="1">
   476         <xul:vbox class="wizard-header-box-1">
   477           <xul:vbox class="wizard-header-box-text">
   478             <xul:label class="wizard-header-label" xbl:inherits="xbl:text=label"/>
   479           </xul:vbox>
   480         </xul:vbox>
   481         <xul:hbox class="wizard-header-box-icon">
   482           <xul:spacer flex="1"/>
   483           <xul:image class="wizard-header-icon" xbl:inherits="src=iconsrc"/>
   484         </xul:hbox>
   485       </xul:stack>
   486     </content>
   487   </binding>
   489   <binding id="wizard-buttons" extends="chrome://global/content/bindings/wizard.xml#wizard-base">
   490     <content>
   491       <xul:vbox flex="1">
   492         <xul:hbox class="wizard-buttons-btm">
   493           <xul:button class="wizard-button" dlgtype="extra1" hidden="true"/>
   494           <xul:button class="wizard-button" dlgtype="extra2" hidden="true"/>
   495           <xul:button label="&button-cancel-mac.label;" class="wizard-button" dlgtype="cancel"/>        
   496           <xul:spacer flex="1"/>
   497           <xul:button label="&button-back-mac.label;" accesskey="&button-back-mac.accesskey;"
   498                       class="wizard-button wizard-nav-button" dlgtype="back"/>
   499           <xul:button label="&button-next-mac.label;" accesskey="&button-next-mac.accesskey;"
   500                       class="wizard-button wizard-nav-button" dlgtype="next"
   501                       default="true" xbl:inherits="hidden=lastpage" />
   502           <xul:button label="&button-finish-mac.label;" class="wizard-button"
   503                       dlgtype="finish" default="true" xbl:inherits="hidden=hidefinishbutton" />
   504         </xul:hbox>
   505       </xul:vbox>
   506     </content>
   508     <implementation>
   509       <method name="onPageChange">
   510         <body><![CDATA[
   511           this.setAttribute("hidefinishbutton", !(this.getAttribute("lastpage") == "true"));
   512         ]]></body>
   513       </method>
   514     </implementation>
   516   </binding>
   518 #else
   520   <binding id="wizard-header" extends="chrome://global/content/bindings/wizard.xml#wizard-base">
   521     <content>
   522       <xul:hbox class="wizard-header-box-1" flex="1">
   523         <xul:vbox class="wizard-header-box-text" flex="1">
   524           <xul:label class="wizard-header-label" xbl:inherits="xbl:text=label"/>
   525           <xul:label class="wizard-header-description" xbl:inherits="xbl:text=description"/>
   526         </xul:vbox>
   527         <xul:image class="wizard-header-icon" xbl:inherits="src=iconsrc"/>
   528       </xul:hbox>
   529     </content>
   530   </binding>
   532   <binding id="wizard-buttons" extends="chrome://global/content/bindings/wizard.xml#wizard-base">
   533     <content>
   534       <xul:vbox class="wizard-buttons-box-1" flex="1">
   535         <xul:separator class="wizard-buttons-separator groove"/>
   536         <xul:hbox class="wizard-buttons-box-2">
   537           <xul:button class="wizard-button" dlgtype="extra1" hidden="true"/>
   538           <xul:button class="wizard-button" dlgtype="extra2" hidden="true"/>
   539           <xul:spacer flex="1" anonid="spacer"/>
   540 #ifdef XP_UNIX
   541           <xul:button label="&button-cancel-unix.label;" class="wizard-button"
   542                       dlgtype="cancel" icon="cancel"/>
   543           <xul:spacer style="width: 24px"/>
   544           <xul:button label="&button-back-unix.label;" accesskey="&button-back-unix.accesskey;"
   545                       class="wizard-button" dlgtype="back" icon="go-back"/>
   546           <xul:deck class="wizard-next-deck" anonid="WizardButtonDeck">
   547             <xul:hbox>
   548               <xul:button label="&button-finish-unix.label;" class="wizard-button"
   549                           dlgtype="finish" default="true" flex="1"/> 
   550             </xul:hbox>
   551             <xul:hbox>
   552               <xul:button label="&button-next-unix.label;" accesskey="&button-next-unix.accesskey;"
   553                           class="wizard-button" dlgtype="next" icon="go-forward" 
   554                           default="true" flex="1"/>
   555             </xul:hbox>
   556           </xul:deck>
   557 #else
   558           <xul:button label="&button-back-win.label;" accesskey="&button-back-win.accesskey;"
   559                       class="wizard-button" dlgtype="back" icon="go-back"/>
   560           <xul:deck class="wizard-next-deck" anonid="WizardButtonDeck">
   561             <xul:hbox>
   562               <xul:button label="&button-finish-win.label;" class="wizard-button"
   563                           dlgtype="finish" default="true" flex="1"/> 
   564             </xul:hbox>
   565             <xul:hbox>
   566               <xul:button label="&button-next-win.label;" accesskey="&button-next-win.accesskey;"
   567                           class="wizard-button" dlgtype="next" icon="go-forward" 
   568                           default="true" flex="1"/>
   569             </xul:hbox>
   570           </xul:deck>
   571           <xul:button label="&button-cancel-win.label;" class="wizard-button"
   572                       dlgtype="cancel" icon="cancel"/> 
   573 #endif
   574         </xul:hbox>
   575       </xul:vbox>
   576     </content>
   578     <implementation>
   579       <field name="_wizardButtonDeck" readonly="true">
   580         document.getAnonymousElementByAttribute(this, "anonid", "WizardButtonDeck");
   581       </field>
   583       <method name="onPageChange">
   584         <body><![CDATA[
   585           if (this.getAttribute("lastpage") == "true") {
   586             this._wizardButtonDeck.setAttribute("selectedIndex", 0);
   587           } else {
   588             this._wizardButtonDeck.setAttribute("selectedIndex", 1);
   589           }
   590         ]]></body>
   591       </method>
   593       <property name="defaultButton" readonly="true">
   594         <getter><![CDATA[
   595           const kXULNS =
   596             "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
   597           var buttons = this._wizardButtonDeck.selectedPanel
   598                             .getElementsByTagNameNS(kXULNS, "button");
   599           for (var i = 0; i < buttons.length; i++) {
   600             if (buttons[i].getAttribute("default") == "true" &&
   601                 !buttons[i].hidden && !buttons[i].disabled)
   602               return buttons[i];
   603           }
   604           return null;
   605         ]]></getter>
   606       </property>
   607     </implementation>
   608   </binding>
   609 #endif
   611 </bindings>

mercurial