diff --git a/xpfe/components/sidebar/resources/customize.js b/xpfe/components/sidebar/resources/customize.js index 81aaf956d277..90a756a6b48a 100644 --- a/xpfe/components/sidebar/resources/customize.js +++ b/xpfe/components/sidebar/resources/customize.js @@ -51,11 +51,11 @@ function Init() all_panels_datasources = all_panels_datasources.split(/\s+/); for (var ii = 0; ii < all_panels_datasources.length; ii++) { - debug("Adding "+all_panels_datasources[ii]); + debug("Adding "+all_panels_datasources[ii]); // This will load the datasource, if it isn't already. var datasource = RDF.GetDataSource(all_panels_datasources[ii]); - all_panels.database.AddDataSource(datasource); + all_panels.database.AddDataSource(datasource); current_panels.database.AddDataSource(datasource); } @@ -69,9 +69,11 @@ function Init() current_panels.setAttribute('ref', sidebar.resource); saveInitialPanels(); - enableButtons(); + enableButtonsForCurrentPanels(); } +// Remember the original list of panels so that +// the save button can be enabled when something changes. function saveInitialPanels() { var root = document.getElementById('current-panels-root'); @@ -80,75 +82,47 @@ function saveInitialPanels() } } -function addOption(registry, service, selectIt) -{ - debug("Adding "+service.Value); - var option_title = getAttr(registry, service, 'title'); - var option_customize = getAttr(registry, service, 'customize'); - var option_content = getAttr(registry, service, 'content'); - - var tree = document.getElementById('current-panels'); - var treeroot = document.getElementById('current-panels-root'); - - // Check to see if the panel already exists... - for (var ii = treeroot.firstChild; ii != null; ii = ii.nextSibling) { - if (ii.getAttribute('id') == service.Value) { - // we already had the panel installed - tree.selectItem(ii); - return; - } - } - - - var item = document.createElement('treeitem'); - var row = document.createElement('treerow'); - var cell = document.createElement('treecell'); - - item.setAttribute('id', service.Value); - item.setAttribute('customize', option_customize); - item.setAttribute('content', option_content); - cell.setAttribute('value', option_title); - - item.appendChild(row); - row.appendChild(cell); - treeroot.appendChild(item); - - if (selectIt) { - debug("Selecting new item"); - tree.selectItem(item) - } -} - -function createOptionTitle(titletext) -{ - var title = document.createElement('html:option'); - var textOption = document.createTextNode(titletext); - title.appendChild(textOption); - - return textOption; -} - function getAttr(registry,service,attr_name) { var attr = registry.GetTarget(service, - RDF.GetResource(NC + attr_name), - true); + RDF.GetResource(NC + attr_name), + true); if (attr) attr = attr.QueryInterface(Components.interfaces.nsIRDFLiteral); if (attr) - attr = attr.Value; + attr = attr.Value; return attr; } -function selectChange() { - // Remove the selection in the other list +function SelectChangeForOtherPanels(event, target) +{ + // Remove the selection in the "current" panels list + var current_panels = document.getElementById('current-panels'); + current_panels.clearItemSelection(); + enableButtonsForCurrentPanels(); + + if (target.getAttribute('container') == 'true') { + if (target.getAttribute('open') == 'true') { + target.removeAttribute('open'); + } else { + target.setAttribute('open','true'); + } + return; + } + enableButtonsForOtherPanels(); +} + +// Handle a selection change in the current panels. +function SelectChangeForCurrentPanels() { + // Remove the selection in the available panels list var all_panels = document.getElementById('other-panels'); all_panels.clearItemSelection(); - enableButtons(); - enableOtherButtons(); + enableButtonsForCurrentPanels(); + enableButtonsForOtherPanels(); } -function moveUp() { +// Move the selected item up the the current panels list. +function MoveUp() { var tree = document.getElementById('current-panels'); if (tree.selectedItems.length == 1) { var selected = tree.selectedItems[0]; @@ -157,11 +131,12 @@ function moveUp() { tree.selectItem(selected); } } - enableButtons(); + enableButtonsForCurrentPanels(); enableSave(); } -function moveDown() { +// Move the selected item down the the current panels list. +function MoveDown() { var tree = document.getElementById('current-panels'); if (tree.selectedItems.length == 1) { var selected = tree.selectedItems[0]; @@ -175,11 +150,253 @@ function moveDown() { tree.selectItem(selected); } } - enableButtons(); + enableButtonsForCurrentPanels(); enableSave(); } -function enableButtons() { +function PreviewPanel() +{ + var tree = document.getElementById('other-panels'); + var database = tree.database; + var select_list = tree.selectedItems + for (var nodeIndex=0; nodeIndex 0) { + var selectedNode = tree.selectedItems[0] + nextNode = selectedNode.nextSibling; + if (!nextNode) { + nextNode = selectedNode.previousSibling; + } + selectedNode.parentNode.removeChild(selectedNode) + } + + if (nextNode) { + tree.selectItem(nextNode) + } + enableButtonsForCurrentPanels(); + enableSave(); +} + +// Bring up a new window with the customize url +// for an individual panel. +function CustomizePanel() +{ + var tree = document.getElementById('current-panels'); + var numSelected = tree.selectedItems.length; + + if (numSelected == 1) { + var selectedNode = tree.selectedItems[0]; + var customize_url = selectedNode.getAttribute('customize'); + + debug("url = " + customize_url); + + if (!customize_url) return; + + var customize = window.open(customize_url, "_blank", "resizable"); + } + enableSave(); +} + +// Serialize the new list of panels. +function Save() +{ + // Iterate through the 'current-panels' tree to collect the panels + // that the user has chosen. We need to do this _before_ we remove + // the panels from the datasource, because the act of removing them + // from the datasource will change the tree! + var panels = new Array(); + var root = document.getElementById('current-panels-root'); + for (var node = root.firstChild; node != null; node = node.nextSibling) { + panels[panels.length] = node.getAttribute('id'); + } + + start_batch(sidebar.datasource, sidebar.resource); + + // Now remove all the current panels from the datasource. + + // Create a "container" wrapper around the "urn:sidebar:current-panel-list" + // object. This makes it easier to manipulate the RDF:Seq correctly. + var container = Components.classes["component://netscape/rdf/container"].createInstance(); + container = container.QueryInterface(Components.interfaces.nsIRDFContainer); + container.Init(sidebar.datasource, RDF.GetResource(sidebar.resource)); + + for (var ii = container.GetCount(); ii >= 1; --ii) { + debug('removing panel ' + ii); + container.RemoveElementAt(ii, true); + } + + // Now iterate through the panels, and re-add them to the datasource + for (var ii = 0; ii < panels.length; ++ii) { + debug('adding ' + panels[ii]); + container.AppendElement(RDF.GetResource(panels[ii])); + } + + end_batch(sidebar.datasource, sidebar.resource); + + // Write the modified panels out. + sidebar.datasource.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource).Flush(); + + window.close(); +} + +// Mark the beginning of a batch by +// asserting inbatch="true" into the datasource. +// The observer in sidebarOverlay.js uses this to +// remember the panel selection. +function start_batch(datasource, resource) { + datasource.Assert(RDF.GetResource(resource), + RDF.GetResource(NC + "inbatch"), + RDF.GetLiteral("true"), + true); +} + +// Mark the end of a batch by +// unasserting 'inbatch' on the datasource. +function end_batch(datasource, resource) { + datasource.Unassert(RDF.GetResource(resource), + RDF.GetResource(NC + "inbatch"), + RDF.GetLiteral("true")); +} + +function enableButtonsForOtherPanels() +{ + var add_button = document.getElementById('add_button'); + var preview_button = document.getElementById('preview_button'); + var all_panels = document.getElementById('other-panels'); + + var num_selected = 0; + // Only count non-folders as selected for button enabling + for (var ii=0; ii 0) { + add_button.setAttribute('disabled',''); + preview_button.setAttribute('disabled',''); + } + else { + add_button.setAttribute('disabled','true'); + preview_button.setAttribute('disabled','true'); + } +} + +function enableButtonsForCurrentPanels() { var up = document.getElementById('up'); var down = document.getElementById('down'); var tree = document.getElementById('current-panels'); @@ -226,207 +443,29 @@ function enableButtons() { } } -function CustomizePanel() -{ - var tree = document.getElementById('selected-panels'); - var numSelected = tree.selectedItems.length; - - if (numSelected == 1) { - var selectedNode = tree.selectedItems[0]; - var customize_url = selectedNode.getAttribute('customize'); - - debug("url = " + customize_url); - - if (!customize_url) return; - - var customize = window.open(customize_url, "_blank", "resizable"); - } - enableSave(); -} - -function RemovePanel() -{ - var tree = document.getElementById('current-panels'); - - var nextNode = null; - var numSelected = tree.selectedItems.length - while (tree.selectedItems.length > 0) { - var selectedNode = tree.selectedItems[0] - nextNode = selectedNode.nextSibling; - if (!nextNode) { - nextNode = selectedNode.previousSibling; - } - selectedNode.parentNode.removeChild(selectedNode) - } - - if (nextNode) { - tree.selectItem(nextNode) - } - enableButtons(); - enableSave(); -} - - -function Save() -{ - // Iterate through the 'current-panels' tree to collect the panels - // that the user has chosen. We need to do this _before_ we remove - // the panels from the datasource, because the act of removing them - // from the datasource will change the tree! - var panels = new Array(); - var root = document.getElementById('current-panels-root'); - for (var node = root.firstChild; node != null; node = node.nextSibling) { - panels[panels.length] = node.getAttribute('id'); - } - - // Now remove all the current panels from the datasource. - - // Create a "container" wrapper around the "urn:sidebar:ccurent-panel-list" - // object. This makes it easier to manipulate the RDF:Seq correctly. - var container = Components.classes["component://netscape/rdf/container"].createInstance(); - container = container.QueryInterface(Components.interfaces.nsIRDFContainer); - container.Init(sidebar.datasource, RDF.GetResource(sidebar.resource)); - - for (var ii = container.GetCount(); ii >= 1; --ii) { - debug('removing panel ' + ii); - container.RemoveElementAt(ii, true); - } - - // Now iterate through the panels, and re-add them to the datasource - for (var ii = 0; ii < panels.length; ++ii) { - debug('adding ' + panels[ii]); - container.AppendElement(RDF.GetResource(panels[ii])); - } - - // Write the modified panels out. - sidebar.datasource.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource).Flush(); - - window.close(); -} - -function otherPanelSelected(event, target) -{ - // Remove the selection in the "current" panels list - var current_panels = document.getElementById('current-panels'); - current_panels.clearItemSelection(); - enableButtons(); - - if (target.getAttribute('container') == 'true') { - if (target.getAttribute('open') == 'true') { - target.removeAttribute('open'); - } else { - target.setAttribute('open','true'); - } - return; - } - enableOtherButtons(); -} - -function enableOtherButtons() -{ - var add_button = document.getElementById('add_button'); - var preview_button = document.getElementById('preview_button'); - var all_panels = document.getElementById('other-panels'); - - var num_selected = 0; - // Only count non-folders as selected for button enabling - for (var ii=0; ii 0) { - add_button.setAttribute('disabled',''); - preview_button.setAttribute('disabled',''); - } - else { - add_button.setAttribute('disabled','true'); - preview_button.setAttribute('disabled','true'); - } -} - -function AddPanel() -{ - var tree = document.getElementById('other-panels'); - var database = tree.database; - var select_list = tree.selectedItems - var isFirstAddition = true; - for (var nodeIndex=0; nodeIndex