I can try porting the implementation of the selection caching mechanism from the swf8 kernel to the swf10 kernel. I need to make sure that the DHTML kernel preserves selection on blur also.
On Sun, Dec 5, 2010 at 11:32 AM, P T Withington <[email protected]>wrote: > That's probably sufficient, although it sounds like a bit of a kludge to > me. > > It makes me believe all the stronger that the issue is we want the UI to > _not_ display the selection when we don't have focus, but we still want to > be able to ask what the selection is/was. > > I think André's analysis is important. You can either gain/lose focus > and/or apply/remove selection by UI gestures, _or_ programmatically. On top > of that, the desired behavior is to _not_ display the selection when you > don't have focus, but also to be able to query what the selection is/was, > whether you have focus or not. > > So, I think a better way to solve this problem, rather than just delaying > the deselect one tick, is for the sprite to cache the selection state and > use the cache to report back the state, not rely on the platform UI element > to maintain it. > > Gee, this seems to be why it works for <text>: see the swf8 implementation > of LzTextSprite/__cacheSelection. We just need to implement that uniformly. > > On 2010-12-05, at 10:53, Henry Minsky wrote: > > > Andre did some detective work and noticed that in swf8, we defer the > "blur" > > call using an onidle callback , and there is a > > cryptic comment about that which implies we're leaving enough time for > > whoever else was clicked on to grab the selection before we clear it. > > > > > > /** > > * @access private > > */ > > TextField.prototype.__lostFocus = function () { > > if (this['__handlelostFocusdel'] == null) { > > this.__handlelostFocusdel = new LzDelegate(this, > > "__handlelostFocus"); > > } > > lz.Idle.callOnIdle(this.__handlelostFocusdel); > > } > > > > /** > > * must be called after an idle event to prevent the selection from being > > * cleared prematurely, e.g. before a button click. If the selection is > > * cleared, the button doesn't send mouse events. > > * @access private > > */ > > TextField.prototype.__handlelostFocus = function (ignore) { > > if (this.__lzview) this.__lzview.inputtextevent('onblur'); > > } > > > > So for Fred's purposes, in swf10 it might be sufficient to also place the > > call to deselect() in an onidle callback, > > and maybe his application would have time to copy the selection before it > > was cleared? > > > > > > > > > > > > On Sun, Dec 5, 2010 at 8:20 AM, André Bargull <[email protected]> > wrote: > > > >> The various deselect() methods do different things: > >> swf8: > >> - clears the native flash focus > >> swf9+: > >> - sets the selection size to zero > >> dhtml: > >> - hides the click-divs, restores cancelKeys, etc. > >> > >> Therefore simply removing the call to deselect() sounds a bit wrong. > >> > >> --- > >> > >> In general, focus handling for the swf runtimes is implemented as > follows: > >> (1) Explicit focus changes by Lz.Focus: > >> a) "onfocus" :: > >> lz.InputText#_gotFocusEvent() -> LzInputTextSprite#gotFocus() -> > >> LzInputTextSprite#select() [followed by instructions in 2a] > >> b) "onblur" :: > >> lz.InputText#_gotBlurEvent() -> LzInputTextSprite#gotBlur() -> > >> LzInputTextSprite#deselect() [followed by instructions in 2b] > >> > >> (2) Native focus changes: > >> a) "onSetFocus" / "FOCUS_IN" :: > >> LzInputTextSprite#__gotFocus() -> lz.InputText#inputtextevent('onfocus') > -> > >> Lz.Focus.setFocus() [followed by instructions in 1a] > >> b) "onKillFocus" / "FOCUS_OUT" :: > >> LzInputTextSprite#__lostFocus() -> lz.InputText#inputtextevent('onblur') > -> > >> Lz.Focus.clearFocus() [followed by instructions in 1b] > >> > >> swf8 defers the call to inputtextevent('onblur'), see > __handlelostFocus(). > >> Maybe the intent was to make it possible to query the selection before > the > >> native focus is removed, here's the comment from that function: > >> > >>> /** > >>> * must be called after an idle event to prevent the selection from > being > >>> * cleared prematurely, e.g. before a button click. If the selection is > >>> * cleared, the button doesn't send mouse events. > >>> * @access private > >>> */ > >>> > >> The first sentence indicates this is about querying the selection. But > I'm > >> not sure about the second sentence, maybe someone else can explain what > it > >> means... > >> > >> > >> > >> > >> > >> On 12/5/2010 6:43 AM, Henry Minsky wrote: > >> > >>> > >>> Change hqm-20101205-R9I by [email protected] on 2010-12-05 00:39:47 > EST > >>> in /Users/hqm/openlaszlo/trunk2 > >>> for http://svn.openlaszlo.org/openlaszlo/trunk > >>> > >>> Summary: LzInputTextSprite.gotBlur should not clear selection > >>> > >>> New Features: > >>> > >>> Bugs Fixed: LPP-9562 > >>> > >>> Technical Reviewer: max > >>> QA Reviewer: ffeng > >>> Doc Reviewer: (pending) > >>> > >>> Documentation: > >>> > >>> Release Notes: > >>> > >>> Overview: > >>> > >>> > >>> Details: > >>> > >>> This change makes it so that LzInputTextSprite.gotBlur no longer clears > >>> the selection > >>> > >>> > >>> Tests: > >>> > >>> test case from bug report > >>> > >>> Files: > >>> > >>> M WEB-INF/lps/lfc/kernel/swf/LzInputTextSprite.as > >>> M WEB-INF/lps/lfc/kernel/dhtml/LzInputTextSprite.js > >>> M WEB-INF/lps/lfc/kernel/swf9/LzInputTextSprite.as > >>> > >>> Changeset: > >>> http://svn.openlaszlo.org/openlaszlo/patches/hqm-20101205-R9I.tar > >>> > >>> > >>> > > > > > > -- > > Henry Minsky > > Software Architect > > [email protected] > > -- Henry Minsky Software Architect [email protected]
