home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World 2005 December
/
PCWorld_2005-12_cd.bin
/
komunikace
/
netscape
/
nsb-install-8-0.exe
/
chrome
/
toolkit.jar
/
content
/
global
/
nsWidgetStateManager.js
< prev
next >
Wrap
Text File
|
2005-09-26
|
11KB
|
362 lines
var wsm;
// For panels displayed inside the main dialog, this value will be the child iframe
// window. For panels displayed in sub-dialogs, those launched by panels of the main
// dialog, this will be the sub dialog window.
var gCurrentWindow = null;
function nsWidgetStateManager (aFrameID)
{
this.dataManager = {
/** Persisted Data Hash Table
* Page_ID -> Element_ID -> Property -> Value
**/
pageData: { },
setPageData: function (aPageTag, aDataObject)
{
this.pageData[aPageTag] = aDataObject;
},
getPageData: function (aPageTag)
{
if (!(aPageTag in this.pageData))
this.pageData[aPageTag] = { };
if (!('elementIDs' in this.pageData[aPageTag]))
this.pageData[aPageTag].elementIDs = new Object();
if (!('userData' in this.pageData[aPageTag]))
this.pageData[aPageTag].userData = new Object();
return this.pageData[aPageTag];
},
setItemData: function (aPageTag, aItemID, aDataObject)
{
if (!(aPageTag in this.pageData))
this.pageData[aPageTag] = new Object();
this.pageData[aPageTag].elementIDs[aItemID] = aDataObject;
},
getItemData: function (aPageTag, aItemID)
{
if (!(aItemID in this.pageData[aPageTag].elementIDs))
this.pageData[aPageTag].elementIDs[aItemID] = new Object();
return this.pageData[aPageTag].elementIDs[aItemID];
}
}
this.contentID = aFrameID;
wsm = this;
/** Element Handlers
* Provides default get and set handler functions for supported
* widgets. Clients can override or add new widgets.
**/
this.handlers = {
menulist:
{ get: wsm.get_Menulist, set: wsm.set_Menulist },
radiogroup:
{ get: wsm.get_Radiogroup, set: wsm.set_Radiogroup },
checkbox:
{ get: wsm.get_Checkbox, set: wsm.set_Checkbox },
textbox:
{ get: wsm.get_Textbox, set: wsm.set_Textbox },
listitem:
{ get: wsm.get_Listitem, set: wsm.set_Listitem },
data:
{ get: wsm.get_Data, set: wsm.set_Data },
default_handler:
{ get: wsm.get_Default, set: wsm.set_Default }
}
// extra attributes to scan and save.
this.attributes = [];
}
nsWidgetStateManager.prototype =
{
get contentArea ()
{
return window.frames[this.contentID];
},
savePageData: function (aPageTag, aWindow)
{
gCurrentWindow = aWindow || this.contentArea;
if (!(aPageTag in this.dataManager.pageData))
return;
if ("GetFields" in gCurrentWindow) {
// save page data based on user supplied function in content area
var dataObject = gCurrentWindow.GetFields();
if (dataObject)
this.dataManager.pageData[aPageTag].userData = dataObject;
}
// Automatic element retrieval. This is done in two ways.
// 1) if an element id array is present in the document, this is
// used to build a list of elements to persist. <-- performant
// 2) otherwise, all elements with "wsm_persist" set to true
// are persisted <-- non-performant.
var elements;
if ("_elementIDs" in gCurrentWindow) {
elements = [];
// MERC: since the Anonymous Mode checkbox sits outside of the prefs frame,
// it does not get added to the list of prefs to save to file.
// So we have to do it manually. Make sure we only add on the
// privacy page (i.e. a page that contains kiosk checkbox).
var pageData = this.dataManager.getPageData(aPageTag);
for (var oneElemID in pageData.elementIDs) {
if (oneElemID == "toggleAnonMode") {
gCurrentWindow._elementIDs[gCurrentWindow._elementIDs.length] = "toggleAnonMode";
break;
}
}
// MERC
for (var i = 0; i < gCurrentWindow._elementIDs.length; i++) {
var elt = gCurrentWindow.document.getElementById(gCurrentWindow._elementIDs[i]);
if (elt)
elements[elements.length] = elt;
else {
// see bug #40329. People forget this too often, and it breaks Prefs
dump("*** FIX ME: '_elementIDs' in '" + gCurrentWindow.location.href.split('/').pop() +
"' contains a reference to a non-existent element ID '" +
gCurrentWindow._elementIDs[i] + "'.\n");
}
}
}
else
elements = gCurrentWindow.document.getElementsByAttribute("wsm_persist", "true");
for (var ii = 0; ii < elements.length; ii++) {
var elementID = elements[ii].id;
var elementType = elements[ii].localName;
// persist attributes
var get_Func = (elementType in this.handlers) ?
this.handlers[elementType].get :
this.handlers.default_handler.get;
this.dataManager.setItemData(aPageTag, elementID, get_Func(elementID));
}
},
setPageData: function (aPageTag, aWindow)
{
gCurrentWindow = aWindow || this.contentArea;
var pageData = this.dataManager.getPageData(aPageTag);
if ("SetFields" in gCurrentWindow)
gCurrentWindow.SetFields(pageData.userData)
if (!('elementIDs' in pageData))
return;
for (var elementID in pageData.elementIDs) {
var element = gCurrentWindow.document.getElementById(elementID);
if (element) {
var elementType = element.localName;
var set_Func = (elementType in this.handlers) ?
this.handlers[elementType].set :
this.handlers.default_handler.set;
set_Func(elementID, pageData.elementIDs[elementID]);
}
}
},
/** Widget Get/Set Function Implementations
* These can be overridden by the client.
**/
generic_Set: function (aElement, aDataObject)
{
if (aElement) {
for (var property in aDataObject) {
if (property == "localname")
continue;
if (!aDataObject[property] && typeof aDataObject[property] == "boolean")
aElement.removeAttribute(property);
else
aElement.setAttribute(property, aDataObject[property]);
}
if (!aElement.getAttribute("disabled","true"))
aElement.removeAttribute("disabled");
}
},
generic_Get: function (aElement)
{
if (aElement) {
var dataObject = new Object();
var wsmAttributes = aElement.getAttribute("wsm_attributes");
var attributes = wsm.attributes; // make a copy
if (wsmAttributes != "")
attributes.push(wsmAttributes.split(" ")); // modify the copy
for (var i = 0; i < attributes.length; i++)
dataObject[attributes[i]] = aElement.getAttribute(attributes[i]);
dataObject.localname = aElement.localName;
return dataObject;
}
return null;
},
// <menulist>
set_Menulist: function (aElementID, aDataObject)
{
var element = gCurrentWindow.document.getElementById(aElementID);
// set all generic properties
wsm.generic_Set(element, aDataObject);
// set menulist specific properties
if ("value" in aDataObject) {
try {
element.value = aDataObject.value;
}
catch (ex) {
dump(aElementID + ", ex: " + ex + "\n");
}
}
},
get_Menulist: function (aElementID)
{
var element = gCurrentWindow.document.getElementById(aElementID);
// retrieve all generic attributes
var dataObject = wsm.generic_Get(element);
// retrieve all menulist specific attributes
if (dataObject) {
dataObject.value = element.getAttribute("value");
return dataObject;
}
return null;
},
// <radiogroup>
set_Radiogroup: function (aElementID, aDataObject)
{
var element = gCurrentWindow.document.getElementById(aElementID);
wsm.generic_Set(element, aDataObject);
if ("value" in aDataObject)
element.selectedItem = element.getElementsByAttribute("value", aDataObject.value)[0];
if ("disabled" in aDataObject)
element.disabled = aDataObject.disabled;
},
get_Radiogroup: function (aElementID)
{
var element = gCurrentWindow.document.getElementById(aElementID);
var dataObject = wsm.generic_Get(element);
if (dataObject) {
dataObject.value = element.getAttribute("value");
return dataObject;
}
return null;
},
// <textbox>
set_Textbox: function (aElementID, aDataObject)
{
var element = gCurrentWindow.document.getElementById(aElementID);
wsm.generic_Set(element, aDataObject);
},
get_Textbox: function (aElementID)
{
var element = gCurrentWindow.document.getElementById(aElementID);
var dataObject = wsm.generic_Get(element);
if (dataObject) {
dataObject.value = element.value;
return dataObject;
}
return null;
},
// <checkbox>
set_Checkbox: function (aElementID, aDataObject)
{
var element = gCurrentWindow.document.getElementById(aElementID);
// Set generic properites.
wsm.generic_Set(element, aDataObject);
// Handle reversed boolean values.
if ("checked" in aDataObject && element.hasAttribute("reversed"))
element.checked = !aDataObject.checked;
},
get_Checkbox: function (aElementID)
{
var element = gCurrentWindow.document.getElementById(aElementID);
var dataObject = wsm.generic_Get(element);
if (dataObject) {
var checked = element.checked;
dataObject.checked = element.getAttribute("reversed") == "true" ? !checked : checked;
return dataObject;
}
return null;
},
// <listitem>
set_Listitem: function (aElementID, aDataObject)
{
var element = gCurrentWindow.document.getElementById(aElementID);
wsm.generic_Set(element, aDataObject);
},
get_Listitem: function (aElementID)
{
var element = gCurrentWindow.document.getElementById(aElementID);
var dataObject = wsm.generic_Get(element);
if (dataObject) {
if (element.getAttribute("type") == "checkbox")
dataObject.checked = element.checked;
return dataObject;
}
return null;
},
// <data>
set_Data: function (aElementID, aDataObject)
{
var element = gCurrentWindow.document.getElementById(aElementID);
wsm.generic_Set(element, aDataObject);
if ("value" in aDataObject)
element.setAttribute("value", aDataObject.value);
},
get_Data: function (aElementID)
{
var element = gCurrentWindow.document.getElementById(aElementID);
var dataObject = wsm.generic_Get(element);
if (dataObject) {
dataObject.value = element.getAttribute("value");
return dataObject;
}
return null;
},
// <default>
set_Default: function (aElementID, aDataObject)
{
var element = gCurrentWindow.document.getElementById(aElementID);
wsm.generic_Set(element, aDataObject);
},
get_Default: function (aElementID)
{
var element = gCurrentWindow.document.getElementById(aElementID);
var dataObject = wsm.generic_Get(element);
return dataObject ? dataObject : null;
}
}