[8] Review request for CR 8006406: lightweight embedding in other Java UI toolkits (original) (raw)

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/viewbug.do?bugid=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