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