X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fxwt%2Fplat%2FAWT.java;h=e186789eb67088c180360684a56597678205f245;hb=1019725cfa88d9ad5dfabaf178e87da79c9c3e17;hp=7f159cf8029d6c3a9fc80be7e368b1d00c562898;hpb=f8d15feced5c799c79a88b865ca1a85967c203ad;p=org.ibex.core.git diff --git a/src/org/xwt/plat/AWT.java b/src/org/xwt/plat/AWT.java index 7f159cf..e186789 100644 --- a/src/org/xwt/plat/AWT.java +++ b/src/org/xwt/plat/AWT.java @@ -1,9 +1,8 @@ -// Copyright 2002 Adam Megacz, see the COPYING file for licensing [GPL] +// Copyright 2003 Adam Megacz, see the COPYING file for licensing [GPL] package org.xwt.plat; import org.xwt.*; import org.xwt.util.*; -import org.mozilla.javascript.*; import java.net.*; import java.io.*; import java.util.*; @@ -11,21 +10,42 @@ import java.awt.*; import java.awt.datatransfer.*; import java.awt.image.*; import java.awt.event.*; -import java.applet.*; /** Platform subclass for all VM's providing AWT 1.1 functionality */ -public class AWT extends Platform { +public class AWT extends JVM { protected String getDescriptiveName() { return "Generic JDK 1.1+ with AWT"; } - protected DoubleBuffer _createDoubleBuffer(int w, int h, Surface owner) { return new AWTDoubleBuffer(w, h); } + protected PixelBuffer _createPixelBuffer(int w, int h, Surface owner) { return new AWTPixelBuffer(w, h); } protected Picture _createPicture(int[] b, int w, int h) { return new AWTPicture(b, w, h); } protected int _getScreenWidth() { return Toolkit.getDefaultToolkit().getScreenSize().width; } protected int _getScreenHeight() { return Toolkit.getDefaultToolkit().getScreenSize().height; } protected Surface _createSurface(Box b, boolean framed) { return new AWTSurface(b, framed); } - protected int _stringWidth(String font, String text) { return getFont(font).metrics.stringWidth(text); } - protected int _getMaxAscent(String font) { return getFont(font).metrics.getMaxAscent(); } - protected int _getMaxDescent(String font) { return getFont(font).metrics.getMaxDescent(); } - protected boolean _supressDirtyOnResize() { return true; } + + protected void postInit() { + System.setProperty("com.apple.mrj.application.live-resize", "true"); + System.setProperty("com.apple.mrj.application.growbox.intrudes", "false"); + if (Log.on) Log.log(Platform.class, " color depth = " + Toolkit.getDefaultToolkit().getColorModel().getPixelSize() + "bpp"); + } + + protected void _criticalAbort(String message) { + if (Log.on) Log.log(this, message); + final Dialog d = new Dialog(new Frame(), "XWT Cannot Continue"); + d.setLayout(new BorderLayout()); + TextArea ta = new TextArea("XWT cannot continue because:\n\n" + message, 10, 80); + ta.setEditable(false); + d.add(ta, "Center"); + Button b = new Button("OK"); + b.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + d.dispose(); + } + }); + d.add(b, "South"); + d.setModal(true); + d.pack(); + d.show(); + new Semaphore().block(); + } protected String _getClipBoard() { Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard(); @@ -44,18 +64,32 @@ public class AWT extends Platform { /** some platforms (cough, cough, NetscapeVM) have totally broken modifier masks; they will need to override this */ protected static int modifiersToButtonNumber(int modifiers) { if ((modifiers & InputEvent.BUTTON1_MASK) == InputEvent.BUTTON1_MASK) return 1; - if ((modifiers & InputEvent.BUTTON2_MASK) == InputEvent.BUTTON2_MASK) return 3; - if ((modifiers & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK) return 2; + if ((modifiers & InputEvent.BUTTON2_MASK) == InputEvent.BUTTON2_MASK) { + // ugh, MacOSX reports the right mouse button as BUTTON2_MASK... + if (System.getProperty("os.name", "").startsWith("Mac OS X")) return 2; + return 3; + } + if ((modifiers & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK) { + // ugh, MacOSX reports the right mouse button as BUTTON2_MASK... + if (System.getProperty("os.name", "").startsWith("Mac OS X")) return 3; + return 2; + } return 0; } static class FileDialogHelper extends FileDialog implements WindowListener, ComponentListener { Semaphore s; public FileDialogHelper(String suggestedFileName, Semaphore s, boolean write) { - super(new Frame(), suggestedFileName, write ? FileDialog.SAVE : FileDialog.LOAD); + super(new Frame(), write ? "Save" : "Open", write ? FileDialog.SAVE : FileDialog.LOAD); this.s = s; addWindowListener(this); addComponentListener(this); + if (suggestedFileName.indexOf(File.separatorChar) == -1) { + setFile(suggestedFileName); + } else { + setDirectory(suggestedFileName.substring(0, suggestedFileName.lastIndexOf(File.separatorChar))); + setFile(suggestedFileName.substring(suggestedFileName.lastIndexOf(File.separatorChar) + 1)); + } show(); } public void windowActivated(WindowEvent e) { } @@ -75,25 +109,25 @@ public class AWT extends Platform { final Semaphore s = new Semaphore(); FileDialogHelper fd = new FileDialogHelper(suggestedFileName, s, write); s.block(); - return fd.getDirectory() + File.separatorChar + fd.getFile(); + return fd.getDirectory() == null ? null : (fd.getDirectory() + File.separatorChar + fd.getFile()); } // Inner Classes ///////////////////////////////////////////////////////////////////////////////////// - protected static class AWTPicture implements Picture { + protected static class AWTPicture extends Picture { public int getHeight() { return i.getHeight(null); } public int getWidth() { return i.getWidth(null); } public int[] getData() { return data; } int[] data = null; public Image i = null; - private static MediaTracker mediatracker = new MediaTracker(new Canvas()); private static ColorModel cmodel = new DirectColorModel(32, 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000); public AWTPicture(int[] b, int w, int h) { data = b; Image img = Toolkit.getDefaultToolkit().createImage(new MemoryImageSource(w, h, cmodel, b, 0, w)); + MediaTracker mediatracker = new MediaTracker(new Canvas()); mediatracker.addImage(img, 1); try { mediatracker.waitForAll(); } catch (InterruptedException e) { } mediatracker.removeImage(img); @@ -101,7 +135,7 @@ public class AWT extends Platform { } } - protected static class AWTDoubleBuffer implements DoubleBuffer { + protected static class AWTPixelBuffer extends PixelBuffer { protected Image i = null; protected Graphics g = null; @@ -109,9 +143,9 @@ public class AWT extends Platform { /** JDK1.1 platforms require that a component be associated with each off-screen buffer */ static Component component = null; - protected AWTDoubleBuffer() { } - public AWTDoubleBuffer(int w, int h) { - synchronized(AWTDoubleBuffer.class) { + protected AWTPixelBuffer() { } + public AWTPixelBuffer(int w, int h) { + synchronized(AWTPixelBuffer.class) { if (component == null) { component = new Frame(); component.setVisible(false); @@ -134,28 +168,38 @@ public class AWT extends Platform { g.drawImage(((AWTPicture)source).i, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, null); } - public void drawString(String font, String text, int x, int y, int argb) { - // FEATURE: use an LRU cache for Color objects - g.setColor(new Color((argb & 0x00FF0000) >> 16, (argb & 0x0000FF00) >> 8, (argb & 0x000000FF))); - g.setFont(getFont(font)); - g.drawString(text, x, y + 2); - } - public void fillRect(int x, int y, int x2, int y2, int argb) { // FEATURE: use an LRU cache for Color objects - g.setColor(new Color((argb & 0x00FF0000) >> 16, (argb & 0x0000FF00) >> 8, (argb & 0x000000FF))); - g.fillRect(x, y, x2 - x, y2 - y); } + // FIXME: try to use os acceleration + public void fillTrapezoid(int x1, int x2, int y1, int x3, int x4, int y2, int argb) { + g.setColor(new Color((argb & 0x00FF0000) >> 16, (argb & 0x0000FF00) >> 8, (argb & 0x000000FF))); + if (x1 == x3 && x2 == x4) { + g.fillRect(x1, y1, x4 - x1, y2 - y1); + } else for(int y=y1; y _x2) { int _x0 = _x1; _x1 = _x2; _x2 = _x0; } + g.fillRect(_x1, _y1, _x2 - _x1, _y2 - _y1); + } + } } - protected static class AWTSurface extends Surface + protected static class AWTSurface extends Surface.DoubleBufferedSurface implements MouseListener, MouseMotionListener, KeyListener, ComponentListener, WindowListener { - public void blit(DoubleBuffer s, int sx, int sy, int dx, int dy, int dx2, int dy2) { + public void blit(PixelBuffer s, int sx, int sy, int dx, int dy, int dx2, int dy2) { if (ourGraphics == null) ourGraphics = window.getGraphics(); - ourGraphics.drawImage(((AWTDoubleBuffer)s).i, dx + insets.left, dy + insets.top, dx2 + insets.left, dy2 + insets.top, + insets = (frame == null ? window : frame).getInsets(); + ourGraphics.drawImage(((AWTPixelBuffer)s).i, + dx + insets.left, + dy + insets.top, + dx2 + insets.left, + dy2 + insets.top, sx, sy, sx + (dx2 - dx), sy + (dy2 - dy), null); } @@ -174,7 +218,7 @@ public class AWT extends Platform { public void toBack() { if (window != null) window.toBack(); } public void toFront() { if (window != null) window.toFront(); } - public void setLocation(int x, int y) { window.setLocation(x, y); } + public void setLocation() { window.setLocation(root.x, root.y); } public void setTitleBarText(String s) { if (frame != null) frame.setTitle(s); } public void setIcon(Picture i) { if (frame != null) frame.setIconImage(((AWTPicture)i).i); } public void setSize(int width, int height) { window.setSize(width + (insets.left + insets.right), height + (insets.top + insets.bottom)); } @@ -196,15 +240,12 @@ public class AWT extends Platform { Rectangle r = gr.getClipBounds(); // ugly hack for Java1.4 dynamicLayout on Win32 -- this catches expansions during smooth resize - int newwidth = Math.max(r.x - insets.left + r.width, width); - int newheight = Math.max(r.y - insets.top + r.height, height); - if (newwidth > width || newheight > height) + int newwidth = Math.max(r.x - insets.left + r.width, root.width); + int newheight = Math.max(r.y - insets.top + r.height, root.height); + if (newwidth > root.width || newheight > root.height) componentResized(window.getWidth() - insets.left - insets.right, window.getHeight() - insets.top - insets.bottom); Dirty(r.x - insets.left, r.y - insets.top, r.width, r.height); - - // this is safe because AWT's low-level drawing functions are threadsafe - blitDirtyScreenRegions(); } } @@ -214,9 +255,6 @@ public class AWT extends Platform { public void paint(Graphics gr) { Rectangle r = gr.getClipBounds(); Dirty(r.x - insets.left, r.y - insets.top, r.width, r.height); - - // this is safe because AWT's low-level drawing functions are threadsafe - blitDirtyScreenRegions(); } } @@ -242,9 +280,10 @@ public class AWT extends Platform { // IMPORTANT: this must be called before render() to ensure // that our peer has been created - window.setVisible(true); - + makeVisible(); } + + protected void makeVisible() { window.setVisible(true); } public void _dispose() { window.removeMouseListener(this); @@ -290,10 +329,10 @@ public class AWT extends Platform { public void windowClosed(WindowEvent e) { } public void windowClosing(WindowEvent e) { Close(); } public void windowIconified(WindowEvent e) { Minimized(true); } - public void windowDeiconified(WindowEvent e) { dirty(0, 0, width, height); Minimized(false); } + public void windowDeiconified(WindowEvent e) { dirty(0, 0, root.width, root.height); Minimized(false); } public void windowActivated(WindowEvent e) { Focused(true); } public void windowDeactivated(WindowEvent e) { Focused(false); } - public void componentMoved(ComponentEvent e) { PosChange(window.getLocation().x, window.getLocation().y); } + public void componentMoved(ComponentEvent e) { PosChange(window.getLocation().x + insets.left, window.getLocation().y + insets.top); } public void componentResized(ComponentEvent e) { // we have to periodically do this; I don't know why @@ -302,8 +341,8 @@ public class AWT extends Platform { } public void componentResized(int newwidth, int newheight) { - int oldwidth = width; - int oldheight = height; + int oldwidth = root.width; + int oldheight = root.height; SizeChange(newwidth, newheight); // we do this because JVMs which don't clear the background won't force repaints of these areas @@ -312,7 +351,7 @@ public class AWT extends Platform { ourGraphics = null; } - + public void keyTyped(KeyEvent k) { } public void keyPressed(KeyEvent k) { KeyPressed(translateKey(k)); } public void keyReleased(KeyEvent k) { KeyReleased(translateKey(k)); } @@ -324,7 +363,7 @@ public class AWT extends Platform { // ugly hack for Java1.4 dynamicLayout on Win32 -- this catches contractions during smooth resize int newwidth = window.getWidth() - insets.left - insets.right; int newheight = window.getHeight() - insets.top - insets.bottom; - if (newwidth != width || newheight != height) componentResized(newwidth, newheight); + if (newwidth != root.width || newheight != root.height) componentResized(newwidth, newheight); Move(m.getX() - insets.left, m.getY() - insets.top); } @@ -353,7 +392,7 @@ public class AWT extends Platform { case KeyEvent.VK_F3: return "f3"; case KeyEvent.VK_F4: return "f4"; case KeyEvent.VK_F5: return "f5"; - case KeyEvent.VK_F6: return "f6"; + case KeyEvent.VK_F6: return "f6"; case KeyEvent.VK_F7: return "f7"; case KeyEvent.VK_F8: return "f8"; case KeyEvent.VK_F9: return "f9"; @@ -369,73 +408,35 @@ public class AWT extends Platform { case KeyEvent.VK_SHIFT: return "shift"; case KeyEvent.VK_TAB: return "tab"; case KeyEvent.VK_UP: return "up"; - - // we special-case letters since (C-a).getKeyChar() != 'a' - case KeyEvent.VK_A: return "a"; - case KeyEvent.VK_B: return "b"; - case KeyEvent.VK_C: return "c"; - case KeyEvent.VK_D: return "d"; - case KeyEvent.VK_E: return "e"; - case KeyEvent.VK_F: return "f"; - case KeyEvent.VK_G: return "g"; - case KeyEvent.VK_H: return "h"; - case KeyEvent.VK_I: return "i"; - case KeyEvent.VK_J: return "j"; - case KeyEvent.VK_K: return "k"; - case KeyEvent.VK_L: return "l"; - case KeyEvent.VK_M: return "m"; - case KeyEvent.VK_N: return "n"; - case KeyEvent.VK_O: return "o"; - case KeyEvent.VK_P: return "p"; - case KeyEvent.VK_Q: return "q"; - case KeyEvent.VK_R: return "r"; - case KeyEvent.VK_S: return "s"; - case KeyEvent.VK_T: return "t"; - case KeyEvent.VK_U: return "u"; - case KeyEvent.VK_V: return "v"; - case KeyEvent.VK_W: return "w"; - case KeyEvent.VK_X: return "x"; - case KeyEvent.VK_Y: return "y"; - case KeyEvent.VK_Z: return "z"; - default: return String.valueOf(k.getKeyChar()); + default: + char c = k.getKeyChar(); + if (c >= 1 && c <= 26) c = (char)('a' + c - 1); + return String.valueOf(c); } } } - // Font Handling Stuff ////////////////////////////////////////////////////////// - - protected String[] _listFonts() { return fontList; } - private static String[] fontList; - static { - String[] awtfonts = Toolkit.getDefaultToolkit().getFontList(); - fontList = new String[awtfonts.length * 4]; - for(int i=0; i