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 // For compilers that support precompilation, includes "wx.h".
21 #include "wx/wxprec.h"
29 #include "wx/toplevel.h"
30 #include "wx/dialog.h"
31 #include "wx/string.h"
35 #include "wx/containr.h" // wxSetFocusToChild()
36 #include "wx/button.h"
37 #include "wx/checkbox.h"
40 #include "wx/module.h"
41 #include "wx/display.h"
43 // controls for sending select event
44 #include "wx/radiobut.h"
45 #include "wx/tglbtn.h"
46 #include "wx/slider.h"
47 #include "wx/datectrl.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 static Boolean
FrameFormHandleEvent(EventType
*event
);
64 // ============================================================================
65 // wxTopLevelWindowPalm implementation
66 // ============================================================================
68 BEGIN_EVENT_TABLE(wxTopLevelWindowPalm
, wxTopLevelWindowBase
)
69 EVT_ACTIVATE(wxTopLevelWindowPalm::OnActivate
)
72 // ----------------------------------------------------------------------------
73 // wxTopLevelWindowPalm creation
74 // ----------------------------------------------------------------------------
76 void wxTopLevelWindowPalm::Init()
80 WXDWORD
wxTopLevelWindowPalm::PalmGetStyle(long style
, WXDWORD
*exflags
) const
85 bool wxTopLevelWindowPalm::Create(wxWindow
*parent
,
87 const wxString
& title
,
93 // this is a check for limitation mentioned before FrameFormHandleEvent() code
94 if(wxTopLevelWindows
.GetCount()>0)
97 ActiveParentFrame
=NULL
;
99 wxTopLevelWindows
.Append(this);
102 parent
->AddChild(this);
104 SetId( id
== wxID_ANY
? NewControlId() : id
);
106 WinConstraintsType constraints
;
107 memset(&constraints
, 0, sizeof(WinConstraintsType
));
109 constraints
.x_pos
= ( pos
.x
== wxDefaultCoord
) ? winUndefConstraint
: pos
.x
;
110 constraints
.y_pos
= ( pos
.y
== wxDefaultCoord
) ? winUndefConstraint
: pos
.y
;
112 constraints
.x_min
= winUndefConstraint
;
113 constraints
.x_max
= winMaxConstraint
;
114 constraints
.x_pref
= ( size
.x
== wxDefaultCoord
) ? winUndefConstraint
: size
.x
;
115 constraints
.y_min
= winUndefConstraint
;
116 constraints
.y_max
= winMaxConstraint
;
117 constraints
.y_pref
= ( size
.y
== wxDefaultCoord
) ? winUndefConstraint
: size
.y
;
119 FrameForm
= FrmNewFormWithConstraints(
134 FrmSetEventHandler((FormType
*)FrameForm
,FrameFormHandleEvent
);
136 FrmSetActiveForm((FormType
*)FrameForm
);
138 ActiveParentFrame
=this;
143 wxTopLevelWindowPalm::~wxTopLevelWindowPalm()
147 // ---------------------------------------------------------------------------
149 // ---------------------------------------------------------------------------
151 WXWINHANDLE
wxTopLevelWindowPalm::GetWinHandle() const
153 FormType
*form
= (FormType
*)GetForm();
155 return FrmGetWindowHandle(form
);
159 // ----------------------------------------------------------------------------
160 // wxTopLevelWindowPalm showing
161 // ----------------------------------------------------------------------------
163 void wxTopLevelWindowPalm::DoShowWindow(int nShowCmd
)
167 bool wxTopLevelWindowPalm::Show(bool show
)
169 FrmDrawForm((FormType
*)FrameForm
);
171 wxPaintEvent
event(m_windowId
);
172 event
.SetEventObject(this);
173 GetEventHandler()->ProcessEvent(event
);
178 // ----------------------------------------------------------------------------
179 // wxTopLevelWindowPalm maximize/minimize
180 // ----------------------------------------------------------------------------
182 void wxTopLevelWindowPalm::Maximize(bool maximize
)
186 bool wxTopLevelWindowPalm::IsMaximized() const
191 void wxTopLevelWindowPalm::Iconize(bool iconize
)
195 bool wxTopLevelWindowPalm::IsIconized() const
200 void wxTopLevelWindowPalm::Restore()
204 void wxTopLevelWindowPalm::DoGetSize( int *width
, int *height
) const
207 FrmGetFormBounds( (FormType
*)GetForm() , &rect
);
209 *width
= rect
.extent
.x
;
211 *height
= rect
.extent
.y
;
214 // ----------------------------------------------------------------------------
215 // wxTopLevelWindowPalm fullscreen
216 // ----------------------------------------------------------------------------
218 bool wxTopLevelWindowPalm::ShowFullScreen(bool show
, long style
)
223 // ----------------------------------------------------------------------------
224 // wxTopLevelWindowPalm misc
225 // ----------------------------------------------------------------------------
227 void wxTopLevelWindowPalm::SetTitle( const wxString
& WXUNUSED(title
))
231 wxString
wxTopLevelWindowPalm::GetTitle() const
233 return wxEmptyString
;
236 void wxTopLevelWindowPalm::SetIcon(const wxIcon
& icon
)
240 void wxTopLevelWindowPalm::SetIcons(const wxIconBundle
& icons
)
244 bool wxTopLevelWindowPalm::EnableCloseButton(bool enable
)
249 WXFORMPTR
wxTopLevelWindowPalm::GetForm() const
251 return FrmGetActiveForm();
254 bool wxTopLevelWindowPalm::SetShape(const wxRegion
& region
)
259 // ----------------------------------------------------------------------------
260 // wxTopLevelWindow native event handling
261 // ----------------------------------------------------------------------------
263 bool wxTopLevelWindowPalm::HandleControlSelect(WXEVENTPTR event
)
265 const EventType
*palmEvent
= (EventType
*)event
;
266 const int id
= palmEvent
->data
.ctlSelect
.controlID
;
268 wxWindow
* win
= FindWindowById(id
,this);
273 wxButton
* button
= wxDynamicCast(win
,wxButton
);
275 return button
->SendClickEvent();
276 #endif // wxUSE_BUTTON
279 wxCheckBox
* checkbox
= wxDynamicCast(win
,wxCheckBox
);
281 return checkbox
->SendClickEvent();
282 #endif // wxUSE_CHECKBOX
285 wxToggleButton
* toggle
= wxDynamicCast(win
,wxToggleButton
);
287 return toggle
->SendClickEvent();
288 #endif // wxUSE_TOGGLEBTN
291 wxRadioButton
* radio
= wxDynamicCast(win
,wxRadioButton
);
293 return radio
->SendClickEvent();
294 #endif // wxUSE_RADIOBTN
296 #if wxUSE_DATEPICKCTRL
297 wxDatePickerCtrl
* datepicker
= wxDynamicCast(win
,wxDatePickerCtrl
);
299 return datepicker
->SendClickEvent();
300 #endif // wxUSE_DATEPICKCTRL
303 wxSlider
* slider
= wxDynamicCast(win
,wxSlider
);
305 return slider
->SendUpdatedEvent();
306 #endif // wxUSE_SLIDER
311 bool wxTopLevelWindowPalm::HandleControlRepeat(WXEVENTPTR event
)
313 const EventType
*palmEvent
= (EventType
*)event
;
314 const int id
= palmEvent
->data
.ctlRepeat
.controlID
;
316 wxWindow
* win
= FindWindowById(id
, this);
321 wxSlider
* slider
= wxDynamicCast(win
,wxSlider
);
323 return slider
->SendScrollEvent(event
);
324 #endif // wxUSE_SLIDER
329 bool wxTopLevelWindowPalm::HandleSize(WXEVENTPTR event
)
331 const EventType
*palmEvent
= (EventType
*)event
;
332 wxSize
newSize(palmEvent
->data
.winResized
.newBounds
.extent
.x
,
333 palmEvent
->data
.winResized
.newBounds
.extent
.y
);
334 wxSizeEvent
eventWx(newSize
,GetId());
335 eventWx
.SetEventObject(this);
336 return GetEventHandler()->ProcessEvent(eventWx
);
339 void wxTopLevelWindowPalm::OnActivate(wxActivateEvent
& event
)
343 /* Palm OS Event handler for the window
345 * This function *must* be located outside of the wxTopLevelWindow class because
346 * the Palm OS API expects a standalone C function as a callback. You cannot
347 * pass a pointer to a member function of a C++ class as a callback because the
348 * prototypes don't match. (A member function has a hidden "this" pointer as
349 * its first parameter).
351 * This event handler uses a global pointer to the current wxFrame to process
352 * the events generated by the Palm OS form API. I know this is ugly, but right
353 * now I can't think of any other way to deal with this problem. If someone
354 * finds a better solution, please let me know. My email address is
357 static Boolean
FrameFormHandleEvent(EventType
*event
)
359 // frame and tlw point to the same object but they are for convenience
360 // of calling proper structure withiout later dynamic typcasting
361 wxFrame
* frame
= wxDynamicCast(ActiveParentFrame
,wxFrame
);
362 wxTopLevelWindowPalm
* tlw
= ActiveParentFrame
;
363 Boolean handled
= false;
365 switch (event
->eType
) {
367 handled
= tlw
->HandleControlSelect(event
);
370 handled
= tlw
->HandleControlRepeat(event
);
372 case winResizedEvent
:
373 handled
= tlw
->HandleSize(event
);
375 #if wxUSE_MENUS_NATIVE
377 handled
= frame
->HandleMenuOpen();
380 handled
= frame
->HandleMenuSelect(event
);