1 | var mcTreeTemplateFolder = { |
---|
2 | |
---|
3 | get STRING() { return document.getElementById("mcMainString"); }, |
---|
4 | |
---|
5 | get DataSource() { return window.top.bitsObjectMng.DataSource; }, |
---|
6 | get Common() { return window.top.bitsObjectMng.Common; }, |
---|
7 | get Database() { return window.top.bitsObjectMng.Database; }, |
---|
8 | get XML() { return window.top.bitsObjectMng.XML; }, |
---|
9 | get gBrowser() { return window.top.bitsObjectMng.getBrowser();}, |
---|
10 | |
---|
11 | get DEFAULT_TEMPLATE(){ |
---|
12 | var defname = mcTreeTemplateFolder.STRING.getString("MARKER_FOLDER"); |
---|
13 | var note = mcTreeTemplateFolder.STRING.getString("TEMPLATE_MARKER_FOLDER_COMMENT"); |
---|
14 | var tmpArr = [ |
---|
15 | '<?xml version="1.0" encoding="utf-8"?>', |
---|
16 | '<!DOCTYPE TEMPLATE>', |
---|
17 | '<TEMPLATE>', |
---|
18 | ' <TITLE>'+defname+'</TITLE>', |
---|
19 | ' <NOTE>'+note+'</NOTE>', |
---|
20 | ' <FOLDER title="'+defname+'" style="" note="">', |
---|
21 | ' <FOLDER title="'+defname+'1" style="' + mcTreeTemplateFolder.STRING.getString("MARKER_CUSTOM_1") + '" note="" />', |
---|
22 | ' <FOLDER title="'+defname+'2" style="' + mcTreeTemplateFolder.STRING.getString("MARKER_CUSTOM_2") + '" note="" />', |
---|
23 | ' <FOLDER title="'+defname+'3" style="' + mcTreeTemplateFolder.STRING.getString("MARKER_CUSTOM_3") + '" note="" />', |
---|
24 | ' <FOLDER title="'+defname+'4" style="' + mcTreeTemplateFolder.STRING.getString("MARKER_CUSTOM_4") + '" note="" />', |
---|
25 | ' <FOLDER title="'+defname+'5" style="' + mcTreeTemplateFolder.STRING.getString("MARKER_CUSTOM_5") + '" note="" />', |
---|
26 | ' <FOLDER title="'+defname+'6" style="' + mcTreeTemplateFolder.STRING.getString("MARKER_CUSTOM_6") + '" note="" />', |
---|
27 | ' <FOLDER title="'+defname+'7" style="' + mcTreeTemplateFolder.STRING.getString("MARKER_CUSTOM_7") + '" note="" />', |
---|
28 | ' <FOLDER title="'+defname+'8" style="' + mcTreeTemplateFolder.STRING.getString("MARKER_CUSTOM_8") + '" note="" />', |
---|
29 | ' </FOLDER>', |
---|
30 | '</TEMPLATE>' |
---|
31 | ]; |
---|
32 | return tmpArr.join("\n"); |
---|
33 | }, |
---|
34 | |
---|
35 | init : function(){ |
---|
36 | var file = this.getTemplateDir(); |
---|
37 | var num = 0; |
---|
38 | var entries = file.directoryEntries; |
---|
39 | while(entries.hasMoreElements()){ |
---|
40 | var entry = entries.getNext().QueryInterface(Components.interfaces.nsILocalFile); |
---|
41 | if(!entry.isFile()) continue; |
---|
42 | num++; |
---|
43 | } |
---|
44 | if(num==0){ |
---|
45 | var defname = this.STRING.getString("TEMPLATE_MARKER_TITLE"); |
---|
46 | file.append(escape(defname)); |
---|
47 | this.Common.writeFile(file, this.DEFAULT_TEMPLATE, "UTF-8"); |
---|
48 | } |
---|
49 | }, |
---|
50 | |
---|
51 | done : function(){}, |
---|
52 | |
---|
53 | createFolder : function(aNode,aPfid,aRes){ |
---|
54 | var title = aNode.getAttribute("title"); |
---|
55 | var style = aNode.getAttribute("style"); |
---|
56 | var dbtype = this.DataSource.getProperty(aRes,"dbtype"); |
---|
57 | var newFolder = this.Database.newFolder(undefined,dbtype); |
---|
58 | newFolder.fid_title = title; |
---|
59 | newFolder.fid_style = style; |
---|
60 | newFolder.pfid = ""+aPfid; |
---|
61 | newFolder.fid_mode = ""+0; |
---|
62 | if(!this.Database.addFolder(newFolder,dbtype)) return null; |
---|
63 | var pfid = newFolder.fid; |
---|
64 | var newID = this.DataSource.identify(newFolder.fid); |
---|
65 | var newItem = this.Common.newItem(); |
---|
66 | newItem.about = this.DataSource.ABOUT_ITEM + newID; |
---|
67 | newItem.id = newFolder.fid; |
---|
68 | newItem.pfid = newFolder.pfid; |
---|
69 | newItem.title = title; |
---|
70 | newItem.type = "folder"; |
---|
71 | newItem.style = style; |
---|
72 | newItem.cssrule = 'css_'+dbtype+'_'+newID; |
---|
73 | newItem.editmode = newFolder.fid_mode; |
---|
74 | newItem.dbtype = dbtype; |
---|
75 | var tarResName = aRes.Value; |
---|
76 | var tarRelIdx; |
---|
77 | try{ |
---|
78 | var cont = this.DataSource.getContainer(tarResName, false); |
---|
79 | tarRelIdx = cont.GetCount(); |
---|
80 | }catch(ex){ |
---|
81 | tarRelIdx = -1; |
---|
82 | } |
---|
83 | var newRes = this.DataSource.addItem(newItem, tarResName, tarRelIdx, dbtype); |
---|
84 | if(newRes && newRes.Value){ |
---|
85 | this.DataSource.flush(); |
---|
86 | this.DataSource.createEmptySeq(newRes.Value); |
---|
87 | }else{ |
---|
88 | this.Database.removeFolder({fid:pfid},dbtype); |
---|
89 | return null; |
---|
90 | } |
---|
91 | var pfid_order=0; |
---|
92 | var childNodes = aNode.childNodes; |
---|
93 | for(var i=0;i<childNodes.length;i++){ |
---|
94 | switch(childNodes[i].nodeName){ |
---|
95 | case "FOLDER": |
---|
96 | var rtn = mcTreeTemplateFolder.createFolder(childNodes[i],pfid,newRes); |
---|
97 | if(rtn){ |
---|
98 | pfid_order++; |
---|
99 | this.Database.updateFolder({fid:rtn.fid,pfid_order:pfid_order},dbtype); |
---|
100 | }else{ |
---|
101 | this.Database.removeFolder({fid:pfid},dbtype); |
---|
102 | return null; |
---|
103 | } |
---|
104 | break; |
---|
105 | default: |
---|
106 | break; |
---|
107 | } |
---|
108 | } |
---|
109 | return {fid:pfid,res:newRes}; |
---|
110 | }, |
---|
111 | |
---|
112 | onCommand : function(aEvent,aIndex){ |
---|
113 | setTimeout(function(){ mcTreeTemplateFolder._onCommand(aEvent,aIndex); },0); |
---|
114 | }, |
---|
115 | |
---|
116 | _onCommand : function(aEvent,aIndex){ |
---|
117 | var curIdx = aIndex; |
---|
118 | var curRes = null; |
---|
119 | if(curIdx>=0){ |
---|
120 | if(!mcTreeHandler.TREE.view.isContainer(curIdx)) return; |
---|
121 | curRes = mcTreeHandler.TREE.builderView.getResourceAtIndex(curIdx); |
---|
122 | if(!mcTreeHandler.TREE.view.isContainerOpen(curIdx)) mcTreeHandler.TREE.view.toggleOpenState(curIdx); |
---|
123 | }else{ |
---|
124 | return; |
---|
125 | } |
---|
126 | var pfid = this.DataSource.getProperty(curRes,"id"); |
---|
127 | var dbtype = this.DataSource.getProperty(curRes,"dbtype"); |
---|
128 | var rtn; |
---|
129 | var uri = this.Common.convertFilePathToURL(aEvent.target.id); |
---|
130 | var xmldoc = window.top.bitsMarkingCollection.loadXMLDocument(uri); |
---|
131 | if(xmldoc){ |
---|
132 | var elem = xmldoc.getElementsByTagName("TEMPLATE"); |
---|
133 | if(elem && elem.length>0){ |
---|
134 | var contResList = this.DataSource.seqResources(curRes); |
---|
135 | var pfid_order=contResList.length; |
---|
136 | var childNodes = elem[0].childNodes; |
---|
137 | for(var i=0;i<childNodes.length;i++){ |
---|
138 | switch(childNodes[i].nodeName){ |
---|
139 | case "FOLDER": |
---|
140 | rtn = mcTreeTemplateFolder.createFolder(childNodes[i],pfid,curRes); |
---|
141 | if(rtn){ |
---|
142 | pfid_order++; |
---|
143 | this.Database.updateFolder({fid:rtn.fid,pfid_order:pfid_order},dbtype); |
---|
144 | }else{ |
---|
145 | return; |
---|
146 | } |
---|
147 | break; |
---|
148 | default: |
---|
149 | break; |
---|
150 | } |
---|
151 | } |
---|
152 | } |
---|
153 | } |
---|
154 | if(!rtn) return; |
---|
155 | mcTreeCssService.init(); |
---|
156 | mcTreeHandler.TREE.builder.rebuild(); |
---|
157 | var newRes = this.Common.RDF.GetResource(rtn.res.Value); |
---|
158 | var newIdx = mcTreeHandler.TREE.builderView.getIndexOfResource(newRes); |
---|
159 | if(!mcTreeHandler.TREE.view.isContainerOpen(newIdx)) mcTreeHandler.TREE.view.toggleOpenState(newIdx); |
---|
160 | mcTreeHandler.TREE.view.selection.select(newIdx); |
---|
161 | mcTreeHandler.TREE.focus(); |
---|
162 | var result = mcController.property(newRes); |
---|
163 | if(result){ |
---|
164 | window.top.bitsMarkingCollection.reOrder(curRes); |
---|
165 | }else{ |
---|
166 | mcTreeHandler.remove(undefined,undefined,true); |
---|
167 | } |
---|
168 | mcController.rebuildLocal(); |
---|
169 | var selectIdx = newIdx; |
---|
170 | if(selectIdx>=0){ |
---|
171 | mcTreeHandler.TREE.currentIndex = selectIdx; |
---|
172 | if(!mcTreeHandler.TREE.view.selection.isSelected(mcTreeHandler.TREE.currentIndex)) mcTreeHandler.TREE.view.selection.select(mcTreeHandler.TREE.currentIndex); |
---|
173 | mcTreeHandler.TREE.focus(); |
---|
174 | mcTreeHandler.TREE.treeBoxObject.ensureRowIsVisible(selectIdx); |
---|
175 | mcPropertyView.dispProperty(mcTreeHandler.object); |
---|
176 | } |
---|
177 | |
---|
178 | }, |
---|
179 | |
---|
180 | createMenu : function(aParentNode,aEntry){ |
---|
181 | if(aEntry.isFile()){ |
---|
182 | var elemMenuitem = aParentNode.ownerDocument.createElement("menuitem"); |
---|
183 | if(elemMenuitem){ |
---|
184 | var label = unescape(aEntry.leafName); |
---|
185 | if(label.lastIndexOf(".xml")>=0) label = label.substr(0,label.lastIndexOf(".xml")); |
---|
186 | elemMenuitem.setAttribute("id",aEntry.path); |
---|
187 | elemMenuitem.setAttribute("label",label+"..."); |
---|
188 | elemMenuitem.setAttribute("image","chrome://markingcollection/skin/add-template-folder.png"); |
---|
189 | elemMenuitem.setAttribute("class","menuitem-iconic"); |
---|
190 | aParentNode.appendChild(elemMenuitem); |
---|
191 | } |
---|
192 | }else if(aEntry.isDirectory()){ |
---|
193 | var elemMenuSub = top.document.createElement("menu"); |
---|
194 | var elemMenuSubpopup = top.document.createElement("menupopup"); |
---|
195 | if(!elemMenuSub || !elemMenuSubpopup) return; |
---|
196 | elemMenuSub.setAttribute("label",unescape(aEntry.leafName)); |
---|
197 | elemMenuSub.setAttribute("class","menu-iconic"); |
---|
198 | elemMenuSub.setAttribute("image","chrome://markingcollection/skin/treefolder.png"); |
---|
199 | elemMenuSubpopup.setAttribute("id",aEntry.path); |
---|
200 | elemMenuSub.appendChild(elemMenuSubpopup); |
---|
201 | aParentNode.appendChild(elemMenuSub); |
---|
202 | var entries = aEntry.directoryEntries; |
---|
203 | while(entries.hasMoreElements()){ |
---|
204 | var entry = entries.getNext().QueryInterface(Components.interfaces.nsILocalFile); |
---|
205 | mcTreeTemplateFolder.createMenu(elemMenuSubpopup,entry); |
---|
206 | } |
---|
207 | } |
---|
208 | }, |
---|
209 | |
---|
210 | onPopupShowingMng : function(aEvent){ |
---|
211 | var fileNum = 0; |
---|
212 | var dir = mcTreeTemplateFolder.getTemplateDir(); |
---|
213 | var entries = dir.directoryEntries; |
---|
214 | while(entries.hasMoreElements()){ |
---|
215 | var entry = entries.getNext().QueryInterface(Components.interfaces.nsILocalFile); |
---|
216 | if(unescape(entry.leafName) == this.STRING.getString("TEMPLATE_MARKER_TITLE")) continue; |
---|
217 | fileNum++; |
---|
218 | } |
---|
219 | if(fileNum==0){ |
---|
220 | document.getElementById("mcPopupTemplateFolderRemove").setAttribute("disabled","true"); |
---|
221 | document.getElementById("mcPopupFolderTemplateFolderRemove").setAttribute("disabled","true"); |
---|
222 | }else{ |
---|
223 | document.getElementById("mcPopupTemplateFolderRemove").removeAttribute("disabled"); |
---|
224 | document.getElementById("mcPopupFolderTemplateFolderRemove").removeAttribute("disabled"); |
---|
225 | } |
---|
226 | }, |
---|
227 | |
---|
228 | onPopupShowing : function(aEvent){ |
---|
229 | var dir = mcTreeTemplateFolder.getTemplateDir(); |
---|
230 | var entries = dir.directoryEntries; |
---|
231 | while(entries.hasMoreElements()){ |
---|
232 | var entry = entries.getNext().QueryInterface(Components.interfaces.nsILocalFile); |
---|
233 | mcTreeTemplateFolder.createMenu(aEvent.target,entry); |
---|
234 | } |
---|
235 | }, |
---|
236 | |
---|
237 | onPopupHiding : function(aEvent){ |
---|
238 | var elem = aEvent.target.lastChild; |
---|
239 | for(var i=aEvent.target.childNodes.length-1;i>=0;i--){ |
---|
240 | if(aEvent.target.childNodes[i].nodeName == "menuseparator") break; |
---|
241 | aEvent.target.removeChild(aEvent.target.childNodes[i]); |
---|
242 | } |
---|
243 | }, |
---|
244 | |
---|
245 | |
---|
246 | onClick : function(aEvent,aIndex){ |
---|
247 | var curIdx = aIndex; |
---|
248 | var aRes = null; |
---|
249 | if(curIdx>=0){ |
---|
250 | if(!mcTreeHandler.TREE.view.isContainer(curIdx)) return; |
---|
251 | aRes = mcTreeHandler.TREE.builderView.getResourceAtIndex(curIdx); |
---|
252 | var result = {}; |
---|
253 | result.title = this.DataSource.getProperty(aRes,"title"); |
---|
254 | result.note = this.DataSource.getProperty(aRes,"note"); |
---|
255 | result.accept = true; |
---|
256 | window.openDialog("chrome://markingcollection/content/templatefolderproperty.xul", "", "chrome,centerscreen,modal", result); |
---|
257 | if(result.accept){ |
---|
258 | var file = mcTreeTemplateFolder.getTemplateDir(); |
---|
259 | file.append(escape(result.title)); |
---|
260 | if(file.exists()){ |
---|
261 | var confirm_mng = mcTreeTemplateFolder.STRING.getString("CONFIRM_TEMPLATE_UPDATE"); |
---|
262 | if(this.Common.confirm(confirm_mng)){ |
---|
263 | file.remove(false); |
---|
264 | }else{ |
---|
265 | mcTreeTemplateFolder.onClick(aEvent,aIndex); |
---|
266 | return; |
---|
267 | } |
---|
268 | } |
---|
269 | file.create(file.NORMAL_FILE_TYPE, 0666); |
---|
270 | ostream = Components.classes['@mozilla.org/network/file-output-stream;1'].createInstance(Components.interfaces.nsIFileOutputStream); |
---|
271 | ostream.init(file, 2, 0x200, false); |
---|
272 | result.title = result.title.replace(/&/mg,"&").replace(/</mg,"<").replace(/>/mg,">").replace(/\"/mg,"""); |
---|
273 | result.note = result.note.replace(/&/mg,"&").replace(/</mg,"<").replace(/>/mg,">").replace(/\"/mg,"""); |
---|
274 | var aContent = '<?xml version="1.0" encoding="utf-8"?>\n<!DOCTYPE TEMPLATE>\n<TEMPLATE>\n <TITLE>'+result.title+'</TITLE>\n <NOTE>'+result.note+'</NOTE>\n'; |
---|
275 | this.Common.UNICODE.charset = "UTF-8"; |
---|
276 | aContent = this.Common.UNICODE.ConvertFromUnicode(aContent); |
---|
277 | ostream.write(aContent, aContent.length); |
---|
278 | mcTreeTemplateFolder.createTemplate(aRes,ostream); |
---|
279 | aContent = "</TEMPLATE>\n"; |
---|
280 | this.Common.UNICODE.charset = "UTF-8"; |
---|
281 | aContent = this.Common.UNICODE.ConvertFromUnicode(aContent); |
---|
282 | ostream.write(aContent, aContent.length); |
---|
283 | ostream.close(); |
---|
284 | } |
---|
285 | }else{ |
---|
286 | return; |
---|
287 | } |
---|
288 | }, |
---|
289 | |
---|
290 | onRemove : function(aEvent){ |
---|
291 | var result = { |
---|
292 | accept : false, |
---|
293 | list : [], |
---|
294 | title : mcTreeTemplateFolder.STRING.getString("DEL_TEMPLATE_MARKER"), |
---|
295 | }; |
---|
296 | var dir = mcTreeTemplateFolder.getTemplateDir(); |
---|
297 | var entries = dir.directoryEntries; |
---|
298 | while(entries.hasMoreElements()){ |
---|
299 | var entry = entries.getNext().QueryInterface(Components.interfaces.nsILocalFile); |
---|
300 | if(entry.isFile()){ |
---|
301 | if(unescape(entry.leafName) == this.STRING.getString("TEMPLATE_MARKER_TITLE")) continue; |
---|
302 | result.list.push(entry); |
---|
303 | }else if(entry.isDirectory()){ |
---|
304 | } |
---|
305 | } |
---|
306 | window.openDialog("chrome://markingcollection/content/removeDialog.xul", "", "chrome,centerscreen,modal", result); |
---|
307 | if(result.accept){ |
---|
308 | } |
---|
309 | }, |
---|
310 | |
---|
311 | getTemplateDir : function(){ |
---|
312 | var dir = window.top.bitsMarkingCollection.getExtensionDir().clone(); |
---|
313 | dir.append("template"); |
---|
314 | if(!dir.exists()) dir.create(dir.DIRECTORY_TYPE, 0700); |
---|
315 | return dir; |
---|
316 | }, |
---|
317 | |
---|
318 | createTemplate : function(aRes,aFile,aDepth){ |
---|
319 | var ostream = aFile; |
---|
320 | var title = this.DataSource.getProperty(aRes,"title"); |
---|
321 | var note = this.DataSource.getProperty(aRes,"note"); |
---|
322 | var style = this.DataSource.getProperty(aRes,"style"); |
---|
323 | if(aDepth == undefined) aDepth = 0; |
---|
324 | if(aFile == undefined){ |
---|
325 | var file = mcTreeTemplateFolder.getTemplateDir(); |
---|
326 | file.append(escape(title)); |
---|
327 | if(file.exists()){ |
---|
328 | file.remove(false); |
---|
329 | } |
---|
330 | file.create(file.NORMAL_FILE_TYPE, 0666); |
---|
331 | ostream = Components.classes['@mozilla.org/network/file-output-stream;1'].createInstance(Components.interfaces.nsIFileOutputStream); |
---|
332 | ostream.init(file, 2, 0x200, false); |
---|
333 | } |
---|
334 | var aTab = ""; |
---|
335 | for(var i=0;i<=aDepth;i++){ |
---|
336 | aTab += " "; |
---|
337 | } |
---|
338 | var contResList = this.DataSource.flattenResources(aRes, 1, false); |
---|
339 | title = title.replace(/&/mg,"&").replace(/</mg,"<").replace(/>/mg,">").replace(/\"/mg,"""); |
---|
340 | if(style) style = style.replace(/&/mg,"&").replace(/</mg,"<").replace(/>/mg,">").replace(/\"/mg,"""); |
---|
341 | if(note) note = note.replace(/&/mg,"&").replace(/</mg,"<").replace(/>/mg,">").replace(/\"/mg,"""); |
---|
342 | var aContent = aTab + '<FOLDER title="'+title+'" style="'+style+'" note="'+note+'"'; |
---|
343 | if(contResList.length<=1) aContent += ' /'; |
---|
344 | aContent += '>\n'; |
---|
345 | this.Common.UNICODE.charset = "UTF-8"; |
---|
346 | aContent = this.Common.UNICODE.ConvertFromUnicode(aContent); |
---|
347 | ostream.write(aContent, aContent.length); |
---|
348 | var contResList = this.DataSource.flattenResources(aRes, 1, false); |
---|
349 | if(contResList.length>1){ |
---|
350 | for(var i=0;i<contResList.length;i++){ |
---|
351 | if(contResList[i].Value == aRes.Value) continue; |
---|
352 | mcTreeTemplateFolder.createTemplate(contResList[i],ostream,aDepth+1); |
---|
353 | } |
---|
354 | aContent = aTab + '</FOLDER>\n'; |
---|
355 | this.Common.UNICODE.charset = "UTF-8"; |
---|
356 | aContent = this.Common.UNICODE.ConvertFromUnicode(aContent); |
---|
357 | ostream.write(aContent, aContent.length); |
---|
358 | } |
---|
359 | if(aFile == undefined){ |
---|
360 | ostream.close(); |
---|
361 | } |
---|
362 | }, |
---|
363 | |
---|
364 | }; |
---|