Showing the changes to java/pkg/awt/iFramePeer.java (1 of 18352 files). Show all
Unified · Split
| @@ -0,0 +1,527 @@ | ||
| 1 | +package inferno.awt; | |
| 2 | + | |
| 3 | +import java.awt.*; | |
| 4 | +import java.awt.event.*; | |
| 5 | +import java.awt.peer.*; | |
| 6 | +import java.awt.image.ImageProducer; | |
| 7 | +import java.awt.image.ImageObserver; | |
| 8 | +import java.awt.image.ColorModel; | |
| 9 | +import java.awt.image.DirectColorModel; | |
| 10 | +import java.util.*; | |
| 11 | +import inferno.awt.iGraphics; | |
| 12 | + | |
| 13 | +public class iFramePeer implements FramePeer, DoubleBufferingPeer { | |
| 14 | + private Object pCanvas; // Set inside create() used by natives | |
| 15 | + | |
| 16 | + // set inside create(), used by natives, to avoid some clutter in | |
| 17 | + // escaping the Limbo type system. | |
| 18 | + private Object thisAsJObject; | |
| 19 | + | |
| 20 | + private Frame target; | |
| 21 | + | |
| 22 | + private int leftInset=0; // How much canvas is inset from frame | |
| 23 | + private int rightInset=0; | |
| 24 | + private int topInset=0; | |
| 25 | + private int bottomInset=0; | |
| 26 | + private int left; // x position of left of frame | |
| 27 | + private int top; // y position of top of frame | |
| 28 | + | |
| 29 | + private Point oldMousePoint; | |
| 30 | + private boolean buttonState[]; | |
| 31 | + | |
| 32 | + private int resizable = 1; | |
| 33 | + | |
| 34 | + public iFramePeer(Frame target) { | |
| 35 | + this.target = target; | |
| 36 | + oldMousePoint=new Point(-1,-1); | |
| 37 | + buttonState=new boolean[3]; | |
| 38 | + for (int i=0;i<3;i++) buttonState[i]=false; //up | |
| 39 | + // create(this); | |
| 40 | + if (target.getTitle() != null) { | |
| 41 | + setTitle(target.getTitle()); | |
| 42 | + } | |
| 43 | + Font f = target.getFont(); | |
| 44 | + if (f == null) { | |
| 45 | + f = new Font("Dialog", Font.PLAIN, 12); | |
| 46 | + target.setFont(f); | |
| 47 | + setFont(f); | |
| 48 | + } | |
| 49 | + Color c = target.getBackground(); | |
| 50 | + if (c == null) { | |
| 51 | + c = SystemColor.window; | |
| 52 | + target.setBackground(c); | |
| 53 | + setBackground(c); | |
| 54 | + } | |
| 55 | + c = target.getForeground(); | |
| 56 | + if (c == null) { | |
| 57 | + target.setForeground(Color.black); | |
| 58 | + setForeground(Color.black); | |
| 59 | + } | |
| 60 | + if (!target.isResizable()) | |
| 61 | + this.resizable = 0; | |
| 62 | + | |
| 63 | + create(this); | |
| 64 | + | |
| 65 | + } | |
| 66 | + | |
| 67 | + /* implementation of java.awt.peer.DoubleBufferingPeer */ | |
| 68 | + public boolean isDoubleBuffered() { | |
| 69 | + return true; | |
| 70 | + } | |
| 71 | + | |
| 72 | + private native Object getRefImage(); // Returns dev/draw image of canvas | |
| 73 | + | |
| 74 | + private native Object getRefOffScreenImage(); // Returns off-screen buffer image | |
| 75 | + | |
| 76 | + private native void pReshape(int x, int y, int width, int height); | |
| 77 | + | |
| 78 | + private native void pHide(); // Hide frame | |
| 79 | + | |
| 80 | + private native void pShow(iFramePeer fp); // Show frame | |
| 81 | + | |
| 82 | + private native int getXYLoc(int coord); // get x or y value of the global position | |
| 83 | + | |
| 84 | + // Create frame putting canvas in pcanvas | |
| 85 | + private native void create(iFramePeer me); | |
| 86 | + | |
| 87 | + public native void pDispose(); // Destroy frame | |
| 88 | + public native void setCursor(int cursorType); // Set cursor | |
| 89 | + public native void setTitle(String title); // Set title of frame | |
| 90 | + public native void toFront(); // Move frame to front | |
| 91 | + public native void toBack(); // Move frame to back | |
| 92 | + | |
| 93 | + | |
| 94 | + /* New 1.1 API */ | |
| 95 | + public Point getLocationOnScreen() // Return position on screen | |
| 96 | + { | |
| 97 | + Point p = new Point(); | |
| 98 | + p.x = getXYLoc(0); | |
| 99 | + p.y = getXYLoc(1); | |
| 100 | + return p; | |
| 101 | + } | |
| 102 | + | |
| 103 | + public void recalculate() | |
| 104 | + { | |
| 105 | + MenuBar mb=target.getMenuBar(); | |
| 106 | + if (mb!=null) | |
| 107 | + { | |
| 108 | + iMenuBarPeer ip=(iMenuBarPeer)mb.getPeer(); | |
| 109 | + | |
| 110 | + if (ip!=null) | |
| 111 | + { | |
| 112 | + ip.recalculate(); | |
| 113 | + } | |
| 114 | + } | |
| 115 | + } | |
| 116 | + | |
| 117 | + public void setCursor(Cursor c) | |
| 118 | + { | |
| 119 | + if (c!=null) | |
| 120 | + setCursor(c.getType()); | |
| 121 | + } | |
| 122 | + | |
| 123 | + public void setResizable(boolean resizable) | |
| 124 | + { | |
| 125 | + System.out.println("java: setResizable() get called" + resizable); | |
| 126 | + if(!resizable) | |
| 127 | + this.resizable = 0; | |
| 128 | + } | |
| 129 | + | |
| 130 | + public void setMenuBar(MenuBar mb) | |
| 131 | + { | |
| 132 | + recalculate(); | |
| 133 | + } | |
| 134 | + | |
| 135 | + public void setIconImage(Image im) | |
| 136 | + { | |
| 137 | + } | |
| 138 | + | |
| 139 | + public Insets getInsets() | |
| 140 | + { | |
| 141 | + Insets i=new Insets(topInset,leftInset,bottomInset,rightInset); | |
| 142 | + | |
| 143 | + MenuBar mb=target.getMenuBar(); | |
| 144 | + | |
| 145 | + if (mb!=null) | |
| 146 | + { | |
| 147 | + iMenuBarPeer peer=(iMenuBarPeer)mb.getPeer(); | |
| 148 | + | |
| 149 | + if (peer!=null) | |
| 150 | + { | |
| 151 | + i=(Insets)i.clone(); //Get new copy | |
| 152 | + | |
| 153 | + i.top+=peer.getHeight(); | |
| 154 | + } | |
| 155 | + | |
| 156 | + } | |
| 157 | + | |
| 158 | + return i; | |
| 159 | + } | |
| 160 | + | |
| 161 | + public Insets insets() | |
| 162 | + { | |
| 163 | + return getInsets(); | |
| 164 | + } | |
| 165 | + | |
| 166 | + public void endValidate() | |
| 167 | + { | |
| 168 | + | |
| 169 | + } | |
| 170 | + | |
| 171 | + public void beginValidate() | |
| 172 | + { | |
| 173 | + | |
| 174 | + } | |
| 175 | + | |
| 176 | + public void setBounds(int x, int y, int width, int height) { | |
| 177 | + pReshape(x, y, width, height); | |
| 178 | + } | |
| 179 | + | |
| 180 | + public void reshape(int x, int y, int width, int height) { | |
| 181 | + pReshape(x, y, width, height); | |
| 182 | + } | |
| 183 | + | |
| 184 | + | |
| 185 | + public void dispose() | |
| 186 | + { | |
| 187 | + pDispose(); | |
| 188 | + pCanvas=null; | |
| 189 | + } | |
| 190 | + | |
| 191 | + public void disable() | |
| 192 | + { | |
| 193 | + setEnabled(false); | |
| 194 | + } | |
| 195 | + | |
| 196 | + public void enable() | |
| 197 | + { | |
| 198 | + setEnabled(false); | |
| 199 | + } | |
| 200 | + | |
| 201 | + public void setEnabled(boolean b) | |
| 202 | + { | |
| 203 | + | |
| 204 | + } | |
| 205 | + | |
| 206 | + public void hide() | |
| 207 | + { | |
| 208 | + setVisible(false); | |
| 209 | + } | |
| 210 | + | |
| 211 | + public void show() | |
| 212 | + { | |
| 213 | + setVisible(true); | |
| 214 | + } | |
| 215 | + | |
| 216 | + public void setVisible(boolean b) | |
| 217 | + { | |
| 218 | + if (b) | |
| 219 | + pShow(this); | |
| 220 | + else | |
| 221 | + pHide(); | |
| 222 | + } | |
| 223 | + | |
| 224 | + public Dimension getMinimumSize() { | |
| 225 | + return target.getSize(); | |
| 226 | + } | |
| 227 | + | |
| 228 | + public Dimension getPreferredSize() { | |
| 229 | + return getMinimumSize(); | |
| 230 | + } | |
| 231 | + | |
| 232 | + public Dimension minimumSize() { | |
| 233 | + return getMinimumSize(); | |
| 234 | + } | |
| 235 | + | |
| 236 | + public Dimension preferredSize() { | |
| 237 | + return getPreferredSize(); | |
| 238 | + } | |
| 239 | + | |
| 240 | + | |
| 241 | + public int checkImage(Image img, int w, int h, ImageObserver o) { | |
| 242 | + return 0; | |
| 243 | + } | |
| 244 | + | |
| 245 | + public FontMetrics getFontMetrics(Font font) { | |
| 246 | + return iFontMetrics.getFontMetrics(font); | |
| 247 | + } | |
| 248 | + | |
| 249 | + public boolean prepareImage(Image img, int w, int h, ImageObserver o) { | |
| 250 | + return false; | |
| 251 | + } | |
| 252 | + | |
| 253 | + | |
| 254 | + public Image createImage(ImageProducer producer) { | |
| 255 | + return null/*new Win32Image(producer)*/; | |
| 256 | + } | |
| 257 | + public Image createImage(int width, int height) { | |
| 258 | + return null/*new Win32Image(target, width, height)*/; | |
| 259 | + } | |
| 260 | + | |
| 261 | + public boolean isFocusTraversable() { | |
| 262 | + return false; | |
| 263 | + } | |
| 264 | + | |
| 265 | + public void requestFocus() | |
| 266 | + { | |
| 267 | + } | |
| 268 | + | |
| 269 | + public void nextFocus() | |
| 270 | + { | |
| 271 | + } | |
| 272 | + | |
| 273 | + public void setFont(Font f) | |
| 274 | + { | |
| 275 | + | |
| 276 | + } | |
| 277 | + | |
| 278 | + public Font getFont() | |
| 279 | + { | |
| 280 | + return null; | |
| 281 | + } | |
| 282 | + | |
| 283 | + public void setBackground(Color c) | |
| 284 | + { | |
| 285 | + | |
| 286 | + } | |
| 287 | + | |
| 288 | + public void setForeground(Color c) | |
| 289 | + { | |
| 290 | + | |
| 291 | + } | |
| 292 | + | |
| 293 | + public Graphics getGraphics() | |
| 294 | + { | |
| 295 | + if (pCanvas==null) { | |
| 296 | + System.out.println("iFramePeer.getGraphics(): pCanvas == null!"); // jfs - remove | |
| 297 | + return null; | |
| 298 | + } | |
| 299 | + Rectangle bounds = target.getBounds(); | |
| 300 | + Rectangle clip = new Rectangle(bounds.x+leftInset, | |
| 301 | + bounds.y+topInset, | |
| 302 | + bounds.width-leftInset-rightInset, | |
| 303 | + bounds.height-topInset-bottomInset); | |
| 304 | + Graphics g=new iGraphics(getRefImage(),getRefOffScreenImage(), clip, target); | |
| 305 | + g.translate(bounds.x,bounds.y); // bounds have already been set - lg | |
| 306 | + return g; | |
| 307 | + } | |
| 308 | + | |
| 309 | + public java.awt.Toolkit getToolkit() { | |
| 310 | + return Toolkit.getDefaultToolkit(); | |
| 311 | + } | |
| 312 | + | |
| 313 | + public ColorModel getColorModel() { | |
| 314 | + return iToolkit.getStaticColorModel(); | |
| 315 | + } | |
| 316 | + | |
| 317 | + public void handleEvent(AWTEvent e) | |
| 318 | + { | |
| 319 | + | |
| 320 | + } | |
| 321 | + | |
| 322 | + public void print(Graphics g) | |
| 323 | + { | |
| 324 | + } | |
| 325 | + | |
| 326 | + public void paint(Graphics g) | |
| 327 | + { | |
| 328 | + g.setColor(target.getForeground()); | |
| 329 | + g.setFont(target.getFont()); | |
| 330 | + MenuBar mb=target.getMenuBar(); | |
| 331 | + if (mb!=null) | |
| 332 | + { | |
| 333 | + iMenuBarPeer ip=(iMenuBarPeer)mb.getPeer(); | |
| 334 | + | |
| 335 | + if (ip!=null) | |
| 336 | + { | |
| 337 | + ip.paint(g); | |
| 338 | + } | |
| 339 | + } | |
| 340 | + target.paint(g); | |
| 341 | + } | |
| 342 | + | |
| 343 | + | |
| 344 | + public void repaint(long tm, int x, int y, int width, int height) { | |
| 345 | + | |
| 346 | + iToolkit.postEvent(new PaintEvent((Component)target, PaintEvent.UPDATE, | |
| 347 | + new Rectangle(x, y, width, height))); | |
| 348 | + | |
| 349 | + } | |
| 350 | + | |
| 351 | + private void handleKeyEvents(int ch) | |
| 352 | + { | |
| 353 | + char keyChar = (char)ch; | |
| 354 | + boolean control = ch >= 0 && ch <= 31; | |
| 355 | + boolean lowercase = ch >= (int)'a' && ch <= (int)'z'; | |
| 356 | + boolean uppercase = ch >= (int)'A' && ch <= (int)'Z'; | |
| 357 | + int modifiers = control?InputEvent.CTRL_MASK: | |
| 358 | + uppercase?InputEvent.SHIFT_MASK:0; | |
| 359 | + int keyCode = control?ch+64:lowercase?ch-32:ch; | |
| 360 | + | |
| 361 | + // constructing a Date is slow, System.currentTimeMillis(), | |
| 362 | + // is faster, but it's implementation opens #c/time and | |
| 363 | + // converts a string to a big. Fastest still and probably | |
| 364 | + // with sufficient resolution would be natively time stamping | |
| 365 | + // events with sys->millisec(). -jfs | |
| 366 | + //// Date d = new Date(); | |
| 367 | + //// long when = d.getTime(); | |
| 368 | + long when = System.currentTimeMillis(); | |
| 369 | + | |
| 370 | + | |
| 371 | + iToolkit.postEvent(new KeyEvent(target,KeyEvent.KEY_PRESSED, | |
| 372 | + when,modifiers,keyCode,keyChar)); | |
| 373 | + | |
| 374 | + // synthesize events that we don't get from /dev/keyboard via | |
| 375 | + // Inferno's Tk (this is some fast typist!) | |
| 376 | + /* | |
| 377 | + iToolkit.postEvent(new KeyEvent(target,KeyEvent.KEY_TYPED, | |
| 378 | + when+1,modifiers,keyCode,keyChar)); | |
| 379 | + iToolkit.postEvent(new KeyEvent(target,KeyEvent.KEY_RELEASED, | |
| 380 | + when+2,modifiers,keyCode,keyChar)); | |
| 381 | + */ | |
| 382 | + } | |
| 383 | + | |
| 384 | + private void handleMouseEvents(int m,int button,int x,int y) | |
| 385 | + { | |
| 386 | + char mode=(char)m; | |
| 387 | + // System.out.println("Mouse event "+mode+" "+button+" "+x+" "+y); | |
| 388 | + switch(mode) | |
| 389 | + { | |
| 390 | +case 'd': | |
| 391 | +case 'r': | |
| 392 | +case 'm': | |
| 393 | +case 'p': | |
| 394 | + Rectangle bounds = target.getBounds(); | |
| 395 | + int xx=x-bounds.x-leftInset; | |
| 396 | + int yy=y-bounds.y; // -topInset; | |
| 397 | + | |
| 398 | + Point mousePoint=new Point(xx,yy); | |
| 399 | + long when = System.currentTimeMillis(); | |
| 400 | + int modifier; | |
| 401 | + | |
| 402 | + switch(button) | |
| 403 | + { | |
| 404 | +case 1: | |
| 405 | + modifier=InputEvent.BUTTON1_MASK; | |
| 406 | + break; | |
| 407 | + | |
| 408 | +case 2: | |
| 409 | + modifier=InputEvent.BUTTON2_MASK; | |
| 410 | + break; | |
| 411 | + | |
| 412 | +case 3: | |
| 413 | + modifier=InputEvent.BUTTON3_MASK; | |
| 414 | + break; | |
| 415 | + | |
| 416 | +default: | |
| 417 | + modifier=0; | |
| 418 | + } | |
| 419 | + | |
| 420 | + switch(mode) | |
| 421 | + { | |
| 422 | +case 'p': // Pressed | |
| 423 | +case 'd': // Double click | |
| 424 | + { | |
| 425 | + if (button>0 && button<=3 && buttonState[button-1]==false) | |
| 426 | + { | |
| 427 | + oldMousePoint=mousePoint; | |
| 428 | + buttonState[button-1]=true; | |
| 429 | + iToolkit.postEvent(new MouseEvent(target,MouseEvent.MOUSE_PRESSED, | |
| 430 | + when,modifier,xx,yy,1,false)); | |
| 431 | + | |
| 432 | + } | |
| 433 | + break; | |
| 434 | + } | |
| 435 | +case 'r': // Released | |
| 436 | + { | |
| 437 | + if (button>0 && button<=3 && buttonState[button-1]==true) | |
| 438 | + { | |
| 439 | + buttonState[button-1]=false; | |
| 440 | + iToolkit.postEvent(new MouseEvent(target,MouseEvent.MOUSE_RELEASED, | |
| 441 | + when,modifier,xx,yy,1,false)); | |
| 442 | + if (mousePoint.equals(oldMousePoint)) | |
| 443 | + { | |
| 444 | + iToolkit.postEvent(new MouseEvent(target,MouseEvent.MOUSE_CLICKED, | |
| 445 | + when,modifier,xx,yy,1,button==2)); | |
| 446 | + } | |
| 447 | + } | |
| 448 | + break; | |
| 449 | + } | |
| 450 | +case 'm': // Moved | |
| 451 | + { | |
| 452 | + modifier=0; | |
| 453 | + if (buttonState[0]) modifier|=InputEvent.BUTTON1_MASK; | |
| 454 | + if (buttonState[1]) modifier|=InputEvent.BUTTON2_MASK; | |
| 455 | + if (buttonState[2]) modifier|=InputEvent.BUTTON3_MASK; | |
| 456 | + iToolkit.postEvent(new MouseEvent(target, | |
| 457 | + modifier==0?MouseEvent.MOUSE_MOVED:MouseEvent.MOUSE_DRAGGED, | |
| 458 | + when,modifier,xx,yy,1,false)); | |
| 459 | + | |
| 460 | + break; | |
| 461 | + } | |
| 462 | +default: | |
| 463 | + // System.out.println("focusEvent:" + mouseString); | |
| 464 | + } | |
| 465 | + break; | |
| 466 | + } | |
| 467 | + | |
| 468 | + // System.out.println("mouseString "+mouseString); | |
| 469 | + } | |
| 470 | + | |
| 471 | + private void moveSize(int x, int y, int width, int height) | |
| 472 | + { | |
| 473 | + Rectangle old = target.getBounds(); | |
| 474 | + Rectangle n = new Rectangle(x, y, width, height); | |
| 475 | + if (!n.equals(old)){ | |
| 476 | + target.setBounds(x, y, width, height); | |
| 477 | + target.validate(); | |
| 478 | + target.repaint(); | |
| 479 | + } | |
| 480 | + } | |
| 481 | + | |
| 482 | + private void paintTarget(int x, int y, int width, int height) | |
| 483 | + { | |
| 484 | + target.setBounds(x, y, width, height); | |
| 485 | + target.validate(); | |
| 486 | + target.repaint(); | |
| 487 | + } | |
| 488 | + | |
| 489 | + // | |
| 490 | + // Callbacks from native for Window Events | |
| 491 | + // | |
| 492 | + private void handleActivated() { | |
| 493 | + iToolkit.postEvent(new WindowEvent(target, | |
| 494 | + WindowEvent.WINDOW_ACTIVATED)); | |
| 495 | + iToolkit.postEvent(new FocusEvent(target, | |
| 496 | + FocusEvent.FOCUS_GAINED, false)); | |
| 497 | + } | |
| 498 | + private void handleDeactivated() { | |
| 499 | + iToolkit.postEvent(new WindowEvent(target, | |
| 500 | + WindowEvent.WINDOW_DEACTIVATED)); | |
| 501 | + iToolkit.postEvent(new FocusEvent(target, | |
| 502 | + FocusEvent.FOCUS_LOST, true)); | |
| 503 | + } | |
| 504 | + private void handleClosing() { | |
| 505 | + //System.out.println("iFramePeer.handleClosing():"); | |
| 506 | + // Java Frame can then call System.exit() to shutdown the VM | |
| 507 | + // if it so desires | |
| 508 | + iToolkit.postEvent(new WindowEvent(target, | |
| 509 | + WindowEvent.WINDOW_CLOSING)); | |
| 510 | + } | |
| 511 | + private void handleIconified() { | |
| 512 | + //System.out.println("iFramePeer.handleIconified():"); | |
| 513 | + iToolkit.postEvent(new WindowEvent(target, | |
| 514 | + WindowEvent.WINDOW_ICONIFIED)); | |
| 515 | + | |
| 516 | + } | |
| 517 | + private void handleDeIconified() { | |
| 518 | + // System.out.println("iFramePeer.handleDeiconified():"); | |
| 519 | + iToolkit.postEvent(new WindowEvent(target, | |
| 520 | + WindowEvent.WINDOW_DEICONIFIED)); | |
| 521 | + | |
| 522 | + // may need to make Cursors visible as well??? - jfs | |
| 523 | + // target.repaint(); | |
| 524 | + } | |
| 525 | +} | |
| 526 | + | |
| 527 | + | |