// 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 <os2.h>
-#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);
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;
-
- // 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 );
+ virtual bool Show( bool show = TRUE );
+ virtual bool Enable( bool enable = TRUE );
-// ---------------------------------------------------------------------------
-// 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 *initiatingItem);
-
- // EventHandlers
- void OnEraseBackground(wxEraseEvent& event);
- void OnChar(wxKeyEvent& event);
- void OnKeyDown(wxKeyEvent& event);
- void OnKeyUp(wxKeyEvent& event);
- void OnPaint(wxPaintEvent& event);
- void OnIdle(wxIdleEvent& event);
+ // Override to define new behaviour for default action (e.g. double
+ // clicking on a listbox)
+ virtual void OnDefaultAction(wxControl * WXUNUSED(initiatingItem)) { }
+#endif // WXWIN_COMPATIBILITY
- // Accessors
+#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; }
+ void SetHWND(WXHWND hWnd) { m_hWnd = hWnd; }
virtual WXWidget GetHandle() const { return GetHWND(); }
-public:
-// ---------------------------------------------------------------------------
-// IMPLEMENTATION
-// ---------------------------------------------------------------------------
+ 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 OnIdle(wxIdleEvent& event);
+
+public:
// For implementation purposes - sometimes decorations make the client area
// smaller
virtual wxPoint GetClientAreaOrigin() const;
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;
- // PM only: TRUE if this control is part of the main control
+ // MSW only: TRUE if this control is part of the main control
virtual bool ContainsHWND(WXHWND WXUNUSED(hWnd)) const { return FALSE; };
- // Executes the default message
- virtual long Default();
+ // 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 <windowsx.h> - 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);
- // 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.
+ bool HandleQueryDragIcon(WXHICON *hIcon);
+
+ bool HandleSetCursor(WXHWND hWnd, short nHitTest, int mouseMsg);
- wxObject *GetChild(int number) const ;
+ // Window procedure
+ virtual MRESULT OS2WindowProc(HWND hwnd, WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
- // Transfers data to any child controls
- void OnInitDialog(wxInitDialogEvent& event);
+ // 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();
- virtual MRESULT OS2WindowProc(HWND hwnd, WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
+ // 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);
-protected:
+#if WXWIN_COMPATIBILITY
+ void SetShowing(bool show) { (void)Show(show); }
+ bool IsUserEnabled() const { return IsEnabled(); }
+#endif // WXWIN_COMPATIBILITY
- // Caret data
- int m_caretWidth;
- int m_caretHeight;
- bool m_caretEnabled;
- bool m_caretShown;
+ // Responds to colour changes: passes event on to children.
+ void OnSysColourChanged(wxSysColourChangedEvent& event);
- wxButton * m_defaultItem;
+ // initialize various fields of wxMouseEvent (common part of MSWOnMouseXXX)
+ void InitMouseEvent(wxMouseEvent& event, int x, int y, WXUINT flags);
-public:
- WXFARPROC m_oldWndProc;
- int m_returnCode;
- bool m_isBeingDeleted;
- bool m_isShown;
- bool m_winCaptured;
- bool m_mouseInWindow;
- bool m_backgroundTransparent;
- // handles
+protected:
+ // the window handle
WXHWND m_hWnd;
- WXHMENU m_hMenu; // Menu, if any
+
+ // the old window proc (we subclass all windows)
+ WXFARPROC m_oldWndProc;
+
+ // 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();
-};
+ // 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_