source: DASISH/t5.6/client/branches/webannotator-basic/chrome/markingcollection/content/markingcollection/menutree.js @ 5428

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

Added new branch for work on schema change related client fixes.

File size: 17.8 KB
Line 
1// メニュヌ甚階局衚瀺
2var bitsMenuTree = {
3
4        _app_version : 0,
5
6        get STRING()     { return window.top.document.getElementById("MarkingCollectionOverlayString"); },
7        get DataSource() { return window.top.bitsObjectMng.DataSource; },
8        get Common()     { return window.top.bitsObjectMng.Common;     },
9        get XPath()      { return window.top.bitsObjectMng.XPath;      },
10        get Database()   { return window.top.bitsObjectMng.Database;   },
11        get gBrowser()   { return window.top.bitsObjectMng.getBrowser();},
12
13        get SIDEBAR() { return window.top.document.getElementById("sidebar"); },
14        get SIDEBAR_DOC() {try{return this.SIDEBAR.contentDocument;}catch(e){return undefined;}},
15        get SIDEBAR_WIN() {try{return this.SIDEBAR.contentWindow;}catch(e){return undefined;}},
16        get mcTreeHandler() {try{return this.SIDEBAR_WIN.mcTreeHandler;}catch(e){return undefined;}},
17        get mcMainService() {try{return this.SIDEBAR_WIN.mcMainService;}catch(e){return undefined;}},
18        get mcController() {try{return this.SIDEBAR_WIN.mcController;}catch(e){return undefined;}},
19        get mcPropertyView() {try{return this.SIDEBAR_WIN.mcPropertyView;}catch(e){return undefined;}},
20        get mcTreeViewModeService() {try{return this.SIDEBAR_WIN.mcTreeViewModeService;}catch(e){return undefined;}},
21        get bitsItemView() {try{return this.SIDEBAR_WIN.bitsItemView;}catch(e){return undefined;}},
22
23        get _id_extensionsMenupopup() { return "bitsExtensionsMenuPopup"; },
24        get _id_favoritefolderMenuseparator() { return "bitsFavoriteFolderMenuseparator"; },
25        get _id_menutreeFolderContextmenu() { return "bitsMenuTreeFolderContextmenu"; },
26        get _id_menutreeObjectContextmenu() { return "bitsMenuTreeObjectContextmenu"; },
27        get _extensionsMenupopup()    { return window.top.document.getElementById(this._id_extensionsMenupopup); },
28
29        get idMENU_FOLDER_ADD_FAVORITE(){ return "bitsFavoriteFolderAddMenuitem"; },
30        get idMENU_FOLDER_REMOVE()      { return "bitsMenuTreeFolderRemoveMenuitem"; },
31        get idMENU_FOLDER_PROPERTY()    { return "bitsMenuTreeFolderPropertyMenuitem"; },
32
33        get MENU_FOLDER_ADD_FAVORITE(){ return document.getElementById(this.idMENU_FOLDER_ADD_FAVORITE); },
34        get MENU_FOLDER_REMOVE()      { return document.getElementById(this.idMENU_FOLDER_REMOVE); },
35        get MENU_FOLDER_PROPERTY()    { return document.getElementById(this.idMENU_FOLDER_PROPERTY); },
36
37        get idMENU_OBJECT_OPEN()    { return "bitsMenuTreeObjectOpenMenuitem"; },
38        get idMENU_OBJECT_OPENN()   { return "bitsMenuTreeObjectOpenNewTabMenuitem"; },
39        get idMENU_OBJECT_REMOVE()  { return "bitsMenuTreeObjectRemoveMenuitem"; },
40        get idMENU_OBJECT_PROPERTY(){ return "bitsMenuTreeObjectPropertyMenuitem"; },
41
42        get MENU_OBJECT_OPEN()    { return document.getElementById(this.idMENU_OBJECT_OPEN); },
43        get MENU_OBJECT_OPENN()   { return document.getElementById(this.idMENU_OBJECT_OPENN); },
44        get MENU_OBJECT_REMOVE()  { return document.getElementById(this.idMENU_OBJECT_REMOVE); },
45        get MENU_OBJECT_PROPERTY(){ return document.getElementById(this.idMENU_OBJECT_PROPERTY); },
46
47        get POPUP(){ return document.getElementById(this._id_menutreeObjectContextmenu); },
48
49        get confirmDelete() { return true; },
50
51/////////////////////////////////////////////////////////////////////
52        init : function(){
53                var info = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULAppInfo);
54                this._app_version = parseInt(info.version);
55        },
56
57/////////////////////////////////////////////////////////////////////
58/////////////////////////////////////////////////////////////////////
59        done : function(){
60        },
61
62/////////////////////////////////////////////////////////////////////
63        popupshowing : function(event){
64                try{
65                        if(!event.target.nodeName || event.target.nodeName != "menupopup") return;
66                        var elemMenupopup = event.target;
67                        var p_fid = elemMenupopup.getAttribute("fid");
68                        var p_dbtype = elemMenupopup.getAttribute("dbtype");
69                        if(!p_fid || !p_dbtype){
70                                p_fid = nsPreferences.copyUnicharPref("wiredmarker.rootfolder");
71                                p_dbtype = nsPreferences.copyUnicharPref("wiredmarker.rootfolder_dbtype");
72                        }
73                        if(elemMenupopup.id == bitsMenuTree._id_extensionsMenupopup && (!p_fid || !p_dbtype)){
74                                var dbinfo = window.top.bitsMarkingCollection.dbinfo.getAllDBInfo();
75                                if(dbinfo){
76                                        if(dbinfo.length > 1){
77                                                var i;
78                                                for(i=0;i<dbinfo.length;i++){
79                                                        bitsMenuTree._popupshowingIndexContextMenu(
80                                                                elemMenupopup,
81                                                                [
82                                                                        {
83                                                                                fid       : "0",
84                                                                                dbtype    : dbinfo[i].database_dbtype,
85                                                                                fid_title : dbinfo[i].database_title,
86                                                                                icon      : dbinfo[i].database_icon,
87                                                                        }
88                                                                ]);
89                                                }
90                                                return;
91                                        }else{
92                                                p_fid = "0";
93                                                p_dbtype = dbinfo[0].database_dbtype;
94                                        }
95                                }
96                        }
97                        if(!elemMenupopup.id || elemMenupopup.id == bitsMenuTree._id_extensionsMenupopup){
98                                var foldres = bitsMenuTree.Database.getFolderFormPID(p_fid,p_dbtype);
99                                if(foldres){
100                                        foldres.sort(function(a,b){ return a.pfid_order - b.pfid_order; });
101                                }else{
102                                        foldres = [];
103                                }
104                                var objects = bitsMenuTree.Database.getObjectFormPID(p_fid,p_dbtype);
105                                if(objects){
106                                        objects.sort(function(a,b){ return a.pfid_order - b.pfid_order; });
107                                }else{
108                                        objects = [];
109                                }
110                                bitsMenuTree._popupshowingIndexContextMenu(elemMenupopup,[].concat(foldres,objects));
111                        }
112                }catch(e){
113                        bitsMenuTree._dump("bitsMenuTree.popupshowing():"+e);
114                }
115        },
116
117/////////////////////////////////////////////////////////////////////
118        _removeChild : function(aNode){
119                var i;
120                for(i=aNode.childNodes.length-1;i>=0;i--){
121                        this._removeChild(aNode.childNodes[i]);
122                        aNode.removeChild(aNode.childNodes[i]);
123                }
124        },
125
126/////////////////////////////////////////////////////////////////////
127        popuphiding : function(event){
128                if(!event.target.nodeName || event.target.nodeName != "menupopup") return;
129                var elemMenupopup = event.target;
130                setTimeout(function(){
131                        var i;
132                        if(elemMenupopup.id == bitsMenuTree._id_extensionsMenupopup){
133                                for(i=elemMenupopup.childNodes.length-1;i>=0;i--){
134                                        if(elemMenupopup.childNodes[i].id == bitsMenuTree._id_favoritefolderMenuseparator) break;
135                                        bitsMenuTree._removeChild(elemMenupopup.childNodes[i]);
136                                        elemMenupopup.removeChild(elemMenupopup.childNodes[i]);
137                                }
138                        }else if(!elemMenupopup.id){
139                                for(i=elemMenupopup.childNodes.length-1;i>=0;i--){
140                                        bitsMenuTree._removeChild(elemMenupopup.childNodes[i]);
141                                        elemMenupopup.removeChild(elemMenupopup.childNodes[i]);
142                                }
143                        }
144                },0);
145        },
146
147/////////////////////////////////////////////////////////////////////
148        onMousedown : function(aEvent){
149                if(bitsMenuTree._app_version<=2) return;
150                bitsImageTooltip.onMousedown(aEvent);
151        },
152
153/////////////////////////////////////////////////////////////////////
154        onMousemove : function(aEvent){
155                if(bitsMenuTree._app_version<=2) return;
156                var param = {
157                        menuitem : aEvent.target
158                };
159                try {
160                        var oid = param.menuitem.getAttribute("oid");
161                        var dbtype = param.menuitem.getAttribute("dbtype");
162                        if(!oid || !dbtype) return;
163                        var objs = bitsMenuTree.Database.getObject({oid:oid},dbtype);
164                        if(objs && objs.length>0) param.obj = objs[0];
165                }catch(e){}
166
167                bitsImageTooltip.onMousemove(aEvent,param);
168        },
169
170/////////////////////////////////////////////////////////////////////
171        onMouseout : function(aEvent){
172                if(bitsMenuTree._app_version<=2) return;
173                bitsImageTooltip.onMouseout(aEvent);
174        },
175
176/////////////////////////////////////////////////////////////////////
177/////////////////////////////////////////////////////////////////////
178        commandIndexContextMenu : function(event){},
179
180/////////////////////////////////////////////////////////////////////
181        _popupshowingIndexContextMenu : function(elemMenupopup,foldres){
182                if(!foldres || foldres.length==0){
183                        if(elemMenupopup.id != this._id_extensionsMenupopup) elemMenupopup.parentNode.removeChild(elemMenupopup);
184                        return;
185                }
186                var parser = new DOMParser();
187                if(foldres && foldres.length>0){
188                        var j;
189                        for(j=0;j<foldres.length;j++){
190                                if(!foldres[j]) continue;
191                                if(foldres[j].fid && foldres[j].dbtype){
192                                        if(!foldres[j].fid_title) continue;
193                                        var tmp_foldres = bitsMenuTree.Database.getFolderFormPID(foldres[j].fid,foldres[j].dbtype);
194                                        if(!tmp_foldres) tmp_foldres = [];
195                                        if(tmp_foldres.length == 0){
196                                                var tmp_objects = bitsMenuTree.Database.getObjectFormPID(foldres[j].fid,foldres[j].dbtype);
197                                                if(!tmp_objects) tmp_objects = [];
198                                                tmp_foldres = tmp_foldres.concat(tmp_objects);
199                                        }
200                                        var elemMenuSub = top.document.createElement("menu");
201                                        if(!elemMenuSub) continue;
202                                        var key;
203                                        for(key in foldres[j]){
204                                                elemMenuSub.setAttribute(key,foldres[j][key]);
205                                        }
206                                        elemMenuSub.setAttribute("label",foldres[j].fid_title);
207                                        elemMenuSub.setAttribute("class","menu-iconic");
208                                        elemMenuSub.setAttribute("image","chrome://markingcollection/skin/folder.png");
209                                        if(foldres[j].fid != "0") elemMenuSub.setAttribute("contextmenu",this._id_menutreeFolderContextmenu);
210                                        if(foldres[j].icon){
211                                                elemMenuSub.setAttribute("image",foldres[j].icon);
212                                        }else if(foldres[j].fid_property){
213                                                var xmldoc = parser.parseFromString(foldres[j].fid_property, "text/xml");
214                                                if(xmldoc && xmldoc.documentElement.nodeName == "parsererror") xmldoc = undefined;
215                                                if(xmldoc){
216                                                        var elems = xmldoc.getElementsByTagName("ICON");
217                                                        if(elems && elems.length>0) elemMenuSub.setAttribute("image",elems[0].textContent);
218                                                        elems = undefined;
219                                                        xmldoc = undefined;
220                                                }
221                                        }
222                                        if(tmp_foldres.length==0) elemMenuSub.setAttribute("disabled","true");
223                                        var elemMenuSubpopup = top.document.createElement("menupopup");
224                                        if(elemMenuSubpopup){
225                                                for(var key in foldres[j]){
226                                                        elemMenuSubpopup.setAttribute(key,foldres[j][key]);
227                                                }
228                                                elemMenuSub.appendChild(elemMenuSubpopup);
229                                        }
230                                        elemMenupopup.appendChild(elemMenuSub);
231                                }else{
232                                        var elemMenuitem = top.document.createElement("menuitem");
233                                        if(!elemMenuitem) continue;
234                                        this._setMenuitemObjectAttribute(elemMenuitem,foldres[j]);
235                                        elemMenuitem.setAttribute("contextmenu",this._id_menutreeObjectContextmenu);
236                                        elemMenuitem.addEventListener("command",bitsMenuTree.onCommand,false);
237                                        elemMenupopup.appendChild(elemMenuitem);
238                                }
239                        }
240                }
241                parser = undefined;
242        },
243
244/////////////////////////////////////////////////////////////////////
245        _setMenuitemObjectAttribute : function(aMenuitem,aObject){
246                for(var key in aObject){
247                        aMenuitem.setAttribute(key,aObject[key]);
248                }
249                aMenuitem.setAttribute("label",aObject.oid_title);
250                aMenuitem.setAttribute("class","menuitem-iconic");
251                aMenuitem.addEventListener("mousedown",bitsMenuTree.onMousedown,false);
252                aMenuitem.addEventListener("mousemove",bitsMenuTree.onMousemove,false);
253                aMenuitem.addEventListener("mouseout" ,bitsMenuTree.onMouseout,false);
254                var icon = null;
255                if(aObject.oid_type.match(/^image\/(.+)$/)){
256                        if(this._app_version>2){
257                                var blobFile = this.Database.getObjectBLOBFile(aObject.oid,aObject.dbtype);
258                                if(blobFile.exists()){
259                                        if(blobFile.fileSize>0){
260                                                var url = this.Common.convertFilePathToURL(blobFile.path);
261                                                if(url) icon = url;
262                                        }else if(aObject.oid_txt){
263                                                if(this.Common.getImageFromURL(aObject.oid_txt, blobFile)){
264                                                        if(blobFile.exists() && blobFile.fileSize>0){
265                                                                var url = this.Common.convertFilePathToURL(blobFile.path);
266                                                                if(url) icon = url;
267                                                        }
268                                                }
269                                        }
270                                }
271                        }
272                }else if(aObject.oid_type == "url"){
273                        icon = this.Database.getFavicon(aObject.oid_txt,aObject.dbtype);
274                        if(!icon) icon = this.Database.getFavicon(aObject.doc_url,aObject.dbtype);
275                }else{
276                        var xmldoc;
277                        if(xmldoc){
278                                var xmlnode = xmldoc.getElementsByTagName("ICON")[0];
279                                if(xmlnode) icon = xmlnode.textContent;
280                        }else if(aObject.oid_property.match(/^.*<ICON>(.+?)<\/ICON>.*$/m)){
281                                icon = RegExp.$1;
282                        }
283                        if(icon && icon != ""){
284                                var url = Components.classes['@mozilla.org/network/standard-url;1'].createInstance(Components.interfaces.nsIURL);
285                                url.spec = icon;
286                                if(url.scheme == "file"){
287                                        var file = this.Common.convertURLToFile(icon)
288                                        if(!file.exists()) icon = undefined;
289                                }else if(url.scheme == "chrome"){
290                                        var val = this.existsIcon(url);
291                                        if(!val) icon = undefined;
292                                }
293                        }
294                }
295                if(!icon) icon = this.Database.getFavicon(aObject.doc_url,aObject.dbtype);
296                if(!icon){
297                        if(aObject.oid_type.match(/^image\//)){
298                                icon = "chrome://markingcollection/skin/image.png";
299                        }else{
300                                icon = "chrome://markingcollection/skin/defaultFavicon.png";
301                        }
302                }
303                aMenuitem.setAttribute("image",icon);
304        },
305
306/////////////////////////////////////////////////////////////////////
307        onPopupFShowing : function(aEvent){
308                if(aEvent.target.id != this._id_menutreeFolderContextmenu && aEvent.target.id != this._id_menutreeObjectContextmenu) return;
309                this._explicitOriginalTarget = aEvent.explicitOriginalTarget;
310        },
311
312        onPopupCommand : function(aEvent){
313                switch(aEvent.target.id){
314                        case this.idMENU_OBJECT_OPEN:
315                                this.open();
316                                break;
317                        case this.idMENU_OBJECT_OPENN:
318                                this.open(true);
319                                break;
320                        case this.idMENU_FOLDER_REMOVE:
321                        case this.idMENU_OBJECT_REMOVE:
322                                this.remove(aEvent);
323                                break;
324                        case this.idMENU_OBJECT_PROPERTY:
325                                this.property();
326                                break;
327                        case this.idMENU_FOLDER_ADD_FAVORITE:
328                                var target = this._explicitOriginalTarget;
329                                if(target){
330                                        var fid = target.getAttribute("fid");
331                                        var dbtype = target.getAttribute("dbtype");
332                                        var title = target.getAttribute("fid_title");
333                                        bitsFavoriteFolder.AddFavoriteFolder({fid:fid,dbtype:dbtype,title:title});
334                                }
335                                break;
336                        case this.idMENU_FOLDER_PROPERTY:
337                                break;
338                        default:
339                                this._explicitOriginalTarget = null;
340                                break;
341                }
342        },
343
344        onCommand : function(aEvent){
345                bitsMenuTree._explicitOriginalTarget = aEvent.target;
346                bitsMenuTree.open();
347        },
348
349/////////////////////////////////////////////////////////////////////
350// TREE 関連
351/////////////////////////////////////////////////////////////////////
352        open : function(tabbed){
353                if(!this._explicitOriginalTarget) return;
354                var target = this._explicitOriginalTarget;
355                var aObject = {};
356                aObject.oid = target.getAttribute("oid");
357                aObject.dbtype = target.getAttribute("dbtype");
358                aObject.fid_style = target.getAttribute("fid_style");
359                aObject.doc_url = target.getAttribute("doc_url");
360                aObject.oid_type = target.getAttribute("oid_type");
361
362                aObject = this.Database.getObject({oid:aObject.oid}, aObject.dbtype);
363                if(aObject && aObject.length){
364                        aObject = aObject[0];
365                        aObject.dbtype = target.getAttribute("dbtype");
366                }else{
367                        return;
368                }
369                this.Common.loadFromObject(aObject,tabbed);
370        },
371
372        _confirmRemovingFor : function(){
373                try{
374                        if(this.confirmDelete){
375                                return this.Common.confirm( this.STRING.getString("CONFIRM_DELETE") );
376                        }
377                        return true;
378                }catch(e){
379                        return false;
380                }
381        },
382
383        getSelection : function(){
384                var ret = [];
385                var rc;
386                var i;
387                for(rc=0;rc<this.TREE.view.selection.getRangeCount();rc++){
388                        var start = {}, end = {};
389                        this.TREE.view.selection.getRangeAt(rc, start, end);
390                        for(i=start.value;i<= end.value;i++){
391                                if(!this.TREE.view.selection.isSelected(i)) continue;
392                                ret.push(i);
393                        }
394                }
395                return ret;
396        },
397
398        validateMultipleSelection : function(aIdxList){
399                if(aIdxList.length != this.TREE.view.selection.count){
400                        this.Common.alert(this.STRING.getString("ERROR_MULTIPLE_SELECTION"));
401                        return false;
402                }
403                return true;
404        },
405
406        remove : function(aEvent){
407                if(!this._explicitOriginalTarget) return;
408                if(!this._explicitOriginalTarget.hasAttribute("dbtype")) return;
409                if(!this._confirmRemovingFor()) return;
410                if(this._explicitOriginalTarget.hasAttribute("oid")){
411                        var aObject = {};
412                        var target = this._explicitOriginalTarget;
413                        aObject.oid = target.getAttribute("oid");
414                        aObject.dbtype = target.getAttribute("dbtype");
415                        aObject.pfid = target.getAttribute("pfid");
416                        aObject.oid_type = target.getAttribute("oid_type");
417                        this._removeObject(aObject);
418                }else if(this._explicitOriginalTarget.hasAttribute("fid")){
419                        var aFolder = {};
420                        var target = this._explicitOriginalTarget;
421                        aFolder.fid = target.getAttribute("fid");
422                        aFolder.dbtype = target.getAttribute("dbtype");
423                        this._removeFolder(aFolder);
424                }
425                if(this.bitsItemView && this.bitsItemView.isChecked){
426                        if(this._explicitOriginalTarget.hasAttribute("fid")){
427                                if(this.mcTreeViewModeService) this.mcTreeViewModeService.rebuild();
428                                this.bitsItemView.rebuild();
429                        }else if(this._explicitOriginalTarget.hasAttribute("oid")){
430                                this.bitsItemView.refresh();
431                        }
432                }else{
433                        if(this.mcTreeViewModeService) this.mcTreeViewModeService.rebuild();
434                }
435                return true;
436        },
437
438        _removeObject : function(aObject){
439                var match_exp = new RegExp("^"+bitsMarker.id_key+".+$","m");
440                var source;
441                if(!aObject.oid_type.match(/^image\/(.+)$/)) source = bitsMarker.id_key+aObject.dbtype+aObject.oid;
442                if(source) bitsMarker.unmarkerWindow(source);
443                this.Database.removeObject({oid:aObject.oid,pfid:aObject.pfid},aObject.dbtype,false);
444        },
445
446        _removeFolder : function(aFolder){
447                var i;
448                var Foldres = this.Database.getFolderFormPID(aFolder.fid,aFolder.dbtype,false);
449                if(Foldres){
450                        for(i=0;i<Foldres.length;i++){
451                                this._removeFolder(Foldres[i]);
452                        }
453                }
454                var Objects = this.Database.getObjectFormPID(aFolder.fid,aFolder.dbtype,false);
455                if(Objects){
456                        for(i=0;i<Objects.length;i++){
457                                this._removeObject(Objects[i]);
458                        }
459                }
460                this.Database.removeFolder(aFolder.fid,aFolder.dbtype,false);
461        },
462
463        property : function(){
464                if(this.TREE.currentIndex<0) return;
465                var row = this.TREE.currentIndex;
466                if(!this.itemObjects[row]) return;
467                var aObject = this.itemObjects[row];
468                var id = aObject.oid;
469                var style = aObject.fid_style;
470                var dbtype = aObject.dbtype;
471                var result = {
472                        id       : aObject.oid,
473                        title    : aObject.oid_title,
474                        property : aObject.oid_property,
475                        style    : aObject.fid_style,
476                        dbtype   : aObject.dbtype,
477                };
478                window.openDialog("chrome://markingcollection/content/property.xul", "", "chrome,centerscreen,modal", id, result);
479                if(result.accept){
480                        this.refresh();
481                }
482                return result.accept;
483        },
484
485/////////////////////////////////////////////////////////////////////
486        _dump : function(aString){
487                window.top.bitsMarkingCollection._dump(aString);
488        },
489};
Note: See TracBrowser for help on using the repository browser.