1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: src/palmos/toplevel.cpp
3 // Purpose: implements wxTopLevelWindow for Palm OS
4 // Author: William Osborne - minimal working wxPalmOS port
5 // Modified by: Wlodzimierz ABX Skiba - more than minimal functionality
8 // Copyright: (c) William Osborne <wbo@freeshell.org>, Wlodzimierz Skiba
9 // Licence: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
20 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
21 #pragma implementation "toplevel.h"
24 // For compilers that support precompilation, includes "wx.h".
25 #include "wx/wxprec.h"
33 #include "wx/toplevel.h"
34 #include "wx/dialog.h"
35 #include "wx/string.h"
39 #include "wx/containr.h" // wxSetFocusToChild()
42 #include "wx/module.h"
43 #include "wx/display.h"
45 // controls for sending select event
46 #include "wx/button.h"
47 #include "wx/checkbox.h"
48 #include "wx/radiobut.h"
49 #include "wx/tglbtn.h"
50 #include "wx/slider.h"
52 // ----------------------------------------------------------------------------
54 // ----------------------------------------------------------------------------
56 // the name of the default wxWidgets class
57 extern const wxChar
*wxCanvasClassName
;
59 // Pointer to the currently active frame for the form event handler.
60 wxTopLevelWindowPalm
* ActiveParentFrame
;
62 // ============================================================================
63 // wxTopLevelWindowPalm implementation
64 // ============================================================================
66 BEGIN_EVENT_TABLE(wxTopLevelWindowPalm
, wxTopLevelWindowBase
)
67 EVT_ACTIVATE(wxTopLevelWindowPalm::OnActivate
)
70 // ----------------------------------------------------------------------------
71 // wxTopLevelWindowPalm creation
72 // ----------------------------------------------------------------------------
74 void wxTopLevelWindowPalm::Init()
78 WXDWORD
wxTopLevelWindowPalm::PalmGetStyle(long style
, WXDWORD
*exflags
) const
83 WXHWND
wxTopLevelWindowPalm::PalmGetParent() const
88 bool wxTopLevelWindowPalm::Create(wxWindow
*parent
,
90 const wxString
& title
,
96 // this is a check for limitation mentioned before FrameFormHandleEvent() code
97 if(wxTopLevelWindows
.GetCount()>0)
100 ActiveParentFrame
=NULL
;
102 wxTopLevelWindows
.Append(this);
105 parent
->AddChild(this);
107 SetId( id
== wxID_ANY
? NewControlId() : id
);
109 WinConstraintsType constraints
;
110 memset(&constraints
, 0, sizeof(WinConstraintsType
));
112 constraints
.x_pos
= ( pos
.x
== wxDefaultCoord
) ? winUndefConstraint
: pos
.x
;
113 constraints
.y_pos
= ( pos
.y
== wxDefaultCoord
) ? winUndefConstraint
: pos
.y
;
115 constraints
.x_min
= winUndefConstraint
;
116 constraints
.x_max
= winMaxConstraint
;
117 constraints
.x_pref
= ( size
.x
== wxDefaultCoord
) ? winUndefConstraint
: size
.x
;
118 constraints
.y_min
= winUndefConstraint
;
119 constraints
.y_max
= winMaxConstraint
;
120 constraints
.y_pref
= ( size
.y
== wxDefaultCoord
) ? winUndefConstraint
: size
.y
;
122 FrameForm
= FrmNewFormWithConstraints(
137 FrmSetEventHandler(FrameForm
,FrameFormHandleEvent
);
139 FrmSetActiveForm(FrameForm
);
141 ActiveParentFrame
=this;
146 wxTopLevelWindowPalm::~wxTopLevelWindowPalm()
150 // ----------------------------------------------------------------------------
151 // wxTopLevelWindowPalm showing
152 // ----------------------------------------------------------------------------
154 void wxTopLevelWindowPalm::DoShowWindow(int nShowCmd
)
158 bool wxTopLevelWindowPalm::Show(bool show
)
160 FrmDrawForm(FrameForm
);
162 wxPaintEvent
event(m_windowId
);
163 event
.SetEventObject(this);
164 GetEventHandler()->ProcessEvent(event
);
169 // ----------------------------------------------------------------------------
170 // wxTopLevelWindowPalm maximize/minimize
171 // ----------------------------------------------------------------------------
173 void wxTopLevelWindowPalm::Maximize(bool maximize
)
177 bool wxTopLevelWindowPalm::IsMaximized() const
182 void wxTopLevelWindowPalm::Iconize(bool iconize
)
186 bool wxTopLevelWindowPalm::IsIconized() const
191 void wxTopLevelWindowPalm::Restore()
195 void wxTopLevelWindowPalm::DoGetSize( int *width
, int *height
) const
198 FrmGetFormBounds( GetForm() , &rect
);
200 *width
= rect
.extent
.x
;
202 *height
= rect
.extent
.y
;
205 // ----------------------------------------------------------------------------
206 // wxTopLevelWindowPalm fullscreen
207 // ----------------------------------------------------------------------------
209 bool wxTopLevelWindowPalm::ShowFullScreen(bool show
, long style
)
214 // ----------------------------------------------------------------------------
215 // wxTopLevelWindowPalm misc
216 // ----------------------------------------------------------------------------
218 void wxTopLevelWindowPalm::SetIcon(const wxIcon
& icon
)
222 void wxTopLevelWindowPalm::SetIcons(const wxIconBundle
& icons
)
226 bool wxTopLevelWindowPalm::EnableCloseButton(bool enable
)
231 FormType
*wxTopLevelWindowPalm::GetForm() const
233 return FrmGetActiveForm();
238 bool wxTopLevelWindowPalm::SetShape(const wxRegion
& region
)
243 #endif // !__WXWINCE__
245 // ----------------------------------------------------------------------------
246 // wxTopLevelWindow event handling
247 // ----------------------------------------------------------------------------
249 bool wxTopLevelWindowPalm::HandleControlSelect(EventType
* event
)
251 int id
= event
->data
.ctlSelect
.controlID
;
252 wxWindow
* win
= FindWindowById(id
,this);
256 wxButton
* button
= wxDynamicCast(win
,wxButton
);
258 return button
->SendClickEvent();
260 wxCheckBox
* checkbox
= wxDynamicCast(win
,wxCheckBox
);
262 return checkbox
->SendClickEvent();
264 wxToggleButton
* toggle
= wxDynamicCast(win
,wxToggleButton
);
266 return toggle
->SendClickEvent();
268 wxRadioButton
* radio
= wxDynamicCast(win
,wxRadioButton
);
270 return radio
->SendClickEvent();
272 wxSlider
* slider
= wxDynamicCast(win
,wxSlider
);
274 return slider
->SendUpdatedEvent();
279 void wxTopLevelWindowPalm::OnActivate(wxActivateEvent
& event
)
283 /* Palm OS Event handler for the window
285 * This function *must* be located outside of the wxTopLevelWindow class because
286 * the Palm OS API expects a standalone C function as a callback. You cannot
287 * pass a pointer to a member function of a C++ class as a callback because the
288 * prototypes don't match. (A member function has a hidden "this" pointer as
289 * its first parameter).
291 * This event handler uses a global pointer to the current wxFrame to process
292 * the events generated by the Palm OS form API. I know this is ugly, but right
293 * now I can't think of any other way to deal with this problem. If someone
294 * finds a better solution, please let me know. My email address is
297 static Boolean
FrameFormHandleEvent(EventType
* event
)
299 wxFrame
* frame
= wxDynamicCast(ActiveParentFrame
,wxFrame
);
300 Boolean handled
= false;
302 switch (event
->eType
) {
304 handled
= frame
->HandleControlSelect(event
);
306 #if wxUSE_MENUS_NATIVE
308 handled
= frame
->HandleMenuOpen();
311 handled
= frame
->HandleMenuSelect(event
);