!import
1 //@line 42 "/home/visbrero/mnt/roisin/rev_control/hg/mozilla/mail/base/content/commandglue.js"
2 /*
3 * Command-specific code. This stuff should be called by the widgets
4 */
5
6 //NOTE: gMessengerBundle and gBrandBundle must be defined and set
7 // for this Overlay to work properly
8
9 var gFolderJustSwitched = false;
10 var gVirtualFolderTerms;
11 var gXFVirtualFolderTerms;
12 var gCurrentVirtualFolderUri;
13 var gPrevFolderFlags;
14 var gPrevSelectedFolder;
15 var gMsgFolderSelected;
16
17 /* keep in sync with nsMsgFolderFlags.h */
18 var MSG_FOLDER_FLAG_MAIL = 0x0004;
19 var MSG_FOLDER_FLAG_VIRTUAL = 0x0020;
20 var MSG_FOLDER_FLAG_TRASH = 0x0100;
21 var MSG_FOLDER_FLAG_SENTMAIL = 0x0200;
22 var MSG_FOLDER_FLAG_DRAFTS = 0x0400;
23 var MSG_FOLDER_FLAG_QUEUE = 0x0800;
24 var MSG_FOLDER_FLAG_INBOX = 0x1000;
25 var MSG_FOLDER_FLAG_TEMPLATES = 0x400000;
26 var MSG_FOLDER_FLAG_JUNK = 0x40000000;
27 var MSG_FOLDER_FLAG_FAVORITE = 0x80000000;
28
GetMsgFolderFromResource
29 function GetMsgFolderFromResource(folderResource)
30 {
31 if (!folderResource)
32 return null;
33
34 var msgFolder = folderResource.QueryInterface(Components.interfaces.nsIMsgFolder);
35 if (msgFolder && (msgFolder.parent || msgFolder.isServer))
36 return msgFolder;
37 else
38 return null;
39 }
40
GetServer
Called: widgetglue.js:GetMsgFolderFromUri (1 calls, 256 v-uS)
Called By: msgAccountCentral.js:GetSelectedServer (1 calls, 293 v-uS)
41 function GetServer(uri)
42 {
43 if (!uri) return null;
44 try {
45 var folder = GetMsgFolderFromUri(uri, true);
46 return folder.server;
47 }
48 catch (ex) {
49 dump("GetServer("+uri+") failed, ex="+ex+"\n");
50 }
51 return null;
52 }
53
setTitleFromFolder
Called: ChromeWindow:getAttribute (1 calls, 20 v-uS)
Called By: commandglue.js:ChangeFolderByURI (1 calls, 476 v-uS)
54 function setTitleFromFolder(msgfolder, subject)
55 {
56 var wintype = document.documentElement.getAttribute('windowtype');
57 var title;
58
59 // If we are showing the mail:3pane. Never include the subject of the selected
60 // message in the title. ("Inbox - My Mail - Mozilla Thunderbird")
61 // If we are a stand alone message window, we should show the Subject
62 // and the product but not the account name: "Re: New window Title - Mozilla Thunderbird"
63
64 if (wintype == "mail:messageWindow")
65 title = subject ? subject : "";
66 else if (msgfolder)
67 {
68 title = msgfolder.prettyName;
69
70 if (!msgfolder.isServer)
71 {
72 var server = msgfolder.server;
73 var middle;
74 var end;
75 if (server.type == "nntp") {
76 // <folder> on <hostname>
77 middle = gMessengerBundle.getString("titleNewsPreHost");
78 end = server.hostName;
79 }
80 else {
81 var identity;
82 try {
83 var identities = accountManager.GetIdentitiesForServer(server);
84
85 identity = identities.QueryElementAt(0, Components.interfaces.nsIMsgIdentity);
86 // <folder> - <server.prettyName>
87 middle = "-";
88 end = server.prettyName;
89 } catch (ex) {}
90 }
91 if (middle) title += " " + middle;
92 if (end) title += " " + end;
93 }
94 }
95
96 //@line 139 "/home/visbrero/mnt/roisin/rev_control/hg/mozilla/mail/base/content/commandglue.js"
97 document.title = title;
98 }
99
UpdateMailToolbar
Called: ChromeWindow:getService (1 calls, 21 v-uS)
ChromeWindow:notifyObservers (1 calls, 15 v-uS)
ChromeWindow:updateCommands (1 calls, 6083 v-uS)
Called By: commandglue.js:FolderPaneSelectionChange (1 calls, 6212 v-uS)
100 function UpdateMailToolbar(caller)
101 {
102 //dump("XXX update mail-toolbar " + caller + "\n");
103 document.commandDispatcher.updateCommands('mail-toolbar');
104
105 // hook for extra toolbar items
106 var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
107 observerService.notifyObservers(window, "mail:updateToolbarItems", null);
108 }
109
ChangeFolderByURI
Called: ChromeWindow:GetResource (1 calls, 17 v-uS)
ChromeWindow:QueryInterface (1 calls, 11 v-uS)
ChromeWindow:getService (1 calls, 21 v-uS)
ChromeWindow:notifyObservers (1 calls, 14 v-uS)
commandglue.js:ClearThreadPane (1 calls, 7 v-uS)
commandglue.js:UpdateStatusQuota (1 calls, 8 v-uS)
commandglue.js:setTitleFromFolder (1 calls, 476 v-uS)
commandglue.js:viewDebug (1 calls, 7 v-uS)
mailWindow.js:ShowAccountCentral (1 calls, 2254 v-uS)
Called By: commandglue.js:FolderPaneSelectionChange (1 calls, 3007 v-uS)
110 function ChangeFolderByURI(uri, viewType, viewFlags, sortType, sortOrder)
111 {
112 viewDebug("In ChangeFolderByURI uri = " + uri + " sortType = " + sortType + "\n");
113 if (uri == gCurrentLoadingFolderURI)
114 return;
115
116 // hook for extra toolbar items
117 var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
118 observerService.notifyObservers(window, "mail:setupToolbarItems", uri);
119
120 var resource = RDF.GetResource(uri);
121 var msgfolder =
122 resource.QueryInterface(Components.interfaces.nsIMsgFolder);
123
124 try {
125 setTitleFromFolder(msgfolder, null);
126 } catch (ex) {
127 dump("error setting title: " + ex + "\n");
128 }
129
130 //if it's a server, clear the threadpane and don't bother trying to load.
131 if(msgfolder.isServer)
132 {
133 msgWindow.openFolder = null;
134 ClearThreadPane();
135 UpdateStatusQuota(null);
136 // Load AccountCentral page here.
137 ShowAccountCentral();
138 return;
139 }
140 else
141 {
142 if (msgfolder.server.displayStartupPage)
143 {
144 gDisplayStartupPage = true;
145 msgfolder.server.displayStartupPage = false;
146 }
147 }
148
149 // If the user clicks on msgfolder, time to display thread pane and message pane.
150 ShowThreadPane();
151
152 gCurrentLoadingFolderURI = uri;
153 gNextMessageAfterDelete = null; // forget what message to select, if any
154
155 gCurrentFolderToReroot = uri;
156 gCurrentLoadingFolderViewFlags = viewFlags;
157 gCurrentLoadingFolderViewType = viewType;
158 gCurrentLoadingFolderSortType = sortType;
159 gCurrentLoadingFolderSortOrder = sortOrder;
160
161 var showMessagesAfterLoading;
162 try {
163 var server = msgfolder.server;
164 if (gPrefBranch.getBoolPref("mail.password_protect_local_cache"))
165 {
166 showMessagesAfterLoading = server.passwordPromptRequired;
167 // servers w/o passwords (like local mail) will always be non-authenticated.
168 // So we need to use the account manager for that case.
169 }
170 else
171 showMessagesAfterLoading = false;
172 }
173 catch (ex) {
174 showMessagesAfterLoading = false;
175 }
176
177 if (viewType != nsMsgViewType.eShowVirtualFolderResults && (msgfolder.manyHeadersToDownload || showMessagesAfterLoading))
178 {
179 gRerootOnFolderLoad = true;
180 try
181 {
182 ClearThreadPane();
183 SetBusyCursor(window, true);
184 msgfolder.startFolderLoading();
185 msgfolder.updateFolder(msgWindow);
186 }
187 catch(ex)
188 {
189 SetBusyCursor(window, false);
190 dump("Error loading with many headers to download: " + ex + "\n");
191 }
192 }
193 else
194 {
195 if (viewType != nsMsgViewType.eShowVirtualFolderResults)
196 SetBusyCursor(window, true);
197 RerootFolder(uri, msgfolder, viewType, viewFlags, sortType, sortOrder);
198 gRerootOnFolderLoad = false;
199 msgfolder.startFolderLoading();
200
201 //Need to do this after rerooting folder. Otherwise possibility of receiving folder loaded
202 //notification before folder has actually changed.
203 if (viewType != nsMsgViewType.eShowVirtualFolderResults)
204 msgfolder.updateFolder(msgWindow);
205 }
206 }
207
isNewsURI
208 function isNewsURI(uri)
209 {
210 if (!uri || uri[0] != 'n') {
211 return false;
212 }
213 else {
214 return ((uri.substring(0,6) == "news:/") || (uri.substring(0,14) == "news-message:/"));
215 }
216 }
217
RerootFolder
218 function RerootFolder(uri, newFolder, viewType, viewFlags, sortType, sortOrder)
219 {
220 viewDebug("In reroot folder, sortType = " + sortType + "viewType = " + viewType + "\n");
221
222 if (sortType == 0)
223 {
224 try
225 {
226 var msgdb = newFolder.getMsgDatabase(msgWindow);
227 var dbFolderInfo = msgdb.dBFolderInfo;
228 sortType = dbFolderInfo.sortType;
229 sortOrder = dbFolderInfo.sortOrder;
230 viewFlags = dbFolderInfo.viewFlags;
231 viewType = dbFolderInfo.viewType;
232 dbFolderInfo = null;
233 }
234 catch(ex)
235 {
236 dump("invalid db in RerootFolder: " + ex + "\n");
237 }
238 }
239
240 // workaround for #39655
241 gFolderJustSwitched = true;
242
243 ClearThreadPaneSelection();
244
245 //Clear the new messages of the old folder
246 var oldFolder = gPrevSelectedFolder;
247 if (oldFolder) {
248 oldFolder.clearNewMessages();
249 oldFolder.hasNewMessages = false;
250 }
251
252 //Set the window's new open folder.
253 msgWindow.openFolder = newFolder;
254
255 //the new folder being selected should have its biff state get cleared.
256 if(newFolder)
257 {
258 newFolder.biffState =
259 Components.interfaces.nsIMsgFolder.nsMsgBiffState_NoMail;
260 }
261
262 //Clear out the thread pane so that we can sort it with the new sort id without taking any time.
263 // folder.setAttribute('ref', "");
264
265 // null this out, so we don't try sort.
266 if (gDBView) {
267 gDBView.close();
268 gDBView = null;
269 }
270
271 // cancel the pending mark as read timer
272 ClearPendingReadTimer();
273
274 // if this is the drafts, sent, or send later folder,
275 // we show "Recipient" instead of "Author"
276 SetSentFolderColumns(IsSpecialFolder(newFolder, MSG_FOLDER_FLAG_SENTMAIL | MSG_FOLDER_FLAG_DRAFTS | MSG_FOLDER_FLAG_QUEUE, true));
277 ShowLocationColumn(viewType == nsMsgViewType.eShowVirtualFolderResults);
278 // Only show 'Received' column for e-mails. For newsgroup messages, the 'Date' header is as reliable as an e-mail's
279 // 'Received' header, as it is replaced with the news server's (more reliable) date.
280 UpdateReceivedColumn(newFolder);
281 // now create the db view, which will sort it.
282 CreateDBView(newFolder, viewType, viewFlags, sortType, sortOrder);
283
284 if (oldFolder)
285 {
286 /* we don't null out the db reference for inbox because inbox is like the "main" folder
287 and performance outweighs footprint*/
288 if (!IsSpecialFolder(oldFolder, MSG_FOLDER_FLAG_INBOX, false))
289 {
290 if (oldFolder.URI != newFolder.URI)
291 oldFolder.setMsgDatabase(null);
292 }
293 }
294 // that should have initialized gDBView, now re-root the thread pane
295 RerootThreadPane();
296 SetUpToolbarButtons(uri);
297 UpdateFolderLocationPicker(gMsgFolderSelected);
298 UpdateStatusMessageCounts(gMsgFolderSelected);
299
300 // hook for extra toolbar items
301 var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
302 observerService.notifyObservers(window, "mail:updateToolbarItems", null);
303 // this is to kick off cross-folder searches for virtual folders.
304 if (gSearchSession && !gVirtualFolderTerms) // another var might be better...
305 {
306 viewDebug("doing a xf folder search in rerootFolder\n");
307 gCurrentLoadingFolderURI = ""
308 ViewChangeByFolder(newFolder);
309 gPreQuickSearchView = null; // don't remember the cross folder search
310 ScrollToMessageAfterFolderLoad(newFolder);
311 }
312 }
313
SwitchView
314 function SwitchView(command)
315 {
316 // when switching thread views, we might be coming out of quick search
317 // or a message view.
318 // first set view picker to all
319 ViewChangeByValue(kViewItemAll);
320
321 // clear the QS text, if we need to
322 ClearQSIfNecessary();
323
324 // now switch views
325 var oldSortType = gDBView ? gDBView.sortType : nsMsgViewSortType.byThread;
326 var oldSortOrder = gDBView ? gDBView.sortOrder : nsMsgViewSortOrder.ascending;
327 var viewFlags = gDBView ? gDBView.viewFlags : gCurViewFlags;
328
329 // close existing view.
330 if (gDBView) {
331 gDBView.close();
332 gDBView = null;
333 }
334
335 switch(command)
336 {
337 // "All" threads and "Unread" threads don't change threading state
338 case "cmd_viewAllMsgs":
339 viewFlags = viewFlags & ~nsMsgViewFlagsType.kUnreadOnly;
340 CreateDBView(msgWindow.openFolder, nsMsgViewType.eShowAllThreads, viewFlags,
341 oldSortType, oldSortOrder);
342 break;
343 case "cmd_viewUnreadMsgs":
344 viewFlags = viewFlags | nsMsgViewFlagsType.kUnreadOnly;
345 CreateDBView(msgWindow.openFolder, nsMsgViewType.eShowAllThreads, viewFlags,
346 oldSortType, oldSortOrder );
347 break;
348 // "Threads with Unread" and "Watched Threads with Unread" force threading
349 case "cmd_viewThreadsWithUnread":
350 CreateDBView(msgWindow.openFolder, nsMsgViewType.eShowThreadsWithUnread, nsMsgViewFlagsType.kThreadedDisplay,
351 oldSortType, oldSortOrder);
352 break;
353 case "cmd_viewWatchedThreadsWithUnread":
354 CreateDBView(msgWindow.openFolder, nsMsgViewType.eShowWatchedThreadsWithUnread, nsMsgViewFlagsType.kThreadedDisplay,
355 oldSortType, oldSortOrder);
356 break;
357 // "Ignored Threads" toggles 'ignored' inclusion --
358 // but it also resets 'With Unread' views to 'All'
359 case "cmd_viewIgnoredThreads":
360 if (viewFlags & nsMsgViewFlagsType.kShowIgnored)
361 viewFlags = viewFlags & ~nsMsgViewFlagsType.kShowIgnored;
362 else
363 viewFlags = viewFlags | nsMsgViewFlagsType.kShowIgnored;
364 CreateDBView(msgWindow.openFolder, nsMsgViewType.eShowAllThreads, viewFlags,
365 oldSortType, oldSortOrder);
366 break;
367 }
368
369 RerootThreadPane();
370 }
371
SetSentFolderColumns
372 function SetSentFolderColumns(isSentFolder)
373 {
374 var tree = GetThreadTree();
375
376 var lastFolderSent = tree.getAttribute("lastfoldersent") == "true";
377 if (isSentFolder != lastFolderSent)
378 {
379 var senderColumn = document.getElementById("senderCol");
380 var recipientColumn = document.getElementById("recipientCol");
381
382 var saveHidden = senderColumn.getAttribute("hidden");
383 senderColumn.setAttribute("hidden", senderColumn.getAttribute("swappedhidden"));
384 senderColumn.setAttribute("swappedhidden", saveHidden);
385
386 saveHidden = recipientColumn.getAttribute("hidden");
387 recipientColumn.setAttribute("hidden", recipientColumn.getAttribute("swappedhidden"));
388 recipientColumn.setAttribute("swappedhidden", saveHidden);
389 }
390
391 if(isSentFolder)
392 tree.setAttribute("lastfoldersent", "true");
393 else
394 tree.setAttribute("lastfoldersent", "false");
395 }
396
ShowLocationColumn
397 function ShowLocationColumn(show)
398 {
399 var col = document.getElementById("locationCol");
400 if (col) {
401 if (show) {
402 col.removeAttribute("hidden");
403 col.removeAttribute("ignoreincolumnpicker");
404 }
405 else {
406 col.setAttribute("hidden","true");
407 col.setAttribute("ignoreincolumnpicker","true");
408 }
409 }
410 }
411
UpdateReceivedColumn
412 function UpdateReceivedColumn(newFolder)
413 {
414 // Only show 'Received' column for e-mails. For newsgroup messages, the 'Date' header is as reliable as an e-mail's
415 // 'Received' header, as it is replaced with the news server's (more reliable) date.
416 var receivedColumn = document.getElementById("receivedCol");
417
418 var newFolderShowsRcvd = (newFolder.flags & MSG_FOLDER_FLAG_MAIL) &&
419 !(newFolder.flags & (MSG_FOLDER_FLAG_QUEUE | MSG_FOLDER_FLAG_DRAFTS |
420 MSG_FOLDER_FLAG_TEMPLATES | MSG_FOLDER_FLAG_SENTMAIL));
421
422 var tempHidden = receivedColumn.getAttribute("temphidden") == "true";
423 var isHidden = receivedColumn.getAttribute("hidden") == "true";
424
425 if (!newFolderShowsRcvd && !isHidden)
426 {
427 // Record state & hide
428 receivedColumn.setAttribute("temphidden", "true");
429 receivedColumn.setAttribute("hidden", "true");
430 }
431 else if (newFolderShowsRcvd && tempHidden && isHidden)
432 {
433 receivedColumn.setAttribute("hidden", "false");
434 }
435
436 if (newFolderShowsRcvd)
437 {
438 receivedColumn.removeAttribute("ignoreincolumnpicker");
439 receivedColumn.removeAttribute("temphidden");
440 }
441 else
442 receivedColumn.setAttribute("ignoreincolumnpicker", "true");
443 }
444
SetNewsFolderColumns
445 function SetNewsFolderColumns()
446 {
447 var sizeColumn = document.getElementById("sizeCol");
448
449 if (gDBView.usingLines) {
450 sizeColumn.setAttribute("label",gMessengerBundle.getString("linesColumnHeader"));
451 }
452 else {
453 sizeColumn.setAttribute("label", gMessengerBundle.getString("sizeColumnHeader"));
454 }
455 }
456
UpdateStatusMessageCounts
457 function UpdateStatusMessageCounts(folder)
458 {
459 var unreadElement = GetUnreadCountElement();
460 var totalElement = GetTotalCountElement();
461 if(folder && unreadElement && totalElement)
462 {
463 var numSelected = GetNumSelectedMessages();
464
465 var numUnread = (numSelected > 1) ?
466 gMessengerBundle.getFormattedString("selectedMsgStatus",
467 [numSelected]) :
468 gMessengerBundle.getFormattedString("unreadMsgStatus",
469 [ folder.getNumUnread(false)]);
470 var numTotal =
471 gMessengerBundle.getFormattedString("totalMsgStatus",
472 [folder.getTotalMessages(false)]);
473
474 unreadElement.setAttribute("label", numUnread);
475 totalElement.setAttribute("label", numTotal);
476 unreadElement.hidden = false;
477 totalElement.hidden = false;
478
479 }
480
481 }
482
483 var gQuotaUICache;
UpdateStatusQuota
Called By: commandglue.js:ChangeFolderByURI (1 calls, 8 v-uS)
484 function UpdateStatusQuota(folder)
485 {
486 if (!(folder && // no folder selected
487 folder instanceof Components.interfaces.nsIMsgImapMailFolder)) // POP etc.
488 {
489 if (typeof(gQuotaUICache) == "object") // ever shown quota
490 gQuotaUICache.panel.hidden = true;
491 return;
492 }
493 folder = folder.QueryInterface(Components.interfaces.nsIMsgImapMailFolder);
494
495 // get element references and prefs
496 if (typeof(gQuotaUICache) != "object")
497 {
498 gQuotaUICache = new Object();
499 gQuotaUICache.meter = document.getElementById("quotaMeter");
500 gQuotaUICache.panel = document.getElementById("quotaPanel");
501 gQuotaUICache.label = document.getElementById("quotaLabel");
502 const kBranch = "mail.quota.mainwindow_threshold.";
503 gQuotaUICache.showTreshold = gPrefBranch.getIntPref(kBranch + "show");
504 gQuotaUICache.warningTreshold = gPrefBranch.getIntPref(kBranch + "warning");
505 gQuotaUICache.criticalTreshold = gPrefBranch.getIntPref(kBranch + "critical");
506 }
507
508 var valid = {value: null};
509 var used = {value: null};
510 var max = {value: null};
511 try {
512 // get data from backend
513 folder.getQuota(valid, used, max);
514 } catch (e) { dump(e + "\n"); }
515 if (valid.value && max.value > 0)
516 {
517 var percent = Math.round(used.value / max.value * 100);
518
519 // show in UI
520 if (percent < gQuotaUICache.showTreshold)
521 gQuotaUICache.panel.hidden = true;
522 else
523 {
524 gQuotaUICache.panel.hidden = false;
525 gQuotaUICache.meter.setAttribute("value", percent);
526 // do not use value property, because that is imprecise (3%)
527 // for optimization that we don't need here
528 var label = gMessengerBundle.getFormattedString("percent", [percent]);
529 var tooltip = gMessengerBundle.getFormattedString("quotaTooltip",
530 [used.value, max.value]);
531 gQuotaUICache.label.value = label;
532 gQuotaUICache.label.tooltipText = tooltip;
533 if (percent < gQuotaUICache.warningTreshold)
534 gQuotaUICache.panel.removeAttribute("alert");
535 else if (percent < gQuotaUICache.criticalTreshold)
536 gQuotaUICache.panel.setAttribute("alert", "warning");
537 else
538 gQuotaUICache.panel.setAttribute("alert", "critical");
539 }
540 }
541 else
542 gQuotaUICache.panel.hidden = true;
543 }
544
ConvertColumnIDToSortType
545 function ConvertColumnIDToSortType(columnID)
546 {
547 var sortKey;
548
549 switch (columnID) {
550 case "dateCol":
551 sortKey = nsMsgViewSortType.byDate;
552 break;
553 case "receivedCol":
554 sortKey = nsMsgViewSortType.byReceived;
555 break;
556 case "senderCol":
557 sortKey = nsMsgViewSortType.byAuthor;
558 break;
559 case "recipientCol":
560 sortKey = nsMsgViewSortType.byRecipient;
561 break;
562 case "subjectCol":
563 sortKey = nsMsgViewSortType.bySubject;
564 break;
565 case "locationCol":
566 sortKey = nsMsgViewSortType.byLocation;
567 break;
568 case "accountCol":
569 sortKey = nsMsgViewSortType.byAccount;
570 break;
571 case "unreadButtonColHeader":
572 sortKey = nsMsgViewSortType.byUnread;
573 break;
574 case "statusCol":
575 sortKey = nsMsgViewSortType.byStatus;
576 break;
577 case "sizeCol":
578 sortKey = nsMsgViewSortType.bySize;
579 break;
580 case "priorityCol":
581 sortKey = nsMsgViewSortType.byPriority;
582 break;
583 case "flaggedCol":
584 sortKey = nsMsgViewSortType.byFlagged;
585 break;
586 case "threadCol":
587 sortKey = nsMsgViewSortType.byThread;
588 break;
589 case "tagsCol":
590 sortKey = nsMsgViewSortType.byTags;
591 break;
592 case "junkStatusCol":
593 sortKey = nsMsgViewSortType.byJunkStatus;
594 break;
595 case "idCol":
596 sortKey = nsMsgViewSortType.byId;
597 break;
598 case "attachmentCol":
599 sortKey = nsMsgViewSortType.byAttachments;
600 break;
601 default:
602
603 //no predefined column handler - lets check if there is a custom column handler
604 try {
605 //try to grab the columnHandler (an error is thrown if it does not exist)
606 columnHandler = gDBView.getColumnHandler(columnID);
607
608 //it exists - save this column ID in the customSortCol property of dbFolderInfo
609 //for later use (see nsIMsgDBView.cpp)
610 gDBView.db.dBFolderInfo.setProperty('customSortCol', columnID);
611
612 sortKey = nsMsgViewSortType.byCustom;
613 }
614 catch(err)
615 {
616 dump("unsupported sort column: " + columnID + " - no custom handler installed. (Error was: " + err + ")\n");
617 sortKey = 0;
618 }
619 break;
620 }
621 return sortKey;
622 }
623
ConvertSortTypeToColumnID
624 function ConvertSortTypeToColumnID(sortKey)
625 {
626 var columnID;
627
628 // Hack to turn this into an integer, if it was a string.
629 // It would be a string if it came from localStore.rdf
630 sortKey = sortKey - 0;
631
632 switch (sortKey) {
633 case nsMsgViewSortType.byDate:
634 columnID = "dateCol";
635 break;
636 case nsMsgViewSortType.byReceived:
637 columnID = "receivedCol";
638 break;
639 case nsMsgViewSortType.byAuthor:
640 columnID = "senderCol";
641 break;
642 case nsMsgViewSortType.byRecipient:
643 columnID = "recipientCol";
644 break;
645 case nsMsgViewSortType.bySubject:
646 columnID = "subjectCol";
647 break;
648 case nsMsgViewSortType.byLocation:
649 columnID = "locationCol";
650 break;
651 case nsMsgViewSortType.byAccount:
652 columnID = "accountCol";
653 break;
654 case nsMsgViewSortType.byUnread:
655 columnID = "unreadButtonColHeader";
656 break;
657 case nsMsgViewSortType.byStatus:
658 columnID = "statusCol";
659 break;
660 case nsMsgViewSortType.byTags:
661 columnID = "tagsCol";
662 break;
663 case nsMsgViewSortType.bySize:
664 columnID = "sizeCol";
665 break;
666 case nsMsgViewSortType.byPriority:
667 columnID = "priorityCol";
668 break;
669 case nsMsgViewSortType.byFlagged:
670 columnID = "flaggedCol";
671 break;
672 case nsMsgViewSortType.byThread:
673 columnID = "threadCol";
674 break;
675 case nsMsgViewSortType.byId:
676 columnID = "idCol";
677 break;
678 case nsMsgViewSortType.byJunkStatus:
679 columnID = "junkStatusCol";
680 break;
681 case nsMsgViewSortType.byAttachments:
682 columnID = "attachmentCol";
683 break;
684 case nsMsgViewSortType.byCustom:
685
686 //TODO: either change try() catch to if (property exists) or restore the getColumnHandler() check
687 try //getColumnHandler throws an errror when the ID is not handled
688 {
689 columnID = gDBView.db.dBFolderInfo.getProperty('customSortCol');
690 }
691
692 catch (err) { //error - means no handler
693 dump("ConvertSortTypeToColumnID: custom sort key but no handler for column '" + columnID + "'\n");
694 columnID = "dateCol";
695 }
696
697 break;
698 default:
699 dump("unsupported sort key: " + sortKey + "\n");
700 columnID = "dateCol";
701 break;
702 }
703 return columnID;
704 }
705
706 var nsMsgViewSortType = Components.interfaces.nsMsgViewSortType;
707 var nsMsgViewSortOrder = Components.interfaces.nsMsgViewSortOrder;
708 var nsMsgViewFlagsType = Components.interfaces.nsMsgViewFlagsType;
709 var nsMsgViewCommandType = Components.interfaces.nsMsgViewCommandType;
710 var nsMsgViewType = Components.interfaces.nsMsgViewType;
711 var nsMsgNavigationType = Components.interfaces.nsMsgNavigationType;
712
713 var gDBView = null;
714 var gCurViewFlags;
715 var gCurSortType;
716
717 // CreateDBView is called when we have a thread pane. CreateBareDBView is called when there is no
718 // tree associated with the view. CreateDBView will call into CreateBareDBView...
719
CreateBareDBView
720 function CreateBareDBView(originalView, msgFolder, viewType, viewFlags, sortType, sortOrder)
721 {
722 var dbviewContractId = "@mozilla.org/messenger/msgdbview;1?type=";
723 // hack to turn this into an integer, if it was a string
724 // it would be a string if it came from localStore.rdf
725 viewType = viewType - 0;
726
727 switch (viewType) {
728 case nsMsgViewType.eShowQuickSearchResults:
729 dbviewContractId += "quicksearch";
730 break;
731 case nsMsgViewType.eShowThreadsWithUnread:
732 dbviewContractId += "threadswithunread";
733 break;
734 case nsMsgViewType.eShowWatchedThreadsWithUnread:
735 dbviewContractId += "watchedthreadswithunread";
736 break;
737 case nsMsgViewType.eShowVirtualFolderResults:
738 dbviewContractId += "xfvf";
739 break;
740 case nsMsgViewType.eShowSearch:
741 dbviewContractId += "search";
742 break;
743 case nsMsgViewType.eShowAllThreads:
744 default:
745 if (sortType == nsMsgViewSortType.byThread || sortType == nsMsgViewSortType.byId
746 || sortType == nsMsgViewSortType.byNone)
747 viewFlags &= ~nsMsgViewFlagsType.kGroupBySort;
748
749 if (viewFlags & nsMsgViewFlagsType.kGroupBySort)
750 dbviewContractId += "group";
751 else
752 dbviewContractId += "threaded";
753 break;
754 }
755
756 // dump ("contract id = " + dbviewContractId + "original view = " + originalView + "\n");
757 if (!originalView)
758 gDBView = Components.classes[dbviewContractId].createInstance(Components.interfaces.nsIMsgDBView);
759
760 gCurViewFlags = viewFlags;
761 var count = new Object;
762 if (!gThreadPaneCommandUpdater)
763 gThreadPaneCommandUpdater = new nsMsgDBViewCommandUpdater();
764
765 gCurSortType = sortType;
766
767 if (!originalView) {
768 gDBView.init(messenger, msgWindow, gThreadPaneCommandUpdater);
769 gDBView.open(msgFolder, gCurSortType, sortOrder, viewFlags, count);
770 if (viewType == nsMsgViewType.eShowVirtualFolderResults)
771 {
772 // the view is a listener on the search results
773 gViewSearchListener = gDBView.QueryInterface(Components.interfaces.nsIMsgSearchNotify);
774 gSearchSession.registerListener(gViewSearchListener);
775 }
776 }
777 else {
778 gDBView = originalView.cloneDBView(messenger, msgWindow, gThreadPaneCommandUpdater);
779 }
780 }
781
CreateDBView
782 function CreateDBView(msgFolder, viewType, viewFlags, sortType, sortOrder)
783 {
784 // call the inner create method
785 CreateBareDBView(null, msgFolder, viewType, viewFlags, sortType, sortOrder);
786
787 // now do tree specific work
788
789 // based on the collapsed state of the thread pane/message pane splitter,
790 // suppress message display if appropriate.
791 gDBView.suppressMsgDisplay = IsMessagePaneCollapsed();
792
793 UpdateSortIndicators(gCurSortType, sortOrder);
794 var ObserverService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
795 ObserverService.notifyObservers(msgFolder, "MsgCreateDBView", viewType + ":" + viewFlags);
796 }
797
798 //------------------------------------------------------------
799 // Sets the column header sort icon based on the requested
800 // column and direction.
801 //
802 // Notes:
803 // (1) This function relies on the first part of the
804 // <treecell id> matching the <treecol id>. The treecell
805 // id must have a "Header" suffix.
806 // (2) By changing the "sortDirection" attribute, a different
807 // CSS style will be used, thus changing the icon based on
808 // the "sortDirection" parameter.
809 //------------------------------------------------------------
UpdateSortIndicator
810 function UpdateSortIndicator(column,sortDirection)
811 {
812 // this is obsolete
813 }
814
GetSelectedFolderResource
815 function GetSelectedFolderResource()
816 {
817 var folderTree = GetFolderTree();
818 var startIndex = {};
819 var endIndex = {};
820 folderTree.view.selection.getRangeAt(0, startIndex, endIndex);
821 return GetFolderResource(folderTree, startIndex.value);
822 }
823
ChangeMessagePaneVisibility
824 function ChangeMessagePaneVisibility(now_hidden)
825 {
826 // we also have to hide the File/Attachments menuitem
827 var node = document.getElementById("fileAttachmentMenu");
828 if (node)
829 node.hidden = now_hidden;
830
831 if (gDBView) {
832 // the collapsed state is the state after we released the mouse
833 // so we take it as it is
834 gDBView.suppressMsgDisplay = now_hidden;
835 }
836 var event = document.createEvent('Events');
837 if (now_hidden) {
838 event.initEvent('messagepane-hide', false, true);
839 }
840 else {
841 event.initEvent('messagepane-unhide', false, true);
842 }
843 document.getElementById("messengerWindow").dispatchEvent(event);
844 }
845
OnMouseUpThreadAndMessagePaneSplitter
846 function OnMouseUpThreadAndMessagePaneSplitter()
847 {
848 // the collapsed state is the state after we released the mouse
849 // so we take it as it is
850 ChangeMessagePaneVisibility(IsMessagePaneCollapsed());
851 }
852
FolderPaneSelectionChange
Called: ChromeWindow:QueryInterface (1 calls, 17 v-uS)
ChromeWindow:getElementById (1 calls, 27 v-uS)
ChromeWindow:getRangeAt (1 calls, 50 v-uS)
ChromeWindow:isSelected (1 calls, 9 v-uS)
XULElement:QueryInterface (1 calls, 11 v-uS)
commandglue.js:ChangeFolderByURI (1 calls, 3007 v-uS)
commandglue.js:OnLeavingFolder (1 calls, 7 v-uS)
commandglue.js:UpdateMailToolbar (1 calls, 6212 v-uS)
msgMail3PaneWindow.js:ClearMessagePane (1 calls, 7 v-uS)
msgMail3PaneWindow.js:GetFolderResource (1 calls, 93 v-uS)
msgMail3PaneWindow.js:GetFolderTree (1 calls, 8 v-uS)
msgMail3PaneWindow.js:UpdateFolderLocationPicker (1 calls, 35 v-uS)
tabmail.xml:setTabTitle (1 calls, 350 v-uS)
Called By: ChromeWindow:select (1 calls, 10230 v-uS)
853 function FolderPaneSelectionChange()
854 {
855 var folderTree = GetFolderTree();
856 var folderSelection = folderTree.view.selection;
857
858 // This prevents a folder from being loaded in the case that the user
859 // has right-clicked on a folder different from the one that was
860 // originally highlighted. On a right-click, the highlight (selection)
861 // of a row will be different from the value of currentIndex, thus if
862 // the currentIndex is not selected, it means the user right-clicked
863 // and we don't want to load the contents of the folder.
864 if (!folderSelection.isSelected(folderSelection.currentIndex))
865 return;
866
867 gVirtualFolderTerms = null;
868 gXFVirtualFolderTerms = null;
869
870 if (folderSelection.count == 1)
871 {
872 var startIndex = {};
873 var endIndex = {};
874
875
876 folderSelection.getRangeAt(0, startIndex, endIndex);
877 var folderResource = GetFolderResource(folderTree, startIndex.value);
878 var uriToLoad = folderResource.Value;
879 var msgFolder = folderResource.QueryInterface(Components.interfaces.nsIMsgFolder);
880 if (msgFolder == gMsgFolderSelected)
881 return;
882
883 gPrevSelectedFolder = gMsgFolderSelected;
884 gMsgFolderSelected = msgFolder;
885 UpdateFolderLocationPicker(gMsgFolderSelected);
886 var folderFlags = msgFolder.flags;
887 // if this is same folder, and we're not showing a virtual folder
888 // then do nothing.
889 if (msgFolder == msgWindow.openFolder &&
890 !(folderFlags & MSG_FOLDER_FLAG_VIRTUAL) && ! (gPrevFolderFlags & MSG_FOLDER_FLAG_VIRTUAL))
891 {
892 dump("msgFolder already open" + folderResource.URI + "\n");
893 return;
894 }
895 else
896 {
897 OnLeavingFolder(gPrevSelectedFolder); // mark all read in last folder
898 var sortType = 0;
899 var sortOrder = 0;
900 var viewFlags = 0;
901 var viewType = 0;
902 gDefaultSearchViewTerms = null;
903 gVirtualFolderTerms = null;
904 gXFVirtualFolderTerms = null;
905 gPrevFolderFlags = folderFlags;
906 gCurrentVirtualFolderUri = null;
907 // don't get the db if this folder is a server
908 // we're going to be display account central
909 if (!(msgFolder.isServer))
910 {
911 try
912 {
913 var msgDatabase = msgFolder.getMsgDatabase(msgWindow);
914 if (msgDatabase)
915 {
916 var dbFolderInfo = msgDatabase.dBFolderInfo;
917 sortType = dbFolderInfo.sortType;
918 sortOrder = dbFolderInfo.sortOrder;
919 viewFlags = dbFolderInfo.viewFlags;
920 if (folderFlags & MSG_FOLDER_FLAG_VIRTUAL)
921 {
922 viewType = nsMsgViewType.eShowQuickSearchResults;
923 var searchTermString = dbFolderInfo.getCharProperty("searchStr");
924 var searchOnline = dbFolderInfo.getBooleanProperty("searchOnline", false);
925 // trick the view code into updating the real folder...
926 gCurrentVirtualFolderUri = uriToLoad;
927 viewDebug("uriToLoad = " + uriToLoad + "\n");
928 var srchFolderUri = dbFolderInfo.getCharProperty("searchFolderUri");
929 var srchFolderUriArray = srchFolderUri.split('|');
930 // cross folder search
931 var filterService = Components.classes["@mozilla.org/messenger/services/filters;1"].getService(Components.interfaces.nsIMsgFilterService);
932 var filterList = filterService.getTempFilterList(msgFolder);
933 var tempFilter = filterList.createFilter("temp");
934 filterList.parseCondition(tempFilter, searchTermString);
935 if (srchFolderUriArray.length > 1)
936 {
937 viewType = nsMsgViewType.eShowVirtualFolderResults;
938 gXFVirtualFolderTerms = CreateGroupedSearchTerms(tempFilter.searchTerms);
939 setupXFVirtualFolderSearch(srchFolderUriArray, gXFVirtualFolderTerms, searchOnline);
940 // need to set things up so that reroot folder issues the search
941 }
942 else
943 {
944 gSearchSession = null;
945 uriToLoad = srchFolderUri;
946 // we need to load the db for the actual folder so that many hdrs to download
947 // will return false...
948 var realFolderRes = GetResourceFromUri(uriToLoad);
949 var realFolder = realFolderRes.QueryInterface(Components.interfaces.nsIMsgFolder);
950 msgDatabase = realFolder.getMsgDatabase(msgWindow);
951 gVirtualFolderTerms = CreateGroupedSearchTerms(tempFilter.searchTerms);
952 }
953 }
954 else
955 {
956 gSearchSession = null;
957 viewFlags = dbFolderInfo.viewFlags;
958 viewType = dbFolderInfo.viewType;
959 }
960 msgDatabase = null;
961 dbFolderInfo = null;
962 }
963 }
964 catch (ex)
965 {
966 dump("failed to get view & sort values. ex = " + ex +"\n");
967 }
968 }
969 if (gDBView && gDBView.viewType == nsMsgViewType.eShowQuickSearchResults)
970 {
971 if (gPreQuickSearchView) //close cached view before quick search
972 {
973 gPreQuickSearchView.close();
974 gPreQuickSearchView = null;
975 }
976 ClearQSIfNecessary();
977 }
978 ClearMessagePane();
979
980 if (gXFVirtualFolderTerms)
981 viewType = nsMsgViewType.eShowVirtualFolderResults;
982 else if (gSearchEmailAddress || gVirtualFolderTerms)
983 viewType = nsMsgViewType.eShowQuickSearchResults;
984 else if (viewType == nsMsgViewType.eShowQuickSearchResults)
985 viewType = nsMsgViewType.eShowAllThreads; //override viewType - we don't want to start w/ quick search
986 ChangeFolderByURI(uriToLoad, viewType, viewFlags, sortType, sortOrder);
987 if (gVirtualFolderTerms)
988 gDBView.viewFolder = msgFolder;
989 }
990 document.getElementById('tabmail').setTabTitle(null);
991 }
992 else
993 {
994 msgWindow.openFolder = null;
995 ClearThreadPane();
996 }
997
998 if (gAccountCentralLoaded)
999 UpdateMailToolbar("gAccountCentralLoaded");
1000
1001 if (gDisplayStartupPage)
1002 {
1003 loadStartPage();
1004 gDisplayStartupPage = false;
1005 UpdateMailToolbar("gDisplayStartupPage");
1006 }
1007 }
1008
ClearThreadPane
Called By: commandglue.js:ChangeFolderByURI (1 calls, 7 v-uS)
1009 function ClearThreadPane()
1010 {
1011 if (gDBView) {
1012 gDBView.close();
1013 gDBView = null;
1014 }
1015 }
1016
IsSpecialFolder
1017 function IsSpecialFolder(msgFolder, flags, checkAncestors)
1018 {
1019 if (!msgFolder)
1020 return false;
1021 else if ((msgFolder.flags & flags) == 0)
1022 {
1023 var parentMsgFolder = msgFolder.parentMsgFolder;
1024
1025 return (parentMsgFolder && checkAncestors) ? IsSpecialFolder(parentMsgFolder, flags, true) : false;
1026 }
1027 else {
1028 // the user can set their INBOX to be their SENT folder.
1029 // in that case, we want this folder to act like an INBOX,
1030 // and not a SENT folder
1031 return !((flags & MSG_FOLDER_FLAG_SENTMAIL) && (msgFolder.flags & MSG_FOLDER_FLAG_INBOX));
1032 }
1033 }
1034
SelectNextMessage
1035 function SelectNextMessage(nextMessage)
1036 {
1037 dump("XXX implement SelectNextMessage()\n");
1038 }
1039
GetSelectTrashUri
1040 function GetSelectTrashUri(folder)
1041 {
1042 if (!folder) return null;
1043 var uri = folder.getAttribute('id');
1044 var resource = RDF.GetResource(uri);
1045 var msgFolder =
1046 resource.QueryInterface(Components.interfaces.nsIMsgFolder);
1047 if (msgFolder)
1048 {
1049 var rootFolder = msgFolder.rootFolder;
1050 var numFolder;
1051 var out = new Object();
1052 var trashFolder = rootFolder.getFoldersWithFlag(MSG_FOLDER_FLAG_TRASH, 1, out);
1053 numFolder = out.value;
1054 if (trashFolder) {
1055 return trashFolder.URI;
1056 }
1057 }
1058 return null;
1059 }
1060
Undo
1061 function Undo()
1062 {
1063 messenger.undo(msgWindow);
1064 }
1065
Redo
1066 function Redo()
1067 {
1068 messenger.redo(msgWindow);
1069 }
1070
getSearchTermString
1071 function getSearchTermString(searchTerms)
1072 {
1073 var searchIndex;
1074 var condition = "";
1075 var count = searchTerms.Count();
1076 for (searchIndex = 0; searchIndex < count; )
1077 {
1078 var term = searchTerms.QueryElementAt(searchIndex++, Components.interfaces.nsIMsgSearchTerm);
1079
1080 if (condition.length > 1)
1081 condition += ' ';
1082
1083 if (term.matchAll)
1084 {
1085 condition = "ALL";
1086 break;
1087 }
1088 condition += (term.booleanAnd) ? "AND (" : "OR (";
1089 condition += term.termAsString + ')';
1090 }
1091 return condition;
1092 }
1093
CreateVirtualFolder
1094 function CreateVirtualFolder(newName, parentFolder, searchFolderURIs, searchTerms, searchOnline)
1095 {
1096 // ### need to make sure view/folder doesn't exist.
1097 if (searchFolderURIs && (searchFolderURIs != "") && newName && (newName != ""))
1098 {
1099 try
1100 {
1101 var newFolder = parentFolder.addSubfolder(newName);
1102 newFolder.prettyName = newName;
1103 newFolder.setFlag(MSG_FOLDER_FLAG_VIRTUAL);
1104 var vfdb = newFolder.getMsgDatabase(msgWindow);
1105 var searchTermString = getSearchTermString(searchTerms);
1106 var dbFolderInfo = vfdb.dBFolderInfo;
1107 // set the view string as a property of the db folder info
1108 // set the original folder name as well.
1109 dbFolderInfo.setCharProperty("searchStr", searchTermString);
1110 dbFolderInfo.setCharProperty("searchFolderUri", searchFolderURIs);
1111 dbFolderInfo.setBooleanProperty("searchOnline", searchOnline);
1112
1113 vfdb.summaryValid = true;
1114 vfdb.Close(true);
1115 parentFolder.NotifyItemAdded(newFolder);
1116 var accountManager = Components.classes["@mozilla.org/messenger/account-manager;1"].getService(Components.interfaces.nsIMsgAccountManager);
1117 accountManager.saveVirtualFolders();
1118 }
1119 catch(e)
1120 {
1121 throw(e); // so that the dialog does not automatically close
1122 dump ("Exception : creating virtual folder \n");
1123 }
1124 }
1125 else
1126 {
1127 dump("no name or nothing selected\n");
1128 }
1129 }
1130
1131 var searchSessionContractID = "@mozilla.org/messenger/searchSession;1";
1132 var gSearchView;
1133 var gSearchSession;
1134
1135 var nsIMsgFolder = Components.interfaces.nsIMsgFolder;
1136 var nsIMsgWindow = Components.interfaces.nsIMsgWindow;
1137 var nsIMsgRDFDataSource = Components.interfaces.nsIMsgRDFDataSource;
1138 var nsMsgSearchScope = Components.interfaces.nsMsgSearchScope;
1139
1140 var gFolderDatasource;
1141 var gFolderPicker;
1142 var gStatusBar = null;
1143 var gMessengerBundle = null;
1144
1145 // Datasource search listener -- made global as it has to be registered
1146 // and unregistered in different functions.
1147 var gDataSourceSearchListener;
1148 var gViewSearchListener;
1149
1150 var gMailSession;
1151
GetScopeForFolder
1152 function GetScopeForFolder(folder)
1153 {
1154 return folder.server.searchScope;
1155 }
1156
setupXFVirtualFolderSearch
1157 function setupXFVirtualFolderSearch(folderUrisToSearch, searchTerms, searchOnline)
1158 {
1159 var count = new Object;
1160 var i;
1161
1162 gSearchSession = Components.classes[searchSessionContractID].createInstance(Components.interfaces.nsIMsgSearchSession);
1163
1164 gMailSession = Components.classes[mailSessionContractID].getService(Components.interfaces.nsIMsgMailSession);
1165
1166 for (i in folderUrisToSearch)
1167 {
1168 var realFolderRes = GetResourceFromUri(folderUrisToSearch[i]);
1169 var realFolder = realFolderRes.QueryInterface(Components.interfaces.nsIMsgFolder);
1170 if (!realFolder.isServer)
1171 gSearchSession.addScopeTerm(!searchOnline ? nsMsgSearchScope.offlineMail : GetScopeForFolder(realFolder), realFolder);
1172 }
1173
1174 var termsArray = searchTerms.QueryInterface(Components.interfaces.nsISupportsArray);
1175 for (i = 0; i < termsArray.Count(); ++i)
1176 gSearchSession.appendTerm(termsArray.GetElementAt(i).QueryInterface(Components.interfaces.nsIMsgSearchTerm));
1177 }
1178
CreateGroupedSearchTerms
1179 function CreateGroupedSearchTerms(searchTermsArray)
1180 {
1181
1182 var searchSession = gSearchSession ||
1183 Components.classes[searchSessionContractID].createInstance(Components.interfaces.nsIMsgSearchSession);
1184
1185 // create a temporary isupports array to store our search terms
1186 // since we will be modifying the terms so they work with quick search
1187 var searchTermsArrayForQS = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray);
1188
1189 var numEntries = searchTermsArray.Count();
1190 for (var i = 0; i < numEntries; i++) {
1191 var searchTerm = searchTermsArray.GetElementAt(i).QueryInterface(Components.interfaces.nsIMsgSearchTerm);
1192
1193 // clone the term, since we might be modifying it
1194 var searchTermForQS = searchSession.createTerm();
1195 searchTermForQS.value = searchTerm.value;
1196 searchTermForQS.attrib = searchTerm.attrib;
1197 searchTermForQS.arbitraryHeader = searchTerm.arbitraryHeader
1198 searchTermForQS.op = searchTerm.op;
1199
1200 // mark the first node as a group
1201 if (i == 0)
1202 searchTermForQS.beginsGrouping = true;
1203 else if (i == numEntries - 1)
1204 searchTermForQS.endsGrouping = true;
1205
1206 // turn the first term to true to work with quick search...
1207 searchTermForQS.booleanAnd = i ? searchTerm.booleanAnd : true;
1208
1209 searchTermsArrayForQS.AppendElement(searchTermForQS);
1210 }
1211 return searchTermsArrayForQS;
1212 }
1213
OnLeavingFolder
Called By: commandglue.js:FolderPaneSelectionChange (1 calls, 7 v-uS)
msgMail3PaneWindow.js:OnUnloadMessenger (1 calls, 8 v-uS)
1214 function OnLeavingFolder(aFolder)
1215 {
1216 try
1217 {
1218 // Mark all messages of aFolder as read:
1219 // We can't use the command controller, because it is already tuned in to the
1220 // new folder, so we just mimic its behaviour wrt goDoCommand('cmd_markAllRead').
1221 if (gDBView && gPrefBranch.getBoolPref("mailnews.mark_message_read." + aFolder.server.type))
1222 {
1223 gDBView.doCommand(nsMsgViewCommandType.markAllRead);
1224 }
1225 }
1226 catch(e){/* ignore */}
1227 }
1228
1229 var gViewDebug = false;
1230
viewDebug
Called By: commandglue.js:ChangeFolderByURI (1 calls, 7 v-uS)
1231 function viewDebug(str)
1232 {
1233 if (gViewDebug)
1234 dump(str);
1235 }