X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=xex.js;h=9f2dc429ead36504d276ef0b56a1d845ee3abda7;hb=7c26a3518b1bf90717a59b165edb254a8c9f31d2;hp=e97c17edbfa6ef220fba125e0efb47a98a7904e4;hpb=983c711cb17bf83071915faabaff92698ff1e0e2;p=m17n%2Fm17n-lib-js.git diff --git a/xex.js b/xex.js index e97c17e..9f2dc42 100644 --- a/xex.js +++ b/xex.js @@ -1605,10 +1605,8 @@ MIM.Selector.prototype = new Xex.Term ('selector'); selectors["@>"] = selectors["@last"] = new MIM.Selector ('@>'); selectors["@-"] = selectors["@previous"] = new MIM.Selector ('@-'); selectors["@+"] = selectors["@next"] = new MIM.Selector ('@+'); - selectors["@["] = selectors["@previous-candidate-change"] - = new MIM.Selector ('@['); - selectors["@]"] = selectors["@next-candidate-change"] - = new MIM.Selector ('@]'); + selectors["@["] = selectors["@previous-group"] = new MIM.Selector ('@['); + selectors["@]"] = selectors["@next-group"] = new MIM.Selector ('@]'); MIM.Selector.prototype.Parser = function (domain, node) { @@ -2812,7 +2810,7 @@ MIM.im_domain.DefType (MIM.State.prototype); { this.commit (); this.keys.val.splice (0, this.key_head); - this.key_head = 0; + this.key_head = this.state_key_head = this.commit_key_head = 0; this.prev_state = null; } } @@ -2834,6 +2832,7 @@ MIM.im_domain.DefType (MIM.State.prototype); { if (! this.active) { + Xex.Log ("active = false"); this.key_unhandled = true; this.unhandled_key = key; return false; @@ -2845,6 +2844,7 @@ MIM.im_domain.DefType (MIM.State.prototype); this.key_unhandled = false; this.keys.val.push (key); var count = 0; + Xex.Log ("keyhead=" + this.key_head + " len="+this.keys.val.length); while (this.key_head < this.keys.val.length) { if (! handle_key.call (this)) @@ -2875,17 +2875,7 @@ MIM.im_domain.DefType (MIM.State.prototype); { this.keys.val.splice (0, this.commit_key_head); this.key_head -= this.commit_key_head; - if (this.key_head < 0) - { - Xex.Log ('RECOVER key_head'); - this.key_head = 0; - } this.state_key_head -= this.commit_key_head; - if (this.state_key_head < 0) - { - Xex.Log ('RECOVER state_key_head'); - this.state_key_head = 0; - } this.commit_key_head = 0; } if (this.key_unhandled) @@ -3126,8 +3116,6 @@ MIM.set_caret = function (target, ic) } }; -MIM.ignore_focus = false; - MIM.update = function (target, ic) { var text = target.value; @@ -3140,55 +3128,99 @@ MIM.update = function (target, ic) MIM.set_caret (target, ic); }; +(function () { + var style_props = { + width: 'width', + height: 'height', + padingLeft: 'padding-left', + paddingRight: 'padding-right', + paddingTop: 'padding-top', + paddintBottom: 'padding-bottom', + borderLeftStyle: 'border-left-style', + borderRightStyle: 'border-right-style', + borderTopStyle: 'border-top-style', + borderBottomStyle: 'border-bottom-style', + borderLeftWidth: 'border-left-width', + borderRightWidth: 'border-right-width', + borderTopWidth: 'border-top-width', + borderBottomWidth: 'border-bottom-width', + fontFamily: 'font-family', + fontSize: 'font-size', + lineHeight: 'line-height', + letterSpacing: 'letter-spacing', + wordSpacing: 'word-spacing' }; + + function copy_style (from, to) + { + var from_style = getComputedStyle(from,''); + + for(var name in style_props) + to.style[name] = from_style.getPropertyValue (style_props[name]); + + to.style.left = from.offsetLeft + 'px'; + to.style.top = from.offsetTop + 'px'; + to.style.width = from.offsetWidth; + to.style.height = from.offsetHeight; + to.scrollLeft = from.scrollLeft; + to.scrollTop = from.scrollTop; + } + + MIM.show = function (target, ic) + { + if (! ic.can_node) + { + var elm = document.createTextNode (''); + + ic.can_node = document.createElement ('div'); + ic.can_node.style.visibility="hidden"; + ic.can_node.style.position = "absolute"; + ic.can_node.appendChild (elm) + elm = document.createElement('span'); + elm.innerHTML = '.'; + ic.can_node.appendChild (elm) + document.getElementsByTagName ('body')[0].appendChild (ic.can_node); + } + + copy_style (target, ic.can_node); + ic.can_node.firstChild.value = target.value.substr (0, ic.range[0]); + var x = target.offsetLeft + ic.can_node.lastChild.offsetLeft +2; + var y = target.offsetTop + ic.can_node.lastChild.offsetTop -2; + + Xex.Log ("x:" + x + "px y:" + y + "px"); + } +}) (); + MIM.focus_in = function (event) { var target = event.target; var ic = target.mim_ic; - ic.Filter (MIM.Key.FocusIn); - target.removeEventListener (''); - setTimeout (MIM.update (target, ic); - // Ignore further focus-in caused by setSelectionRange (). - target.mim_ignore_focus_in = true; - } - } -} - -MIM.cancel_ignore_focus = function () -{ - if (MIM.focus_ignore_target) + if (ic.wait_update == true) { - MIM.focus_ignore_target.mim_ignore_focus_in = false; - MIM.focus_ignore_target.mim_ignore_focus_out = false; + Xex.Log ("Focus in " + target.tagName + ' IGNORED'); + event.preventDefault (); + return false; } + Xex.Log ("Focus in " + target.tagName); + ic.Filter (MIM.Key.FocusIn); + MIM.update (target, ic); } MIM.focus_out = function (event) { var target = event.target; var ic = target.mim_ic; - if (ic) + function reset_update () { ic.wait_update = false; }; + if (ic.wait_update == true) { - if (target.mim_ignore_focus_out) - { - Xex.Log ('ignore focus_out in ' + target.tagName); - // Ignore this event which is caused by setSelectionRange (). - target.mim_ignore_focus_out = false; - event.preventDefault (); - } - else - { - Xex.Log ('focus_out in ' + target.tagName); - if (! MIM.get_range (target, ic)) - ic.reset (); - ic.Filter (MIM.Key.FocusOut); - // Ignore further focus-out caused by setSelectionRange (). - target.mim_ignore_focus_in = true; - target.mim_ignore_focus_out = true; - MIM.focus_ignore_target = target; - MIM.update (target, ic); - setTimeout (MIM.cancel_ignore_focus, 100); - } + Xex.Log ("Focus out " + target.tagName + ' IGNORED'); + event.preventDefault (); + return false; } + Xex.Log ("Focus out " + target.tagName); + ic.Filter (MIM.Key.FocusOut); + ic.wait_update = true; + MIM.update (target, ic, true); + setTimeout (reset_update, 1000); }; MIM.keydown = function (event) @@ -3198,7 +3230,6 @@ MIM.keydown = function (event) return; if (! (target.type == "text" || target.type == "textarea")) return; - document.akey = event; var ic = target.mim_ic; if (! ic || ic.im != MIM.current) @@ -3218,6 +3249,7 @@ MIM.keydown = function (event) if (! MIM.get_range (target, ic)) ic.reset (); } + MIM.show (target, ic); MIM.debug_print (event, ic); ic.key = MIM.decode_key_event (event); if (ic.key) @@ -3260,6 +3292,7 @@ MIM.keypress = function (event) Xex.Log ("filtering " + ic.key); try { var result = ic.Filter (ic.key); + Xex.Log ("result = " + result); } catch (e) { Xex.Log ('Error:' + e); throw (e); @@ -3273,6 +3306,7 @@ MIM.keypress = function (event) } finally { MIM.debug_print (event, ic); } + return; }; @@ -3294,7 +3328,6 @@ MIM.keypress = function (event) sk: { name: 'Slovak' }, sr: { name: 'Serbian' }, sv: { name: 'Swedish' }, - vi: { name: 'Vietnamese' }, yi: { name: 'Yiddish' } }, MiddleEast: { ar: { name: 'Arabic' }, @@ -3361,12 +3394,10 @@ MIM.keypress = function (event) list = lang_category[cat][lang].list; if (! list) list = lang_category[cat][lang].list = {}; - break; + for (name in MIM.imlist[lang]) + list[name] = MIM.imlist[lang][name]; } - if (list) - for (name in MIM.imlist[lang]) - list[name] = MIM.imlist[lang][name]; - else + if (! list) for (name in MIM.imlist[lang]) Xex.Log ('no category ' + lang + '-' + name); } @@ -3464,7 +3495,9 @@ MIM.keypress = function (event) li.style.top = '0px'; li.style.listStyle = 'none'; li.menu_level = level; - li.appendChild (document.createTextNode (text)); + var nobr = document.createElement ('nobr'); + nobr.innerHTML = text; + li.appendChild (nobr); return li; } @@ -3514,7 +3547,6 @@ MIM.keypress = function (event) li.appendChild (sub); menu.appendChild (li); } - document.mimmenu = menu; lang_category = null; } menu.style.left = (event.clientX - 10) + "px";