Editor updates with proper IE support. Needs a lot more testing, especially in non-Windows browsers

git-svn-id: file:///svn/phpbb/trunk@6651 89ea8834-ac86-4346-8a33-228a782c2dd0
This commit is contained in:
Dominik Dröscher 2006-11-24 18:18:17 +00:00
parent d529f78adb
commit 2d31d53289
2 changed files with 66 additions and 74 deletions

View file

@ -87,6 +87,9 @@ function bbfontstyle(bbopen, bbclose)
theSelection = false; theSelection = false;
document.forms[form_name].elements[text_name].focus(); document.forms[form_name].elements[text_name].focus();
var textarea = document.forms[form_name].elements[text_name];
var new_pos = getCaretPosition(textarea).start + bbopen.length;
if ((clientVer >= 4) && is_ie && is_win) if ((clientVer >= 4) && is_ie && is_win)
{ {
// Get text selection // Get text selection
@ -109,25 +112,11 @@ function bbfontstyle(bbopen, bbclose)
return; return;
} }
// Close image tag before adding
if (imageTag)
{
insert_text(bbtags[15]);
// Remove the close image tag from the list
lastValue = arraypop(bbcode) - 1;
// Return button back to normal state
document.forms[form_name].addbbcode14.value = 'Img';
imageTag = false;
}
// Open tag // Open tag
insert_text(bbopen + bbclose); insert_text(bbopen + bbclose);
// Center the cursor when we don't have a selection // Center the cursor when we don't have a selection
var textarea = document.forms[form_name].elements[text_name];
var new_pos = getCaretPosition(textarea).start - bbclose.length;
// IE & Opera // IE & Opera
if (document.selection) if (document.selection)
@ -135,6 +124,7 @@ function bbfontstyle(bbopen, bbclose)
var range = textarea.createTextRange(); var range = textarea.createTextRange();
range.move("character", new_pos); range.move("character", new_pos);
range.select(); range.select();
storeCaret(document.forms[form_name].elements[text_name]);
} }
//Gecko //Gecko
else if (!isNaN(textarea.selectionStart)) else if (!isNaN(textarea.selectionStart))
@ -144,9 +134,6 @@ function bbfontstyle(bbopen, bbclose)
} }
document.forms[form_name].elements[text_name].focus(); document.forms[form_name].elements[text_name].focus();
storeCaret(document.forms[form_name].elements[text_name]);
return; return;
} }
@ -172,6 +159,7 @@ function insert_text(text, spaces, popup)
{ {
var caret_pos = textarea.caretPos; var caret_pos = textarea.caretPos;
caret_pos.text = caret_pos.text.charAt(caret_pos.text.length - 1) == ' ' ? caret_pos.text + text + ' ' : caret_pos.text + text; caret_pos.text = caret_pos.text.charAt(caret_pos.text.length - 1) == ' ' ? caret_pos.text + text + ' ' : caret_pos.text + text;
} }
else if (!isNaN(textarea.selectionStart)) else if (!isNaN(textarea.selectionStart))
{ {
@ -186,6 +174,7 @@ function insert_text(text, spaces, popup)
{ {
textarea.value = textarea.value + text; textarea.value = textarea.value + text;
} }
document.forms[form_name].elements[text_name].focus();
} }
/** /**
@ -372,29 +361,36 @@ function getCaretPosition(txtarea)
var caretPos = new caretPosition(); var caretPos = new caretPosition();
// dirty IE way // dirty IE way
if(document.selection) // Idea by tkirby on http://www.csie.ntu.edu.tw/~b88039/html/jslib/caret.html
if(document.selection && is_ie)
{ {
txtarea.focus(); //insert dummy caracter at current position
var dummy = "\001";
var sel = document.selection.createRange();
var dul = sel.duplicate();
var len = 0;
dul.moveToElementText(txtarea);
sel.text = dummy;
//the current selection //find dummy chraracter again
var curr_sel = document.selection.createRange(); len = (dul.text.indexOf(c));
var curr_length = curr_sel.text.length; sel.moveStart('character',-1);
sel.text = "";
// back to 0 if (len == -1)
curr_sel.moveStart ('character', -txtarea.value.length); {
len = 0;
//start = selected text - original selection
caretPos.start = curr_sel.text.length - curr_length;
// end = selection length
caretPos.end = curr_sel.text.length;
} }
// simple Gecko way
else if(!isNaN(txtarea.selectionStart)) caretPos.start = len;
caretPos.end = len;
}
// simple Gecko/Opera way
else if(txtarea.selectionStart || txtarea.selectionStart == 0)
{ {
caretPos.start = txtarea.selectionStart; caretPos.start = txtarea.selectionStart;
caretPos.end = txtarea.selectionEnd; caretPos.end = txtarea.selectionEnd;
} }
return (caretPos); return caretPos;
} }

View file

@ -87,6 +87,9 @@ function bbfontstyle(bbopen, bbclose)
theSelection = false; theSelection = false;
document.forms[form_name].elements[text_name].focus(); document.forms[form_name].elements[text_name].focus();
var textarea = document.forms[form_name].elements[text_name];
var new_pos = getCaretPosition(textarea).start + bbopen.length;
if ((clientVer >= 4) && is_ie && is_win) if ((clientVer >= 4) && is_ie && is_win)
{ {
// Get text selection // Get text selection
@ -109,25 +112,11 @@ function bbfontstyle(bbopen, bbclose)
return; return;
} }
// Close image tag before adding
if (imageTag)
{
insert_text(bbtags[15]);
// Remove the close image tag from the list
lastValue = arraypop(bbcode) - 1;
// Return button back to normal state
document.forms[form_name].addbbcode14.value = 'Img';
imageTag = false;
}
// Open tag // Open tag
insert_text(bbopen + bbclose); insert_text(bbopen + bbclose);
// Center the cursor when we don't have a selection // Center the cursor when we don't have a selection
var textarea = document.forms[form_name].elements[text_name];
var new_pos = getCaretPosition(textarea).start - bbclose.length;
// IE & Opera // IE & Opera
if (document.selection) if (document.selection)
@ -135,6 +124,7 @@ function bbfontstyle(bbopen, bbclose)
var range = textarea.createTextRange(); var range = textarea.createTextRange();
range.move("character", new_pos); range.move("character", new_pos);
range.select(); range.select();
storeCaret(document.forms[form_name].elements[text_name]);
} }
//Gecko //Gecko
else if (!isNaN(textarea.selectionStart)) else if (!isNaN(textarea.selectionStart))
@ -144,9 +134,6 @@ function bbfontstyle(bbopen, bbclose)
} }
document.forms[form_name].elements[text_name].focus(); document.forms[form_name].elements[text_name].focus();
storeCaret(document.forms[form_name].elements[text_name]);
return; return;
} }
@ -172,6 +159,7 @@ function insert_text(text, spaces, popup)
{ {
var caret_pos = textarea.caretPos; var caret_pos = textarea.caretPos;
caret_pos.text = caret_pos.text.charAt(caret_pos.text.length - 1) == ' ' ? caret_pos.text + text + ' ' : caret_pos.text + text; caret_pos.text = caret_pos.text.charAt(caret_pos.text.length - 1) == ' ' ? caret_pos.text + text + ' ' : caret_pos.text + text;
} }
else if (!isNaN(textarea.selectionStart)) else if (!isNaN(textarea.selectionStart))
{ {
@ -186,6 +174,7 @@ function insert_text(text, spaces, popup)
{ {
textarea.value = textarea.value + text; textarea.value = textarea.value + text;
} }
document.forms[form_name].elements[text_name].focus();
} }
/** /**
@ -372,29 +361,36 @@ function getCaretPosition(txtarea)
var caretPos = new caretPosition(); var caretPos = new caretPosition();
// dirty IE way // dirty IE way
if(document.selection) // Idea by tkirby on http://www.csie.ntu.edu.tw/~b88039/html/jslib/caret.html
if(document.selection && is_ie)
{ {
txtarea.focus(); //insert dummy caracter at current position
var dummy = "\001";
var sel = document.selection.createRange();
var dul = sel.duplicate();
var len = 0;
dul.moveToElementText(txtarea);
sel.text = dummy;
//the current selection //find dummy chraracter again
var curr_sel = document.selection.createRange(); len = (dul.text.indexOf(c));
var curr_length = curr_sel.text.length; sel.moveStart('character',-1);
sel.text = "";
// back to 0 if (len == -1)
curr_sel.moveStart ('character', -txtarea.value.length); {
len = 0;
//start = selected text - original selection
caretPos.start = curr_sel.text.length - curr_length;
// end = selection length
caretPos.end = curr_sel.text.length;
} }
// simple Gecko way
else if(!isNaN(txtarea.selectionStart)) caretPos.start = len;
caretPos.end = len;
}
// simple Gecko/Opera way
else if(txtarea.selectionStart || txtarea.selectionStart == 0)
{ {
caretPos.start = txtarea.selectionStart; caretPos.start = txtarea.selectionStart;
caretPos.end = txtarea.selectionEnd; caretPos.end = txtarea.selectionEnd;
} }
return (caretPos); return caretPos;
} }