home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 March / PCWorld_2007-03_cd.bin / komunikace / nvu / nvu-1.0-cs-CZ.win32.installer.exe / chrome / toolkit.jar / content / global / nsWidgetStateManager.js < prev    next >
Text File  |  2003-08-23  |  10KB  |  348 lines

  1.  
  2. var wsm;
  3.  
  4. // For panels displayed inside the main dialog, this value will be the child iframe
  5. // window. For panels displayed in sub-dialogs, those launched by panels of the main
  6. // dialog, this will be the sub dialog window. 
  7. var gCurrentWindow = null;
  8.  
  9. function nsWidgetStateManager (aFrameID)
  10. {
  11.  
  12.   this.dataManager = {
  13.     /** Persisted Data Hash Table
  14.      *  Page_ID -> Element_ID -> Property -> Value
  15.      **/
  16.     pageData: { },
  17.  
  18.     setPageData: function (aPageTag, aDataObject)
  19.     {
  20.       this.pageData[aPageTag] = aDataObject;
  21.     },
  22.  
  23.     getPageData: function (aPageTag)
  24.     {
  25.       if (!(aPageTag in this.pageData))
  26.         this.pageData[aPageTag] = { };
  27.  
  28.       if (!('elementIDs' in this.pageData[aPageTag]))
  29.         this.pageData[aPageTag].elementIDs = new Object();
  30.  
  31.       if (!('userData' in this.pageData[aPageTag]))
  32.         this.pageData[aPageTag].userData = new Object();
  33.  
  34.       return this.pageData[aPageTag];
  35.     },
  36.  
  37.     setItemData: function (aPageTag, aItemID, aDataObject)
  38.     {
  39.       if (!(aPageTag in this.pageData))
  40.         this.pageData[aPageTag] = new Object();
  41.       
  42.       this.pageData[aPageTag].elementIDs[aItemID] = aDataObject;
  43.     },
  44.  
  45.     getItemData: function (aPageTag, aItemID)
  46.     {
  47.       if (!(aItemID in this.pageData[aPageTag].elementIDs))
  48.         this.pageData[aPageTag].elementIDs[aItemID] = new Object();
  49.       return this.pageData[aPageTag].elementIDs[aItemID];
  50.     }
  51.   }
  52.  
  53.   this.contentID    = aFrameID;
  54.  
  55.   wsm               = this;
  56.  
  57.   /** Element Handlers
  58.    *  Provides default get and set handler functions for supported
  59.    *  widgets. Clients can override or add new widgets.
  60.    **/
  61.   this.handlers     = {
  62.     menulist:
  63.       {  get: wsm.get_Menulist,    set: wsm.set_Menulist      },
  64.     radiogroup:
  65.       {  get: wsm.get_Radiogroup,  set: wsm.set_Radiogroup    },
  66.     checkbox:
  67.       {  get: wsm.get_Checkbox,    set: wsm.set_Checkbox      },
  68.     textbox:
  69.       {  get: wsm.get_Textbox,     set: wsm.set_Textbox       },
  70.     listitem:
  71.       {  get: wsm.get_Listitem,    set: wsm.set_Listitem      },
  72.     data:
  73.       {  get: wsm.get_Data,        set: wsm.set_Data          },
  74.     default_handler:
  75.       {  get: wsm.get_Default,     set: wsm.set_Default       }
  76.   }
  77.  
  78.   // extra attributes to scan and save.
  79.   this.attributes   = [];
  80. }
  81.  
  82. nsWidgetStateManager.prototype =
  83. {
  84.   get contentArea ()
  85.   {
  86.     return window.frames[this.contentID];
  87.   },
  88.  
  89.   savePageData: function (aPageTag, aWindow)
  90.   {
  91.     gCurrentWindow = aWindow || this.contentArea;
  92.       
  93.     if (!(aPageTag in this.dataManager.pageData))
  94.       return;
  95.  
  96.     if ("GetFields" in gCurrentWindow) {
  97.       // save page data based on user supplied function in content area
  98.       var dataObject = gCurrentWindow.GetFields();
  99.       if (dataObject)        
  100.         this.dataManager.pageData[aPageTag].userData = dataObject;
  101.     }
  102.  
  103.     // Automatic element retrieval. This is done in two ways.
  104.     // 1) if an element id array is present in the document, this is
  105.     //    used to build a list of elements to persist. <-- performant
  106.     // 2) otherwise, all elements with "wsm_persist" set to true
  107.     //    are persisted <-- non-performant.
  108.     var elements;
  109.     if ("_elementIDs" in gCurrentWindow) {
  110.       elements = [];
  111.       for (var i = 0; i < gCurrentWindow._elementIDs.length; i++) {
  112.         var elt = gCurrentWindow.document.getElementById(gCurrentWindow._elementIDs[i]);
  113.         if (elt)
  114.           elements[elements.length] = elt;
  115.         else {
  116.           // see bug #40329. People forget this too often, and it breaks Prefs
  117.           dump("*** FIX ME: '_elementIDs' in '" + gCurrentWindow.location.href.split('/').pop() +
  118.                "' contains a reference to a non-existent element ID '" +
  119.           gCurrentWindow._elementIDs[i] + "'.\n");
  120.         }
  121.       }
  122.     }
  123.     else 
  124.       elements = gCurrentWindow.document.getElementsByAttribute("wsm_persist", "true");
  125.  
  126.     for (var ii = 0; ii < elements.length; ii++) {
  127.       var elementID   = elements[ii].id;
  128.       var elementType = elements[ii].localName;
  129.  
  130.       // persist attributes
  131.       var get_Func = (elementType in this.handlers) ?
  132.       this.handlers[elementType].get :
  133.       this.handlers.default_handler.get;
  134.       this.dataManager.setItemData(aPageTag, elementID, get_Func(elementID));
  135.     }
  136.   },
  137.  
  138.   setPageData: function (aPageTag, aWindow)
  139.   {
  140.     gCurrentWindow = aWindow || this.contentArea;
  141.  
  142.     var pageData = this.dataManager.getPageData(aPageTag);
  143.     if ("SetFields" in gCurrentWindow)
  144.       gCurrentWindow.SetFields(pageData.userData)
  145.  
  146.     if (!('elementIDs' in pageData))
  147.       return;
  148.  
  149.     for (var elementID in pageData.elementIDs) {
  150.       var element = gCurrentWindow.document.getElementById(elementID);
  151.       if (element) {
  152.         var elementType = element.localName;
  153.         var set_Func = (elementType in this.handlers) ?
  154.           this.handlers[elementType].set :
  155.           this.handlers.default_handler.set;
  156.         set_Func(elementID, pageData.elementIDs[elementID]);
  157.       }
  158.     }
  159.   },
  160.  
  161.  
  162.   /** Widget Get/Set Function Implementations
  163.    *  These can be overridden by the client.
  164.    **/
  165.   generic_Set: function (aElement, aDataObject)
  166.   {
  167.     if (aElement) {
  168.       for (var property in aDataObject) {
  169.         if (property == "localname")
  170.           continue;
  171.         if (!aDataObject[property] && typeof aDataObject[property] == "boolean")
  172.           aElement.removeAttribute(property);
  173.         else
  174.           aElement.setAttribute(property, aDataObject[property]);
  175.       }
  176.       
  177.       if (!aElement.getAttribute("disabled","true"))
  178.         aElement.removeAttribute("disabled");
  179.     }
  180.   },
  181.  
  182.   generic_Get: function (aElement)
  183.   {
  184.     if (aElement) {
  185.       var dataObject = new Object();
  186.       var wsmAttributes = aElement.getAttribute("wsm_attributes");
  187.       var attributes = wsm.attributes;              // make a copy
  188.       if (wsmAttributes != "")
  189.         attributes.push(wsmAttributes.split(" "));  // modify the copy
  190.  
  191.       for (var i = 0; i < attributes.length; i++)
  192.         dataObject[attributes[i]] = aElement.getAttribute(attributes[i]);
  193.  
  194.       dataObject.localname = aElement.localName;
  195.       return dataObject;
  196.     }
  197.     return null;
  198.   },
  199.  
  200.   // <menulist>
  201.   set_Menulist: function (aElementID, aDataObject)
  202.   {
  203.     var element = gCurrentWindow.document.getElementById(aElementID);
  204.     // set all generic properties
  205.     wsm.generic_Set(element, aDataObject);
  206.     // set menulist specific properties
  207.     if ("value" in aDataObject) {
  208.       try {
  209.         element.value = aDataObject.value;
  210.       }
  211.       catch (ex) {
  212.         dump(aElementID + ", ex: " + ex + "\n");
  213.       }
  214.     }
  215.   },
  216.  
  217.   get_Menulist: function (aElementID)
  218.   {
  219.     var element     = gCurrentWindow.document.getElementById(aElementID);
  220.     // retrieve all generic attributes
  221.     var dataObject  = wsm.generic_Get(element);
  222.     // retrieve all menulist specific attributes
  223.     if (dataObject) {
  224.       dataObject.value = element.getAttribute("value");
  225.       return dataObject;
  226.     }
  227.     return null;
  228.   },
  229.  
  230.   // <radiogroup>
  231.   set_Radiogroup: function (aElementID, aDataObject)
  232.   {
  233.     var element = gCurrentWindow.document.getElementById(aElementID);
  234.     wsm.generic_Set(element, aDataObject);
  235.     if ("value" in aDataObject)
  236.       element.selectedItem = element.getElementsByAttribute("value", aDataObject.value)[0];
  237.     if ("disabled" in aDataObject)
  238.       element.disabled = aDataObject.disabled;
  239.   },
  240.  
  241.   get_Radiogroup: function (aElementID)
  242.   {
  243.     var element = gCurrentWindow.document.getElementById(aElementID);
  244.     var dataObject = wsm.generic_Get(element);
  245.     if (dataObject) {
  246.       dataObject.value = element.getAttribute("value");
  247.       return dataObject;
  248.     }
  249.     return null;
  250.   },
  251.  
  252.   // <textbox>
  253.   set_Textbox: function (aElementID, aDataObject)
  254.   {
  255.     var element = gCurrentWindow.document.getElementById(aElementID);
  256.     wsm.generic_Set(element, aDataObject);
  257.   },
  258.  
  259.   get_Textbox: function (aElementID)
  260.   {
  261.     var element = gCurrentWindow.document.getElementById(aElementID);
  262.     var dataObject = wsm.generic_Get(element);
  263.     if (dataObject) {
  264.       dataObject.value = element.value;
  265.       return dataObject;
  266.     }
  267.     return null;
  268.   },
  269.  
  270.   // <checkbox>
  271.   set_Checkbox: function (aElementID, aDataObject)
  272.   {
  273.     var element = gCurrentWindow.document.getElementById(aElementID);
  274.     // Set generic properites. 
  275.     wsm.generic_Set(element, aDataObject);
  276.     // Handle reversed boolean values.
  277.     if ("checked" in aDataObject && element.hasAttribute("reversed"))
  278.       element.checked = !aDataObject.checked; 
  279.   },
  280.  
  281.   get_Checkbox: function (aElementID)
  282.   {
  283.     var element = gCurrentWindow.document.getElementById(aElementID);
  284.     var dataObject = wsm.generic_Get(element);
  285.     if (dataObject) {
  286.       var checked = element.checked;
  287.       dataObject.checked = element.getAttribute("reversed") == "true" ? !checked : checked;
  288.       return dataObject;
  289.     }
  290.     return null;
  291.   },
  292.  
  293.   // <listitem>
  294.   set_Listitem: function (aElementID, aDataObject)
  295.   {
  296.     var element = gCurrentWindow.document.getElementById(aElementID);
  297.     wsm.generic_Set(element, aDataObject);
  298.   },
  299.  
  300.   get_Listitem: function (aElementID)
  301.   {
  302.     var element = gCurrentWindow.document.getElementById(aElementID);
  303.     var dataObject = wsm.generic_Get(element);
  304.     if (dataObject) {
  305.       if (element.getAttribute("type") == "checkbox")
  306.         dataObject.checked = element.checked;
  307.       return dataObject;
  308.     }
  309.     return null;
  310.   },
  311.  
  312.   // <data>
  313.   set_Data: function (aElementID, aDataObject)
  314.   {
  315.     var element = gCurrentWindow.document.getElementById(aElementID);
  316.     wsm.generic_Set(element, aDataObject);
  317.     if ("value" in aDataObject)
  318.       element.setAttribute("value", aDataObject.value);
  319.   },
  320.  
  321.   get_Data: function (aElementID)
  322.   {
  323.     var element = gCurrentWindow.document.getElementById(aElementID);
  324.     var dataObject = wsm.generic_Get(element);
  325.     if (dataObject) {
  326.       dataObject.value = element.getAttribute("value");
  327.       return dataObject;
  328.     }
  329.     return null;
  330.   },
  331.  
  332.   // <default>
  333.   set_Default: function (aElementID, aDataObject)
  334.   {
  335.     var element = gCurrentWindow.document.getElementById(aElementID);
  336.     wsm.generic_Set(element, aDataObject);
  337.   },
  338.  
  339.   get_Default: function (aElementID)
  340.   {
  341.     var element = gCurrentWindow.document.getElementById(aElementID);
  342.     var dataObject = wsm.generic_Get(element);
  343.     return dataObject ? dataObject : null;
  344.   }
  345. }
  346.  
  347.  
  348.