home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 January / 01_02.iso / software / netscape62win / mail.xpi / bin / chrome / messenger.jar / content / messenger / mail3PaneWindowCommands.js < prev    next >
Text File  |  2001-10-16  |  33KB  |  1,119 lines

  1. /* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
  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) 1998-2000 Netscape Communications Corporation. All
  18.  * Rights Reserved.
  19.  *
  20.  * Contributors(s):
  21.  *   Jan Varga <varga@utcru.sk>
  22.  *   Hσkan Waara (hwaara@chello.se)
  23.  */
  24.  
  25. var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
  26. var gMessengerBundle = document.getElementById("bundle_messenger");
  27.  
  28. // Controller object for folder pane
  29. var FolderPaneController =
  30. {
  31.    supportsCommand: function(command)
  32.     {
  33.         switch ( command )
  34.         {
  35.             case "cmd_delete":
  36.             case "button_delete":
  37.             case "cmd_selectAll":
  38.             case "cmd_cut":
  39.             case "cmd_copy":
  40.             case "cmd_paste":
  41.                 return true;
  42.                 
  43.             default:
  44.                 return false;
  45.         }
  46.     },
  47.  
  48.     isCommandEnabled: function(command)
  49.     {
  50.         //        dump("FolderPaneController.IsCommandEnabled(" + command + ")\n");
  51.         switch ( command )
  52.         {
  53.             case "cmd_selectAll":
  54.             case "cmd_cut":
  55.             case "cmd_copy":
  56.             case "cmd_paste":
  57.                 return false;
  58.             case "cmd_delete":
  59.             case "button_delete":
  60.                 if ( command == "cmd_delete" )
  61.                     goSetMenuValue(command, 'valueFolder');
  62.                                 var folderOutliner = GetFolderOutliner();
  63.                                 var startIndex = {};
  64.                                 var endIndex = {};
  65.                                 folderOutliner.outlinerBoxObject.selection.getRangeAt(0, startIndex, endIndex);
  66.                                 if (startIndex.value >= 0) {
  67.                                         var canDeleteThisFolder;
  68.                     var specialFolder = null;
  69.                     var isServer = null;
  70.                     var serverType = null;
  71.                     try {
  72.                                                 var folderResource = GetFolderResource(folderOutliner, startIndex.value);
  73.                                                 specialFolder = GetFolderAttribute(folderOutliner, folderResource, "SpecialFolder");
  74.                                                 isServer = GetFolderAttribute(folderOutliner, folderResource, "IsServer");
  75.                                                 serverType = GetFolderAttribute(folderOutliner, folderResource, "ServerType");
  76.                                                 if (serverType == "nntp") {
  77.                                              if ( command == "cmd_delete" ) {
  78.                                             goSetMenuValue(command, 'valueNewsgroup');
  79.                                                 goSetAccessKey(command, 'valueNewsgroupAccessKey');
  80.                                                         }
  81.                                                 }
  82.                     }
  83.                     catch (ex) {
  84.                         //dump("specialFolder failure: " + ex + "\n");
  85.                     }
  86.                                         if (specialFolder == "Inbox" || specialFolder == "Trash" || isServer == "true")
  87.                                                 canDeleteThisFolder = false;
  88.                                         else
  89.                                                 canDeleteThisFolder = true;
  90.                                         return canDeleteThisFolder && isCommandEnabled(command);
  91.                                 }
  92.                 else
  93.                     return false;
  94.  
  95.             default:
  96.                 return false;
  97.         }
  98.     },
  99.  
  100.     doCommand: function(command)
  101.     {
  102.     // if the user invoked a key short cut then it is possible that we got here for a command which is
  103.     // really disabled. kick out if the command should be disabled.
  104.     if (!this.isCommandEnabled(command)) return;
  105.  
  106.         switch ( command )
  107.         {
  108.             case "cmd_delete":
  109.             case "button_delete":
  110.                 MsgDeleteFolder();
  111.                 break;
  112.         }
  113.     },
  114.     
  115.     onEvent: function(event)
  116.     {
  117.         // on blur events set the menu item texts back to the normal values
  118.         if ( event == 'blur' )
  119.         {
  120.             goSetMenuValue('cmd_delete', 'valueDefault');
  121.         }
  122.     }
  123. };
  124.  
  125.  
  126. // Controller object for thread pane
  127. var ThreadPaneController =
  128. {
  129.    supportsCommand: function(command)
  130.     {
  131.         switch ( command )
  132.         {
  133.             case "cmd_selectAll":
  134.             case "cmd_cut":
  135.             case "cmd_copy":
  136.             case "cmd_paste":
  137.                 return true;
  138.                 
  139.             default:
  140.                 return false;
  141.         }
  142.     },
  143.  
  144.     isCommandEnabled: function(command)
  145.     {
  146.         switch ( command )
  147.         {
  148.             case "cmd_selectAll":
  149.                 return true;
  150.             
  151.             case "cmd_cut":
  152.             case "cmd_copy":
  153.             case "cmd_paste":
  154.                 return false;
  155.  
  156.             default:
  157.                 return false;
  158.         }
  159.     },
  160.  
  161.     doCommand: function(command)
  162.     {
  163.     // if the user invoked a key short cut then it is possible that we got here for a command which is
  164.     // really disabled. kick out if the command should be disabled.
  165.     if (!this.isCommandEnabled(command)) return;
  166.     if (!gDBView) return;
  167.  
  168.         switch ( command )
  169.         {
  170.             case "cmd_selectAll":
  171.                 // if in threaded mode, the view will expand all before selecting all
  172.                 gDBView.doCommand(nsMsgViewCommandType.selectAll)
  173.                 if (gDBView.numSelected != 1) {
  174.                     ClearMessagePane();
  175.                 }
  176.                 break;
  177.         }
  178.     },
  179.     
  180.     onEvent: function(event)
  181.     {
  182.     }
  183. };
  184.  
  185. // DefaultController object (handles commands when one of the trees does not have focus)
  186. var DefaultController =
  187. {
  188.    supportsCommand: function(command)
  189.     {
  190.  
  191.         switch ( command )
  192.         {
  193.             case "cmd_close":
  194.             case "cmd_reply":
  195.             case "button_reply":
  196.             case "cmd_replySender":
  197.             case "cmd_replyGroup":
  198.             case "cmd_replyall":
  199.             case "button_replyall":
  200.             case "cmd_forward":
  201.             case "button_forward":
  202.             case "cmd_forwardInline":
  203.             case "cmd_forwardAttachment":
  204.             case "cmd_editAsNew":
  205.             case "cmd_delete":
  206.             case "button_delete":
  207.             case "cmd_shiftDelete":
  208.             case "cmd_editDraft":
  209.             case "cmd_nextMsg":
  210.       case "button_next":
  211.             case "cmd_nextUnreadMsg":
  212.             case "cmd_nextFlaggedMsg":
  213.             case "cmd_nextUnreadThread":
  214.             case "cmd_previousMsg":
  215.             case "cmd_previousUnreadMsg":
  216.             case "cmd_previousFlaggedMsg":
  217.             case "cmd_viewAllMsgs":
  218.             case "cmd_viewUnreadMsgs":
  219.       case "cmd_viewThreadsWithUnread":
  220.       case "cmd_viewWatchedThreadsWithUnread":
  221.       case "cmd_viewIgnoredThreads":
  222.       case "cmd_undo":
  223.       case "cmd_redo":
  224.             case "cmd_expandAllThreads":
  225.             case "cmd_collapseAllThreads":
  226.             case "cmd_renameFolder":
  227.             case "cmd_sendUnsentMsgs":
  228.             case "cmd_openMessage":
  229.       case "button_print":
  230.             case "cmd_print":
  231.             case "cmd_printSetup":
  232.             case "cmd_saveAsFile":
  233.             case "cmd_saveAsTemplate":
  234.             case "cmd_properties":
  235.             case "cmd_viewPageSource":
  236.             case "cmd_setFolderCharset":
  237.             case "cmd_reload":
  238.       case "button_getNewMessages":
  239.             case "cmd_getNewMessages":
  240.       case "cmd_getMsgsForAuthAccounts":
  241.             case "cmd_getNextNMessages":
  242.             case "cmd_find":
  243.             case "cmd_findAgain":
  244.       case "button_mark":
  245.             case "cmd_markAsRead":
  246.             case "cmd_markAllRead":
  247.             case "cmd_markThreadAsRead":
  248.             case "cmd_markAsFlagged":
  249.       case "button_file":
  250.             case "cmd_file":
  251.             case "cmd_emptyTrash":
  252.             case "cmd_compactFolder":
  253.             case "cmd_sortByThread":
  254.       case "cmd_downloadFlagged":
  255.       case "cmd_downloadSelected":
  256.       case "cmd_settingsOffline":
  257.       case "cmd_synchronizeOffline":
  258.       case "cmd_close":
  259.       case "cmd_selectThread":
  260.       case "cmd_selectFlagged":
  261.                 return true;
  262.  
  263.       case "cmd_watchThread":
  264.       case "cmd_killThread":
  265.         return(isNewsURI(GetFirstSelectedMessage()));
  266.  
  267.             default:
  268.                 return false;
  269.         }
  270.     },
  271.  
  272.   isCommandEnabled: function(command)
  273.   {
  274.     var enabled = new Object();
  275.     enabled.value = false;
  276.     var checkStatus = new Object();
  277. //    dump('entering is command enabled for: ' + command + '\n');
  278.     switch ( command )
  279.     {
  280.       case "button_delete":
  281.       case "cmd_delete":
  282.         var uri = GetFirstSelectedMessage();
  283.         if ( GetNumSelectedMessages() < 2 ) 
  284.         {
  285.           if (IsNewsMessage(uri))
  286.           {
  287.             goSetMenuValue(command, 'valueNewsMessage');
  288.             goSetAccessKey(command, 'valueNewsMessageAccessKey');
  289.           }
  290.           else
  291.           {
  292.             goSetMenuValue(command, 'valueMessage');
  293.             goSetAccessKey(command, 'valueMessageAccessKey');
  294.           }
  295.         }
  296.         else 
  297.         {
  298.           if (IsNewsMessage(uri)) 
  299.           {
  300.             goSetMenuValue(command, 'valueNewsMessage');
  301.             goSetAccessKey(command, 'valueNewsMessageAccessKey');
  302.           }
  303.           else 
  304.           {
  305.             goSetMenuValue(command, 'valueMessages');
  306.             goSetAccessKey(command, 'valueMessagesAccessKey');
  307.           }
  308.         }
  309.         if (gDBView)
  310.           gDBView.getCommandStatus(nsMsgViewCommandType.deleteMsg, enabled, checkStatus);
  311.         return enabled.value;
  312.       case "cmd_shiftDelete":
  313.         if (gDBView)
  314.           gDBView.getCommandStatus(nsMsgViewCommandType.deleteNoTrash, enabled, checkStatus);
  315.         return enabled.value;
  316.       case "cmd_killThread":
  317.         return ((GetNumSelectedMessages() == 1) && MailAreaHasFocus() && IsViewNavigationItemEnabled());
  318.       case "cmd_watchThread":
  319.         if ((GetNumSelectedMessages() == 1) && gDBView)
  320.           gDBView.getCommandStatus(nsMsgViewCommandType.toggleThreadWatched, enabled, checkStatus);
  321.         return enabled.value;
  322.       case "cmd_reply":
  323.       case "button_reply":
  324.       case "cmd_replySender":
  325.       case "cmd_replyGroup":
  326.       case "cmd_replyall":
  327.       case "button_replyall":
  328.       case "cmd_forward":
  329.       case "button_forward":
  330.       case "cmd_forwardInline":
  331.       case "cmd_forwardAttachment":
  332.       case "cmd_editAsNew":
  333.       case "cmd_openMessage":
  334.       case "button_print":
  335.       case "cmd_print":
  336.       case "cmd_saveAsFile":
  337.       case "cmd_saveAsTemplate":
  338.       case "cmd_viewPageSource":
  339.       case "cmd_reload":
  340.           if ( GetNumSelectedMessages() > 0)
  341.         {
  342.           if (gDBView)
  343.           {
  344.              gDBView.getCommandStatus(nsMsgViewCommandType.cmdRequiringMsgBody, enabled, checkStatus);
  345.               return enabled.value;
  346.           }
  347.         }
  348.         return false;
  349.       case "cmd_printSetup":
  350.         return true;
  351.       case "cmd_markThreadAsRead":
  352.       case "cmd_markAsFlagged":
  353.       case "button_file":
  354.       case "cmd_file":
  355.         return ( GetNumSelectedMessages() > 0 );
  356.       case "cmd_editDraft":
  357.                 return (gIsEditableMsgFolder && (GetNumSelectedMessages() > 0));
  358.       case "cmd_nextMsg":
  359.       case "button_next":
  360.       case "cmd_nextUnreadMsg":
  361.       case "cmd_nextUnreadThread":
  362.       case "cmd_previousMsg":
  363.       case "cmd_previousUnreadMsg":
  364.         return MailAreaHasFocus() && IsViewNavigationItemEnabled();
  365.       case "button_mark":
  366.       case "cmd_markAsRead":
  367.         if(!MailAreaHasFocus())
  368.           return false;
  369.         else
  370.           return(GetNumSelectedMessages() > 0);
  371.       case "cmd_markAllRead":
  372.         return(MailAreaHasFocus() && IsFolderSelected());
  373.       case "cmd_find":
  374.       case "cmd_findAgain":
  375.         return IsFindEnabled();
  376.         break;
  377.       // these are enabled on when we are in threaded mode
  378.       case "cmd_selectThread":
  379.         if (GetNumSelectedMessages() <= 0) return false;
  380.       case "cmd_expandAllThreads":
  381.       case "cmd_collapseAllThreads":
  382.         if (!gDBView) return false;
  383.           return (gDBView.sortType == nsMsgViewSortType.byThread);
  384.         break;
  385.       case "cmd_nextFlaggedMsg":
  386.       case "cmd_previousFlaggedMsg":
  387.         return IsViewNavigationItemEnabled();
  388.       case "cmd_viewAllMsgs":
  389.       case "cmd_sortByThread":
  390.       case "cmd_viewUnreadMsgs":
  391.       case "cmd_viewThreadsWithUnread":
  392.       case "cmd_viewWatchedThreadsWithUnread":
  393.       case "cmd_viewIgnoredThreads":
  394.         return true;
  395.       case "cmd_undo":
  396.       case "cmd_redo":
  397.           return SetupUndoRedoCommand(command);
  398.       case "cmd_renameFolder":
  399.         return IsRenameFolderEnabled();
  400.       case "cmd_sendUnsentMsgs":
  401.         return IsSendUnsentMsgsEnabled(null);
  402.       case "button_getNewMessages":
  403.       case "cmd_getNewMessages":
  404.       case "cmd_properties":
  405.         return IsPropertiesEnabled();
  406.       case "cmd_getMsgsForAuthAccounts":
  407.         return IsGetNewMessagesEnabled();
  408.       case "cmd_getNextNMessages":
  409.         return IsGetNextNMessagesEnabled();
  410.       case "cmd_emptyTrash":
  411.         return IsEmptyTrashEnabled();
  412.       case "cmd_compactFolder":
  413.         return IsCompactFolderEnabled();
  414.       case "cmd_setFolderCharset":
  415.         return IsFolderCharsetEnabled();
  416.       case "cmd_close":
  417.         return true;
  418.       case "cmd_downloadFlagged":
  419.         return(CheckOnline());
  420.       case "cmd_downloadSelected":
  421.         return(MailAreaHasFocus() && IsFolderSelected() && CheckOnline() && GetNumSelectedMessages() > 0);
  422.       case "cmd_synchronizeOffline":
  423.         return IsAccountOfflineEnabled();       
  424.       case "cmd_settingsOffline":
  425.         return (MailAreaHasFocus() && IsAccountOfflineEnabled());
  426.       case "cmd_selectFlagged":
  427.         // disable select flagged until I finish the code in nsMsgDBView.cpp
  428.         return false;
  429.       default:
  430.         return false;
  431.     }
  432.     return false;
  433.   },
  434.  
  435.     doCommand: function(command)
  436.     {
  437.     // if the user invoked a key short cut then it is possible that we got here for a command which is
  438.     // really disabled. kick out if the command should be disabled.
  439.     if (!this.isCommandEnabled(command)) return;
  440.  
  441.         switch ( command )
  442.         {
  443.             case "cmd_close":
  444.                 CloseMailWindow();
  445.                 break;
  446.       case "button_getNewMessages":
  447.             case "cmd_getNewMessages":
  448.                 MsgGetMessage();
  449.                 break;
  450.       case "cmd_getMsgsForAuthAccounts":
  451.         MsgGetMessage();
  452.         MsgGetMessagesForAllAuthenticatedAccounts();
  453.         break;
  454.             case "cmd_getNextNMessages":
  455.                 MsgGetNextNMessages();
  456.                 break;
  457.             case "cmd_reply":
  458.                 MsgReplyMessage(null);
  459.                 break;
  460.             case "cmd_replySender":
  461.                 MsgReplySender(null);
  462.                 break;
  463.             case "cmd_replyGroup":
  464.                 MsgReplyGroup(null);
  465.                 break;
  466.             case "cmd_replyall":
  467.                 MsgReplyToAllMessage(null);
  468.                 break;
  469.             case "cmd_forward":
  470.                 MsgForwardMessage(null);
  471.                 break;
  472.             case "cmd_forwardInline":
  473.                 MsgForwardAsInline(null);
  474.                 break;
  475.             case "cmd_forwardAttachment":
  476.                 MsgForwardAsAttachment(null);
  477.                 break;
  478.             case "cmd_editAsNew":
  479.                 MsgEditMessageAsNew();
  480.                 break;
  481.             case "button_delete":
  482.             case "cmd_delete":
  483.         SetNextMessageAfterDelete();
  484.         gDBView.doCommand(nsMsgViewCommandType.deleteMsg);
  485.                 break;
  486.             case "cmd_shiftDelete":
  487.         SetNextMessageAfterDelete();
  488.         gDBView.doCommand(nsMsgViewCommandType.deleteNoTrash);
  489.                 break;
  490.       case "cmd_killThread":
  491.         /* kill thread kills the thread and then does a next unread */
  492.           GoNextMessage(nsMsgNavigationType.toggleThreadKilled, true);
  493.         break;
  494.       case "cmd_watchThread":
  495.         gDBView.doCommand(nsMsgViewCommandType.toggleThreadWatched);
  496.         break;
  497.             case "cmd_editDraft":
  498.                 if (gDBView.numSelected >= 0)
  499.                     MsgComposeDraftMessage();
  500.                 break;
  501.             case "cmd_nextUnreadMsg":
  502.                 MsgNextUnreadMessage();
  503.                 break;
  504.             case "cmd_nextUnreadThread":
  505.                 MsgNextUnreadThread();
  506.                 break;
  507.             case "cmd_nextMsg":
  508.                 MsgNextMessage();
  509.                 break;
  510.             case "cmd_nextFlaggedMsg":
  511.                 MsgNextFlaggedMessage();
  512.                 break;
  513.             case "cmd_previousMsg":
  514.                 MsgPreviousMessage();
  515.                 break;
  516.             case "cmd_previousUnreadMsg":
  517.                 MsgPreviousUnreadMessage();
  518.                 break;
  519.             case "cmd_previousFlaggedMsg":
  520.                 MsgPreviousFlaggedMessage();
  521.                 break;
  522.             case "cmd_sortByThread":
  523.                 MsgSortByThread();
  524.                 break;
  525.             case "cmd_viewAllMsgs":
  526.       case "cmd_viewThreadsWithUnread":
  527.       case "cmd_viewWatchedThreadsWithUnread":
  528.             case "cmd_viewUnreadMsgs":
  529.       case "cmd_viewIgnoredThreads":
  530.                 SwitchView(command);
  531.                 break;
  532.             case "cmd_undo":
  533.                 messenger.Undo(msgWindow);
  534.                 break;
  535.             case "cmd_redo":
  536.                 messenger.Redo(msgWindow);
  537.                 break;
  538.             case "cmd_expandAllThreads":
  539.                 gDBView.doCommand(nsMsgViewCommandType.expandAll);
  540.                 break;
  541.             case "cmd_collapseAllThreads":
  542.                 gDBView.doCommand(nsMsgViewCommandType.collapseAll);
  543.                 break;
  544.             case "cmd_renameFolder":
  545.                 MsgRenameFolder();
  546.                 return;
  547.             case "cmd_sendUnsentMsgs":
  548.                 MsgSendUnsentMsgs();
  549.                 return;
  550.             case "cmd_openMessage":
  551.                 MsgOpenSelectedMessages();
  552.                 return;
  553.             case "cmd_printSetup":
  554.                 goPageSetup();
  555.                 return;
  556.             case "cmd_print":
  557.                 PrintEnginePrint();
  558.                 return;
  559.             case "cmd_saveAsFile":
  560.                 MsgSaveAsFile();
  561.                 return;
  562.             case "cmd_saveAsTemplate":
  563.                 MsgSaveAsTemplate();
  564.                 return;
  565.             case "cmd_viewPageSource":
  566.                 MsgViewPageSource();
  567.                 return;
  568.             case "cmd_setFolderCharset":
  569.                 MsgSetFolderCharset();
  570.                 return;
  571.             case "cmd_reload":
  572.                 MsgReload();
  573.                 return;
  574.             case "cmd_find":
  575.                 MsgFind();
  576.                 return;
  577.             case "cmd_findAgain":
  578.                 MsgFindAgain();
  579.                 return;
  580.             case "cmd_properties":
  581.                 MsgFolderProperties();
  582.                 return;
  583.       case "button_mark":
  584.             case "cmd_markAsRead":
  585.                 MsgMarkMsgAsRead(null);
  586.                 return;
  587.             case "cmd_markThreadAsRead":
  588.                 MsgMarkThreadAsRead();
  589.                 return;
  590.             case "cmd_markAllRead":
  591.                 gDBView.doCommand(nsMsgViewCommandType.markAllRead);
  592.                 return;
  593.             case "cmd_markAsFlagged":
  594.                 MsgMarkAsFlagged(null);
  595.                 return;
  596.             case "cmd_emptyTrash":
  597.                 MsgEmptyTrash();
  598.                 return;
  599.             case "cmd_compactFolder":
  600.                 MsgCompactFolder(true);
  601.                 return;
  602.             case "cmd_downloadFlagged":
  603.                 MsgDownloadFlagged();
  604.                 break;
  605.             case "cmd_downloadSelected":
  606.                 MsgDownloadSelected();
  607.                 break;
  608.             case "cmd_synchronizeOffline":
  609.                 MsgSynchronizeOffline();
  610.                 break;
  611.             case "cmd_settingsOffline":
  612.                 MsgSettingsOffline();
  613.                 break;
  614.             case "cmd_selectThread":
  615.                 gDBView.doCommand(nsMsgViewCommandType.selectThread);
  616.                 break;
  617.             case "cmd_selectFlagged":
  618.                 gDBView.doCommand(nsMsgViewCommandType.selectFlagged);
  619.                 break;
  620.         }
  621.     },
  622.     
  623.     onEvent: function(event)
  624.     {
  625.         // on blur events set the menu item texts back to the normal values
  626.         if ( event == 'blur' )
  627.         {
  628.             goSetMenuValue('cmd_delete', 'valueDefault');
  629.             goSetMenuValue('cmd_undo', 'valueDefault');
  630.             goSetMenuValue('cmd_redo', 'valueDefault');
  631.         }
  632.     }
  633. };
  634.  
  635. function MailAreaHasFocus()
  636. {
  637.     //Input and TextAreas should get access to the keys that cause these commands.
  638.     //Currently if we don't do this then we will steal the key away and you can't type them
  639.     //in these controls. This is a bug that should be fixed and when it is we can get rid of
  640.     //this.
  641.     var focusedElement = top.document.commandDispatcher.focusedElement;
  642.     if(focusedElement)
  643.     {
  644.         var name = focusedElement.localName;
  645.         return ((name != "INPUT") && (name != "TEXTAREA"));
  646.     }
  647.     return true;
  648. }
  649.  
  650. function GetNumSelectedMessages()
  651. {
  652.     try {
  653.         return gDBView.numSelected;
  654.     }
  655.     catch (ex) {
  656.         return 0;
  657.     }
  658. }
  659.  
  660. var lastFocusedElement=null;
  661.  
  662. function FocusRingUpdate_Mail()
  663. {
  664.   //dump ('entering focus ring update\n');
  665.   var currentFocusedElement = WhichPaneHasFocus();
  666.   if (!currentFocusedElement)
  667.   {
  668.      // dump ('setting default focus to message pane');
  669.      currentFocusedElement = GetMessagePane();
  670.   }
  671.     
  672.     if(currentFocusedElement != lastFocusedElement) {
  673.         if( currentFocusedElement == GetThreadOutliner()) {
  674.             // XXX fix me
  675.             GetThreadOutliner().setAttribute("focusring","true");
  676.             GetMessagePane().setAttribute("focusring","false");
  677.         }
  678.  
  679.         else if(currentFocusedElement==GetFolderOutliner()) {
  680.             // XXX fix me
  681.             GetThreadOutliner().setAttribute("focusring","false");
  682.             GetMessagePane().setAttribute("focusring","false");
  683.         }
  684.         else if(currentFocusedElement==GetMessagePane()){
  685.             // mscott --> fix me!!
  686.             GetThreadOutliner().setAttribute("focusring","false");
  687.             GetMessagePane().setAttribute("focusring","true");
  688.         }
  689.         else {
  690.             // XXX fix me
  691.             GetThreadOutliner().setAttribute("focusring","false");
  692.             GetMessagePane().setAttribute("focusring","false");
  693.         }
  694.         
  695.         lastFocusedElement=currentFocusedElement;
  696.  
  697.         // since we just changed the pane with focus we need to update the toolbar to reflect this
  698.         document.commandDispatcher.updateCommands('mail-toolbar');
  699.     }
  700. //    else
  701. //      dump('current focused element matched last focused element\n');
  702. }
  703.  
  704. function MessagePaneHasFocus()
  705. {
  706.   // message pane has focus if the iframe has focus OR if the message pane box
  707.   // has focus....
  708.   // first, check to see if the message pane box has focus...if it does, return true
  709.   var messagePane = GetMessagePane();
  710.   if (WhichPaneHasFocus() == messagePane)
  711.     return true;
  712.  
  713.   // second, check to see if the iframe has focus...if it does, return true....
  714.  
  715.   // check to see if the iframe has focus...
  716.     var focusedWindow = top.document.commandDispatcher.focusedWindow;
  717.     var messagePaneWindow = top.frames['messagepane'];
  718.     
  719.     if ( focusedWindow && messagePaneWindow && (focusedWindow != top) )
  720.     {        
  721.         var hasFocus = IsSubWindowOf(focusedWindow, messagePaneWindow);
  722.         return hasFocus;
  723.     }
  724.     
  725.     return false;
  726. }
  727.  
  728. function IsSubWindowOf(search, wind)
  729. {
  730.     //dump("IsSubWindowOf(" + search + ", " + wind + ", " + found + ")\n");
  731.     if (search == wind)
  732.         return true;
  733.     
  734.     for ( index = 0; index < wind.frames.length; index++ )
  735.     {
  736.         if ( IsSubWindowOf(search, wind.frames[index]) )
  737.             return true;
  738.     }
  739.     return false;
  740. }
  741.  
  742.  
  743. function WhichPaneHasFocus(){
  744.     var whichPane= null;
  745.     var currentNode = top.document.commandDispatcher.focusedElement;    
  746.  
  747.   var threadOutliner = GetThreadOutliner();
  748.   var folderOutliner = GetFolderOutliner();
  749.   var messagePane = GetMessagePane();
  750.     
  751.     while (currentNode) {
  752.         if (currentNode === threadOutliner ||
  753.             currentNode === folderOutliner ||
  754.             currentNode === messagePane)
  755.             return currentNode;
  756.                     
  757.             currentNode = currentNode.parentNode;
  758.     }
  759.     
  760.     return null;
  761. }
  762.  
  763. function SetupCommandUpdateHandlers()
  764. {
  765.     //dump("SetupCommandUpdateHandlers\n");
  766.  
  767.     var widget;
  768.     
  769.     // folder pane
  770.     widget = GetFolderOutliner();
  771.     if ( widget )
  772.         widget.controllers.appendController(FolderPaneController);
  773.     
  774.     // thread pane
  775.     widget = GetThreadOutliner();
  776.     if ( widget )
  777.         widget.controllers.appendController(ThreadPaneController);
  778.         
  779.     top.controllers.insertControllerAt(0, DefaultController);
  780. }
  781.  
  782. function IsSendUnsentMsgsEnabled(folderResource)
  783. {
  784.   var identity;
  785.   try {
  786.     if (folderResource) {
  787.       // if folderResource is non-null, it is
  788.       // resource for the "Unsent Messages" folder
  789.       // we're here because we've done a right click on the "Unsent Messages"
  790.       // folder (context menu)
  791.       var msgFolder = folderResource.QueryInterface(Components.interfaces.nsIMsgFolder);
  792.       return (msgFolder.getTotalMessages(false) > 0);
  793.     }
  794.     else {
  795.       var folders = GetSelectedMsgFolders();
  796.       if (folders.length > 0) {
  797.         identity = getIdentityForServer(folders[0].server);
  798.       }
  799.     }
  800.   }
  801.   catch (ex) {
  802.     dump("ex = " + ex + "\n");
  803.     identity = null;
  804.   }
  805.  
  806.   try {
  807.     if (!identity) {
  808.       var am = Components.classes["@mozilla.org/messenger/account-manager;1"].getService(Components.interfaces.nsIMsgAccountManager);
  809.       identity = am.defaultAccount.defaultIdentity;
  810.     }
  811.  
  812.     var msgSendlater = Components.classes["@mozilla.org/messengercompose/sendlater;1"].getService(Components.interfaces.nsIMsgSendLater);
  813.     var unsentMsgsFolder = msgSendlater.getUnsentMessagesFolder(identity);
  814.     return (unsentMsgsFolder.getTotalMessages(false) > 0);
  815.   }
  816.   catch (ex) {
  817.     dump("ex = " + ex + "\n");
  818.   }
  819.   return false;
  820. }
  821.  
  822. function IsRenameFolderEnabled()
  823. {
  824.     var folderOutliner = GetFolderOutliner();
  825.     var selection = folderOutliner.outlinerBoxObject.selection;
  826.     if (selection.count == 1)
  827.     {
  828.         var startIndex = {};
  829.         var endIndex = {};
  830.         selection.getRangeAt(0, startIndex, endIndex);
  831.         var folderResource = GetFolderResource(folderOutliner, startIndex.value);
  832.         var canRename = GetFolderAttribute(folderOutliner, folderResource, "CanRename") == "true";
  833.         return canRename && isCommandEnabled("cmd_renameFolder");
  834.     }
  835.     else
  836.         return false;
  837. }
  838.  
  839. function IsFolderCharsetEnabled()
  840. {
  841.   return IsFolderSelected();
  842. }
  843.  
  844. function IsPropertiesEnabled()
  845. {
  846.   return IsFolderSelected();
  847. }
  848.  
  849. function IsViewNavigationItemEnabled()
  850. {
  851.     return IsFolderSelected();
  852. }
  853.  
  854. function IsFolderSelected()
  855. {
  856.     var folderOutliner = GetFolderOutliner();
  857.     var selection = folderOutliner.outlinerBoxObject.selection;
  858.     if (selection.count == 1)
  859.     {
  860.         var startIndex = {};
  861.         var endIndex = {};
  862.         selection.getRangeAt(0, startIndex, endIndex);
  863.         var folderResource = GetFolderResource(folderOutliner, startIndex.value);
  864.         return GetFolderAttribute(folderOutliner, folderResource, "IsServer") != "true";
  865.     }
  866.     else
  867.         return false;
  868. }
  869.  
  870. function IsFindEnabled()
  871. {
  872.     return (!IsThreadAndMessagePaneSplitterCollapsed() && (GetNumSelectedMessages() > 0));
  873. }
  874.  
  875. function MsgDeleteFolder()
  876. {
  877.     var folderOutliner = GetFolderOutliner();
  878.     var selectedFolders = GetSelectedMsgFolders();
  879.     for (var i = 0; i < selectedFolders.length; i++)
  880.     {
  881.         var selectedFolder = selectedFolders[i];
  882.         var folderResource = selectedFolder.QueryInterface(Components.interfaces.nsIRDFResource);
  883.         var specialFolder = GetFolderAttribute(folderOutliner, folderResource, "SpecialFolder");
  884.         if (specialFolder != "Inbox" && specialFolder != "Trash")
  885.         {
  886.             var protocolInfo = Components.classes["@mozilla.org/messenger/protocol/info;1?type=" + selectedFolder.server.type].getService(Components.interfaces.nsIMsgProtocolInfo);
  887.  
  888.             // do not allow deletion of special folders on imap accounts
  889.             if ((specialFolder == "Sent" || 
  890.                 specialFolder == "Drafts" || 
  891.                 specialFolder == "Templates") &&
  892.                 !protocolInfo.specialFoldersDeletionAllowed)
  893.             {
  894.                 var errorMessage = gMessengerBundle.getFormattedString("specialFolderDeletionErr",
  895.                                                     [specialFolder]);
  896.                 var specialFolderDeletionErrTitle = gMessengerBundle.getString("specialFolderDeletionErrTitle");
  897.                 promptService.alert(window, specialFolderDeletionErrTitle, errorMessage);
  898.                 continue;
  899.             }   
  900.             else if (isNewsURI(folderResource.Value))
  901.             {
  902.                 var unsubscribe = ConfirmUnsubscribe(selectedFolder);
  903.                 if (unsubscribe)
  904.                     UnSubscribe(selectedFolder);
  905.             }
  906.             else
  907.             {
  908.                 var parentResource = selectedFolder.parent.QueryInterface(Components.interfaces.nsIRDFResource);
  909.                 messenger.DeleteFolders(GetFolderDatasource(), parentResource, folderResource);
  910.             }
  911.         }
  912.     }
  913. }
  914.  
  915. // 3pane related commands.  Need to go in own file.  Putting here for the moment.
  916. function MsgNextMessage()
  917. {
  918.     GoNextMessage(nsMsgNavigationType.nextMessage, false );
  919. }
  920.  
  921. function MsgNextUnreadMessage()
  922. {
  923.     GoNextMessage(nsMsgNavigationType.nextUnreadMessage, true);
  924. }
  925. function MsgNextFlaggedMessage()
  926. {
  927.     GoNextMessage(nsMsgNavigationType.nextFlagged, true);
  928. }
  929.  
  930. function MsgNextUnreadThread()
  931. {
  932.     //First mark the current thread as read.  Then go to the next one.
  933.     MsgMarkThreadAsRead();
  934.     GoNextMessage(nsMsgNavigationType.nextUnreadThread, true);
  935. }
  936.  
  937. function MsgPreviousMessage()
  938. {
  939.     GoNextMessage(nsMsgNavigationType.previousMessage, false);
  940. }
  941.  
  942. function MsgPreviousUnreadMessage()
  943. {
  944.     GoNextMessage(nsMsgNavigationType.previousUnreadMessage, true);
  945. }
  946.  
  947. function MsgPreviousFlaggedMessage()
  948. {
  949.     GoNextMessage(nsMsgNavigationType.previousFlagged, true);
  950. }
  951.  
  952. function MsgViewAllMsgs() 
  953. {
  954.     //dump("MsgViewAllMsgs\n");
  955.     if(gDBView)
  956.     {
  957.         gDBView.viewType = nsMsgViewType.eShowAllThreads;
  958.  
  959.         var folder = GetSelectedFolder();
  960.         if(folder) {
  961.             folder.setAttribute("viewType", nsMsgViewType.eShowAllThreads);
  962.         }
  963.     }
  964. }
  965.  
  966. function GetFolderNameFromUri(uri, outliner)
  967. {
  968.     var folderResource = RDF.GetResource(uri);
  969.  
  970.     var db = outliner.outlinerBoxObject.outlinerBody.database;
  971.  
  972.     var nameProperty = RDF.GetResource('http://home.netscape.com/NC-rdf#Name');
  973.  
  974.     var nameResult;
  975.     try {
  976.         nameResult = db.GetTarget(folderResource, nameProperty , true);
  977.     }
  978.     catch (ex) {
  979.         return "";
  980.     }
  981.  
  982.     nameResult = nameResult.QueryInterface(Components.interfaces.nsIRDFLiteral);
  983.     return nameResult.Value;
  984. }
  985.  
  986. function SwitchPaneFocus(direction)
  987. {
  988.   var gray_vertical_splitter = document.getElementById("gray_vertical_splitter"); 
  989.   var focusedElement = document.commandDispatcher.focusedElement;
  990.   var focusedElementId;
  991.   if (direction == "counter-clockwise")
  992.     {
  993.         if ( MessagePaneHasFocus() )
  994.             SetFocusThreadPane();
  995.         else 
  996.         {
  997.             try 
  998.             { 
  999.                 focusedElementId = focusedElement.getAttribute('id');
  1000.                 if(focusedElementId == "threadOutliner")
  1001.                 {
  1002.                     if (gray_vertical_splitter)
  1003.                     {
  1004.                         if (!(is_collapsed(gray_vertical_splitter)))
  1005.                           SetFocusFolderPane();
  1006.                         else if(!(IsThreadAndMessagePaneSplitterCollapsed()))
  1007.                           SetFocusMessagePane();
  1008.                     }
  1009.                     else 
  1010.                     {
  1011.                         if (!(sidebar_is_collapsed()))
  1012.                           SetFocusFolderPane();
  1013.                         else if(!(IsThreadAndMessagePaneSplitterCollapsed()))
  1014.                           SetFocusMessagePane();
  1015.                     }
  1016.                 }
  1017.                 else if(focusedElementId == "folderOutliner")
  1018.                 {
  1019.                     if (!(IsThreadAndMessagePaneSplitterCollapsed()))
  1020.                         SetFocusMessagePane();
  1021.                     else
  1022.                         SetFocusThreadPane();
  1023.                 }
  1024.             }
  1025.             catch(e) 
  1026.             {
  1027.                 SetFocusMessagePane();
  1028.             }
  1029.         }
  1030.     }
  1031.     else
  1032.     {
  1033.  
  1034.         if ( MessagePaneHasFocus() )
  1035.         {
  1036.             if (gray_vertical_splitter)
  1037.             {
  1038.                 if (!(is_collapsed(gray_vertical_splitter)))
  1039.                     SetFocusFolderPane();
  1040.                 else
  1041.                     SetFocusThreadPane();
  1042.             }
  1043.             else 
  1044.             {
  1045.                 if (!(sidebar_is_collapsed()))
  1046.                   SetFocusFolderPane();
  1047.                 else
  1048.                   SetFocusThreadPane();
  1049.             }
  1050.         }
  1051.         else 
  1052.         {
  1053.             try 
  1054.             { 
  1055.                 focusedElementId = focusedElement.getAttribute('id');
  1056.                 if(focusedElementId == "threadOutliner")
  1057.                 {
  1058.                     if (!(IsThreadAndMessagePaneSplitterCollapsed()))
  1059.                         SetFocusMessagePane();
  1060.                     else if (gray_vertical_splitter)
  1061.                     {
  1062.                         if (!(is_collapsed(gray_vertical_splitter)))
  1063.                         SetFocusFolderPane();
  1064.                     }
  1065.                     else if (!(sidebar_is_collapsed()))
  1066.                         SetFocusFolderPane();
  1067.  
  1068.                 }
  1069.                 else if(focusedElementId == "folderOutliner")
  1070.                     SetFocusThreadPane();
  1071.             }
  1072.             catch(e) 
  1073.             {
  1074.                 SetFocusMessagePane();
  1075.             }
  1076.         }
  1077.     }
  1078.  
  1079. }
  1080.  
  1081. function SetFocusFolderPane()
  1082. {
  1083.     var folderOutliner = GetFolderOutliner();
  1084.     folderOutliner.focus();
  1085. }
  1086.  
  1087. function SetFocusThreadPane()
  1088. {
  1089.     var threadOutliner = GetThreadOutliner();
  1090.     threadOutliner.focus();
  1091. }
  1092.  
  1093. function SetFocusMessagePane()
  1094. {
  1095.     var messagePaneFrame = GetMessagePaneFrame();
  1096.     messagePaneFrame.focus();
  1097. }
  1098.  
  1099. function is_collapsed(element) 
  1100. {
  1101.   return (element.getAttribute('state') == 'collapsed');
  1102. }
  1103.  
  1104. function isCommandEnabled(cmd)
  1105. {
  1106.   var selectedFolders = GetSelectedMsgFolders();
  1107.   var numFolders = selectedFolders.length;
  1108.   if(numFolders !=1)
  1109.     return false;
  1110.  
  1111.   var folder = selectedFolders[0];
  1112.   if (!folder)
  1113.     return false;
  1114.   else
  1115.     return folder.isCommandEnabled(cmd);
  1116.  
  1117. }
  1118.  
  1119.