!import
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1 //@line 42 "/home/visbrero/mnt/roisin/rev_control/hg/mozilla/mail/base/content/mailContextMenus.js"
2
3 //NOTE: gMessengerBundle must be defined and set or this Overlay won't work
4
5 const mailtolength = 7;
6
7 // Function to change the highlighted row back to the row that is currently
8 // outline/dotted without loading the contents of either rows. This is
9 // triggered when the context menu for a given row is hidden/closed
10 // (onpopuphiding).
RestoreSelectionWithoutContentLoad
(1 calls, 269 incl. v-uS, 70 excl. v-uS)
Called: TreeSelection:currentIndex (2 calls, 18 v-uS)
ChromeWindow:isSelected (1 calls, 23 v-uS)
XULTreeBuilder:selection (1 calls, 12 v-uS)
tree.xml:!import (1 calls, 143 v-uS)
Called By: mailContextMenus.js:folderPaneOnPopupHiding (1 calls, 269 v-uS)
11 function RestoreSelectionWithoutContentLoad(tree)
12 {
13 // If a delete or move command had been issued, then we should
14 // reset gRightMouseButtonDown and gThreadPaneDeleteOrMoveOccurred
15 // and return (see bug 142065).
16 if(gThreadPaneDeleteOrMoveOccurred)
17 {
18 gRightMouseButtonDown = false;
19 gThreadPaneDeleteOrMoveOccurred = false;
20 return;
21 }
22
23 var treeSelection = tree.view.selection;
24
25 // make sure that currentIndex is valid so that we don't try to restore
26 // a selection of an invalid row.
27 if((!treeSelection.isSelected(treeSelection.currentIndex)) &&
28 (treeSelection.currentIndex >= 0))
29 {
30 treeSelection.selectEventsSuppressed = true;
31 treeSelection.select(treeSelection.currentIndex);
32 treeSelection.selectEventsSuppressed = false;
33
34 // Keep track of which row in the thread pane is currently selected.
35 // This is currently only needed when deleting messages. See
36 // declaration of var in msgMail3PaneWindow.js.
37 if(tree.id == "threadTree")
38 gThreadPaneCurrentSelectedIndex = treeSelection.currentIndex;
39 }
40 else if(treeSelection.currentIndex < 0)
41 // Clear the selection in the case of when a folder has just been
42 // loaded where the message pane does not have a message loaded yet.
43 // When right-clicking a message in this case and dismissing the
44 // popup menu (by either executing a menu command or clicking
45 // somewhere else), the selection needs to be cleared.
46 // However, if the 'Delete Message' or 'Move To' menu item has been
47 // selected, DO NOT clear the selection, else it will prevent the
48 // tree view from refreshing.
49 treeSelection.clearSelection();
50
51 // Need to reset gRightMouseButtonDown to false here because
52 // TreeOnMouseDown() is only called on a mousedown, not on a key down.
53 // So resetting it here allows the loading of messages in the messagepane
54 // when navigating via the keyboard or the toolbar buttons *after*
55 // the context menu has been dismissed.
56 gRightMouseButtonDown = false;
57 }
58
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
59 function threadPaneOnPopupHiding()
60 {
61 RestoreSelectionWithoutContentLoad(GetThreadTree());
62 }
63
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
64 function fillThreadPaneContextMenu()
65 {
66 var numSelected = GetNumSelectedMessages();
67
68 var isNewsgroup = false;
69 var selectedMessage = null;
70
71 // Clear the global var used to keep track if a 'Delete Message' or 'Move
72 // To' command has been triggered via the thread pane context menu.
73 gThreadPaneDeleteOrMoveOccurred = false;
74
75 if(numSelected >= 0) {
76 selectedMessage = GetFirstSelectedMessage();
77 isNewsgroup = IsNewsMessage(selectedMessage);
78 }
79
80 SetupNewMessageWindowMenuItem("threadPaneContext-openNewWindow", numSelected, false);
81 SetupEditAsNewMenuItem("threadPaneContext-editAsNew", numSelected, false);
82
83 ShowMenuItem("threadPaneContext-sep-open", (numSelected <= 1));
84
85 SetupReplyToSenderMenuItem("threadPaneContext-replySender", numSelected, false);
86 SetupReplyToNewsgroupMenuItem("threadPaneContext-replyNewsgroup", numSelected, isNewsgroup, false);
87 SetupReplyAllMenuItem("threadPaneContext-replyAll", numSelected, false);
88 SetupForwardMenuItem("threadPaneContext-forward", numSelected, false);
89 SetupForwardAsAttachmentMenuItem("threadPaneContext-forwardAsAttachment", numSelected, false);
90
91 ShowMenuItem("threadPaneContext-sep-reply", true);
92
93 SetupCopyMessageUrlMenuItem("threadPaneContext-copyMessageUrl", numSelected, isNewsgroup, numSelected != 1);
94 SetupCopyMenuItem("threadPaneContext-copyMenu", numSelected, false);
95 SetupMoveMenuItem("threadPaneContext-moveMenu", numSelected, isNewsgroup, false);
96 SetupMoveToFolderAgainMenuItem("threadPaneContext-moveToFolderAgain", numSelected, false);
97
98 EnableMenuItem("threadPaneContext-labels", (numSelected >= 1));
99 EnableMenuItem("threadPaneContext-mark", (numSelected >= 1));
100 SetupSaveAsMenuItem("threadPaneContext-saveAs", numSelected, false);
101 //@line 142 "/home/visbrero/mnt/roisin/rev_control/hg/mozilla/mail/base/content/mailContextMenus.js"
102 SetupPrintPreviewMenuItem("threadPaneContext-printpreview", numSelected, true);
103 //@line 146 "/home/visbrero/mnt/roisin/rev_control/hg/mozilla/mail/base/content/mailContextMenus.js"
104 SetupPrintMenuItem("threadPaneContext-print", numSelected, false);
105 SetupDeleteMenuItem("threadPaneContext-delete", numSelected, false);
106 SetupAddSenderToABMenuItem("threadPaneContext-addSenderToAddressBook", numSelected, false);
107 SetupAddAllToABMenuItem("threadPaneContext-addAllToAddressBook", numSelected, false);
108
109 ShowMenuItem("threadPaneContext-sep-edit", (numSelected <= 1));
110
111 EnableMenuItem('downloadSelected', GetNumSelectedMessages() > 0);
112
113 return(true);
114 }
115
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
116 function SetupNewMessageWindowMenuItem(menuID, numSelected, forceHide)
117 {
118 ShowMenuItem(menuID, (numSelected <= 1) && !forceHide);
119 EnableMenuItem(menuID, (numSelected == 1));
120 }
121
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
122 function SetupEditAsNewMenuItem(menuID, numSelected, forceHide)
123 {
124 ShowMenuItem(menuID, (numSelected <= 1)&& !forceHide);
125 EnableMenuItem(menuID, (numSelected == 1));
126 }
127
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
128 function SetupReplyToSenderMenuItem(menuID, numSelected, forceHide)
129 {
130 ShowMenuItem(menuID, (numSelected <= 1)&& !forceHide);
131 EnableMenuItem(menuID, (numSelected == 1));
132 }
133
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
134 function SetupReplyToNewsgroupMenuItem(menuID, numSelected, isNewsgroup, forceHide)
135 {
136 ShowMenuItem(menuID, (numSelected <= 1) && isNewsgroup && !forceHide);
137 EnableMenuItem(menuID, (numSelected == 1));
138 }
139
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
140 function SetupReplyAllMenuItem(menuID, numSelected, forceHide)
141 {
142 ShowMenuItem(menuID, (numSelected <= 1) && !forceHide);
143 EnableMenuItem(menuID, (numSelected == 1));
144 }
145
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
146 function SetupForwardMenuItem(menuID, numSelected, forceHide)
147 {
148 ShowMenuItem(menuID, (numSelected <= 1) && !forceHide);
149 EnableMenuItem(menuID, (numSelected > 0));
150 }
151
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
152 function SetupForwardAsAttachmentMenuItem(menuID, numSelected, forceHide)
153 {
154 ShowMenuItem(menuID, (numSelected > 1) && !forceHide);
155 EnableMenuItem(menuID, (numSelected > 1));
156 }
157
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
158 function SetupMoveMenuItem(menuID, numSelected, isNewsgroup, forceHide)
159 {
160 ShowMenuItem(menuID, !isNewsgroup && !forceHide);
161
162 var msgFolder = GetLoadedMsgFolder();
163 // disable move if we can't delete message(s) from this folder
164 var enableMenuItem = (numSelected > 0) && msgFolder && msgFolder.canDeleteMessages;
165 EnableMenuItem(menuID, enableMenuItem);
166 }
167
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
168 function SetupCopyMessageUrlMenuItem(menuID, numSelected, isNewsgroup, forceHide)
169 {
170 ShowMenuItem(menuID, isNewsgroup && !forceHide);
171 EnableMenuItem(menuID, (numSelected > 0));
172 }
173
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
174 function SetupCopyMenuItem(menuID, numSelected, forceHide)
175 {
176 ShowMenuItem(menuID, !forceHide);
177 EnableMenuItem(menuID, (numSelected > 0));
178 }
179
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
180 function SetupMoveToFolderAgainMenuItem(menuID, numSelected, forceHide)
181 {
182 ShowMenuItem(menuID, !forceHide);
183 if (!forceHide)
184 initMoveToFolderAgainMenu(document.getElementById(menuID));
185 }
186
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
187 function SetupLabelsMenuItem(menuID, numSelected, forceHide)
188 {
189 ShowMenuItem(menuID, (numSelected <= 1) && !forceHide);
190 EnableMenuItem(menuID, (numSelected == 1));
191 }
192
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
193 function SetupTagMenuItem(menuID, numSelected, forceHide)
194 {
195 ShowMenuItem(menuID, (numSelected <= 1) && !forceHide);
196 EnableMenuItem(menuID, (numSelected == 1));
197 }
198
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
199 function SetupMarkMenuItem(menuID, numSelected, forceHide)
200 {
201 ShowMenuItem(menuID, (numSelected <= 1) && !forceHide);
202 EnableMenuItem(menuID, (numSelected == 1));
203 }
204
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
205 function SetupSaveAsMenuItem(menuID, numSelected, forceHide)
206 {
207 ShowMenuItem(menuID, (numSelected <= 1) && !forceHide);
208 EnableMenuItem(menuID, (numSelected == 1));
209 }
210
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
211 function SetupPrintPreviewMenuItem(menuID, numSelected, forceHide)
212 {
213 ShowMenuItem(menuID, (numSelected <= 1) && !forceHide);
214 EnableMenuItem(menuID, (numSelected == 1));
215 }
216
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
217 function SetupPrintMenuItem(menuID, numSelected, forceHide)
218 {
219 ShowMenuItem(menuID, !forceHide);
220 EnableMenuItem(menuID, (numSelected > 0));
221 }
222
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
223 function SetupAddSenderToABMenuItem(menuID, numSelected, forceHide)
224 {
225 ShowMenuItem(menuID, (numSelected <= 1) && !forceHide);
226 EnableMenuItem(menuID, false);
227 }
228
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
229 function SetupAddAllToABMenuItem(menuID, numSelected, forceHide)
230 {
231 ShowMenuItem(menuID, (numSelected <= 1) && !forceHide);
232 EnableMenuItem(menuID, false);
233 }
234
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
235 function SetupDeleteMenuItem(menuID, numSelected, forceHide)
236 {
237 // This function is needed for the case where a folder is just loaded (while
238 // there isn't a message loaded in the message pane), a right-click is done
239 // in the thread pane. This function will disable enable the 'Delete
240 // Message' menu item.
241 ShowMenuItem(menuID, !forceHide);
242 EnableMenuItem(menuID, (numSelected > 0));
243 goUpdateCommand('cmd_delete');
244 }
245
246 // show the message id in the context menu
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
247 function FillMessageIdContextMenu(messageIdNode)
248 {
249 if (messageIdNode)
250 {
251 document.getElementById("messageIdContext-messageIdTarget")
252 .setAttribute("label", messageIdNode.getAttribute("messageid"));
253 }
254 }
255
CopyMessageId
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
256 function CopyMessageId(messageId)
257 {
258 var clipboard = Components.classes["@mozilla.org/widget/clipboardhelper;1"]
259 .getService(Components.interfaces.nsIClipboardHelper);
260
261 clipboard.copyString(messageId);
262 }
263
GetMessageIdFromNode
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
264 function GetMessageIdFromNode(messageIdNode, cleanMessageId)
265 {
266 var messageId = messageIdNode.getAttribute("messageid");
267
268 // remove < and >
269 if (cleanMessageId)
270 messageId = messageId.substring(1, messageId.length - 1);
271
272 return messageId;
273 }
274
275 // take the message id from the messageIdNode and use the
276 // url defined in the hidden pref "mailnews.messageid_browser.url"
277 // to open it in a browser window (%mid is replaced by the message id)
OpenBrowserWithMessageId
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
278 function OpenBrowserWithMessageId(messageId)
279 {
280 var browserURL = pref.getComplexValue("mailnews.messageid_browser.url",
281 Components.interfaces.nsIPrefLocalizedString).data;
282
283 browserURL = browserURL.replace(/%mid/, messageId);
284 try
285 {
286 messenger.launchExternalURL(browserURL);
287 }
288 catch (ex)
289 {
290 dump("Failed to open message-id in browser!");
291 }
292 }
293
294 // take the message id from the messageIdNode, search for the
295 // corresponding message in all folders starting with the current
296 // selected folder, then the current account followed by the other
297 // accounts and open corresponding message if found
OpenMessageForMessageId
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
298 function OpenMessageForMessageId(messageId)
299 {
300 var startServer = msgWindow.openFolder.server;
301 var messageHeader;
302
303 window.setCursor("wait");
304
305 // first search in current folder for message id
306 var messageHeader = CheckForMessageIdInFolder(msgWindow.openFolder, messageId);
307
308 // if message id not found in current folder search in all folders
309 if (!messageHeader)
310 {
311 var accountManager = Components.classes["@mozilla.org/messenger/account-manager;1"]
312 .getService(Components.interfaces.nsIMsgAccountManager);
313 var allServers = accountManager.allServers;
314
315 messageHeader = SearchForMessageIdInSubFolder(startServer.rootFolder, messageId);
316
317 for (var i = 0; i < allServers.Count() && !messageHeader; i++)
318 {
319 var currentServer = allServers.GetElementAt(i);
320 if ((currentServer instanceof Components.interfaces.nsIMsgIncomingServer) &&
321 startServer != currentServer && currentServer.canSearchMessages &&
322 !currentServer.isDeferredTo)
323 {
324 messageHeader = SearchForMessageIdInSubFolder(currentServer.rootFolder, messageId);
325 }
326 }
327 }
328 window.setCursor("auto");
329
330 // if message id was found open corresponding message
331 // else show error message
332 if (messageHeader)
333 OpenMessageByHeader(messageHeader, pref.getBoolPref("mailnews.messageid.openInNewWindow"));
334 else
335 {
336 var messageIdStr = "<" + messageId + ">";
337 var errorTitle = gMessengerBundle.getString("errorOpenMessageForMessageIdTitle");
338 var errorMessage = gMessengerBundle.getFormattedString("errorOpenMessageForMessageIdMessage",
339 [messageIdStr]);
340 var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
341 .getService(Components.interfaces.nsIPromptService);
342
343 promptService.alert(window, errorTitle, errorMessage);
344 }
345 }
346
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
347 function OpenMessageByHeader(messageHeader, openInNewWindow)
348 {
349 var folder = messageHeader.folder;
350 var folderURI = folder.URI;
351
352 if (openInNewWindow)
353 {
354 var messageURI = folder.getUriForMsg(messageHeader);
355
356 window.openDialog("chrome://messenger/content/messageWindow.xul",
357 "_blank", "all,chrome,dialog=no,status,toolbar",
358 messageURI, folderURI, null);
359 }
360 else
361 {
362 if (msgWindow.openFolder != folderURI)
363 SelectFolder(folderURI);
364
365 var tree = null;
366 var wintype = document.documentElement.getAttribute('windowtype');
367 if (wintype != "mail:messageWindow")
368 {
369 tree = GetThreadTree();
370 tree.view.selection.clearSelection();
371 }
372
373 try
374 {
375 gDBView.selectMsgByKey(messageHeader.messageKey);
376 }
377 catch(e)
378 { // message not in the thread pane
379 try
380 {
381 goDoCommand("cmd_viewAllMsgs");
382 gDBView.selectMsgByKey(messageHeader.messageKey);
383 }
384 catch(e)
385 {
386 dump("select messagekey " + messageHeader.messageKey +
387 " failed in folder " + folder.URI);
388 }
389 }
390
391 if (tree)
392 {
393 var length = {};
394 var indicesArray = {};
395
396 gDBView.getIndicesForSelection(indicesArray, length);
397 tree.treeBoxObject.ensureRowIsVisible(indicesArray.value[0]);
398 }
399 }
400 }
401
402 // search for message by message id in given folder and its subfolders
403 // return message header if message was found
SearchForMessageIdInSubFolder
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
404 function SearchForMessageIdInSubFolder(folder, messageId)
405 {
406 var messageHeader;
407 var subFolders = folder.subFolders;
408
409 // search in folder
410 if (!folder.isServer)
411 messageHeader = CheckForMessageIdInFolder(folder, messageId);
412
413 // search subfolders recursively
414 while (subFolders.hasMoreElements() && !messageHeader)
415 {
416 // search in current folder
417 var currentFolder =
418 subFolders.getNext().QueryInterface(Components.interfaces.nsIMsgFolder);
419 messageHeader = CheckForMessageIdInFolder(currentFolder, messageId);
420
421 // search in its subfolder
422 if (!messageHeader && currentFolder.hasSubFolders)
423 messageHeader = SearchForMessageIdInSubFolder(currentFolder, messageId);
424 }
425
426 return messageHeader;
427 }
428
429 // check folder for corresponding message to given message id
430 // return message header if message was found
CheckForMessageIdInFolder
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
431 function CheckForMessageIdInFolder(folder, messageId)
432 {
433 var messageDatabase = folder.getMsgDatabase(msgWindow);
434 var messageHeader;
435
436 try
437 {
438 messageHeader = messageDatabase.getMsgHdrForMessageID(messageId);
439 }
440 catch (ex)
441 {
442 dump("Failed to find message-id in folder!");
443 }
444
445 if (!gMailSession)
446 {
447 gMailSession = Components.classes[mailSessionContractID]
448 .getService(Components.interfaces.nsIMsgMailSession);
449 }
450
451 if (!gMailSession.IsFolderOpenInWindow(folder) &&
452 !(folder.flags & (MSG_FOLDER_FLAG_TRASH | MSG_FOLDER_FLAG_INBOX)))
453 {
454 folder.setMsgDatabase(null);
455 }
456
457 return messageHeader;
458 }
459
(2 calls, 701 incl. v-uS, 85 excl. v-uS)
Called: MouseEvent:target (1 calls, 33 v-uS)
mailContextMenus.js:RestoreSelectionWithoutContentLoad (1 calls, 269 v-uS)
mailContextMenus.js:folderPaneOnPopupHiding (1 calls, 304 v-uS)
msgMail3PaneWindow.js:GetFolderTree (1 calls, 8 v-uS)
Called By: mailContextMenus.js:folderPaneOnPopupHiding (1 calls, 304 v-uS)
460 function folderPaneOnPopupHiding()
461 {
462 RestoreSelectionWithoutContentLoad(GetFolderTree());
463 }
464
(2 calls, 21140 incl. v-uS, 502 excl. v-uS)
Called: mailContextMenus.js:ShowMenuItem (13 calls, 2408 v-uS)
mailContextMenus.js:EnableMenuItem (9 calls, 905 v-uS)
msgMail3PaneWindow.js:GetFolderAttribute (3 calls, 551 v-uS)
mailContextMenus.js:shouldShowSeparator (2 calls, 920 v-uS)
ChromeWindow:getRangeAt (1 calls, 30 v-uS)
XPCWrappedNative_NoHelper:Value (1 calls, 12 v-uS)
XPCWrappedNative_NoHelper:flags (1 calls, 10 v-uS)
XULTreeBuilder:selection (1 calls, 11 v-uS)
globalOverlay.js:goUpdateCommand (1 calls, 1189 v-uS)
mailContextMenus.js:SetupCompactMenuItem (1 calls, 673 v-uS)
mailContextMenus.js:SetupFavoritesMenuItem (1 calls, 498 v-uS)
mailContextMenus.js:SetupNewMenuItem (1 calls, 1063 v-uS)
mailContextMenus.js:SetupRemoveMenuItem (1 calls, 479 v-uS)
mailContextMenus.js:SetupRenameMenuItem (1 calls, 718 v-uS)
mailContextMenus.js:fillFolderPaneContextMenu (1 calls, 10551 v-uS)
msgMail3PaneWindow.js:GetFolderResource (1 calls, 190 v-uS)
msgMail3PaneWindow.js:GetFolderTree (1 calls, 9 v-uS)
tree.xml:!import (1 calls, 162 v-uS)
widgetglue.js:GetMsgFolderFromUri (1 calls, 250 v-uS)
Called By: mailContextMenus.js:fillFolderPaneContextMenu (1 calls, 10551 v-uS)
465 function fillFolderPaneContextMenu()
466 {
467 var folderTree = GetFolderTree();
468 var startIndex = {};
469 var endIndex = {};
470 folderTree.view.selection.getRangeAt(0, startIndex, endIndex);
471 if (startIndex.value < 0)
472 return false;
473 var numSelected = endIndex.value - startIndex.value + 1;
474 var folderResource = GetFolderResource(folderTree, startIndex.value);
475 var folder = GetMsgFolderFromUri(folderResource.Value, false);
476 var isVirtualFolder = folder ? folder.flags & MSG_FOLDER_FLAG_VIRTUAL : false;
477
478 var isServer = GetFolderAttribute(folderTree, folderResource, "IsServer") == 'true';
479 var serverType = GetFolderAttribute(folderTree, folderResource, "ServerType");
480 var specialFolder = GetFolderAttribute(folderTree, folderResource, "SpecialFolder");
481 var canSubscribeToFolder = (serverType == "nntp") || (serverType == "imap");
482 var isNewsgroup = !isServer && serverType == 'nntp';
483 var isMailFolder = !isServer && serverType != 'nntp';
484 var canGetMessages = (isServer && serverType != "none") || isNewsgroup || (serverType == "rss");
485
486 EnableMenuItem("folderPaneContext-properties", true);
487
488 ShowMenuItem("folderPaneContext-getMessages", (numSelected <= 1) && canGetMessages);
489 EnableMenuItem("folderPaneContext-getMessages", true);
490
491 SetupNewMenuItem(folderResource, numSelected, isServer, serverType, specialFolder);
492 SetupRenameMenuItem(folderResource, numSelected, isServer, serverType, specialFolder);
493 SetupRemoveMenuItem(folderResource, numSelected, isServer, serverType, specialFolder);
494 SetupCompactMenuItem(folderResource, numSelected);
495 SetupFavoritesMenuItem(folderResource, numSelected, isServer, 'folderPaneContext-favoriteFolder');
496
497 ShowMenuItem("folderPaneContext-emptyTrash", (numSelected <= 1) && (specialFolder == 'Trash'));
498 EnableMenuItem("folderPaneContext-emptyTrash", true);
499 ShowMenuItem("folderPaneContext-emptyJunk", (numSelected <= 1) && (specialFolder == 'Junk'));
500 EnableMenuItem("folderPaneContext-emptyJunk", true);
501
502 var showSendUnsentMessages = (numSelected <= 1)
503 && (specialFolder == 'Unsent Messages' || specialFolder == 'Unsent');
504 ShowMenuItem("folderPaneContext-sendUnsentMessages", showSendUnsentMessages);
505 if (showSendUnsentMessages)
506 EnableMenuItem("folderPaneContext-sendUnsentMessages", IsSendUnsentMsgsEnabled(folderResource));
507
508 ShowMenuItem("folderPaneContext-subscribe", (numSelected <= 1) && canSubscribeToFolder && !isVirtualFolder);
509 EnableMenuItem("folderPaneContext-subscribe", !isVirtualFolder);
510
511 // XXX: Hack for RSS servers...
512 ShowMenuItem("folderPaneContext-rssSubscribe", (numSelected <= 1) && (serverType == "rss"));
513 EnableMenuItem("folderPaneContext-rssSubscribe", true);
514
515 // News folder context menu =============================================
516 ShowMenuItem("folderPaneContext-newsUnsubscribe", (numSelected <= 1) && canSubscribeToFolder && isNewsgroup);
517 EnableMenuItem("folderPaneContext-newsUnsubscribe", true);
518 ShowMenuItem("folderPaneContext-markNewsgroupAllRead", (numSelected <= 1) && isNewsgroup);
519 EnableMenuItem("folderPaneContext-markNewsgroupAllRead", true);
520 // End of News folder context menu =======================================
521
522 ShowMenuItem("folderPaneContext-markMailFolderAllRead", (numSelected <= 1) && isMailFolder && !isVirtualFolder);
523 EnableMenuItem("folderPaneContext-markMailFolderAllRead", !isVirtualFolder);
524
525 ShowMenuItem("folderPaneContext-searchMessages", (numSelected<=1) && !isVirtualFolder);
526 goUpdateCommand('cmd_search');
527
528 // Hide / Show our menu separators based on the menu items we are showing.
529 ShowMenuItem("folderPaneContext-sep1", (numSelected <= 1) && !isServer);
530 ShowMenuItem('folderPaneContext-sep2', shouldShowSeparator('folderPaneContext-sep2'));
531 ShowMenuItem("folderPaneContext-sep3", shouldShowSeparator('folderPaneContext-sep3')); // we always show the separator before properties menu item
532 return(true);
533 }
534
(1 calls, 1063 incl. v-uS, 157 excl. v-uS)
Called: msgMail3PaneWindow.js:GetFolderAttribute (2 calls, 395 v-uS)
ChromeWindow:getService (1 calls, 48 v-uS)
mailContextMenus.js:EnableMenuItem (1 calls, 81 v-uS)
mailContextMenus.js:ShowMenuItem (1 calls, 195 v-uS)
mailWindowOverlay.js:SetMenuItemLabel (1 calls, 89 v-uS)
msgMail3PaneWindow.js:GetFolderTree (1 calls, 6 v-uS)
nsXPCComponents:classes (1 calls, 11 v-uS)
nsXPCComponents:interfaces (1 calls, 11 v-uS)
stringbundle.xml:getString (1 calls, 66 v-uS)
Called By: mailContextMenus.js:fillFolderPaneContextMenu (1 calls, 1063 v-uS)
535 function SetupNewMenuItem(folderResource, numSelected, isServer, serverType,specialFolder)
536 {
537 var folderTree = GetFolderTree();
538 var canCreateNew = GetFolderAttribute(folderTree, folderResource, "CanCreateSubfolders") == "true";
539 var isInbox = specialFolder == "Inbox";
540 var isIMAPFolder = GetFolderAttribute(folderTree, folderResource,
541 "ServerType") == "imap";
542
543 var ioService = Components.classes["@mozilla.org/network/io-service;1"]
544 .getService(Components.interfaces.nsIIOService);
545
546 var showNew = ((numSelected <=1) && (serverType != 'nntp') && canCreateNew) || isInbox;
547 ShowMenuItem("folderPaneContext-new", showNew);
548
549 EnableMenuItem("folderPaneContext-new", !isIMAPFolder || MailOfflineMgr.isOnline());
550
551 if (showNew)
552 {
553 if (isServer || isInbox)
554 SetMenuItemLabel("folderPaneContext-new", gMessengerBundle.getString("newFolder"));
555 else
556 SetMenuItemLabel("folderPaneContext-new", gMessengerBundle.getString("newSubfolder"));
557 }
558 }
559
(1 calls, 718 incl. v-uS, 83 excl. v-uS)
Called: ChromeWindow:QueryInterface (1 calls, 25 v-uS)
ChromeWindow:isCommandEnabled (1 calls, 28 v-uS)
commandglue.js:GetMsgFolderFromResource (1 calls, 102 v-uS)
mailContextMenus.js:EnableMenuItem (1 calls, 81 v-uS)
mailContextMenus.js:ShowMenuItem (1 calls, 190 v-uS)
msgMail3PaneWindow.js:GetFolderAttribute (1 calls, 186 v-uS)
msgMail3PaneWindow.js:GetFolderTree (1 calls, 7 v-uS)
nsXPCComponents:interfaces (1 calls, 11 v-uS)
Called By: mailContextMenus.js:fillFolderPaneContextMenu (1 calls, 718 v-uS)
560 function SetupRenameMenuItem(folderResource, numSelected, isServer, serverType, specialFolder)
561 {
562 var msgFolder = folderResource.QueryInterface(Components.interfaces.nsIMsgFolder);
563 var folderTree = GetFolderTree();
564 var isSpecialFolder = !(specialFolder == "none" || (specialFolder == "Junk" && CanRenameDeleteJunkMail(msgFolder.URI))
565 || (specialFolder == "Virtual") );
566 var canRename = GetFolderAttribute(folderTree, folderResource, "CanRename") == "true";
567
568 ShowMenuItem("folderPaneContext-rename", (numSelected <= 1) && !isServer && !isSpecialFolder && canRename);
569 var folder = GetMsgFolderFromResource(folderResource);
570 EnableMenuItem("folderPaneContext-rename", !isServer && folder.isCommandEnabled("cmd_renameFolder"));
571 }
572
(1 calls, 479 incl. v-uS, 63 excl. v-uS)
Called: ChromeWindow:QueryInterface (1 calls, 24 v-uS)
ChromeWindow:isCommandEnabled (1 calls, 27 v-uS)
commandglue.js:GetMsgFolderFromResource (1 calls, 84 v-uS)
mailContextMenus.js:EnableMenuItem (1 calls, 80 v-uS)
mailContextMenus.js:ShowMenuItem (1 calls, 187 v-uS)
nsXPCComponents:interfaces (1 calls, 11 v-uS)
Called By: mailContextMenus.js:fillFolderPaneContextMenu (1 calls, 479 v-uS)
573 function SetupRemoveMenuItem(folderResource, numSelected, isServer, serverType, specialFolder)
574 {
575 var msgFolder = folderResource.QueryInterface(Components.interfaces.nsIMsgFolder);
576 var isMail = serverType != 'nntp';
577 var isSpecialFolder = !(specialFolder == "none" || (specialFolder == "Junk" && CanRenameDeleteJunkMail(msgFolder.URI))
578 || (specialFolder == "Virtual") );
579 //Can't currently delete Accounts or special folders.
580 var showRemove = (numSelected <=1) && (isMail && !isSpecialFolder) && !isServer;
581
582 ShowMenuItem("folderPaneContext-remove", showRemove);
583 if(showRemove)
584 {
585 var folder = GetMsgFolderFromResource(folderResource);
586 EnableMenuItem("folderPaneContext-remove", folder.isCommandEnabled("cmd_delete"));
587 }
588 }
589
(1 calls, 673 incl. v-uS, 84 excl. v-uS)
Called: XPCWrappedNative_NoHelper:flags (2 calls, 18 v-uS)
ChromeWindow:isCommandEnabled (1 calls, 26 v-uS)
commandglue.js:GetMsgFolderFromResource (1 calls, 82 v-uS)
mailContextMenus.js:EnableMenuItem (1 calls, 81 v-uS)
mailContextMenus.js:ShowMenuItem (1 calls, 188 v-uS)
msgMail3PaneWindow.js:GetFolderAttribute (1 calls, 184 v-uS)
msgMail3PaneWindow.js:GetFolderTree (1 calls, 6 v-uS)
Called By: mailContextMenus.js:fillFolderPaneContextMenu (1 calls, 673 v-uS)
590 function SetupCompactMenuItem(folderResource, numSelected)
591 {
592 var folderTree = GetFolderTree();
593 var canCompact = GetFolderAttribute(folderTree, folderResource, "CanCompact") == "true";
594 var folder = GetMsgFolderFromResource(folderResource);
595 ShowMenuItem("folderPaneContext-compact", (numSelected <=1) && canCompact && !(folder.flags & MSG_FOLDER_FLAG_VIRTUAL));
596 EnableMenuItem("folderPaneContext-compact", folder.isCommandEnabled("cmd_compactFolder") && !(folder.flags & MSG_FOLDER_FLAG_VIRTUAL));
597 }
598
(1 calls, 498 incl. v-uS, 81 excl. v-uS)
Called: ChromeWindow:getElementById (1 calls, 27 v-uS)
ChromeWindow:getFlag (1 calls, 25 v-uS)
ChromeWindow:setAttribute (1 calls, 70 v-uS)
commandglue.js:GetMsgFolderFromResource (1 calls, 82 v-uS)
mailContextMenus.js:ShowMenuItem (1 calls, 203 v-uS)
msgMail3PaneWindow.js:GetFolderTree (1 calls, 6 v-uS)
Called By: mailContextMenus.js:fillFolderPaneContextMenu (1 calls, 498 v-uS)
599 function SetupFavoritesMenuItem(folderResource, numSelected, isServer, menuItemId)
600 {
601 var folderTree = GetFolderTree();
602 var folder = GetMsgFolderFromResource(folderResource);
603 var showItem = !isServer && (numSelected <=1);
604 ShowMenuItem(menuItemId, showItem);
605
606 // adjust the checked state on the menu
607 if (showItem)
608 document.getElementById(menuItemId).setAttribute('checked',folder.getFlag(MSG_FOLDER_FLAG_FAVORITE));
609 }
610
(18 calls, 3373 incl. v-uS, 808 excl. v-uS)
Called: XULElement:hidden (36 calls, 584 v-uS)
ChromeWindow:getElementById (18 calls, 1980 v-uS)
Called By: mailContextMenus.js:fillFolderPaneContextMenu (13 calls, 2408 v-uS)
mailContextMenus.js:SetupCompactMenuItem (1 calls, 188 v-uS)
mailContextMenus.js:SetupFavoritesMenuItem (1 calls, 203 v-uS)
mailContextMenus.js:SetupNewMenuItem (1 calls, 195 v-uS)
mailContextMenus.js:SetupRemoveMenuItem (1 calls, 187 v-uS)
mailContextMenus.js:SetupRenameMenuItem (1 calls, 190 v-uS)
611 function ShowMenuItem(id, showItem)
612 {
613 var item = document.getElementById(id);
614 if(item && item.hidden != "true")
615 item.hidden = !showItem;
616 }
617
(13 calls, 1229 incl. v-uS, 373 excl. v-uS)
Called: ChromeWindow:getAttribute (13 calls, 345 v-uS)
ChromeWindow:getElementById (13 calls, 510 v-uS)
Called By: mailContextMenus.js:fillFolderPaneContextMenu (9 calls, 905 v-uS)
mailContextMenus.js:SetupCompactMenuItem (1 calls, 81 v-uS)
mailContextMenus.js:SetupNewMenuItem (1 calls, 81 v-uS)
mailContextMenus.js:SetupRemoveMenuItem (1 calls, 80 v-uS)
mailContextMenus.js:SetupRenameMenuItem (1 calls, 81 v-uS)
618 function EnableMenuItem(id, enableItem)
619 {
620 var item = document.getElementById(id);
621 if(item)
622 {
623 var enabled = (item.getAttribute('disabled') !='true');
624 if(enableItem != enabled)
625 {
626 item.setAttribute('disabled', enableItem ? '' : 'true');
627 }
628 }
629 }
630
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
631 function SetMenuItemLabel(id, label)
632 {
633 var item = document.getElementById(id);
634 if(item)
635 item.setAttribute('label', label);
636 }
637
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
638 function SetMenuItemAccessKey(id, accessKey)
639 {
640 var item = document.getElementById(id);
641 if(item)
642 item.setAttribute('accesskey', accessKey);
643 }
644
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
645 function fillMessagePaneContextMenu()
646 {
647 var message = GetLoadedMessage();
648 var numSelected = (message) ? 1 : 0;
649
650 var isNewsgroup = false;
651
652 if (numSelected == 1)
653 isNewsgroup = IsNewsMessage(message);
654
655 // don't show mail items for links/images, just show related items.
656 var hideMailItems = gContextMenu.onImage || gContextMenu.onLink;
657
658 SetupEditAsNewMenuItem("messagePaneContext-editAsNew", numSelected, (numSelected == 0 || hideMailItems));
659 SetupReplyToSenderMenuItem("messagePaneContext-replySender", numSelected, (numSelected == 0 || hideMailItems));
660 SetupReplyToNewsgroupMenuItem("messagePaneContext-replyNewsgroup", numSelected, isNewsgroup, (numSelected == 0 || hideMailItems));
661 SetupReplyAllMenuItem("messagePaneContext-replyAll" , numSelected, (numSelected == 0 || hideMailItems));
662 SetupForwardMenuItem("messagePaneContext-forward", numSelected, (numSelected == 0 || hideMailItems));
663 SetupCopyMessageUrlMenuItem("messagePaneContext-copyMessageUrl", numSelected, isNewsgroup, (numSelected == 0 || hideMailItems));
664 SetupCopyMenuItem("messagePaneContext-copyMenu", numSelected, (numSelected == 0 || hideMailItems));
665 SetupMoveMenuItem("messagePaneContext-moveMenu", numSelected, isNewsgroup, (numSelected == 0 || hideMailItems));
666 SetupMoveToFolderAgainMenuItem("messagePaneContext-moveToFolderAgain", numSelected, (numSelected == 0 || hideMailItems));
667 SetupLabelsMenuItem("messagePaneContext-labels", numSelected, (numSelected == 0 || hideMailItems));
668 SetupMarkMenuItem("messagePaneContext-mark", numSelected, (numSelected == 0 || hideMailItems));
669 SetupTagMenuItem("messagePaneContext-tags", numSelected, (numSelected == 0 || hideMailItems));
670 SetupSaveAsMenuItem("messagePaneContext-saveAs", numSelected, (numSelected == 0 || hideMailItems));
671 //@line 714 "/home/visbrero/mnt/roisin/rev_control/hg/mozilla/mail/base/content/mailContextMenus.js"
672 SetupPrintPreviewMenuItem("messagePaneContext-printpreview", numSelected, true);
673 //@line 718 "/home/visbrero/mnt/roisin/rev_control/hg/mozilla/mail/base/content/mailContextMenus.js"
674
675 SetupPrintMenuItem("messagePaneContext-print", numSelected, (numSelected == 0 || hideMailItems));
676 if (numSelected == 0 || hideMailItems)
677 ShowMenuItem("messagePaneContext-delete", false)
678 else {
679 goUpdateCommand('cmd_delete');
680 ShowMenuItem("messagePaneContext-delete", true)
681 }
682 SetupAddSenderToABMenuItem("messagePaneContext-addSenderToAddressBook", numSelected, (numSelected == 0 || hideMailItems));
683 SetupAddAllToABMenuItem("messagePaneContext-addAllToAddressBook", numSelected, (numSelected == 0 || hideMailItems));
684
685 ShowMenuItem("messagePaneContext-addemail", gContextMenu.onMailtoLink );
686 ShowMenuItem("messagePaneContext-composeemailto", gContextMenu.onMailtoLink );
687
688 ShowMenuItem("messagePaneContext-reportPhishingURL", gContextMenu.onLink && !gContextMenu.onMailtoLink);
689
690 // if we are on an image, go ahead and show this separator
691 //if (gContextMenu.onLink && !gContextMenu.onMailtoLink)
692 // ShowMenuItem("messagePaneContext-sep-edit", false);
693
694 //Figure out separators
695 ShowMenuItem("messagePaneContext-sep-link", shouldShowSeparator("messagePaneContext-sep-link"));
696 ShowMenuItem("messagePaneContext-sep-open", shouldShowSeparator("messagePaneContext-sep-open"));
697 ShowMenuItem("messagePaneContext-sep-reply", shouldShowSeparator("messagePaneContext-sep-reply"));
698 ShowMenuItem("messagePaneContext-sep-tags-1", shouldShowSeparator("messagePaneContext-sep-tags-1"));
699 ShowMenuItem("messagePaneContext-sep-saveAs", shouldShowSeparator("messagePaneContext-sep-saveAs"));
700 ShowMenuItem("messagePaneContext-sep-edit", shouldShowSeparator("messagePaneContext-sep-edit"));
701 ShowMenuItem("messagePaneContext-sep-copy", shouldShowSeparator("messagePaneContext-sep-copy"));
702 ShowMenuItem("messagePaneContext-sep-reportPhishing", shouldShowSeparator("messagePaneContext-sep-reportPhishing"));
703 }
704
705 // Determines whether or not the separator with the specified ID should be
706 // shown or not by determining if there are any non-hidden items between it
707 // and the previous separator. You should start with the first separator in the menu.
shouldShowSeparator
(2 calls, 920 incl. v-uS, 245 excl. v-uS)
Called: ChromeWindow:getAttribute (6 calls, 163 v-uS)
XULElement:previousSibling (6 calls, 97 v-uS)
ChromeWindow:getElementById (2 calls, 192 v-uS)
XULElement:localName (2 calls, 23 v-uS)
mailContextMenus.js:hasAVisibleNextSibling (2 calls, 198 v-uS)
Called By: mailContextMenus.js:fillFolderPaneContextMenu (2 calls, 920 v-uS)
708 function shouldShowSeparator(aSeparatorID)
709 {
710 var separator = document.getElementById(aSeparatorID);
711 if (separator)
712 {
713 var sibling = separator.previousSibling;
714 while (sibling)
715 {
716 if (sibling.getAttribute("hidden") != "true")
717 return sibling.localName != "menuseparator" && hasAVisibleNextSibling(separator);
718 sibling = sibling.previousSibling;
719 }
720 }
721 return false;
722 }
723
724 // helper function used by shouldShowSeparator
hasAVisibleNextSibling
(2 calls, 198 incl. v-uS, 94 excl. v-uS)
Called: ChromeWindow:getAttribute (2 calls, 52 v-uS)
XULElement:localName (2 calls, 22 v-uS)
XULElement:nextSibling (2 calls, 30 v-uS)
Called By: mailContextMenus.js:shouldShowSeparator (2 calls, 198 v-uS)
725 function hasAVisibleNextSibling(aNode)
726 {
727 var sibling = aNode.nextSibling;
728 while (sibling)
729 {
730 if (sibling.getAttribute("hidden") != "true"
731 && sibling.localName != "menuseparator")
732 return true;
733 sibling = sibling.nextSibling;
734 }
735 return false;
736 }
737
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
738 function IsMenuItemShowing(menuID)
739 {
740 var item = document.getElementById(menuID);
741 if (item)
742 return item.hidden != "true";
743 return false;
744 }
745
746 // message pane context menu helper methods
addEmail
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
747 function addEmail()
748 {
749 var url = gContextMenu.linkURL;
750 var addresses = getEmail(url);
751 window.openDialog("chrome://messenger/content/addressbook/abNewCardDialog.xul",
752 "",
753 "chrome,resizable=no,titlebar,modal,centerscreen",
754 {primaryEmail: addresses});
755 }
756
composeEmailTo
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
757 function composeEmailTo ()
758 {
759 var url = gContextMenu.linkURL;
760 var addresses = getEmail(url);
761 var fields = Components.classes["@mozilla.org/messengercompose/composefields;1"].createInstance(Components.interfaces.nsIMsgCompFields);
762 var params = Components.classes["@mozilla.org/messengercompose/composeparams;1"].createInstance(Components.interfaces.nsIMsgComposeParams);
763 fields.to = addresses;
764 params.type = Components.interfaces.nsIMsgCompType.New;
765 params.format = Components.interfaces.nsIMsgCompFormat.Default;
766 params.identity = accountManager.getFirstIdentityForServer(GetLoadedMsgFolder().server);
767 params.composeFields = fields;
768 msgComposeService.OpenComposeWindowWithParams(null, params);
769 }
770
771 // Extracts email address from url string
getEmail
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
772 function getEmail (url)
773 {
774 var qmark = url.indexOf( "?" );
775 var addresses;
776
777 if ( qmark > mailtolength )
778 addresses = url.substring( mailtolength, qmark );
779 else
780 addresses = url.substr( mailtolength );
781 // Let's try to unescape it using a character set
782 try {
783 var characterSet = gContextMenu.target.ownerDocument.characterSet;
784 const textToSubURI = Components.classes["@mozilla.org/intl/texttosuburi;1"]
785 .getService(Components.interfaces.nsITextToSubURI);
786 addresses = textToSubURI.unEscapeURIForUI(characterSet, addresses);
787 }
788 catch(ex) {
789 // Do nothing.
790 }
791 return addresses;
792 }
793
CopyMessageUrl
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
794 function CopyMessageUrl()
795 {
796 try {
797 var hdr = gDBView.hdrForFirstSelectedMessage;
798 var server = hdr.folder.server;
799
800 var url;
801 if (server.isSecure) {
802 url = "snews://";
803 }
804 else {
805 url = "news://"
806 }
807 url += server.hostName;
808 url += ":";
809 url += server.port;
810 url += "/";
811 url += hdr.messageId;
812
813 var contractid = "@mozilla.org/widget/clipboardhelper;1";
814 var iid = Components.interfaces.nsIClipboardHelper;
815 var clipboard = Components.classes[contractid].getService(iid);
816 clipboard.copyString(url);
817 }
818 catch (ex) {
819 dump("ex="+ex+"\n");
820 }
821 }