1/////////////////////////////////////////////////////////////////////////////
2// Name:        wx/palmos/window.h
3// Purpose:     wxWindow class
4// Author:      William Osborne - minimal working wxPalmOS port
5// Modified by: Wlodzimierz ABX Skiba - more than minimal functionality
6// Created:     10/13/04
7// RCS-ID:      $Id: window.h 36196 2005-11-18 18:34:15Z ABX $
8// Copyright:   (c) William Osborne, Wlodzimierz Skiba
9// Licence:     wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#ifndef _WX_WINDOW_H_
13#define _WX_WINDOW_H_
14
15// ---------------------------------------------------------------------------
16// headers
17// ---------------------------------------------------------------------------
18
19// [at least] some version of Windows send extra mouse move messages after
20// a mouse click or a key press - to temporarily fix this problem, set the
21// define below to 1
22//
23// a better solution should be found later...
24#define wxUSE_MOUSEEVENT_HACK 0
25
26// ---------------------------------------------------------------------------
27// wxWindow declaration for Palm
28// ---------------------------------------------------------------------------
29
30class WXDLLEXPORT wxWindowPalm : public wxWindowBase
31{
32public:
33    wxWindowPalm() { Init(); }
34
35    wxWindowPalm(wxWindow *parent,
36                wxWindowID id,
37                const wxPoint& pos = wxDefaultPosition,
38                const wxSize& size = wxDefaultSize,
39                long style = 0,
40                const wxString& name = wxPanelNameStr)
41    {
42        Init();
43        Create(parent, id, pos, size, style, name);
44    }
45
46    virtual ~wxWindowPalm();
47
48    bool Create(wxWindow *parent,
49                wxWindowID id,
50                const wxPoint& pos = wxDefaultPosition,
51                const wxSize& size = wxDefaultSize,
52                long style = 0,
53                const wxString& name = wxPanelNameStr);
54
55    // implement base class pure virtuals
56
57    virtual void SetLabel( const wxString& label);
58    virtual wxString GetLabel() const;
59
60    virtual void Raise();
61    virtual void Lower();
62
63    virtual bool Show( bool show = true );
64    virtual bool Enable( bool enable = true );
65
66    virtual void SetFocus();
67    virtual void SetFocusFromKbd();
68
69    virtual bool Reparent(wxWindowBase *newParent);
70
71    virtual void WarpPointer(int x, int y);
72
73    virtual void Refresh( bool eraseBackground = true,
74                          const wxRect *rect = NULL );
75    virtual void Update();
76    virtual void Freeze();
77    virtual void Thaw();
78
79    virtual bool SetCursor( const wxCursor &cursor );
80    virtual bool SetFont( const wxFont &font );
81
82    virtual int GetCharHeight() const;
83    virtual int GetCharWidth() const;
84    virtual void GetTextExtent(const wxString& string,
85                               int *x, int *y,
86                               int *descent = (int *) NULL,
87                               int *externalLeading = (int *) NULL,
88                               const wxFont *theFont = (const wxFont *) NULL)
89                               const;
90
91#if wxUSE_MENUS_NATIVE
92    virtual bool DoPopupMenu( wxMenu *menu, int x, int y );
93#endif // wxUSE_MENUS_NATIVE
94
95    virtual void SetScrollbar( int orient, int pos, int thumbVisible,
96                               int range, bool refresh = true );
97    virtual void SetScrollPos( int orient, int pos, bool refresh = true );
98    virtual int GetScrollPos( int orient ) const;
99    virtual int GetScrollThumb( int orient ) const;
100    virtual int GetScrollRange( int orient ) const;
101    virtual void ScrollWindow( int dx, int dy,
102                               const wxRect* rect = (wxRect *) NULL );
103
104    virtual bool ScrollLines(int lines);
105    virtual bool ScrollPages(int pages);
106
107#if wxUSE_DRAG_AND_DROP
108    virtual void SetDropTarget( wxDropTarget *dropTarget );
109#endif // wxUSE_DRAG_AND_DROP
110
111    // Accept files for dragging
112    virtual void DragAcceptFiles(bool accept);
113
114#ifndef __WXUNIVERSAL__
115    // Native resource loading (implemented in src/Palm/nativdlg.cpp)
116    // FIXME: should they really be all virtual?
117    virtual bool LoadNativeDialog(wxWindow* parent, wxWindowID& id);
118    virtual bool LoadNativeDialog(wxWindow* parent, const wxString& name);
119    wxWindow* GetWindowChild1(wxWindowID id);
120    wxWindow* GetWindowChild(wxWindowID id);
121#endif // __WXUNIVERSAL__
122
123#if wxUSE_HOTKEY
124    // install and deinstall a system wide hotkey
125    virtual bool RegisterHotKey(int hotkeyId, int modifiers, int keycode);
126    virtual bool UnregisterHotKey(int hotkeyId);
127#endif // wxUSE_HOTKEY
128
129    // implementation from now on
130    // --------------------------
131
132    // simple accessors
133    // ----------------
134
135    virtual WXWINHANDLE GetWinHandle() const { return m_handle; }
136    virtual WXWidget GetHandle() const { return GetWinHandle(); }
137
138    // event handlers
139    // --------------
140
141    void OnEraseBackground(wxEraseEvent& event);
142    void OnPaint(wxPaintEvent& event);
143
144public:
145    wxWindow *FindItem(long id) const;
146    wxWindow *FindItemByWinHandle(WXWINHANDLE handle, bool controlOnly = false) const;
147
148    // Palm only: true if this control is part of the main control
149    virtual bool ContainsWinHandle(WXWINHANDLE WXUNUSED(handle)) const { return false; };
150
151    // translate wxWidgets style flags for this control into the Windows style
152    // and optional extended style for the corresponding native control
153    //
154    // this is the function that should be overridden in the derived classes,
155    // but you will mostly use PalmGetCreateWindowFlags() below
156    virtual WXDWORD PalmGetStyle(long flags, WXDWORD *exstyle = NULL) const ;
157
158    // get the Palm window flags corresponding to wxWidgets ones
159    //
160    // the functions returns the flags (WS_XXX) directly and puts the ext
161    // (WS_EX_XXX) flags into the provided pointer if not NULL
162    WXDWORD PalmGetCreateWindowFlags(WXDWORD *exflags = NULL) const
163        { return PalmGetStyle(GetWindowStyle(), exflags); }
164
165    // translate wxWidgets coords into Windows ones suitable to be passed to
166    // ::CreateWindow()
167    //
168    // returns true if non default coords are returned, false otherwise
169    bool PalmGetCreateWindowCoords(const wxPoint& pos,
170                                  const wxSize& size,
171                                  int& x, int& y,
172                                  int& w, int& h) const;
173
174    // creates the window of specified Windows class with given style, extended
175    // style, title and geometry (default values
176    //
177    // returns true if the window has been created, false if creation failed
178    bool PalmCreate(const wxChar *wclass,
179                   const wxChar *title = NULL,
180                   const wxPoint& pos = wxDefaultPosition,
181                   const wxSize& size = wxDefaultSize,
182                   WXDWORD style = 0,
183                   WXDWORD exendedStyle = 0);
184
185#ifndef __WXUNIVERSAL__
186    // Create an appropriate wxWindow from a WinHandle
187    virtual wxWindow* CreateWindowFromWinHandle(wxWindow* parent, WXWINHANDLE handle);
188
189    // Make sure the window style reflects the WinHandle style (roughly)
190    virtual void AdoptAttributesFromWinHandle();
191#endif // __WXUNIVERSAL__
192
193    // Setup background and foreground colours correctly
194    virtual void SetupColours();
195
196    // ------------------------------------------------------------------------
197    // internal handlers for Palm messages: all handlers return a boolean value:
198    // true means that the handler processed the event and false that it didn't
199    // ------------------------------------------------------------------------
200
201    // scroll event (both horizontal and vertical)
202    virtual bool PalmOnScroll(int orientation, WXWORD nSBCode,
203                              WXWORD pos, WXWINHANDLE control);
204
205    // virtual function for implementing internal idle
206    // behaviour
207    virtual void OnInternalIdle() ;
208
209protected:
210    // the window handle
211    WXWINHANDLE m_handle;
212    WXFORMPTR FrameForm;
213
214    WXFORMPTR GetFormPtr();
215    void SetFormPtr(WXFORMPTR FormPtr);
216
217    // additional (Palm specific) flags
218    bool                  m_mouseInWindow:1;
219    bool                  m_lastKeydownProcessed:1;
220
221    // the size of one page for scrolling
222    int                   m_xThumbSize;
223    int                   m_yThumbSize;
224
225#if wxUSE_MOUSEEVENT_HACK
226    // the coordinates of the last mouse event and the type of it
227    long                  m_lastMouseX,
228                          m_lastMouseY;
229    int                   m_lastMouseEvent;
230#endif // wxUSE_MOUSEEVENT_HACK
231
232    WXHMENU               m_hMenu; // Menu, if any
233
234    // implement the base class pure virtuals
235    virtual void DoClientToScreen( int *x, int *y ) const;
236    virtual void DoScreenToClient( int *x, int *y ) const;
237    virtual void DoGetPosition( int *x, int *y ) const;
238    virtual void DoGetSize( int *width, int *height ) const;
239    virtual void DoGetClientSize( int *width, int *height ) const;
240    virtual void DoSetSize(int x, int y,
241                           int width, int height,
242                           int sizeFlags = wxSIZE_AUTO);
243    virtual void DoSetClientSize(int width, int height);
244
245    virtual void DoCaptureMouse();
246    virtual void DoReleaseMouse();
247
248    // move the window to the specified location and resize it: this is called
249    // from both DoSetSize() and DoSetClientSize() and would usually just call
250    // ::MoveWindow() except for composite controls which will want to arrange
251    // themselves inside the given rectangle
252    virtual void DoMoveWindow(int x, int y, int width, int height);
253
254#if wxUSE_TOOLTIPS
255    virtual void DoSetToolTip( wxToolTip *tip );
256
257    // process TTN_NEEDTEXT message properly (i.e. fixing the bugs in
258    // comctl32.dll in our code -- see the function body for more info)
259    bool HandleTooltipNotify(WXUINT code,
260                             WXLPARAM lParam,
261                             const wxString& ttip);
262#endif // wxUSE_TOOLTIPS
263
264private:
265    // common part of all ctors
266    void Init();
267
268    // the (non-virtual) handlers for the events
269    bool HandleMove(int x, int y);
270    bool HandleMoving(wxRect& rect);
271    bool HandleJoystickEvent(WXUINT msg, int x, int y, WXUINT flags);
272
273    // list of disabled children before last call to our Disable()
274    wxWindowList *m_childrenDisabled;
275
276    // number of calls to Freeze() minus number of calls to Thaw()
277    unsigned int m_frozenness;
278
279    DECLARE_DYNAMIC_CLASS(wxWindowPalm)
280    DECLARE_NO_COPY_CLASS(wxWindowPalm)
281    DECLARE_EVENT_TABLE()
282};
283
284// ----------------------------------------------------------------------------
285// global objects
286// ----------------------------------------------------------------------------
287
288// notice that this hash must be defined after wxWindow declaration as it
289// needs to "see" its dtor and not just forward declaration
290#include "wx/hash.h"
291
292// pseudo-template WinHandle <-> wxWindow hash table
293WX_DECLARE_HASH(wxWindowPalm, wxWindowList, wxWinHashTable);
294
295extern wxWinHashTable *wxWinHandleHash;
296
297#endif
298    // _WX_WINDOW_H_
299