1 | var bitsScrapPartyAddonService = { |
---|
2 | _addon : [], |
---|
3 | _addon_hash : [], |
---|
4 | ///////////////////////////////////////////////////////////////////// |
---|
5 | get STRING() { return document.getElementById("MarkingCollectionOverlayString"); }, |
---|
6 | |
---|
7 | get DataSource() { return bitsObjectMng.DataSource; }, |
---|
8 | get Common() { return bitsObjectMng.Common; }, |
---|
9 | get Database() { return bitsObjectMng.Database; }, |
---|
10 | get XML() { return bitsObjectMng.XML; }, |
---|
11 | get gBrowser() { return bitsObjectMng.getBrowser();}, |
---|
12 | |
---|
13 | ///////////////////////////////////////////////////////////////////// |
---|
14 | init : function(){ |
---|
15 | this.loadAddon(); |
---|
16 | }, |
---|
17 | |
---|
18 | ///////////////////////////////////////////////////////////////////// |
---|
19 | done : function(){ |
---|
20 | |
---|
21 | }, |
---|
22 | |
---|
23 | ///////////////////////////////////////////////////////////////////// |
---|
24 | getAddonDir : function(){ |
---|
25 | var dir = bitsMarkingCollection.getExtInstDir().clone(); |
---|
26 | if(dir) dir.append("addon"); |
---|
27 | if(!dir.exists()) dir.create(dir.DIRECTORY_TYPE, 0700); |
---|
28 | return dir; |
---|
29 | }, |
---|
30 | |
---|
31 | ///////////////////////////////////////////////////////////////////// |
---|
32 | loadAddon : function(){ |
---|
33 | try{ |
---|
34 | var dir = bitsScrapPartyAddonService.getAddonDir().clone(); |
---|
35 | if(!dir) return; |
---|
36 | var _addon = []; |
---|
37 | var _addon_hash = []; |
---|
38 | var entries = dir.directoryEntries; |
---|
39 | while(entries.hasMoreElements()){ |
---|
40 | var entry = entries.getNext().QueryInterface(Components.interfaces.nsILocalFile); |
---|
41 | var addon_file = {}; |
---|
42 | if(entry.isFile() && entry.leafName.match(/^(.+)\.xml$/m)){ |
---|
43 | addon_file.title = RegExp.$1; |
---|
44 | var xml = this.Common.convertToUnicode(this.Common.readFile(entry),"UTF-8"); |
---|
45 | xml = xml.replace(/[\r\n]+/img,""); |
---|
46 | if(xml.match(/^.*<ADDON>.*<ID>(.*?)<\/ID>.*<\/ADDON>.*/img)){ |
---|
47 | addon_file.id = RegExp.$1; |
---|
48 | } |
---|
49 | if(addon_file.id == undefined) continue; |
---|
50 | |
---|
51 | try{ |
---|
52 | var parser = new DOMParser(); |
---|
53 | var xmldoc = parser.parseFromString(xml, "text/xml"); //äºéã«èµ·åããæã«ãåž°ã£ãŠæ¥ãªããªãããnglayout.debug.disable_xul_cacheããšé¢ä¿ããããã ã詳现ã¯äžæ |
---|
54 | parser = undefined; |
---|
55 | var elemADDON = xmldoc.getElementsByTagName("ADDON"); |
---|
56 | if(elemADDON && elemADDON.length>0){ |
---|
57 | var elems = elemADDON[0].getElementsByTagName("*"); |
---|
58 | var i; |
---|
59 | for(i=0;i<elems.length;i++){ |
---|
60 | var key = elems[i].nodeName.toLowerCase(); |
---|
61 | addon_file[key] = {}; |
---|
62 | if(key.match(/observer/)){ |
---|
63 | //addon_file[key].value = eval(elems[i].textContent); |
---|
64 | }else{ |
---|
65 | addon_file[key].value = elems[i].textContent; |
---|
66 | |
---|
67 | //this._dump("loadAddon():"+key+"=["+addon_file[key].value+"]"); |
---|
68 | |
---|
69 | } |
---|
70 | if(elems[i].attributes && elems[i].attributes.length>0){ |
---|
71 | var attrs = {}; |
---|
72 | var attributes = elems[i].attributes; |
---|
73 | var j; |
---|
74 | for(j=0;j<attributes.length;j++){ |
---|
75 | attrs[attributes[j].name.toLowerCase()] = attributes[j].value; |
---|
76 | } |
---|
77 | addon_file[key].attrs = attrs; |
---|
78 | } |
---|
79 | } |
---|
80 | } |
---|
81 | }catch(ex2){ |
---|
82 | // bitsScrapPartyAddonService._dump("bitsScrapPartyAddonService.loadAddon(2):"+ex2); |
---|
83 | continue; |
---|
84 | } |
---|
85 | addon_file.file = entry; |
---|
86 | _addon.push(addon_file); |
---|
87 | _addon_hash[addon_file.id.value] = addon_file; |
---|
88 | } |
---|
89 | addon_file = undefined; |
---|
90 | } |
---|
91 | |
---|
92 | bitsScrapPartyAddonService._addon = _addon; |
---|
93 | bitsScrapPartyAddonService._addon_hash = _addon_hash; |
---|
94 | }catch(ex){ |
---|
95 | bitsScrapPartyAddonService._dump("bitsScrapPartyAddonService.loadAddon():"+ex); |
---|
96 | } |
---|
97 | }, |
---|
98 | |
---|
99 | ///////////////////////////////////////////////////////////////////// |
---|
100 | existsAddon : function(aIsDispPopupMenu){ |
---|
101 | bitsScrapPartyAddonService.loadAddon(); |
---|
102 | if(aIsDispPopupMenu == true){ |
---|
103 | var arr = []; |
---|
104 | try{ |
---|
105 | var i; |
---|
106 | for(i=0;i<bitsScrapPartyAddonService._addon.length;i++){ |
---|
107 | var addon = bitsScrapPartyAddonService._addon[i]; |
---|
108 | if(addon.id && addon.attr_mod) arr.push(addon.attr_mod.value); |
---|
109 | } |
---|
110 | }catch(ex){ |
---|
111 | bitsScrapPartyAddonService._dump("bitsScrapPartyAddonService.existsAddon():"+ex); |
---|
112 | } |
---|
113 | return (arr.length>0); |
---|
114 | }else{ |
---|
115 | return (bitsScrapPartyAddonService._addon.length>0); |
---|
116 | } |
---|
117 | }, |
---|
118 | |
---|
119 | ///////////////////////////////////////////////////////////////////// |
---|
120 | getAddonDBType : function(){ |
---|
121 | try{ |
---|
122 | var dbtype_arr = []; |
---|
123 | var i; |
---|
124 | for(i=0;i<bitsScrapPartyAddonService._addon.length;i++){ |
---|
125 | if(bitsScrapPartyAddonService._addon[i].dbtype) dbtype_arr.push(bitsScrapPartyAddonService._addon[i].dbtype.value); |
---|
126 | } |
---|
127 | if(dbtype_arr.length>0){ |
---|
128 | return dbtype_arr; |
---|
129 | }else{ |
---|
130 | return undefined; |
---|
131 | } |
---|
132 | }catch(ex){ |
---|
133 | bitsScrapPartyAddonService._dump("bitsScrapPartyAddonService.getAddonDBType():"+ex); |
---|
134 | return undefined; |
---|
135 | } |
---|
136 | }, |
---|
137 | |
---|
138 | ///////////////////////////////////////////////////////////////////// |
---|
139 | getAddonInfo : function(){ |
---|
140 | try{ |
---|
141 | var info_arr = []; |
---|
142 | var i; |
---|
143 | for(i=0;i<bitsScrapPartyAddonService._addon.length;i++){ |
---|
144 | var info = {}; |
---|
145 | var key; |
---|
146 | for(key in bitsScrapPartyAddonService._addon[i]){ |
---|
147 | if(typeof bitsScrapPartyAddonService._addon[i][key] == "function") continue; |
---|
148 | info[key] = bitsScrapPartyAddonService._addon[i][key]; |
---|
149 | } |
---|
150 | info_arr.push(info); |
---|
151 | } |
---|
152 | if(info_arr.length>0){ |
---|
153 | return info_arr; |
---|
154 | }else{ |
---|
155 | return undefined; |
---|
156 | } |
---|
157 | }catch(ex){ |
---|
158 | bitsScrapPartyAddonService._dump("bitsScrapPartyAddonService.getAddonInfo():"+ex); |
---|
159 | return undefined; |
---|
160 | } |
---|
161 | }, |
---|
162 | |
---|
163 | ///////////////////////////////////////////////////////////////////// |
---|
164 | eventListener : function(aEvent, aType, aRes){ |
---|
165 | try{ |
---|
166 | if(!aRes && aEvent.rangeParent){ |
---|
167 | if(aEvent.rangeParent.nodeName == "tree"){ |
---|
168 | var tree = aEvent.rangeParent; |
---|
169 | if(tree.view.selection.count >= 1 && tree.currentIndex >= 0){ |
---|
170 | aRes = tree.builderView.getResourceAtIndex(tree.currentIndex); |
---|
171 | } |
---|
172 | } |
---|
173 | } |
---|
174 | var folder_addon_id = ""; |
---|
175 | if(aRes){ |
---|
176 | if(this.DataSource.isContainer(aRes)){ |
---|
177 | folder_addon_id = this.DataSource.getProperty(aRes, "addon_id"); |
---|
178 | }else{ |
---|
179 | var res = this.DataSource.findParentResource(aRes); |
---|
180 | if(res) folder_addon_id = this.DataSource.getProperty(res, "addon_id"); |
---|
181 | } |
---|
182 | if(!folder_addon_id || folder_addon_id == ""){ |
---|
183 | var dbtype = this.DataSource.getProperty(aRes, "dbtype"); |
---|
184 | var addon_info = bitsMarkingCollection.dbinfo.getAddonInfo(dbtype); |
---|
185 | if(addon_info && addon_info.id && addon_info.id != "") folder_addon_id = addon_info.id |
---|
186 | } |
---|
187 | } |
---|
188 | |
---|
189 | if(folder_addon_id != ""){ |
---|
190 | var addon = bitsScrapPartyAddonService._addon_hash[folder_addon_id]; |
---|
191 | if(addon && addon.observer) addon.observer.value(aEvent, aType, aRes); |
---|
192 | }else{ |
---|
193 | } |
---|
194 | |
---|
195 | var i; |
---|
196 | for(i=0;i<bitsScrapPartyAddonService._addon.length;i++){ |
---|
197 | if(folder_addon_id == bitsScrapPartyAddonService._addon[i].id) continue; |
---|
198 | var addon = bitsScrapPartyAddonService._addon[i]; |
---|
199 | if(addon && addon.observer) addon.observer.value(aEvent, aType, aRes); |
---|
200 | } |
---|
201 | |
---|
202 | |
---|
203 | }catch(ex){ |
---|
204 | bitsScrapPartyAddonService._dump("bitsScrapPartyAddonService.eventListener():"+ex); |
---|
205 | aEvent.preventDefault(); |
---|
206 | } |
---|
207 | }, |
---|
208 | |
---|
209 | ///////////////////////////////////////////////////////////////////// |
---|
210 | builderViewObserver : { |
---|
211 | canDrop : function(index, orient, tree){ |
---|
212 | var i; |
---|
213 | for(i=0;i<bitsScrapPartyAddonService._addon.length;i++){ |
---|
214 | var addon = bitsScrapPartyAddonService._addon[i]; |
---|
215 | if(addon && addon.builderviewobserver && addon.builderviewobserver.value && addon.builderviewobserver.value.canDrop) addon.builderviewobserver.value.canDrop(index, orient, tree); |
---|
216 | } |
---|
217 | }, |
---|
218 | onDrop : function(row, orient, tree, XferDataSet, aState){ |
---|
219 | var i; |
---|
220 | for(i=0;i<bitsScrapPartyAddonService._addon.length;i++){ |
---|
221 | var addon = bitsScrapPartyAddonService._addon[i]; |
---|
222 | if(addon && addon.builderviewobserver && addon.builderviewobserver.value && addon.builderviewobserver.value.onDrop) setTimeout(addon.builderviewobserver.value.onDrop, 0, row, orient, tree, XferDataSet, aState); |
---|
223 | } |
---|
224 | }, |
---|
225 | onToggleOpenState : function(row){}, |
---|
226 | onCycleHeader : function(){}, |
---|
227 | onSelectionChanged : function(){}, |
---|
228 | onCycleCell : function(aRow, pColID ){}, |
---|
229 | isEditable : function(){}, |
---|
230 | onSetCellText : function(){}, |
---|
231 | onPerformAction : function(){}, |
---|
232 | onPerformActionOnRow : function(){}, |
---|
233 | onPerformActionOnCell : function(aAction, aRow, aColID ){}, |
---|
234 | }, |
---|
235 | |
---|
236 | ///////////////////////////////////////////////////////////////////// |
---|
237 | onPopupShowing : function(aEvent,aRes){ |
---|
238 | try{ |
---|
239 | var i; |
---|
240 | for(i=0;i<bitsScrapPartyAddonService._addon.length;i++){ |
---|
241 | var addon = bitsScrapPartyAddonService._addon[i]; |
---|
242 | if(addon.id && addon.attr_mod) bitsScrapPartyAddonService.createMenu(aEvent.target, addon.id.value, aRes); |
---|
243 | } |
---|
244 | }catch(ex){ |
---|
245 | bitsScrapPartyAddonService._dump("bitsScrapPartyAddonService.onPopupShowing():"+ex); |
---|
246 | aEvent.preventDefault(); |
---|
247 | } |
---|
248 | |
---|
249 | }, |
---|
250 | |
---|
251 | ///////////////////////////////////////////////////////////////////// |
---|
252 | onPopupHiding : function(aEvent){ |
---|
253 | var i; |
---|
254 | var elem = aEvent.target.lastChild; |
---|
255 | for(i=aEvent.target.childNodes.length-1;i>=0;i--){ |
---|
256 | aEvent.target.removeChild(aEvent.target.childNodes[i]); |
---|
257 | } |
---|
258 | }, |
---|
259 | |
---|
260 | ///////////////////////////////////////////////////////////////////// |
---|
261 | onCommand : function(aEvent,aRes){ |
---|
262 | |
---|
263 | var res = aRes; |
---|
264 | if(!res){ aEvent.preventDefault(); return; } |
---|
265 | var fid = this.DataSource.getProperty(res,"id"); |
---|
266 | var type = this.DataSource.getProperty(res,"type"); |
---|
267 | var title = this.DataSource.getProperty(res,"title"); |
---|
268 | var dbtype = this.DataSource.getProperty(res,"dbtype"); |
---|
269 | |
---|
270 | var addon_file = bitsScrapPartyAddonService._addon_hash[aEvent.target.id]; |
---|
271 | var label = aEvent.target.label; |
---|
272 | if(!this.Common.confirm("[ "+label+" ]"+ this.STRING.getString("CONFIRM_ADDON_FOLDER_ATTR_CHANGE"))){return;} |
---|
273 | |
---|
274 | |
---|
275 | if(addon_file.icon) this.DataSource.setProperty(res,"icon",addon_file.icon.value); |
---|
276 | |
---|
277 | |
---|
278 | var property_arr = []; |
---|
279 | if(addon_file.id) property_arr.push("<ID>"+addon_file.id.value+"</ID>"); |
---|
280 | if(addon_file.title) property_arr.push("<TITLE>"+addon_file.title.value+"</TITLE>"); |
---|
281 | if(addon_file.icon) property_arr.push("<ICON>"+addon_file.icon.value+"</ICON>"); |
---|
282 | |
---|
283 | if(property_arr.length>0){ |
---|
284 | var rtnFolder = this.Database.getFolderFormID(fid,dbtype); |
---|
285 | if(rtnFolder && rtnFolder.length && rtnFolder.length>0){ |
---|
286 | this.Database.removeFolder(fid,dbtype); |
---|
287 | |
---|
288 | var fid_property = rtnFolder[0].fid_property; |
---|
289 | if(!fid_property || fid_property == "") fid_property = "<PROPERTY></PROPERTY>"; |
---|
290 | try{ |
---|
291 | var parser = new DOMParser(); |
---|
292 | var xmldoc = parser.parseFromString(fid_property, "text/xml"); |
---|
293 | parser = undefined; |
---|
294 | }catch(ex){} |
---|
295 | if(xmldoc){ |
---|
296 | fid_property = ""; |
---|
297 | var parentNode = null; |
---|
298 | var xPathResult = bitsObjectMng.XPath.evaluate('/PROPERTY[1]', xmldoc); |
---|
299 | if(xPathResult && xPathResult.snapshotLength>0){ |
---|
300 | parentNode = xPathResult.snapshotItem(0); |
---|
301 | var addon_node = parentNode.getElementsByTagName("ADDON")[0]; |
---|
302 | if(addon_node) parentNode.removeChild(addon_node); |
---|
303 | } |
---|
304 | xPathResult = undefined; |
---|
305 | |
---|
306 | var addon_node = xmldoc.createElement("ADDON"); |
---|
307 | if(addon_node){ |
---|
308 | parentNode.appendChild(addon_node); |
---|
309 | if(addon_file.id){ |
---|
310 | var node = xmldoc.createElement("ID"); |
---|
311 | if(node){ |
---|
312 | node.textContent = addon_file.id.value; |
---|
313 | addon_node.appendChild(node); |
---|
314 | } |
---|
315 | } |
---|
316 | if(addon_file.title){ |
---|
317 | var node = xmldoc.createElement("TITLE"); |
---|
318 | if(node){ |
---|
319 | node.textContent = addon_file.title.value; |
---|
320 | addon_node.appendChild(node); |
---|
321 | } |
---|
322 | } |
---|
323 | if(addon_file.icon){ |
---|
324 | var node = xmldoc.createElement("ICON"); |
---|
325 | if(node){ |
---|
326 | node.textContent = addon_file.icon.value; |
---|
327 | addon_node.appendChild(node); |
---|
328 | } |
---|
329 | } |
---|
330 | } |
---|
331 | var s = new XMLSerializer(); |
---|
332 | fid_property = s.serializeToString(xmldoc); |
---|
333 | s = undefined; |
---|
334 | |
---|
335 | }else{ //念ã®ãã |
---|
336 | fid_property = "<PROPERTY><ADDON>" + property_arr.join("") + "</ADDON></PROPERTY>"; |
---|
337 | } |
---|
338 | |
---|
339 | |
---|
340 | rtnFolder[0].fid_property = fid_property; |
---|
341 | if(rtnFolder[0].dbtype) delete rtnFolder[0].dbtype; |
---|
342 | this.Database.addFolder(rtnFolder[0],dbtype,false); |
---|
343 | bitsMarkingCollection.checkFolderNameRepetition(dbtype); |
---|
344 | var newFlds = this.Database.getFolderFormID(fid,dbtype); |
---|
345 | if(newFlds){ |
---|
346 | this.DataSource.setProperty(res,"title",newFlds[0].fid_title); |
---|
347 | this.DataSource.setProperty(res,"dbtype",dbtype); |
---|
348 | if(addon_file.id) this.DataSource.setProperty(res,"addon_id",addon_file.id.value); |
---|
349 | this.DataSource.flush(); |
---|
350 | } |
---|
351 | } |
---|
352 | } |
---|
353 | return; |
---|
354 | }, |
---|
355 | |
---|
356 | ///////////////////////////////////////////////////////////////////// |
---|
357 | createMenu : function(aParentNode,aID,aRes){ |
---|
358 | |
---|
359 | var elemMenuitem = document.createElement("menuitem"); |
---|
360 | if(elemMenuitem){ |
---|
361 | var addon_file = bitsScrapPartyAddonService._addon_hash[aID]; |
---|
362 | |
---|
363 | //this._dump("createMenu():addon_file=["+addon_file+"]"); |
---|
364 | |
---|
365 | var label = (addon_file.menu_title?addon_file.menu_title.value:addon_file.title.value); |
---|
366 | var res = aRes; |
---|
367 | var fid = this.DataSource.getProperty(res, "id"); |
---|
368 | var dbtype = this.DataSource.getProperty(res, "dbtype"); |
---|
369 | var folder_addon_id = this.DataSource.getProperty(res, "addon_id"); |
---|
370 | |
---|
371 | elemMenuitem.setAttribute("id",aID); |
---|
372 | elemMenuitem.setAttribute("label",label); |
---|
373 | if(addon_file.icon.value != ""){ |
---|
374 | elemMenuitem.setAttribute("image",addon_file.icon.value); |
---|
375 | }else{ |
---|
376 | elemMenuitem.setAttribute("image","chrome://markingcollection/skin/extensions_16.png"); |
---|
377 | } |
---|
378 | elemMenuitem.setAttribute("class","menuitem-iconic"); |
---|
379 | |
---|
380 | if(addon_file.id.value == folder_addon_id){ |
---|
381 | elemMenuitem.setAttribute("disabled","true"); |
---|
382 | }else{ |
---|
383 | elemMenuitem.removeAttribute("disabled"); |
---|
384 | } |
---|
385 | |
---|
386 | aParentNode.appendChild(elemMenuitem); |
---|
387 | } |
---|
388 | |
---|
389 | }, |
---|
390 | |
---|
391 | ///////////////////////////////////////////////////////////////////// |
---|
392 | _dump : function(aString){ |
---|
393 | window.top.bitsMarkingCollection._dump(aString); |
---|
394 | }, |
---|
395 | |
---|
396 | }; |
---|