home *** CD-ROM | disk | FTP | other *** search
/ PC World 2003 May / PCWorld_2003-05_cd.bin / Komunik / phoenix / chrome / toolkit.jar / content / global / nsWidgetStateManager.js < prev    next >
Text File  |  2002-06-22  |  14KB  |  420 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.         data:
  91.           {  get: wsm.get_Data,        set: wsm.set_Data          },
  92.         default_handler:
  93.           {  get: wsm.get_Default,     set: wsm.set_Default       }
  94.       }
  95.  
  96.     // extra attributes to scan and save.
  97.     this.attributes   = [];
  98.   }
  99.  
  100. nsWidgetStateManager.prototype =
  101.   {
  102.     get contentArea()
  103.       {
  104.         return window.frames[ this.contentID ];
  105.       },
  106.  
  107.     savePageData:
  108.       function ( aPageTag )
  109.         {
  110.           if (!(aPageTag in this.dataManager.pageData))
  111.             return;
  112.  
  113.           if( 'GetFields' in this.contentArea)
  114.             {
  115.               // save page data based on user supplied function in content area
  116.               var dataObject = this.contentArea.GetFields();
  117.               if (dataObject)
  118.                 this.dataManager.setPageData( aPageTag, dataObject );
  119.             }
  120.  
  121.             // Automatic element retrieval. This is done in two ways.
  122.             // 1) if an element id array is present in the document, this is
  123.             //    used to build a list of elements to persist. <-- performant
  124.             // 2) otherwise, all elements with 'wsm_persist' set to true
  125.             //    are persisted <-- non-performant.
  126.            var elements;
  127.            if( '_elementIDs' in this.contentArea )
  128.               {
  129.                 elements = [];
  130.                 for( var i = 0; i < this.contentArea._elementIDs.length; i++ )
  131.                   {
  132.                     var elt = this.contentArea.document.getElementById( this.contentArea._elementIDs[i] );
  133.                     if (elt) {
  134.                       elements[elements.length] = elt;
  135.                     } else {
  136.                       // see bug #40329. People forget this too often, and it breaks Prefs
  137.                       dump("*** FIX ME: '_elementIDs' in '" + this.contentArea.location.href.split('/').pop() +
  138.                            "' contains a reference to a non-existent element ID '" +
  139.                            this.contentArea._elementIDs[i] + "'.\n");
  140.                     }
  141.                   }
  142.               }
  143.             else
  144.               {
  145.                 elements = this.contentArea.document.getElementsByAttribute( "wsm_persist", "true" );
  146.               }
  147.             for( var ii = 0; ii < elements.length; ii++ )
  148.               {
  149.                 var elementID   = elements[ii].id;
  150.                 var elementType = elements[ii].localName;
  151.                 if (!(aPageTag in this.dataManager.pageData) )
  152.                     this.dataManager.pageData[aPageTag] = [];
  153.                 this.dataManager.pageData[aPageTag][elementID] = [];
  154.                 // persist attributes
  155.                 var get_Func = (elementType in this.handlers) ?
  156.                                 this.handlers[elementType].get :
  157.                                 this.handlers.default_handler.get;
  158.                 this.dataManager.setItemData( aPageTag, elementID, get_Func( elementID ) );
  159.               }
  160.         },
  161.  
  162.     setPageData:
  163.       function ( aPageTag )
  164.         {
  165.           var pageData = this.dataManager.getPageData( aPageTag );
  166.           if( 'SetFields' in this.contentArea )
  167.             {
  168.               if ( !this.contentArea.SetFields( pageData ) )
  169.               {
  170.                 // If the function returns false (or null/undefined) then it
  171.                 // doesn't want *us* to process the page data.
  172.                 return;
  173.               }
  174.             }
  175.  
  176.           for( var elementID in pageData )
  177.             {
  178.               var element = this.contentArea.document.getElementById( elementID );
  179.               if( element )
  180.                 {
  181.                   var elementType = element.localName;
  182.                   var set_Func = (elementType in this.handlers) ?
  183.                                   this.handlers[elementType].set :
  184.                                   this.handlers.default_handler.set;
  185.                   set_Func( elementID, pageData[elementID] );
  186.                 }
  187.             }
  188.         },
  189.  
  190.  
  191.     /** Widget Get/Set Function Implementations
  192.      *  These can be overridden by the client.
  193.      **/
  194.     generic_Set:
  195.       function ( aElement, aDataObject )
  196.         {
  197.           if( aElement )
  198.             {
  199.               for( var property in aDataObject )
  200.                 {
  201.                   if (property == "localname")
  202.                     continue;
  203.                   if ( !aDataObject[property] && typeof aDataObject[property] == "boolean")
  204.                     aElement.removeAttribute( property );
  205.                   else
  206.                     aElement.setAttribute( property, aDataObject[property] );
  207.                 }
  208.               if ( !aElement.getAttribute("disabled","true") )
  209.                 aElement.removeAttribute("disabled");
  210.             }
  211.         },
  212.  
  213.     generic_Get:
  214.       function ( aElement )
  215.         {
  216.           if( aElement )
  217.             {
  218.               var dataObject = [];
  219.               var wsmAttributes = aElement.getAttribute( "wsm_attributes" );
  220.               var attributes = wsm.attributes;              // make a copy
  221.               if( wsmAttributes != "" )
  222.                 {
  223.                   attributes.push( wsmAttributes.split(" ") );  // modify the copy
  224.                 }
  225.               for( var i = 0; i < attributes.length; i++ )
  226.                 {
  227.                   dataObject[attributes[i]] = aElement.getAttribute( attributes[i] );
  228.                 }
  229.                 dataObject.localname = aElement.localName;
  230.               return dataObject;
  231.             }
  232.             return null;
  233.         },
  234.  
  235.     // <menulist>
  236.     set_Menulist:
  237.       function ( aElementID, aDataObject )
  238.         {
  239.           var element = wsm.contentArea.document.getElementById( aElementID );
  240.           // set all generic properties
  241.           wsm.generic_Set( element, aDataObject );
  242.           // set menulist specific properties
  243.           if( 'value' in aDataObject )
  244.             {
  245.               try {
  246.                 element.selectedItem = element.getElementsByAttribute( "value", aDataObject.value )[0];
  247.               }
  248.               catch (ex) {
  249.                 dump(aElementID +", ex: " + ex + "\n");
  250.               }
  251.             }
  252.         },
  253.  
  254.     get_Menulist:
  255.       function ( aElementID )
  256.         {
  257.           var element     = wsm.contentArea.document.getElementById( aElementID );
  258.           // retrieve all generic attributes
  259.           var dataObject  = wsm.generic_Get( element );
  260.           // retrieve all menulist specific attributes
  261.           if( dataObject )
  262.             {
  263.               dataObject.value = element.getAttribute( "value" );
  264.               return dataObject;
  265.             }
  266.           return null;
  267.         },
  268.  
  269.     // <radiogroup>
  270.     set_Radiogroup:
  271.       function ( aElementID, aDataObject )
  272.         {
  273.  
  274.           var element = wsm.contentArea.document.getElementById( aElementID );
  275.           wsm.generic_Set( element, aDataObject );
  276.           if( 'value' in aDataObject )
  277.             {
  278.               element.selectedItem = element.getElementsByAttribute( "value", aDataObject.value )[0];
  279.             }
  280.           if( 'disabled' in aDataObject )
  281.             {
  282.               element.disabled = aDataObject.disabled;
  283.             }
  284.         },
  285.  
  286.     get_Radiogroup:
  287.       function ( aElementID )
  288.         {
  289.           var element = wsm.contentArea.document.getElementById( aElementID );
  290.           var dataObject = wsm.generic_Get( element );
  291.           if( dataObject )
  292.             {
  293.               dataObject.value = element.getAttribute( "value" );
  294.               return dataObject;
  295.             }
  296.           return null;
  297.         },
  298.  
  299.     // <textbox>
  300.     set_Textbox:
  301.       function ( aElementID, aDataObject )
  302.         {
  303.           var element = wsm.contentArea.document.getElementById( aElementID );
  304.           wsm.generic_Set( element, aDataObject );
  305.         },
  306.  
  307.     get_Textbox:
  308.       function ( aElementID )
  309.         {
  310.           var element = wsm.contentArea.document.getElementById( aElementID );
  311.           var dataObject = wsm.generic_Get( element );
  312.           if( dataObject )
  313.             {
  314.               dataObject.value = element.value;
  315.               return dataObject;
  316.             }
  317.           return null;
  318.         },
  319.  
  320.     // <checkbox>
  321.     set_Checkbox:
  322.       function ( aElementID, aDataObject )
  323.         {
  324.           var element = wsm.contentArea.document.getElementById( aElementID );
  325.           // Set generic properites. 
  326.           wsm.generic_Set( element, aDataObject );
  327.           // Handle reversed boolean values.
  328.           if ( "checked" in aDataObject && element.hasAttribute( "reversed" ) )
  329.             element.checked = !aDataObject.checked; 
  330.         },
  331.  
  332.     get_Checkbox:
  333.       function ( aElementID )
  334.         {
  335.           var element = wsm.contentArea.document.getElementById( aElementID );
  336.           var dataObject = wsm.generic_Get( element );
  337.           if( dataObject )
  338.             {
  339.               var checked = element.checked;
  340.               dataObject.checked = element.getAttribute("reversed") == "true" ? !checked : checked;
  341.               return dataObject;
  342.             }
  343.           return null;
  344.         },
  345.  
  346.     // <listitem>
  347.     set_Listitem:
  348.       function ( aElementID, aDataObject )
  349.         {
  350.           var element = wsm.contentArea.document.getElementById( aElementID );
  351.           wsm.generic_Set( element, aDataObject );
  352.         },
  353.  
  354.     get_Listitem:
  355.       function ( aElementID )
  356.         {
  357.           var element = wsm.contentArea.document.getElementById( aElementID );
  358.           var dataObject = wsm.generic_Get( element );
  359.           if( dataObject )
  360.             {
  361.               if( element.getAttribute("type") == "checkbox" )
  362.                 {
  363.                   dataObject.checked = element.checked;
  364.                 }
  365.               return dataObject;
  366.             }
  367.           return null;
  368.         },
  369.  
  370.     // <data>
  371.     set_Data:
  372.       function ( aElementID, aDataObject )
  373.         {
  374.  
  375.           var element = wsm.contentArea.document.getElementById( aElementID );
  376.           wsm.generic_Set( element, aDataObject );
  377.           if( 'value' in aDataObject )
  378.             {
  379.               element.setAttribute("value", aDataObject.value);
  380.             }
  381.         },
  382.  
  383.     get_Data:
  384.       function ( aElementID )
  385.         {
  386.           var element = wsm.contentArea.document.getElementById( aElementID );
  387.           var dataObject = wsm.generic_Get( element );
  388.           if( dataObject )
  389.             {
  390.               dataObject.value = element.getAttribute( "value" );
  391.               return dataObject;
  392.             }
  393.           return null;
  394.         },
  395.  
  396.     // <default>
  397.     set_Default:
  398.       function ( aElementID, aDataObject )
  399.         {
  400.           var element = wsm.contentArea.document.getElementById( aElementID );
  401.           wsm.generic_Set( element, aDataObject );
  402.         },
  403.  
  404.     get_Default:
  405.       function ( aElementID )
  406.         {
  407.           var element = wsm.contentArea.document.getElementById( aElementID );
  408.           var dataObject = wsm.generic_Get( element );
  409.           return dataObject ? dataObject : null;
  410.         }
  411.   }
  412.  
  413.  
  414. // M:tHoF Greatest Hits Section (Append one line per edit):
  415. // it will be dark soon 
  416. // MANOS MADE ME PERMANENT! 
  417. // there is no way out of here
  418. // [The Master] not dead as you know it. He is with us always.
  419.  
  420.