source: DASISH/t5.6/client/trunk/chrome/markingcollection/content/markingcollection/markerRemap.js @ 2711

Last change on this file since 2711 was 2711, checked in by olof, 11 years ago

moved to trunk

File size: 15.9 KB
Line 
1var bitsMarkerRemap = {
2        _object : null,
3        _resource : null,
4        _marker_exp : new RegExp("^"+bitsMarker.id_key+"\\D+\\d+$",""),
5
6        get STRING()     { return document.getElementById("bitsMarkerRemapString"); },
7        get DataSource() { return bitsObjectMng.DataSource; },
8        get Common()     { return bitsObjectMng.Common;     },
9        get XPath()      { return bitsObjectMng.XPath;      },
10        get Database()   { return bitsObjectMng.Database;   },
11        get gBrowser()   { return bitsObjectMng.getBrowser();},
12
13        get SIDEBAR() { return window.top.document.getElementById("sidebar"); },
14        get CONTENT() { return window.top.document.getElementById("content"); },
15
16        get SIDEBAR_DOC() {try{return this.SIDEBAR.contentDocument;}catch(e){return undefined;}},
17        get SIDEBAR_WIN() {try{return this.SIDEBAR.contentWindow;}catch(e){return undefined;}},
18        get mcTreeHandler() {try{return this.SIDEBAR_WIN.mcTreeHandler;}catch(e){return undefined;}},
19        get mcMainService() {try{return this.SIDEBAR_WIN.mcMainService;}catch(e){return undefined;}},
20        get mcController() {try{return this.SIDEBAR_WIN.mcController;}catch(e){return undefined;}},
21        get mcPropertyView() {try{return this.SIDEBAR_WIN.mcPropertyView;}catch(e){return undefined;}},
22        get mcTreeViewModeService() {try{return this.SIDEBAR_WIN.mcTreeViewModeService;}catch(e){return undefined;}},
23        get bitsItemView() {try{return this.SIDEBAR_WIN.bitsItemView;}catch(e){return undefined;}},
24
25        get TREE_POPUP(){try{return this.SIDEBAR_DOC.getElementById("mcPopup");}catch(e){return undefined;}},
26        get TREE_MENU(){try{return this.SIDEBAR_DOC.getElementById("mcPopupRemap");}catch(e){return undefined;}},
27
28        get TREEOBJ_POPUP(){try{return this.SIDEBAR_DOC.getElementById("mcPopupObject");}catch(e){return undefined;}},
29        get TREEOBJ_MENU(){try{return this.SIDEBAR_DOC.getElementById("mcPopupObjectRemap");}catch(e){return undefined;}},
30
31        get ITEMTREE_POPUP(){try{return this.SIDEBAR_DOC.getElementById("bitsItemTreePopup");}catch(e){return undefined;}},
32        get ITEMTREE_MENU(){try{return this.SIDEBAR_DOC.getElementById("bitsItemTreePopupRemap");}catch(e){return undefined;}},
33
34/////////////////////////////////////////////////////////////////////
35        load : function(aEvent){
36                try{this.TREE_POPUP.addEventListener("popupshowing",this.popupshowing_tree, false);}catch(e){}
37                try{this.TREEOBJ_POPUP.addEventListener("popupshowing",this.popupshowing_treeobj, false);}catch(e){}
38                try{this.ITEMTREE_POPUP.addEventListener("popupshowing",this.popupshowing_itemview, false);}catch(e){}
39        },
40
41/////////////////////////////////////////////////////////////////////
42        unload : function(aEvent){
43                try{this.TREE_POPUP.removeEventListener("popupshowing",this.popupshowing_tree, false);}catch(e){}
44                try{this.TREEOBJ_POPUP.removeEventListener("popupshowing",this.popupshowing_treeobj, false);}catch(e){}
45                try{this.ITEMTREE_POPUP.removeEventListener("popupshowing",this.popupshowing_itemview, false);}catch(e){}
46        },
47
48/////////////////////////////////////////////////////////////////////
49        popupshowing_tree : function(aEvent){
50                bitsMarkerRemap._popupshowing_tree(aEvent);
51        },
52        _popupshowing_tree : function(aEvent){
53                this._object = null;
54                this.TREE_MENU.hidden = true;
55                this._resource = this.mcTreeHandler.resource;
56                if(!this._resource) return;
57                if(this.DataSource.getProperty(this._resource, "type") != "item") return;
58                var object = this.getObjectFromResource(this._resource);
59                if(!object) return;
60                this.TREE_MENU.hidden = !this.isDispContextmenu(object);
61                if(!this.TREE_MENU.hidden){
62                        this._object = object;
63                        var parentRes = this.DataSource.findParentResource(this._resource);
64                        this._object.fid_title = this.DataSource.getProperty(parentRes, "title");
65                        this._object.fid_style = this.DataSource.getProperty(parentRes, "style");
66                        this._object.pfid_order = this.DataSource.getProperty(this._resource, "pfid_order");
67                        if(this._object.pfid_order == "") this._object.pfid_order = 0;
68                }
69        },
70
71/////////////////////////////////////////////////////////////////////
72        popupshowing_treeobj : function(aEvent){
73                bitsMarkerRemap._popupshowing_treeobj(aEvent);
74        },
75        _popupshowing_treeobj : function(aEvent){
76                this._object = null;
77                this.TREEOBJ_MENU.hidden = true;
78                this._resource = this.mcTreeHandler.resource;
79                if(!this._resource) return;
80                if(this.DataSource.getProperty(this._resource, "type") != "item") return;
81                var object = this.getObjectFromResource(this._resource);
82                if(!object) return;
83                this.TREEOBJ_MENU.hidden = !this.isDispContextmenu(object);
84                if(!this.TREEOBJ_MENU.hidden){
85                        this._object = object;
86                        var parentRes = this.DataSource.findParentResource(this._resource);
87                        this._object.fid_title = this.DataSource.getProperty(parentRes, "title");
88                        this._object.fid_style = this.DataSource.getProperty(parentRes, "style");
89                        this._object.pfid_order = this.DataSource.getProperty(this._resource, "pfid_order");
90                        if(this._object.pfid_order == "") this._object.pfid_order = 0;
91                }
92        },
93
94/////////////////////////////////////////////////////////////////////
95        popupshowing_itemview : function(aEvent){
96                bitsMarkerRemap._popupshowing_itemview(aEvent);
97        },
98        _popupshowing_itemview : function(aEvent){
99                this._object = null;
100                this._resource = null;
101                var parentRes = this.mcTreeHandler.resource;
102                this.ITEMTREE_MENU.hidden = true;
103                var object = this.bitsItemView.object;
104                if(!object) return;
105                this.ITEMTREE_MENU.hidden = !this.isDispContextmenu(object);
106                if(!this.ITEMTREE_MENU.hidden){
107                        this._object = {};
108                        for(var key in object){
109                                this._object[key] = object[key];
110                        }
111                        if(this._object.dbtype == bitsMarkingCollection._uncategorized.dbtype && this._object.pfid == 0){
112                                if(!this._object.fid_title) this._object.fid_title = bitsMarkingCollection._uncategorized.title;
113                                if(!this._object.fid_style) this._object.fid_style = bitsMarkingCollection._uncategorized.style;
114                        }
115                }
116        },
117
118/////////////////////////////////////////////////////////////////////
119        getObjectFromResource : function(aRes){
120                var oid = this.DataSource.getProperty(aRes, "id");
121                var pfid = this.DataSource.getProperty(aRes, "pfid");
122                var dbtype = this.DataSource.getProperty(aRes, "dbtype");
123                var objects = this.Database.getObject({oid:oid,pfid:pfid}, dbtype);
124                if(!objects || objects.length == 0)
125                        return null;
126                else
127                        return objects[0];
128        },
129
130/////////////////////////////////////////////////////////////////////
131        isDispContextmenu : function(aObject){
132                if(aObject.oid_type != "text") return false;
133                var marker_id = bitsMarker.id_key+aObject.dbtype+aObject.oid;
134                var exists_doc = false;
135                var marker_num = 0;
136                for(var i=0;i<this.gBrowser.browsers.length;i++){
137                        var contentDocument = this.gBrowser.browsers[i].contentDocument;
138                        var cur_uri = this.Common.getURLStringFromDocument(contentDocument);
139                        if(cur_uri.indexOf(aObject.con_url)==0){
140                                exists_doc = !this.gBrowser.browsers[i].webProgress.isLoadingDocument;
141                                var nodesSnapshot = this.XPath.evaluate('//*[@id="'+marker_id+'"]',contentDocument);
142                                if(nodesSnapshot && nodesSnapshot.snapshotLength>0) marker_num += nodesSnapshot.snapshotLength;
143                        }
144                }
145                return (exists_doc && marker_num==0)?true:false;
146        },
147
148/////////////////////////////////////////////////////////////////////
149        reMap : function(aEvent){
150                if(!this._object) return;
151                var findtext = this._object.oid_txt;
152                var doc = this.gBrowser.contentDocument;
153                var sel = doc.defaultView.getSelection();
154                sel.removeAllRanges();
155                var findRange = this._getFindRange();
156                findRange.caseSensitive = true;
157                var docRange = doc.createRange();
158                docRange.selectNode(doc.body);
159                var startRange = docRange.cloneRange();
160                var stopRange = docRange.cloneRange();
161                startRange.collapse(true);
162                stopRange.collapse(false);
163                var ranges = [];
164                var result;
165                while((result = findRange.Find(findtext, docRange, startRange, stopRange))){
166                        if(result.endContainer != null &&
167                                 result.startContainer != null &&
168                                 result.endContainer.nodeType == Node.TEXT_NODE &&
169                                 result.startContainer.nodeType == Node.TEXT_NODE &&
170                                 !this._isNodeInputNodeOrChildOf(result.startContainer) &&
171                                 !this._isNodeInputNodeOrChildOf(result.endContainer)) {
172                                if(!((result.startContainer.parentNode && this._marker_exp.test(result.startContainer.parentNode.id)) || (result.endContainer.parentNode && this._marker_exp.test(result.endContainer.parentNode.id)))){
173                                        var obj = {
174                                                startContainer : result.startContainer,
175                                                startOffset    : result.startOffset,
176                                                endContainer   : result.endContainer,
177                                                endOffset      : result.endOffset,
178                                                collapsed      : result.collapsed,
179                                                commonAncestorContainer : result.commonAncestorContainer
180                                        };
181                                        ranges.push(obj);
182                                        sel.addRange(result);
183                                }
184                        }
185                        startRange = result;
186                        startRange.collapse(false);
187                }
188
189                var map = false;
190                if(ranges.length==0){
191                        this.Common.alert(this.STRING.getString("ALERT_FIND_RESULT")+"\n[ "+findtext+" ]");
192                }else if(ranges.length==1){
193                        map = true;
194                }else{
195                        map = this.Common.confirm(this.STRING.getString("CONFIRM_FIND_RESULTS")+" [ "+ranges.length+" ]");
196                }
197                if(map){
198                        var style = this._object.fid_style;
199                        var dbtype = this._object.dbtype;
200                        var pfid_order = this._object.pfid_order;
201                        var connect = this.Database._dbConn[dbtype];
202                        connect.executeSimpleSQL('update om_link set pfid_order=pfid_order+'+ranges.length+' where pfid_order>'+pfid_order);
203                        var aParName = null;
204                        var curRelIdx = -1;
205                        if(!this.bitsItemView || !this.bitsItemView.isChecked){
206                                var f_pfid = undefined;
207                                var rtnFolder = this.Database.getFolder({fid:this._object.pfid},dbtype);
208                                if(rtnFolder && rtnFolder.length) f_pfid = rtnFolder[0].pfid;
209                                rtnFolder = undefined;
210                                aParName = this.DataSource.getID2About(this._object.pfid,f_pfid,dbtype);
211                                curRelIdx = this.DataSource.getRelativeIndex(this.Common.RDF.GetResource(aParName), this._resource);
212                        }
213                        sel.removeAllRanges();
214                        var parser = new DOMParser();
215                        var xmlSerializer = new XMLSerializer();
216                        for(var i=0;i<ranges.length;i++){
217                                var range = doc.createRange();
218                                range.setStart(ranges[i].startContainer, ranges[i].startOffset);
219                                range.setEnd(ranges[i].endContainer, ranges[i].endOffset);
220                                var startContainer = range.startContainer;
221                                var startOffset = range.startOffset;
222                                var endContainer = range.endContainer;
223                                var endOffset = range.endOffset;
224                                var stXPath = this.XPath.getOffsetFromParentNode(startContainer,startOffset);
225                                var enXPath = this.XPath.getOffsetFromParentNode(endContainer,endOffset);
226                                try{
227                                        var hyperAnchor =  bitsHyperAnchor._getAnchorURL({node:startContainer,offset:startOffset,style:style,prefix:"b",contents:range.toString()},{node:endContainer,offset:endOffset,prefix:"e",contents:range.toString()});
228                                }catch(ex3){
229                                        try{
230                                                var hyperAnchor =  bitsHyperAnchorDummy._getAnchorURL({node:startContainer,offset:startOffset,style:style,prefix:"b",contents:range.toString()},{node:endContainer,offset:endOffset,prefix:"e",contents:range.toString()});
231                                        }catch(ex3){
232                                                hyperAnchor = null;
233                                        }
234                                }
235                                hyperAnchor = bitsAutocacheService.convertCacheURLToOriginalURL(hyperAnchor);
236                                var rObj = this.Database.newObject();
237                                for(var key in rObj){
238                                        if(key == "oid") continue;
239                                        if(this._object[key] != undefined) rObj[key] = this._object[key];
240                                }
241                                rObj.bgn_dom = stXPath.xpath + "("+stXPath.offset+")" + "("+stXPath.type+")";
242                                rObj.end_dom = enXPath.xpath + "("+enXPath.offset+")" + "("+enXPath.type+")";
243                                if(!rObj.oid_property || rObj.oid_property == "") rObj.oid_property = "<PROPERTY></PROPERTY>";
244                                var xmldoc = parser.parseFromString(rObj.oid_property,"text/xml");
245                                if(xmldoc){
246                                        if(xmldoc.documentElement){
247                                                if(hyperAnchor){
248                                                        var xmlnode = xmldoc.getElementsByTagName("HYPER_ANCHOR")[0];
249                                                        if(!xmlnode) xmlnode = xmldoc.createElement("HYPER_ANCHOR");
250                                                        if(xmlnode){
251                                                                while(xmlnode.hasChildNodes()){ xmlnode.removeChild(xmlnode.lastChild); }
252                                                                xmlnode.appendChild(xmldoc.createTextNode(hyperAnchor));
253                                                                xmldoc.documentElement.appendChild(xmlnode);
254                                                        }
255                                                }else{
256                                                        var xmlnode = xmldoc.getElementsByTagName("HYPER_ANCHOR")[0];
257                                                        if(xmlnode) xmlnode.parentNode.removeChild(xmlnode);
258                                                }
259                                        }
260                                        rObj.oid_property = xmlSerializer.serializeToString(xmldoc);
261                                        xmldoc = undefined;
262                                }
263                                rObj.pfid_order = ++pfid_order;
264                                var rtn = this.Database.addObject(rObj,dbtype);
265                                if(!rtn) rObj = undefined;
266                                if(!rObj) continue;
267                                var con_doc = stXPath.node.ownerDocument;
268                                var rtnContent = bitsMarker.xPathMarker(
269                                        con_doc,
270                                        {
271                                                start   : rObj.bgn_dom,
272                                                end     : rObj.end_dom,
273                                                context : this.Common.exceptCode(rObj.oid_txt.replace(/\s+$/mg,"").replace(/^\s+/mg,"")),
274                                                con_url : this.Common.getURLStringFromDocument(con_doc)
275                                        },
276                                        {
277                                                id     : rObj.oid,
278                                                dbtype : dbtype,
279                                                pfid   : rObj.pfid,
280                                                style  : style
281                                        }
282                                );
283                                if(rtnContent){
284                                        if(this.bitsItemView && this.bitsItemView.isChecked) continue;
285                                        this.DataSource.addItem(this.Database.makeObjectToItem(rObj), aParName, ++curRelIdx, dbtype);
286                                        this.mcTreeHandler.TREE.builder.rebuild();
287                                }
288                        }
289                        parser = undefined;
290                        xmlSerializer = undefined;
291                        if(this.Database.removeObject(this._object,dbtype)){
292                                if(this._resource){
293                                        this.DataSource.deleteItem(this._resource);
294                                        this.DataSource.flush();
295                                        this.mcTreeHandler.TREE.builder.rebuild();
296                                }
297                                var records = [];
298                                var statement = connect.createStatement('select oid,pfid from om_link order by pfid_order');
299                                var columnNames = [];
300                                var i;
301                                var k=statement.columnCount
302                                var col_name;
303                                for(i=0;i<k;i++){
304                                        columnNames.push(statement.getColumnName(i));
305                                }
306                                try{
307                                        while(statement.executeStep()){
308                                                var row = {};
309                                                for(i=0;i<k;i++){
310                                                        if(statement.getIsNull(i)){
311                                                                row[columnNames[i]] = null;
312                                                        }else{
313                                                                row[columnNames[i]] = statement.getUTF8String(i);
314                                                        }
315                                                }
316                                                records.push(row);
317                                        }
318                                }
319                                finally {
320                                        statement.reset();
321                                        statement = undefined;
322                                }
323                                if(records.length>0){
324                                        var result = true;
325                                        connect.beginTransaction();
326                                        try{
327                                                var sql = 'update om_link set pfid_order=?1 where oid=?2 and pfid=?3';
328                                                var statement = connect.createStatement(sql);
329                                                for(i=0,k=records.length;i<k;i++){
330                                                        var pfid_order = i+1;
331                                                        this.Database._setStatementValue(statement,0,pfid_order);
332                                                        this.Database._setStatementValue(statement,1,records[i].oid);
333                                                        this.Database._setStatementValue(statement,2,records[i].pfid);
334                                                        statement.execute();
335                                                        statement.reset();
336                                                }
337                                                statement = undefined;
338                                        }catch(e){
339                                                this._dump(e);
340                                                result = false;
341                                        }finally {
342                                                if(connect.lastError){
343                                                        this._dump(connect.lastErrorString+" ("+connect.lastError+")");
344                                                        this._dump("sql="+sql);
345                                                        result = false;
346                                                }
347                                        }
348                                        if(result){
349                                                connect.commitTransaction();
350                                        }else{
351                                                connect.rollbackTransaction();
352                                        }
353                                }
354                        }
355                        this.Common.alert(this.STRING.getString("ALERT_MAP_RESULT"));
356                }
357                sel.removeAllRanges();
358        },
359
360/////////////////////////////////////////////////////////////////////
361        _getFindRange : function(){
362                var findRange = Components.classes["@mozilla.org/embedcomp/rangefind;1"].createInstance();
363                if(!findRange || !(findRange instanceof Components.interfaces.nsIFind)) return undefined;
364                findRange.caseSensitive = false;
365                findRange.findBackwards = false;
366                return findRange;
367        },
368
369/////////////////////////////////////////////////////////////////////
370        _isWordCharacter : function(ch){
371                if(ch == null ||  typeof ch != "string" || ch.length != 1) return false;
372                var code = ch.charCodeAt(0);
373                return code >= 48 && code <= 57 || code >= 65 && code <= 90 || code >= 97 && code <= 122 || code >= 138 && code <= 142 || code >= 154 && code <= 159 || code >= 192 && code <= 255;
374        },
375
376/////////////////////////////////////////////////////////////////////
377        _isNodeInputNodeOrChildOf : function(node){
378                if(node.nodeName.toUpperCase() == "INPUT") return true;
379                if(node.parentNode != null) return this._isNodeInputNodeOrChildOf(node.parentNode);
380                return false;
381        },
382
383/////////////////////////////////////////////////////////////////////
384        _dump : function(aString){
385                window.top.bitsMarkingCollection._dump(aString);
386        },
387}
Note: See TracBrowser for help on using the repository browser.