source: DASISH/t5.6/client/branches/webannotator-basic-current-xsd/chrome/markingcollection/content/markingcollection/menufavoritefolder.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: 12.0 KB
Line 
1var 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
Note: See TracBrowser for help on using the repository browser.