!import
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
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
59 function threadPaneOnPopupHiding()
60 {
61 RestoreSelectionWithoutContentLoad(GetThreadTree());
62 }
63
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
116 function SetupNewMessageWindowMenuItem(menuID, numSelected, forceHide)
117 {
118 ShowMenuItem(menuID, (numSelected <= 1) && !forceHide);
119 EnableMenuItem(menuID, (numSelected == 1));
120 }
121
122 function SetupEditAsNewMenuItem(menuID, numSelected, forceHide)
123 {
124 ShowMenuItem(menuID, (numSelected <= 1)&& !forceHide);
125 EnableMenuItem(menuID, (numSelected == 1));
126 }
127
128 function SetupReplyToSenderMenuItem(menuID, numSelected, forceHide)
129 {
130 ShowMenuItem(menuID, (numSelected <= 1)&& !forceHide);
131 EnableMenuItem(menuID, (numSelected == 1));
132 }
133
134 function SetupReplyToNewsgroupMenuItem(menuID, numSelected, isNewsgroup, forceHide)
135 {
136 ShowMenuItem(menuID, (numSelected <= 1) && isNewsgroup && !forceHide);
137 EnableMenuItem(menuID, (numSelected == 1));
138 }
139
140 function SetupReplyAllMenuItem(menuID, numSelected, forceHide)
141 {
142 ShowMenuItem(menuID, (numSelected <= 1) && !forceHide);
143 EnableMenuItem(menuID, (numSelected == 1));
144 }
145
146 function SetupForwardMenuItem(menuID, numSelected, forceHide)
147 {
148 ShowMenuItem(menuID, (numSelected <= 1) && !forceHide);
149 EnableMenuItem(menuID, (numSelected > 0));
150 }
151
152 function SetupForwardAsAttachmentMenuItem(menuID, numSelected, forceHide)
153 {
154 ShowMenuItem(menuID, (numSelected > 1) && !forceHide);
155 EnableMenuItem(menuID, (numSelected > 1));
156 }
157
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
168 function SetupCopyMessageUrlMenuItem(menuID, numSelected, isNewsgroup, forceHide)
169 {
170 ShowMenuItem(menuID, isNewsgroup && !forceHide);
171 EnableMenuItem(menuID, (numSelected > 0));
172 }
173
174 function SetupCopyMenuItem(menuID, numSelected, forceHide)
175 {
176 ShowMenuItem(menuID, !forceHide);
177 EnableMenuItem(menuID, (numSelected > 0));
178 }
179
180 function SetupMoveToFolderAgainMenuItem(menuID, numSelected, forceHide)
181 {
182 ShowMenuItem(menuID, !forceHide);
183 if (!forceHide)
184 initMoveToFolderAgainMenu(document.getElementById(menuID));
185 }
186
187 function SetupLabelsMenuItem(menuID, numSelected, forceHide)
188 {
189 ShowMenuItem(menuID, (numSelected <= 1) && !forceHide);
190 EnableMenuItem(menuID, (numSelected == 1));
191 }
192
193 function SetupTagMenuItem(menuID, numSelected, forceHide)
194 {
195 ShowMenuItem(menuID, (numSelected <= 1) && !forceHide);
196 EnableMenuItem(menuID, (numSelected == 1));
197 }
198
199 function SetupMarkMenuItem(menuID, numSelected, forceHide)
200 {
201 ShowMenuItem(menuID, (numSelected <= 1) && !forceHide);
202 EnableMenuItem(menuID, (numSelected == 1));
203 }
204
205 function SetupSaveAsMenuItem(menuID, numSelected, forceHide)
206 {
207 ShowMenuItem(menuID, (numSelected <= 1) && !forceHide);
208 EnableMenuItem(menuID, (numSelected == 1));
209 }
210
211 function SetupPrintPreviewMenuItem(menuID, numSelected, forceHide)
212 {
213 ShowMenuItem(menuID, (numSelected <= 1) && !forceHide);
214 EnableMenuItem(menuID, (numSelected == 1));
215 }
216
217 function SetupPrintMenuItem(menuID, numSelected, forceHide)
218 {
219 ShowMenuItem(menuID, !forceHide);
220 EnableMenuItem(menuID, (numSelected > 0));
221 }
222
223 function SetupAddSenderToABMenuItem(menuID, numSelected, forceHide)
224 {
225 ShowMenuItem(menuID, (numSelected <= 1) && !forceHide);
226 EnableMenuItem(menuID, false);
227 }
228
229 function SetupAddAllToABMenuItem(menuID, numSelected, forceHide)
230 {
231 ShowMenuItem(menuID, (numSelected <= 1) && !forceHide);
232 EnableMenuItem(menuID, false);
233 }
234
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
247 function FillMessageIdContextMenu(messageIdNode)
248 {
249 if (messageIdNode)
250 {
251 document.getElementById("messageIdContext-messageIdTarget")
252 .setAttribute("label", messageIdNode.getAttribute("messageid"));
253 }
254 }
255
CopyMessageId
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
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
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
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
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
404 function SearchForMessageIdInSubFolder(folder, messageId)
405 {
406 var messageHeader;
407 var subFolders = folder.subFoldersObsolete;
408
409 // search in folder
410 if (!folder.isServer)
411 messageHeader = CheckForMessageIdInFolder(folder, messageId);
412
413 // search subfolders recursively
414 var done = !folder.hasSubFolders;
415 while (!done && !messageHeader)
416 {
417 // search in current folder
418 var currentFolder = subFolders.currentItem().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 try
426 {
427 subFolders.next();
428 }
429 catch(e)
430 {
431 done = true;
432 }
433 }
434
435 return messageHeader;
436 }
437
438 // check folder for corresponding message to given message id
439 // return message header if message was found
CheckForMessageIdInFolder
440 function CheckForMessageIdInFolder(folder, messageId)
441 {
442 var messageDatabase = folder.getMsgDatabase(msgWindow);
443 var messageHeader;
444
445 try
446 {
447 messageHeader = messageDatabase.getMsgHdrForMessageID(messageId);
448 }
449 catch (ex)
450 {
451 dump("Failed to find message-id in folder!");
452 }
453
454 if (!gMailSession)
455 {
456 gMailSession = Components.classes[mailSessionContractID]
457 .getService(Components.interfaces.nsIMsgMailSession);
458 }
459
460 if (!gMailSession.IsFolderOpenInWindow(folder) &&
461 !(folder.flags & (MSG_FOLDER_FLAG_TRASH | MSG_FOLDER_FLAG_INBOX)))
462 {
463 folder.setMsgDatabase(null);
464 }
465
466 return messageHeader;
467 }
468
469 function folderPaneOnPopupHiding()
470 {
471 RestoreSelectionWithoutContentLoad(GetFolderTree());
472 }
473
474 function fillFolderPaneContextMenu()
475 {
476 var folderTree = GetFolderTree();
477 var startIndex = {};
478 var endIndex = {};
479 folderTree.view.selection.getRangeAt(0, startIndex, endIndex);
480 if (startIndex.value < 0)
481 return false;
482 var numSelected = endIndex.value - startIndex.value + 1;
483 var folderResource = GetFolderResource(folderTree, startIndex.value);
484 var folder = GetMsgFolderFromUri(folderResource.Value, false);
485 var isVirtualFolder = folder ? folder.flags & MSG_FOLDER_FLAG_VIRTUAL : false;
486
487 var isServer = GetFolderAttribute(folderTree, folderResource, "IsServer") == 'true';
488 var serverType = GetFolderAttribute(folderTree, folderResource, "ServerType");
489 var specialFolder = GetFolderAttribute(folderTree, folderResource, "SpecialFolder");
490 var canSubscribeToFolder = (serverType == "nntp") || (serverType == "imap");
491 var isNewsgroup = !isServer && serverType == 'nntp';
492 var isMailFolder = !isServer && serverType != 'nntp';
493 var canGetMessages = (isServer && serverType != "none") || isNewsgroup || (serverType == "rss");
494
495 EnableMenuItem("folderPaneContext-properties", true);
496
497 ShowMenuItem("folderPaneContext-getMessages", (numSelected <= 1) && canGetMessages);
498 EnableMenuItem("folderPaneContext-getMessages", true);
499
500 SetupNewMenuItem(folderResource, numSelected, isServer, serverType, specialFolder);
501 SetupRenameMenuItem(folderResource, numSelected, isServer, serverType, specialFolder);
502 SetupRemoveMenuItem(folderResource, numSelected, isServer, serverType, specialFolder);
503 SetupCompactMenuItem(folderResource, numSelected);
504 SetupFavoritesMenuItem(folderResource, numSelected, isServer, 'folderPaneContext-favoriteFolder');
505
506 ShowMenuItem("folderPaneContext-emptyTrash", (numSelected <= 1) && (specialFolder == 'Trash'));
507 EnableMenuItem("folderPaneContext-emptyTrash", true);
508 ShowMenuItem("folderPaneContext-emptyJunk", (numSelected <= 1) && (specialFolder == 'Junk'));
509 EnableMenuItem("folderPaneContext-emptyJunk", true);
510
511 var showSendUnsentMessages = (numSelected <= 1)
512 && (specialFolder == 'Unsent Messages' || specialFolder == 'Unsent');
513 ShowMenuItem("folderPaneContext-sendUnsentMessages", showSendUnsentMessages);
514 if (showSendUnsentMessages)
515 EnableMenuItem("folderPaneContext-sendUnsentMessages", IsSendUnsentMsgsEnabled(folderResource));
516
517 ShowMenuItem("folderPaneContext-subscribe", (numSelected <= 1) && canSubscribeToFolder && !isVirtualFolder);
518 EnableMenuItem("folderPaneContext-subscribe", !isVirtualFolder);
519
520 // XXX: Hack for RSS servers...
521 ShowMenuItem("folderPaneContext-rssSubscribe", (numSelected <= 1) && (serverType == "rss"));
522 EnableMenuItem("folderPaneContext-rssSubscribe", true);
523
524 // News folder context menu =============================================
525 ShowMenuItem("folderPaneContext-newsUnsubscribe", (numSelected <= 1) && canSubscribeToFolder && isNewsgroup);
526 EnableMenuItem("folderPaneContext-newsUnsubscribe", true);
527 ShowMenuItem("folderPaneContext-markNewsgroupAllRead", (numSelected <= 1) && isNewsgroup);
528 EnableMenuItem("folderPaneContext-markNewsgroupAllRead", true);
529 // End of News folder context menu =======================================
530
531 ShowMenuItem("folderPaneContext-markMailFolderAllRead", (numSelected <= 1) && isMailFolder && !isVirtualFolder);
532 EnableMenuItem("folderPaneContext-markMailFolderAllRead", !isVirtualFolder);
533
534 ShowMenuItem("folderPaneContext-searchMessages", (numSelected<=1) && !isVirtualFolder);
535 goUpdateCommand('cmd_search');
536
537 // Hide / Show our menu separators based on the menu items we are showing.
538 ShowMenuItem("folderPaneContext-sep1", (numSelected <= 1) && !isServer);
539 ShowMenuItem('folderPaneContext-sep2', shouldShowSeparator('folderPaneContext-sep2'));
540 ShowMenuItem("folderPaneContext-sep3", shouldShowSeparator('folderPaneContext-sep3')); // we always show the separator before properties menu item
541 return(true);
542 }
543
544 function SetupNewMenuItem(folderResource, numSelected, isServer, serverType,specialFolder)
545 {
546 var folderTree = GetFolderTree();
547 var canCreateNew = GetFolderAttribute(folderTree, folderResource, "CanCreateSubfolders") == "true";
548 var isInbox = specialFolder == "Inbox";
549 var isIMAPFolder = GetFolderAttribute(folderTree, folderResource,
550 "ServerType") == "imap";
551
552 var ioService = Components.classes["@mozilla.org/network/io-service;1"]
553 .getService(Components.interfaces.nsIIOService);
554
555 var showNew = ((numSelected <=1) && (serverType != 'nntp') && canCreateNew) || isInbox;
556 ShowMenuItem("folderPaneContext-new", showNew);
557
558 EnableMenuItem("folderPaneContext-new", !isIMAPFolder || MailOfflineMgr.isOnline());
559
560 if (showNew)
561 {
562 if (isServer || isInbox)
563 SetMenuItemLabel("folderPaneContext-new", gMessengerBundle.getString("newFolder"));
564 else
565 SetMenuItemLabel("folderPaneContext-new", gMessengerBundle.getString("newSubfolder"));
566 }
567 }
568
569 function SetupRenameMenuItem(folderResource, numSelected, isServer, serverType, specialFolder)
570 {
571 var msgFolder = folderResource.QueryInterface(Components.interfaces.nsIMsgFolder);
572 var folderTree = GetFolderTree();
573 var isSpecialFolder = !(specialFolder == "none" || (specialFolder == "Junk" && CanRenameDeleteJunkMail(msgFolder.URI))
574 || (specialFolder == "Virtual") );
575 var canRename = GetFolderAttribute(folderTree, folderResource, "CanRename") == "true";
576
577 ShowMenuItem("folderPaneContext-rename", (numSelected <= 1) && !isServer && !isSpecialFolder && canRename);
578 var folder = GetMsgFolderFromResource(folderResource);
579 EnableMenuItem("folderPaneContext-rename", !isServer && folder.isCommandEnabled("cmd_renameFolder"));
580 }
581
582 function SetupRemoveMenuItem(folderResource, numSelected, isServer, serverType, specialFolder)
583 {
584 var msgFolder = folderResource.QueryInterface(Components.interfaces.nsIMsgFolder);
585 var isMail = serverType != 'nntp';
586 var isSpecialFolder = !(specialFolder == "none" || (specialFolder == "Junk" && CanRenameDeleteJunkMail(msgFolder.URI))
587 || (specialFolder == "Virtual") );
588 //Can't currently delete Accounts or special folders.
589 var showRemove = (numSelected <=1) && (isMail && !isSpecialFolder) && !isServer;
590
591 ShowMenuItem("folderPaneContext-remove", showRemove);
592 if(showRemove)
593 {
594 var folder = GetMsgFolderFromResource(folderResource);
595 EnableMenuItem("folderPaneContext-remove", folder.isCommandEnabled("cmd_delete"));
596 }
597 }
598
599 function SetupCompactMenuItem(folderResource, numSelected)
600 {
601 var folderTree = GetFolderTree();
602 var canCompact = GetFolderAttribute(folderTree, folderResource, "CanCompact") == "true";
603 var folder = GetMsgFolderFromResource(folderResource);
604 ShowMenuItem("folderPaneContext-compact", (numSelected <=1) && canCompact && !(folder.flags & MSG_FOLDER_FLAG_VIRTUAL));
605 EnableMenuItem("folderPaneContext-compact", folder.isCommandEnabled("cmd_compactFolder") && !(folder.flags & MSG_FOLDER_FLAG_VIRTUAL));
606 }
607
608 function SetupFavoritesMenuItem(folderResource, numSelected, isServer, menuItemId)
609 {
610 var folderTree = GetFolderTree();
611 var folder = GetMsgFolderFromResource(folderResource);
612 var showItem = !isServer && (numSelected <=1);
613 ShowMenuItem(menuItemId, showItem);
614
615 // adjust the checked state on the menu
616 if (showItem)
617 document.getElementById(menuItemId).setAttribute('checked',folder.getFlag(MSG_FOLDER_FLAG_FAVORITE));
618 }
619
620 function ShowMenuItem(id, showItem)
621 {
622 var item = document.getElementById(id);
623 if(item && item.hidden != "true")
624 item.hidden = !showItem;
625 }
626
627 function EnableMenuItem(id, enableItem)
628 {
629 var item = document.getElementById(id);
630 if(item)
631 {
632 var enabled = (item.getAttribute('disabled') !='true');
633 if(enableItem != enabled)
634 {
635 item.setAttribute('disabled', enableItem ? '' : 'true');
636 }
637 }
638 }
639
640 function SetMenuItemLabel(id, label)
641 {
642 var item = document.getElementById(id);
643 if(item)
644 item.setAttribute('label', label);
645 }
646
647 function SetMenuItemAccessKey(id, accessKey)
648 {
649 var item = document.getElementById(id);
650 if(item)
651 item.setAttribute('accesskey', accessKey);
652 }
653
654 function fillMessagePaneContextMenu()
655 {
656 var message = GetLoadedMessage();
657 var numSelected = (message) ? 1 : 0;
658
659 var isNewsgroup = false;
660
661 if (numSelected == 1)
662 isNewsgroup = IsNewsMessage(message);
663
664 // don't show mail items for links/images, just show related items.
665 var hideMailItems = gContextMenu.onImage || gContextMenu.onLink;
666
667 SetupEditAsNewMenuItem("messagePaneContext-editAsNew", numSelected, (numSelected == 0 || hideMailItems));
668 SetupReplyToSenderMenuItem("messagePaneContext-replySender", numSelected, (numSelected == 0 || hideMailItems));
669 SetupReplyToNewsgroupMenuItem("messagePaneContext-replyNewsgroup", numSelected, isNewsgroup, (numSelected == 0 || hideMailItems));
670 SetupReplyAllMenuItem("messagePaneContext-replyAll" , numSelected, (numSelected == 0 || hideMailItems));
671 SetupForwardMenuItem("messagePaneContext-forward", numSelected, (numSelected == 0 || hideMailItems));
672 SetupCopyMessageUrlMenuItem("messagePaneContext-copyMessageUrl", numSelected, isNewsgroup, (numSelected == 0 || hideMailItems));
673 SetupCopyMenuItem("messagePaneContext-copyMenu", numSelected, (numSelected == 0 || hideMailItems));
674 SetupMoveMenuItem("messagePaneContext-moveMenu", numSelected, isNewsgroup, (numSelected == 0 || hideMailItems));
675 SetupMoveToFolderAgainMenuItem("messagePaneContext-moveToFolderAgain", numSelected, (numSelected == 0 || hideMailItems));
676 SetupLabelsMenuItem("messagePaneContext-labels", numSelected, (numSelected == 0 || hideMailItems));
677 SetupMarkMenuItem("messagePaneContext-mark", numSelected, (numSelected == 0 || hideMailItems));
678 SetupTagMenuItem("messagePaneContext-tags", numSelected, (numSelected == 0 || hideMailItems));
679 SetupSaveAsMenuItem("messagePaneContext-saveAs", numSelected, (numSelected == 0 || hideMailItems));
680 //@line 723 "/home/visbrero/mnt/roisin/rev_control/hg/mozilla/mail/base/content/mailContextMenus.js"
681 SetupPrintPreviewMenuItem("messagePaneContext-printpreview", numSelected, true);
682 //@line 727 "/home/visbrero/mnt/roisin/rev_control/hg/mozilla/mail/base/content/mailContextMenus.js"
683
684 SetupPrintMenuItem("messagePaneContext-print", numSelected, (numSelected == 0 || hideMailItems));
685 if (numSelected == 0 || hideMailItems)
686 ShowMenuItem("messagePaneContext-delete", false)
687 else {
688 goUpdateCommand('cmd_delete');
689 ShowMenuItem("messagePaneContext-delete", true)
690 }
691 SetupAddSenderToABMenuItem("messagePaneContext-addSenderToAddressBook", numSelected, (numSelected == 0 || hideMailItems));
692 SetupAddAllToABMenuItem("messagePaneContext-addAllToAddressBook", numSelected, (numSelected == 0 || hideMailItems));
693
694 ShowMenuItem("context-addemail", gContextMenu.onMailtoLink );
695 ShowMenuItem("context-composeemailto", gContextMenu.onMailtoLink );
696
697 ShowMenuItem("reportPhishingURL", gContextMenu.onLink && !gContextMenu.onMailtoLink);
698
699 // if we are on an image, go ahead and show this separator
700 //if (gContextMenu.onLink && !gContextMenu.onMailtoLink)
701 // ShowMenuItem("messagePaneContext-sep-edit", false);
702
703 //Figure out separators
704 ShowMenuItem("messagePaneContext-sep-link", shouldShowSeparator("messagePaneContext-sep-link"));
705 ShowMenuItem("messagePaneContext-sep-open", shouldShowSeparator("messagePaneContext-sep-open"));
706 ShowMenuItem("messagePaneContext-sep-reply", shouldShowSeparator("messagePaneContext-sep-reply"));
707 ShowMenuItem("messagePaneContext-sep-tags-1", shouldShowSeparator("messagePaneContext-sep-tags-1"));
708 ShowMenuItem("messagePaneContext-sep-saveAs", shouldShowSeparator("messagePaneContext-sep-saveAs"));
709 ShowMenuItem("messagePaneContext-sep-edit", shouldShowSeparator("messagePaneContext-sep-edit"));
710 ShowMenuItem("messagePaneContext-sep-copy", shouldShowSeparator("messagePaneContext-sep-copy"));
711 ShowMenuItem("messagePaneContext-sep-reportPhishing", shouldShowSeparator("messagePaneContext-sep-reportPhishing"));
712 }
713
714 // Determines whether or not the separator with the specified ID should be
715 // shown or not by determining if there are any non-hidden items between it
716 // and the previous separator. You should start with the first separator in the menu.
shouldShowSeparator
717 function shouldShowSeparator(aSeparatorID)
718 {
719 var separator = document.getElementById(aSeparatorID);
720 if (separator)
721 {
722 var sibling = separator.previousSibling;
723 while (sibling)
724 {
725 if (sibling.getAttribute("hidden") != "true")
726 return sibling.localName != "menuseparator" && hasAVisibleNextSibling(separator);
727 sibling = sibling.previousSibling;
728 }
729 }
730 return false;
731 }
732
733 // helper function used by shouldShowSeparator
hasAVisibleNextSibling
734 function hasAVisibleNextSibling(aNode)
735 {
736 var sibling = aNode.nextSibling;
737 while (sibling)
738 {
739 if (sibling.getAttribute("hidden") != "true"
740 && sibling.localName != "menuseparator")
741 return true;
742 sibling = sibling.nextSibling;
743 }
744 return false;
745 }
746
747 function IsMenuItemShowing(menuID)
748 {
749 var item = document.getElementById(menuID);
750 if (item)
751 return item.hidden != "true";
752 return false;
753 }
754
755 // message pane context menu helper methods
addEmail
756 function addEmail()
757 {
758 var url = gContextMenu.linkURL;
759 var addresses = getEmail(url);
760 window.openDialog("chrome://messenger/content/addressbook/abNewCardDialog.xul",
761 "",
762 "chrome,resizable=no,titlebar,modal,centerscreen",
763 {primaryEmail: addresses});
764 }
765
composeEmailTo
766 function composeEmailTo ()
767 {
768 var url = gContextMenu.linkURL;
769 var addresses = getEmail(url);
770 var fields = Components.classes["@mozilla.org/messengercompose/composefields;1"].createInstance(Components.interfaces.nsIMsgCompFields);
771 var params = Components.classes["@mozilla.org/messengercompose/composeparams;1"].createInstance(Components.interfaces.nsIMsgComposeParams);
772 fields.to = addresses;
773 params.type = Components.interfaces.nsIMsgCompType.New;
774 params.format = Components.interfaces.nsIMsgCompFormat.Default;
775 params.identity = accountManager.getFirstIdentityForServer(GetLoadedMsgFolder().server);
776 params.composeFields = fields;
777 msgComposeService.OpenComposeWindowWithParams(null, params);
778 }
779
780 // Extracts email address from url string
getEmail
781 function getEmail (url)
782 {
783 var qmark = url.indexOf( "?" );
784 var addresses;
785
786 if ( qmark > mailtolength )
787 addresses = url.substring( mailtolength, qmark );
788 else
789 addresses = url.substr( mailtolength );
790 // Let's try to unescape it using a character set
791 try {
792 var characterSet = gContextMenu.target.ownerDocument.characterSet;
793 const textToSubURI = Components.classes["@mozilla.org/intl/texttosuburi;1"]
794 .getService(Components.interfaces.nsITextToSubURI);
795 addresses = textToSubURI.unEscapeURIForUI(characterSet, addresses);
796 }
797 catch(ex) {
798 // Do nothing.
799 }
800 return addresses;
801 }
802
CopyMessageUrl
803 function CopyMessageUrl()
804 {
805 try {
806 var hdr = gDBView.hdrForFirstSelectedMessage;
807 var server = hdr.folder.server;
808
809 var url;
810 if (server.isSecure) {
811 url = "snews://";
812 }
813 else {
814 url = "news://"
815 }
816 url += server.hostName;
817 url += ":";
818 url += server.port;
819 url += "/";
820 url += hdr.messageId;
821
822 var contractid = "@mozilla.org/widget/clipboardhelper;1";
823 var iid = Components.interfaces.nsIClipboardHelper;
824 var clipboard = Components.classes[contractid].getService(iid);
825 clipboard.copyString(url);
826 }
827 catch (ex) {
828 dump("ex="+ex+"\n");
829 }
830 }