home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 35 Internet / 35-Internet.zip / mozil06.zip / bin / chrome / messenger.jar / content / messenger / SearchDialog.js < prev    next >
Text File  |  2001-02-14  |  8KB  |  276 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-1999 Netscape Communications Corporation. All
  18.  * Rights Reserved.
  19.  */
  20.  
  21. var rdfDatasourcePrefix = "@mozilla.org/rdf/datasource;1?name=";
  22. var rdfServiceContractID    = "@mozilla.org/rdf/rdf-service;1";
  23. var searchSessionContractID = "@mozilla.org/messenger/searchSession;1";
  24. var folderDSContractID         = rdfDatasourcePrefix + "mailnewsfolders";
  25. var gSearchDatasource;
  26.  
  27. var nsIMsgFolder = Components.interfaces.nsIMsgFolder;
  28. var nsIMsgWindow = Components.interfaces.nsIMsgWindow;
  29. var nsIMsgRDFDataSource = Components.interfaces.nsIMsgRDFDataSource;
  30. var nsMsgSearchScope = Components.interfaces.nsMsgSearchScope;
  31.  
  32. var gFolderDatasource;
  33. var gFolderPicker;
  34. var gThreadTree;
  35. var gStatusFeedback = new nsMsgStatusFeedback;
  36. var RDF;
  37.  
  38. function searchOnLoad()
  39. {
  40.     initializeSearchWidgets();
  41.     initializeSearchWindowWidgets();
  42.  
  43.     setupDatasource();
  44.  
  45.     if (window.arguments && window.arguments[0])
  46.         selectFolder(window.arguments[0].folder);
  47.     
  48.     onMore(null);
  49.     moveToAlertPosition();
  50.  
  51. }
  52.  
  53. function searchOnUnload()
  54. {
  55.     // release this early because msgWindow holds a weak reference
  56.     msgWindow.rootDocShell = null;
  57. }
  58.  
  59. function initializeSearchWindowWidgets()
  60. {
  61.     gFolderPicker = document.getElementById("searchableFolders");
  62.     gThreadTree = document.getElementById("threadTree");
  63.  
  64.     msgWindow = Components.classes[msgWindowContractID].createInstance(nsIMsgWindow);
  65.     msgWindow.statusFeedback = gStatusFeedback;
  66.     msgWindow.SetDOMWindow(window);
  67. }
  68.  
  69.  
  70. function onSearchStop() {
  71.  
  72. }
  73.  
  74. function onReset() {
  75.  
  76. }
  77.  
  78. function getFirstItemByTag(root, tag)
  79. {
  80.     var node;
  81.     if (root.localName == tag)
  82.         return root;
  83.     
  84.     if (root.childNodes) {
  85.         for (node = root.firstChild; node; node=node.nextSibling) {
  86.             if (node.localName != "template") {
  87.                 result = getFirstItemByTag(node, tag);
  88.                 if (result) return result;
  89.             }
  90.         }
  91.     }
  92.     return null;
  93. }
  94.  
  95. function selectFolder(folder) {
  96.     var items;
  97.     if (!folder) {
  98.         // walk folders to find first menuitem
  99.         var firstMenuitem = getFirstItemByTag(gFolderPicker, "menuitem");
  100.         gFolderPicker.selectedItem = firstMenuitem;
  101.             
  102.     } else {
  103.         // the URI of the folder is in the data attribute of the menuitem
  104.         folderResource =
  105.             folder.QueryInterface(Components.interfaces.nsIRDFResource);
  106.         dump("Selecting " + folderResource.Value + "\n");
  107.  
  108.         
  109.         var elements =
  110.             gFolderPicker.getElementsByAttribute("data", folderResource.Value);
  111.         if (elements && elements.length)
  112.             gFolderPicker.selectedItem = elements[0];
  113.     }
  114.     updateSearchFolderPicker()
  115. }
  116.  
  117. function updateSearchFolderPicker() {
  118.  
  119.     var selectedItem = gFolderPicker.selectedItem;
  120.     if (selectedItem.localName != "menuitem") return;
  121.     dump("id = " + selectedItem.id + "\n");
  122.     SetFolderPicker(selectedItem.id, gFolderPicker.id);
  123.  
  124.     // use the URI to get the real folder
  125.     gCurrentFolder =
  126.         RDF.GetResource(selectedItem.id).QueryInterface(nsIMsgFolder);
  127.  
  128.     
  129.     setSearchScope(GetScopeForFolder(gCurrentFolder));
  130.  
  131. }
  132.  
  133. function onChooseFolder(event) {
  134.     updateSearchFolderPicker();
  135. }
  136.  
  137. function onSearch(event)
  138. {
  139.     dump("setting up search..\n");
  140.     gSearchSession.clearScopes();
  141.     // tell the search session what the new scope is
  142.     if (!gCurrentFolder.isServer)
  143.         gSearchSession.addScopeTerm(GetScopeForFolder(gCurrentFolder),
  144.                                 gCurrentFolder);
  145.  
  146.     var searchSubfolders = document.getElementById("checkSearchSubFolders").checked;
  147.     if (gCurrentFolder && (searchSubfolders || gCurrentFolder.isServer))
  148.     {
  149.         AddSubFolders(gCurrentFolder);
  150.     }
  151.     // reflect the search widgets back into the search session
  152.     saveSearchTerms(gSearchSession.searchTerms, gSearchSession);
  153.  
  154.     gSearchSession.search(msgWindow);
  155.     // refresh the tree after the search starts, because initiating the
  156.     // search will cause the datasource to clear itself
  157.     gThreadTree.setAttribute("ref", gThreadTree.getAttribute("ref"));
  158.     dump("Kicking it off with " + gThreadTree.getAttribute("ref") + "\n");
  159. }
  160.  
  161. function AddSubFolders(folder) {
  162.     if (folder.hasSubFolders)
  163.     {
  164.         var subFolderEnumerator = folder.GetSubFolders();
  165.         var done = false;
  166.         while (!done)
  167.         {
  168.             var next = subFolderEnumerator.currentItem();
  169.             if (next)
  170.             {
  171.                 var nextFolder = next.QueryInterface(Components.interfaces.nsIMsgFolder);
  172.                 if (nextFolder)
  173.                 {
  174.                     gSearchSession.addScopeTerm(GetScopeForFolder(nextFolder), nextFolder);
  175.                     AddSubFolders(nextFolder);
  176.                 }
  177.             }
  178.             try 
  179.             {
  180.                 subFolderEnumerator.next();
  181.              } 
  182.              catch (ex) 
  183.              {
  184.                   done = true;
  185.              }
  186.         }
  187.     }
  188. }
  189.  
  190. function GetScopeForFolder(folder) {
  191.     if (folder.server.type == "nntp")
  192.         return nsMsgSearchScope.Newsgroup;
  193.     else
  194.         return nsMsgSearchScope.MailFolder;
  195. }
  196.     
  197. function setupDatasource() {
  198.  
  199.     RDF = Components.classes[rdfServiceContractID].getService(Components.interfaces.nsIRDFService);
  200.     
  201.     gSearchDatasource = Components.classes[rdfDatasourcePrefix + "msgsearch"].createInstance(Components.interfaces.nsIRDFDataSource);
  202.  
  203.     dump("The root is " + gSearchDatasource.URI + "\n");
  204.     gThreadTree.setAttribute("ref", gSearchDatasource.URI);
  205.     
  206.     // the thread pane needs to use the search datasource (to get the
  207.     // actual list of messages) and the message datasource (to get any
  208.     // attributes about each message)
  209.     gSearchSession = Components.classes[searchSessionContractID].createInstance(Components.interfaces.nsIMsgSearchSession);
  210.     
  211.     setMsgDatasourceWindow(gSearchDatasource, msgWindow);
  212.     gThreadTree.database.AddDataSource(gSearchDatasource);
  213.  
  214.     var messageDatasource = Components.classes[rdfDatasourcePrefix + "mailnewsmessages"].createInstance(Components.interfaces.nsIRDFDataSource);
  215.     setMsgDatasourceWindow(messageDatasource, msgWindow);
  216.     
  217.     gThreadTree.database.AddDataSource(messageDatasource);
  218.     
  219.     // the datasource is a listener on the search results
  220.     searchListener = gSearchDatasource.QueryInterface(Components.interfaces.nsIMsgSearchNotify);
  221.     gSearchSession.registerListener(searchListener);
  222.  
  223. }
  224.  
  225.  
  226. // this is test stuff only, ignore for now
  227. function onTesting(event)
  228. {
  229.     var testattr;
  230.     
  231.     DumpDOM(document.getElementById("searchTermTree"));
  232.     testattr = document.getElementById("searchAttr");
  233.     testelement(testattr);
  234.  
  235.     testattr = document.getElementById("searchAttr0");
  236.     testelement(testattr);
  237.     
  238.     testattr = document.getElementById("searchAttr99");
  239.     testelement(testattr);
  240.  
  241. }
  242.  
  243. function testelement(element)
  244. {
  245.     dump(element.id + " = " + element + "\n");
  246.     dump(element.id + ".searchScope = " + element.searchScope + "\n");
  247.     element.searchScope = 0;
  248.     dump(element.id + ".searchScope = " + element.searchScope + "\n");
  249.  
  250. }
  251.  
  252. // stuff after this is implemented to make the thread pane work
  253. function GetFolderDatasource()
  254. {
  255.     if (!gFolderDatasource)
  256.         gFolderDatasource = Components.classes[folderDSContractID].createInstance(Components.interfaces.nsIRDFDataSource);
  257.     return gFolderDatasource;
  258. }
  259.  
  260. // used to determine if we should try to load a message
  261. function IsThreadAndMessagePaneSplitterCollapsed()
  262. {
  263.     return true;
  264. }
  265.  
  266. function setMsgDatasourceWindow(ds, msgwindow)
  267. {
  268.     dump("setMsgDatasourceWindow(" + ds + ")\n");
  269.     try {
  270.         var msgDatasource = ds.QueryInterface(nsIMsgRDFDataSource);
  271.         msgDatasource.window = msgwindow;
  272.     } catch (ex) {
  273.         dump("error setting DS on " + ds + ": " + ex + "\n");
  274.     }
  275. }
  276.