home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 December / PCWorld_2005-12_cd.bin / komunikace / netscape / nsb-install-8-0.exe / chrome / browser.jar / content / browser / utilityOverlay.js < prev    next >
Text File  |  2005-09-26  |  10KB  |  347 lines

  1.  
  2. /**
  3.  * Communicator Shared Utility Library
  4.  * for shared application glue for the Communicator suite of applications
  5.  **/
  6.  
  7. var goPrefWindow = 0;
  8.  
  9. function getBrowserURL()
  10. {
  11.   return "chrome://browser/content/browser.xul";
  12. }
  13.  
  14. function goToggleToolbar( id, elementID )
  15. {
  16.   var toolbar = document.getElementById(id);
  17.   var element = document.getElementById(elementID);
  18.   if (toolbar)
  19.   {
  20.     var isHidden = toolbar.hidden;
  21.     toolbar.hidden = !isHidden;
  22.     document.persist(id, 'hidden');
  23.     if (element) {
  24.       element.setAttribute("checked", isHidden ? "true" : "false");
  25.       document.persist(elementID, 'checked');
  26.     }
  27.   }
  28. }
  29.  
  30. // urlPref: lets each application have its own throbber URL. example: "messenger.throbber.url"
  31. // event: lets shift+click open it in a new window, etc.
  32. function goClickThrobber( urlPref, e )
  33. {
  34.   var url;
  35.   try {
  36.     var pref = Components.classes["@mozilla.org/preferences-service;1"]
  37.                          .getService(Components.interfaces.nsIPrefBranch);
  38.     url = pref.getComplexValue(urlPref, Components.interfaces.nsIPrefLocalizedString).data;
  39.   }
  40.  
  41.   catch(e) {
  42.     url = null;
  43.   }
  44.  
  45.   if ( url )
  46.     openUILink(url, e);
  47. }
  48.  
  49. function getTopWin()
  50. {
  51.     var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService();
  52.     var windowManagerInterface = windowManager.QueryInterface( Components.interfaces.nsIWindowMediator);
  53.     var topWindowOfType = windowManagerInterface.getMostRecentWindow( "navigator:browser" );
  54.  
  55.     if (topWindowOfType) {
  56.         return topWindowOfType;
  57.     }
  58.     return null;
  59. }
  60.  
  61. function openTopWin( url )
  62. {
  63.     openUILink(url, {})
  64. }
  65.  
  66.  
  67.  
  68. function getBoolPref ( prefname, def )
  69. {
  70.   try { 
  71.     var pref = Components.classes["@mozilla.org/preferences-service;1"]
  72.                        .getService(Components.interfaces.nsIPrefBranch);
  73.     return pref.getBoolPref(prefname);
  74.   }
  75.   catch(er) {
  76.     return def;
  77.   }
  78. }
  79.   
  80.  
  81. // openUILink handles clicks on UI elements that cause URLs to load.
  82. function openUILink( url, e, ignoreButton, ignoreAlt )
  83. {
  84.     dump ("Dumping event object : event object is : " + e + " \t\t");  
  85.   var where = whereToOpenLink(e, ignoreButton, ignoreAlt);
  86.   openUILinkIn(url, where);
  87. }
  88.  
  89. function openGOLink(url, e)
  90. {
  91.     var where = whereToOpenLink(e, null, null);
  92.     if (where == "current") {
  93.         loadURIWithOpenPref(url, "browser.tabs.history.open");
  94.     } else {
  95.         openUILinkIn(url, where);
  96.     }
  97. }
  98.  
  99. /* whereToOpenLink() looks at an event to decide where to open a link.
  100.  *
  101.  * The event may be a mouse event (click, double-click, middle-click) or keypress event (enter).
  102.  *
  103.  * On Windows, the modifiers are:
  104.  * Ctrl        new tab, selected
  105.  * Shift       new window
  106.  * Ctrl+Shift  new tab, in background
  107.  * Alt         save
  108.  *
  109.  * You can swap Ctrl and Ctrl+shift by toggling the hidden pref
  110.  * browser.tabs.loadBookmarksInBackground (not browser.tabs.loadInBackground, which
  111.  * is for content area links).
  112.  *
  113.  * Middle-clicking is the same as Ctrl+clicking (it opens a new tab) and it is
  114.  * subject to the shift modifier and pref in the same way.
  115.  *
  116.  * Exceptions: 
  117.  * - Alt is ignored for menu items selected using the keyboard so you don't accidentally save stuff.  
  118.  *    (Currently, the Alt isn't sent here at all for menu items, but that will change in bug 126189.)
  119.  * - Alt is hard to use in context menus, because pressing Alt closes the menu.
  120.  * - Alt can't be used on the bookmarks toolbar because Alt is used for "treat this as something draggable".
  121.  * - The button is ignored for the middle-click-paste-URL feature, since it's always a middle-click.
  122.  */
  123. function whereToOpenLink( e, ignoreButton, ignoreAlt )
  124. {
  125.   if (e == null)
  126.     e = { shiftKey:false, ctrlKey:false, metaKey:false, altKey:false, button:0 };
  127.  
  128.   var shift = e.shiftKey;
  129.   var ctrl =  e.ctrlKey;
  130.   var meta =  e.metaKey;
  131.   var alt  =  e.altKey && !ignoreAlt;
  132.  
  133.   // ignoreButton allows "middle-click paste" to use function without always opening in a new window.
  134.   var middle = !ignoreButton && e.button == 1;
  135.   var middleUsesTabs = getBoolPref("browser.tabs.opentabfor.middleclick", true);
  136.  
  137.   // Don't do anything special with right-mouse clicks.  They're probably clicks on context menu items.
  138.  
  139.   if (ctrl || (middle && middleUsesTabs)) {
  140.     if (shift)
  141.       return "tabshifted";
  142.     else
  143.       return "tab";
  144.   }
  145.   else if (alt) {
  146.     return "save";
  147.   }
  148.   else if (shift || (middle && !middleUsesTabs)) {
  149.     return "window";
  150.   }
  151.   else {
  152.     return "current";
  153.   }
  154. }
  155.  
  156. /* openUILinkIn opens a URL in a place specified by the parameter |where|.
  157.  *
  158.  * |where| can be:
  159.  *  "current"     current tab            (if there aren't any browser windows, then in a new window instead)
  160.  *  "tab"         new tab                (if there aren't any browser windows, then in a new window instead)
  161.  *  "tabshifted"  same as "tab" but in background if default is to select new tabs, and vice versa
  162.  *  "window"      new window
  163.  *  "save"        save to disk (with no filename hint!)
  164.  */
  165. function openUILinkIn( url, where )
  166. {
  167.   if (!where)
  168.     return;
  169.  
  170.   if ((url == null) || (url == "")) 
  171.     return;
  172.   // xlate the URL if necessary
  173.   if (url.indexOf("urn:") == 0) {
  174.       url = xlateURL(url);        // does RDF urn expansion
  175.   }
  176.   // avoid loading "", since this loads a directory listing
  177.   if (url == "") {
  178.       url = "about:blank";
  179.   }
  180.  
  181.   if (where == "save") {
  182.     saveURL(url, null, null, true);
  183.     return;
  184.   }
  185.  
  186.   var w = (where == "window") ? null : getTopWin();
  187.   if (!w) {
  188.     openDialog(getBrowserURL(), "_blank", "chrome,all,dialog=no", url);
  189.     return;
  190.   }
  191.   var browser = w.document.getElementById("content");
  192.  
  193.   switch (where) {
  194.   case "current":
  195.     browser.loadURI(url);
  196.     w._content.focus();
  197.     break;
  198.   case "tabshifted":
  199.   case "tab":
  200.     var tab = browser.addTabAt(url);
  201.  
  202.     /* MERC (DP): we use the pref browser.tabs.loadInBackground
  203.     // We check the pref here, rather than in whereToOpenLink, because an "open link in tab"
  204.     // context menu item could call openUILinkwhere directly.
  205.     if ((where == "tab") ^ getBoolPref("browser.tabs.loadBookmarksInBackground", false)) {
  206.       browser.selectedTab = tab;
  207.       w._content.focus();
  208.     }
  209.     */
  210.  
  211.     if (!getBoolPref("browser.tabs.loadInBackground", false)) {
  212.       browser.selectedTab = tab;
  213.       w._content.focus();
  214.     }
  215.  
  216.     break;
  217.   }
  218. }
  219.  
  220. // Used as an onclick handler for UI elements with link-like behavior.
  221. // e.g. onclick="checkForMiddleClick(this, event);"
  222. function checkForMiddleClick(node, event)
  223. {
  224.   if (event.button == 1) {
  225.     /* Execute the node's oncommand.
  226.      *
  227.      * Using eval() because of bug 246720.  Would like to use node.oncommand(event).
  228.      *
  229.      * Since we're using eval():
  230.      *
  231.      * |event| is correct because the name of this function's formal parameter matches
  232.      * the automatic name of the formal parameter for oncommand, |event|.
  233.      *
  234.      * |this| is incorrect.  To make it correct, we would have to use Function.call.
  235.      */
  236.     eval(node.getAttribute("oncommand"));
  237.  
  238.     // If the middle-click was on part of a menu, close the menu.
  239.     // (Menus close automatically with left-click but not with middle-click.)
  240.     closeMenus(event.target);
  241.   }
  242. }
  243.  
  244. // Closes all popups that are ancestors of the node.
  245. function closeMenus(node)
  246. {
  247.   if ("tagName" in node) {
  248.     if (node.namespaceURI == "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
  249.     && (node.tagName == "menupopup" || node.tagName == "popup"))
  250.       node.hidePopup();
  251.  
  252.     closeMenus(node.parentNode);
  253.   }
  254. }
  255.  
  256. // update menu items that rely on focus
  257. function goUpdateGlobalEditMenuItems()
  258. {
  259.   goUpdateCommand('cmd_undo');
  260.   goUpdateCommand('cmd_redo');
  261.   goUpdateCommand('cmd_cut');
  262.   goUpdateCommand('cmd_copy');
  263.   goUpdateCommand('cmd_paste');
  264.   goUpdateCommand('cmd_selectAll');
  265.   goUpdateCommand('cmd_delete');
  266.   // XXX: implement controller for cmd_SwitchTextDirection
  267.         // commented out below in ff5
  268.   //document.getElementById('cmd_SwitchTextDirection').setAttribute('disabled', !document.commandDispatcher.focusedElement);
  269. }
  270.  
  271. // update menu items that rely on the current selection
  272. function goUpdateSelectEditMenuItems()
  273. {
  274.   goUpdateCommand('cmd_cut');
  275.   goUpdateCommand('cmd_copy');
  276.   goUpdateCommand('cmd_delete');
  277.   goUpdateCommand('cmd_selectAll');
  278. }
  279.  
  280. // update menu items that relate to undo/redo
  281. function goUpdateUndoEditMenuItems()
  282. {
  283.   goUpdateCommand('cmd_undo');
  284.   goUpdateCommand('cmd_redo');
  285. }
  286.  
  287. // update menu items that depend on clipboard contents
  288. function goUpdatePasteMenuItems()
  289. {
  290.   goUpdateCommand('cmd_paste');
  291. }
  292.  
  293. // Gather all descendent text under given document node.
  294. function gatherTextUnder ( root ) 
  295. {
  296.   var text = "";
  297.   var node = root.firstChild;
  298.   var depth = 1;
  299.   while ( node && depth > 0 ) {
  300.     // See if this node is text.
  301.     if ( node.nodeName == "#text" ) {
  302.       // Add this text to our collection.
  303.       text += " " + node.data;
  304.     } else if ( node instanceof HTMLImageElement) {
  305.       // If it has an alt= attribute, use that.
  306.       var altText = node.getAttribute( "alt" );
  307.       if ( altText && altText != "" ) {
  308.         text = altText;
  309.         break;
  310.       }
  311.     }
  312.     // Find next node to test.
  313.     // First, see if this node has children.
  314.     if ( node.hasChildNodes() ) {
  315.       // Go to first child.
  316.       node = node.firstChild;
  317.       depth++;
  318.     } else {
  319.       // No children, try next sibling.
  320.       if ( node.nextSibling ) {
  321.         node = node.nextSibling;
  322.       } else {
  323.         // Last resort is our next oldest uncle/aunt.
  324.         node = node.parentNode.nextSibling;
  325.         depth--;
  326.       }
  327.     }
  328.   }
  329.   // Strip leading whitespace.
  330.   text = text.replace( /^\s+/, "" );
  331.   // Strip trailing whitespace.
  332.   text = text.replace( /\s+$/, "" );
  333.   // Compress remaining whitespace.
  334.   text = text.replace( /\s+/g, " " );
  335.   return text;
  336. }
  337.  
  338. function getShellService()
  339. {
  340.   var shell = null;
  341.   try {
  342.     shell = Components.classes["@mozilla.org/browser/shell-service;1"]
  343.       .getService(Components.interfaces.nsIShellService);
  344.   } catch (e) {}
  345.   return shell;
  346. }
  347.