!import
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1 /* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2 * ***** BEGIN LICENSE BLOCK *****
3 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
4 *
5 * The contents of this file are subject to the Mozilla Public License Version
6 * 1.1 (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 * http://www.mozilla.org/MPL/
9 *
10 * Software distributed under the License is distributed on an "AS IS" basis,
11 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12 * for the specific language governing rights and limitations under the
13 * License.
14 *
15 * The Original Code is mozilla.org Code.
16 *
17 * The Initial Developer of the Original Code is
18 * Netscape Communications Corporation.
19 * Portions created by the Initial Developer are Copyright (C) 2002
20 * the Initial Developer. All Rights Reserved.
21 *
22 * Contributor(s):
23 * Scott MacGregor <mscott@netscape.com>
24 * Seth Spitzer <sspitzer@netscape.com>
25 * Karsten Düsterloh <mnyromyr@tprac.de>
26 *
27 * Alternatively, the contents of this file may be used under the terms of
28 * either of the GNU General Public License Version 2 or later (the "GPL"),
29 * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
30 * in which case the provisions of the GPL or the LGPL are applicable instead
31 * of those above. If you wish to allow use of your version of this file only
32 * under the terms of either the GPL or the LGPL, and not to allow others to
33 * use your version of this file under the terms of the MPL, indicate your
34 * decision by deleting the provisions above and replace them with the notice
35 * and other provisions required by the GPL or the LGPL. If you do not delete
36 * the provisions above, a recipient may use your version of this file under
37 * the terms of any one of the MPL, the GPL or the LGPL.
38 *
39 * ***** END LICENSE BLOCK ***** */
40
41 // menuitem value constants
42 // tag views have kViewTagMarker + their key as value
43 const kViewItemAll = 0;
44 const kViewItemUnread = 1;
45 const kViewItemTags = 2; // former labels used values 2-6
46 const kViewItemVirtual = 7;
47 const kViewItemCustomize = 8;
48 const kViewItemFirstCustom = 9;
49
50 const kViewCurrent = "current-view";
51 const kViewCurrentTag = "current-view-tag";
52 const kViewTagMarker = ":";
53
54 var gMailViewList = null;
55 var gCurrentViewValue = kViewItemAll;
56 var gCurrentViewLabel = "";
57 var gSaveDefaultSVTerms;
58
59 var nsMsgSearchScope = Components.interfaces.nsMsgSearchScope;
60 var nsMsgSearchAttrib = Components.interfaces.nsMsgSearchAttrib;
61 var nsMsgSearchOp = Components.interfaces.nsMsgSearchOp;
62
63
64 // perform the view/action requested by the aValue string
65 // and set the view picker label to the aLabel string
ViewChange
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
66 function ViewChange(aValue, aLabel)
67 {
68 if (aValue == kViewItemCustomize || aValue == kViewItemVirtual)
69 {
70 // restore to the previous view value, in case they cancel
71 UpdateViewPicker(gCurrentViewValue, gCurrentViewLabel);
72 if (aValue == kViewItemCustomize)
73 LaunchCustomizeDialog();
74 else
75 openNewVirtualFolderDialogWithArgs(gCurrentViewLabel, gSaveDefaultSVTerms);
76 return;
77 }
78
79 // persist the view
80 gCurrentViewValue = aValue;
81 gCurrentViewLabel = aLabel;
82 SetMailViewForFolder(GetFirstSelectedMsgFolder(), gCurrentViewValue)
83 UpdateViewPicker(gCurrentViewValue, gCurrentViewLabel);
84
85 // tag menuitem values are of the form :<keyword>
86 if (isNaN(aValue))
87 {
88 // split off the tag key
89 var tagkey = aValue.substr(kViewTagMarker.length);
90 ViewTagKeyword(tagkey);
91 }
92 else
93 {
94 var numval = Number(aValue);
95 switch (numval)
96 {
97 case kViewItemAll: // View All
98 gDefaultSearchViewTerms = null;
99 break;
100 case kViewItemUnread: // Unread
101 ViewNewMail();
102 break;
103 default:
104 // for legacy reasons, custom views start at index 9
105 LoadCustomMailView(numval - kViewItemFirstCustom);
106 break;
107 }
108 }
109 gSaveDefaultSVTerms = gDefaultSearchViewTerms;
110 onEnterInSearchBar();
111 gQSViewIsDirty = true;
112 }
113
114
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
115 function ViewChangeByMenuitem(aMenuitem)
116 {
117 // Mac View menu menuitems don't have XBL bindings
118 ViewChange(aMenuitem.getAttribute("value"), aMenuitem.getAttribute("label"));
119 }
120
121
ViewChangeByValue
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
122 function ViewChangeByValue(aValue)
123 {
124 var label = "";
125 var viewPickerPopup = document.getElementById("viewPickerPopup");
126 if (viewPickerPopup)
127 {
128 // grab the label for the menulist from one of its menuitems
129 var selectedItems = viewPickerPopup.getElementsByAttribute("value", aValue);
130 if (!selectedItems || !selectedItems.length)
131 {
132 // we may have a new item
133 RefreshAllViewPopups(viewPickerPopup, true);
134 selectedItems = viewPickerPopup.getElementsByAttribute("value", aValue);
135 }
136 label = selectedItems && selectedItems.length && selectedItems.item(0).label;
137 }
138 ViewChange(aValue, label);
139 }
140
141
ViewChangeByFolder
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
142 function ViewChangeByFolder(aFolder)
143 {
144 var result = GetMailViewForFolder(aFolder);
145 ViewChangeByValue(result);
146 }
147
148
UpdateViewPicker
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
149 function UpdateViewPicker(aValue, aLabel)
150 {
151 var viewPicker = document.getElementById("viewPicker");
152 if (viewPicker)
153 {
154 viewPicker.value = aValue;
155 viewPicker.setAttribute("label", aLabel);
156 }
157 }
158
159
GetFolderInfo
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
160 function GetFolderInfo(aFolder)
161 {
162 if (aFolder)
163 {
164 var db = aFolder.getMsgDatabase(msgWindow);
165 if (db)
166 return db.dBFolderInfo;
167 }
168 return null;
169 }
170
171
GetMailViewForFolder
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
172 function GetMailViewForFolder(aFolder)
173 {
174 var val = "";
175 var folderInfo = GetFolderInfo(aFolder);
176 if (folderInfo)
177 {
178 val = folderInfo.getCharProperty(kViewCurrentTag);
179 if (!val)
180 {
181 // no new view value, thus using the old
182 var numval = folderInfo.getUint32Property(kViewCurrent, kViewItemAll);
183 // and migrate it, if it's a former label view (label views used values 2-6)
184 if ((kViewItemTags <= numval) && (numval < kViewItemVirtual))
185 val = kViewTagMarker + "$label" + (val - 1);
186 else
187 val = numval;
188 }
189 }
190 return val;
191 }
192
193
SetMailViewForFolder
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
194 function SetMailViewForFolder(aFolder, aValue)
195 {
196 var folderInfo = GetFolderInfo(aFolder);
197 if (folderInfo)
198 {
199 // we can't map tags back to labels in general,
200 // so set view to all for backwards compatibility in this case
201 folderInfo.setUint32Property (kViewCurrent, isNaN(aValue) ? kViewItemAll : aValue);
202 folderInfo.setCharProperty(kViewCurrentTag, aValue);
203 }
204 }
205
206
LaunchCustomizeDialog
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
207 function LaunchCustomizeDialog()
208 {
209 OpenOrFocusWindow({}, "mailnews:mailviewlist", "chrome://messenger/content/mailViewList.xul");
210 }
211
212
LoadCustomMailView
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
213 function LoadCustomMailView(index)
214 {
215 PrepareForViewChange();
216 var searchTermsArrayForQS = CreateGroupedSearchTerms(gMailViewList.getMailViewAt(index).searchTerms);
217 createSearchTermsWithList(searchTermsArrayForQS);
218 AddVirtualFolderTerms(searchTermsArrayForQS);
219 gDefaultSearchViewTerms = searchTermsArrayForQS;
220 }
221
222
ViewTagKeyword
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
223 function ViewTagKeyword(keyword)
224 {
225 PrepareForViewChange();
226
227 // create an i supports array to store our search terms
228 var searchTermsArray = Components.classes["@mozilla.org/supports-array;1"]
229 .createInstance(Components.interfaces.nsISupportsArray);
230 var term = gSearchSession.createTerm();
231 var value = term.value;
232
233 value.str = keyword;
234 value.attrib = nsMsgSearchAttrib.Keywords;
235 term.value = value;
236 term.attrib = nsMsgSearchAttrib.Keywords;
237 term.op = nsMsgSearchOp.Contains;
238 term.booleanAnd = true;
239
240 searchTermsArray.AppendElement(term);
241 AddVirtualFolderTerms(searchTermsArray);
242 createSearchTermsWithList(searchTermsArray);
243 gDefaultSearchViewTerms = searchTermsArray;
244 }
245
246
ViewNewMail
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
247 function ViewNewMail()
248 {
249 PrepareForViewChange();
250
251 // create an i supports array to store our search terms
252 var searchTermsArray = Components.classes["@mozilla.org/supports-array;1"]
253 .createInstance(Components.interfaces.nsISupportsArray);
254 var term = gSearchSession.createTerm();
255 var value = term.value;
256
257 value.status = 1;
258 value.attrib = nsMsgSearchAttrib.MsgStatus;
259 term.value = value;
260 term.attrib = nsMsgSearchAttrib.MsgStatus;
261 term.op = nsMsgSearchOp.Isnt;
262 term.booleanAnd = true;
263 searchTermsArray.AppendElement(term);
264
265 AddVirtualFolderTerms(searchTermsArray);
266
267 createSearchTermsWithList(searchTermsArray);
268 // not quite right - these want to be just the view terms...but it might not matter.
269 gDefaultSearchViewTerms = searchTermsArray;
270 }
271
272
AddVirtualFolderTerms
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
273 function AddVirtualFolderTerms(searchTermsArray)
274 {
275 // add in any virtual folder terms
276 var virtualFolderSearchTerms = (gVirtualFolderTerms || gXFVirtualFolderTerms);
277 if (virtualFolderSearchTerms)
278 {
279 var isupports = null;
280 var searchTerm;
281 var termsArray = virtualFolderSearchTerms.QueryInterface(Components.interfaces.nsISupportsArray);
282 for (var i = 0; i < termsArray.Count(); i++)
283 {
284 isupports = termsArray.GetElementAt(i);
285 searchTerm = isupports.QueryInterface(Components.interfaces.nsIMsgSearchTerm);
286 searchTermsArray.AppendElement(searchTerm);
287 }
288 }
289 }
290
291
PrepareForViewChange
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
292 function PrepareForViewChange()
293 {
294 // this is a problem - it saves the current view in gPreQuickSearchView
295 // then we eventually call onEnterInSearchBar, and we think we need to restore the pre search view!
296 initializeSearchBar();
297 ClearThreadPaneSelection();
298 ClearMessagePane();
299 }
300
301
302 // refresh view popup and its subpopups
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
303 function RefreshAllViewPopups(aViewPopup, aIsMenulist)
304 {
305 RefreshViewPopup(aViewPopup, aIsMenulist);
306 var menupopups = aViewPopup.getElementsByTagName("menupopup");
307 if (menupopups.length > 1)
308 {
309 // when we have menupopups, we assume both tags and custom views are there
310 RefreshTagsPopup(menupopups[0], aIsMenulist);
311 RefreshCustomViewsPopup(menupopups[1], aIsMenulist);
312 }
313 }
314
315
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
316 function RefreshViewPopup(aViewPopup, aIsMenulist)
317 {
318 // mark default views if selected
319 if (!aIsMenulist)
320 {
321 var viewAll = aViewPopup.getElementsByAttribute("value", kViewItemAll)[0];
322 viewAll.setAttribute("checked", gCurrentViewValue == kViewItemAll);
323 var viewUnread = aViewPopup.getElementsByAttribute("value", kViewItemUnread)[0];
324 viewUnread.setAttribute("checked", gCurrentViewValue == kViewItemUnread);
325 }
326 }
327
328
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
329 function RefreshCustomViewsPopup(aMenupopup, aIsMenulist)
330 {
331 // for each mail view in the msg view list, add an entry in our combo box
332 if (!gMailViewList)
333 gMailViewList = Components.classes["@mozilla.org/messenger/mailviewlist;1"]
334 .getService(Components.interfaces.nsIMsgMailViewList);
335 // remove all menuitems
336 while (aMenupopup.hasChildNodes())
337 aMenupopup.removeChild(aMenupopup.lastChild);
338
339 // now rebuild the list
340 var currentView = isNaN(gCurrentViewValue) ? kViewItemAll : Number(gCurrentViewValue);
341 var numItems = gMailViewList.mailViewCount;
342 for (var i = 0; i < numItems; ++i)
343 {
344 var viewInfo = gMailViewList.getMailViewAt(i);
345 var menuitem = document.createElement("menuitem");
346 menuitem.setAttribute("label", viewInfo.prettyName);
347 menuitem.setAttribute("value", kViewItemFirstCustom + i);
348 if (!aIsMenulist)
349 {
350 menuitem.setAttribute("type", "radio");
351 if (kViewItemFirstCustom + i == currentView)
352 menuitem.setAttribute("checked", true);
353 }
354 aMenupopup.appendChild(menuitem);
355 }
356 }
357
358
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
359 function RefreshTagsPopup(aMenupopup, aIsMenulist)
360 {
361 // remove all menuitems
362 while (aMenupopup.hasChildNodes())
363 aMenupopup.removeChild(aMenupopup.lastChild);
364
365 // create tag menuitems
366 var currentTagKey = isNaN(gCurrentViewValue) ? gCurrentViewValue.substr(kViewTagMarker.length) : "";
367 var tagService = Components.classes["@mozilla.org/messenger/tagservice;1"]
368 .getService(Components.interfaces.nsIMsgTagService);
369 var tagArray = tagService.getAllTags({});
370 for (var i = 0; i < tagArray.length; ++i)
371 {
372 var tagInfo = tagArray[i];
373 var menuitem = document.createElement("menuitem");
374 menuitem.setAttribute("label", tagInfo.tag);
375 menuitem.setAttribute("value", kViewTagMarker + tagInfo.key);
376 if (!aIsMenulist)
377 {
378 menuitem.setAttribute("type", "radio");
379 if (tagInfo.key == currentTagKey)
380 menuitem.setAttribute("checked", true);
381 }
382 var color = tagInfo.color;
383 if (color)
384 menuitem.setAttribute("class", "lc-" + color.substr(1));
385 aMenupopup.appendChild(menuitem);
386 }
387 }
388
389
ViewPickerOnLoad
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
390 function ViewPickerOnLoad()
391 {
392 var viewPickerPopup = document.getElementById("viewPickerPopup");
393 if (viewPickerPopup)
394 RefreshAllViewPopups(viewPickerPopup, true);
395 }
396
397
398 window.addEventListener("load", ViewPickerOnLoad, false);