1 | var bitsFavoriteFolder = { |
---|
2 | _xmlfile : null, |
---|
3 | _xmldoc : null, |
---|
4 | |
---|
5 | get idMENU() { return "bitsFavoriteFolderMenu"; }, |
---|
6 | get idMENU_ALL() { return "bitsFavoriteFolderAllMenuitem"; }, |
---|
7 | get idMENU_SELECT(){ return "bitsFavoriteFolderSelectMenuitem"; }, |
---|
8 | |
---|
9 | get idCMENU() { return "bitsFavoriteFolderContextmenu"; }, |
---|
10 | |
---|
11 | get MENU() { return document.getElementById(this.idMENU); }, |
---|
12 | get MENU_ALL() { return document.getElementById(this.idMENU_ALL); }, |
---|
13 | |
---|
14 | get CMENU() { return document.getElementById(this.idCMENU); }, |
---|
15 | |
---|
16 | get TITLE() { return window.top.document.getElementById("sidebar-title"); }, |
---|
17 | |
---|
18 | get STRING() { return window.top.document.getElementById("MarkingCollectionOverlayString"); }, |
---|
19 | get DataSource(){ return window.top.bitsObjectMng.DataSource; }, |
---|
20 | get Common() { return window.top.bitsObjectMng.Common; }, |
---|
21 | get XPath() { return window.top.bitsObjectMng.XPath; }, |
---|
22 | get Database() { return window.top.bitsObjectMng.Database; }, |
---|
23 | get gBrowser() { return window.top.bitsObjectMng.getBrowser();}, |
---|
24 | |
---|
25 | get xmldoc() { return this._xmldoc; }, |
---|
26 | get xmlurl() { return (this._xmlfile?this.Common.convertFilePathToURL(this._xmlfile.path):""); }, |
---|
27 | |
---|
28 | get confirmDelete(){ return true; }, |
---|
29 | |
---|
30 | baseURL : "", |
---|
31 | shouldRebuild : false, |
---|
32 | |
---|
33 | init : function(){ |
---|
34 | var extensionDir = this.Common.getExtensionDir().clone(); |
---|
35 | if(extensionDir){ |
---|
36 | this._xmlfile = extensionDir.clone(); |
---|
37 | this._xmlfile.append("favoritefolder.xml"); |
---|
38 | if(!this._xmlfile.exists()){ |
---|
39 | var aContent = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n'; |
---|
40 | aContent += '<!DOCTYPE folders>\n<folders/>\n'; |
---|
41 | this.Common.writeFile(this._xmlfile,aContent,"UTF-8"); |
---|
42 | } |
---|
43 | function _loadXMLDocument(pUri){ |
---|
44 | if(pUri == undefined) return undefined; |
---|
45 | var xmlDocument = window.top.bitsMarkingCollection.loadXMLDocument(pUri); |
---|
46 | if(xmlDocument){ |
---|
47 | return xmlDocument; |
---|
48 | }else{ |
---|
49 | return undefined; |
---|
50 | } |
---|
51 | } |
---|
52 | function _createXMLDocument(aXMLFile){ |
---|
53 | if(!aXMLFile) return undefined; |
---|
54 | try{ |
---|
55 | return _loadXMLDocument(bitsFavoriteFolder.Common.IO.newFileURI(aXMLFile).spec); |
---|
56 | }catch(ex){ |
---|
57 | bitsFavoriteFolder._dump("bitsFavoriteFolder._createXMLDocument():"+ ex); |
---|
58 | return undefined; |
---|
59 | } |
---|
60 | } |
---|
61 | this._xmldoc = _createXMLDocument(this._xmlfile); |
---|
62 | } |
---|
63 | this.MENU.setAttribute("datasources",this.xmlurl); |
---|
64 | |
---|
65 | }, |
---|
66 | |
---|
67 | done : function(){}, |
---|
68 | |
---|
69 | rebuild : function(){}, |
---|
70 | |
---|
71 | xmlflash : function(){ |
---|
72 | var s = new XMLSerializer(); |
---|
73 | var xml = s.serializeToString(this.xmldoc); |
---|
74 | this.Common.writeFile(this._xmlfile, xml+"\n","UTF-8"); |
---|
75 | |
---|
76 | this.MENU.removeAttribute("datasources"); |
---|
77 | setTimeout(function(){bitsFavoriteFolder.MENU.setAttribute("datasources",bitsFavoriteFolder.xmlurl);},0); |
---|
78 | |
---|
79 | var contentWindow; |
---|
80 | var mcTreeFavoriteFolder; |
---|
81 | if(bitsMarkingCollection._contentWindow) contentWindow = bitsMarkingCollection._contentWindow; |
---|
82 | if(contentWindow && contentWindow.mcTreeFavoriteFolder) mcTreeFavoriteFolder = contentWindow.mcTreeFavoriteFolder; |
---|
83 | |
---|
84 | if(mcTreeFavoriteFolder){ |
---|
85 | mcTreeFavoriteFolder.MENU.removeAttribute("datasources"); |
---|
86 | setTimeout(function(){mcTreeFavoriteFolder.MENU.setAttribute("datasources",bitsFavoriteFolder.xmlurl);},0); |
---|
87 | } |
---|
88 | }, |
---|
89 | |
---|
90 | AddFavoriteFolder : function(aFolder){ |
---|
91 | var results = this.XPath.evaluateArray('//folder[@fid="'+aFolder.fid+'" and @dbtype="'+aFolder.dbtype+'"]',this.xmldoc); |
---|
92 | if(results.length){ |
---|
93 | if(!this.Common.confirm(this.STRING.getString("CONFIRM_REGISTERED_FAVORITE_FOLDER"))) return; |
---|
94 | } |
---|
95 | |
---|
96 | if(this.xmldoc){ |
---|
97 | var node = this.xmldoc.createElement("folder"); |
---|
98 | node.setAttribute("title",aFolder.title); |
---|
99 | node.setAttribute("dbtype",aFolder.dbtype); |
---|
100 | node.setAttribute("fid",aFolder.fid); |
---|
101 | this.xmldoc.documentElement.appendChild(node); |
---|
102 | |
---|
103 | this.xmlflash(); |
---|
104 | |
---|
105 | } |
---|
106 | }, |
---|
107 | |
---|
108 | onPopupShowing : function(aEvent, aPopupRoot){ |
---|
109 | var r_fid = nsPreferences.copyUnicharPref("wiredmarker.rootfolder"); |
---|
110 | var r_dbtype = nsPreferences.copyUnicharPref("wiredmarker.rootfolder_dbtype"); |
---|
111 | if(!r_fid || !r_dbtype){ |
---|
112 | this.MENU_ALL.setAttribute("disabled","true"); |
---|
113 | }else{ |
---|
114 | this.MENU_ALL.removeAttribute("disabled"); |
---|
115 | } |
---|
116 | |
---|
117 | var results = this.XPath.evaluateArray('//folder[@fid and @dbtype]',this.xmldoc); |
---|
118 | if(results.length){ |
---|
119 | var osString = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULRuntime).OS; |
---|
120 | var parser = new DOMParser(); |
---|
121 | var i; |
---|
122 | for(i=0;i<results.length;i++){ |
---|
123 | try{ |
---|
124 | var attr = results[i].attributes; |
---|
125 | var j; |
---|
126 | if(osString != "Darwin"){ |
---|
127 | var elemMenuitem = top.document.createElement("menuitem"); |
---|
128 | for(j=0;j<attr.length;j++){ |
---|
129 | elemMenuitem.setAttribute(attr[j].name,attr[j].value); |
---|
130 | } |
---|
131 | elemMenuitem.setAttribute("label",results[i].getAttribute("title")); |
---|
132 | elemMenuitem.setAttribute("contextmenu","bitsFavoriteFolderContextmenu"); |
---|
133 | elemMenuitem.setAttribute("class","menuitem-iconic"); |
---|
134 | elemMenuitem.setAttribute("image","chrome://markingcollection/skin/folder.png"); |
---|
135 | var folders = this.Database.getFolderFormID(results[i].getAttribute("fid"),results[i].getAttribute("dbtype")); |
---|
136 | if(folders && folders[0].fid_property){ |
---|
137 | var xmldoc = parser.parseFromString(folders[0].fid_property, "text/xml"); |
---|
138 | if(xmldoc && xmldoc.documentElement.nodeName == "parsererror") xmldoc = undefined; |
---|
139 | if(xmldoc){ |
---|
140 | var elems = xmldoc.getElementsByTagName("ICON"); |
---|
141 | if(elems && elems.length>0) elemMenuitem.setAttribute("image",elems[0].textContent); |
---|
142 | elems = undefined; |
---|
143 | xmldoc = undefined; |
---|
144 | } |
---|
145 | } |
---|
146 | aPopupRoot.appendChild(elemMenuitem); |
---|
147 | }else{ |
---|
148 | var elemMenu = top.document.createElement("menu"); |
---|
149 | for(j=0;j<attr.length;j++){ |
---|
150 | elemMenu.setAttribute(attr[j].name,attr[j].value); |
---|
151 | } |
---|
152 | elemMenu.setAttribute("label",results[i].getAttribute("title")); |
---|
153 | elemMenu.setAttribute("class","menu-iconic"); |
---|
154 | elemMenu.setAttribute("image","chrome://markingcollection/skin/folder.png"); |
---|
155 | var folders = this.Database.getFolderFormID(results[i].getAttribute("fid"),results[i].getAttribute("dbtype")); |
---|
156 | if(folders && folders[0].fid_property){ |
---|
157 | var xmldoc = parser.parseFromString(folders[0].fid_property, "text/xml"); |
---|
158 | if(xmldoc && xmldoc.documentElement.nodeName == "parsererror") xmldoc = undefined; |
---|
159 | if(xmldoc){ |
---|
160 | var elems = xmldoc.getElementsByTagName("ICON"); |
---|
161 | if(elems && elems.length>0) elemMenu.setAttribute("image",elems[0].textContent); |
---|
162 | elems = undefined; |
---|
163 | xmldoc = undefined; |
---|
164 | } |
---|
165 | } |
---|
166 | var elemMenupopup = top.document.createElement("menupopup"); |
---|
167 | elemMenu.appendChild(elemMenupopup); |
---|
168 | elemMenupopup.addEventListener("popupshowing", function(aEvent){aEvent.stopPropagation();}, false); |
---|
169 | elemMenupopup.addEventListener("popuphiding", function(aEvent){aEvent.stopPropagation();}, false); |
---|
170 | var elemMenuitemSel = top.document.createElement("menuitem"); |
---|
171 | elemMenuitemSel.setAttribute("label",this.STRING.getString("FAVORITEFOLDER_SELECT")); |
---|
172 | for(j=0;j<attr.length;j++){ |
---|
173 | elemMenuitemSel.setAttribute(attr[j].name,attr[j].value); |
---|
174 | } |
---|
175 | elemMenuitemSel.setAttribute("class","menuitem-iconic"); |
---|
176 | elemMenuitemSel.setAttribute("image","chrome://markingcollection/skin/folder.png"); |
---|
177 | var folders = this.Database.getFolderFormID(results[i].getAttribute("fid"),results[i].getAttribute("dbtype")); |
---|
178 | if(folders && folders[0].fid_property){ |
---|
179 | var xmldoc = parser.parseFromString(folders[0].fid_property, "text/xml"); |
---|
180 | if(xmldoc && xmldoc.documentElement.nodeName == "parsererror") xmldoc = undefined; |
---|
181 | if(xmldoc){ |
---|
182 | var elems = xmldoc.getElementsByTagName("ICON"); |
---|
183 | if(elems && elems.length>0) elemMenuitemSel.setAttribute("image",elems[0].textContent); |
---|
184 | elems = undefined; |
---|
185 | xmldoc = undefined; |
---|
186 | } |
---|
187 | } |
---|
188 | elemMenupopup.appendChild(elemMenuitemSel); |
---|
189 | var elemMenuitemDel = top.document.createElement("menuitem"); |
---|
190 | elemMenuitemDel.setAttribute("label",this.STRING.getString("FAVORITEFOLDER_DELETE")); |
---|
191 | for(j=0;j<attr.length;j++){ |
---|
192 | elemMenuitemDel.setAttribute(attr[j].name,attr[j].value); |
---|
193 | } |
---|
194 | elemMenuitemDel.setAttribute("class","menuitem-iconic"); |
---|
195 | elemMenuitemDel.setAttribute("image","chrome://markingcollection/skin/menu_remove.png"); |
---|
196 | var folders = this.Database.getFolderFormID(results[i].getAttribute("fid"),results[i].getAttribute("dbtype")); |
---|
197 | if(folders && folders[0].fid_property){ |
---|
198 | var xmldoc = parser.parseFromString(folders[0].fid_property, "text/xml"); |
---|
199 | if(xmldoc && xmldoc.documentElement.nodeName == "parsererror") xmldoc = undefined; |
---|
200 | if(xmldoc){ |
---|
201 | var elems = xmldoc.getElementsByTagName("ICON"); |
---|
202 | if(elems && elems.length>0) elemMenuitemDel.setAttribute("image",elems[0].textContent); |
---|
203 | elems = undefined; |
---|
204 | xmldoc = undefined; |
---|
205 | } |
---|
206 | } |
---|
207 | elemMenuitemDel.addEventListener("command", function(aEvent){ |
---|
208 | aEvent.stopPropagation(); |
---|
209 | bitsFavoriteFolder._explicitOriginalTarget = aEvent.target; |
---|
210 | bitsFavoriteFolder.removeFavoriteFolder(aEvent); |
---|
211 | }, false); |
---|
212 | elemMenupopup.appendChild(elemMenuitemDel); |
---|
213 | aPopupRoot.appendChild(elemMenu); |
---|
214 | } |
---|
215 | }catch(e){} |
---|
216 | } |
---|
217 | parser = undefined; |
---|
218 | } |
---|
219 | |
---|
220 | }, |
---|
221 | |
---|
222 | onPopupHiding : function(aEvent, aPopupRoot){ |
---|
223 | setTimeout(function(){ |
---|
224 | var i; |
---|
225 | for(i=aPopupRoot.childNodes.length-1;i>=0;i--){ |
---|
226 | if(aPopupRoot.childNodes[i].id == "bitsFavoriteFolderAllMenuseparator") break; |
---|
227 | aPopupRoot.removeChild(aPopupRoot.childNodes[i]); |
---|
228 | } |
---|
229 | },0); |
---|
230 | |
---|
231 | }, |
---|
232 | |
---|
233 | onClick : function(aEvent){ |
---|
234 | var contentWindow; |
---|
235 | var mcTreeHandler; |
---|
236 | var mcItemView; |
---|
237 | var mcTreeViewModeService; |
---|
238 | |
---|
239 | if(bitsMarkingCollection._contentWindow) contentWindow = bitsMarkingCollection._contentWindow; |
---|
240 | if(contentWindow && contentWindow.mcTreeHandler) mcTreeHandler = contentWindow.mcTreeHandler; |
---|
241 | if(contentWindow && contentWindow.mcItemView) mcItemView = contentWindow.mcItemView; |
---|
242 | if(contentWindow && contentWindow.mcTreeViewModeService) mcTreeViewModeService = contentWindow.mcTreeViewModeService; |
---|
243 | |
---|
244 | |
---|
245 | if(aEvent.target.id == bitsFavoriteFolder.idMENU_ALL){ |
---|
246 | this.Common.PREF.clearUserPref("wiredmarker.rootfolder"); |
---|
247 | this.Common.PREF.clearUserPref("wiredmarker.rootfolder_dbtype"); |
---|
248 | if(mcTreeViewModeService) mcTreeViewModeService.rebuild(); |
---|
249 | return; |
---|
250 | |
---|
251 | }else if(aEvent.target.id == bitsFavoriteFolder.idMENU_SELECT){ |
---|
252 | try{var res = mcTreeHandler.resource;}catch(e){} |
---|
253 | if(!res) return; |
---|
254 | |
---|
255 | var fid = this.DataSource.getProperty(res, "id"); |
---|
256 | var dbtype = this.DataSource.getProperty(res, "dbtype"); |
---|
257 | var title = this.DataSource.getProperty(res, "title"); |
---|
258 | |
---|
259 | this.AddFavoriteFolder({fid:fid,dbtype:dbtype,title:title}); |
---|
260 | |
---|
261 | |
---|
262 | |
---|
263 | }else{ |
---|
264 | var fid = aEvent.target.getAttribute("fid"); |
---|
265 | var dbtype = aEvent.target.getAttribute("dbtype"); |
---|
266 | |
---|
267 | nsPreferences.setUnicharPref("wiredmarker.rootfolder", fid); |
---|
268 | nsPreferences.setUnicharPref("wiredmarker.rootfolder_dbtype", dbtype); |
---|
269 | if(mcTreeViewModeService) mcTreeViewModeService.rebuild(); |
---|
270 | return; |
---|
271 | |
---|
272 | } |
---|
273 | aEvent.stopPropagation(); |
---|
274 | }, |
---|
275 | |
---|
276 | onPopupFShowing : function(aEvent){ |
---|
277 | if(aEvent.explicitOriginalTarget.id == this.idMENU_ALL){ |
---|
278 | setTimeout(function(){aEvent.target.hidePopup();},0); |
---|
279 | return; |
---|
280 | } |
---|
281 | |
---|
282 | this._explicitOriginalTarget = aEvent.explicitOriginalTarget; |
---|
283 | |
---|
284 | }, |
---|
285 | |
---|
286 | _confirmRemovingFor : function(){ |
---|
287 | try{ |
---|
288 | if(this.confirmDelete){ |
---|
289 | return this.Common.confirm( this.STRING.getString("CONFIRM_DELETE") ); |
---|
290 | } |
---|
291 | return true; |
---|
292 | }catch(e){ |
---|
293 | return false; |
---|
294 | } |
---|
295 | }, |
---|
296 | |
---|
297 | removeFavoriteFolder : function(aEvent){ |
---|
298 | if(!this.xmldoc || !this._explicitOriginalTarget) return; |
---|
299 | if(!this._confirmRemovingFor()) return; |
---|
300 | |
---|
301 | var fid = this._explicitOriginalTarget.getAttribute("fid"); |
---|
302 | var dbtype = this._explicitOriginalTarget.getAttribute("dbtype"); |
---|
303 | |
---|
304 | var results = this.XPath.evaluateArray('//folder[@fid="'+fid+'" and @dbtype="'+dbtype+'"]',this.xmldoc); |
---|
305 | if(results.length){ |
---|
306 | var i; |
---|
307 | for(i=results.length-1;i>=0;i--){ |
---|
308 | results[i].parentNode.removeChild(results[i]); |
---|
309 | } |
---|
310 | this.xmlflash(); |
---|
311 | } |
---|
312 | this._explicitOriginalTarget = undefined; |
---|
313 | }, |
---|
314 | |
---|
315 | ///////////////////////////////////////////////////////////////////// |
---|
316 | _dump : function(aString){ |
---|
317 | window.top.bitsMarkingCollection._dump(aString); |
---|
318 | }, |
---|
319 | }; |
---|
320 | |
---|