<AWT Dev> [8] Review request for CR 8006406: lightweight embedding in other Java UI toolkits

Anton V. Tarasov anton.tarasov at oracle.com
Mon Feb 11 00:39:46 PST 2013


Hi Anthony,

JLightweightFrame overrides focusGrab/focusUngrab and forwards the calls 
to the client app. Ideally, when the grab API is public, it should be 
called directly via Window.focusGrab/focusUngrab. Currently it is called 
via SunToolkit.grab/ungrab (by swing popups). So, normal call chain 
should look like:

popups -> (JLightweightFrame)Window.grabFocus -> WindowPeer.grabFocus

Temporarily it's as follows:

popups -> SunToolkit.grab -> (JLightweightFrame)Window.grabFocus -> 
WindowPeer.grabFocus

If I called it directly it would be:

popups -> SunToolkit.grab -> WindowPeer.grabFocus -> 
(JLightweightFrame)Window.grabFocus -> WindowPeer.grabFocus -> ...

So, this is quite the reverse direction.

Thanks,
Anton.

On 2/8/13 7:23 PM, Anthony Petrov wrote:
> Hi Anton,
>
> src/windows/classes/sun/awt/windows/WToolkit.java
>>  987     public void grab(Window w) {
>>  991         if (w instanceof LightweightFrame) {
>>  992             ((LightweightFrame)w).grabFocus();
>>  993             return;
>>  994         }         995         if (w.getPeer() != null) {
>>  996             ((WWindowPeer)w.getPeer()).grab();
>>  997         }
>>  998     }
>
> You've already added grab/ungrabFocus() to the WindowPeer interface. 
> Why not use them here directly instead of these instanceof checks? 
> Applies to other toolkits as well.
>
> The fix looks good otherwise.
>
> -- 
> best regards,
> Anthony
>
> On 2/8/2013 21:27, Anton V. Tarasov wrote:
>> Hi All,
>>
>> Please, review the changes for the CR: 
>> http://bugs.sun.com/view_bug.do?bug_id=8006406
>>
>> webrev: http://cr.openjdk.java.net/~ant/8006406/webrev.6
>>
>> It introduces sun.swing.JLightweightFrame class, aimed at lightweight 
>> embedding of Swing components into java-based toolkits.
>> The primary target is JavaFX toolkit, however the class is not 
>> limited to this usage and the API it provides is quite generic.
>>
>> Below I'm giving a link to the jfx side implementation. This 
>> implementation should not be reviewed in this thread (it is in a 
>> pre-review phase),
>> it should just clarify how the introduced API is supposed to be used. 
>> Namely, SwingNode.SwingNodeContent which implements
>> sun.swing.LightweightContent and forwards requests from 
>> sun.swing.JLightweightFrame to NGExternalNode which does the rendering.
>>
>> webrev: http://cr.openjdk.java.net/~ant/RT-27887/webrev.1
>>
>> Some comments on the awt/swing part:
>>
>> - Only Win and Mac implementation is currently available, X11 will 
>> come lately.
>>
>> - Win implementation uses a heavyweight window behind the lightweight 
>> frame, while it is not actually needed for lightweight embedding.
>>    This is due to the architecture of the Win AWT peers which are 
>> strongly tight to the native code, and it's not a trivial task to 
>> separate them.
>>    On Mac the lightweight frame peer is truly lightweight, meaning 
>> that it doesn't create an NSWindow object behind it. The Mac port LW 
>> abstraction
>>    allows to override and substitute CPlatform* classes with their 
>> lightweight stubs.
>>
>> - LightweightFrame, among others, introduces two new methods - 
>> grabFocus() and ungrabFocus(boolean). Ideally, these methods should 
>> go to
>>    the super Window class where the grab API becomes public (which is 
>> a long-term project...). Current host of the grab API is SunToolkit, 
>> which
>>    now forwards the calls to LightweightFrame. This is necessary to 
>> intercommunicate with the client when grab/ungrab happens on both sides.
>>
>> - Unresolved issues exist, like modal dialogs, d&d etc. They are to 
>> be addressed further.
>>
>> Thanks,
>> Anton.
>>




More information about the awt-dev mailing list