home *** CD-ROM | disk | FTP | other *** search
/ Chip 2003 January / 01_03.iso / software / ghostzilla_hit / files / ghostzilla-1.0-plus-install.exe / chrome / toolkit.jar / content / global / nsWidgetStateManager.js < prev    next >
Encoding:
JavaScript  |  2002-04-17  |  12.6 KB  |  388 lines

  1. /* -*- Mode: Java; tab-width: 2; c-basic-offset: 2; -*-
  2.  *
  3.  * The contents of this file are subject to the Netscape Public License
  4.  * Version 1.0 (the "NPL"); you may not use this file except in
  5.  * compliance with the NPL.  You may obtain a copy of the NPL at
  6.  * http://www.mozilla.org/NPL/
  7.  *
  8.  * Software distributed under the NPL is distributed on an "AS IS" basis,
  9.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
  10.  * for the specific language governing rights and limitations under the
  11.  * NPL.
  12.  *
  13.  * The Initial Developer of this code under the NPL is Netscape
  14.  * Communications Corporation.  Portions created by Netscape are
  15.  * Copyright (C) 1998 Netscape Communications Corporation.  All Rights
  16.  * Reserved.
  17.  *
  18.  * Contributor(s):
  19.  *   Ben Goodger <ben@netscape.com> (Original Author)
  20.  */
  21.  
  22. /** Presenting widgetStateManager the Third.
  23.  *   a production of ye olde bard Ben Goodger and his Merry XUL Widget Crewe.
  24.  *  =>> MODIFICATIONS MUST BE REVIEWED BY ben@netscape.com!!! <<=
  25.  **/
  26.  
  27. var wsm;
  28.  
  29. function nsWidgetStateManager ( aFrameID )
  30.   {
  31.  
  32.     this.dataManager =
  33.       {
  34.         /** Persisted Data Hash Table
  35.          *  Page_ID -> Element_ID -> Property -> Value
  36.          **/
  37.         pageData: [],
  38.  
  39.         setPageData:
  40.           function ( aPageTag, aDataObject )
  41.             {
  42.               this.pageData[aPageTag] = aDataObject;
  43.             },
  44.  
  45.         getPageData:
  46.           function ( aPageTag )
  47.             {
  48.               if( !(aPageTag in this.pageData) )
  49.                 this.pageData[aPageTag] = [];
  50.               return this.pageData[aPageTag];
  51.             },
  52.  
  53.         setItemData:
  54.           function ( aPageTag, aItemID, aDataObject )
  55.             {
  56.               if( !(aPageTag in this.pageData) )
  57.                 this.pageData[aPageTag] = [];
  58.               this.pageData[aPageTag][aItemID] = aDataObject;
  59.             },
  60.  
  61.         getItemData:
  62.           function ( aPageTag, aItemID )
  63.             {
  64.               if( !(aItemID in this.pageData[aPageTag]) )
  65.                 this.pageData[aPageTag][aItemID] = [];
  66.               return this.pageData[aPageTag][aItemID];
  67.             }
  68.       }
  69.  
  70.     this.contentID    = aFrameID;
  71.  
  72.     wsm               = this;
  73.  
  74.     /** Element Handlers
  75.      *  Provides default get and set handler functions for supported
  76.      *  widgets. Clients can override or add new widgets.
  77.      **/
  78.     this.handlers     =
  79.       {
  80.         menulist:
  81.           {  get: wsm.get_Menulist,    set: wsm.set_Menulist      },
  82.         radiogroup:
  83.           {  get: wsm.get_Radiogroup,  set: wsm.set_Radiogroup    },
  84.         checkbox:
  85.           {  get: wsm.get_Checkbox,    set: wsm.set_Checkbox      },
  86.         textbox:
  87.           {  get: wsm.get_Textbox,     set: wsm.set_Textbox       },
  88.         listitem:
  89.           {  get: wsm.get_Listitem,    set: wsm.set_Listitem      },
  90.         default_handler:
  91.           {  get: wsm.get_Default,     set: wsm.set_Default       }
  92.       }
  93.  
  94.     // extra attributes to scan and save.
  95.     this.attributes   = [];
  96.   }
  97.  
  98. nsWidgetStateManager.prototype =
  99.   {
  100.     get contentArea()
  101.       {
  102.         return window.frames[ this.contentID ];
  103.       },
  104.  
  105.     savePageData:
  106.       function ( aPageTag )
  107.         {
  108.           if (!(aPageTag in this.dataManager.pageData))
  109.             return;
  110.  
  111.           if( 'GetFields' in this.contentArea)
  112.             {
  113.               // save page data based on user supplied function in content area
  114.               var dataObject = this.contentArea.GetFields();
  115.               if (dataObject)
  116.                 this.dataManager.setPageData( aPageTag, dataObject );
  117.             }
  118.  
  119.             // Automatic element retrieval. This is done in two ways.
  120.             // 1) if an element id array is present in the document, this is
  121.             //    used to build a list of elements to persist. <-- performant
  122.             // 2) otherwise, all elements with 'wsm_persist' set to true
  123.             //    are persisted <-- non-performant.
  124.            var elements;
  125.            if( '_elementIDs' in this.contentArea )
  126.               {
  127.                 elements = [];
  128.                 for( var i = 0; i < this.contentArea._elementIDs.length; i++ )
  129.                   {
  130.                     var elt = this.contentArea.document.getElementById( this.contentArea._elementIDs[i] );
  131.                     if (elt) {
  132.                       elements[elements.length] = elt;
  133.                     } else {
  134.                       // see bug #40329. People forget this too often, and it breaks Prefs
  135.                       dump("*** FIX ME: '_elementIDs' in '" + this.contentArea.location.href.split('/').pop() +
  136.                            "' contains a reference to a non-existent element ID '" +
  137.                            this.contentArea._elementIDs[i] + "'.\n");
  138.                     }
  139.                   }
  140.               }
  141.             else
  142.               {
  143.                 elements = this.contentArea.document.getElementsByAttribute( "wsm_persist", "true" );
  144.               }
  145.             for( var ii = 0; ii < elements.length; ii++ )
  146.               {
  147.                 var elementID   = elements[ii].id;
  148.                 var elementType = elements[ii].localName;
  149.                 if (!(aPageTag in this.dataManager.pageData) )
  150.                     this.dataManager.pageData[aPageTag] = [];
  151.                 this.dataManager.pageData[aPageTag][elementID] = [];
  152.                 // persist attributes
  153.                 var get_Func = (elementType in this.handlers) ?
  154.                                 this.handlers[elementType].get :
  155.                                 this.handlers.default_handler.get;
  156.                 this.dataManager.setItemData( aPageTag, elementID, get_Func( elementID ) );
  157.               }
  158.         },
  159.  
  160.     setPageData:
  161.       function ( aPageTag )
  162.         {
  163.           var pageData = this.dataManager.getPageData( aPageTag );
  164.           if( 'SetFields' in this.contentArea )
  165.             {
  166.               this.contentArea.SetFields( pageData );
  167.               return;
  168.             }
  169.  
  170.           for( var elementID in pageData )
  171.             {
  172.               var element = this.contentArea.document.getElementById( elementID );
  173.               if( element )
  174.                 {
  175.                   var elementType = element.localName;
  176.                   var set_Func = (elementType in this.handlers) ?
  177.                                   this.handlers[elementType].set :
  178.                                   this.handlers.default_handler.set;
  179.                   set_Func( elementID, pageData[elementID] );
  180.                 }
  181.             }
  182.         },
  183.  
  184.  
  185.     /** Widget Get/Set Function Implementations
  186.      *  These can be overridden by the client.
  187.      **/
  188.     generic_Set:
  189.       function ( aElement, aDataObject )
  190.         {
  191.           if( aElement )
  192.             {
  193.               for( var property in aDataObject )
  194.                 {
  195.                   if (property == "localname")
  196.                     continue;
  197.                   if ( !aDataObject[property] )
  198.                     aElement.removeAttribute( property );
  199.                   else
  200.                     aElement.setAttribute( property, aDataObject[property] );
  201.                 }
  202.               if ( !aElement.getAttribute("disabled","true") )
  203.                 aElement.removeAttribute("disabled");
  204.             }
  205.         },
  206.  
  207.     generic_Get:
  208.       function ( aElement )
  209.         {
  210.           if( aElement )
  211.             {
  212.               var dataObject = [];
  213.               var wsmAttributes = aElement.getAttribute( "wsm_attributes" );
  214.               var attributes = wsm.attributes;              // make a copy
  215.               if( wsmAttributes != "" )
  216.                 {
  217.                   attributes.push( wsmAttributes.split(" ") );  // modify the copy
  218.                 }
  219.               for( var i = 0; i < attributes.length; i++ )
  220.                 {
  221.                   dataObject[attributes[i]] = aElement.getAttribute( attributes[i] );
  222.                 }
  223.                 dataObject.localname = aElement.localName;
  224.               return dataObject;
  225.             }
  226.             return null;
  227.         },
  228.  
  229.     // <menulist>
  230.     set_Menulist:
  231.       function ( aElementID, aDataObject )
  232.         {
  233.           var element = wsm.contentArea.document.getElementById( aElementID );
  234.           // set all generic properties
  235.           wsm.generic_Set( element, aDataObject );
  236.           // set menulist specific properties
  237.           if( 'value' in aDataObject )
  238.             {
  239.               try {
  240.                 element.selectedItem = element.getElementsByAttribute( "value", aDataObject.value )[0];
  241.               }
  242.               catch (ex) {
  243.                 dump(aElementID +", ex: " + ex + "\n");
  244.               }
  245.             }
  246.         },
  247.  
  248.     get_Menulist:
  249.       function ( aElementID )
  250.         {
  251.           var element     = wsm.contentArea.document.getElementById( aElementID );
  252.           // retrieve all generic attributes
  253.           var dataObject  = wsm.generic_Get( element );
  254.           // retrieve all menulist specific attributes
  255.           if( dataObject )
  256.             {
  257.               dataObject.value = element.getAttribute( "value" );
  258.               return dataObject;
  259.             }
  260.           return null;
  261.         },
  262.  
  263.     // <radiogroup>
  264.     set_Radiogroup:
  265.       function ( aElementID, aDataObject )
  266.         {
  267.  
  268.           var element = wsm.contentArea.document.getElementById( aElementID );
  269.           wsm.generic_Set( element, aDataObject );
  270.           if( 'value' in aDataObject )
  271.             {
  272.               element.selectedItem = element.getElementsByAttribute( "value", aDataObject.value )[0];
  273.             }
  274.           if( 'disabled' in aDataObject )
  275.             {
  276.               element.disabled = aDataObject.disabled;
  277.             }
  278.         },
  279.  
  280.     get_Radiogroup:
  281.       function ( aElementID )
  282.         {
  283.           var element = wsm.contentArea.document.getElementById( aElementID );
  284.           var dataObject = wsm.generic_Get( element );
  285.           if( dataObject )
  286.             {
  287.               dataObject.value = element.getAttribute( "value" );
  288.               return dataObject;
  289.             }
  290.           return null;
  291.         },
  292.  
  293.     // <textbox>
  294.     set_Textbox:
  295.       function ( aElementID, aDataObject )
  296.         {
  297.           var element = wsm.contentArea.document.getElementById( aElementID );
  298.           wsm.generic_Set( element, aDataObject );
  299.         },
  300.  
  301.     get_Textbox:
  302.       function ( aElementID )
  303.         {
  304.           var element = wsm.contentArea.document.getElementById( aElementID );
  305.           var dataObject = wsm.generic_Get( element );
  306.           if( dataObject )
  307.             {
  308.               dataObject.value = element.value;
  309.               return dataObject;
  310.             }
  311.           return null;
  312.         },
  313.  
  314.     // <checkbox>
  315.     set_Checkbox:
  316.       function ( aElementID, aDataObject )
  317.         {
  318.           var element = wsm.contentArea.document.getElementById( aElementID );
  319.           // Set generic properites. 
  320.           wsm.generic_Set( element, aDataObject );
  321.           // Handle reversed boolean values.
  322.           if ( "checked" in aDataObject && element.hasAttribute( "reversed" ) )
  323.             element.checked = !aDataObject.checked; 
  324.         },
  325.  
  326.     get_Checkbox:
  327.       function ( aElementID )
  328.         {
  329.           var element = wsm.contentArea.document.getElementById( aElementID );
  330.           var dataObject = wsm.generic_Get( element );
  331.           if( dataObject )
  332.             {
  333.               var checked = element.checked;
  334.               dataObject.checked = element.getAttribute("reversed") == "true" ? !checked : checked;
  335.               return dataObject;
  336.             }
  337.           return null;
  338.         },
  339.  
  340.     // <listitem>
  341.     set_Listitem:
  342.       function ( aElementID, aDataObject )
  343.         {
  344.           var element = wsm.contentArea.document.getElementById( aElementID );
  345.           wsm.generic_Set( element, aDataObject );
  346.         },
  347.  
  348.     get_Listitem:
  349.       function ( aElementID )
  350.         {
  351.           var element = wsm.contentArea.document.getElementById( aElementID );
  352.           var dataObject = wsm.generic_Get( element );
  353.           if( dataObject )
  354.             {
  355.               if( element.getAttribute("type") == "checkbox" )
  356.                 {
  357.                   dataObject.checked = element.checked;
  358.                 }
  359.               return dataObject;
  360.             }
  361.           return null;
  362.         },
  363.  
  364.     // <default>
  365.     set_Default:
  366.       function ( aElementID, aDataObject )
  367.         {
  368.           var element = wsm.contentArea.document.getElementById( aElementID );
  369.           wsm.generic_Set( element, aDataObject );
  370.         },
  371.  
  372.     get_Default:
  373.       function ( aElementID )
  374.         {
  375.           var element = wsm.contentArea.document.getElementById( aElementID );
  376.           var dataObject = wsm.generic_Get( element );
  377.           return dataObject ? dataObject : null;
  378.         }
  379.   }
  380.  
  381.  
  382. // M:tHoF Greatest Hits Section (Append one line per edit):
  383. // it will be dark soon 
  384. // MANOS MADE ME PERMANENT! 
  385. // there is no way out of here
  386. // [The Master] not dead as you know it. He is with us always.
  387.  
  388.