source: DASISH/t5.6/client/branches/webannotator-basic/chrome/markingcollection/content/markingcollection/databaseDialog.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: 30.3 KB
Line 
1var mcDatabaseDialog = {
2
3        _xmlfile : null,
4        _xmldoc  : null,
5        _dbdir   : null,
6        _app_version : 2,
7
8/////////////////////////////////////////////////////////////////////
9// プロパティ
10/////////////////////////////////////////////////////////////////////
11        get BrowserWindow() { return Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator).getMostRecentWindow("navigator:browser"); },
12        get Common()     { return mcDatabaseDialog.BrowserWindow.bitsObjectMng.Common;     },
13        get XPath()      { return mcDatabaseDialog.BrowserWindow.bitsObjectMng.XPath;      },
14        get Database()   { return mcDatabaseDialog.BrowserWindow.bitsObjectMng.Database;   },
15               
16        /*
17        get DataSource() { return window.opener.top.bitsObjectMng.DataSource; },
18        get Common()     { return window.opener.top.bitsObjectMng.Common;     },
19        get XPath()      { return window.opener.top.bitsObjectMng.XPath;      },
20        get Database()   { return window.opener.top.bitsObjectMng.Database;   },
21        get XML()        { return window.opener.top.bitsObjectMng.XML;        },
22        get gBrowser()   { return window.opener.top.bitsObjectMng.getBrowser();},
23        */
24
25        get STRING()     { return document.getElementById("mcSettingString"); },
26
27        get TREE()       { return document.getElementById("mcDatabaseTree"); },
28        get MENU_ADD()   { return document.getElementById("mcDatabaseAdd"); },
29        get MENU_SET()   { return document.getElementById("mcDatabaseSet"); },
30        get MENU_DEL()   { return document.getElementById("mcDatabaseDel"); },
31        get MENU_DIS()   { return document.getElementById("mcDatabaseDis"); },
32        get CHK_UNUSED() { return document.getElementById("mcDatabaseStartupAllDBUnused"); },
33
34        get PANEL()      { return document.getElementById("mcDatabaseTabPanel"); },
35
36        get alldbunused(){ return nsPreferences.getBoolPref("wiredmarker.startup.alldbunused", false); },
37        set alldbunused(aVal){
38                var val = (aVal?true:false);
39                nsPreferences.setBoolPref("wiredmarker.startup.alldbunused", val);
40        },
41
42/////////////////////////////////////////////////////////////////////
43// メ゜ッド
44/////////////////////////////////////////////////////////////////////
45        init : function(aEvent){
46                try{
47                        var xmlfile = mcDatabaseDialog.Common.getExtensionDir().clone();
48                        xmlfile.append("db.xml");
49                        if(xmlfile.exists()){
50                                this._xmlfile = xmlfile;
51                                function _loadXMLDocument(pUri){
52                                        if(pUri == undefined) return undefined;
53                                        //var xmlDocument = window.opener.top.bitsMarkingCollection.loadXMLDocument(pUri);
54                                        var xmlDocument = mcDatabaseDialog.BrowserWindow.bitsMarkingCollection.loadXMLDocument(pUri);
55                                       
56                                        return xmlDocument;
57                                }
58                                function _createXMLDocument(aXMLFile){
59                                        if(!aXMLFile) return undefined;
60                                        try{
61                                                return _loadXMLDocument(mcDatabaseDialog.Common.IO.newFileURI(aXMLFile).spec);
62                                        }catch(ex){
63                                                mcDatabaseDialog._dump("mcDatabaseDialog._createXMLDocument():"+ ex);
64                                                return undefined;
65                                        }
66                                }
67                                this._xmldoc = _createXMLDocument(xmlfile);
68                        }
69                        var info = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULAppInfo);
70                        this._app_version = parseFloat(info.version);
71                }catch(e){}
72                if(!this._xmldoc) return;
73                this.CHK_UNUSED.checked = this.alldbunused;
74                this.rebuild();
75                this.TREE.addEventListener("click", this.onClick, false);
76                this.TREE.addEventListener("dblclick", this.onDblClick, false);
77                this.PANEL.addEventListener("command", this.eventListener, false);
78                if(this._app_version<3.1){
79                        this.TREE.addEventListener("draggesture", mcDatabaseDialog.onOldDraggesture, false);
80                        this.TREE.addEventListener("dragover", mcDatabaseDialog.onOldDragover, false);
81                        this.TREE.addEventListener("dragdrop", mcDatabaseDialog.onOldDragdrop, false);
82                        this.TREE.addEventListener("dragexit", mcDatabaseDialog.onOldDragexit, false);
83                }else{
84                        this.TREE.addEventListener("dragstart", mcDatabaseDialog.onDragEvents, false);
85                        this.TREE.addEventListener("drag", mcDatabaseDialog.onDragEvents, false);
86                        this.TREE.addEventListener("dragend", mcDatabaseDialog.onDragEvents, false);
87                        this.TREE.addEventListener("dragenter", mcDatabaseDialog.onDropEvents, false);
88                        this.TREE.addEventListener("dragover", mcDatabaseDialog.onDropEvents, false);
89                        this.TREE.addEventListener("dragleave", mcDatabaseDialog.onDropEvents, false);
90                        this.TREE.addEventListener("drop", mcDatabaseDialog.onDropEvents, false);
91                }
92        },
93
94/////////////////////////////////////////////////////////////////////
95        done : function(aEvent){
96                if(this._app_version<3.1){
97                        this.TREE.removeEventListener("draggesture", mcDatabaseDialog.onOldDraggesture, false);
98                        this.TREE.removeEventListener("dragover", mcDatabaseDialog.onOldDragover, false);
99                        this.TREE.removeEventListener("dragdrop", mcDatabaseDialog.onOldDragdrop, false);
100                        this.TREE.removeEventListener("dragexit", mcDatabaseDialog.onOldDragexit, false);
101                }else{
102                        this.TREE.removeEventListener("dragstart", mcDatabaseDialog.onDragEvents, false);
103                        this.TREE.removeEventListener("drag", mcDatabaseDialog.onDragEvents, false);
104                        this.TREE.removeEventListener("dragend", mcDatabaseDialog.onDragEvents, false);
105
106                        this.TREE.removeEventListener("dragenter", mcDatabaseDialog.onDropEvents, false);
107                        this.TREE.removeEventListener("dragover", mcDatabaseDialog.onDropEvents, false);
108                        this.TREE.removeEventListener("dragleave", mcDatabaseDialog.onDropEvents, false);
109                        this.TREE.removeEventListener("drop", mcDatabaseDialog.onDropEvents, false);
110                }
111                this._xmldoc = undefined;
112                this._xmlfile = undefined;
113        },
114
115/////////////////////////////////////////////////////////////////////
116// TREE 衚瀺制埡関連
117/////////////////////////////////////////////////////////////////////
118        get rowCount(){
119                var count = 0;
120                var xPathResult = this.XPath.evaluate('/DATABASES[1]/DATABASE[@hidden="false"]', this._xmldoc);
121                if(xPathResult) count = xPathResult.snapshotLength;
122                xPathResult = undefined;
123                return count;
124        },
125        getCellText : function(row,column){
126                var celltext = "";
127                var dbNode = this.getNodeFromXML(row);
128                var dataNode = dbNode.getElementsByTagName(column.id)[0];
129                if(dataNode) celltext = dataNode.textContent;
130                if(column.id == "DATABASE_DEFAULT") celltext = "";
131                if(column.id == "DATABASE_STATUS"){
132                        var disabled = dbNode.getAttribute("disabled");
133                        if(!disabled || disabled == "false"){
134                                celltext = this.STRING.getString("MSG_DATABASE_USE");
135                        }
136                }
137                return celltext;
138        },
139        setTree: function(treebox){ this.treebox = treebox; },
140        isContainer: function(row){ return false; },
141        isSeparator: function(row){ return false; },
142        isSorted: function(){ return false; },
143        getLevel: function(row){ return 0; },
144        getImageSrc: function(row,column){
145                if(column.id == "DATABASE_DEFAULT"){
146                        var dbNode = this.getNodeFromXML(row);
147                        var db_default = dbNode.getAttribute("db_default");
148                        return db_default == "true" ? "chrome://markingcollection/skin/radio-check.gif" : null;
149                }else if(column.id == "DATABASE_TITLE"){
150                        var dbNode = this.getNodeFromXML(row);
151                        var dataNode = dbNode.getElementsByTagName("DATABASE_ICON")[0];
152                        return dataNode?dataNode.textContent:null;
153                }else{
154                        return null;
155                }
156        },
157        getRowProperties: function(row,props){},
158        getCellProperties: function(row, column, prop) {
159                if(column.id == "DATABASE_TITLE"){
160                        var aserv=Components.classes["@mozilla.org/atom-service;1"].getService(Components.interfaces.nsIAtomService);
161//                      prop.Clear();
162                        prop.AppendElement(aserv.getAtom("Name"));
163                }
164        },
165        getColumnProperties: function(column, element, prop) {},
166        cycleHeader : function(col){},
167        setCellText : function(row,column,text){},
168        canDrop : function(row, orient){return true;},
169  getParentIndex: function(idx) { return -1; },
170        drop : function(row, orient){
171//              mcDatabaseDialog._dump("drop():row=["+row+"]:orient=["+orient+"]");
172                mcDatabaseDialog._drop(row, orient);
173        },
174        _drop : function(row, orient){
175                if(orient>0) row++;
176                if(row>=this.rowCount) row = this.rowCount-1;
177                var dropnode = this.getNodeFromXML(row);
178                if(!dropnode) return;
179                var dragnode = this.getNodeFromXML();
180                if(!dragnode) return;
181                if(dropnode == dragnode) return;
182                if(row==this.rowCount-1 && orient>0){
183                        dropnode.parentNode.appendChild(dragnode);
184                        this.TREE.currentIndex = row;
185                }else{
186                        dropnode.parentNode.insertBefore(dragnode,dropnode);
187                        this.TREE.currentIndex = row;
188                }
189                if(!this.TREE.view.selection.isSelected(this.TREE.currentIndex)) this.TREE.view.selection.select(this.TREE.currentIndex);
190                this.saveXML();
191                this.rebuild();
192        },
193
194        dragDropObserver :{
195                onDragStart : function(event, transferData, action){
196//                      mcDatabaseDialog._dump("dragDropObserver.onDragStart()");
197
198                        try{
199                                var id = mcDatabaseDialog.getIdFromXML();
200                                transferData.data = new TransferData();
201                                transferData.data.addDataForFlavour("moz/rdfitem", id);
202                        }catch(ex){
203                                mcDatabaseDialog._dump("dragDropObserver.onDragStart():"+ex);
204                        }
205
206
207                },
208                getSupportedFlavours : function(){
209//                      mcDatabaseDialog._dump("dragDropObserver.getSupportedFlavours()");
210                        var flavours = new FlavourSet();
211                        flavours.appendFlavour("moz/rdfitem");
212//                      flavours.appendFlavour("text/x-moz-url");
213//                      flavours.appendFlavour("text/html");
214//                      flavours.appendFlavour("text/xml");
215//                      flavours.appendFlavour("application/x-moz-url");
216//                      flavours.appendFlavour("application/x-moz-file","nsIFile");
217//                      flavours.appendFlavour("text/unicode");
218                        return flavours;
219                },
220                onDragOver : function(event, flavour, session){
221//                      mcDatabaseDialog._dump("dragDropObserver.onDragOver():flavour=["+flavour.contentType+"]");
222                        return;
223                        var row = {};
224                        var col = {};
225                        var obj = {};
226                        mcTreeHandler.TREE.treeBoxObject.getCellAt(event.clientX, event.clientY, row, col, obj);
227
228
229                        var aRow = row.value;
230                        if(aRow == undefined) return;
231                        if(aRow < 0) return;
232                        return;
233
234
235                        if(!mcTreeHandler.TREE.view.isContainer(aRow)) return;
236                        var isContainerOpen = mcTreeHandler.TREE.view.isContainerOpen(aRow);
237                        if(isContainerOpen) return;
238                        mcTreeDNDHandler.folderAutoOpenRow = aRow;
239                },
240                onDragExit : function(event, session){
241//                      mcDatabaseDialog._dump("dragDropObserver.onDragExit()");
242                        return;
243                        mcTreeDNDHandler.folderAutoOpenRow = -1;
244                        _dump("dragDropObserver.onDragExit()");
245                },
246                onDrop     : function(event, transferData, session){
247//                      mcDatabaseDialog._dump("dragDropObserver.onDrop()");
248                },
249        },
250
251/////////////////////////////////////////////////////////////////////
252// Drag & Drop Old Callback functions
253/////////////////////////////////////////////////////////////////////
254        onOldDraggesture: function(aEvent){
255                nsDragAndDrop.startDrag(aEvent,mcDatabaseDialog.dragDropObserver);
256                aEvent.stopPropagation();
257        },
258        onOldDragover: function(aEvent){
259                nsDragAndDrop.dragOver(aEvent,mcDatabaseDialog.dragDropObserver);
260                aEvent.stopPropagation();
261        },
262        onOldDragdrop: function(aEvent){
263                nsDragAndDrop.drop(aEvent,mcDatabaseDialog.dragDropObserver);
264                aEvent.stopPropagation();
265        },
266        onOldDragexit: function(aEvent){
267                nsDragAndDrop.dragExit(aEvent,mcDatabaseDialog.dragDropObserver);
268                aEvent.stopPropagation();
269        },
270
271/////////////////////////////////////////////////////////////////////
272// Drag & Drop New Callback functions
273/////////////////////////////////////////////////////////////////////
274        onDragEvents: function(aEvent){
275                switch (aEvent.type) {
276                        case "dragstart":
277                                try{
278                                        var id = mcDatabaseDialog.getIdFromXML();
279                                        var transferData = aEvent.dataTransfer;
280                                        transferData.setData("moz/rdfitem", id);
281                                }catch(ex){
282                                        mcDatabaseDialog._dump("mcDatabaseDialog.onDragEvents().dragstart:"+ex);
283                                }
284                                break;
285                        case "drag":
286                        break;
287                        case "dragend":
288                        break;
289                }
290        },
291
292        onDropEvents: function(aEvent){
293                switch (aEvent.type) {
294                        case "dragenter":
295                        case "dragover":
296                                aEvent.preventDefault();
297                                break;
298                        case "drop":
299                                aEvent.preventDefault();
300                                break;
301                }
302        },
303
304/////////////////////////////////////////////////////////////////////
305// TREE むベント関連
306/////////////////////////////////////////////////////////////////////
307        onClick: function(aEvent){
308                if(aEvent && aEvent.button != 0){
309                        aEvent.stopPropagation();
310                        return;
311                }
312                mcDatabaseDialog._onClick(aEvent);
313        },
314        _onClick: function(aEvent){
315//              this._dump("_onClick():this.TREE.view.selection.count="+this.TREE.view.selection.count);
316//              this._dump("_onClick():this.TREE.currentIndex="+this.TREE.currentIndex);
317
318                var disabled = (this.TREE.view.selection.count<=0 || this.TREE.currentIndex < 0 || this.TREE.currentIndex >= this.TREE.view.rowCount) ? 3 : 0;
319                if(!disabled){
320                        var id = this.getIdFromXML();
321                        if(id && id == "local") disabled |= 2;
322//                      var db_default = this.getDefaultFromXML();
323//                      if(db_default) disabled |= 2;
324                }
325                this.disabledMenu(disabled);
326        },
327
328        onDblClick: function(aEvent){
329                if(aEvent && aEvent.button != 0){
330                        aEvent.stopPropagation();
331                        return;
332                }
333                mcDatabaseDialog._onDblClick(aEvent);
334        },
335        _onDblClick: function(aEvent){
336                if(this.MENU_DIS.disabled) return;
337                this._onCommandDis(aEvent);
338        },
339
340/////////////////////////////////////////////////////////////////////
341// MENU むベント関連
342/////////////////////////////////////////////////////////////////////
343        eventListener : function(aEvent){
344//mcDatabaseDialog._dump("onCommand():aEvent="+aEvent.type);
345//mcDatabaseDialog._dump("onCommand():aEvent="+aEvent.target.id);
346                switch(aEvent.type){
347                        case "command" :
348                                mcDatabaseDialog.onCommand(aEvent);
349                                break;
350                        default :
351                                break;
352                }
353        },
354
355        onCommand : function(aEvent){
356                if(aEvent.target && aEvent.target.id){
357                        switch(aEvent.target.id){
358                                case "mcDatabaseAdd":
359                                        this._onCommandAdd(aEvent);
360                                        break;
361                                case "mcDatabaseSet":
362                                        this._onCommandSet(aEvent);
363                                        break;
364                                case "mcDatabaseDel":
365                                        this._onCommandDel(aEvent);
366                                        break;
367                                case "mcDatabaseDis":
368                                        this._onCommandDis(aEvent);
369                                        break;
370                                case "mcDatabaseStartupAllDBUnused":
371                                        this._onCommandStartupAllDBUnused(aEvent);
372                                        break;
373                                default:
374                                        break;
375                        }
376                }
377        },
378        _onCommandAdd : function(aEvent){
379//              this._dump("_onCommandAdd():this.TREE.view.selection.count="+this.TREE.view.selection.count);
380//              this._dump("_onCommandAdd():this.TREE.currentIndex="+this.TREE.currentIndex);
381
382                if(!this._dbdir) this._dbdir = this._xmlfile.parent.clone();
383
384                var dbfile = null;
385                var appname = this.STRING.getString("APP_TITLE").toLowerCase();
386                var filename = "";
387                var cnt;
388                for(cnt=0;;cnt++){
389                        dbfile = this._dbdir.clone();
390                        filename = appname;
391                        if(cnt) filename += "(" + cnt + ")";
392                        dbfile.append(filename + ".sqlite");
393                        if(!dbfile.exists()) break;
394                }
395                var dbfileURL = this.getNewDataFile(filename);
396                if(!dbfileURL) return;
397                _dump('_onCommandAdd');
398//              this._dump("_onCommandAdd():dbfileURL="+dbfileURL.spec);
399//              this._dump("_onCommandAdd():dbfileURL="+dbfileURL);
400
401                setTimeout(function(){ mcDatabaseDialog.checkUseDataFile(dbfileURL); },0);
402
403        },
404
405        _onCommandSet : function(aEvent){
406//              this._dump("_onCommandSet():this.TREE.view.selection.count="+this.TREE.view.selection.count);
407//              this._dump("_onCommandSet():this.TREE.currentIndex="+this.TREE.currentIndex);
408                this.openSetting();
409        },
410
411        _onCommandDel : function(aEvent){
412
413                var disabled = this.MENU_DEL.getAttribute("disabled");
414                if(disabled == "true") return;
415
416//              this._dump("_onCommandDel():this.TREE.view.selection.count="+this.TREE.view.selection.count);
417//              this._dump("_onCommandDel():this.TREE.currentIndex="+this.TREE.currentIndex);
418
419                var dbNode = this.getNodeFromXML();
420
421                var dbtype = null;
422                try{ dbtype = dbNode.getElementsByTagName("DATABASE_DBTYPE")[0].textContent; }catch(ex){}
423                if(dbtype){
424                        this.Database.done(dbtype);
425                }
426
427//              if(dbNode.nextSibling.nodeName == "#text")     dbNode.parentNode.removeChild(dbNode.nextSibling);
428//              if(dbNode.previousSibling.nodeName == "#text") dbNode.parentNode.removeChild(dbNode.previousSibling);
429//              dbNode.parentNode.removeChild(dbNode);
430
431                dbNode.setAttribute("disabled",true);
432                dbNode.setAttribute("hidden",true);
433                dbNode.setAttribute("db_contextmenu",false);
434
435                this.saveXML();
436
437                this.rebuild();
438                if(this.TREE.currentIndex >= this.TREE.view.rowCount){
439                        this.TREE.currentIndex = (this.TREE.view.rowCount>0?this.TREE.view.rowCount-1:-1);
440                        if(this.TREE.currentIndex<0){
441                                this.TREE.view.selection.clearSelection();
442                        }else{
443                                this.TREE.view.selection.select(this.TREE.currentIndex);
444                        }
445                }
446                this._onClick();
447        },
448
449        _onCommandDis : function(aEvent){
450//              this._dump("_onCommandDis():this.TREE.view.selection.count="+this.TREE.view.selection.count);
451//              this._dump("_onCommandDis():this.TREE.currentIndex="+this.TREE.currentIndex);
452
453                var dbNode = this.getNodeFromXML();
454                var disabled = dbNode.getAttribute("disabled");
455                if(!disabled || disabled == "false"){
456                        dbNode.setAttribute("disabled",true);
457                        dbNode.setAttribute("db_contextmenu",false);
458                }else{
459                        dbNode.removeAttribute("disabled");
460                        dbNode.setAttribute("db_contextmenu",true);
461                }
462
463                this.saveXML();
464
465                this.rebuild();
466        },
467
468        _onCommandStartupAllDBUnused : function(aEvent){
469                this.alldbunused = this.CHK_UNUSED.checked;
470        },
471
472/////////////////////////////////////////////////////////////////////
473        rebuild : function(){
474                this.TREE.view = mcDatabaseDialog;
475        },
476
477/////////////////////////////////////////////////////////////////////
478        getRootNodeFromXML : function(){
479                var xPathResult = this.XPath.evaluate('/DATABASES[1]', this._xmldoc);
480                if(!xPathResult) return undefined;
481                return xPathResult.snapshotItem(0);
482        },
483
484/////////////////////////////////////////////////////////////////////
485        getNodeFromXML : function(aRow){
486                if(aRow == undefined) aRow = this.TREE.currentIndex;
487                var xPathResult = this.XPath.evaluate('/DATABASES[1]/DATABASE[@hidden="false"]', this._xmldoc);
488                if(xPathResult && xPathResult.snapshotLength>0){
489                        return xPathResult.snapshotItem(aRow);
490                }else{
491                        return undefined;
492                }
493        },
494
495/////////////////////////////////////////////////////////////////////
496        getIdFromXML : function(){
497                var dbNode = this.getNodeFromXML();
498                return dbNode.getAttribute("id");
499        },
500
501/////////////////////////////////////////////////////////////////////
502        getDefaultFromXML : function(){
503                var dbNode = this.getNodeFromXML();
504                return dbNode.getAttribute("db_default")=="true"?true:false;
505        },
506
507/////////////////////////////////////////////////////////////////////
508        disabledMenu : function(aDisabled){
509                if(aDisabled & 1){
510                        this.MENU_SET.setAttribute("disabled", true);
511                        this.MENU_DIS.setAttribute("disabled", true);
512                }else{
513                        this.MENU_SET.removeAttribute("disabled");
514                        this.MENU_DIS.removeAttribute("disabled");
515                }
516
517                if(aDisabled & 2){
518                        this.MENU_DEL.setAttribute("disabled", true);
519                }else{
520                        this.MENU_DEL.removeAttribute("disabled");
521                }
522        },
523
524/////////////////////////////////////////////////////////////////////
525        getNewDataFile : function (aTitle){
526                var result = null;
527                var picker = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker);
528                var pickerMode;
529               
530                var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
531                var check = {value: false};
532                var flags = prompts.BUTTON_TITLE_YES * prompts.BUTTON_POS_0 + prompts.BUTTON_TITLE_IS_STRING  * prompts.BUTTON_POS_1 + prompts.BUTTON_TITLE_NO * prompts.BUTTON_POS_2;
533                var button = prompts.confirmEx(window, this.STRING.getString("MSG_ADD_DATAFILE"), this.STRING.getString("CONFIRM_NEW_DATAFILE"), flags, "Button 0", this.STRING.getString("MSG_EXISTING_DATABASE"), "Button 2", null, check);
534                if(button == 0){
535                        pickerMode = picker.modeSave;
536                }else if(button == 1){
537                        pickerMode = picker.modeOpen;
538                }else{
539                        return;
540                }
541                try{
542                        picker.init(window, "Selected File", pickerMode);
543                        if(aTitle && pickerMode != picker.modeOpen) picker.defaultString  = aTitle + ".sqlite";
544                        picker.defaultExtension = ".sqlite";
545                        picker.displayDirectory = (this._dbdir?this._dbdir:this._xmlfile.parent);
546                        picker.appendFilter(this.STRING.getString("MSG_DATAFILE") + " (*.sqlite)","*.sqlite");
547                        picker.appendFilter("All Files (*.*)","*.sqlite");
548                        var showResult = picker.show();
549                        if(showResult == picker.returnOK){
550                                result = picker.fileURL;
551                        }else if(showResult == picker.returnReplace){
552                                if(picker.file.exists()) picker.file.remove(false);
553                                result = picker.fileURL;
554                        }
555                }catch(e){
556                        result = null;
557                        this.Common.alert(e);
558                }
559                if(result && !result.file){
560                        result = result.QueryInterface(Components.interfaces.nsIURL);
561                        result = result.QueryInterface(Components.interfaces.nsIFileURL);
562                }
563                return result;
564        },
565
566/////////////////////////////////////////////////////////////////////
567        checkUseDataFile : function (aURL){
568                _dump("checkUseDataFile:START");
569                try{
570                if(!aURL) return;
571                var msg  = this.STRING.getString("MSG_DATAFILE") +  "[" + this.Common.splitFileName(aURL.file.leafName)[0] + "]\n\n";
572                msg += this.STRING.getString("ERROR_ADD_DATAFILE_3");
573
574                var xPathResult = this.XPath.evaluate('/DATABASES[1]/DATABASE[@hidden="false"]/DATABASE_FILE', this._xmldoc);
575                if(xPathResult){
576                        _dump("checkUseDataFile:1");
577                        var ncnt;
578                        for(ncnt=0;ncnt<xPathResult.snapshotLength;ncnt++){
579                                var node = xPathResult.snapshotItem(ncnt);
580                                if(!node || node.textContent != aURL.spec) continue;
581
582                                var nameNode = node.parentNode.getElementsByTagName("DATABASE_TITLE")[0];
583                                if(nameNode){
584                                        msg  = this.STRING.getString("MSG_DATAFILE") +  "[" + this.Common.splitFileName(aURL.file.leafName)[0] + "]\n";
585                                        msg += this.STRING.getString("MSG_USE_TITLE") +  "[" + nameNode.textContent + "]\n\n";
586                                        msg += this.STRING.getString("ERROR_ADD_DATAFILE_3");
587                                }
588
589                                aURL = undefined;
590                                break;
591                        }
592                }
593                if(!aURL){
594                        _dump("checkUseDataFile:2");
595                        var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
596                        var check = {value: false};
597                        var flags = prompts.BUTTON_TITLE_YES * prompts.BUTTON_POS_0 + prompts.BUTTON_TITLE_NO  * prompts.BUTTON_POS_1;
598                        var button = prompts.confirmEx(window, this.STRING.getString("MSG_ADD_DATAFILE"), msg, flags, "Button 0", "Button 1", "Button 2", null, check);
599                        if(button == 0) setTimeout(function(){ mcDatabaseDialog._onCommandAdd(); },0);
600                }else{
601                        _dump("checkUseDataFile:3");
602                        var timeStamp = this.Common.getTimeStamp();
603                        var newNode = true;
604                        var xPathResult = this.XPath.evaluate('/DATABASES[1]/DATABASE[@hidden="true"]/DATABASE_FILE', this._xmldoc);
605                        if(xPathResult){
606                                var ncnt;
607                                for(ncnt=0;ncnt<xPathResult.snapshotLength;ncnt++){
608                                        var node = xPathResult.snapshotItem(ncnt);
609                                        if(node && node.textContent == aURL.spec) break;
610                                }
611                                if(ncnt<xPathResult.snapshotLength){
612                                        var lastNode = null;
613                                        var xPathResultT = this.XPath.evaluate('/DATABASES[1]/DATABASE[@hidden="false"]', this._xmldoc);
614                                        if(xPathResultT && xPathResultT.snapshotLength>0) lastNode = xPathResultT.snapshotItem(xPathResultT.snapshotLength-1);
615
616                                        var node = xPathResult.snapshotItem(ncnt);
617                                        var cloneNode = node.parentNode.cloneNode(true);
618                                        node.parentNode.parentNode.removeChild(node.parentNode);
619
620                                        cloneNode.setAttribute("disabled","true");
621                                        cloneNode.setAttribute("hidden","false");
622                                        cloneNode.setAttribute("db_order",timeStamp);
623
624                                        if(lastNode){
625                                                var nextSibling = lastNode.nextSibling;
626                                                while(nextSibling && nextSibling.nodeType != 1){
627                                                        nextSibling = nextSibling.nextSibling;
628                                                }
629                                                if(nextSibling){
630                                                        lastNode.parentNode.insertBefore(cloneNode,nextSibling);
631                                                }else{
632                                                        lastNode.parentNode.appendChild(cloneNode);
633                                                }
634                                        }
635                                        newNode = false;
636                                }
637                        }
638                        if(newNode){
639                                _dump("checkUseDataFile:4");
640                                var dbid = "local"+timeStamp;
641                                var rootNode = this.getRootNodeFromXML();
642
643                                var dbNode = this._xmldoc.createElement("DATABASE");
644                                dbNode.setAttribute("id",dbid);
645                                dbNode.setAttribute("disabled","true");
646                                dbNode.setAttribute("hidden","false");
647                                dbNode.setAttribute("db_order",timeStamp);
648                                rootNode.appendChild(dbNode)
649
650                                textNode = this._xmldoc.createTextNode("\n");
651                                rootNode.appendChild(textNode);
652
653                                var dbinfo = {
654                                        title   : this.Common.splitFileName(aURL.file.leafName)[0],
655                                        dbtype  : dbid,
656                                        file    : aURL.spec,
657                                        icon    : "chrome://markingcollection/skin/database.png",
658                                        comment : null,
659                                };
660
661                                textNode = this._xmldoc.createTextNode("\n    ");
662                                dbNode.appendChild(textNode);
663
664                                var childNode = this._xmldoc.createElement("DATABASE_TITLE");
665                                textNode = this._xmldoc.createTextNode(dbinfo.title);
666                                childNode.appendChild(textNode);
667                                dbNode.appendChild(childNode);
668
669                                textNode = this._xmldoc.createTextNode("\n    ");
670                                dbNode.appendChild(textNode);
671
672                                childNode = this._xmldoc.createElement("DATABASE_DBTYPE");
673                                textNode = this._xmldoc.createTextNode(dbinfo.dbtype);
674                                childNode.appendChild(textNode);
675                                dbNode.appendChild(childNode);
676
677                                textNode = this._xmldoc.createTextNode("\n    ");
678                                dbNode.appendChild(textNode);
679
680                                childNode = this._xmldoc.createElement("DATABASE_FILE");
681                                textNode = this._xmldoc.createTextNode(dbinfo.file);
682                                childNode.appendChild(textNode);
683                                dbNode.appendChild(childNode);
684
685                                textNode = this._xmldoc.createTextNode("\n    ");
686                                dbNode.appendChild(textNode);
687
688                                childNode = this._xmldoc.createElement("DATABASE_ICON");
689                                textNode = this._xmldoc.createTextNode(dbinfo.icon);
690                                childNode.appendChild(textNode);
691                                dbNode.appendChild(childNode);
692
693                                textNode = this._xmldoc.createTextNode("\n  ");
694                                dbNode.appendChild(textNode);
695                        }
696                        this.rebuild();
697                        this.TREE.view.selection.select(this.TREE.view.rowCount-1);
698                        this._onClick();
699                        this._dbdir = aURL.file.parent.clone();
700                        setTimeout(function(){ mcDatabaseDialog.openSetting(dbinfo); },0);
701                }
702                }catch(e){
703                        alert(e);       
704                }
705                _dump("checkUseDataFile:END");
706        },
707
708/////////////////////////////////////////////////////////////////////
709        openSetting : function (aDbinfo){
710               
711                try{
712               
713                var result = {};
714                var newInfo = (aDbinfo?true:false);
715                if(!aDbinfo){
716                        aDbinfo = {
717                                title   : null,
718                                dbtype  : null,
719                                file    : null,
720                                icon    : null,
721                                comment : null,
722                        };
723                        var dbNode = this.getNodeFromXML();
724                        try{ aDbinfo.title   = dbNode.getElementsByTagName("DATABASE_TITLE")[0].textContent; }catch(ex){this.Common.alert(ex)}
725                        try{ aDbinfo.dbtype  = dbNode.getElementsByTagName("DATABASE_DBTYPE")[0].textContent; }catch(ex){}
726                        try{ aDbinfo.file    = dbNode.getElementsByTagName("DATABASE_FILE")[0].textContent; }catch(ex){}
727                        try{ aDbinfo.icon    = dbNode.getElementsByTagName("DATABASE_ICON")[0].textContent; }catch(ex){}
728                        try{ aDbinfo.comment = dbNode.getElementsByTagName("DATABASE_COMMENT")[0].textContent; }catch(ex){}
729                        try{ aDbinfo.use     = (dbNode.getAttribute("disabled")=="true"?false:true); }catch(ex){}
730                        try{ aDbinfo.contextmenu = (dbNode.getAttribute("db_contextmenu")=="true"?true:false); }catch(ex){}
731                        try{ aDbinfo.default     = (dbNode.getAttribute("db_default")=="true"?true:false); }catch(ex){}
732                }
733                if(aDbinfo){
734                        var key;
735                        for(key in aDbinfo){
736                                result[key] = aDbinfo[key];
737                        }
738                }
739                result.accept = false;
740                window.openDialog("chrome://markingcollection/content/databasePropDialog.xul", "", "chrome,centerscreen,modal", result);
741                if(result.accept){
742                        var dbNode = this.getNodeFromXML();
743                        var key;
744                        for(key in result){
745                                if(aDbinfo[key] == result[key]) continue;
746                                if(key == "accept") continue;
747                                if(key == "default" && result[key]){
748                                        var xPathResult = this.XPath.evaluate('/DATABASES[1]/DATABASE', this._xmldoc);
749                                        if(xPathResult){
750                                                var ncnt;
751                                                for(ncnt=0;ncnt<xPathResult.snapshotLength;ncnt++){
752                                                        var node = xPathResult.snapshotItem(ncnt);
753                                                        if(!node) continue;
754                                                        node.removeAttribute("db_default");
755                                                }
756                                        }
757                                        var xPathResult = this.XPath.evaluate('/DATABASES[1]/DATABASE/DATABASE_ICON', this._xmldoc);
758                                        if(xPathResult){
759                                                var ncnt;
760                                                for(ncnt=0;ncnt<xPathResult.snapshotLength;ncnt++){
761                                                        var node = xPathResult.snapshotItem(ncnt);
762                                                        if(!node) continue;
763                                                        node.textContent = "chrome://markingcollection/skin/database.png";
764                                                }
765                                        }
766                                        dbNode.setAttribute("db_default",result[key]);
767                                        try{ dbNode.getElementsByTagName("DATABASE_ICON")[0].textContent = "chrome://markingcollection/skin/localfolder.png"; }catch(ex){}
768                                        if(result[key]){
769                                                result.use = true;
770                                                dbNode.removeAttribute("disabled");
771                                        }
772                                        continue;
773                                }
774                                if(key == "contextmenu"){
775                                        dbNode.setAttribute("db_contextmenu",result[key]);
776                                        continue;
777                                }
778                                if(key == "use"){
779                                        if(result[key]){
780                                                dbNode.removeAttribute("disabled");
781                                        }else{
782                                                dbNode.setAttribute("disabled",true);
783                                        }
784                                        continue;
785                                }
786
787                                var tag = "DATABASE_" + key.toUpperCase();
788                                var node = dbNode.getElementsByTagName(tag)[0];
789                                if(result[key] && !node){
790
791                                        var textNode = this._xmldoc.createTextNode("  ");
792                                        dbNode.appendChild(textNode);
793
794                                        node = this._xmldoc.createElement(tag);
795                                        textNode = this._xmldoc.createTextNode(result[key]);
796                                        node.appendChild(textNode);
797                                        dbNode.appendChild(node);
798
799                                        textNode = this._xmldoc.createTextNode("\n  ");
800                                        dbNode.appendChild(textNode);
801
802                                }
803                                if(!result[key] && node){
804                                        if(node.nextSibling .nodeName == "#text")    node.parentNode.removeChild(node.nextSibling );
805                                        if(node.previousSibling.nodeName == "#text") node.parentNode.removeChild(node.previousSibling);
806                                        node.parentNode.removeChild(node);
807                                }
808                                if(result[key] && node){
809                                        var textNode = this._xmldoc.createTextNode(result[key]);
810                                        node.replaceChild(textNode,node.firstChild);
811                                }
812                        }
813                        this.saveXML();
814                }else{
815                        if(newInfo) this._onCommandDel();
816                }
817
818                this.rebuild();
819                this._onClick();
820               
821                }catch(e){
822                        alert(e);
823                }
824
825        },
826
827/////////////////////////////////////////////////////////////////////
828        saveXML : function(){
829                var xPathResult = this.XPath.evaluate('/DATABASES[1]/DATABASE', this._xmldoc);
830                if(xPathResult){
831                        var ncnt;
832                        var db_order=0;
833                        for(ncnt=0;ncnt<xPathResult.snapshotLength;ncnt++){
834                                var node = xPathResult.snapshotItem(ncnt);
835                                if(!node) continue;
836                                node.setAttribute("db_order",++db_order);
837                                while(node.previousSibling && node.previousSibling.nodeName == "#text"){
838                                        node.previousSibling.parentNode.removeChild(node.previousSibling);
839                                }
840                                while(node.nextSibling && node.nextSibling.nodeName == "#text"){
841                                        node.nextSibling.parentNode.removeChild(node.nextSibling);
842                                }
843                                var textNode = this._xmldoc.createTextNode("\n  ");
844                                node.parentNode.insertBefore(textNode,node);
845
846                                textNode = this._xmldoc.createTextNode("\n");
847                                if(node.nextSibling){
848                                        node.parentNode.insertBefore(textNode,node.nextSibling);
849                                }else{
850                                        node.parentNode.appendChild(textNode);
851                                }
852                        }
853                }
854                var s = new XMLSerializer();
855                var xml = s.serializeToString(this._xmldoc);
856                this.Common.writeFile(this._xmlfile, xml+"\n", "UTF-8");
857        },
858
859/////////////////////////////////////////////////////////////////////
860        _dump : function(aString){
861                if(nsPreferences.getBoolPref("wiredmarker.debug", false)) window.dump(mcDatabaseDialog.Common.convertFormUnicode(aString,"Shift_jis")+"\n");
862        },
863};
Note: See TracBrowser for help on using the repository browser.