home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2005 October / maximum-cd-2005-10.iso / Software / Apps / FirefoxSetup1.0.6.exe / browser.xpi / bin / chrome / browser.jar / content / browser / bookmarks / addBookmark2.js < prev    next >
Encoding:
JavaScript  |  2004-07-07  |  9.3 KB  |  257 lines

  1.  
  2. /**
  3.  * Add Bookmark Dialog. 
  4.  * ====================
  5.  * 
  6.  * This is a generic bookmark dialog that allows for bookmark addition
  7.  * and folder selection. It can be opened with various parameters that 
  8.  * result in appearance/purpose differences and initial state. 
  9.  * 
  10.  * Use: Open with 'openDialog', with the flags 
  11.  *        'centerscreen,chrome,dialog=no,resizable=yes'
  12.  * 
  13.  * Parameters: 
  14.  *   Apart from the standard openDialog parameters, this dialog can 
  15.  *   be passed additional information, which gets mapped to the 
  16.  *   window.arguments array:
  17.  * 
  18.  *   XXXben - it would be cleaner just to take this dialog take an
  19.  *            object so items don't need to be passed in a particular
  20.  *            order.
  21.  * 
  22.  *   window.arguments[0]: Bookmark Name. The value to be prefilled
  23.  *                        into the "Name: " field (if visible).
  24.  *   window.arguments[1]: Bookmark URL: The location of the bookmark.
  25.  *                        The value to be filled in the "Location: "
  26.  *                        field (if visible).
  27.  *   window.arguments[2]: Bookmark Folder. The RDF Resource URI of the
  28.  *                        folder that this bookmark should be created in.
  29.  *   window.arguments[3]: Bookmark Charset. The charset that should be
  30.  *                        used when adding a bookmark to the specified
  31.  *                        URL. (Usually the charset of the current 
  32.  *                        document when launching this window). 
  33.  *   window.arguments[4]: The mode of operation. See notes for details.
  34.  *   window.arguments[5]: If the mode is "addGroup", this is an array
  35.  *                        of objects with name, URL and charset
  36.  *                        properties, one for each group member.
  37.  *   window.arguments[6]: If the bookmark should become a web panel.
  38.  *   window.arguments[7]: A suggested keyword for the bookmark. If this
  39.  *                        argument is supplied, the keyword row is made
  40.  *                        visible.
  41.  *   window.arguments[8]: Whether or not a keyword is required to add
  42.  *                        the bookmark.
  43.  *   window.arguments[9]: PostData to be saved with this bookmark, 
  44.  *                        in the format a string of name=value pairs
  45.  *                        separated by CRLFs.
  46.  *   window.arguments[10]: feed URL for Livemarks (turns bookmark
  47.  *                         into Livemark)
  48.  */
  49.  
  50. var gSelectedFolder;
  51. var gName;
  52. var gKeyword;
  53. var gKeywordRow;
  54. var gExpander;
  55. var gMenulist;
  56. var gBookmarksTree;
  57. var gGroup;
  58. var gKeywordRequired;
  59. var gSuggestedKeyword;
  60. var gRequiredFields = [];
  61. var gPostData;
  62.  
  63. var WSucks;
  64.  
  65. function Startup()
  66. {
  67.   initServices();
  68.   initBMService();
  69.   gName = document.getElementById("name");
  70.   gRequiredFields.push(gName);
  71.   gKeywordRow = document.getElementById("keywordRow");
  72.   gKeyword = document.getElementById("keyword");
  73.   gGroup = document.getElementById("addgroup");
  74.   gExpander = document.getElementById("expander");
  75.   gMenulist = document.getElementById("select-menu");
  76.   gBookmarksTree = document.getElementById("folder-tree");
  77.   gName.value = window.arguments[0];
  78.   gName.select();
  79.   gName.focus();
  80.   gSuggestedKeyword = window.arguments[7];
  81.   gKeywordRequired = window.arguments[8];
  82.   if (!gSuggestedKeyword && !gKeywordRequired) {
  83.     gKeywordRow.hidden = true;
  84.   } else {
  85.     if (gSuggestedKeyword)
  86.       gKeyword.value = gSuggestedKeyword;
  87.     if (gKeywordRequired)
  88.       gRequiredFields.push(gKeyword);
  89.   }
  90.   sizeToContent();
  91.   onFieldInput();
  92.   gSelectedFolder = RDF.GetResource(gMenulist.selectedItem.id);
  93.   gExpander.setAttribute("tooltiptext", gExpander.getAttribute("tooltiptextdown"));
  94.   gPostData = window.arguments[9];
  95.  
  96.   WSucks = parseInt(gBookmarksTree.getAttribute("height"));
  97.   if (!WSucks)
  98.     WSucks = 150;
  99.  
  100.   // fix no more persisted class attribute in old profiles
  101.   var localStore = RDF.GetDataSource("rdf:local-store");
  102.   var rAttribute = RDF.GetResource("class");
  103.   var rElement   = RDF.GetResource("chrome://browser/content/bookmarks/addBookmark2.xul#expander");
  104.   var rDialog    = RDF.GetResource("chrome://browser/content/bookmarks/addBookmark2.xul");
  105.   var rPersist   = RDF.GetResource(NC_NS+"persist");
  106.   
  107.   var rOldValue = localStore.GetTarget(rElement, rAttribute, true);
  108.   if (rOldValue) {
  109.     localStore.Unassert(rElement, rAttribute, rOldValue, true);
  110.     localStore.Unassert(rDialog, rPersist, rElement, true);
  111.     gExpander.setAttribute("class", "down");
  112.   }
  113.  
  114. function onFieldInput()
  115. {
  116.   var ok = document.documentElement.getButton("accept");
  117.   ok.disabled = false;
  118.   for (var i = 0; i < gRequiredFields.length; ++i) {
  119.     if (gRequiredFields[i].value == "") {
  120.       ok.disabled = true;
  121.       return;
  122.     }
  123.   }
  124. }
  125.  
  126. function onOK()
  127. {
  128.   RDFC.Init(BMDS, gSelectedFolder);
  129.  
  130.   var url, rSource;
  131.   var livemarkFeed = window.arguments[10];
  132.   if (gGroup && gGroup.checked) {
  133.     rSource = BMDS.createFolder(gName.value);
  134.     const groups = window.arguments[5];
  135.     for (var i = 0; i < groups.length; ++i) {
  136.       url = getNormalizedURL(groups[i].url);
  137.       BMDS.createBookmarkInContainer(groups[i].name, url, gKeyword.value, null,
  138.                                      groups[i].charset, gPostData, rSource, -1);
  139.     }
  140.   } else if (livemarkFeed != null) {
  141.     url = getNormalizedURL(window.arguments[1]);
  142.     rSource = BMDS.createLivemark(gName.value, url, livemarkFeed, null);
  143.   } else {
  144.     url = getNormalizedURL(window.arguments[1]);
  145.     rSource = BMDS.createBookmark(gName.value, url, gKeyword.value, null, window.arguments[3], gPostData);
  146.   }
  147.  
  148.   var selection = BookmarksUtils.getSelectionFromResource(rSource);
  149.   var target    = BookmarksUtils.getTargetFromFolder(gSelectedFolder);
  150.   BookmarksUtils.insertAndCheckSelection("newbookmark", selection, target);
  151.   
  152.   if (window.arguments[6] && rSource) {
  153.     // Assert that we're a web panel.
  154.     BMDS.Assert(rSource, RDF.GetResource(NC_NS+"WebPanel"),
  155.                 RDF.GetLiteral("true"), true);
  156.   }
  157.   
  158.   // in insertSelection, the ds flush is delayed. It will never be performed,
  159.   // since this dialog is destroyed before.
  160.   // We have to flush manually
  161.   var remoteDS = BMDS.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);
  162.   remoteDS.Flush();
  163. }
  164.  
  165. function getNormalizedURL(url)
  166. {
  167.   // Check to see if the item is a local directory path, and if so, convert
  168.   // to a file URL so that aggregation with rdf:files works
  169.   try {
  170.     const kLF = Components.classes["@mozilla.org/file/local;1"]
  171.                           .createInstance(Components.interfaces.nsILocalFile);
  172.     kLF.initWithPath(url);
  173.     if (kLF.exists()) {
  174.       var ioService = Components.classes["@mozilla.org/network/io-service;1"]
  175.                                 .getService(Components.interfaces.nsIIOService);
  176.       var fileHandler = ioService.getProtocolHandler("file")
  177.                                  .QueryInterface(Components.interfaces.nsIFileProtocolHandler);
  178.  
  179.       url = fileHandler.getURLSpecFromFile(kLF);
  180.     }
  181.   }
  182.   catch (e) {
  183.   }
  184.  
  185.   return url;
  186. }
  187.  
  188. function selectMenulistFolder(aEvent)
  189. {
  190.   gSelectedFolder = RDF.GetResource(aEvent.target.id);
  191.   if (!gBookmarksTree.collapsed)
  192.     selectFolder(gSelectedFolder);
  193. }
  194.  
  195. function selectTreeFolder()
  196. {
  197.   var resource = gBookmarksTree.currentResource;
  198.   if (resource == gSelectedFolder)
  199.     return;
  200.   gSelectedFolder = resource;
  201.   var menuitem = document.getElementById(gSelectedFolder.Value);
  202.   gMenulist.selectedItem = menuitem;
  203.   if (!menuitem)
  204.     gMenulist.label = BookmarksUtils.getProperty(gSelectedFolder, NC_NS+"Name");
  205. }
  206.  
  207. function selectFolder(aFolder)
  208. {
  209.   gBookmarksTree.treeBoxObject.selection.selectEventsSuppressed = true;
  210.   gBookmarksTree.treeBoxObject.selection.clearSelection();
  211.   gBookmarksTree.selectResource(aFolder);
  212.   var index = gBookmarksTree.currentIndex;
  213.   gBookmarksTree.treeBoxObject.ensureRowIsVisible(index);
  214.   gBookmarksTree.treeBoxObject.selection.selectEventsSuppressed = false;
  215. }
  216.  
  217. function expandTree()
  218. {
  219.   setFolderTreeHeight();
  220.   var willCollapse = !gBookmarksTree.collapsed;
  221.   gExpander.setAttribute("class",willCollapse?"down":"up");
  222.   gExpander.setAttribute("tooltiptext", gExpander.getAttribute("tooltiptext"+(willCollapse?"down":"up")));
  223.   if (willCollapse) {
  224.     document.documentElement.buttons = "accept,cancel";
  225.     WSucks = gBookmarksTree.boxObject.height;
  226.   } else {
  227.     document.documentElement.buttons = "accept,cancel,extra2";
  228.     if (!gBookmarksTree.treeBoxObject.view.isContainerOpen(0))
  229.       gBookmarksTree.treeBoxObject.view.toggleOpenState(0);
  230.     selectFolder(gSelectedFolder);
  231.     gBookmarksTree.focus();
  232.   }
  233.   gBookmarksTree.collapsed = willCollapse;
  234.   resizeTo(window.outerWidth, window.outerHeight+(willCollapse?-WSucks:+WSucks));
  235. }
  236.  
  237. function setFolderTreeHeight()
  238. {
  239.   var isCollapsed = gBookmarksTree.collapsed;
  240.   if (!isCollapsed)
  241.     gBookmarksTree.setAttribute("height", gBookmarksTree.boxObject.height);
  242. }
  243.  
  244. function newFolder()
  245. {
  246.   gBookmarksTree.focus();
  247.   // we should use goDoCommand, but the current way of inserting
  248.   // resources do not insert in folders.
  249.   //goDoCommand("cmd_bm_newfolder");
  250.   var target = BookmarksUtils.getTargetFromFolder(gSelectedFolder);
  251.   var folder = BookmarksCommand.createNewFolder(target);
  252.   if (!BMSVC.isBookmarkedResource(folder))
  253.     return; // new folder cancelled
  254.   selectFolder(folder);
  255. }
  256.