home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 35 Internet / 35-Internet.zip / mozil06.zip / bin / chrome / messenger.jar / content / messenger / mail3PaneWindowCommands.js < prev    next >
Text File  |  2001-02-14  |  24KB  |  1,037 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.  
  21. // Controller object for folder pane
  22. var FolderPaneController =
  23. {
  24.    supportsCommand: function(command)
  25.     {
  26.         switch ( command )
  27.         {
  28.             case "cmd_delete":
  29.             case "button_delete":
  30.             case "cmd_selectAll":
  31.             case "cmd_cut":
  32.             case "cmd_copy":
  33.             case "cmd_paste":
  34.                 return true;
  35.                 
  36.             default:
  37.                 return false;
  38.         }
  39.     },
  40.  
  41.     isCommandEnabled: function(command)
  42.     {
  43.         //        dump("FolderPaneController.IsCommandEnabled(" + command + ")\n");
  44.         switch ( command )
  45.         {
  46.             case "cmd_selectAll":
  47.             case "cmd_cut":
  48.             case "cmd_copy":
  49.             case "cmd_paste":
  50.                 return false;
  51.             case "cmd_delete":
  52.             case "button_delete":
  53.                 if ( command == "cmd_delete" )
  54.                     goSetMenuValue(command, 'valueFolder');
  55.                 var folderTree = GetFolderTree();
  56.                 if ( folderTree && folderTree.selectedItems &&
  57.                      folderTree.selectedItems.length > 0)
  58.                 {
  59.                     var specialFolder = null;
  60.                     var isServer = null;
  61.                     var serverType = null;
  62.                     try {
  63.                         var selectedFolder = folderTree.selectedItems[0];
  64.                         specialFolder = selectedFolder.getAttribute('SpecialFolder');
  65.                         isServer = selectedFolder.getAttribute('IsServer');
  66.                         serverType = selectedFolder.getAttribute('ServerType');
  67.                     }
  68.                     catch (ex) {
  69.                         //dump("specialFolder failure: " + ex + "\n");
  70.                     }
  71.                     if (specialFolder == "Inbox" || specialFolder == "Trash" || isServer == "true")
  72.                        return false;
  73.                     else
  74.                        return true;
  75.                 }
  76.                 else
  77.                     return false;
  78.             
  79.             default:
  80.                 return false;
  81.         }
  82.     },
  83.  
  84.     doCommand: function(command)
  85.     {
  86.         switch ( command )
  87.         {
  88.             case "cmd_delete":
  89.             case "button_delete":
  90.                 MsgDeleteFolder();
  91.                 break;
  92.         }
  93.     },
  94.     
  95.     onEvent: function(event)
  96.     {
  97.         // on blur events set the menu item texts back to the normal values
  98.         if ( event == 'blur' )
  99.         {
  100.             goSetMenuValue('cmd_delete', 'valueDefault');
  101.         }
  102.     }
  103. };
  104.  
  105.  
  106. // Controller object for thread pane
  107. var ThreadPaneController =
  108. {
  109.    supportsCommand: function(command)
  110.     {
  111.         switch ( command )
  112.         {
  113.             case "cmd_selectAll":
  114.             case "cmd_cut":
  115.             case "cmd_copy":
  116.             case "cmd_paste":
  117.                 return true;
  118.                 
  119.             default:
  120.                 return false;
  121.         }
  122.     },
  123.  
  124.     isCommandEnabled: function(command)
  125.     {
  126.         switch ( command )
  127.         {
  128.             case "cmd_selectAll":
  129.                 return true;
  130.             
  131.             case "cmd_cut":
  132.             case "cmd_copy":
  133.             case "cmd_paste":
  134.                 return false;
  135.                 
  136.             default:
  137.                 return false;
  138.         }
  139.     },
  140.  
  141.     doCommand: function(command)
  142.     {
  143.         switch ( command )
  144.         {
  145.             case "cmd_selectAll":
  146.                 var threadTree = GetThreadTree();
  147.                 if ( threadTree )
  148.                 {
  149.                     //if we're threaded we need to expand everything before selecting all
  150.                     if(messageView.showThreads)
  151.                         ExpandOrCollapseThreads(true);
  152.                     threadTree.selectAll();
  153.                     if ( threadTree.selectedItems && threadTree.selectedItems.length != 1 )
  154.                         ClearMessagePane();
  155.                 }
  156.                 break;
  157.         }
  158.     },
  159.     
  160.     onEvent: function(event)
  161.     {
  162.     }
  163. };
  164.  
  165. // DefaultController object (handles commands when one of the trees does not have focus)
  166. var DefaultController =
  167. {
  168.    supportsCommand: function(command)
  169.     {
  170.  
  171.         switch ( command )
  172.         {
  173.             case "cmd_reply":
  174.             case "button_reply":
  175.             case "cmd_replySender":
  176.             case "cmd_replyGroup":
  177.             case "cmd_replyall":
  178.             case "button_replyall":
  179.             case "cmd_forward":
  180.             case "button_forward":
  181.             case "cmd_forwardInline":
  182.             case "cmd_forwardAttachment":
  183.             case "cmd_editAsNew":
  184.             case "cmd_delete":
  185.             case "button_delete":
  186.             case "cmd_shiftDelete":
  187.             case "cmd_nextMsg":
  188.             case "cmd_nextUnreadMsg":
  189.             case "cmd_nextFlaggedMsg":
  190.             case "cmd_nextUnreadThread":
  191.             case "cmd_previousMsg":
  192.             case "cmd_previousUnreadMsg":
  193.             case "cmd_previousFlaggedMsg":
  194.             case "cmd_viewAllMsgs":
  195.             case "cmd_viewUnreadMsgs":
  196.             case "cmd_undo":
  197.             case "cmd_redo":
  198.             case "cmd_expandAllThreads":
  199.             case "cmd_collapseAllThreads":
  200.             case "cmd_renameFolder":
  201.             case "cmd_openMessage":
  202.             case "cmd_print":
  203.             case "cmd_saveAsFile":
  204.             case "cmd_saveAsTemplate":
  205.             case "cmd_viewPageSource":
  206.             case "cmd_reload":
  207.             case "cmd_getNewMessages":
  208.             case "cmd_getNextNMessages":
  209.             case "cmd_find":
  210.             case "cmd_findAgain":
  211.             case "cmd_markAsRead":
  212.             case "cmd_markAllRead":
  213.             case "cmd_markThreadAsRead":
  214.             case "cmd_markAsFlagged":
  215.             case "cmd_file":
  216.             case "cmd_emptyTrash":
  217.             case "cmd_compactFolder":
  218.             case "cmd_sortByThread":
  219.                 return true;
  220.             default:
  221.                 return false;
  222.         }
  223.     },
  224.  
  225.     isCommandEnabled: function(command)
  226.     {
  227.         switch ( command )
  228.         {
  229.             case "cmd_reply":
  230.             case "button_reply":
  231.             case "cmd_replySender":
  232.             case "cmd_replyGroup":
  233.             case "cmd_replyall":
  234.             case "button_replyall":
  235.             case "cmd_forward":
  236.             case "button_forward":
  237.             case "cmd_forwardInline":
  238.             case "cmd_forwardAttachment":
  239.             case "cmd_editAsNew":
  240.             case "cmd_delete":
  241.             case "button_delete":
  242.             case "cmd_shiftDelete":
  243.             case "cmd_openMessage":
  244.             case "cmd_print":
  245.             case "cmd_saveAsFile":
  246.             case "cmd_saveAsTemplate":
  247.             case "cmd_viewPageSource":
  248.             case "cmd_reload":
  249.             case "cmd_markThreadAsRead":
  250.             case "cmd_markAsFlagged":
  251.             case "cmd_file":
  252.                 var numSelected = GetNumSelectedMessages();
  253.  
  254.                 if ( command == "cmd_delete")
  255.                 {
  256.                     if ( numSelected < 2 )
  257.                         goSetMenuValue(command, 'valueMessage');
  258.                     else
  259.                         goSetMenuValue(command, 'valueMessages');
  260.                 }
  261.                 return ( numSelected > 0 );
  262.             case "cmd_nextMsg":
  263.             case "cmd_nextUnreadMsg":
  264.             case "cmd_nextUnreadThread":
  265.             case "cmd_previousMsg":
  266.             case "cmd_previousUnreadMsg":
  267.                 return MailAreaHasFocus() && IsViewNavigationItemEnabled();
  268.             case "cmd_markAsRead":
  269.                 if(!MailAreaHasFocus())
  270.                     return false;
  271.                 else
  272.                     return(GetNumSelectedMessages() > 0);
  273.             case "cmd_markAllRead":
  274.                 return(MailAreaHasFocus() && IsFolderSelected());
  275.             case "cmd_find":
  276.             case "cmd_findAgain":
  277.                 return IsFindEnabled();
  278.                 break;
  279.             case "cmd_expandAllThreads":
  280.             case "cmd_collapseAllThreads":
  281.                 return messageView.showThreads;
  282.                 break;
  283.             case "cmd_nextFlaggedMsg":
  284.             case "cmd_previousFlaggedMsg":
  285.                 return IsViewNavigationItemEnabled();
  286.             case "cmd_viewAllMsgs":
  287.                 return true;
  288.             case "cmd_sortByThread":
  289.                 return (messageView.viewType != viewShowUnread);
  290.                 break;
  291.               case "cmd_viewUnreadMsgs":
  292.                   return (messageView.showThreads == false);
  293.                   break;
  294.             case "cmd_undo":
  295.             case "cmd_redo":
  296.                 return SetupUndoRedoCommand(command);
  297.             case "cmd_renameFolder":
  298.                 return IsRenameFolderEnabled();
  299.             case "cmd_getNewMessages":
  300.                 return IsGetNewMessagesEnabled();
  301.             case "cmd_getNextNMessages":
  302.                 return IsGetNextNMessagesEnabled();
  303.             case "cmd_emptyTrash":
  304.                 return IsEmptyTrashEnabled();
  305.             case "cmd_compactFolder":
  306.                 return IsCompactFolderEnabled();
  307.             default:
  308.                 return false;
  309.         }
  310.         return false;
  311.     },
  312.  
  313.     doCommand: function(command)
  314.     {
  315.            //dump("ThreadPaneController.doCommand(" + command + ")\n");
  316.  
  317.         switch ( command )
  318.         {
  319.             case "cmd_getNewMessages":
  320.                 MsgGetMessage();
  321.                 break;
  322.             case "cmd_getNextNMessages":
  323.                 MsgGetNextNMessages();
  324.                 break;
  325.             case "cmd_reply":
  326.                 MsgReplyMessage(null);
  327.                 break;
  328.             case "cmd_replySender":
  329.                 MsgReplySender(null);
  330.                 break;
  331.             case "cmd_replyGroup":
  332.                 MsgReplyGroup(null);
  333.                 break;
  334.             case "cmd_replyall":
  335.                 MsgReplyToAllMessage(null);
  336.                 break;
  337.             case "cmd_forward":
  338.                 MsgForwardMessage(null);
  339.                 break;
  340.             case "cmd_forwardInline":
  341.                 MsgForwardAsInline(null);
  342.                 break;
  343.             case "cmd_forwardAttachment":
  344.                 MsgForwardAsAttachment(null);
  345.                 break;
  346.             case "cmd_editAsNew":
  347.                 MsgEditMessageAsNew();
  348.                 break;
  349.             case "cmd_delete":
  350.                 MsgDeleteMessage(false, false);
  351.                 break;
  352.             case "cmd_shiftDelete":
  353.                 MsgDeleteMessage(true, false);
  354.                 break;
  355.             case "button_delete":
  356.                 MsgDeleteMessage(false, true);
  357.                 break;
  358.             case "cmd_nextUnreadMsg":
  359.                 MsgNextUnreadMessage();
  360.                 break;
  361.             case "cmd_nextUnreadThread":
  362.                 MsgNextUnreadThread();
  363.                 break;
  364.             case "cmd_nextMsg":
  365.                 MsgNextMessage();
  366.                 break;
  367.             case "cmd_nextFlaggedMsg":
  368.                 MsgNextFlaggedMessage();
  369.                 break;
  370.             case "cmd_previousMsg":
  371.                 MsgPreviousMessage();
  372.                 break;
  373.             case "cmd_previousUnreadMsg":
  374.                 MsgPreviousUnreadMessage();
  375.                 break;
  376.             case "cmd_previousFlaggedMsg":
  377.                 MsgPreviousFlaggedMessage();
  378.                 break;
  379.             case "cmd_sortByThread":
  380.                 MsgSortByThread();
  381.                 break;
  382.             case "cmd_viewAllMsgs":
  383.                 MsgViewAllMsgs();
  384.                 break;
  385.             case "cmd_viewUnreadMsgs":
  386.                 MsgViewUnreadMsg();
  387.                 break;
  388.             case "cmd_undo":
  389.                 messenger.Undo(msgWindow);
  390.                 break;
  391.             case "cmd_redo":
  392.                 messenger.Redo(msgWindow);
  393.                 break;
  394.             case "cmd_expandAllThreads":
  395.                 ExpandOrCollapseThreads(true);
  396.                 break;
  397.             case "cmd_collapseAllThreads":
  398.                 ExpandOrCollapseThreads(false);
  399.                 break;
  400.             case "cmd_renameFolder":
  401.                 MsgRenameFolder();
  402.                 return;
  403.             case "cmd_openMessage":
  404.                 MsgOpenNewWindowForMessage(null, null);
  405.                 return;
  406.             case "cmd_print":
  407.                 PrintEnginePrint();
  408.                 return;
  409.             case "cmd_saveAsFile":
  410.                 MsgSaveAsFile();
  411.                 return;
  412.             case "cmd_saveAsTemplate":
  413.                 MsgSaveAsTemplate();
  414.                 return;
  415.             case "cmd_viewPageSource":
  416.                 MsgViewPageSource();
  417.                 return;
  418.             case "cmd_reload":
  419.                 MsgReload();
  420.                 return;
  421.             case "cmd_find":
  422.                 MsgFind();
  423.                 return;
  424.             case "cmd_findAgain":
  425.                 MsgFindAgain();
  426.                 return;
  427.             case "cmd_markAsRead":
  428.                 MsgMarkMsgAsRead(null);
  429.                 return;
  430.             case "cmd_markThreadAsRead":
  431.                 MsgMarkThreadAsRead();
  432.                 return;
  433.             case "cmd_markAllRead":
  434.                 MsgMarkAllRead();
  435.                 return;
  436.             case "cmd_markAsFlagged":
  437.                 MsgMarkAsFlagged(null);
  438.                 return;
  439.             case "cmd_emptyTrash":
  440.                 MsgEmptyTrash();
  441.                 return;
  442.             case "cmd_compactFolder":
  443.                 MsgCompactFolder();
  444.                 return;
  445.         }
  446.     },
  447.     
  448.     onEvent: function(event)
  449.     {
  450.         // on blur events set the menu item texts back to the normal values
  451.         if ( event == 'blur' )
  452.         {
  453.             goSetMenuValue('cmd_delete', 'valueDefault');
  454.             goSetMenuValue('cmd_undo', 'valueDefault');
  455.             goSetMenuValue('cmd_redo', 'valueDefault');
  456.         }
  457.     }
  458. };
  459.  
  460. function MailAreaHasFocus()
  461. {
  462.     //Input and TextAreas should get access to the keys that cause these commands.
  463.     //Currently if we don't do this then we will steal the key away and you can't type them
  464.     //in these controls. This is a bug that should be fixed and when it is we can get rid of
  465.     //this.
  466.     var focusedElement = top.document.commandDispatcher.focusedElement;
  467.     if(focusedElement)
  468.     {
  469.         var name = focusedElement.localName;
  470.         return ((name != "INPUT") && (name != "TEXTAREA"));
  471.     }
  472.     return true;
  473. }
  474.  
  475. function GetNumSelectedMessages()
  476. {
  477.     var threadTree = GetThreadTree();
  478.     var numSelected = 0;
  479.     if ( threadTree && threadTree.selectedItems )
  480.         numSelected = threadTree.selectedItems.length;
  481.     return numSelected;
  482. }
  483.  
  484. function CommandUpdate_Mail()
  485. {
  486.     goUpdateCommand('button_delete');
  487.     goUpdateCommand('cmd_delete');
  488.     goUpdateCommand('cmd_nextMsg');
  489.     goUpdateCommand('cmd_nextUnreadMsg');
  490.     goUpdateCommand('cmd_nextUnreadThread');
  491.     goUpdateCommand('cmd_nextFlaggedMsg');
  492.     goUpdateCommand('cmd_previousMsg');
  493.     goUpdateCommand('cmd_previousUnreadMsg');
  494.     goUpdateCommand('cmd_previousFlaggedMsg');
  495.     goUpdateCommand('cmd_sortByThread');
  496.     goUpdateCommand('cmd_viewAllMsgs');
  497.     goUpdateCommand('cmd_viewUnreadMsgs');
  498.     goUpdateCommand('cmd_expandAllThreads');
  499.     goUpdateCommand('cmd_collapseAllThreads');
  500.     goUpdateCommand('cmd_renameFolder');
  501.     goUpdateCommand('cmd_getNewMessages');
  502.     goUpdateCommand('cmd_getNextNMessages');
  503.     goUpdateCommand('cmd_find');
  504.     goUpdateCommand('cmd_findAgain');
  505.     goUpdateCommand('cmd_markAllRead');
  506.     goUpdateCommand('cmd_emptyTrash');
  507.     goUpdateCommand('cmd_compactFolder');
  508. }
  509.  
  510.  
  511. var lastFocusedElement=null;
  512.  
  513. function FocusRingUpdate_Mail(){
  514.  
  515.     var currentFocusedElement = WhichPaneHasFocus();
  516.     if (!currentFocusedElement)
  517.         currentFocusedElement = GetMessagePane();
  518.     
  519.     if(currentFocusedElement != lastFocusedElement) {
  520.         if( currentFocusedElement == GetThreadTree()) {
  521.             GetThreadTree().setAttribute("focusring","true");
  522.             GetMessagePane().setAttribute("focusring","false");
  523.         }
  524.  
  525.         else if(currentFocusedElement==GetFolderTree()) {
  526.             GetThreadTree().setAttribute("focusring","false");
  527.             GetMessagePane().setAttribute("focusring","false");
  528.         }
  529.         else if(currentFocusedElement==GetMessagePane()){
  530.             GetThreadTree().setAttribute("focusring","false");
  531.             GetMessagePane().setAttribute("focusring","true");
  532.         }
  533.         else {
  534.             GetThreadTree().setAttribute("focusring","false");
  535.             GetMessagePane().setAttribute("focusring","false");
  536.         }
  537.         
  538.         lastFocusedElement=currentFocusedElement;
  539.     }
  540. }
  541.     
  542.  
  543. function ThreadTreeUpdate_Mail(command)
  544. {
  545.     goUpdateCommand('button_reply');
  546.     goUpdateCommand('button_replyall');
  547.     goUpdateCommand('button_forward');
  548.     goUpdateCommand('cmd_shiftDelete');
  549.     goUpdateCommand('cmd_reply');
  550.     goUpdateCommand('cmd_replySender');
  551.     goUpdateCommand('cmd_replyGroup');
  552.     goUpdateCommand('cmd_replyall');
  553.     goUpdateCommand('cmd_forward');
  554.     goUpdateCommand('cmd_forwardInline');
  555.     goUpdateCommand('cmd_forwardAttachment');
  556.     goUpdateCommand('cmd_editAsNew');
  557.     goUpdateCommand('cmd_openMessage');
  558.     goUpdateCommand('cmd_print');
  559.     goUpdateCommand('cmd_saveAsFile');
  560.     goUpdateCommand('cmd_saveAsTemplate');
  561.     goUpdateCommand('cmd_viewPageSource');
  562.     goUpdateCommand('cmd_reload');
  563.     goUpdateCommand('cmd_markAsRead');
  564.     goUpdateCommand('cmd_markThreadAsRead');
  565.     goUpdateCommand('cmd_markAsFlagged');
  566.     goUpdateCommand('cmd_file');
  567. }
  568.  
  569. function SetupUndoRedoCommand(command)
  570. {
  571.     // dump ("--- SetupUndoRedoCommand: " + command + "\n");
  572.     var canUndoOrRedo = false;
  573.     var txnType = 0;
  574.  
  575.     if (command == "cmd_undo")
  576.     {
  577.         canUndoOrRedo = messenger.CanUndo();
  578.         txnType = messenger.GetUndoTransactionType();
  579.     }
  580.     else
  581.     {
  582.         canUndoOrRedo = messenger.CanRedo();
  583.         txnType = messenger.GetRedoTransactionType();
  584.     }
  585.  
  586.     if (canUndoOrRedo)
  587.     {
  588.         switch (txnType)
  589.         {
  590.         default:
  591.         case 0:
  592.             goSetMenuValue(command, 'valueDefault');
  593.             break;
  594.         case 1:
  595.             goSetMenuValue(command, 'valueDeleteMsg');
  596.             break;
  597.         case 2:
  598.             goSetMenuValue(command, 'valueMoveMsg');
  599.             break;
  600.         case 3:
  601.             goSetMenuValue(command, 'valueCopyMsg');
  602.             break;
  603.         }
  604.     }
  605.     else
  606.     {
  607.         goSetMenuValue(command, 'valueDefault');
  608.     }
  609.     return canUndoOrRedo;
  610. }
  611.  
  612.  
  613. function CommandUpdate_UndoRedo()
  614. {
  615.     ShowMenuItem("menu_undo", true);
  616.     EnableMenuItem("menu_undo", SetupUndoRedoCommand("cmd_undo"));
  617.     ShowMenuItem("menu_redo", true);
  618.     EnableMenuItem("menu_redo", SetupUndoRedoCommand("cmd_redo"));
  619. }
  620.  
  621.  
  622. function MessagePaneHasFocus()
  623.  
  624. {
  625.     var focusedWindow = top.document.commandDispatcher.focusedWindow;
  626.     var messagePaneWindow = top.frames['messagepane'];
  627.     
  628.     if ( focusedWindow && messagePaneWindow && (focusedWindow != top) )
  629.     {
  630.         
  631.         var hasFocus = IsSubWindowOf(focusedWindow, messagePaneWindow);
  632.  
  633.         return hasFocus;
  634.     }
  635.     
  636.     return false;
  637. }
  638.  
  639. function IsSubWindowOf(search, wind)
  640. {
  641.     //dump("IsSubWindowOf(" + search + ", " + wind + ", " + found + ")\n");
  642.     if (search == wind)
  643.         return true;
  644.     
  645.     for ( index = 0; index < wind.frames.length; index++ )
  646.     {
  647.         if ( IsSubWindowOf(search, wind.frames[index]) )
  648.             return true;
  649.     }
  650.     return false;
  651. }
  652.  
  653.  
  654. function WhichPaneHasFocus(){
  655.     var whichPane= null;
  656.     var currentNode = top.document.commandDispatcher.focusedElement;    
  657.  
  658.     var threadTree = GetThreadTree();
  659.     var folderTree = GetFolderTree();
  660.     var messagePane = GetMessagePane();
  661.     
  662.     while (currentNode) {
  663.         if (currentNode === threadTree ||
  664.             currentNode === folderTree ||
  665.             currentNode === messagePane)
  666.             return currentNode;
  667.                     
  668.             currentNode = currentNode.parentNode;
  669.     }
  670.     
  671.     return null;
  672. }
  673.  
  674.  
  675.  
  676.  
  677.  
  678. function SetupCommandUpdateHandlers()
  679. {
  680.     dump("SetupCommandUpdateHandlers\n");
  681.  
  682.     var widget;
  683.     
  684.     // folder pane
  685.     widget = GetFolderTree();
  686.     if ( widget )
  687.         widget.controllers.appendController(FolderPaneController);
  688.     
  689.     // thread pane
  690.     widget = GetThreadTree();
  691.     if ( widget )
  692.         widget.controllers.appendController(ThreadPaneController);
  693.         
  694.     top.controllers.insertControllerAt(0, DefaultController);
  695. }
  696.  
  697. function IsRenameFolderEnabled()
  698. {
  699.     var tree = GetFolderTree();
  700.     var folderList = tree.selectedItems;
  701.  
  702.     if(folderList.length == 1)
  703.     {
  704.         var folderNode = folderList[0];
  705.         return(folderNode.getAttribute("CanRename") == "true");
  706.     }
  707.     else
  708.         return false;
  709.  
  710. }
  711.  
  712. function IsViewNavigationItemEnabled()
  713. {
  714.     return IsFolderSelected();
  715. }
  716.  
  717. function IsFolderSelected()
  718. {
  719.     var tree = GetFolderTree();
  720.     var folderList = tree.selectedItems;
  721.  
  722.     if(folderList.length == 1)
  723.     {
  724.         var folderNode = folderList[0];
  725.         return(folderNode.getAttribute("IsServer") != "true");
  726.     }
  727.     else
  728.         return false;
  729. }
  730.  
  731. function IsFindEnabled()
  732. {
  733.     return (!IsThreadAndMessagePaneSplitterCollapsed() && (gCurrentDisplayedMessage != null));
  734.  
  735. }
  736.  
  737. function MsgDeleteFolder()
  738. {
  739.     //get the selected elements
  740.     var tree = GetFolderTree();
  741.     var folderList = tree.selectedItems;
  742.     var i;
  743.     var folder, parent;
  744.     var specialFolder;
  745.     for(i = 0; i < folderList.length; i++)
  746.     {
  747.         folder = folderList[i];
  748.         folderuri = folder.getAttribute('id');
  749.         specialFolder = folder.getAttribute('SpecialFolder');
  750.         if (specialFolder != "Inbox" && specialFolder != "Trash")
  751.         {
  752.             dump(folderuri);
  753.             parent = folder.parentNode.parentNode;    
  754.             var parenturi = parent.getAttribute('id');
  755.             if(parenturi)
  756.                 dump(parenturi);
  757.             else
  758.                 dump("No parenturi");
  759.             dump("folder = " + folder.localName + "\n"); 
  760.             dump("parent = " + parent.localName + "\n"); 
  761.             messenger.DeleteFolders(tree.database,
  762.                                     parent.resource, folder.resource);
  763.         }
  764.     }
  765.  
  766.  
  767. }
  768.  
  769.  //3pane related commands.  Need to go in own file.  Putting here for the moment.
  770.  
  771. function MsgNextMessage()
  772. {
  773.     GoNextMessage(navigateAny, false );
  774. }
  775.  
  776. function MsgNextUnreadMessage()
  777. {
  778.     GoNextMessage(navigateUnread, true);
  779. }
  780. function MsgNextFlaggedMessage()
  781. {
  782.     GoNextMessage(navigateFlagged, true);
  783. }
  784.  
  785. function MsgNextUnreadThread()
  786. {
  787.     //First mark the current thread as read.  Then go to the next one.
  788.     MsgMarkThreadAsRead();
  789.     GoNextThread(navigateUnread, true, true);
  790. }
  791.  
  792. function MsgPreviousMessage()
  793. {
  794.     GoPreviousMessage(navigateAny, false);
  795. }
  796.  
  797. function MsgPreviousUnreadMessage()
  798. {
  799.     GoPreviousMessage(navigateUnread, true);
  800. }
  801.  
  802. function MsgPreviousFlaggedMessage()
  803. {
  804.     GoPreviousMessage(navigateFlagged, true);
  805. }
  806.  
  807. var viewShowAll =0;
  808. var viewShowRead = 1;
  809. var viewShowUnread =2;
  810. var viewShowWatched = 3;
  811.  
  812. function MsgViewAllMsgs() 
  813. {
  814.     dump("MsgViewAllMsgs");
  815.  
  816.     if(messageView)
  817.     {
  818.         messageView.viewType = viewShowAll;
  819.         messageView.showThreads = false;
  820.     }
  821.     RefreshThreadTreeView();
  822. }
  823.  
  824. function MsgViewUnreadMsg()
  825. {
  826.     dump("MsgViewUnreadMsgs");
  827.  
  828.     if(messageView)
  829.     {
  830.         messageView.viewType = viewShowUnread;
  831.         messageView.showThreads = false;
  832.     }
  833.  
  834.     RefreshThreadTreeView();
  835. }
  836.  
  837.  
  838. function FillInFolderTooltip(cellNode)
  839. {
  840.     var folderNode = cellNode.parentNode.parentNode;
  841.     var uri = folderNode.getAttribute('id');
  842.     var folderTree = GetFolderTree();
  843.  
  844.     var name = GetFolderNameFromUri(uri, folderTree);
  845.  
  846.     var folderResource = RDF.GetResource(uri);
  847.     var msgFolder = folderResource.QueryInterface(Components.interfaces.nsIMsgFolder);
  848.     var unreadCount = msgFolder.getNumUnread(false);
  849.     if(unreadCount < 0)
  850.         unreadCount = 0;
  851.  
  852.     var totalCount = msgFolder.getTotalMessages(false);
  853.     if(totalCount < 0)
  854.         totalCount = 0;
  855.  
  856.     var textNode = document.getElementById("foldertooltipText");
  857.     var folderTooltip = name;
  858.     if(!msgFolder.isServer)
  859.         folderTooltip += " ("  + unreadCount + "/" + totalCount +")";
  860.     textNode.setAttribute('value', folderTooltip);
  861.     return true;
  862.     
  863.  
  864. }
  865.  
  866. function GetFolderNameFromUri(uri, tree)
  867. {
  868.     var folderResource = RDF.GetResource(uri);
  869.  
  870.     var db = tree.database;
  871.  
  872.     var nameProperty = RDF.GetResource('http://home.netscape.com/NC-rdf#Name');
  873.  
  874.     var nameResult;
  875.     try {
  876.         nameResult = db.GetTarget(folderResource, nameProperty , true);
  877.     }
  878.     catch (ex) {
  879.         return "";
  880.     }
  881.  
  882.     nameResult = nameResult.QueryInterface(Components.interfaces.nsIRDFLiteral);
  883.     return nameResult.Value;
  884. }
  885.  
  886.  
  887. //Sets the thread tree's template's treeitem to be open so that all threads are expanded.
  888. function ExpandOrCollapseThreads(expand)
  889. {
  890.     SetTemplateTreeItemOpen(expand);
  891.     RefreshThreadTreeView();
  892. }
  893.  
  894. function SetTemplateTreeItemOpen(open)
  895. {
  896.     var templateTreeItem = document.getElementById("threadTreeTemplateTreeItem");
  897.     if(templateTreeItem)
  898.     {
  899.         if(open)
  900.             templateTreeItem.setAttribute("open", "true");
  901.         else
  902.             templateTreeItem.removeAttribute("open");
  903.     }
  904. }
  905.  
  906. // global variable for the gray_vertical_splitter
  907.     var gray_vertical_splitter_exists = false;
  908.  
  909. function SwitchPaneFocus(event)
  910. {
  911.     gray_vertical_splitter_exists = document.getElementById("gray_vertical_splitter");
  912.     var focusedElement;
  913.     var focusedElementId;
  914. //The first if statement is a check for the Shift+Tab -the else statement is for Tab
  915.     if (event && (event.shiftKey))
  916.     {
  917.         focusedElement = document.commandDispatcher.focusedElement;
  918.         focusedElementId="";
  919.  
  920.         if ( MessagePaneHasFocus() )
  921.             SetFocusThreadPane();
  922.         else 
  923.         {
  924.             try 
  925.             { 
  926.                 focusedElementId = focusedElement.getAttribute('id');
  927.                 if(focusedElementId == "threadTree")
  928.                 {
  929.                     if (gray_vertical_splitter_exists)
  930.                     {
  931.                         if (!(is_folderpane_collapsed()))
  932.                         SetFocusFolderPane();
  933.                         else if(!(IsThreadAndMessagePaneSplitterCollapsed()))
  934.                         SetFocusMessagePane();
  935.                     }
  936.                     else 
  937.                     {
  938.                         if (!(sidebar_is_collapsed()))
  939.                         SetFocusFolderPane();
  940.                         else if(!(IsThreadAndMessagePaneSplitterCollapsed()))
  941.                         SetFocusMessagePane();
  942.                     }
  943.                 }
  944.                 else if(focusedElementId == "folderTree")
  945.                 {
  946.                     if (!(IsThreadAndMessagePaneSplitterCollapsed()))
  947.                         SetFocusMessagePane();
  948.                     else
  949.                         SetFocusThreadPane();
  950.                 }
  951.             }
  952.             catch(e) 
  953.             {
  954.                 SetFocusMessagePane();
  955.             }
  956.         }
  957.     }
  958.     else
  959.     {
  960.         focusedElement = document.commandDispatcher.focusedElement;
  961.         focusedElementId="";
  962.  
  963.         if ( MessagePaneHasFocus() )
  964.         {
  965.             if (gray_vertical_splitter_exists)
  966.             {
  967.                 if (!(is_folderpane_collapsed()))
  968.                     SetFocusFolderPane();
  969.                 else
  970.                     SetFocusThreadPane();
  971.             }
  972.             else 
  973.             {
  974.                 if (!(sidebar_is_collapsed()))
  975.                 SetFocusFolderPane();
  976.                 else
  977.                 SetFocusThreadPane();
  978.             }
  979.         }
  980.         else 
  981.         {
  982.             try 
  983.             { 
  984.                 focusedElementId = focusedElement.getAttribute('id');
  985.                 if(focusedElementId == "threadTree")
  986.                 {
  987.                     if (!(IsThreadAndMessagePaneSplitterCollapsed()))
  988.                         SetFocusMessagePane();
  989.                     else if (gray_vertical_splitter_exists)
  990.                     {
  991.                         if (!(is_folderpane_collapsed()))
  992.                         SetFocusFolderPane();
  993.                     }
  994.                     else if (!(sidebar_is_collapsed()))
  995.                         SetFocusFolderPane();
  996.  
  997.                 }
  998.                 else if(focusedElementId == "folderTree")
  999.                     SetFocusThreadPane();
  1000.             }
  1001.             catch(e) 
  1002.             {
  1003.                 SetFocusMessagePane();
  1004.             }
  1005.         }
  1006.     }
  1007.  
  1008. }
  1009.  
  1010. function SetFocusFolderPane()
  1011. {
  1012.     document.getElementById("folderTree").focus();
  1013.     return;
  1014. }
  1015.  
  1016. function SetFocusThreadPane()
  1017. {
  1018.     document.getElementById("threadTree").focus();
  1019.     return;
  1020. }
  1021.  
  1022. function SetFocusMessagePane()
  1023. {
  1024.     top.frames['messagepane'].focus();
  1025.     return;
  1026. }
  1027.  
  1028. function is_folderpane_collapsed() 
  1029. {
  1030.     if (gray_vertical_splitter_exists)
  1031.     { 
  1032.         return (gray_vertical_splitter_exists.getAttribute('state') == 'collapsed');
  1033.     }
  1034.     return false;
  1035. }
  1036.  
  1037.