1 /******************************************************************************** 2 * * 3 * W i n d o w O b j e c t * 4 * * 5 ********************************************************************************* 6 * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * 7 ********************************************************************************* 8 * This library is free software; you can redistribute it and/or * 9 * modify it under the terms of the GNU Lesser General Public * 10 * License as published by the Free Software Foundation; either * 11 * version 2.1 of the License, or (at your option) any later version. * 12 * * 13 * This library is distributed in the hope that it will be useful, * 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * 16 * Lesser General Public License for more details. * 17 * * 18 * You should have received a copy of the GNU Lesser General Public * 19 * License along with this library; if not, write to the Free Software * 20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * 21 ********************************************************************************* 22 * $Id: FXWindow.h,v 1.149 2006/01/22 17:58:12 fox Exp $ * 23 ********************************************************************************/ 24 #ifndef FXWINDOW_H 25 #define FXWINDOW_H 26 27 #ifndef FXDRAWABLE_H 28 #include "FXDrawable.h" 29 #endif 30 31 32 namespace FX { 33 34 35 /// Layout hints for child widgets 36 enum { 37 LAYOUT_NORMAL = 0, /// Default layout mode 38 LAYOUT_SIDE_TOP = 0, /// Pack on top side (default) 39 LAYOUT_SIDE_BOTTOM = 0x00000001, /// Pack on bottom side 40 LAYOUT_SIDE_LEFT = 0x00000002, /// Pack on left side 41 LAYOUT_SIDE_RIGHT = LAYOUT_SIDE_LEFT|LAYOUT_SIDE_BOTTOM, /// Pack on right side 42 LAYOUT_FILL_COLUMN = 0x00000001, /// Matrix column is stretchable 43 LAYOUT_FILL_ROW = 0x00000002, /// Matrix row is stretchable 44 LAYOUT_LEFT = 0, /// Stick on left (default) 45 LAYOUT_RIGHT = 0x00000004, /// Stick on right 46 LAYOUT_CENTER_X = 0x00000008, /// Center horizontally 47 LAYOUT_FIX_X = LAYOUT_RIGHT|LAYOUT_CENTER_X, /// X fixed 48 LAYOUT_TOP = 0, /// Stick on top (default) 49 LAYOUT_BOTTOM = 0x00000010, /// Stick on bottom 50 LAYOUT_CENTER_Y = 0x00000020, /// Center vertically 51 LAYOUT_FIX_Y = LAYOUT_BOTTOM|LAYOUT_CENTER_Y, /// Y fixed 52 LAYOUT_DOCK_SAME = 0, /// Dock on same galley if it fits 53 LAYOUT_DOCK_NEXT = 0x00000040, /// Dock on next galley 54 LAYOUT_RESERVED_1 = 0x00000080, 55 LAYOUT_FIX_WIDTH = 0x00000100, /// Width fixed 56 LAYOUT_FIX_HEIGHT = 0x00000200, /// height fixed 57 LAYOUT_MIN_WIDTH = 0, /// Minimum width is the default 58 LAYOUT_MIN_HEIGHT = 0, /// Minimum height is the default 59 LAYOUT_FILL_X = 0x00000400, /// Stretch or shrink horizontally 60 LAYOUT_FILL_Y = 0x00000800, /// Stretch or shrink vertically 61 LAYOUT_FILL = LAYOUT_FILL_X|LAYOUT_FILL_Y, /// Stretch or shrink in both directions 62 LAYOUT_EXPLICIT = LAYOUT_FIX_X|LAYOUT_FIX_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT /// Explicit placement 63 }; 64 65 66 /// Frame border appearance styles (for subclasses) 67 enum { 68 FRAME_NONE = 0, /// Default is no frame 69 FRAME_SUNKEN = 0x00001000, /// Sunken border 70 FRAME_RAISED = 0x00002000, /// Raised border 71 FRAME_THICK = 0x00004000, /// Thick border 72 FRAME_GROOVE = FRAME_THICK, /// A groove or etched-in border 73 FRAME_RIDGE = FRAME_THICK|FRAME_RAISED|FRAME_SUNKEN, /// A ridge or embossed border 74 FRAME_LINE = FRAME_RAISED|FRAME_SUNKEN, /// Simple line border 75 FRAME_NORMAL = FRAME_SUNKEN|FRAME_THICK /// Regular raised/thick border 76 }; 77 78 79 /// Packing style (for packers) 80 enum { 81 PACK_NORMAL = 0, /// Default is each its own size 82 PACK_UNIFORM_HEIGHT = 0x00008000, /// Uniform height 83 PACK_UNIFORM_WIDTH = 0x00010000 /// Uniform width 84 }; 85 86 87 class FXIcon; 88 class FXBitmap; 89 class FXCursor; 90 class FXRegion; 91 class FXComposite; 92 class FXAccelTable; 93 class FXComposeContext; 94 95 96 /// Base class for all windows 97 class FXAPI FXWindow : public FXDrawable { 98 FXDECLARE(FXWindow) 99 friend class FXApp; 100 private: 101 FXWindow *parent; // Parent Window 102 FXWindow *owner; // Owner Window 103 FXWindow *first; // First Child 104 FXWindow *last; // Last Child 105 FXWindow *next; // Next Sibling 106 FXWindow *prev; // Previous Sibling 107 FXWindow *focus; // Focus Child 108 FXuint wk; // Window Key 109 protected: 110 FXComposeContext *composeContext; // Compose context 111 FXCursor *defaultCursor; // Normal Cursor 112 FXCursor *dragCursor; // Cursor during drag 113 FXAccelTable *accelTable; // Accelerator table 114 FXObject *target; // Target object 115 FXSelector message; // Message ID 116 FXint xpos; // Window X Position 117 FXint ypos; // Window Y Position 118 FXColor backColor; // Window background color 119 FXString tag; // Help tag 120 FXuint flags; // Window state flags 121 FXuint options; // Window options 122 public: 123 static FXDragType octetType; // Raw octet stream 124 static FXDragType deleteType; // Delete request 125 static FXDragType textType; // Ascii text request 126 static FXDragType utf8Type; // UTF-8 text request 127 static FXDragType utf16Type; // UTF-16 text request 128 static FXDragType colorType; // Color 129 static FXDragType urilistType; // URI List 130 static const FXDragType stringType; // Clipboard text type (pre-registered) 131 static const FXDragType imageType; // Clipboard image type (pre-registered) 132 protected: 133 FXWindow(); 134 FXWindow(FXApp* a,FXVisual *vis); 135 FXWindow(FXApp* a,FXWindow* own,FXuint opts,FXint x,FXint y,FXint w,FXint h); 136 static FXWindow* findDefault(FXWindow* window); 137 static FXWindow* findInitial(FXWindow* window); 138 virtual bool doesOverrideRedirect() const; 139 protected: 140 #ifdef WIN32 141 virtual FXID GetDC() const; 142 virtual int ReleaseDC(FXID) const; 143 virtual const char* GetClass() const; 144 #else 145 void addColormapWindows(); 146 void remColormapWindows(); 147 #endif 148 private: 149 FXWindow(const FXWindow&); 150 FXWindow& operator=(const FXWindow&); 151 protected: 152 153 // Window state flags 154 enum { 155 FLAG_SHOWN = 0x00000001, // Is shown 156 FLAG_ENABLED = 0x00000002, // Able to receive input 157 FLAG_UPDATE = 0x00000004, // Is subject to GUI update 158 FLAG_DROPTARGET = 0x00000008, // Drop target 159 FLAG_FOCUSED = 0x00000010, // Has focus 160 FLAG_DIRTY = 0x00000020, // Needs layout 161 FLAG_RECALC = 0x00000040, // Needs recalculation 162 FLAG_TIP = 0x00000080, // Show tip 163 FLAG_HELP = 0x00000100, // Show help 164 FLAG_DEFAULT = 0x00000200, // Default widget 165 FLAG_INITIAL = 0x00000400, // Initial widget 166 FLAG_SHELL = 0x00000800, // Shell window 167 FLAG_ACTIVE = 0x00001000, // Window is active 168 FLAG_PRESSED = 0x00002000, // Button has been pressed 169 FLAG_KEY = 0x00004000, // Keyboard key pressed 170 FLAG_CARET = 0x00008000, // Caret is on 171 FLAG_CHANGED = 0x00010000, // Window data changed 172 FLAG_LASSO = 0x00020000, // Lasso mode 173 FLAG_TRYDRAG = 0x00040000, // Tentative drag mode 174 FLAG_DODRAG = 0x00080000, // Doing drag mode 175 FLAG_SCROLLINSIDE = 0x00100000, // Scroll only when inside 176 FLAG_SCROLLING = 0x00200000, // Right mouse scrolling 177 FLAG_OWNED = 0x00400000 178 }; 179 180 public: 181 182 // Message handlers 183 long onPaint(FXObject*,FXSelector,void*); 184 long onMap(FXObject*,FXSelector,void*); 185 long onUnmap(FXObject*,FXSelector,void*); 186 long onConfigure(FXObject*,FXSelector,void*); 187 long onUpdate(FXObject*,FXSelector,void*); 188 long onMotion(FXObject*,FXSelector,void*); 189 long onMouseWheel(FXObject*,FXSelector,void*); 190 long onEnter(FXObject*,FXSelector,void*); 191 long onLeave(FXObject*,FXSelector,void*); 192 long onLeftBtnPress(FXObject*,FXSelector,void*); 193 long onLeftBtnRelease(FXObject*,FXSelector,void*); 194 long onMiddleBtnPress(FXObject*,FXSelector,void*); 195 long onMiddleBtnRelease(FXObject*,FXSelector,void*); 196 long onRightBtnPress(FXObject*,FXSelector,void*); 197 long onRightBtnRelease(FXObject*,FXSelector,void*); 198 long onBeginDrag(FXObject*,FXSelector,void*); 199 long onEndDrag(FXObject*,FXSelector,void*); 200 long onDragged(FXObject*,FXSelector,void*); 201 long onKeyPress(FXObject*,FXSelector,void*); 202 long onKeyRelease(FXObject*,FXSelector,void*); 203 long onUngrabbed(FXObject*,FXSelector,void*); 204 long onDestroy(FXObject*,FXSelector,void*); 205 long onFocusSelf(FXObject*,FXSelector,void*); 206 long onFocusIn(FXObject*,FXSelector,void*); 207 long onFocusOut(FXObject*,FXSelector,void*); 208 long onSelectionLost(FXObject*,FXSelector,void*); 209 long onSelectionGained(FXObject*,FXSelector,void*); 210 long onSelectionRequest(FXObject*,FXSelector,void*); 211 long onClipboardLost(FXObject*,FXSelector,void*); 212 long onClipboardGained(FXObject*,FXSelector,void*); 213 long onClipboardRequest(FXObject*,FXSelector,void*); 214 long onDNDEnter(FXObject*,FXSelector,void*); 215 long onDNDLeave(FXObject*,FXSelector,void*); 216 long onDNDMotion(FXObject*,FXSelector,void*); 217 long onDNDDrop(FXObject*,FXSelector,void*); 218 long onDNDRequest(FXObject*,FXSelector,void*); 219 long onQueryHelp(FXObject*,FXSelector,void*); 220 long onQueryTip(FXObject*,FXSelector,void*); 221 long onCmdShow(FXObject*,FXSelector,void*); 222 long onCmdHide(FXObject*,FXSelector,void*); 223 long onUpdToggleShown(FXObject*,FXSelector,void*); 224 long onCmdToggleShown(FXObject*,FXSelector,void*); 225 long onCmdRaise(FXObject*,FXSelector,void*); 226 long onCmdLower(FXObject*,FXSelector,void*); 227 long onCmdEnable(FXObject*,FXSelector,void*); 228 long onCmdDisable(FXObject*,FXSelector,void*); 229 long onUpdToggleEnabled(FXObject*,FXSelector,void*); 230 long onCmdToggleEnabled(FXObject*,FXSelector,void*); 231 long onCmdUpdate(FXObject*,FXSelector,void*); 232 long onUpdYes(FXObject*,FXSelector,void*); 233 long onCmdDelete(FXObject*,FXSelector,void*); 234 235 public: 236 237 // Message ID's common to most Windows 238 enum { 239 ID_NONE, 240 ID_HIDE, // ID_HIDE+FALSE 241 ID_SHOW, // ID_HIDE+TRUE 242 ID_TOGGLESHOWN, 243 ID_LOWER, 244 ID_RAISE, 245 ID_DELETE, 246 ID_DISABLE, // ID_DISABLE+FALSE 247 ID_ENABLE, // ID_DISABLE+TRUE 248 ID_TOGGLEENABLED, 249 ID_UNCHECK, // ID_UNCHECK+FALSE 250 ID_CHECK, // ID_UNCHECK+TRUE 251 ID_UNKNOWN, // ID_UNCHECK+MAYBE 252 ID_UPDATE, 253 ID_AUTOSCROLL, 254 ID_TIPTIMER, 255 ID_HSCROLLED, 256 ID_VSCROLLED, 257 ID_SETVALUE, 258 ID_SETINTVALUE, 259 ID_SETREALVALUE, 260 ID_SETSTRINGVALUE, 261 ID_SETICONVALUE, 262 ID_SETINTRANGE, 263 ID_SETREALRANGE, 264 ID_GETINTVALUE, 265 ID_GETREALVALUE, 266 ID_GETSTRINGVALUE, 267 ID_GETICONVALUE, 268 ID_GETINTRANGE, 269 ID_GETREALRANGE, 270 ID_SETHELPSTRING, 271 ID_GETHELPSTRING, 272 ID_SETTIPSTRING, 273 ID_GETTIPSTRING, 274 ID_QUERY_MENU, 275 ID_HOTKEY, 276 ID_ACCEL, 277 ID_UNPOST, 278 ID_POST, 279 ID_MDI_TILEHORIZONTAL, 280 ID_MDI_TILEVERTICAL, 281 ID_MDI_CASCADE, 282 ID_MDI_MAXIMIZE, 283 ID_MDI_MINIMIZE, 284 ID_MDI_RESTORE, 285 ID_MDI_CLOSE, 286 ID_MDI_WINDOW, 287 ID_MDI_MENUWINDOW, 288 ID_MDI_MENUMINIMIZE, 289 ID_MDI_MENURESTORE, 290 ID_MDI_MENUCLOSE, 291 ID_MDI_NEXT, 292 ID_MDI_PREV, 293 ID_LAST 294 }; 295 296 public: 297 298 // Common DND type names 299 static const FXchar octetTypeName[]; 300 static const FXchar deleteTypeName[]; 301 static const FXchar textTypeName[]; 302 static const FXchar colorTypeName[]; 303 static const FXchar urilistTypeName[]; 304 static const FXchar utf8TypeName[]; 305 static const FXchar utf16TypeName[]; 306 307 public: 308 309 /// Constructor 310 FXWindow(FXComposite* p,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0); 311 312 /// Return a pointer to the parent window getParent()313 FXWindow* getParent() const { return parent; } 314 315 /// Return a pointer to the owner window getOwner()316 FXWindow* getOwner() const { return owner; } 317 318 /// Return a pointer to the shell window 319 FXWindow* getShell() const; 320 321 /// Return a pointer to the root window 322 FXWindow* getRoot() const; 323 324 /// Return a pointer to the next (sibling) window, if any getNext()325 FXWindow* getNext() const { return next; } 326 327 /// Return a pointer to the previous (sibling) window , if any getPrev()328 FXWindow* getPrev() const { return prev; } 329 330 /// Return a pointer to this window's first child window , if any getFirst()331 FXWindow* getFirst() const { return first; } 332 333 /// Return a pointer to this window's last child window, if any getLast()334 FXWindow* getLast() const { return last; } 335 336 /// Return a pointer to the currently focused child window getFocus()337 FXWindow* getFocus() const { return focus; } 338 339 /// Change window key setKey(FXuint k)340 void setKey(FXuint k){ wk=k; } 341 342 /// Return window key getKey()343 FXuint getKey() const { return wk; } 344 345 /// Set the message target object for this window setTarget(FXObject * t)346 void setTarget(FXObject *t){ target=t; } 347 348 /// Get the message target object for this window, if any getTarget()349 FXObject* getTarget() const { return target; } 350 351 /// Set the message identifier for this window setSelector(FXSelector sel)352 void setSelector(FXSelector sel){ message=sel; } 353 354 /// Get the message identifier for this window getSelector()355 FXSelector getSelector() const { return message; } 356 357 /// Get this window's x-coordinate, in the parent's coordinate system getX()358 FXint getX() const { return xpos; } 359 360 /// Get this window's y-coordinate, in the parent's coordinate system getY()361 FXint getY() const { return ypos; } 362 363 /// Return the default width of this window 364 virtual FXint getDefaultWidth(); 365 366 /// Return the default height of this window 367 virtual FXint getDefaultHeight(); 368 369 /// Return width for given height 370 virtual FXint getWidthForHeight(FXint givenheight); 371 372 /// Return height for given width 373 virtual FXint getHeightForWidth(FXint givenwidth); 374 375 /// Set this window's x-coordinate, in the parent's coordinate system 376 void setX(FXint x); 377 378 /// Set this window's y-coordinate, in the parent's coordinate system 379 void setY(FXint y); 380 381 /** 382 * Set the window width; and flag the widget as being in need of 383 * layout by its parent. This does not immediately update the server- 384 * side representation of the widget. 385 */ 386 void setWidth(FXint w); 387 388 /** 389 * Set the window height; and flag the widget as being in need of 390 * layout by its parent. This does not immediately update the server- 391 * side representation of the widget. 392 */ 393 void setHeight(FXint h); 394 395 /// Set layout hints for this window 396 void setLayoutHints(FXuint lout); 397 398 /// Get layout hints for this window 399 FXuint getLayoutHints() const; 400 401 /// Return a pointer to the accelerator table getAccelTable()402 FXAccelTable* getAccelTable() const { return accelTable; } 403 404 /// Set the accelerator table setAccelTable(FXAccelTable * acceltable)405 void setAccelTable(FXAccelTable* acceltable){ accelTable=acceltable; } 406 407 /// Add a hot key 408 void addHotKey(FXHotKey code); 409 410 /// Remove a hot key 411 void remHotKey(FXHotKey code); 412 413 /// Change help tag for this widget setHelpTag(const FXString & text)414 void setHelpTag(const FXString& text){ tag=text; } 415 416 /// Get the help tag for this widget getHelpTag()417 const FXString& getHelpTag() const { return tag; } 418 419 /// Return true if window is a shell window 420 bool isShell() const; 421 422 /// Return true if specified window is owned by this window 423 bool isOwnerOf(const FXWindow* window) const; 424 425 /// Return true if specified window is ancestor of this window 426 bool isChildOf(const FXWindow* window) const; 427 428 /// Return true if this window contains child in its subtree 429 bool containsChild(const FXWindow* child) const; 430 431 /// Return the child window at specified coordinates 432 FXWindow* getChildAt(FXint x,FXint y) const; 433 434 /// Return the number of child windows for this window 435 FXint numChildren() const; 436 437 /** 438 * Return the index (starting from zero) of the specified child window, 439 * or -1 if the window is not a child or NULL 440 */ 441 FXint indexOfChild(const FXWindow *window) const; 442 443 /** 444 * Return the child window at specified index, 445 * or NULL if the index is negative or out of range 446 */ 447 FXWindow* childAtIndex(FXint index) const; 448 449 /// Return the common ancestor of window a and window b 450 static FXWindow* commonAncestor(FXWindow* a,FXWindow* b); 451 452 /// Return TRUE if sibling a <= sibling b in list 453 static bool before(const FXWindow *a,const FXWindow* b); 454 455 /// Return TRUE if sibling a >= sibling b in list 456 static bool after(const FXWindow *a,const FXWindow* b); 457 458 /// Return compose context getComposeContext()459 FXComposeContext* getComposeContext() const { return composeContext; } 460 461 /// Create compose context 462 void createComposeContext(); 463 464 /// Destroy compose context 465 void destroyComposeContext(); 466 467 /// Set the default cursor for this window 468 void setDefaultCursor(FXCursor* cur); 469 470 /// Return the default cursor for this window getDefaultCursor()471 FXCursor* getDefaultCursor() const { return defaultCursor; } 472 473 /// Set the drag cursor for this window 474 void setDragCursor(FXCursor* cur); 475 476 /// Return the drag cursor for this window getDragCursor()477 FXCursor* getDragCursor() const { return dragCursor; } 478 479 /// Return the cursor position and mouse button-state 480 FXint getCursorPosition(FXint& x,FXint& y,FXuint& buttons) const; 481 482 /// Warp the cursor to the new position 483 FXint setCursorPosition(FXint x,FXint y); 484 485 /// Return true if this window is able to receive mouse and keyboard events 486 bool isEnabled() const; 487 488 /// Return true if the window is active 489 bool isActive() const; 490 491 /// Return true if this window is a control capable of receiving the focus 492 virtual bool canFocus() const; 493 494 /// Return true if this window has the focus 495 bool hasFocus() const; 496 497 /// Return true if this window is in focus chain 498 bool inFocusChain() const; 499 500 /// Move the focus to this window 501 virtual void setFocus(); 502 503 /// Remove the focus from this window 504 virtual void killFocus(); 505 506 /// Notification that focus moved to new child 507 virtual void changeFocus(FXWindow *child); 508 509 /** 510 * This changes the default window which responds to the Return 511 * key in a dialog. If enable is TRUE, this window becomes the default 512 * window; when enable is FALSE, this window will be no longer the 513 * default window. Finally, when enable is MAYBE, the default window 514 * will revert to the initial default window. 515 */ 516 virtual void setDefault(FXbool enable=TRUE); 517 518 /// Return true if this is the default window 519 bool isDefault() const; 520 521 /// Make this window the initial default window 522 void setInitial(bool enable=true); 523 524 /// Return true if this is the initial default window 525 bool isInitial() const; 526 527 /// Enable the window to receive mouse and keyboard events 528 virtual void enable(); 529 530 /// Disable the window from receiving mouse and keyboard events 531 virtual void disable(); 532 533 /// Create all of the server-side resources for this window 534 virtual void create(); 535 536 /// Attach foreign window handle to this window 537 virtual void attach(FXID w); 538 539 /// Detach the server-side resources for this window 540 virtual void detach(); 541 542 /// Destroy the server-side resources for this window 543 virtual void destroy(); 544 545 /// Set window shape by means of region 546 virtual void setShape(const FXRegion& region); 547 548 /// Set window shape by means of bitmap 549 virtual void setShape(FXBitmap* bitmap); 550 551 /// Set window shape by means of icon 552 virtual void setShape(FXIcon* icon); 553 554 /// Clear window shape 555 virtual void clearShape(); 556 557 /// Raise this window to the top of the stacking order 558 virtual void raise(); 559 560 /// Lower this window to the bottom of the stacking order 561 virtual void lower(); 562 563 /** 564 * Move the window immediately, in the parent's coordinate system. 565 * Update the server representation as well if the window is realized. 566 * Perform layout of the children when necessary. 567 */ 568 virtual void move(FXint x,FXint y); 569 570 /** 571 * Resize the window to the specified width and height immediately, 572 * updating the server representation as well, if the window was realized. 573 * Perform layout of the children when necessary. 574 */ 575 virtual void resize(FXint w,FXint h); 576 577 /** 578 * Move and resize the window immediately, in the parent's coordinate system. 579 * Update the server representation as well if the window is realized. 580 * Perform layout of the children when necessary. 581 */ 582 virtual void position(FXint x,FXint y,FXint w,FXint h); 583 584 /// Mark this window's layout as dirty for later layout 585 virtual void recalc(); 586 587 /// Perform layout immediately 588 virtual void layout(); 589 590 /// Generate a SEL_UPDATE message for the window and its children 591 void forceRefresh(); 592 593 /// Reparent this window under new father before other 594 virtual void reparent(FXWindow* father,FXWindow *other=NULL); 595 596 /// Scroll rectangle x,y,w,h by a shift of dx,dy 597 void scroll(FXint x,FXint y,FXint w,FXint h,FXint dx,FXint dy) const; 598 599 /// Mark the specified rectangle to be repainted later 600 void update(FXint x,FXint y,FXint w,FXint h) const; 601 602 /// Mark the entire window to be repainted later 603 void update() const; 604 605 /// Process any outstanding repaint messages immediately, for the given rectangle 606 void repaint(FXint x,FXint y,FXint w,FXint h) const; 607 608 /// Process any outstanding repaint messages immediately 609 void repaint() const; 610 611 /** 612 * Grab the mouse to this window; future mouse events will be 613 * reported to this window even while the cursor goes outside of this window 614 */ 615 void grab(); 616 617 /// Release the mouse grab 618 void ungrab(); 619 620 /// Return true if the window has been grabbed 621 bool grabbed() const; 622 623 /// Grab keyboard device 624 void grabKeyboard(); 625 626 /// Ungrab keyboard device 627 void ungrabKeyboard(); 628 629 /// Return true if active grab is in effect 630 bool grabbedKeyboard() const; 631 632 /// Show this window 633 virtual void show(); 634 635 /// Hide this window 636 virtual void hide(); 637 638 /// Return true if the window is shown 639 bool shown() const; 640 641 /// Return true if the window is composite 642 virtual bool isComposite() const; 643 644 /// Return true if the window is under the cursor 645 bool underCursor() const; 646 647 /// Return true if this window owns the primary selection 648 bool hasSelection() const; 649 650 /// Try to acquire the primary selection, given a list of drag types 651 bool acquireSelection(const FXDragType *types,FXuint numtypes); 652 653 /// Release the primary selection 654 bool releaseSelection(); 655 656 /// Return true if this window owns the clipboard 657 bool hasClipboard() const; 658 659 /// Try to acquire the clipboard, given a list of drag types 660 bool acquireClipboard(const FXDragType *types,FXuint numtypes); 661 662 /// Release the clipboard 663 bool releaseClipboard(); 664 665 /// Enable this window to receive drops 666 virtual void dropEnable(); 667 668 /// Disable this window from receiving drops 669 virtual void dropDisable(); 670 671 /// Return true if this window is able to receive drops 672 bool isDropEnabled() const; 673 674 /// Return true if a drag operaion has been initiated from this window 675 bool isDragging() const; 676 677 /// Initiate a drag operation with a list of previously registered drag types 678 bool beginDrag(const FXDragType *types,FXuint numtypes); 679 680 /** 681 * When dragging, inform the drop-target of the new position and 682 * the drag action 683 */ 684 bool handleDrag(FXint x,FXint y,FXDragAction action=DRAG_COPY); 685 686 /** 687 * Terminate the drag operation with or without actually dropping the data 688 * Returns the action performed by the target 689 */ 690 FXDragAction endDrag(bool drop=true); 691 692 /// Return true if this window is the target of a drop 693 bool isDropTarget() const; 694 695 /** 696 * When being dragged over, indicate that no further SEL_DND_MOTION messages 697 * are required while the cursor is inside the given rectangle 698 */ 699 void setDragRectangle(FXint x,FXint y,FXint w,FXint h,bool wantupdates=true) const; 700 701 /** 702 * When being dragged over, indicate we want to receive SEL_DND_MOTION messages 703 * every time the cursor moves 704 */ 705 void clearDragRectangle() const; 706 707 /// When being dragged over, indicate acceptance or rejection of the dragged data 708 void acceptDrop(FXDragAction action=DRAG_ACCEPT) const; 709 710 /// The target accepted our drop 711 FXDragAction didAccept() const; 712 713 /** 714 * Sent by the drop target in response to SEL_DND_DROP. The drag action 715 * should be the same as the action the drop target reported to the drag 716 * source in reponse to the SEL_DND_MOTION message. 717 * This function notifies the drag source that its part of the drop transaction 718 * is finished, and that it is free to release any resources involved in the 719 * drag operation. 720 * Calling dropFinished() is advisable in cases where the drop target needs 721 * to perform complex processing on the data received from the drag source, 722 * prior to returning from the SEL_DND_DROP message handler. 723 */ 724 void dropFinished(FXDragAction action=DRAG_REJECT) const; 725 726 /// When being dragged over, inquire the drag types which are being offered 727 bool inquireDNDTypes(FXDNDOrigin origin,FXDragType*& types,FXuint& numtypes) const; 728 729 /// When being dragged over, return true if we are offered the given drag type 730 bool offeredDNDType(FXDNDOrigin origin,FXDragType type) const; 731 732 /// When being dragged over, return the drag action 733 FXDragAction inquireDNDAction() const; 734 735 /** 736 * Set DND data; the array must be allocated with FXMALLOC and ownership is 737 * transferred to the system 738 */ 739 bool setDNDData(FXDNDOrigin origin,FXDragType type,FXuchar* data,FXuint size) const; 740 741 /** 742 * Set DND data from string value. 743 */ 744 bool setDNDData(FXDNDOrigin origin,FXDragType type,const FXString& string) const; 745 746 /** 747 * Get DND data; the caller becomes the owner of the array and must free it 748 * with FXFREE 749 */ 750 bool getDNDData(FXDNDOrigin origin,FXDragType type,FXuchar*& data,FXuint& size) const; 751 752 /** 753 * Get DND data into string value. 754 */ 755 bool getDNDData(FXDNDOrigin origin,FXDragType type,FXString& string) const; 756 757 /// Return true if window logically contains the given point 758 virtual bool contains(FXint parentx,FXint parenty) const; 759 760 /// Translate coordinates from fromwindow's coordinate space to this window's coordinate space 761 void translateCoordinatesFrom(FXint& tox,FXint& toy,const FXWindow* fromwindow,FXint fromx,FXint fromy) const; 762 763 /// Translate coordinates from this window's coordinate space to towindow's coordinate space 764 void translateCoordinatesTo(FXint& tox,FXint& toy,const FXWindow* towindow,FXint fromx,FXint fromy) const; 765 766 /// Set window background color 767 virtual void setBackColor(FXColor clr); 768 769 /// Get background color getBackColor()770 FXColor getBackColor() const { return backColor; } 771 772 virtual bool doesSaveUnder() const; 773 774 /** 775 * Translate message for localization; using the current FXTranslator, 776 * an attempt is made to translate the given message into the current 777 * language. An optional hint may be passed to break any ties in case 778 * more than one tranlation is possible for the given message text. 779 * In addition, the name of the widget is passed as context name so 780 * that controls in a single dialog may be grouped together. 781 */ 782 virtual const FXchar* tr(const FXchar* message,const FXchar* hint=NULL) const; 783 784 /// Save window to stream 785 virtual void save(FXStream& store) const; 786 787 /// Restore window from stream 788 virtual void load(FXStream& store); 789 790 /// Destroy window 791 virtual ~FXWindow(); 792 }; 793 794 } 795 796 #endif 797