home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 January / 01_02.iso / software / netscape62win / mail.xpi / bin / chrome / messenger.jar / content / messenger / msgViewNavigation.js < prev    next >
Text File  |  2001-05-10  |  7KB  |  211 lines

  1. /* -*- Mode: C++; 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-1999 Netscape Communications Corporation. All
  18.  * Rights Reserved.
  19.  */
  20.  
  21. /*  This file contains the js functions necessary to implement view navigation within the 3 pane. */
  22.  
  23. //NOTE: gMessengerBundle must be defined and set or this Overlay won't work
  24.  
  25. var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService();
  26. promptService = promptService.QueryInterface(Components.interfaces.nsIPromptService);
  27. var accountManager = Components.classes["@mozilla.org/messenger/account-manager;1"].getService(Components.interfaces.nsIMsgAccountManager);
  28.  
  29.  
  30. function FindNextFolder(originalFolderURI)
  31. {
  32.     if (!originalFolderURI) return null;
  33.  
  34.     var originalFolderResource = RDF.GetResource(originalFolderURI);
  35.     var folder = originalFolderResource.QueryInterface(Components.interfaces.nsIFolder);
  36.     if (!folder) return null;
  37.  
  38.     try {
  39.        var subFolderEnumerator = folder.GetSubFolders();
  40.        var done = false;
  41.        while (!done) {
  42.          var element = subFolderEnumerator.currentItem();
  43.          var currentSubFolder = element.QueryInterface(Components.interfaces.nsIMsgFolder);
  44.  
  45.          // don't land in the Trash folder.
  46.          if(!IsSpecialFolder(currentSubFolder, MSG_FOLDER_FLAG_TRASH)) {
  47.            if (currentSubFolder.getNumUnread(false /* don't descend */) > 0) {
  48.              // if the child has unread, use it.
  49.              return currentSubFolder.URI;
  50.            }
  51.            else if (currentSubFolder.getNumUnread(true /* descend */) > 0) {
  52.              // if the child doesn't have any unread, but it's children do, recurse
  53.              return FindNextFolder(currentSubFolder.URI);
  54.            }
  55.          }
  56.          try {
  57.            subFolderEnumerator.next();
  58.          } 
  59.          catch (ex) {
  60.            done=true;
  61.          }
  62.       } // while
  63.     }
  64.     catch (ex) {
  65.         // one way to get here is if the folder has no sub folders
  66.     }
  67.  
  68.     if (folder.parent && folder.parent.URI) {
  69.       return FindNextFolder(folder.parent.URI);
  70.     }
  71.     return null;
  72. }
  73.  
  74. function GetTopLevelMessageForMessage(message, folder)
  75. {
  76.     if(!folder)
  77.         folder = message.msgFolder;
  78.  
  79.     var thread = folder.getThreadForMessage(message);
  80.     var outIndex = new Object();
  81.     var rootHdr = thread.GetRootHdr(outIndex);
  82.  
  83.     var topMessage = folder.createMessageFromMsgDBHdr(rootHdr);
  84.  
  85.     return topMessage;
  86. }
  87.  
  88. function CrossFolderNavigation(type, supportsFolderPane )
  89. {
  90.   if (type != nsMsgNavigationType.nextUnreadMessage) 
  91.   {
  92.       // only do cross folder navigation for "next unread message"
  93.       return null;
  94.   }
  95.  
  96.   var nextMode = pref.GetIntPref("mailnews.nav_crosses_folders");
  97.   // 0: "next" goes to the next folder, without prompting
  98.   // 1: "next" goes to the next folder, and prompts (the default)
  99.   // 2: "next" does nothing when there are no unread messages
  100.  
  101.   // not crossing folders, don't find next
  102.   if (nextMode == 2) return null;
  103.  
  104.   var originalFolderURI = gDBView.msgFolder.URI;
  105.   var nextFolderURI = null;
  106.   var done = false;
  107.   var startAtURI = originalFolderURI;
  108.   var i = 0;
  109.   var allServers = accountManager.allServers;
  110.   var numServers = allServers.Count();
  111.  
  112.   // XXX fix this
  113.   // this will search the originalFolderURI server twice
  114.   while (!done) 
  115.   {
  116.      nextFolderURI = FindNextFolder(startAtURI);
  117.      if (!nextFolderURI) 
  118.      {
  119.        if (i == numServers) 
  120.        {
  121.           // no more servers, we're done
  122.           done = true;
  123.        }
  124.        else 
  125.        {
  126.          // get the uri for the next server and start there
  127.          startAtURI = allServers.GetElementAt(i).QueryInterface(Components.interfaces.nsIMsgIncomingServer).serverURI;
  128.          i++;
  129.         }
  130.       }
  131.       else 
  132.       {
  133.          // got a folder with unread messages, start with it
  134.          done = true;    
  135.       }
  136.     }
  137.  
  138.     if (nextFolderURI && (originalFolderURI != nextFolderURI)) 
  139.     {
  140.       var nextFolderResource = RDF.GetResource(nextFolderURI);
  141.       var nextFolder = nextFolderResource.QueryInterface(Components.interfaces.nsIMsgFolder);
  142.       switch (nextMode) 
  143.       {
  144.         case 0:
  145.             // do this unconditionally
  146.             gNextMessageAfterLoad = type;
  147.             if (supportsFolderPane)
  148.               SelectFolder(nextFolderURI);
  149.             break;
  150.         case 1:
  151.         default:
  152.             var promptText = gMessengerBundle.getFormattedString("advanceNextPrompt", [ nextFolder.name ], 1); 
  153.             if (promptService.confirm(window, promptText, promptText)) {
  154.                 gNextMessageAfterLoad = type;
  155.                 if (supportsFolderPane)
  156.                   SelectFolder(nextFolderURI);
  157.             }
  158.             break;
  159.         }
  160.     }
  161.  
  162.     return nextFolderURI;
  163. }
  164.  
  165. // from MailNewsTypes.h
  166. const nsMsgViewIndex_None = 0xFFFFFFFF;
  167.  
  168. function ScrollToMessage(type, wrap, selectMessage)
  169. {
  170.   try {
  171.     var outlinerView = gDBView.QueryInterface(Components.interfaces.nsIOutlinerView);
  172.     var outlinerSelection = outlinerView.selection;
  173.     var currentIndex = outlinerSelection.currentIndex;
  174.  
  175.     var resultId = new Object;
  176.     var resultIndex = new Object;
  177.     var threadIndex = new Object;
  178.  
  179.     gDBView.viewNavigate(type, resultId, resultIndex, threadIndex, true /* wrap */);
  180.  
  181.     // only scroll and select if we found something
  182.     if ((resultId.value != nsMsgViewIndex_None) && (resultIndex.value != nsMsgViewIndex_None)) {
  183.         if (selectMessage) {
  184.             outlinerSelection.select(resultIndex.value);
  185.         }
  186.         EnsureRowInThreadOutlinerIsVisible(resultIndex.value);
  187.         return true;
  188.     }
  189.     else {
  190.         return false;
  191.     }
  192.   }
  193.   catch (ex) {
  194.     return false;
  195.   }
  196. }
  197.  
  198. function GoNextMessage(type, startFromBeginning)
  199. {
  200.   try {
  201.     var succeeded = ScrollToMessage(type, startFromBeginning, true);
  202.     if (!succeeded) {
  203.       CrossFolderNavigation(type, true);
  204.     }
  205.   }
  206.   catch (ex) {
  207.     dump("GoNextMessage ex = " + ex + "\n");
  208.   }
  209. }
  210.  
  211.