fixed: #9897. Fixed problem with highlighting in codearea. Updated EditArea to version 0.8.1.1
This commit is contained in:
parent
bbbe385889
commit
3320465ca4
66 changed files with 3122 additions and 2275 deletions
|
|
@ -5,22 +5,22 @@
|
|||
|
||||
|
||||
// need to redefine this functiondue to IE problem
|
||||
function getAttribute( elm, aname ) {
|
||||
function getAttribute( elm, aName ) {
|
||||
var aValue,taName,i;
|
||||
try{
|
||||
var avalue = elm.getAttribute( aname );
|
||||
}catch(exept){
|
||||
aValue = elm.getAttribute( aName );
|
||||
}catch(exept){}
|
||||
|
||||
}
|
||||
if ( ! avalue ) {
|
||||
for ( var i = 0; i < elm.attributes.length; i ++ ) {
|
||||
var taName = elm.attributes [i] .name.toLowerCase();
|
||||
if ( taName == aname ) {
|
||||
avalue = elm.attributes [i] .value;
|
||||
return avalue;
|
||||
if( ! aValue ){
|
||||
for( i = 0; i < elm.attributes.length; i ++ ) {
|
||||
taName = elm.attributes[i] .name.toLowerCase();
|
||||
if( taName == aName ) {
|
||||
aValue = elm.attributes[i] .value;
|
||||
return aValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
return avalue;
|
||||
return aValue;
|
||||
};
|
||||
|
||||
// need to redefine this function due to IE problem
|
||||
|
|
@ -50,7 +50,7 @@
|
|||
if(elem){
|
||||
var children= elem.childNodes;
|
||||
var result=null;
|
||||
var results= new Array();
|
||||
var results= [];
|
||||
for (var x=0;x<children.length;x++) {
|
||||
strTagName = new String(children[x].tagName);
|
||||
children_class="?";
|
||||
|
|
@ -93,46 +93,37 @@
|
|||
};
|
||||
|
||||
function getMouseX(e){
|
||||
/*if(document.all)
|
||||
return event.x + document.body.scrollLeft;
|
||||
else
|
||||
return e.pageX;*/
|
||||
|
||||
if(e!=null && typeof(e.pageX)!="undefined"){
|
||||
return e.pageX;
|
||||
}else{
|
||||
return (e!=null?e.x:event.x)+ document.documentElement.scrollLeft;
|
||||
}
|
||||
//return (e!=null) ? e.pageX : event.x + document.documentElement.scrollLeft;
|
||||
};
|
||||
|
||||
function getMouseY(e){
|
||||
/*if(document.all)
|
||||
return event.y + document.body.scrollTop;
|
||||
else
|
||||
return e.pageY;*/
|
||||
if(e!=null && typeof(e.pageY)!="undefined"){
|
||||
return e.pageY;
|
||||
}else{
|
||||
return (e!=null?e.y:event.y)+ document.documentElement.scrollTop;
|
||||
}
|
||||
//return (e!=null) ? e.pageY : event.y + document.documentElement.scrollTop;
|
||||
};
|
||||
|
||||
function calculeOffsetLeft(r){
|
||||
return calculeOffset(r,"offsetLeft")
|
||||
return calculeOffset(r,"offsetLeft")
|
||||
};
|
||||
|
||||
function calculeOffsetTop(r){
|
||||
return calculeOffset(r,"offsetTop")
|
||||
return calculeOffset(r,"offsetTop")
|
||||
};
|
||||
|
||||
function calculeOffset(element,attr){
|
||||
var offset=0;
|
||||
while(element){
|
||||
offset+=element[attr];
|
||||
element=element.offsetParent
|
||||
}
|
||||
return offset;
|
||||
var offset=0;
|
||||
while(element){
|
||||
offset+=element[attr];
|
||||
element=element.offsetParent
|
||||
}
|
||||
return offset;
|
||||
};
|
||||
|
||||
/** return the computed style
|
||||
|
|
@ -160,7 +151,8 @@
|
|||
* Moving an element
|
||||
***/
|
||||
|
||||
var move_current_element;
|
||||
var _mCE; // currently moving element
|
||||
|
||||
/* allow to move an element in a window
|
||||
e: the event
|
||||
id: the id of the element
|
||||
|
|
@ -179,46 +171,44 @@
|
|||
if(frame.event)
|
||||
e=frame.event;
|
||||
|
||||
move_current_element= frame.document.getElementById(elem_id);
|
||||
move_current_element.frame=frame;
|
||||
_mCE= frame.document.getElementById(elem_id);
|
||||
_mCE.frame=frame;
|
||||
frame.document.onmousemove= move_element;
|
||||
frame.document.onmouseup= end_move_element;
|
||||
/*move_current_element.onmousemove= move_element;
|
||||
move_current_element.onmouseup= end_move_element;*/
|
||||
/*_mCE.onmousemove= move_element;
|
||||
_mCE.onmouseup= end_move_element;*/
|
||||
|
||||
//alert(move_current_element.frame.document.body.offsetHeight);
|
||||
//alert(_mCE.frame.document.body.offsetHeight);
|
||||
|
||||
mouse_x= getMouseX(e);
|
||||
mouse_y= getMouseY(e);
|
||||
//window.status=frame+ " elem: "+elem_id+" elem: "+ move_current_element + " mouse_x: "+mouse_x;
|
||||
move_current_element.start_pos_x = mouse_x - (move_current_element.style.left.replace("px","") || calculeOffsetLeft(move_current_element));
|
||||
move_current_element.start_pos_y = mouse_y - (move_current_element.style.top.replace("px","") || calculeOffsetTop(move_current_element));
|
||||
//window.status=frame+ " elem: "+elem_id+" elem: "+ _mCE + " mouse_x: "+mouse_x;
|
||||
_mCE.start_pos_x = mouse_x - (_mCE.style.left.replace("px","") || calculeOffsetLeft(_mCE));
|
||||
_mCE.start_pos_y = mouse_y - (_mCE.style.top.replace("px","") || calculeOffsetTop(_mCE));
|
||||
return false;
|
||||
};
|
||||
|
||||
function end_move_element(e){
|
||||
move_current_element.frame.document.onmousemove= "";
|
||||
move_current_element.frame.document.onmouseup= "";
|
||||
move_current_element=null;
|
||||
_mCE.frame.document.onmousemove= "";
|
||||
_mCE.frame.document.onmouseup= "";
|
||||
_mCE=null;
|
||||
};
|
||||
|
||||
function move_element(e){
|
||||
/*window.status="move"+frame;
|
||||
window.status="move2"+frame.event;*/
|
||||
if(move_current_element.frame && move_current_element.frame.event)
|
||||
e=move_current_element.frame.event;
|
||||
var mouse_x=getMouseX(e);
|
||||
var mouse_y=getMouseY(e);
|
||||
var new_top= mouse_y - move_current_element.start_pos_y;
|
||||
var new_left= mouse_x - move_current_element.start_pos_x;
|
||||
var newTop,newLeft,maxLeft;
|
||||
|
||||
if( _mCE.frame && _mCE.frame.event )
|
||||
e=_mCE.frame.event;
|
||||
newTop = getMouseY(e) - _mCE.start_pos_y;
|
||||
newLeft = getMouseX(e) - _mCE.start_pos_x;
|
||||
|
||||
var max_left= move_current_element.frame.document.body.offsetWidth- move_current_element.offsetWidth;
|
||||
max_top= move_current_element.frame.document.body.offsetHeight- move_current_element.offsetHeight;
|
||||
new_top= Math.min(Math.max(0, new_top), max_top);
|
||||
new_left= Math.min(Math.max(0, new_left), max_left);
|
||||
maxLeft = _mCE.frame.document.body.offsetWidth- _mCE.offsetWidth;
|
||||
max_top = _mCE.frame.document.body.offsetHeight- _mCE.offsetHeight;
|
||||
newTop = Math.min(Math.max(0, newTop), max_top);
|
||||
newLeft = Math.min(Math.max(0, newLeft), maxLeft);
|
||||
|
||||
move_current_element.style.top= new_top+"px";
|
||||
move_current_element.style.left= new_left+"px";
|
||||
_mCE.style.top = newTop+"px";
|
||||
_mCE.style.left = newLeft+"px";
|
||||
return false;
|
||||
};
|
||||
|
||||
|
|
@ -230,85 +220,86 @@
|
|||
|
||||
// allow to get infos on the selection: array(start, end)
|
||||
function getSelectionRange(textarea){
|
||||
//if(nav['isIE'])
|
||||
// get_IE_selection(textarea);
|
||||
return {"start": textarea.selectionStart, "end": textarea.selectionEnd};
|
||||
};
|
||||
|
||||
// allow to set the selection
|
||||
function setSelectionRange(textarea, start, end){
|
||||
textarea.focus();
|
||||
function setSelectionRange(t, start, end){
|
||||
t.focus();
|
||||
|
||||
start= Math.max(0, Math.min(textarea.value.length, start));
|
||||
end= Math.max(start, Math.min(textarea.value.length, end));
|
||||
start = Math.max(0, Math.min(t.value.length, start));
|
||||
end = Math.max(start, Math.min(t.value.length, end));
|
||||
|
||||
if(nav['isOpera']){ // Opera bug when moving selection start and selection end
|
||||
textarea.selectionEnd = 1;
|
||||
textarea.selectionStart = 0;
|
||||
textarea.selectionEnd = 1;
|
||||
textarea.selectionStart = 0;
|
||||
if( this.isOpera && this.isOpera < 9.6 ){ // Opera bug when moving selection start and selection end
|
||||
t.selectionEnd = 1;
|
||||
t.selectionStart = 0;
|
||||
t.selectionEnd = 1;
|
||||
t.selectionStart = 0;
|
||||
}
|
||||
textarea.selectionStart = start;
|
||||
textarea.selectionEnd = end;
|
||||
t.selectionStart = start;
|
||||
t.selectionEnd = end;
|
||||
//textarea.setSelectionRange(start, end);
|
||||
|
||||
if(nav['isIE'])
|
||||
set_IE_selection(textarea);
|
||||
if(isIE)
|
||||
set_IE_selection(t);
|
||||
};
|
||||
|
||||
|
||||
// set IE position in Firefox mode (textarea.selectionStart and textarea.selectionEnd). should work as a repeated task
|
||||
function get_IE_selection(textarea){
|
||||
|
||||
if(textarea && textarea.focused)
|
||||
function get_IE_selection(t){
|
||||
var d=document,div,range,stored_range,elem,scrollTop,relative_top,line_start,line_nb,range_start,range_end,tab;
|
||||
if(t && t.focused)
|
||||
{
|
||||
if(!textarea.ea_line_height)
|
||||
if(!t.ea_line_height)
|
||||
{ // calculate the lineHeight
|
||||
var div= document.createElement("div");
|
||||
div.style.fontFamily= get_css_property(textarea, "font-family");
|
||||
div.style.fontSize= get_css_property(textarea, "font-size");
|
||||
div= d.createElement("div");
|
||||
div.style.fontFamily= get_css_property(t, "font-family");
|
||||
div.style.fontSize= get_css_property(t, "font-size");
|
||||
div.style.visibility= "hidden";
|
||||
div.innerHTML="0";
|
||||
document.body.appendChild(div);
|
||||
textarea.ea_line_height= div.offsetHeight;
|
||||
document.body.removeChild(div);
|
||||
d.body.appendChild(div);
|
||||
t.ea_line_height= div.offsetHeight;
|
||||
d.body.removeChild(div);
|
||||
}
|
||||
//textarea.focus();
|
||||
var range = document.selection.createRange();
|
||||
var stored_range = range.duplicate();
|
||||
stored_range.moveToElementText( textarea );
|
||||
stored_range.setEndPoint( 'EndToEnd', range );
|
||||
if(stored_range.parentElement()==textarea){
|
||||
// the range don't take care of empty lines in the end of the selection
|
||||
var elem= textarea;
|
||||
var scrollTop= 0;
|
||||
while(elem.parentNode){
|
||||
scrollTop+= elem.scrollTop;
|
||||
elem= elem.parentNode;
|
||||
//t.focus();
|
||||
range = d.selection.createRange();
|
||||
try
|
||||
{
|
||||
stored_range = range.duplicate();
|
||||
stored_range.moveToElementText( t );
|
||||
stored_range.setEndPoint( 'EndToEnd', range );
|
||||
if(stored_range.parentElement() == t){
|
||||
// the range don't take care of empty lines in the end of the selection
|
||||
elem = t;
|
||||
scrollTop = 0;
|
||||
while(elem.parentNode){
|
||||
scrollTop+= elem.scrollTop;
|
||||
elem = elem.parentNode;
|
||||
}
|
||||
|
||||
// var scrollTop= t.scrollTop + document.body.scrollTop;
|
||||
|
||||
// var relative_top= range.offsetTop - calculeOffsetTop(t) + scrollTop;
|
||||
relative_top= range.offsetTop - calculeOffsetTop(t)+ scrollTop;
|
||||
// alert("rangeoffset: "+ range.offsetTop +"\ncalcoffsetTop: "+ calculeOffsetTop(t) +"\nrelativeTop: "+ relative_top);
|
||||
line_start = Math.round((relative_top / t.ea_line_height) +1);
|
||||
|
||||
line_nb = Math.round(range.boundingHeight / t.ea_line_height);
|
||||
|
||||
range_start = stored_range.text.length - range.text.length;
|
||||
tab = t.value.substr(0, range_start).split("\n");
|
||||
range_start += (line_start - tab.length)*2; // add missing empty lines to the selection
|
||||
t.selectionStart = range_start;
|
||||
|
||||
range_end = t.selectionStart + range.text.length;
|
||||
tab = t.value.substr(0, range_start + range.text.length).split("\n");
|
||||
range_end += (line_start + line_nb - 1 - tab.length)*2;
|
||||
t.selectionEnd = range_end;
|
||||
}
|
||||
|
||||
// var scrollTop= textarea.scrollTop + document.body.scrollTop;
|
||||
|
||||
// var relative_top= range.offsetTop - calculeOffsetTop(textarea) + scrollTop;
|
||||
var relative_top= range.offsetTop - calculeOffsetTop(textarea)+ scrollTop;
|
||||
// alert("rangeoffset: "+ range.offsetTop +"\ncalcoffsetTop: "+ calculeOffsetTop(textarea) +"\nrelativeTop: "+ relative_top);
|
||||
var line_start = Math.round((relative_top / textarea.ea_line_height) +1);
|
||||
|
||||
var line_nb= Math.round(range.boundingHeight / textarea.ea_line_height);
|
||||
|
||||
// alert("store_range: "+ stored_range.text.length+"\nrange: "+range.text.length+"\nrange_text: "+ range.text);
|
||||
var range_start= stored_range.text.length - range.text.length;
|
||||
var tab= textarea.value.substr(0, range_start).split("\n");
|
||||
range_start+= (line_start - tab.length)*2; // add missing empty lines to the selection
|
||||
textarea.selectionStart = range_start;
|
||||
|
||||
var range_end= textarea.selectionStart + range.text.length;
|
||||
tab= textarea.value.substr(0, range_start + range.text.length).split("\n");
|
||||
range_end+= (line_start + line_nb - 1 - tab.length)*2;
|
||||
textarea.selectionEnd = range_end;
|
||||
}
|
||||
catch(e){}
|
||||
}
|
||||
setTimeout("get_IE_selection(document.getElementById('"+ textarea.id +"'));", 50);
|
||||
setTimeout("get_IE_selection(document.getElementById('"+ t.id +"'));", 50);
|
||||
};
|
||||
|
||||
function IE_textarea_focus(){
|
||||
|
|
@ -320,16 +311,21 @@
|
|||
}
|
||||
|
||||
// select the text for IE (take into account the \r difference)
|
||||
function set_IE_selection(textarea){
|
||||
function set_IE_selection( t ){
|
||||
var nbLineStart,nbLineStart,nbLineEnd,range;
|
||||
if(!window.closed){
|
||||
var nbLineStart=textarea.value.substr(0, textarea.selectionStart).split("\n").length - 1;
|
||||
var nbLineEnd=textarea.value.substr(0, textarea.selectionEnd).split("\n").length - 1;
|
||||
var range = document.selection.createRange();
|
||||
range.moveToElementText( textarea );
|
||||
range.setEndPoint( 'EndToStart', range );
|
||||
range.moveStart('character', textarea.selectionStart - nbLineStart);
|
||||
range.moveEnd('character', textarea.selectionEnd - nbLineEnd - (textarea.selectionStart - nbLineStart) );
|
||||
range.select();
|
||||
nbLineStart=t.value.substr(0, t.selectionStart).split("\n").length - 1;
|
||||
nbLineEnd=t.value.substr(0, t.selectionEnd).split("\n").length - 1;
|
||||
try
|
||||
{
|
||||
range = document.selection.createRange();
|
||||
range.moveToElementText( t );
|
||||
range.setEndPoint( 'EndToStart', range );
|
||||
range.moveStart('character', t.selectionStart - nbLineStart);
|
||||
range.moveEnd('character', t.selectionEnd - nbLineEnd - (t.selectionStart - nbLineStart) );
|
||||
range.select();
|
||||
}
|
||||
catch(e){}
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue