/* -*- Mode: Java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- * * The contents of this file are subject to the Netscape Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/NPL/ * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is mozilla.org code. * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1998 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): */ function debug(msg) { // uncomment for noise //dump(msg+"\n"); } function copySelectionToClipboard() { var treeNode = document.getElementById("bookmarksTree"); if (!treeNode) return(false); var select_list = treeNode.selectedItems; if (!select_list) return(false); if (select_list.length < 1) return(false); debug("# of Nodes selected: " + select_list.length + "\n"); var RDF = Components.classes["component://netscape/rdf/rdf-service"].getService(); RDF = RDF.QueryInterface(Components.interfaces.nsIRDFService); if (!RDF) return(false); var Bookmarks = RDF.GetDataSource("rdf:bookmarks"); if (!Bookmarks) return(false); var nameRes = RDF.GetResource("http://home.netscape.com/NC-rdf#Name"); if (!nameRes) return(false); // build a url that encodes all the select nodes as well as their parent nodes var url=""; for (var nodeIndex=0; nodeIndex 0) { dump("Unable to add ID:'" + theID + "' as its already in this folder.\n"); continue; } if (theName != "") { var NameLiteral = RDF.GetLiteral(theName); if (NameLiteral) { Bookmarks.Assert(IDRes, nameRes, NameLiteral, true); dirty = true; } } if (isContainerFlag == true) { RDFC.AppendElement(IDRes); debug("Appended node onto end of container"); } else { RDFC.InsertElementAt(IDRes, pasteNodeIndex++, true); debug("Pasted at index # " + pasteNodeIndex); } dirty = true; } } if (dirty == true) { var remote = Bookmarks.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource); if (remote) { remote.Flush(); debug("Wrote out bookmark changes."); } } return(true); } function doDelete(promptFlag) { var treeNode = document.getElementById("bookmarksTree"); if (!treeNode) return(false); var select_list = treeNode.selectedItems; if (!select_list) return(false); if (select_list.length < 1) return(false); debug("# of Nodes selected: " + select_list.length); if (promptFlag == true) { var ok = confirm("Delete the selected bookmark(s)?"); if (!ok) return(false); } var RDF = Components.classes["component://netscape/rdf/rdf-service"].getService(); RDF = RDF.QueryInterface(Components.interfaces.nsIRDFService); if (!RDF) return(false); var RDFC = Components.classes["component://netscape/rdf/container"].getService(); RDFC = RDFC.QueryInterface(Components.interfaces.nsIRDFContainer); if (!RDFC) return(false); var Bookmarks = RDF.GetDataSource("rdf:bookmarks"); if (!Bookmarks) return(false); var dirty = false; // note: backwards delete so that we handle odd deletion cases such as // deleting a child of a folder as well as the folder itself for (var nodeIndex=select_list.length-1; nodeIndex>=0; nodeIndex--) { var node = select_list[nodeIndex]; if (!node) continue; var ID = node.getAttribute("id"); if (!ID) continue; var parentID = node.parentNode.parentNode.getAttribute("ref"); if (!parentID) parentID = node.parentNode.parentNode.getAttribute("id"); if (!parentID) continue; debug("Node " + nodeIndex + ": " + ID); debug("Parent Node " + nodeIndex + ": " + parentID); var IDRes = RDF.GetResource(ID); if (!IDRes) continue; var parentIDRes = RDF.GetResource(parentID); if (!parentIDRes) continue; RDFC.Init(Bookmarks, parentIDRes); RDFC.RemoveElement(IDRes, true); dirty = true; } if (dirty == true) { var remote = Bookmarks.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource); if (remote) { remote.Flush(); debug("Wrote out bookmark changes."); } } return(true); } function doSelectAll() { var treeNode = document.getElementById("bookmarksTree"); if (!treeNode) return(false); treeNode.selectAll(); return(true); } function doUnload() { // Get the current window position/size. var x = window.screenX; var y = window.screenY; var h = window.outerHeight; var w = window.outerWidth; // Store these into the window attributes (for persistence). var win = document.getElementById( "bookmark-window" ); win.setAttribute( "x", x ); win.setAttribute( "y", y ); win.setAttribute( "height", h ); win.setAttribute( "width", w ); } function BookmarkProperties() { var treeNode = document.getElementById('bookmarksTree'); // var select_list = treeNode.getElementsByAttribute("selected", "true"); var select_list = treeNode.selectedItems; if (select_list.length >= 1) { // don't bother showing properties on bookmark separators var type = select_list[0].getAttribute('type'); if (type != "http://home.netscape.com/NC-rdf#BookmarkSeparator") { window.openDialog("chrome://bookmarks/content/bm-props.xul", "_blank", "chrome,menubar", select_list[0].getAttribute("id")); } } else { debug("nothing selected!\n"); } return(true); } function OpenSearch(tabName) { window.openDialog("chrome://search/content/search.xul", "SearchWindow", "dialog=no,close,chrome,resizable", tabName, ""); return(true); } function getAbsoluteID(root, node) { var url = node.getAttribute("ref"); if ((url == null) || (url == "")) { url = node.getAttribute("id"); } try { var rootNode = document.getElementById(root); var ds = null; if (rootNode) { ds = rootNode.database; } // add support for anonymous resources such as Internet Search results, // IE favorites under Win32, and NetPositive URLs under BeOS var rdf = Components.classes["component://netscape/rdf/rdf-service"].getService(); if (rdf) rdf = rdf.QueryInterface(Components.interfaces.nsIRDFService); if (rdf && ds) { var src = rdf.GetResource(url, true); var prop = rdf.GetResource("http://home.netscape.com/NC-rdf#URL", true); var target = ds.GetTarget(src, prop, true); if (target) target = target.QueryInterface(Components.interfaces.nsIRDFLiteral); if (target) target = target.Value; if (target) url = target; } } catch(ex) { } return(url); } function OpenURL(event, node, root) { if (event.clickCount != 2 || node.nodeName != "treeitem") return(false); if (node.getAttribute('container') == "true") return(false); var url = getAbsoluteID(root, node); // Ignore "NC:" urls. if (url.substring(0, 3) == "NC:") return(false); // get right sized window window.openDialog( "chrome://navigator/content/navigator.xul", "_blank", "chrome,all,dialog=no", url ); return(true); } function doSort(sortColName) { var node = document.getElementById(sortColName); // determine column resource to sort on var sortResource = node.getAttribute('resource'); if (!node) return(false); var sortDirection="ascending"; var isSortActive = node.getAttribute('sortActive'); if (isSortActive == "true") { var currentDirection = node.getAttribute('sortDirection'); if (currentDirection == "ascending") sortDirection = "descending"; else if (currentDirection == "descending") sortDirection = "natural"; else sortDirection = "ascending"; } var isupports = Components.classes["component://netscape/rdf/xul-sort-service"].getService(); if (!isupports) return(false); var xulSortService = isupports.QueryInterface(Components.interfaces.nsIXULSortService); if (!xulSortService) return(false); try { xulSortService.Sort(node, sortResource, sortDirection); } catch(ex) { debug("Exception calling xulSortService.Sort()"); } return(false); } function fillContextMenu(name) { if (!name) return(false); var popupNode = document.getElementById(name); if (!popupNode) return(false); // remove the menu node (which tosses all of its kids); // do this in case any old command nodes are hanging around while (popupNode.childNodes.length) { popupNode.removeChild(popupNode.childNodes[0]); } var treeNode = document.getElementById("bookmarksTree"); if (!treeNode) return(false); var db = treeNode.database; if (!db) return(false); var compositeDB = db.QueryInterface(Components.interfaces.nsIRDFDataSource); if (!compositeDB) return(false); var isupports = Components.classes["component://netscape/rdf/rdf-service"].getService(); if (!isupports) return(false); var rdf = isupports.QueryInterface(Components.interfaces.nsIRDFService); if (!rdf) return(false); var target_item = document.popupNode.parentNode.parentNode; if (target_item.getAttribute('selected') != 'true') { treeNode.selectItem(target_item); } var select_list = treeNode.selectedItems; debug("# of Nodes selected: " + treeNode.selectedItems.length); // perform intersection of commands over selected nodes var cmdArray = new Array(); for (var nodeIndex=0; nodeIndex 0) { // perform command intersection calculation for (var cmdIndex = 0; cmdIndex < cmdArray.length; cmdIndex++) { var cmdFound = false; for (var nextCmdIndex = 0; nextCmdIndex < nextCmdArray.length; nextCmdIndex++) { if (nextCmdArray[nextCmdIndex] == cmdArray[cmdIndex]) { cmdFound = true; break; } } if (cmdFound == false) { cmdArray[cmdIndex] = null; } } } } // need a resource to ask RDF for each command's name var rdfNameResource = rdf.GetResource("http://home.netscape.com/NC-rdf#Name"); if (!rdfNameResource) return(false); // build up menu items if (cmdArray.length < 1) return(false); for (var cmdIndex = 0; cmdIndex < cmdArray.length; cmdIndex++) { var cmd = cmdArray[cmdIndex]; if (!cmd) continue; var cmdResource = cmd.QueryInterface(Components.interfaces.nsIRDFResource); if (!cmdResource) break; var cmdNameNode = compositeDB.GetTarget(cmdResource, rdfNameResource, true); if (!cmdNameNode) break; cmdNameLiteral = cmdNameNode.QueryInterface(Components.interfaces.nsIRDFLiteral); if (!cmdNameLiteral) break; cmdName = cmdNameLiteral.Value; if (!cmdName) break; debug("Command #" + cmdIndex + ": id='" + cmdResource.Value + "' name='" + cmdName + "'"); var menuItem = document.createElement("menuitem"); menuItem.setAttribute("value", cmdName); menuItem.setAttribute("oncommand", "return doContextCmd('" + cmdResource.Value + "');"); popupNode.appendChild(menuItem); } return(true); } function doContextCmd(cmdName) { debug("doContextCmd start: cmd='" + cmdName + "'"); var treeNode = document.getElementById("bookmarksTree"); if (!treeNode) return(false); var db = treeNode.database; if (!db) return(false); var compositeDB = db.QueryInterface(Components.interfaces.nsIRDFDataSource); if (!compositeDB) return(false); var isupports = Components.classes["component://netscape/rdf/rdf-service"].getService(); if (!isupports) return(false); var rdf = isupports.QueryInterface(Components.interfaces.nsIRDFService); if (!rdf) return(false); // need a resource for the command var cmdResource = rdf.GetResource(cmdName); if (!cmdResource) return(false); cmdResource = cmdResource.QueryInterface(Components.interfaces.nsIRDFResource); if (!cmdResource) return(false); var select_list = treeNode.selectedItems; if (!select_list) return(false); if (select_list.length < 1) return(false); debug("# of Nodes selected: " + select_list.length); // set up selection nsISupportsArray var selectionInstance = Components.classes["component://netscape/supports-array"].createInstance(); var selectionArray = selectionInstance.QueryInterface(Components.interfaces.nsISupportsArray); // set up arguments nsISupportsArray var argumentsInstance = Components.classes["component://netscape/supports-array"].createInstance(); var argumentsArray = argumentsInstance.QueryInterface(Components.interfaces.nsISupportsArray); // get argument (parent) var parentArc = rdf.GetResource("http://home.netscape.com/NC-rdf#parent"); if (!parentArc) return(false); for (var nodeIndex=0; nodeIndex