diff options
Diffstat (limited to 'src/newt/classes/com/sun')
-rwxr-xr-x | src/newt/classes/com/sun/javafx/newt/Window.java | 59 | ||||
-rw-r--r-- | src/newt/classes/com/sun/javafx/newt/awt/AWTWindow.java | 82 |
2 files changed, 107 insertions, 34 deletions
diff --git a/src/newt/classes/com/sun/javafx/newt/Window.java b/src/newt/classes/com/sun/javafx/newt/Window.java index 49cd49a4d..2b82cb887 100755 --- a/src/newt/classes/com/sun/javafx/newt/Window.java +++ b/src/newt/classes/com/sun/javafx/newt/Window.java @@ -40,6 +40,7 @@ import com.sun.nativewindow.impl.NWReflection; import java.util.ArrayList; import java.util.Iterator; +import java.lang.reflect.Method; public abstract class Window implements NativeWindow { @@ -102,7 +103,15 @@ public abstract class Window implements NativeWindow protected static Window create(String type, Object[] cstrArguments, Screen screen, Capabilities caps, boolean undecorated) { try { Class windowClass = getWindowClass(type); - Window window = (Window) NWReflection.createInstance( windowClass, cstrArguments ) ; + Class[] cstrArgumentTypes = getCustomConstructorArgumentTypes(windowClass); + if(null==cstrArgumentTypes) { + throw new NativeWindowException("WindowClass "+windowClass+" doesn't support custom arguments in constructor"); + } + int argsChecked = verifyConstructorArgumentTypes(cstrArgumentTypes, cstrArguments); + if ( argsChecked < cstrArguments.length ) { + throw new NativeWindowException("WindowClass "+windowClass+" constructor mismatch at argument #"+argsChecked+"; Constructor: "+getTypeStrList(cstrArgumentTypes)+", arguments: "+getArgsStrList(cstrArguments)); + } + Window window = (Window) NWReflection.createInstance( windowClass, cstrArgumentTypes, cstrArguments ) ; window.invalidate(); window.screen = screen; window.setUndecorated(undecorated); @@ -744,4 +753,52 @@ public abstract class Window implements NativeWindow l.exposed(e); } } + + // + // Reflection helper .. + // + + private static Class[] getCustomConstructorArgumentTypes(Class windowClass) { + Class[] argTypes = null; + try { + Method m = windowClass.getDeclaredMethod("getCustomConstructorArgumentTypes", new Class[] {}); + argTypes = (Class[]) m.invoke(null, null); + } catch (Throwable t) {} + return argTypes; + } + + private static int verifyConstructorArgumentTypes(Class[] types, Object[] args) { + if(types.length != args.length) { + return -1; + } + for(int i=0; i<args.length; i++) { + if(!types[i].isInstance(args[i])) { + return i; + } + } + return args.length; + } + + private static String getArgsStrList(Object[] args) { + StringBuffer sb = new StringBuffer(); + for(int i=0; i<args.length; i++) { + sb.append(args[i].getClass()); + if(i<args.length) { + sb.append(", "); + } + } + return sb.toString(); + } + + private static String getTypeStrList(Class[] types) { + StringBuffer sb = new StringBuffer(); + for(int i=0; i<types.length; i++) { + sb.append(types[i]); + if(i<types.length) { + sb.append(", "); + } + } + return sb.toString(); + } + } diff --git a/src/newt/classes/com/sun/javafx/newt/awt/AWTWindow.java b/src/newt/classes/com/sun/javafx/newt/awt/AWTWindow.java index ab50c30f8..953a3e57f 100644 --- a/src/newt/classes/com/sun/javafx/newt/awt/AWTWindow.java +++ b/src/newt/classes/com/sun/javafx/newt/awt/AWTWindow.java @@ -35,6 +35,7 @@ package com.sun.javafx.newt.awt; import java.awt.BorderLayout; import java.awt.Canvas; +import java.awt.Container; import java.awt.DisplayMode; import java.awt.EventQueue; import java.awt.Frame; @@ -61,14 +62,22 @@ public class AWTWindow extends Window { this(null); } - public AWTWindow(Frame frame) { + public static Class[] getCustomConstructorArgumentTypes() { + return new Class[] { Container.class } ; + } + + public AWTWindow(Container container) { super(); title = "AWT NewtWindow"; - this.frame = frame; + this.container = container; + if(container instanceof Frame) { + frame = (Frame) container; + } } private boolean owningFrame; - private Frame frame = null; + private Container container = null; + private Frame frame = null; // same instance as container, just for impl. convenience private AWTCanvas canvas; // non fullscreen dimensions .. private int nfs_width, nfs_height, nfs_x, nfs_y; @@ -94,26 +103,31 @@ public class AWTWindow extends Window { runOnEDT(true, new Runnable() { public void run() { - if(null==frame) { + if(null==container) { frame = new Frame(); + container = frame; owningFrame=true; } else { owningFrame=false; } - frame.setTitle(getTitle()); - frame.setLayout(new BorderLayout()); + if(null!=frame) { + frame.setTitle(getTitle()); + } + container.setLayout(new BorderLayout()); canvas = new AWTCanvas(caps); Listener listener = new Listener(awtWindow); canvas.addMouseListener(listener); canvas.addMouseMotionListener(listener); canvas.addKeyListener(listener); canvas.addComponentListener(listener); - frame.add(canvas, BorderLayout.CENTER); - frame.setSize(width, height); - frame.setLocation(x, y); - frame.setUndecorated(undecorated||fullscreen); - frame.addComponentListener(new MoveListener(awtWindow)); - frame.addWindowListener(new WindowEventListener(awtWindow)); + container.add(canvas, BorderLayout.CENTER); + container.setSize(width, height); + container.setLocation(x, y); + container.addComponentListener(new MoveListener(awtWindow)); + if(null!=frame) { + frame.setUndecorated(undecorated||fullscreen); + frame.addWindowListener(new WindowEventListener(awtWindow)); + } } }); } @@ -121,7 +135,7 @@ public class AWTWindow extends Window { protected void closeNative() { runOnEDT(true, new Runnable() { public void run() { - if(owningFrame) { + if(owningFrame && null!=frame) { frame.dispose(); owningFrame=false; } @@ -145,7 +159,7 @@ public class AWTWindow extends Window { public void setVisible(final boolean visible) { runOnEDT(true, new Runnable() { public void run() { - frame.setVisible(visible); + container.setVisible(visible); } }); @@ -179,9 +193,9 @@ public class AWTWindow extends Window { /** An AWT event on setSize() would bring us in a deadlock situation, hence invokeLater() */ runOnEDT(false, new Runnable() { public void run() { - Insets insets = frame.getInsets(); - frame.setSize(width + insets.left + insets.right, - height + insets.top + insets.bottom); + Insets insets = container.getInsets(); + container.setSize(width + insets.left + insets.right, + height + insets.top + insets.bottom); } }); } @@ -190,11 +204,11 @@ public class AWTWindow extends Window { final int insets[] = new int[] { 0, 0, 0, 0 }; runOnEDT(true, new Runnable() { public void run() { - Insets frameInsets = frame.getInsets(); - insets[0] = frameInsets.top; - insets[1] = frameInsets.left; - insets[2] = frameInsets.bottom; - insets[3] = frameInsets.right; + Insets contInsets = container.getInsets(); + insets[0] = contInsets.top; + insets[1] = contInsets.left; + insets[2] = contInsets.bottom; + insets[3] = contInsets.right; } }); return new com.sun.javafx.newt. @@ -210,7 +224,7 @@ public class AWTWindow extends Window { } runOnEDT(true, new Runnable() { public void run() { - frame.setLocation(x, y); + container.setLocation(x, y); } }); } @@ -235,15 +249,17 @@ public class AWTWindow extends Window { /** An AWT event on setSize() would bring us in a deadlock situation, hence invokeLater() */ runOnEDT(false, new Runnable() { public void run() { - if(!frame.isDisplayable()) { - frame.setUndecorated(undecorated||fullscreen); - } else { - if(DEBUG_IMPLEMENTATION || DEBUG_WINDOW_EVENT) { - System.err.println("AWTWindow can't undecorate already created frame"); + if(null!=frame) { + if(!container.isDisplayable()) { + frame.setUndecorated(undecorated||fullscreen); + } else { + if(DEBUG_IMPLEMENTATION || DEBUG_WINDOW_EVENT) { + System.err.println("AWTWindow can't undecorate already created frame"); + } } } - frame.setLocation(x, y); - frame.setSize(w, h); + container.setLocation(x, y); + container.setSize(w, h); } }); } @@ -300,9 +316,9 @@ public class AWTWindow extends Window { } public void componentMoved(ComponentEvent e) { - if(null!=frame) { - x = frame.getX(); - y = frame.getY(); + if(null!=container) { + x = container.getX(); + y = container.getY(); } display.enqueueEvent(window, com.sun.javafx.newt.WindowEvent.EVENT_WINDOW_MOVED, null); } |