home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 January / 01_02.iso / software / netscape62win / browser.xpi / bin / chrome / comm.jar / content / editor / sb-bookmarks.js < prev    next >
Encoding:
JavaScript  |  2001-03-21  |  17.8 KB  |  565 lines

  1. /*
  2.  * The contents of this file are subject to the Netscape Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/NPL/
  6.  *
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  *
  12.  * The Original Code is Mozilla Communicator client code, released
  13.  * March 31, 1998.
  14.  *
  15.  * The Initial Developer of the Original Code is Netscape
  16.  * Communications Corporation. Portions created by Netscape are
  17.  * Copyright (C) 1999 Netscape Communications Corporation. All
  18.  * Rights Reserved.
  19.  *
  20.  * Contributor(s):
  21.  *   Ben Goodger
  22.  */
  23.  
  24.  
  25. /*
  26.   Script for the bookmarks properties window
  27. */
  28.  
  29. function BookmarkProperties()
  30. {
  31.   var tree = document.getElementById('bookmarksTree');
  32.   var select_list = tree.getElementsByAttribute("selected", "true");
  33.  
  34.   if (select_list.length >= 1) {
  35.  
  36.   // don't bother showing properties on bookmark separators
  37.   var type = select_list[0].getAttribute('type');
  38.         if (type != "http://home.netscape.com/NC-rdf#BookmarkSeparator")
  39.         {
  40.     var props = window.open("chrome://communicator/content/bookmarks/bm-props.xul",
  41.                                 "BookmarkProperties", "chrome,menubar,resizable");
  42.     props.BookmarkURL = select_list[0].getAttribute("id");
  43.   }
  44.   } else {
  45.     dump("nothing selected!\n");
  46.   }
  47. }
  48.  
  49. function OpenSearch(tabName)
  50. {
  51.   window.openDialog("resource:/res/samples/search.xul", "SearchWindow", "dialog=no,close,chrome,resizable", tabName);
  52. }
  53.  
  54. function OpenURL(event, node)
  55. {
  56.     // clear any single-click/edit timeouts
  57.     if (timerID != null)
  58.     {
  59.         gEditNode = null;
  60.         clearTimeout(timerID);
  61.         timerID = null;
  62.     }
  63.  
  64.     if (node.getAttribute('container') == "true")
  65.     {
  66.         return(false);
  67.     }
  68.  
  69.     var url = node.getAttribute('id');
  70.  
  71.     // Ignore "NC:" urls.
  72.     if (url.substring(0, 3) == "NC:")
  73.     {
  74.         return(false);
  75.     }
  76.  
  77.   try
  78.   {
  79.     // add support for IE favorites under Win32, and NetPositive URLs under BeOS
  80.     if (url.indexOf("file://") == 0)
  81.     {
  82.       var rdf = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService();
  83.       if (rdf)   rdf = rdf.QueryInterface(Components.interfaces.nsIRDFService);
  84.       if (rdf)
  85.       {
  86.         var fileSys = rdf.GetDataSource("rdf:files");
  87.         if (fileSys)
  88.         {
  89.           var src = rdf.GetResource(url, true);
  90.           var prop = rdf.GetResource("http://home.netscape.com/NC-rdf#URL", true);
  91.           var target = fileSys.GetTarget(src, prop, true);
  92.           if (target) target = target.QueryInterface(Components.interfaces.nsIRDFLiteral);
  93.           if (target) target = target.Value;
  94.           if (target) url = target;
  95.  
  96.         }
  97.       }
  98.     }
  99.   }
  100.   catch(ex)
  101.   {
  102.   }
  103.  
  104.     if(top.isEditor != undefined) {
  105.         dump("yay, top.isEditor is defined\n");
  106.         if(top.editorShell) {
  107.             dump("yay yay, top.editorShell exists, loading URL...\n");
  108.             toEditor(url);
  109.         }
  110.     } else {
  111.         dump("reg'lar bm window\n");
  112.         window.open(url,'bookmarks');
  113.     }
  114.  
  115.     dump("OpenURL(" + url + ")\n");
  116.  
  117.     return(true);
  118. }
  119.  
  120. var htmlInput = null;
  121. var saveNode = null;
  122. var newValue = "";
  123. var timerID = null;
  124. var gEditNode = null;
  125.  
  126. function DoSingleClick(event, node)
  127. {
  128.   var type = node.parentNode.parentNode.getAttribute('type');
  129.   var selected = node.parentNode.parentNode.getAttribute('selected');
  130.  
  131.   if (gEditNode == node) {
  132.     // Only start an inline edit if it is the second consecutive click
  133.     // on the same node that is not already editing or a separator.
  134.     if (!htmlInput &&
  135.         type != "http://home.netscape.com/NC-rdf#BookmarkSeparator") {
  136.       // Edit node if we don't get a double-click in less than 1/2 second
  137.       timerID = setTimeout("OpenEditNode()", 500);
  138.     }
  139.   } else {
  140.     if (htmlInput) {
  141.       // Clicked during an edit
  142.       // Save the changes and move on
  143.       CloseEditNode(true);
  144.     }
  145.     gEditNode = node;
  146.   }
  147.   return false;
  148. }
  149.  
  150. function OpenEditNode()
  151. {
  152.     dump("OpenEditNode entered.\n");
  153.  
  154.     // clear any single-click/edit timeouts
  155.     if (timerID != null)
  156.     {
  157.         clearTimeout(timerID);
  158.         timerID = null;
  159.     }
  160.  
  161.     // XXX uncomment the following line to replace the whole input row we do this
  162.     // (and, therefore, only allow editing on the name column) until we can
  163.     // arbitrarily change the content model (bugs prevent this at the moment)
  164.     gEditNode = gEditNode.parentNode;
  165.  
  166.     var name = gEditNode.parentNode.getAttribute("Name");
  167.     dump("Single click on '" + name + "'\n");
  168.  
  169.     var theParent = gEditNode.parentNode;
  170.     dump("Parent node is a " + theParent.nodeName + "\n\n");
  171.  
  172.     saveNode = gEditNode;
  173.  
  174.     // unselect all nodes!
  175.     var select_list = document.getElementsByAttribute("selected", "true");
  176.     dump("# of Nodes selected: " + select_list.length + "\n\n");
  177.     for (var nodeIndex=0; nodeIndex<select_list.length; nodeIndex++)
  178.     {
  179.         var node = select_list[nodeIndex];
  180.         if (node)
  181.         {
  182.           dump("Unselecting node "+node.getAttribute("Name") + "\n");
  183.           node.removeAttribute("selected");
  184.         }
  185.     }
  186.  
  187.     // XXX for now, just remove the child from the parent
  188.     // optimally, we'd like to not remove the child-parent relationship
  189.     // and instead just set a "display: none;" attribute on the child node
  190.  
  191. //    gEditNode.setAttribute("style", "display: none;");
  192. //    dump("gEditNode hidden.\n");
  193.     theParent.removeChild(gEditNode);
  194.     gEditNode = null;
  195.     dump("gEditNode removed.\n");
  196.  
  197.     // create the html:input node
  198.     htmlInput = document.createElementNS("http://www.w3.org/1999/xhtml", "html:input");
  199.     htmlInput.setAttribute("value", name);
  200.     htmlInput.setAttribute("onkeypress", "return EditNodeKeyPress(event)");
  201.  
  202.     theParent.appendChild(htmlInput);
  203.     dump("html:input node added.\n");
  204.  
  205.     htmlInput.focus();
  206.  
  207.     dump("OpenEditNode done.\n");
  208.     return(true);
  209. }
  210.  
  211. function CloseEditNode(saveChangeFlag)
  212. {
  213.     dump("CloseEditNode entered.\n");
  214.  
  215.     if (htmlInput)
  216.     {
  217.         if (saveChangeFlag)
  218.         {
  219.             newValue = htmlInput.value;
  220.         }
  221.         dump("  Got html input: "+newValue+" \n");
  222.  
  223.         var theParent = htmlInput.parentNode;
  224.         theParent.removeChild(htmlInput);
  225.         theParent.appendChild(saveNode);
  226.         dump("  child node appended.\n");
  227.  
  228.         if (saveNode && saveChangeFlag)
  229.         {
  230.             var RDF = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService();
  231.             RDF = RDF.QueryInterface(Components.interfaces.nsIRDFService);
  232.             var Bookmarks = RDF.GetDataSource("rdf:bookmarks");
  233.             dump("Got bookmarks datasource.\n");
  234.  
  235.             // XXX once we support multi-column editing, get the property
  236.             // from the column in the content model
  237.             var propertyName = "http://home.netscape.com/NC-rdf#Name";
  238.             var propertyNode = RDF.GetResource(propertyName, true);
  239.             dump("  replacing value of property '" + propertyName + "'\n");
  240.  
  241.             // get the URI
  242.             var theNode = saveNode;
  243.             var bookmarkURL = "";
  244.             while(true)
  245.             {
  246.                 var tag = theNode.nodeName;
  247.                 if (tag == "treeitem")
  248.                 {
  249.                     bookmarkURL = theNode.getAttribute("id");
  250.                     break;
  251.                 }
  252.                 theNode = theNode.parentNode;
  253.             }
  254.             dump("  uri is '" + bookmarkURL + "'\n");
  255.  
  256.             if (bookmarkURL == "")    return(false);
  257.             var bookmarkNode = RDF.GetResource(bookmarkURL, true);
  258.  
  259.  
  260.             dump("  newValue = '" + newValue + "'\n");
  261.             newValue = (newValue != "") ? RDF.GetLiteral(newValue) : null;
  262.  
  263.             var oldValue = Bookmarks.GetTarget(bookmarkNode, propertyNode, true);
  264.             if (oldValue)
  265.             {
  266.                 oldValue = oldValue.QueryInterface(Components.interfaces.nsIRDFLiteral);
  267.                 dump("  oldValue = '" + oldValue + "'\n");
  268.             }
  269.  
  270.             if (oldValue != newValue)
  271.             {
  272.                 if (oldValue && !newValue)
  273.                 {
  274.                     Bookmarks.Unassert(bookmarkNode, propertyNode, oldValue);
  275.                     dump("  Unassert used.\n");
  276.                 }
  277.                 else if (!oldValue && newValue)
  278.                 {
  279.                     Bookmarks.Assert(bookmarkNode, propertyNode, newValue, true);
  280.                     dump("  Assert used.\n");
  281.                 }
  282.                 else if (oldValue && newValue)
  283.                 {
  284.                     Bookmarks.Change(bookmarkNode, propertyNode, oldValue, newValue);
  285.                     dump("  Change used.\n");
  286.                 }
  287.  
  288.                 dump("re-writing bookmarks.html\n");
  289.                 var remote = Bookmarks.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);
  290.                 remote.Flush();
  291.             }
  292.  
  293.             newValue = "";
  294.             saveNode = null;
  295.         }
  296.         else dump("saveNode was null?\n");
  297.         htmlInput = null;
  298.     }
  299.     else dump("htmlInput was null?\n");
  300.  
  301.     dump("CloseEditNode done.\n");
  302. }
  303.  
  304. function EditNodeKeyPress(event)
  305. {
  306.     if (event.keyCode == 27)
  307.     {
  308.         CloseEditNode(false);
  309.         return(false);
  310.     }
  311.     else if (event.keyCode == 13 || event.keyCode == 10)
  312.     {
  313.         CloseEditNode(true);
  314.         return(false);
  315.     }
  316.     return(true);
  317. }
  318.  
  319. function doSort(sortColName)
  320. {
  321.   var node = document.getElementById(sortColName);
  322.   // determine column resource to sort on
  323.   var sortResource = node.getAttribute('resource');
  324.   if (!node) return(false);
  325.  
  326.   var sortDirection="ascending";
  327.   var isSortActive = node.getAttribute('sortActive');
  328.   if (isSortActive == "true") {
  329.     var currentDirection = node.getAttribute('sortDirection');
  330.     if (currentDirection == "ascending")
  331.       sortDirection = "descending";
  332.     else if (currentDirection == "descending")
  333.       sortDirection = "natural";
  334.     else
  335.       sortDirection = "ascending";
  336.   }
  337.  
  338.   // get RDF Core service
  339.   var rdfCore = XPAppCoresManager.Find("RDFCore");
  340.   if (!rdfCore) {
  341.     rdfCore = new RDFCore();
  342.     if (!rdfCore) {
  343.       return(false);
  344.     }
  345.     rdfCore.Init("RDFCore");
  346. //    XPAppCoresManager.Add(rdfCore);
  347.   }
  348.   // sort!!!
  349.   rdfCore.doSort(node, sortResource, sortDirection);
  350.   return(false);
  351. }
  352.  
  353.  
  354. function fillContextMenu(name)
  355. {
  356.     if (!name)    return(false);
  357.     var popupNode = document.getElementById(name);
  358.     if (!popupNode)    return(false);
  359.  
  360.     // remove the menu node (which tosses all of its kids);
  361.     // do this in case any old command nodes are hanging around
  362.     var menuNode = popupNode.childNodes[0];
  363.     popupNode.removeChild(menuNode);
  364.  
  365.     // create a new menu node
  366.     menuNode = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "menu");
  367.     popupNode.appendChild(menuNode);
  368.  
  369.     var treeNode = document.getElementById("bookmarksTree");
  370.     if (!treeNode)    return(false);
  371.     var db = treeNode.database;
  372.     if (!db)    return(false);
  373.  
  374.     var compositeDB = db.QueryInterface(Components.interfaces.nsIRDFDataSource);
  375.     if (!compositeDB)    return(false);
  376.  
  377.     var isupports = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService();
  378.     if (!isupports)    return(false);
  379.     var rdf = isupports.QueryInterface(Components.interfaces.nsIRDFService);
  380.     if (!rdf)    return(false);
  381.  
  382.     var select_list = treeNode.getElementsByAttribute("selected", "true");
  383.     if (select_list.length < 1)    return(false);
  384.  
  385.     dump("# of Nodes selected: " + select_list.length + "\n\n");
  386.  
  387.     // perform intersection of commands over selected nodes
  388.     var cmdArray = new Array();
  389.  
  390.     for (var nodeIndex=0; nodeIndex<select_list.length; nodeIndex++)
  391.     {
  392.         var node = select_list[nodeIndex];
  393.         if (!node)    break;
  394.         var id = node.getAttribute("id");
  395.         if (!id)    break;
  396.         var rdfNode = rdf.GetResource(id);
  397.         if (!rdfNode)    break;
  398.         var cmdEnum = db.GetAllCmds(rdfNode);
  399.         if (!cmdEnum)    break;
  400.  
  401.         var nextCmdArray = new Array();
  402.         while (cmdEnum.hasMoreElements())
  403.         {
  404.             var cmd = cmdEnum.getNext();
  405.             if (!cmd)    break;
  406.             if (nodeIndex == 0)
  407.             {
  408.                 cmdArray[cmdArray.length] = cmd;
  409.             }
  410.             else
  411.             {
  412.                 nextCmdArray[cmdArray.length] = cmd;
  413.             }
  414.         }
  415.         if (nodeIndex > 0)
  416.         {
  417.             // perform command intersection calculation
  418.             for (var cmdIndex = 0; cmdIndex < cmdArray.length; cmdIndex++)
  419.             {
  420.                 var    cmdFound = false;
  421.                 for (var nextCmdIndex = 0; nextCmdIndex < nextCmdArray.length; nextCmdIndex++)
  422.                 {
  423.                     if (nextCmdArray[nextCmdIndex] == cmdArray[cmdIndex])
  424.                     {
  425.                         cmdFound = true;
  426.                         break;
  427.                     }
  428.                 }
  429.                 if (cmdFound == false)
  430.                 {
  431.                     cmdArray[cmdIndex] = null;
  432.                 }
  433.             }
  434.         }
  435.     }
  436.  
  437.     // need a resource to ask RDF for each command's name
  438.     var rdfNameResource = rdf.GetResource("http://home.netscape.com/NC-rdf#Name");
  439.     if (!rdfNameResource)        return(false);
  440.  
  441.     // build up menu items
  442.     if (cmdArray.length < 1)    return(false);
  443.  
  444.     for (var cmdIndex = 0; cmdIndex < cmdArray.length; cmdIndex++)
  445.     {
  446.         var cmd = cmdArray[cmdIndex];
  447.         if (!cmd)        continue;
  448.         var cmdResource = cmd.QueryInterface(Components.interfaces.nsIRDFResource);
  449.         if (!cmdResource)    break;
  450.         var cmdNameNode = compositeDB.GetTarget(cmdResource, rdfNameResource, true);
  451.         if (!cmdNameNode)    break;
  452.         cmdNameLiteral = cmdNameNode.QueryInterface(Components.interfaces.nsIRDFLiteral);
  453.         if (!cmdNameLiteral)    break;
  454.         cmdName = cmdNameLiteral.Value;
  455.         if (!cmdName)        break;
  456.  
  457.         dump("Command #" + cmdIndex + ": id='" + cmdResource.Value + "'  name='" + cmdName + "'\n\n");
  458.  
  459.         var menuItem = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "menuitem");
  460.         menuItem.setAttribute("label", cmdName);
  461.         menuItem.setAttribute("onaction", "return doContextCmd('" + cmdResource.Value + "');");
  462.  
  463.         menuNode.appendChild(menuItem);
  464.     }
  465.  
  466.     return(true);
  467. }
  468.  
  469.  
  470.  
  471. function doContextCmd(cmdName)
  472. {
  473.   dump("doContextCmd start: cmd='" + cmdName + "'\n");
  474.  
  475.   var treeNode = document.getElementById("bookmarksTree");
  476.   if (!treeNode)    return(false);
  477.   var db = treeNode.database;
  478.   if (!db)    return(false);
  479.  
  480.   var compositeDB = db.QueryInterface(Components.interfaces.nsIRDFDataSource);
  481.   if (!compositeDB)    return(false);
  482.  
  483.   var isupports = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService();
  484.   if (!isupports)    return(false);
  485.   var rdf = isupports.QueryInterface(Components.interfaces.nsIRDFService);
  486.   if (!rdf)    return(false);
  487.  
  488.   // need a resource for the command
  489.   var cmdResource = rdf.GetResource(cmdName);
  490.   if (!cmdResource)        return(false);
  491.   cmdResource = cmdResource.QueryInterface(Components.interfaces.nsIRDFResource);
  492.   if (!cmdResource)        return(false);
  493.  
  494.   var select_list = treeNode.getElementsByAttribute("selected", "true");
  495.   if (select_list.length < 1)    return(false);
  496.  
  497.   dump("# of Nodes selected: " + select_list.length + "\n\n");
  498.  
  499.   // set up selection nsISupportsArray
  500.   var selectionInstance = Components.classes["@mozilla.org/supports-array;1"].createInstance();
  501.   var selectionArray = selectionInstance.QueryInterface(Components.interfaces.nsISupportsArray);
  502.  
  503.   // set up arguments nsISupportsArray
  504.   var argumentsInstance = Components.classes["@mozilla.org/supports-array;1"].createInstance();
  505.   var argumentsArray = argumentsInstance.QueryInterface(Components.interfaces.nsISupportsArray);
  506.  
  507.   // get argument (parent)
  508.   var parentArc = rdf.GetResource("http://home.netscape.com/NC-rdf#parent");
  509.   if (!parentArc)        return(false);
  510.  
  511.   for (var nodeIndex=0; nodeIndex<select_list.length; nodeIndex++)
  512.   {
  513.     var node = select_list[nodeIndex];
  514.     if (!node)    break;
  515.     var uri = node.getAttribute("ref");
  516.     if ((uri) || (uri == ""))
  517.     {
  518.       uri = node.getAttribute("id");
  519.     }
  520.     if (!uri)    return(false);
  521.  
  522.     var rdfNode = rdf.GetResource(uri);
  523.     if (!rdfNode)    break;
  524.  
  525.     // add node into selection array
  526.     selectionArray.AppendElement(rdfNode);
  527.  
  528.     // get the parent's URI
  529.     var parentURI="";
  530.     var theParent = node;
  531.     while (theParent)
  532.     {
  533.       theParent = theParent.parentNode;
  534.  
  535.       parentURI = theParent.getAttribute("ref");
  536.       if ((!parentURI) || (parentURI == ""))
  537.       {
  538.         parentURI = theParent.getAttribute("id");
  539.       }
  540.       if (parentURI != "")  break;
  541.     }
  542.     if (parentURI == "")    return(false);
  543.  
  544.     var parentNode = rdf.GetResource(parentURI, true);
  545.     if (!parentNode)  return(false);
  546.  
  547.     // add parent arc and node into arguments array
  548.     argumentsArray.AppendElement(parentArc);
  549.     argumentsArray.AppendElement(parentNode);
  550.   }
  551.  
  552.   // do the command
  553.   compositeDB.DoCommand( selectionArray, cmdResource, argumentsArray );
  554.  
  555.   dump("doContextCmd ends.\n\n");
  556.   return(true);
  557. }
  558.  
  559. // ripped from tasksOverlay.js.. ideally we should
  560. // put it back there (eventually).
  561. function toEditor(url)
  562. {
  563.     window.openDialog( "chrome://editor/content/EditorAppShell.xul", "_blank", "chrome,dialog=no,all", url );
  564. }
  565.