source: DASISH/t5.6/client/branches/webannotator-basic-current-xsd/chrome/markingcollection/content/markingcollection/addon.js @ 5703

Last change on this file since 5703 was 5703, checked in by stephanie.roth@snd.gu.se, 10 years ago

Initial commit of current status quo from GitHub. TODO: Adjust client code to work with updated xsd file.

  • Property svn:executable set to *
File size: 13.3 KB
Line 
1var 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};
Note: See TracBrowser for help on using the repository browser.