package ssq; import org.eclipse.swt.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; import sun.awt.windows.WEmbeddedFrame; public class AWT_SWT_SingleLoop { private static class EFrame extends WEmbeddedFrame implements Listener { private Composite parent; private String name; EFrame(Composite parent, String name) { super(parent.handle); this.parent = parent; this.name = name; parent.addListener(SWT.Resize, this); parent.addListener(SWT.Move, this); parent.addListener(SWT.Dispose, this); parent.getShell().addListener(SWT.Move, this); setFrameBounds(); setCursor(java.awt.Cursor.getDefaultCursor()); addNotify(); validate(); } public void handleEvent(Event e) { if (e.type == SWT.Dispose) { parent.removeListener(SWT.Resize, this); parent.removeListener(SWT.Move, this); parent.removeListener(SWT.Dispose, this); parent.getShell().removeListener(SWT.Move, this); } else { setFrameBounds(); } } private void setFrameBounds() { org.eclipse.swt.graphics.Rectangle rc = parent.getClientArea(); setBounds(0, 0, rc.width, rc.height); validate(); } public void paint(java.awt.Graphics g) { super.paint(g); sun.awt.windows.WGlobalCursorManager.getCursorManager().updateCursorImmediately(); } } public static class AWTWatchDog extends Thread { Display display; java.awt.EventQueue queue; public AWTWatchDog(Display display, java.awt.EventQueue queue) { setName("AWT-WatchDog"); this.queue = queue; this.display = display; start(); } public void run() { while (true) { try { synchronized (queue) { sun.awt.SunToolkit.flushPendingEvents(); display.asyncExec(new Runnable() { public void run() { flushQueue(queue); } }); queue.wait(); } } catch (Throwable x) { x.printStackTrace(); } } } } static boolean flushQueue(java.awt.EventQueue queue) { if (!java.awt.EventQueue.isDispatchThread()) throw new Error("Must be dispatch thread"); boolean result = false; while (queue.peekEvent() != null) { result = true; try { java.awt.AWTEvent e = queue.getNextEvent(); // dispatchEvent(e); Object src = e.getSource(); if (e instanceof java.awt.ActiveEvent) { ((java.awt.ActiveEvent)e).dispatch(); } else if (src instanceof java.awt.Component) { ((java.awt.Component)src).dispatchEvent(e); } else if (src instanceof java.awt.MenuComponent) { ((java.awt.MenuComponent)src).dispatchEvent(e); } else { throw new Error("Unable to dispatch event: " + e); } } catch (InterruptedException ex) { ex.printStackTrace(); } } return result; } public static void main(String[] args) throws Exception { System.out.println(System.getProperty("java.version")); final java.awt.EventQueue queue = java.awt.Toolkit.getDefaultToolkit().getSystemEventQueue(); java.awt.EventQueue.invokeAndWait(new Runnable() { public void run() { final Display display = new Display(); new AWTWatchDog(display, queue); final Shell shell = new Shell(display); shell.setLayout(new FillLayout()); Menu bar = new Menu(shell, SWT.BAR); shell.setMenuBar(bar); MenuItem item = new MenuItem(bar, SWT.CASCADE); item.setText("File"); Menu menu = new Menu(shell, SWT.DROP_DOWN); item.setMenu(menu); item = new MenuItem(menu, SWT.NONE); item.setText("Open"); item.addListener(SWT.Selection, new Listener() { public void handleEvent(Event e) { System.out.println("menu open selected"); } }); Composite composite1 = new Composite(shell, SWT.BORDER); composite1.setLayout(new GridLayout()); Button swtButton = new Button(composite1, SWT.PUSH); swtButton.setText("SWT Button"); Text text = new Text(composite1, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); text.setLayoutData(new GridData(GridData.FILL_BOTH)); Combo combo = new Combo(composite1, SWT.DROP_DOWN); Composite composite2 = new Composite(shell, SWT.BORDER); java.awt.Frame frame = new EFrame(composite2, "GREAT"); java.awt.Button button = new java.awt.Button("AWT Button"); frame.add(button, java.awt.BorderLayout.NORTH); button.addMouseListener(new java.awt.event.MouseAdapter() { public void mousePressed(java.awt.event.MouseEvent e) { System.out.println("mouse pressed"); } }); // java.awt.TextField field = new java.awt.TextField("Field"); javax.swing.JTextField field = new javax.swing.JTextField("Swing Field"); frame.add(field, java.awt.BorderLayout.SOUTH); java.awt.TextArea area = new java.awt.TextArea("Area"); frame.add(area, java.awt.BorderLayout.CENTER); frame.setVisible(true); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } } }); } }