X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bfc6fde4b1dd5bfd8ae22839ff9a69cf24eb9120..af01f1ba0d697c07173f436ab661b4c833258a91:/include/wx/motif/window.h diff --git a/include/wx/motif/window.h b/include/wx/motif/window.h index c5bc74b719..e23aeda442 100644 --- a/include/wx/motif/window.h +++ b/include/wx/motif/window.h @@ -6,686 +6,283 @@ // Created: 17/09/98 // RCS-ID: $Id$ // Copyright: (c) Julian Smart -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifndef _WX_WINDOW_H_ #define _WX_WINDOW_H_ #ifdef __GNUG__ -#pragma interface "window.h" + #pragma interface "window.h" #endif -#include "wx/gdicmn.h" -#include "wx/icon.h" -#include "wx/cursor.h" -#include "wx/pen.h" -#include "wx/font.h" -#include "wx/validate.h" -#include "wx/event.h" -#include "wx/string.h" -#include "wx/list.h" #include "wx/region.h" -#include "wx/accel.h" -#include "wx/intl.h" - -#define wxKEY_SHIFT 1 -#define wxKEY_CTRL 2 - -/* - * Base class for frame, panel, canvas, panel items, dialog box. - * - */ - -/* - * Event handler: windows have themselves as their event handlers - * by default, but their event handlers could be set to another - * object entirely. This separation can reduce the amount of - * derivation required, and allow alteration of a window's functionality - * (e.g. by a resource editor that temporarily switches event handlers). - */ - -class WXDLLEXPORT wxWindow; -class WXDLLEXPORT wxEvent; -class WXDLLEXPORT wxCommandEvent; -class WXDLLEXPORT wxKeyEvent; -class WXDLLEXPORT wxControl; -class WXDLLEXPORT wxCursor; -class WXDLLEXPORT wxColourMap; -class WXDLLEXPORT wxFont; -class WXDLLEXPORT wxMenu; -class WXDLLEXPORT wxRect; -class WXDLLEXPORT wxBitmap; -class WXDLLEXPORT wxSizer; -class WXDLLEXPORT wxList; -class WXDLLEXPORT wxLayoutConstraints; -class WXDLLEXPORT wxMouseEvent; -class WXDLLEXPORT wxButton; -class WXDLLEXPORT wxColour; -class WXDLLEXPORT wxBrush; -class WXDLLEXPORT wxPen; -class WXDLLEXPORT wxIcon; -class WXDLLEXPORT wxDC; -class WXDLLEXPORT wxValidator; -#if wxUSE_DRAG_AND_DROP -class WXDLLEXPORT wxDropTarget; -#endif - -#if wxUSE_WX_RESOURCES -class WXDLLEXPORT wxResourceTable; -class WXDLLEXPORT wxItemResource; -#endif - -WXDLLEXPORT_DATA(extern const char*) wxPanelNameStr; +// ---------------------------------------------------------------------------- +// wxWindow class for Motif - see also wxWindowBase +// ---------------------------------------------------------------------------- -WXDLLEXPORT_DATA(extern const wxSize) wxDefaultSize; -WXDLLEXPORT_DATA(extern const wxPoint) wxDefaultPosition; - -//----------------------------------------------------------------------------- -// wxClientData -//----------------------------------------------------------------------------- - -class wxClientData +class wxWindow : public wxWindowBase { -public: - wxClientData() { } - virtual ~wxClientData() { } -}; +friend class WXDLLEXPORT wxDC; +friend class WXDLLEXPORT wxWindowDC; -//----------------------------------------------------------------------------- -// wxStringClientData -//----------------------------------------------------------------------------- - -class wxStringClientData: public wxClientData -{ public: - wxStringClientData() { } - wxStringClientData( wxString &data ) { m_data = data; } - void SetData( wxString &data ) { m_data = data; } - wxString GetData() const { return m_data; } - -private: - wxString m_data; -}; - -class WXDLLEXPORT wxWindow : public wxEvtHandler -{ - DECLARE_ABSTRACT_CLASS(wxWindow) - - friend class WXDLLEXPORT wxDC; - friend class WXDLLEXPORT wxWindowDC; - -public: - wxWindow(); - wxWindow(wxWindow *parent, wxWindowID id, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - long style = 0, - const wxString& name = wxPanelNameStr) + wxWindow() { Init(); } + + wxWindow(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxPanelNameStr) { - m_children = new wxList; + Init(); Create(parent, id, pos, size, style, name); } virtual ~wxWindow(); - bool Create(wxWindow *parent, wxWindowID id, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - long style = 0, - const wxString& name = wxPanelNameStr); - - // Fit the window around the items - virtual void Fit(); - - // Show or hide the window - virtual bool Show(bool show); + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxPanelNameStr); - // Is the window shown? - virtual bool IsShown() const; + // implement base class pure virtuals + virtual void SetTitle( const wxString& title); + virtual wxString GetTitle() const; - // Raise the window to the top of the Z order virtual void Raise(); - - // Lower the window to the bottom of the Z order virtual void Lower(); - // Is the window enabled? - virtual bool IsEnabled() const; - - // For compatibility - bool Enabled() const { return IsEnabled(); } - - // Dialog support: override these and call - // base class members to add functionality - // that can't be done using validators. - - // Transfer values to controls. If returns FALSE, - // it's an application error (pops up a dialog) - virtual bool TransferDataToWindow(); + virtual bool Show( bool show = TRUE ); + virtual bool Enable( bool enable = TRUE ); - // Transfer values from controls. If returns FALSE, - // transfer failed: don't quit - virtual bool TransferDataFromWindow(); + virtual void SetFocus(); - // Validate controls. If returns FALSE, - // validation failed: don't quit - virtual bool Validate(); + virtual void WarpPointer(int x, int y); + virtual void CaptureMouse(); + virtual void ReleaseMouse(); - // Return code for dialogs - inline void SetReturnCode(int retCode); - inline int GetReturnCode(); + virtual void Refresh( bool eraseBackground = TRUE, + const wxRect *rect = (const wxRect *) NULL ); + virtual void Clear(); - // Set the cursor - virtual void SetCursor(const wxCursor& cursor); - virtual wxCursor *GetCursor() const { return (wxCursor *)& m_windowCursor; }; + virtual bool SetBackgroundColour( const wxColour &colour ); + virtual bool SetForegroundColour( const wxColour &colour ); - // Get the window with the focus - static wxWindow *FindFocus(); + virtual bool SetCursor( const wxCursor &cursor ); + virtual bool SetFont( const wxFont &font ); - // Get character size virtual int GetCharHeight() const; virtual int GetCharWidth() const; - - // moving/resizing - // --------------- - - // set the window size and/or position - void SetSize( int x, int y, int width, int height, - int sizeFlags = wxSIZE_AUTO ) - { DoSetSize(x, y, width, height, sizeFlags); } - - void SetSize( int width, int height ) - { DoSetSize( -1, -1, width, height, wxSIZE_USE_EXISTING ); } - - void SetSize( const wxSize& size ) - { SetSize( size.x, size.y); } - - void SetSize(const wxRect& rect, int sizeFlags = wxSIZE_AUTO) - { DoSetSize(rect.x, rect.y, rect.width, rect.height, sizeFlags); } - - void Move( int x, int y ) - { DoSetSize( x, y, -1, -1, wxSIZE_USE_EXISTING ); } - - void Move(const wxPoint& pt) - { Move(pt.x, pt.y); } - - // client size is the size of area available for subwindows - void SetClientSize( int width, int height ) - { DoSetClientSize(width, height); } - - void SetClientSize( const wxSize& size ) - { DoSetClientSize(size.x, size.y); } - - void SetClientSize(const wxRect& rect) - { SetClientSize( rect.width, rect.height ); } - - // get the window position and/or size - virtual void GetPosition( int *x, int *y ) const; - wxPoint GetPosition() const - { - int w, h; - GetPosition(& w, & h); - - return wxPoint(w, h); - } - - virtual void GetSize( int *width, int *height ) const; - - wxSize GetSize() const - { - int w, h; - GetSize(& w, & h); - return wxSize(w, h); - } - - wxRect GetRect() const - { - int x, y, w, h; - GetPosition(& x, & y); - GetSize(& w, & h); - - return wxRect(x, y, w, h); - } - - virtual void GetClientSize( int *width, int *height ) const; - wxSize GetClientSize() const - { - int w, h; - GetClientSize(& w, & h); - return wxSize(w, h); - } - - // Convert client to screen coordinates - virtual void ClientToScreen(int *x, int *y) const; - virtual wxPoint ClientToScreen(const wxPoint& pt) const - { int x = pt.x; int y = pt.y; ClientToScreen(& x, & y); return wxPoint(x, y); } - - // Convert screen to client coordinates - virtual void ScreenToClient(int *x, int *y) const; - virtual wxPoint ScreenToClient(const wxPoint& pt) const - { int x = pt.x; int y = pt.y; ScreenToClient(& x, & y); return wxPoint(x, y); } - - // Set the focus to this window - virtual void SetFocus(); - - // Capture/release mouse - virtual void CaptureMouse(); - virtual void ReleaseMouse(); - - // Enable or disable the window - virtual void Enable(bool enable); - + virtual void GetTextExtent(const wxString& string, + int *x, int *y, + int *descent = (int *) NULL, + int *externalLeading = (int *) NULL, + const wxFont *theFont = (const wxFont *) NULL) + const; + + virtual void SetScrollbar( int orient, int pos, int thumbVisible, + int range, bool refresh = TRUE ); + virtual void SetScrollPos( int orient, int pos, bool refresh = TRUE ); + virtual int GetScrollPos( int orient ) const; + virtual int GetScrollThumb( int orient ) const; + virtual int GetScrollRange( int orient ) const; + virtual void ScrollWindow( int dx, int dy, + const wxRect* rect = (wxRect *) NULL ); + + virtual void SetSizeHints(int minW, int minH, + int maxW = -1, int maxH = -1, + int incW = -1, int incH = -1); #if wxUSE_DRAG_AND_DROP - // Associate a drop target with this window (if the window already had a drop - // target, it's deleted!) and return the current drop target (may be NULL). - void SetDropTarget(wxDropTarget *pDropTarget); - wxDropTarget *GetDropTarget() const { return m_pDropTarget; } -#endif + virtual void SetDropTarget( wxDropTarget *dropTarget ); +#endif // wxUSE_DRAG_AND_DROP // Accept files for dragging virtual void DragAcceptFiles(bool accept); - // tooltips - // create a tooltip with this text - void SetToolTip(const wxString& tip); + // Get the unique identifier of a window + virtual WXWidget GetHandle() const { return GetMainWidget(); } - // TODO -#if wxUSE_TOOLTIPS - // pointer may be NULL to remove the tooltip - void SetToolTip(wxToolTip *tooltip); - // get the current tooltip (may return NULL if none) - wxToolTip* GetToolTip() const { return m_tooltip; } -#endif - - // Update region access - virtual wxRegion& GetUpdateRegion() const; - virtual bool IsExposed(int x, int y, int w, int h) const; - virtual bool IsExposed(const wxPoint& pt) const; - virtual bool IsExposed(const wxRect& rect) const; - - // Set/get the window title - virtual void SetTitle(const wxString& WXUNUSED(title)) {}; - virtual wxString GetTitle() const { return wxString(""); }; - // Most windows have the concept of a label; for frames, this is the - // title; for items, this is the label or button text. - virtual wxString GetLabel() const { return GetTitle(); } - - // Set/get the window name (used for resource setting in X) - virtual wxString GetName() const; - virtual void SetName(const wxString& name); - - // Centre the window - virtual void Centre(int direction) ; - void Center(int direction = wxHORIZONTAL) { Centre(direction); } - - // Popup a menu - virtual bool PopupMenu(wxMenu *menu, int x, int y); - - // Send the window a refresh event - virtual void Refresh(bool eraseBack = TRUE, const wxRect *rect = NULL); + // implementation from now on + // -------------------------- - // New functions that will replace the above. - virtual void SetScrollbar(int orient, int pos, int thumbVisible, - int range, bool refresh = TRUE); + // accessors + // --------- - // Helper functions for Motif - void CreateScrollbar(int orientation); - void DestroyScrollbar(int orientation); - - virtual void SetScrollPos(int orient, int pos, bool refresh = TRUE); - virtual int GetScrollPos(int orient) const; - virtual int GetScrollRange(int orient) const; - virtual int GetScrollThumb(int orient) const; - - virtual void ScrollWindow(int dx, int dy, const wxRect *rect = NULL); - - // Caret manipulation - virtual void CreateCaret(int w, int h); - virtual void CreateCaret(const wxBitmap *bitmap); - virtual void DestroyCaret(); - virtual void ShowCaret(bool show); - virtual void SetCaretPos(int x, int y); - virtual void GetCaretPos(int *x, int *y) const; - - // Tell window how much it can be sized - virtual void SetSizeHints(int minW = -1, int minH = -1, int maxW = -1, int maxH = -1, int incW = -1, int incH = -1); - - // Set/get the window's identifier - inline int GetId() const; - inline void SetId(int id); - - virtual void SetAcceleratorTable(const wxAcceleratorTable& accel); - virtual wxAcceleratorTable& GetAcceleratorTable() const { return (wxAcceleratorTable&) m_acceleratorTable; } - - // Make the window modal (all other windows unresponsive) - virtual void MakeModal(bool modal); - - // Get the private handle (platform-dependent) - inline void *GetHandle() const; - - // Set/get the window's relatives - inline wxWindow *GetParent() const; - inline void SetParent(wxWindow *p) ; - inline wxWindow *GetGrandParent() const; - inline wxList& GetChildren() const; - // Reparents this window to have the new parent. - virtual bool Reparent(wxWindow* parent); - - // Set/get the window's font - virtual void SetFont(const wxFont& f); - virtual wxFont& GetFont() const; - - // Set/get the window's validator - void SetValidator(const wxValidator& validator); - inline wxValidator *GetValidator() const; - - virtual void SetClientObject( wxClientData *data ); - virtual wxClientData *GetClientObject(); - - virtual void SetClientData( void *data ); - virtual void *GetClientData(); - - // Set/get the window's style - inline void SetWindowStyleFlag(long flag); - inline long GetWindowStyleFlag() const; - - // Handle a control command - virtual void OnCommand(wxWindow& win, wxCommandEvent& event); - - // Set/get event handler - inline void SetEventHandler(wxEvtHandler *handler); - inline wxEvtHandler *GetEventHandler() const; - - // Push/pop event handler (i.e. allow a chain of event handlers - // be searched) - void PushEventHandler(wxEvtHandler *handler) ; - wxEvtHandler *PopEventHandler(bool deleteHandler = FALSE) ; - - // Close the window by calling OnClose, posting a deletion - virtual bool Close(bool force = FALSE); - - // Destroy the window (delayed, if a managed window) - virtual bool Destroy() ; - - // Mode for telling default OnSize members to - // call Layout(), if not using Sizers, just top-down constraints - inline void SetAutoLayout(bool a); - inline bool GetAutoLayout() const; - - // Set/get constraints - inline wxLayoutConstraints *GetConstraints() const; - void SetConstraints(wxLayoutConstraints *c); - - // Set/get window background colour - virtual void SetBackgroundColour(const wxColour& col); - virtual wxColour GetBackgroundColour() const; + // Get main widget for this window, e.g. a text widget + virtual WXWidget GetMainWidget() const; + // Get the widget that corresponds to the label (for font setting, label setting etc.) + virtual WXWidget GetLabelWidget() const; + // Get the client widget for this window (something we can create other + // windows on) + virtual WXWidget GetClientWidget() const; + // Get the top widget for this window, e.g. the scrolled widget parent of a + // multi-line text widget. Top means, top in the window hierarchy that + // implements this window. + virtual WXWidget GetTopWidget() const; - // Set/get window foreground colour - virtual void SetForegroundColour(const wxColour& col); - virtual wxColour GetForegroundColour() const; + // Get the underlying X window and display + WXWindow GetXWindow() const; + WXDisplay *GetXDisplay() const; - // Get the default button, if there is one - virtual wxButton *GetDefaultItem() const; - virtual void SetDefaultItem(wxButton *but); + // called from Motif callbacks - and should only be called from there - // Override to define new behaviour for default action (e.g. double clicking - // on a listbox) - virtual void OnDefaultAction(wxControl *initiatingItem); + void SetButton1(bool pressed) { m_button1Pressed = pressed; } + void SetButton2(bool pressed) { m_button2Pressed = pressed; } + void SetButton3(bool pressed) { m_button3Pressed = pressed; } - // Resource loading -#if wxUSE_WX_RESOURCES - virtual bool LoadFromResource(wxWindow *parent, const wxString& resourceName, const wxResourceTable *table = NULL); - virtual wxControl *CreateItem(const wxItemResource* childResource, const wxItemResource* parentResource, - const wxResourceTable *table = (const wxResourceTable *) NULL); -#endif + void SetLastClick(int button, long timestamp) + { m_lastButton = button; m_lastTS = timestamp; } - virtual void GetTextExtent(const wxString& string, int *x, int *y, - int *descent = NULL, - int *externalLeading = NULL, - const wxFont *theFont = NULL, bool use16 = FALSE) const; + int GetLastClickedButton() const { return m_lastButton; } + long GetLastClickTime() const { return m_lastTS; } - // Is the window retained? - inline bool IsRetained() const; + // Gives window a chance to do something in response to a size message, e.g. + // arrange status bar, toolbar etc. + virtual bool PreResize(); - // Warp the pointer the given position - virtual void WarpPointer(int x_pos, int y_pos) ; + // Generates a paint event + virtual void DoPaint(); - // Clear the window - virtual void Clear(); + // update rectangle/region manipulation + // (for wxWindowDC and Motif callbacks only) + // ----------------------------------------- - // Find a window by id or name - virtual wxWindow *FindWindow(long id); - virtual wxWindow *FindWindow(const wxString& name); - - // Constraint operations - bool Layout(); - void SetSizer(wxSizer *sizer); // Adds sizer child to this window - inline wxSizer *GetSizer() const ; - inline wxWindow *GetSizerParent() const ; - inline void SetSizerParent(wxWindow *win); - - // Do Update UI processing for controls - void UpdateWindowUI(); - - void OnEraseBackground(wxEraseEvent& event); - void OnChar(wxKeyEvent& event); - void OnKeyDown(wxKeyEvent& event); - void OnKeyUp(wxKeyEvent& event); - void OnPaint(wxPaintEvent& event); - void OnIdle(wxIdleEvent& event); + // read/write access to the update rect list + const wxRectList& GetUpdateRects() const { return m_updateRects; } - // Does this window want to accept keyboard focus? - virtual bool AcceptsFocus() const; + // Adds a recangle to the updates list + void AddUpdateRect(int x, int y, int w, int h) + { m_updateRects.Append(new wxRect(x, y, w, h)); } - virtual void PrepareDC( wxDC & WXUNUSED(dc) ) {}; + // Empties the m_updateRects list + void ClearUpdateRects(); + void ClearUpdateRegion() { m_updateRegion.Clear(); } + void SetUpdateRegion(const wxRegion& region) { m_updateRegion = region; } -public: - //////////////////////////////////////////////////////////////////////// - //// IMPLEMENTATION + // sets the fore/background colour for the given widget + static void DoChangeForegroundColour(WXWidget widget, wxColour& foregroundColour); + static void DoChangeBackgroundColour(WXWidget widget, wxColour& backgroundColour, bool changeArmColour = FALSE); // For implementation purposes - sometimes decorations make the client area // smaller virtual wxPoint GetClientAreaOrigin() const; +protected: + // event handlers (not virtual by design) + void OnIdle(wxIdleEvent& event); + // Makes an adjustment to the window position (for example, a frame that has // a toolbar that it manages itself). virtual void AdjustForParentClientOrigin(int& x, int& y, int sizeFlags); - // Executes the default message - virtual long Default(); - - /* TODO: you may need something like this - // Determine whether 3D effects are wanted - virtual WXDWORD Determine3DEffects(WXDWORD defaultBorderStyle, bool *want3D); - */ - - virtual void AddChild(wxWindow *child); // Adds reference to the child object - virtual void RemoveChild(wxWindow *child); // Removes reference to child - // (but doesn't delete the child object) - virtual void DestroyChildren(); // Removes and destroys all children - - bool IsBeingDeleted() const { return FALSE; } // TODO: Should probably eliminate this - - // Constraint implementation - void UnsetConstraints(wxLayoutConstraints *c); - inline wxList *GetConstraintsInvolvedIn() const ; - // Back-pointer to other windows we're involved with, so if we delete - // this window, we must delete any constraints we're involved with. - void AddConstraintReference(wxWindow *otherWin); - void RemoveConstraintReference(wxWindow *otherWin); - void DeleteRelatedConstraints(); - - virtual void ResetConstraints(); - virtual void SetConstraintSizes(bool recurse = TRUE); - virtual bool LayoutPhase1(int *noChanges); - virtual bool LayoutPhase2(int *noChanges); - virtual bool DoPhase(int); - // Transforms from sizer coordinate space to actual - // parent coordinate space - virtual void TransformSizerToActual(int *x, int *y) const ; - - // Set size with transformation to actual coordinates if nec. - virtual void SizerSetSize(int x, int y, int w, int h); - virtual void SizerMove(int x, int y); - - // Only set/get the size/position of the constraint (if any) - virtual void SetSizeConstraint(int x, int y, int w, int h); - virtual void MoveConstraint(int x, int y); - virtual void GetSizeConstraint(int *w, int *h) const ; - virtual void GetClientSizeConstraint(int *w, int *h) const ; - virtual void GetPositionConstraint(int *x, int *y) const ; - - // Dialog units translations. Implemented in wincmn.cpp. - wxPoint ConvertPixelsToDialog(const wxPoint& pt) ; - wxPoint ConvertDialogToPixels(const wxPoint& pt) ; - inline wxSize ConvertPixelsToDialog(const wxSize& sz) - { wxPoint pt(ConvertPixelsToDialog(wxPoint(sz.x, sz.y))); return wxSize(pt.x, pt.y); } - inline wxSize ConvertDialogToPixels(const wxSize& sz) - { wxPoint pt(ConvertDialogToPixels(wxPoint(sz.x, sz.y))); return wxSize(pt.x, pt.y); } - - wxObject *GetChild(int number) const ; - - // Generates a new id for controls - static int NewControlId(); + wxWindow *GetChild(int number) const + { return GetChildren().Item(number)->GetData(); } // Responds to colour changes: passes event on to children. void OnSysColourChanged(wxSysColourChangedEvent& event); - // Transfers data to any child controls - void OnInitDialog(wxInitDialogEvent& event); + // Motif-specific - // Sends an OnInitDialog event, which in turns transfers data to - // to the window via validators. - virtual void InitDialog(); - - /// Motif-specific - - void ClearUpdateRects(); + // CanvasXXXSiize functions void CanvasGetSize(int* width, int* height) const; // If have drawing area void CanvasGetClientSize(int *width, int *height) const; void CanvasGetPosition(int *x, int *y) const; // If have drawing area void CanvasSetClientSize(int width, int size); void CanvasSetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO); - // Gives window a chance to do something in response to a size - // message, e.g. arrange status bar, toolbar etc. - virtual bool PreResize() { return TRUE; } + void SetMainWidget(WXWidget w) { m_mainWidget = w; } - // Get main widget for this window, e.g. a text widget - virtual WXWidget GetMainWidget() const; - // Get the widget that corresponds to the label (for font setting, label setting etc.) - virtual WXWidget GetLabelWidget() const { return GetMainWidget(); } - // Get the client widget for this window (something we can - // create other windows on) - virtual WXWidget GetClientWidget() const; - // Get the top widget for this window, e.g. the scrolled widget parent - // of a multi-line text widget. Top means, top in the window hierarchy - // that implements this window. - virtual WXWidget GetTopWidget() const; - virtual void SetMainWidget(WXWidget w) { m_mainWidget = w; } bool CanAddEventHandler() const { return m_canAddEventHandler; } void SetCanAddEventHandler(bool flag) { m_canAddEventHandler = flag; } - // Get the underlying X window and display - virtual WXWindow GetXWindow() const; - virtual WXDisplay *GetXDisplay() const; - - virtual WXPixmap GetBackingPixmap() const { return m_backingPixmap; } +public: + WXPixmap GetBackingPixmap() const { return m_backingPixmap; } + void SetBackingPixmap(WXPixmap pixmap) { m_backingPixmap = pixmap; } int GetPixmapWidth() const { return m_pixmapWidth; } int GetPixmapHeight() const { return m_pixmapHeight; } + void SetPixmapWidth(int w) { m_pixmapWidth = w; } + void SetPixmapHeight(int h) { m_pixmapHeight = h; } // Change properties virtual void ChangeFont(bool keepOriginalSize = TRUE); // Change to the current font (often overridden) - virtual void DoChangeForegroundColour(WXWidget widget, wxColour& foregroundColour); - virtual void DoChangeBackgroundColour(WXWidget widget, wxColour& backgroundColour, bool changeArmColour = FALSE); - // These to be overridden as needed (may change several widgets) - virtual void ChangeBackgroundColour(); // Change background and foreground colour using current - // background colour setting (Motif generates - // foreground based on background) - virtual void ChangeForegroundColour(); // Change foreground colour using current - // foreground colour setting + // Change background and foreground colour using current background colour + // setting (Motif generates foreground based on background) + virtual void ChangeBackgroundColour(); + // Change foreground colour using current foreground colour setting + virtual void ChangeForegroundColour(); + +protected: // Adds the widget to the hash table and adds event handlers. - bool AttachWidget (wxWindow* parent, WXWidget mainWidget, - WXWidget formWidget, int x, int y, int width, int height); + bool AttachWidget(wxWindow* parent, WXWidget mainWidget, + WXWidget formWidget, int x, int y, int width, int height); bool DetachWidget(WXWidget widget); - // Generates a paint event - virtual void DoPaint(); - - // How to implement accelerators. If we find a key event, - // translate to wxWindows wxKeyEvent form. Find a widget for the window. - // Now find a wxWindow for the widget. If there isn't one, go up the widget hierarchy + // How to implement accelerators. If we find a key event, translate to + // wxWindows wxKeyEvent form. Find a widget for the window. Now find a + // wxWindow for the widget. If there isn't one, go up the widget hierarchy // trying to find one. Once one is found, call ProcessAccelerator for the // window. If it returns TRUE (processed the event), skip the X event, - // otherwise carry on up the wxWindows window hierarchy calling ProcessAccelerator. - // If all return FALSE, process the X event as normal. - // Eventually we can implement OnCharHook the same way, but concentrate on accelerators - // for now. - // ProcessAccelerator must look at the current accelerator table, and try to find - // what menu id or window (beneath it) has this ID. Then construct an appropriate command + // otherwise carry on up the wxWindows window hierarchy calling + // ProcessAccelerator. If all return FALSE, process the X event as normal. + // Eventually we can implement OnCharHook the same way, but concentrate on + // accelerators for now. ProcessAccelerator must look at the current + // accelerator table, and try to find what menu id or window (beneath it) + // has this ID. Then construct an appropriate command // event and send it. +public: virtual bool ProcessAccelerator(wxKeyEvent& event); - - //////////////////////////////////////////////////////////////////////// - //// PROTECTED DATA + protected: - int m_windowId; - long m_windowStyle; // Store the window's style - wxEvtHandler * m_windowEventHandler; // Usually is 'this' - wxLayoutConstraints * m_constraints; // Constraints for this window - wxList * m_constraintsInvolvedIn; // List of constraints we're involved in - wxSizer * m_windowSizer; // Window's top-level sizer (if any) - wxWindow * m_sizerParent; // Window's parent sizer (if any) - bool m_autoLayout; // Whether to call Layout() in OnSize - wxWindow * m_windowParent; // Each window always knows its parent - wxValidator * m_windowValidator; - int m_minSizeX; - int m_minSizeY; - int m_maxSizeX; - int m_maxSizeY; - - // Caret data - int m_caretWidth; - int m_caretHeight; - bool m_caretEnabled; - bool m_caretShown; - wxFont m_windowFont; // Window's font - wxCursor m_windowCursor; // Window's cursor - wxString m_windowName; // Window name - - wxButton * m_defaultItem; - - wxColour m_backgroundColour ; - wxColour m_foregroundColour ; - wxAcceleratorTable m_acceleratorTable; - wxClientData* m_clientObject; - void* m_clientData; + // unmanage and destroy an X widget f it's !NULL (passing NULL is ok) + void UnmanageAndDestroy(WXWidget widget); -#if wxUSE_DRAG_AND_DROP - wxDropTarget *m_pDropTarget; // the current drop target or NULL -#endif //USE_DRAG_AND_DROP + // map or unmap an X widget (passing NULL is ok), returns TRUE if widget was + // mapped/unmapped + bool MapOrUnmap(WXWidget widget, bool map); -public: - wxRegion m_updateRegion; - wxList * m_children; // Window's children - int m_returnCode; + // scrolling stuff + // --------------- + + // create/destroy window scrollbars + void CreateScrollbar(wxOrientation orientation); + void DestroyScrollbar(wxOrientation orientation); + + // get either hor or vert scrollbar widget + WXWidget GetScrollbar(wxOrientation orient) const + { return orient == wxHORIZONTAL ? m_hScrollBar : m_vScrollBar; } + + // set the scroll pos + void SetInternalScrollPos(wxOrientation orient, int pos) + { + if ( orient == wxHORIZONTAL ) + m_scrollPosX = pos; + else + m_scrollPosY = pos; + } + + // Motif-specific flags + // -------------------- + + bool m_needsRefresh:1; // repaint backing store? + bool m_canAddEventHandler:1; // ??? + bool m_button1Pressed:1; + bool m_button2Pressed:1; + bool m_button3Pressed:1; -public: - /// Motif-specific - bool m_needsRefresh; // Do we need to repaint the backing store? - bool m_canAddEventHandler; - bool m_button1Pressed; - bool m_button2Pressed; - bool m_button3Pressed; // For double-click detection - long m_lastTS; // last timestamp - int m_lastButton; // last pressed button - wxList m_updateRects; // List of wxRects representing damaged region - bool m_isShown; + long m_lastTS; // last timestamp + int m_lastButton; // last pressed button + + // List of wxRects representing damaged region + wxRectList m_updateRects; + protected: WXWidget m_mainWidget; WXWidget m_hScrollBar; @@ -701,76 +298,59 @@ protected: int m_pixmapHeight; int m_pixmapOffsetX; int m_pixmapOffsetY; - int m_scrollPosX; // Store the last scroll pos, - int m_scrollPosY; // since in wxWin the pos isn't - // set automatically by system - // this is the virtual function to be overriden in any derived class which - // wants to change how SetSize() or Move() works - it is called by all - // versions of these functions in the base class + // Store the last scroll pos, since in wxWin the pos isn't set automatically + // by system + int m_scrollPosX; + int m_scrollPosY; + + // implement the base class pure virtuals + virtual void DoClientToScreen( int *x, int *y ) const; + virtual void DoScreenToClient( int *x, int *y ) const; + virtual void DoGetPosition( int *x, int *y ) const; + virtual void DoGetSize( int *width, int *height ) const; + virtual void DoGetClientSize( int *width, int *height ) const; virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO); - - // same as DoSetSize() for the client size virtual void DoSetClientSize(int width, int height); + virtual void DoMoveWindow(int x, int y, int width, int height); + virtual bool DoPopupMenu(wxMenu *menu, int x, int y); + +#if wxUSE_TOOLTIPS + virtual void DoSetToolTip( wxToolTip *tip ); +#endif // wxUSE_TOOLTIPS private: + // common part of all ctors + void Init(); + + DECLARE_DYNAMIC_CLASS(wxWindow) + DECLARE_NO_COPY_CLASS(wxWindow) DECLARE_EVENT_TABLE() }; -//////////////////////////////////////////////////////////////////////// -//// INLINES - -inline void *wxWindow::GetHandle() const { return (void *)NULL; } -inline int wxWindow::GetId() const { return m_windowId; } -inline void wxWindow::SetId(int id) { m_windowId = id; } -inline wxWindow *wxWindow::GetParent() const { return m_windowParent; } -inline void wxWindow::SetParent(wxWindow *p) { m_windowParent = p; } -inline wxWindow *wxWindow::GetGrandParent() const { return (m_windowParent ? m_windowParent->m_windowParent : (wxWindow*) NULL); } -inline wxList& wxWindow::GetChildren() const { return (wxList&) * m_children; } -inline wxFont& wxWindow::GetFont() const { return (wxFont&) m_windowFont; } -inline wxString wxWindow::GetName() const { return m_windowName; } -inline void wxWindow::SetName(const wxString& name) { m_windowName = name; } -inline long wxWindow::GetWindowStyleFlag() const { return m_windowStyle; } -inline void wxWindow::SetWindowStyleFlag(long flag) { m_windowStyle = flag; } -inline void wxWindow::SetEventHandler(wxEvtHandler *handler) { m_windowEventHandler = handler; } -inline wxEvtHandler *wxWindow::GetEventHandler() const { return m_windowEventHandler; } -inline void wxWindow::SetAutoLayout(bool a) { m_autoLayout = a; } -inline bool wxWindow::GetAutoLayout() const { return m_autoLayout; } -inline wxLayoutConstraints *wxWindow::GetConstraints() const { return m_constraints; } -inline wxColour wxWindow::GetBackgroundColour() const { return m_backgroundColour; }; -inline wxColour wxWindow::GetForegroundColour() const { return m_foregroundColour; }; - -inline wxButton *wxWindow::GetDefaultItem() const { return m_defaultItem; } -inline void wxWindow::SetDefaultItem(wxButton *but) { m_defaultItem = but; } -inline bool wxWindow::IsRetained() const { return ((m_windowStyle & wxRETAINED) == wxRETAINED); } - -inline wxList *wxWindow::GetConstraintsInvolvedIn() const { return m_constraintsInvolvedIn; } -inline wxSizer *wxWindow::GetSizer() const { return m_windowSizer; } -inline wxWindow *wxWindow::GetSizerParent() const { return m_sizerParent; } -inline void wxWindow::SetSizerParent(wxWindow *win) { m_sizerParent = win; } -inline wxValidator *wxWindow::GetValidator() const { return m_windowValidator; } -inline void wxWindow::SetReturnCode(int retCode) { m_returnCode = retCode; } -inline int wxWindow::GetReturnCode() { return m_returnCode; } - -// Get the active window. -wxWindow* WXDLLEXPORT wxGetActiveWindow(); - -WXDLLEXPORT_DATA(extern wxList) wxTopLevelWindows; - -// A little class to switch off size optimization while an instance of the object -// exists -class WXDLLEXPORT wxNoOptimize: public wxObject +// ---------------------------------------------------------------------------- +// A little class to switch off `size optimization' while an instance of the +// object exists: this may be useful to temporarily disable the optimisation +// which consists to do nothing when the new size is equal to the old size - +// although quite useful usually to avoid flicker, sometimes it leads to +// undesired effects. +// +// Usage: create an instance of this class on the stack to disable the size +// optimisation, it will be reenabled as soon as the object goes out from scope. +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxNoOptimize { public: - wxNoOptimize(); - ~wxNoOptimize(); + wxNoOptimize() { ms_count++; } + ~wxNoOptimize() { ms_count--; } - static bool CanOptimize(); + static bool CanOptimize() { return ms_count == 0; } protected: - static int m_count; + static int ms_count; }; #endif