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