root / trunk / web / dojo / dojox / editor / plugins / FindReplace.js
History | View | Annotate | Download (13.5 KB)
1 |
/*
|
---|---|
2 |
Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
|
3 |
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
4 |
see: http://dojotoolkit.org/license for details
|
5 |
*/
|
6 |
|
7 |
|
8 |
if(!dojo._hasResource["dojox.editor.plugins.FindReplace"]){ |
9 |
dojo._hasResource["dojox.editor.plugins.FindReplace"]=true; |
10 |
dojo.provide("dojox.editor.plugins.FindReplace");
|
11 |
dojo.require("dijit._editor._Plugin");
|
12 |
dojo.require("dijit.Toolbar");
|
13 |
dojo.require("dijit.form.TextBox");
|
14 |
dojo.require("dijit.form.CheckBox");
|
15 |
dojo.require("dijit.form.Button");
|
16 |
dojo.require("dijit.TooltipDialog");
|
17 |
dojo.require("dojox.editor.plugins.ToolbarLineBreak");
|
18 |
dojo.require("dojo.i18n");
|
19 |
dojo.require("dojo.string");
|
20 |
dojo.requireLocalization("dojox.editor.plugins","FindReplace",null,"ROOT,cs,de,es,fr,hu,it,ja,ko,pl,pt,ro,ru,zh,zh-tw"); |
21 |
dojo.experimental("dojox.editor.plugins.FindReplace");
|
22 |
dojo.declare("dojox.editor.plugins._FindReplaceCloseBox",[dijit._Widget,dijit._Templated],{btnId:"",widget:null,widgetsInTemplate:true,templateString:"<span style='float: right' class='dijitInline' tabindex='-1'>"+"<button class='dijit dijitReset dijitInline' "+"id='${btnId}' dojoAttachPoint='button' dojoType='dijit.form.Button' tabindex='-1' iconClass='dijitEditorIconsFindReplaceClose' showLabel='false'>X</button>"+"</span>",postMixInProperties:function(){ |
23 |
this.id=dijit.getUniqueId(this.declaredClass.replace(/\./g,"_")); |
24 |
this.btnId=this.id+"_close"; |
25 |
this.inherited(arguments); |
26 |
},startup:function(){ |
27 |
this.connect(this.button,"onClick","onClick"); |
28 |
},onClick:function(){ |
29 |
}}); |
30 |
dojo.declare("dojox.editor.plugins._FindReplaceTextBox",[dijit._Widget,dijit._Templated],{textId:"",label:"",toolTip:"",widget:null,widgetsInTemplate:true,templateString:"<span style='white-space: nowrap' class='dijit dijitReset dijitInline dijitEditorFindReplaceTextBox' "+"title='${tooltip}' tabindex='-1'>"+"<label class='dijitLeft dijitInline' for='${textId}' tabindex='-1'>${label}</label>"+"<input dojoType='dijit.form.TextBox' required='false' intermediateChanges='true' class='focusTextBox'"+"tabIndex='0' id='${textId}' dojoAttachPoint='textBox, focusNode' value='' dojoAttachEvent='onKeyPress: _onKeyPress'/>"+"</span>",postMixInProperties:function(){ |
31 |
this.id=dijit.getUniqueId(this.declaredClass.replace(/\./g,"_")); |
32 |
this.textId=this.id+"_text"; |
33 |
this.inherited(arguments); |
34 |
},postCreate:function(){ |
35 |
this.textBox.set("value",""); |
36 |
this.disabled=this.textBox.get("disabled"); |
37 |
this.connect(this.textBox,"onChange","onChange"); |
38 |
},_setValueAttr:function(_1){ |
39 |
this.value=_1;
|
40 |
this.textBox.set("value",_1); |
41 |
},focus:function(){ |
42 |
this.textBox.focus();
|
43 |
},_setDisabledAttr:function(_2){ |
44 |
this.disabled=_2;
|
45 |
this.textBox.set("disabled",_2); |
46 |
},onChange:function(_3){ |
47 |
this.value=_3;
|
48 |
},_onKeyPress:function(_4){ |
49 |
var _5=0; |
50 |
var _6=0; |
51 |
if(_4.target&&!_4.ctrlKey&&!_4.altKey&&!_4.shiftKey){
|
52 |
if(_4.keyCode==dojo.keys.LEFT_ARROW){
|
53 |
_5=_4.target.selectionStart; |
54 |
_6=_4.target.selectionEnd; |
55 |
if(_5<_6){
|
56 |
dijit.selectInputText(_4.target,_5,_5); |
57 |
dojo.stopEvent(_4); |
58 |
} |
59 |
}else{
|
60 |
if(_4.keyCode==dojo.keys.RIGHT_ARROW){
|
61 |
_5=_4.target.selectionStart; |
62 |
_6=_4.target.selectionEnd; |
63 |
if(_5<_6){
|
64 |
dijit.selectInputText(_4.target,_6,_6); |
65 |
dojo.stopEvent(_4); |
66 |
} |
67 |
} |
68 |
} |
69 |
} |
70 |
}}); |
71 |
dojo.declare("dojox.editor.plugins._FindReplaceCheckBox",[dijit._Widget,dijit._Templated],{checkId:"",label:"",tooltip:"",widget:null,widgetsInTemplate:true,templateString:"<span style='white-space: nowrap' tabindex='-1' "+"class='dijit dijitReset dijitInline dijitEditorFindReplaceCheckBox' title='${tooltip}' >"+"<input dojoType='dijit.form.CheckBox' required=false "+"tabIndex='0' id='${checkId}' dojoAttachPoint='checkBox, focusNode' value=''/>"+"<label tabindex='-1' class='dijitLeft dijitInline' for='${checkId}'>${label}</label>"+"</span>",postMixInProperties:function(){ |
72 |
this.id=dijit.getUniqueId(this.declaredClass.replace(/\./g,"_")); |
73 |
this.checkId=this.id+"_check"; |
74 |
this.inherited(arguments); |
75 |
},postCreate:function(){ |
76 |
this.checkBox.set("checked",false); |
77 |
this.disabled=this.checkBox.get("disabled"); |
78 |
this.checkBox.isFocusable=function(){ |
79 |
return false; |
80 |
}; |
81 |
},_setValueAttr:function(_7){ |
82 |
this.checkBox.set("value",_7); |
83 |
},_getValueAttr:function(){ |
84 |
return this.checkBox.get("value"); |
85 |
},focus:function(){ |
86 |
this.checkBox.focus();
|
87 |
},_setDisabledAttr:function(_8){ |
88 |
this.disabled=_8;
|
89 |
this.checkBox.set("disabled",_8); |
90 |
}}); |
91 |
dojo.declare("dojox.editor.plugins._FindReplaceToolbar",dijit.Toolbar,{postCreate:function(){ |
92 |
this.connectKeyNavHandlers([],[]);
|
93 |
this.connect(this.containerNode,"onclick","_onToolbarEvent"); |
94 |
this.connect(this.containerNode,"onkeydown","_onToolbarEvent"); |
95 |
dojo.addClass(this.domNode,"dijitToolbar"); |
96 |
},addChild:function(_9,_a){ |
97 |
dijit._KeyNavContainer.superclass.addChild.apply(this,arguments); |
98 |
},_onToolbarEvent:function(_b){ |
99 |
_b.stopPropagation(); |
100 |
}}); |
101 |
dojo.declare("dojox.editor.plugins.FindReplace",[dijit._editor._Plugin],{buttonClass:dijit.form.ToggleButton,iconClassPrefix:"dijitEditorIconsFindReplace",editor:null,button:null,_frToolbar:null,_closeBox:null,_findField:null,_replaceField:null,_findButton:null,_replaceButton:null,_replaceAllButton:null,_caseSensitive:null,_backwards:null,_promDialog:null,_promDialogTimeout:null,_strings:null,_initButton:function(){ |
102 |
this._strings=dojo.i18n.getLocalization("dojox.editor.plugins","FindReplace"); |
103 |
this.button=new dijit.form.ToggleButton({label:this._strings["findReplace"],showLabel:false,iconClass:this.iconClassPrefix+" dijitEditorIconFindString",tabIndex:"-1",onChange:dojo.hitch(this,"_toggleFindReplace")}); |
104 |
if(dojo.isOpera){
|
105 |
this.button.set("disabled",true); |
106 |
} |
107 |
this.connect(this.button,"set",dojo.hitch(this,function(_c,_d){ |
108 |
if(_c==="disabled"){ |
109 |
this._toggleFindReplace((!_d&&this._displayed),true,true); |
110 |
} |
111 |
})); |
112 |
},setEditor:function(_e){ |
113 |
this.editor=_e;
|
114 |
this._initButton();
|
115 |
},toggle:function(){ |
116 |
this.button.set("checked",!this.button.get("checked")); |
117 |
},_toggleFindReplace:function(_f,_10,_11){ |
118 |
var _12=dojo.marginBox(this.editor.domNode); |
119 |
if(_f&&!dojo.isOpera){
|
120 |
dojo.style(this._frToolbar.domNode,"display","block"); |
121 |
this._populateFindField();
|
122 |
if(!_10){
|
123 |
this._displayed=true; |
124 |
} |
125 |
}else{
|
126 |
dojo.style(this._frToolbar.domNode,"display","none"); |
127 |
if(!_10){
|
128 |
this._displayed=false; |
129 |
} |
130 |
if(!_11){
|
131 |
this.editor.focus();
|
132 |
} |
133 |
} |
134 |
this.editor.resize({h:_12.h}); |
135 |
},_populateFindField:function(){ |
136 |
var ed=this.editor; |
137 |
var win=ed.window;
|
138 |
var _13=dojo.withGlobal(ed.window,"getSelectedText",dijit._editor.selection,[null]); |
139 |
if(this._findField&&this._findField.textBox){ |
140 |
if(_13){
|
141 |
this._findField.textBox.set("value",_13); |
142 |
} |
143 |
this._findField.textBox.focus();
|
144 |
dijit.selectInputText(this._findField.textBox.focusNode);
|
145 |
} |
146 |
},setToolbar:function(_14){ |
147 |
this.inherited(arguments); |
148 |
if(!dojo.isOpera){
|
149 |
var _15=this._frToolbar=new dojox.editor.plugins._FindReplaceToolbar(); |
150 |
dojo.style(_15.domNode,"display","none"); |
151 |
dojo.place(_15.domNode,_14.domNode,"after");
|
152 |
_15.startup(); |
153 |
this._closeBox=new dojox.editor.plugins._FindReplaceCloseBox(); |
154 |
_15.addChild(this._closeBox);
|
155 |
this._findField=new dojox.editor.plugins._FindReplaceTextBox({label:this._strings["findLabel"],tooltip:this._strings["findTooltip"]}); |
156 |
_15.addChild(this._findField);
|
157 |
this._replaceField=new dojox.editor.plugins._FindReplaceTextBox({label:this._strings["replaceLabel"],tooltip:this._strings["replaceTooltip"]}); |
158 |
_15.addChild(this._replaceField);
|
159 |
_15.addChild(new dojox.editor.plugins._ToolbarLineBreak());
|
160 |
this._findButton=new dijit.form.Button({label:this._strings["findButton"],showLabel:true,iconClass:this.iconClassPrefix+" dijitEditorIconFind"}); |
161 |
this._findButton.titleNode.title=this._strings["findButtonTooltip"]; |
162 |
_15.addChild(this._findButton);
|
163 |
this._replaceButton=new dijit.form.Button({label:this._strings["replaceButton"],showLabel:true,iconClass:this.iconClassPrefix+" dijitEditorIconReplace"}); |
164 |
this._replaceButton.titleNode.title=this._strings["replaceButtonTooltip"]; |
165 |
_15.addChild(this._replaceButton);
|
166 |
this._replaceAllButton=new dijit.form.Button({label:this._strings["replaceAllButton"],showLabel:true,iconClass:this.iconClassPrefix+" dijitEditorIconReplaceAll"}); |
167 |
this._replaceAllButton.titleNode.title=this._strings["replaceAllButtonTooltip"]; |
168 |
_15.addChild(this._replaceAllButton);
|
169 |
this._caseSensitive=new dojox.editor.plugins._FindReplaceCheckBox({label:this._strings["matchCase"],tooltip:this._strings["matchCaseTooltip"]}); |
170 |
_15.addChild(this._caseSensitive);
|
171 |
this._backwards=new dojox.editor.plugins._FindReplaceCheckBox({label:this._strings["backwards"],tooltip:this._strings["backwardsTooltip"]}); |
172 |
_15.addChild(this._backwards);
|
173 |
this._findButton.set("disabled",true); |
174 |
this._replaceButton.set("disabled",true); |
175 |
this._replaceAllButton.set("disabled",true); |
176 |
this.connect(this._findField,"onChange","_checkButtons"); |
177 |
this.connect(this._findField,"onKeyDown","_onFindKeyDown"); |
178 |
this.connect(this._replaceField,"onKeyDown","_onReplaceKeyDown"); |
179 |
this.connect(this._findButton,"onClick","_find"); |
180 |
this.connect(this._replaceButton,"onClick","_replace"); |
181 |
this.connect(this._replaceAllButton,"onClick","_replaceAll"); |
182 |
this.connect(this._closeBox,"onClick","toggle"); |
183 |
this._promDialog=new dijit.TooltipDialog(); |
184 |
this._promDialog.startup();
|
185 |
this._promDialog.set("content",""); |
186 |
} |
187 |
},_checkButtons:function(){ |
188 |
var _16=this._findField.get("value"); |
189 |
if(_16){
|
190 |
this._findButton.set("disabled",false); |
191 |
this._replaceButton.set("disabled",false); |
192 |
this._replaceAllButton.set("disabled",false); |
193 |
}else{
|
194 |
this._findButton.set("disabled",true); |
195 |
this._replaceButton.set("disabled",true); |
196 |
this._replaceAllButton.set("disabled",true); |
197 |
} |
198 |
},_onFindKeyDown:function(evt){ |
199 |
if(evt.keyCode==dojo.keys.ENTER){
|
200 |
this._find();
|
201 |
dojo.stopEvent(evt); |
202 |
} |
203 |
},_onReplaceKeyDown:function(evt){ |
204 |
if(evt.keyCode==dojo.keys.ENTER){
|
205 |
if(!this._replace()){ |
206 |
this._replace();
|
207 |
} |
208 |
dojo.stopEvent(evt); |
209 |
} |
210 |
},_find:function(_17){ |
211 |
var txt=this._findField.get("value")||""; |
212 |
if(txt){
|
213 |
var _18=this._caseSensitive.get("value"); |
214 |
var _19=this._backwards.get("value"); |
215 |
var _1a=this._findText(txt,_18,_19); |
216 |
if(!_1a&&_17){
|
217 |
this._promDialog.set("content",dojo.string.substitute(this._strings["eofDialogText"],{"0":this._strings["eofDialogTextFind"]})); |
218 |
dijit.popup.open({popup:this._promDialog,around:this._findButton.domNode}); |
219 |
this._promDialogTimeout=setTimeout(dojo.hitch(this,function(){ |
220 |
clearTimeout(this._promDialogTimeout);
|
221 |
this._promDialogTimeout=null; |
222 |
dijit.popup.close(this._promDialog);
|
223 |
}),3000);
|
224 |
setTimeout(dojo.hitch(this,function(){ |
225 |
this.editor.focus();
|
226 |
}),0);
|
227 |
} |
228 |
return _1a;
|
229 |
} |
230 |
return false; |
231 |
},_replace:function(_1b){ |
232 |
var _1c=false; |
233 |
var ed=this.editor; |
234 |
ed.focus(); |
235 |
var txt=this._findField.get("value")||""; |
236 |
var _1d=this._replaceField.get("value")||""; |
237 |
if(txt){
|
238 |
var _1e=this._caseSensitive.get("value"); |
239 |
var _1f=this._backwards.get("value"); |
240 |
var _20=dojo.withGlobal(ed.window,"getSelectedText",dijit._editor.selection,[null]); |
241 |
if(dojo.isMoz){
|
242 |
txt=dojo.trim(txt); |
243 |
_20=dojo.trim(_20); |
244 |
} |
245 |
var _21=this._filterRegexp(txt,!_1e); |
246 |
if(_20&&_21.test(_20)){
|
247 |
ed.execCommand("inserthtml",_1d);
|
248 |
_1c=true;
|
249 |
if(_1f){
|
250 |
this._findText(_1d,_1e,_1f);
|
251 |
dojo.withGlobal(ed.window,"collapse",dijit._editor.selection,[true]); |
252 |
} |
253 |
} |
254 |
if(!this._find(false)&&_1b){ |
255 |
this._promDialog.set("content",dojo.string.substitute(this._strings["eofDialogText"],{"0":this._strings["eofDialogTextReplace"]})); |
256 |
dijit.popup.open({popup:this._promDialog,around:this._replaceButton.domNode}); |
257 |
this._promDialogTimeout=setTimeout(dojo.hitch(this,function(){ |
258 |
clearTimeout(this._promDialogTimeout);
|
259 |
this._promDialogTimeout=null; |
260 |
dijit.popup.close(this._promDialog);
|
261 |
}),3000);
|
262 |
setTimeout(dojo.hitch(this,function(){ |
263 |
this.editor.focus();
|
264 |
}),0);
|
265 |
} |
266 |
return _1c;
|
267 |
} |
268 |
},_replaceAll:function(_22){ |
269 |
var _23=0; |
270 |
var _24=this._backwards.get("value"); |
271 |
if(_24){
|
272 |
this.editor.placeCursorAtEnd();
|
273 |
}else{
|
274 |
this.editor.placeCursorAtStart();
|
275 |
} |
276 |
if(this._replace(false)){ |
277 |
_23++; |
278 |
} |
279 |
var _25=dojo.hitch(this,function(){ |
280 |
if(this._replace(false)){ |
281 |
_23++; |
282 |
setTimeout(_25,10);
|
283 |
}else{
|
284 |
if(_22){
|
285 |
this._promDialog.set("content",dojo.string.substitute(this._strings["replaceDialogText"],{"0":""+_23})); |
286 |
dijit.popup.open({popup:this._promDialog,around:this._replaceAllButton.domNode}); |
287 |
this._promDialogTimeout=setTimeout(dojo.hitch(this,function(){ |
288 |
clearTimeout(this._promDialogTimeout);
|
289 |
this._promDialogTimeout=null; |
290 |
dijit.popup.close(this._promDialog);
|
291 |
}),3000);
|
292 |
setTimeout(dojo.hitch(this,function(){ |
293 |
this._findField.focus();
|
294 |
this._findField.textBox.focusNode.select();
|
295 |
}),0);
|
296 |
} |
297 |
} |
298 |
}); |
299 |
_25(); |
300 |
},_findText:function(txt,_26,_27){ |
301 |
var ed=this.editor; |
302 |
var win=ed.window;
|
303 |
var _28=false; |
304 |
if(txt){
|
305 |
if(win.find){
|
306 |
_28=win.find(txt,_26,_27,false,false,false,false); |
307 |
}else{
|
308 |
var doc=ed.document;
|
309 |
if(doc.selection){
|
310 |
this.editor.focus();
|
311 |
var _29=doc.body.createTextRange();
|
312 |
var _2a=doc.selection?doc.selection.createRange():null; |
313 |
if(_2a){
|
314 |
if(_27){
|
315 |
_29.setEndPoint("EndToStart",_2a);
|
316 |
}else{
|
317 |
_29.setEndPoint("StartToEnd",_2a);
|
318 |
} |
319 |
} |
320 |
var _2b=_26?4:0; |
321 |
if(_27){
|
322 |
_2b=_2b|1;
|
323 |
} |
324 |
_28=_29.findText(txt,_29.text.length,_2b); |
325 |
if(_28){
|
326 |
_29.select(); |
327 |
} |
328 |
} |
329 |
} |
330 |
} |
331 |
return _28;
|
332 |
},_filterRegexp:function(_2c,_2d){ |
333 |
var rxp=""; |
334 |
var c=null; |
335 |
for(var i=0;i<_2c.length;i++){ |
336 |
c=_2c.charAt(i); |
337 |
switch(c){
|
338 |
case "\\": |
339 |
rxp+=c; |
340 |
i++; |
341 |
rxp+=_2c.charAt(i); |
342 |
break;
|
343 |
case "$": |
344 |
case "^": |
345 |
case "/": |
346 |
case "+": |
347 |
case ".": |
348 |
case "|": |
349 |
case "(": |
350 |
case ")": |
351 |
case "{": |
352 |
case "}": |
353 |
case "[": |
354 |
case "]": |
355 |
rxp+="\\";
|
356 |
default:
|
357 |
rxp+=c; |
358 |
} |
359 |
} |
360 |
rxp="^"+rxp+"$"; |
361 |
if(_2d){
|
362 |
return new RegExp(rxp,"mi"); |
363 |
}else{
|
364 |
return new RegExp(rxp,"m"); |
365 |
} |
366 |
},destroy:function(){ |
367 |
this.inherited(arguments); |
368 |
if(this._promDialogTimeout){ |
369 |
clearTimeout(this._promDialogTimeout);
|
370 |
this._promDialogTimeout=null; |
371 |
dijit.popup.close(this._promDialog);
|
372 |
} |
373 |
if(this._frToolbar){ |
374 |
this._frToolbar.destroyRecursive();
|
375 |
this._frToolbar=null; |
376 |
} |
377 |
if(this._promDialog){ |
378 |
this._promDialog.destroyRecursive();
|
379 |
this._promDialog=null; |
380 |
} |
381 |
}}); |
382 |
dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){ |
383 |
if(o.plugin){
|
384 |
return;
|
385 |
} |
386 |
var _2e=o.args.name.toLowerCase();
|
387 |
if(_2e==="findreplace"){ |
388 |
o.plugin=new dojox.editor.plugins.FindReplace({});
|
389 |
} |
390 |
}); |
391 |
} |