!import
1 //@line 40 "/home/visbrero/mnt/roisin/rev_control/hg/mozilla/mail/base/content/widgetglue.js"
2
3 /*
4 * widget-specific wrapper glue. There should be one function for every
5 * widget/menu item, which gets some context (like the current selection)
6 * and then calls a function/command in commandglue
7 */
8
9 //The eventual goal is for this file to go away and its contents to be brought into
10 //mailWindowOverlay.js. This is currently being done.
11
12 //NOTE: gMessengerBundle must be defined and set or this Overlay won't work
13
GetSelectedFolderURI
14 function GetSelectedFolderURI()
15 {
16 var folderTree = GetFolderTree();
17 var selection = folderTree.view.selection;
18 if (selection.count == 1)
19 {
20 var startIndex = {};
21 var endIndex = {};
22 selection.getRangeAt(0, startIndex, endIndex);
23 var folderResource = GetFolderResource(folderTree, startIndex.value);
24 return folderResource.Value;
25 }
26
27 return null;
28 }
29
MsgRenameFolder
30 function MsgRenameFolder()
31 {
32 var preselectedURI = GetSelectedFolderURI();
33 var folderTree = GetFolderTree();
34
35 var name = GetFolderNameFromUri(preselectedURI, folderTree);
36
37 dump("preselectedURI = " + preselectedURI + "\n");
38 var dialog = window.openDialog(
39 "chrome://messenger/content/renameFolderDialog.xul",
40 "newFolder",
41 "chrome,titlebar,modal",
42 {preselectedURI: preselectedURI,
43 okCallback: RenameFolder, name: name});
44 }
45
RenameFolder
46 function RenameFolder(name,uri)
47 {
48 dump("uri,name = " + uri + "," + name + "\n");
49 var folderTree = GetFolderTree();
50 if (folderTree)
51 {
52 if (uri && (uri != "") && name && (name != ""))
53 {
54 var selectedFolder = GetResourceFromUri(uri);
55 if (gDBView)
56 gCurrentlyDisplayedMessage = gDBView.currentlyDisplayedMessage;
57
58 ClearThreadPane();
59 ClearMessagePane();
60 folderTree.view.selection.clearSelection();
61
62 try
63 {
64 messenger.renameFolder(GetFolderDatasource(), selectedFolder, name);
65 }
66 catch(e)
67 {
68 SelectFolder(selectedFolder.URI); //restore selection
69 throw(e); // so that the dialog does not automatically close
70 dump ("Exception : RenameFolder \n");
71 }
72 }
73 else
74 {
75 dump("no name or nothing selected\n");
76 }
77 }
78 else
79 {
80 dump("no folder tree\n");
81 }
82 }
83
MsgEmptyTrash
84 function MsgEmptyTrash()
85 {
86 var folderTree = GetFolderTree();
87 var startIndex = {};
88 var endIndex = {};
89 folderTree.view.selection.getRangeAt(0, startIndex, endIndex);
90 if (startIndex.value >= 0)
91 {
92 var folderResource = GetFolderResource(folderTree, startIndex.value);
93 try {
94 messenger.emptyTrash(GetFolderDatasource(), folderResource);
95 }
96 catch(e)
97 {
98 dump ("Exception : messenger.emptyTrash \n");
99 }
100 }
101 }
102
MsgCompactFolder
103 function MsgCompactFolder(isAll)
104 {
105 // Get the selected folders.
106 var selectedFolders = GetSelectedMsgFolders();
107
108 if (selectedFolders.length == 1)
109 {
110 var selectedFolder = selectedFolders[0];
111 var resource = selectedFolder.QueryInterface(Components.interfaces.nsIRDFResource);
112
113 if (selectedFolder.server.type != "imap") //can be local only
114 {
115 var msgfolder = resource.QueryInterface(Components.interfaces.nsIMsgFolder);
116 var expungedBytes = msgfolder.expungedBytes;
117
118 if (expungedBytes > 0)
119 {
120 if (gDBView)
121 gCurrentlyDisplayedMessage = gDBView.currentlyDisplayedMessage;
122
123 ClearThreadPaneSelection();
124 ClearThreadPane();
125 ClearMessagePane();
126 }
127 else
128 {
129 if (!isAll) //you have one local folder with no room to compact
130 return;
131 }
132 }
133 try
134 {
135 messenger.compactFolder(GetFolderDatasource(), resource, isAll);
136 }
137 catch(ex)
138 {
139 dump("Exception : messenger.CompactFolder : " + ex + "\n");
140 }
141 }
142 }
143
openNewVirtualFolderDialogWithArgs
144 function openNewVirtualFolderDialogWithArgs(defaultViewName, aSearchTerms)
145 {
146 var folderURI = GetSelectedFolderURI();
147 var folderTree = GetFolderTree();
148 var name = GetFolderNameFromUri(folderURI, folderTree);
149 name += "-" + defaultViewName;
150
151 var dialog = window.openDialog("chrome://messenger/content/virtualFolderProperties.xul", "",
152 "chrome,titlebar,modal,centerscreen",
153 {preselectedURI:folderURI,
154 searchTerms:aSearchTerms,
155 newFolderName:name});
156 }
157
MsgVirtualFolderProperties
158 function MsgVirtualFolderProperties(aEditExistingVFolder)
159 {
160 var preselectedFolder = GetFirstSelectedMsgFolder();
161 var preselectedURI;
162 if(preselectedFolder)
163 {
164 var preselectedFolderResource = preselectedFolder.QueryInterface(Components.interfaces.nsIRDFResource);
165 if(preselectedFolderResource)
166 preselectedURI = preselectedFolderResource.Value;
167 }
168
169 var dialog = window.openDialog("chrome://messenger/content/virtualFolderProperties.xul", "",
170 "chrome,titlebar,modal,centerscreen",
171 {preselectedURI:preselectedURI,
172 editExistingFolder: aEditExistingVFolder,
173 onOKCallback:onEditVirtualFolderPropertiesCallback,
174 msgWindow:msgWindow});
175 }
176
onEditVirtualFolderPropertiesCallback
177 function onEditVirtualFolderPropertiesCallback(aVirtualFolderURI)
178 {
179 // we need to reload the folder if it is the currently loaded folder...
180 if (gMsgFolderSelected && aVirtualFolderURI == gMsgFolderSelected.URI)
181 {
182 gMsgFolderSelected = null; // force the folder pane to reload the virtual folder
183 FolderPaneSelectionChange();
184 }
185 }
186
187 /**
188 @param tabID initial tab
189 */
MsgFolderProperties
190 function MsgFolderProperties(tabID)
191 {
192 var preselectedURI = GetSelectedFolderURI();
193 var msgFolder = GetMsgFolderFromUri(preselectedURI, true);
194
195 // if a server is selected, view settings for that account
196 if (msgFolder.isServer) {
197 MsgAccountManager(null);
198 return;
199 }
200
201 if (msgFolder.flags & MSG_FOLDER_FLAG_VIRTUAL)
202 {
203 // virtual folders get there own property dialog that contains all of the
204 // search information related to the virtual folder.
205 MsgVirtualFolderProperties(true);
206 return;
207 }
208
209 var serverType = msgFolder.server.type;
210 var folderTree = GetFolderTree();
211 var name = GetFolderNameFromUri(preselectedURI, folderTree);
212 var windowTitle = gMessengerBundle.getString("folderProperties");
213 var dialog = window.openDialog(
214 "chrome://messenger/content/folderProps.xul",
215 "",
216 "chrome,centerscreen,titlebar,modal",
217 {preselectedURI:preselectedURI, serverType:serverType,
218 msgWindow:msgWindow, title:windowTitle,
219 okCallback:FolderProperties,
220 tabID:tabID, name:name,
221 rebuildSummaryCallback:RebuildSummaryFile});
222 }
223
RebuildSummaryFile
224 function RebuildSummaryFile(msgFolder)
225 {
226 var msgDB = msgFolder.getMsgDatabase(msgWindow);
227 msgDB.summaryValid = false;
228 msgFolder.ForceDBClosed();
229 // these two lines will cause the thread pane to get reloaded
230 // when the download/reparse is finished. Only do this
231 // if the selected folder is loaded (i.e., not thru the
232 // context menu on a non-loaded folder).
233 if (msgFolder == GetLoadedMsgFolder())
234 {
235 gRerootOnFolderLoad = true;
236 gCurrentFolderToReroot = msgFolder.URI;
237 }
238 msgFolder.updateFolder(msgWindow);
239 }
240
FolderProperties
241 function FolderProperties(name, oldName, uri)
242 {
243 if (name != oldName)
244 RenameFolder(name, uri);
245 }
246
MsgToggleMessagePane
247 function MsgToggleMessagePane()
248 {
249 var splitter = document.getElementById("threadpane-splitter");
250 var state = splitter.getAttribute("state");
251 if (state == "collapsed")
252 splitter.setAttribute("state", null);
253 else
254 splitter.setAttribute("state", "collapsed")
255
256 ChangeMessagePaneVisibility(IsMessagePaneCollapsed());
257 }
258
259 // Given a URI we would like to return corresponding message folder here.
260 // An additonal input param which specifies whether or not to check folder
261 // attributes (like if there exists a parent or is it a server) is also passed
262 // to this routine. Qualifying against those checks would return an existing
263 // folder. Callers who don't want to check those attributes will specify the
264 // same and then this routine will simply return a msgfolder. This scenario
265 // applies to a new imap account creation where special folders are created
266 // on demand and hence needs to prior check of existence.
GetMsgFolderFromUri
267 function GetMsgFolderFromUri(uri, checkFolderAttributes)
268 {
269 //dump("GetMsgFolderFromUri of " + uri + "\n");
270 var msgfolder = null;
271 try {
272 var resource = GetResourceFromUri(uri);
273 msgfolder = resource.QueryInterface(Components.interfaces.nsIMsgFolder);
274 if (checkFolderAttributes) {
275 if (!(msgfolder && (msgfolder.parent || msgfolder.isServer))) {
276 msgfolder = null;
277 }
278 }
279 }
280 catch (ex) {
281 //dump("failed to get the folder resource\n");
282 }
283 return msgfolder;
284 }
285
GetResourceFromUri
286 function GetResourceFromUri(uri)
287 {
288 var RDF = Components.classes['@mozilla.org/rdf/rdf-service;1'].getService();
289 RDF = RDF.QueryInterface(Components.interfaces.nsIRDFService);
290 var resource = RDF.GetResource(uri);
291
292 return resource;
293 }