Commit f764882b authored by Oleg Korshul's avatar Oleg Korshul

ie & edge mode (not tested)

parent a1d1ad5f
...@@ -80,9 +80,22 @@ ...@@ -80,9 +80,22 @@
preventDefault : function() preventDefault : function()
{ {
this._isDefaultPrevented = true; this._isDefaultPrevented = true;
},
stopPropagation : function()
{
// nothing
} }
}; };
function ti_console_log(_log)
{
//console.log(_log);
}
function ti_console_log2(_log)
{
//console.log(_log);
}
function CTextInput(api) function CTextInput(api)
{ {
this.Api = api; this.Api = api;
...@@ -114,7 +127,7 @@ ...@@ -114,7 +127,7 @@
this.debugTexBoxMaxW = 100; this.debugTexBoxMaxW = 100;
this.debugTexBoxMaxH = 20; this.debugTexBoxMaxH = 20;
this.isDebug = false; this.isDebug = true;
this.isSystem = false; this.isSystem = false;
this.isShow = false; this.isShow = false;
} }
...@@ -298,6 +311,8 @@ ...@@ -298,6 +311,8 @@
{ {
if (this.isDebug || this.isSystem) if (this.isDebug || this.isSystem)
{ {
ti_console_log("ti: show");
document.getElementById("area_id_main").style.zIndex = 10; document.getElementById("area_id_main").style.zIndex = 10;
this.HtmlArea.style.top = "0px"; this.HtmlArea.style.top = "0px";
...@@ -318,6 +333,8 @@ ...@@ -318,6 +333,8 @@
{ {
if (this.isDebug || this.isSystem) if (this.isDebug || this.isSystem)
{ {
ti_console_log("ti: unshow");
document.getElementById("area_id_main").style.zIndex = 0; document.getElementById("area_id_main").style.zIndex = 0;
this.HtmlArea.style.top = ((-this.HtmlAreaOffset) + "px"); this.HtmlArea.style.top = ((-this.HtmlAreaOffset) + "px");
...@@ -444,6 +461,8 @@ ...@@ -444,6 +461,8 @@
var _value = this.HtmlArea.value; var _value = this.HtmlArea.value;
if (!this.KeyDownFlag && c_oCompositionState.end == this.compositionState && !this.TextInputAfterComposition && _value != "") if (!this.KeyDownFlag && c_oCompositionState.end == this.compositionState && !this.TextInputAfterComposition && _value != "")
{ {
ti_console_log("ti: external input");
this.Api.Begin_CompositeInput(); this.Api.Begin_CompositeInput();
this.checkCompositionData(this.HtmlArea.value); this.checkCompositionData(this.HtmlArea.value);
this.Api.Replace_CompositeText(this.compositionValue); this.Api.Replace_CompositeText(this.compositionValue);
...@@ -473,6 +492,8 @@ ...@@ -473,6 +492,8 @@
this.Api.onKeyDown(_e); this.Api.onKeyDown(_e);
this.Api.onKeyUp(_e); this.Api.onKeyUp(_e);
} }
ti_console_log("ti: ea space");
} }
if (!AscCommon.AscBrowser.isMozilla) if (!AscCommon.AscBrowser.isMozilla)
...@@ -492,6 +513,7 @@ ...@@ -492,6 +513,7 @@
{ {
if (this.IsUseFirstTextInputAfterComposition) if (this.IsUseFirstTextInputAfterComposition)
{ {
ti_console_log("ti: first textinput after composition");
this.onCompositionEnd(e); this.onCompositionEnd(e);
this.IsUseFirstTextInputAfterComposition = false; this.IsUseFirstTextInputAfterComposition = false;
} }
...@@ -582,6 +604,8 @@ ...@@ -582,6 +604,8 @@
var _fontSelections = g_fontApplication.g_fontSelections; var _fontSelections = g_fontApplication.g_fontSelections;
var _language = _fontSelections.checkText(this.HtmlArea.value); var _language = _fontSelections.checkText(this.HtmlArea.value);
ti_console_log("ti: detect language - " + _language);
/* /*
switch (_language) switch (_language)
{ {
...@@ -699,6 +723,7 @@ ...@@ -699,6 +723,7 @@
{ {
if (this.IsUseFirstTextInputAfterComposition && e.keyCode == 8 || e.keyCode == 46) // del, backspace if (this.IsUseFirstTextInputAfterComposition && e.keyCode == 8 || e.keyCode == 46) // del, backspace
{ {
ti_console_log("ti: keydown emulate composition end (del/backspace)");
this.onCompositionEnd(e, this.HtmlArea.value); this.onCompositionEnd(e, this.HtmlArea.value);
this.IsUseFirstTextInputAfterComposition = false; this.IsUseFirstTextInputAfterComposition = false;
} }
...@@ -756,6 +781,7 @@ ...@@ -756,6 +781,7 @@
{ {
if (this.IsUseFirstTextInputAfterComposition && e.keyCode == 8 || e.keyCode == 46) // del, backspace if (this.IsUseFirstTextInputAfterComposition && e.keyCode == 8 || e.keyCode == 46) // del, backspace
{ {
ti_console_log("ti: keyup emulate composition end (del/backspace)");
this.onCompositionEnd(e, this.HtmlArea.value); this.onCompositionEnd(e, this.HtmlArea.value);
this.IsUseFirstTextInputAfterComposition = false; this.IsUseFirstTextInputAfterComposition = false;
...@@ -827,9 +853,28 @@ ...@@ -827,9 +853,28 @@
if (this.isSystem) if (this.isSystem)
return; return;
ti_console_log2("begin");
if (this.compositionState == c_oCompositionState.end)
this.Api.Begin_CompositeInput();
this.compositionState = c_oCompositionState.start; this.compositionState = c_oCompositionState.start;
this.Api.Begin_CompositeInput();
this.isFirstCompositionUpdateAfterStart = true; this.isFirstCompositionUpdateAfterStart = true;
ti_console_log("ti: onCompositionStart");
if (AscCommon.AscBrowser.isIE && e.target["msGetInputContext"])
{
var ctx = e.target["msGetInputContext"]();
if (undefined != ctx["compositionStartOffset"] && undefined != ctx["compositionEndOffset"] &&
ctx["compositionEndOffset"] > ctx["compositionStartOffset"])
{
// edge: sometimes send start but not sent update
ti_console_log("ti: onCompositionStart->onCompositionUpdate");
this.onCompositionUpdate(e);
}
}
}, },
onCompositionUpdate : function(e, isLockTarget, _data, isFromEnd) onCompositionUpdate : function(e, isLockTarget, _data, isFromEnd)
...@@ -837,6 +882,8 @@ ...@@ -837,6 +882,8 @@
if (this.isSystem) if (this.isSystem)
return; return;
ti_console_log("ti: onCompositionUpdate: " + e.data);
var _old = this.compositionValue.splice(0); var _old = this.compositionValue.splice(0);
if (_data != null) if (_data != null)
...@@ -854,27 +901,37 @@ ...@@ -854,27 +901,37 @@
var ctx = e.target["msGetInputContext"](); var ctx = e.target["msGetInputContext"]();
/* /*
1) ie может не присылать onCompositionEnd (например при длительном наборе текста на японском) 1) ie может не присылать onCompositionEnd (например при длительном наборе текста на японском)
в этом случае некоторая дата просто просто перестает быть частью композиции. Ее нужно ввести, а композицию продолжить в этом случае некоторая дата просто просто перестает быть частью композиции. Ее нужно ввести, а композицию продолжить
2) но, если пришел onCompositionEnd, то нужно запомнить эту дату (которая не в композиции) - но ее не вводить, 2) но, если пришел onCompositionEnd, то нужно запомнить эту дату (которая не в композиции) - но ее не вводить,
так как она дублируется (проверить можно на корейском вводе). так как она дублируется (проверить можно на корейском вводе).
Поэтому действуем так: применяем дату на onCompositionUpdate, действуем аналогично при onCompositionEnd, Поэтому действуем так: применяем дату на onCompositionUpdate, действуем аналогично при onCompositionEnd,
только не добавляем дату в редактор. А очищаем только на onInput, когда нет композиции только не добавляем дату в редактор. А очищаем только на onInput, когда нет композиции
*/ */
var _offsetData = "";
if (undefined !== ctx["compositionStartOffset"]) if (undefined !== ctx["compositionStartOffset"])
{ {
this.ieNonCompositionPrefix = ""; this.ieNonCompositionPrefix = "";
if (0 < ctx["compositionStartOffset"]) if (0 < ctx["compositionStartOffset"])
this.ieNonCompositionPrefix = this.HtmlArea.value.substr(0, ctx["compositionStartOffset"]); this.ieNonCompositionPrefix = this.HtmlArea.value.substr(0, ctx["compositionStartOffset"]);
ti_console_log("ti: ieNonCompositionPrefix: " + this.ieNonCompositionPrefix);
if (this.isFirstCompositionUpdateAfterStart) if (this.isFirstCompositionUpdateAfterStart)
{ {
// нельзя очищать текст HtmlArea на onCompositeEnd, так как может блокироваться следующая композиция // нельзя очищать текст HtmlArea на onCompositeEnd, так как может блокироваться следующая композиция
// но тогда может возникать ситуация, когда не сбросилась дата (не пришел onInput не в композиции) // но тогда может возникать ситуация, когда не сбросилась дата (не пришел onInput не в композиции)
// поэтому первый текст this.ieNonCompositionPrefix после старта копозиции - считаем введенным // поэтому первый текст this.ieNonCompositionPrefix после старта копозиции - считаем введенным
this.ieNonCompositionPrefixConfirm = this.ieNonCompositionPrefix; this.ieNonCompositionPrefixConfirm = this.ieNonCompositionPrefix;
ti_console_log("ti: ieNonCompositionPrefixConfirm1: " + this.ieNonCompositionPrefixConfirm);
}
if (ctx["compositionEndOffset"] > ctx["compositionStartOffset"])
{
_offsetData = this.HtmlArea.value.substr(ctx["compositionStartOffset"], ctx["compositionEndOffset"] - ctx["compositionStartOffset"]);
ti_console_log("ti: msContext offsetData: " + _offsetData);
} }
if (this.ieNonCompositionPrefix != this.ieNonCompositionPrefixConfirm) if (this.ieNonCompositionPrefix != this.ieNonCompositionPrefixConfirm)
...@@ -882,19 +939,28 @@ ...@@ -882,19 +939,28 @@
var _newConfirm = this.ieNonCompositionPrefix.substr(this.ieNonCompositionPrefixConfirm.length); var _newConfirm = this.ieNonCompositionPrefix.substr(this.ieNonCompositionPrefixConfirm.length);
this.ieNonCompositionPrefixConfirm = this.ieNonCompositionPrefix; this.ieNonCompositionPrefixConfirm = this.ieNonCompositionPrefix;
ti_console_log("ti: ieNonCompositionPrefixConfirm2: " + this.ieNonCompositionPrefixConfirm);
if (true !== isFromEnd) if (true !== isFromEnd || _offsetData != "")
{ {
ti_console_log("ti: emulateCompositeConfirm: " + _newConfirm);
this.checkCompositionData(_newConfirm); this.checkCompositionData(_newConfirm);
ti_console_log2("replace: " + this.compositionValue);
this.Api.Replace_CompositeText(this.compositionValue); this.Api.Replace_CompositeText(this.compositionValue);
ti_console_log2("end");
this.Api.End_CompositeInput(); this.Api.End_CompositeInput();
ti_console_log2("begin");
this.Api.Begin_CompositeInput(); this.Api.Begin_CompositeInput();
} }
} }
} }
this.checkCompositionData(e.data); if (AscCommon.AscBrowser.isIE && e.data == "")
this.checkCompositionData(_offsetData);
else
this.checkCompositionData(e.data);
} }
} }
...@@ -926,6 +992,7 @@ ...@@ -926,6 +992,7 @@
_old = this.Api.Get_CursorPosInCompositeText(); _old = this.Api.Get_CursorPosInCompositeText();
_max = this.Api.Get_MaxCursorPosInCompositeText(); _max = this.Api.Get_MaxCursorPosInCompositeText();
} }
ti_console_log2("replace: " + this.compositionValue);
this.Api.Replace_CompositeText(this.compositionValue); this.Api.Replace_CompositeText(this.compositionValue);
if (_isNeedSavePos) if (_isNeedSavePos)
{ {
...@@ -954,6 +1021,8 @@ ...@@ -954,6 +1021,8 @@
if (this.isSystem) if (this.isSystem)
return; return;
ti_console_log("ti: onCompositionEnd");
if (!this.IsUseFirstTextInputAfterComposition && this.isWaitFirstTextInputEvent(e)) if (!this.IsUseFirstTextInputAfterComposition && this.isWaitFirstTextInputEvent(e))
{ {
// always data == "" // always data == ""
...@@ -961,11 +1030,33 @@ ...@@ -961,11 +1030,33 @@
return; return;
} }
ti_console_log("ti: onCompositionEnd -> onCompositionUpdate");
this.onCompositionUpdate(e, false, _data, true); this.onCompositionUpdate(e, false, _data, true);
this.Api.Set_CursorPosInCompositeText(1000); // max this.Api.Set_CursorPosInCompositeText(1000); // max
this.clear(true); this.clear(true);
this.Api.End_CompositeInput(); ti_console_log2("end");
if (AscCommon.AscBrowser.isIE && e.target["msGetInputContext"])
{
var ctx = e.target["msGetInputContext"]();
if (undefined != ctx["compositionStartOffset"] && undefined != ctx["compositionEndOffset"] &&
ctx["compositionEndOffset"] > ctx["compositionStartOffset"])
{
// edge: не натуральный end!!!
this.compositionState = c_oCompositionState.process;
return;
}
else
{
this.Api.End_CompositeInput();
}
}
else
{
this.Api.End_CompositeInput();
}
this.unlockTarget(); this.unlockTarget();
this.TextInputAfterComposition = true; this.TextInputAfterComposition = true;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment