X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/de44a9f06d5c9f925de9ae98e426991ed279ceef..2d93e1335c44ee76c9a5d98bd76ee3df72fa3146:/include/wx/os2/window.h diff --git a/include/wx/os2/window.h b/include/wx/os2/window.h index 12d2e8d66b..706b3a399c 100644 --- a/include/wx/os2/window.h +++ b/include/wx/os2/window.h @@ -3,63 +3,60 @@ // Purpose: wxWindow class // Author: David Webster // Modified by: -// Created: ??/??/98 +// Created: 10/12/99 // RCS-ID: $Id$ -// Copyright: (c) AUTHOR -// Licence: wxWindows licence +// Copyright: (c) David Webster +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifndef _WX_WINDOW_H_ #define _WX_WINDOW_H_ -#ifdef __GNUG__ -#pragma interface "window.h" -#endif +#define wxUSE_MOUSEEVENT_HACK 0 +// --------------------------------------------------------------------------- +// headers +// --------------------------------------------------------------------------- #define INCL_DOS #define INCL_PM +#define INCL_GPI #include -#define wxKEY_SHIFT 1 -#define wxKEY_CTRL 2 // --------------------------------------------------------------------------- // forward declarations // --------------------------------------------------------------------------- -class WXDLLEXPORT wxWindow; class WXDLLEXPORT wxButton; -#if wxUSE_DRAG_AND_DROP -class WXDLLEXPORT wxDropTarget; -#endif - -#if wxUSE_WX_RESOURCES -class WXDLLEXPORT wxResourceTable; -class WXDLLEXPORT wxItemResource; -#endif +// --------------------------------------------------------------------------- +// constants +// --------------------------------------------------------------------------- -WXDLLEXPORT_DATA(extern const char*) wxPanelNameStr; +// FIXME does anybody use those? they're unused by wxWindows... +enum +{ + wxKEY_SHIFT = 1, + wxKEY_CTRL = 2 +}; -WXDLLEXPORT_DATA(extern const wxSize) wxDefaultSize; -WXDLLEXPORT_DATA(extern const wxPoint) wxDefaultPosition; +// --------------------------------------------------------------------------- +// wxWindow declaration for OS/2 PM +// --------------------------------------------------------------------------- -class WXDLLEXPORT wxWindow: public wxWindowBase +class WXDLLEXPORT wxWindow : public wxWindowBase { - DECLARE_ABSTRACT_CLASS(wxWindow) - - friend class wxDC; - friend class wxPaintDC; + DECLARE_DYNAMIC_CLASS(wxWindow); public: - wxWindow() { Init(); }; - inline 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) { Init(); Create(parent, id, pos, size, style, name); @@ -67,169 +64,119 @@ public: virtual ~wxWindow(); - bool Create( wxWindow* parent - ,wxWindowID id - ,const wxPoint& pos = wxDefaultPosition - ,const wxSize& size = wxDefaultSize - ,long style = 0 - ,const wxString& name = wxPanelNameStr - ); + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxPanelNameStr); -// --------------------------------------------------------------------------- -// wxWindowBase pure virtual implementations -// --------------------------------------------------------------------------- + // implement base class pure virtuals + virtual void SetTitle( const wxString& title); + virtual wxString GetTitle() const; - // Z order virtual void Raise(); virtual void Lower(); - // Set the focus to this window - virtual void SetFocus(); - // Warp the pointer the given position - virtual void WarpPointer(int x_pos, int y_pos) ; - // Capture/release mouse - virtual void CaptureMouse(); - virtual void ReleaseMouse(); - // Send the window a refresh event - virtual void Refresh(bool eraseBack = TRUE, const wxRect *rect = NULL); - // Clear the window - virtual void Clear(); - // Set window's font - virtual bool SetFont(const wxFont& f); - // Get character size - virtual int GetCharHeight() const; - virtual int GetCharWidth() const; - virtual void GetTextExtent( const wxString& string - ,int* x - ,int* y - ,int* descent = NULL - ,int* externalLeading = NULL - ,const wxFont* theFont = NULL - ) const; - - // Configure the window's scrollbar - 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 GetScrollRange(int orient) const; - virtual int GetScrollThumb(int orient) const; - virtual void ScrollWindow( int dx - ,int dy - ,const wxRect* rect = NULL - ); -#if wxUSE_DRAG_AND_DROP - void SetDropTarget(wxDropTarget *pDropTarget); -#endif - // coordinates translation - virtual void DoClientToScreen( int *x, int *y ) const; - virtual void DoScreenToClient( int *x, int *y ) const; - // retrieve the position/size of the window - 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 bool Show( bool show = TRUE ); + virtual bool Enable( bool enable = TRUE ); - // 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 - 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 bool DoPopupMenu( wxMenu *menu, int x, int y ); - -// --------------------------------------------------------------------------- -// wxWindowBase virtual implementations that need to be overriden -// --------------------------------------------------------------------------- - - // Fit the window around the items - virtual void Fit(); - // Show or hide the window - virtual bool Show(bool show); // check if base implementation is OK - // Enable or disable the window - virtual bool Enable(bool enable); // check if base implementation is OK - // Set the cursor - virtual bool SetCursor(const wxCursor& cursor); // check if base implementation is OK + virtual void SetFocus(); -// --------------------------------------------------------------------------- -// additional functions -// --------------------------------------------------------------------------- + virtual bool Reparent( wxWindow *newParent ); - // Dialog support: override these and call - // base class members to add functionality - // that can't be done using validators. - void SetClientSize( int width, int height ) - { DoSetClientSize(width, height); } + virtual void WarpPointer(int x, int y); + virtual void CaptureMouse(); + virtual void ReleaseMouse(); - void SetClientSize( const wxSize& size ) - { DoSetClientSize(size.x, size.y); } + virtual void Refresh( bool eraseBackground = TRUE, + const wxRect *rect = (const wxRect *) NULL ); + virtual void Clear(); - void SetClientSize(const wxRect& rect) - { SetClientSize( rect.width, rect.height ); } + virtual bool SetCursor( const wxCursor &cursor ); + virtual bool SetFont( const wxFont &font ); - // Validate controls. If returns FALSE, - // validation failed: don't quit - virtual bool Validate(); + virtual int GetCharHeight() const; + virtual int GetCharWidth() const; + 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; - // Return code for dialogs - inline void SetReturnCode(int retCode); - inline int GetReturnCode(); + virtual bool DoPopupMenu( wxMenu *menu, int x, int y ); + 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 ); - // Get the window with the focus - static wxWindow *FindFocus(); +#if wxUSE_DRAG_AND_DROP + virtual void SetDropTarget( wxDropTarget *dropTarget ); +#endif // wxUSE_DRAG_AND_DROP // Accept files for dragging virtual void DragAcceptFiles(bool accept); - // Most windows have the concept of a label; for frames, this is the - // title; for items, this is the label or button text. - inline virtual wxString GetLabel() const { return GetTitle(); } - -#if wxUSE_CARET && WXWIN_COMPATIBILITY - // 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; -#endif +#if WXWIN_COMPATIBILITY + // Set/get scroll attributes + virtual void SetScrollRange(int orient, int range, bool refresh = TRUE); + virtual void SetScrollPage(int orient, int page, bool refresh = TRUE); + virtual int OldGetScrollRange(int orient) const; + virtual int GetScrollPage(int orient) const; - // Handle a control command + // event handlers + // Handle a control command virtual void OnCommand(wxWindow& win, wxCommandEvent& event); - // Get the default button, if there is one - inline virtual wxButton *GetDefaultItem() const; - inline virtual void SetDefaultItem(wxButton *but); + // Override to define new behaviour for default action (e.g. double + // clicking on a listbox) + virtual void OnDefaultAction(wxControl * WXUNUSED(initiatingItem)) { } +#endif // WXWIN_COMPATIBILITY - // Override to define new behaviour for default action (e.g. double clicking - // on a listbox) - virtual void OnDefaultAction(wxControl *initiatingItem); - - // EventHandlers +#if wxUSE_CARET && WXWIN_COMPATIBILITY + // caret manipulation (old MSW only functions, see wxCaret class for the + // new API) + void CreateCaret(int w, int h); + void CreateCaret(const wxBitmap *bitmap); + void DestroyCaret(); + void ShowCaret(bool show); + void SetCaretPos(int x, int y); + void GetCaretPos(int *x, int *y) const; +#endif // wxUSE_CARET + + // Native resource loading (implemented in src/msw/nativdlg.cpp) + // FIXME: should they really be all virtual? + virtual bool LoadNativeDialog(wxWindow* parent, wxWindowID& id); + virtual bool LoadNativeDialog(wxWindow* parent, const wxString& name); + wxWindow* GetWindowChild1(wxWindowID id); + wxWindow* GetWindowChild(wxWindowID id); + + // implementation from now on + // -------------------------- + + // simple accessors + // ---------------- + + WXHWND GetHWND() const { return m_hWnd; } + void SetHWND(WXHWND hWnd) { m_hWnd = hWnd; } + virtual WXWidget GetHandle() const { return GetHWND(); } + + bool GetUseCtl3D() const { return m_useCtl3D; } + bool GetTransparentBackground() const { return m_backgroundTransparent; } + void SetTransparent(bool t = TRUE) { m_backgroundTransparent = t; } + + // event handlers + // -------------- void OnEraseBackground(wxEraseEvent& event); - void OnChar(wxKeyEvent& event); - void OnKeyDown(wxKeyEvent& event); - void OnKeyUp(wxKeyEvent& event); - void OnPaint(wxPaintEvent& event); void OnIdle(wxIdleEvent& event); - public: -// --------------------------------------------------------------------------- -// IMPLEMENTATION -// --------------------------------------------------------------------------- - // For implementation purposes - sometimes decorations make the client area // smaller virtual wxPoint GetClientAreaOrigin() const; @@ -238,68 +185,250 @@ public: // 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); -*/ - - // Constraint implementation - void UnsetConstraints(wxLayoutConstraints *c); - // Back-pointer to other windows we're involved with, so if we delete - // this window, we must delete any constraints we're involved with. + // Windows subclassing + void SubclassWin(WXHWND hWnd); + void UnsubclassWin(); + + WXFARPROC OS2GetOldWndProc() const { return m_oldWndProc; } + void OS2SetOldWndProc(WXFARPROC proc) { m_oldWndProc = proc; } + + wxWindow *FindItem(long id) const; + wxWindow *FindItemByHWND(WXHWND hWnd, bool controlOnly = FALSE) const; + + // Make a Windows extended style from the given wxWindows window style + static WXDWORD MakeExtendedStyle(long style, + bool eliminateBorders = TRUE); + // Determine whether 3D effects are wanted + WXDWORD Determine3DEffects(WXDWORD defaultBorderStyle, bool *want3D) const; + + // MSW only: TRUE if this control is part of the main control + virtual bool ContainsHWND(WXHWND WXUNUSED(hWnd)) const { return FALSE; }; + + // returns TRUE if the window has been created + bool OS2Create(int id, + wxWindow *parent, + const wxChar *wclass, + wxWindow *wx_win, + const wxChar *title, + int x, int y, int width, int height, + WXDWORD style, + const wxChar *dialog_template = NULL, + WXDWORD exendedStyle = 0); + virtual bool OS2Command(WXUINT param, WXWORD id); + +#if WXWIN_COMPATIBILITY + wxObject *GetChild(int number) const; + virtual void OS2DeviceToLogical(float *x, float *y) const; +#endif // WXWIN_COMPATIBILITY + + // Create an appropriate wxWindow from a HWND + virtual wxWindow* CreateWindowFromHWND(wxWindow* parent, WXHWND hWnd); + + // Make sure the window style reflects the HWND style (roughly) + virtual void AdoptAttributesFromHWND(); + + // Setup background and foreground colours correctly + virtual void SetupColours(); + + // ------------------------------------------------------------------------ + // helpers for message handlers: these perform the same function as the + // message crackers from - they unpack WPARAM and LPARAM into + // the correct parameters + // ------------------------------------------------------------------------ + + void UnpackCommand(WXWPARAM wParam, WXLPARAM lParam, + WXWORD *id, WXHWND *hwnd, WXWORD *cmd); + void UnpackActivate(WXWPARAM wParam, WXLPARAM lParam, + WXWORD *state, WXWORD *minimized, WXHWND *hwnd); + void UnpackScroll(WXWPARAM wParam, WXLPARAM lParam, + WXWORD *code, WXWORD *pos, WXHWND *hwnd); + void UnpackCtlColor(WXWPARAM wParam, WXLPARAM lParam, + WXWORD *nCtlColor, WXHDC *hdc, WXHWND *hwnd); + void UnpackMenuSelect(WXWPARAM wParam, WXLPARAM lParam, + WXWORD *item, WXWORD *flags, WXHMENU *hmenu); + + // ------------------------------------------------------------------------ + // internal handlers for MSW messages: all handlers return a boolen value: + // TRUE means that the handler processed the event and FALSE that it didn't + // ------------------------------------------------------------------------ + + // there are several cases where we have virtual functions for Windows + // message processing: this is because these messages often require to be + // processed in a different manner in the derived classes. For all other + // messages, however, we do *not* have corresponding MSWOnXXX() function + // and if the derived class wants to process them, it should override + // MSWWindowProc() directly. + + // scroll event (both horizontal and vertical) + virtual bool OS2OnScroll(int orientation, WXWORD nSBCode, + WXWORD pos, WXHWND control); + + virtual bool OS2OnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result); + + // owner-drawn controls need to process these messages + virtual bool OS2OnDrawItem(int id, WXDRAWITEMSTRUCT *item); + virtual bool OS2OnMeasureItem(int id, WXMEASUREITEMSTRUCT *item); + + // the rest are not virtual + bool HandleCreate(WXLPCREATESTRUCT cs, bool *mayCreate); + bool HandleInitDialog(WXHWND hWndFocus); + bool HandleDestroy(); + + bool HandlePaint(); + bool HandleEraseBkgnd(WXHDC pDC); + + bool HandleMinimize(); + bool HandleMaximize(); + bool HandleSize(int x, int y, WXUINT flag); + bool HandleGetMinMaxInfo(void *mmInfo); + + bool HandleShow(bool show, int status); + bool HandleActivate(int flag, bool minimized, WXHWND activate); + + bool HandleCommand(WXWORD id, WXWORD cmd, WXHWND control); + bool HandleSysCommand(WXWPARAM wParam, WXLPARAM lParam); + + bool HandleCtlColor(WXHBRUSH *hBrush, + WXHDC hdc, + WXHWND hWnd, + WXUINT nCtlColor, + WXUINT message, + WXWPARAM wParam, + WXLPARAM lParam); + + bool HandlePaletteChanged(WXHWND hWndPalChange); + bool HandleQueryNewPalette(); + bool HandleSysColorChange(); + + bool HandleQueryEndSession(long logOff, bool *mayEnd); + bool HandleEndSession(bool endSession, long logOff); + + bool HandleSetFocus(WXHWND wnd); + bool HandleKillFocus(WXHWND wnd); + + bool HandleDropFiles(WXWPARAM wParam); + + bool HandleMouseEvent(WXUINT msg, int x, int y, WXUINT flags); + bool HandleMouseMove(int x, int y, WXUINT flags); + + bool HandleChar(WXWORD wParam, WXLPARAM lParam, bool isASCII = FALSE); + bool HandleKeyDown(WXWORD wParam, WXLPARAM lParam); + bool HandleKeyUp(WXWORD wParam, WXLPARAM lParam); + + bool HandleQueryDragIcon(WXHICON *hIcon); + + bool HandleSetCursor(WXHWND hWnd, short nHitTest, int mouseMsg); + + // Window procedure + virtual MRESULT OS2WindowProc(HWND hwnd, WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); + + // Calls an appropriate default window procedure + virtual MRESULT OS2DefWindowProc(HWND hwnd, WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); + virtual bool OS2ProcessMessage(WXMSG* pMsg); + virtual bool OS2TranslateMessage(WXMSG* pMsg); + virtual void OS2DestroyWindow(); + + // Detach "Window" menu from menu bar so it doesn't get deleted + void OS2DetachWindowMenu(); + + // this function should return the brush to paint the window background + // with or 0 for the default brush + virtual WXHBRUSH OnCtlColor(WXHDC hDC, + WXHWND hWnd, + WXUINT nCtlColor, + WXUINT message, + WXWPARAM wParam, + WXLPARAM lParam); + +#if WXWIN_COMPATIBILITY + void SetShowing(bool show) { (void)Show(show); } + bool IsUserEnabled() const { return IsEnabled(); } +#endif // WXWIN_COMPATIBILITY - wxObject *GetChild(int number) const ; + // Responds to colour changes: passes event on to children. + void OnSysColourChanged(wxSysColourChangedEvent& event); - // Transfers data to any child controls - void OnInitDialog(wxInitDialogEvent& event); + // initialize various fields of wxMouseEvent (common part of MSWOnMouseXXX) + void InitMouseEvent(wxMouseEvent& event, int x, int y, WXUINT flags); protected: + // the window handle + WXHWND m_hWnd; - // Caret data - int m_caretWidth; - int m_caretHeight; - bool m_caretEnabled; - bool m_caretShown; - - wxButton * m_defaultItem; + // the old window proc (we subclass all windows) + WXFARPROC m_oldWndProc; -public: - int m_returnCode; - bool m_isBeingDeleted; - bool m_isShown; - bool m_winCaptured; - bool m_mouseInWindow; - bool m_backgroundTransparent; - // handles - WXHWND m_hWnd; - WXHMENU m_hMenu; // Menu, if any + // additional (MSW specific) flags + bool m_useCtl3D:1; // Using CTL3D for this control + bool m_backgroundTransparent:1; + bool m_mouseInWindow:1; + bool m_doubleClickAllowed:1; + bool m_winCaptured:1; // the size of one page for scrolling int m_xThumbSize; int m_yThumbSize; - long m_lDlgCode; -DECLARE_EVENT_TABLE() +#if wxUSE_MOUSEEVENT_HACK + // the coordinates of the last mouse event and the type of it + long m_lastMouseX, + m_lastMouseY; + int m_lastMouseEvent; +#endif // wxUSE_MOUSEEVENT_HACK + + WXHMENU m_hMenu; // Menu, if any + + // the return value of WM_GETDLGCODE handler + long m_lDlgCode; + + // 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); + virtual void DoSetClientSize(int width, int height); + + // get the size which best suits the window: e.g., for a static text it + // will be the width and height of the text + virtual wxSize DoGetBestSize(); + + // move the window to the specified location and resize it: this is called + // from both DoSetSize() and DoSetClientSize() and would usually just call + // ::MoveWindow() except for composite controls which will want to arrange + // themselves inside the given rectangle + virtual void DoMoveWindow(int x, int y, int width, int height); + +#if wxUSE_TOOLTIPS + virtual void DoSetToolTip( wxToolTip *tip ); +#endif // wxUSE_TOOLTIPS + private: - void Init(); - void PMDetachWindowMenu(); - WXHWND GetHwnd() const { return m_hWnd; } - void SetHwnd(WXHWND hWnd) { m_hWnd = hWnd; } -}; + // common part of all ctors + void Init(); -//////////////////////////////////////////////////////////////////////// -//// INLINES + // the (non-virtual) handlers for the events + bool HandleMove(int x, int y); + bool HandleJoystickEvent(WXUINT msg, int x, int y, WXUINT flags); -inline wxButton *wxWindow::GetDefaultItem() const { return m_defaultItem; } -inline void wxWindow::SetDefaultItem(wxButton *but) { m_defaultItem = but; } -inline void wxWindow::SetReturnCode(int retCode) { m_returnCode = retCode; } -inline int wxWindow::GetReturnCode() { return m_returnCode; } + bool HandleNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result); + DECLARE_NO_COPY_CLASS(wxWindow); + DECLARE_EVENT_TABLE() +private: + // Virtual function hiding supression + inline virtual bool Reparent( wxWindowBase *newParent ) + { return(wxWindowBase::Reparent(newParent));}; +}; -// Get the active window. -wxWindow* WXDLLEXPORT wxGetActiveWindow(); +// --------------------------------------------------------------------------- +// global functions +// --------------------------------------------------------------------------- +// kbd code translation +WXDLLEXPORT int wxCharCodeOS2ToWX(int keySym); +WXDLLEXPORT int wxCharCodeWXToOS2(int id, bool *IsVirtual); #endif // _WX_WINDOW_H_