///////////////////////////////////////////////////////////////////////////////
-// Name: palmos/toplevel.cpp
+// Name: src/palmos/toplevel.cpp
// Purpose: implements wxTopLevelWindow for Palm OS
-// Author: William Osborne
-// Modified by:
+// Author: William Osborne - minimal working wxPalmOS port
+// Modified by: Wlodzimierz ABX Skiba - more than minimal functionality
// Created: 10/13/04
-// RCS-ID: $Id:
-// Copyright: (c) William Osborne <wbo@freeshell.org>
+// RCS-ID: $Id$
+// Copyright: (c) William Osborne <wbo@freeshell.org>, Wlodzimierz Skiba
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
// headers
// ----------------------------------------------------------------------------
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
- #pragma implementation "toplevel.h"
-#endif
-
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#pragma hdrstop
#endif
+#include "wx/toplevel.h"
+
#ifndef WX_PRECOMP
#include "wx/app.h"
- #include "wx/toplevel.h"
#include "wx/dialog.h"
#include "wx/string.h"
#include "wx/log.h"
#include "wx/intl.h"
#include "wx/frame.h"
#include "wx/containr.h" // wxSetFocusToChild()
+ #include "wx/button.h"
+ #include "wx/checkbox.h"
+ #include "wx/radiobut.h"
+ #include "wx/slider.h"
+ #include "wx/module.h"
#endif //WX_PRECOMP
-#include "wx/module.h"
-
#include "wx/display.h"
-#ifndef ICON_BIG
- #define ICON_BIG 1
-#endif
-
-#ifndef ICON_SMALL
- #define ICON_SMALL 0
-#endif
+// controls for sending select event
+#include "wx/tglbtn.h"
+#include "wx/datectrl.h"
+#include <Window.h>
+#include <Form.h>
// ----------------------------------------------------------------------------
// globals
extern const wxChar *wxCanvasClassName;
// Pointer to the currently active frame for the form event handler.
-wxFrame* ActiveParentFrame;
+wxTopLevelWindowPalm* ActiveParentFrame;
+
+static Boolean FrameFormHandleEvent(EventType *event);
// ============================================================================
// wxTopLevelWindowPalm implementation
return 0;
}
-WXHWND wxTopLevelWindowPalm::PalmGetParent() const
-{
- return NULL;
-}
-
-bool wxTopLevelWindowPalm::CreateDialog(const void *dlgTemplate,
- const wxString& title,
- const wxPoint& pos,
- const wxSize& size)
-{
- return false;
-}
-
-bool wxTopLevelWindowPalm::CreateFrame(const wxString& title,
- const wxPoint& pos,
- const wxSize& size)
-{
- return false;
-}
-
bool wxTopLevelWindowPalm::Create(wxWindow *parent,
- wxWindowID id,
- const wxString& title,
- const wxPoint& pos,
- const wxSize& size,
- long style,
- const wxString& name)
+ wxWindowID id,
+ const wxString& title,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style,
+ const wxString& name)
{
+ // this is a check for limitation mentioned before FrameFormHandleEvent() code
+ if(wxTopLevelWindows.GetCount()>0)
+ return false;
+
ActiveParentFrame=NULL;
-
+
wxTopLevelWindows.Append(this);
if ( parent )
parent->AddChild(this);
- m_windowId = id == -1 ? NewControlId() : id;
-
- FrameForm=FrmNewForm(m_windowId,title,0,0,160,160,false,0,NULL,0,NULL,0);
- if(FrameForm==0)
+ SetId( id == wxID_ANY ? NewControlId() : id );
+
+ WinConstraintsType constraints;
+ memset(&constraints, 0, sizeof(WinConstraintsType));
+ // position
+ constraints.x_pos = ( pos.x == wxDefaultCoord ) ? winUndefConstraint : pos.x;
+ constraints.y_pos = ( pos.y == wxDefaultCoord ) ? winUndefConstraint : pos.y;
+ // size
+ constraints.x_min = winUndefConstraint;
+ constraints.x_max = winMaxConstraint;
+ constraints.x_pref = ( size.x == wxDefaultCoord ) ? winUndefConstraint : size.x;
+ constraints.y_min = winUndefConstraint;
+ constraints.y_max = winMaxConstraint;
+ constraints.y_pref = ( size.y == wxDefaultCoord ) ? winUndefConstraint : size.y;
+
+ FrameForm = FrmNewFormWithConstraints(
+ GetId(),
+ title.c_str(),
+ winFlagBackBuffer,
+ &constraints,
+ 0,
+ NULL,
+ 0,
+ NULL,
+ 0
+ );
+
+ if(FrameForm==NULL)
return false;
- FrmSetEventHandler(FrameForm,FrameFormHandleEvent);
-
- return true;
-}
-
-bool wxTopLevelWindowPalm::Create(wxWindow *parent,
- wxWindowID id,
- const wxString& title,
- const wxPoint& pos,
- const wxSize& size,
- long style,
- const wxString& name,
- wxFrame* PFrame)
-{
- wxTopLevelWindows.Append(this);
-
- if ( parent )
- parent->AddChild(this);
+ FrmSetEventHandler((FormType *)FrameForm,FrameFormHandleEvent);
- m_windowId = id == -1 ? NewControlId() : id;
+ FrmSetActiveForm((FormType *)FrameForm);
- FrameForm=FrmNewForm(m_windowId,title,0,0,160,160,false,0,NULL,0,NULL,0);
- if(FrameForm==0)
- return false;
+ ActiveParentFrame=this;
- FrmSetEventHandler(FrameForm,FrameFormHandleEvent);
-
- FrmSetActiveForm(FrameForm);
-
- ActiveParentFrame=PFrame;
-
return true;
}
{
}
+// ---------------------------------------------------------------------------
+// implementation
+// ---------------------------------------------------------------------------
+
+WXWINHANDLE wxTopLevelWindowPalm::GetWinHandle() const
+{
+ FormType *form = (FormType *)GetForm();
+ if(form)
+ return FrmGetWindowHandle(form);
+ return NULL;
+}
+
// ----------------------------------------------------------------------------
// wxTopLevelWindowPalm showing
// ----------------------------------------------------------------------------
bool wxTopLevelWindowPalm::Show(bool show)
{
- FrmDrawForm(FrameForm);
-
+ FrmDrawForm((FormType *)FrameForm);
+
wxPaintEvent event(m_windowId);
event.SetEventObject(this);
- GetEventHandler()->ProcessEvent(event);
-
+ HandleWindowEvent(event);
+
return true;
}
{
}
+void wxTopLevelWindowPalm::DoGetSize( int *width, int *height ) const
+{
+ RectangleType rect;
+ FrmGetFormBounds( (FormType *)GetForm() , &rect );
+ if(width)
+ *width = rect.extent.x;
+ if(height)
+ *height = rect.extent.y;
+}
+
// ----------------------------------------------------------------------------
// wxTopLevelWindowPalm fullscreen
// ----------------------------------------------------------------------------
// wxTopLevelWindowPalm misc
// ----------------------------------------------------------------------------
-void wxTopLevelWindowPalm::SetIcon(const wxIcon& icon)
+void wxTopLevelWindowPalm::SetTitle( const wxString& WXUNUSED(title))
+{
+}
+
+wxString wxTopLevelWindowPalm::GetTitle() const
{
+ return wxEmptyString;
}
void wxTopLevelWindowPalm::SetIcons(const wxIconBundle& icons)
return false;
}
-#ifndef __WXWINCE__
+WXFORMPTR wxTopLevelWindowPalm::GetForm() const
+{
+ return FrmGetActiveForm();
+}
bool wxTopLevelWindowPalm::SetShape(const wxRegion& region)
{
return false;
}
-#endif // !__WXWINCE__
-
// ----------------------------------------------------------------------------
-// wxTopLevelWindow event handling
+// wxTopLevelWindow native event handling
// ----------------------------------------------------------------------------
+bool wxTopLevelWindowPalm::HandleControlSelect(WXEVENTPTR event)
+{
+ const EventType *palmEvent = (EventType *)event;
+ const int id = palmEvent->data.ctlSelect.controlID;
+
+ wxWindow* win = FindWindowById(id,this);
+ if(win==NULL)
+ return false;
+
+#if wxUSE_BUTTON
+ wxButton* button = wxDynamicCast(win,wxButton);
+ if(button)
+ return button->SendClickEvent();
+#endif // wxUSE_BUTTON
+
+#if wxUSE_CHECKBOX
+ wxCheckBox* checkbox = wxDynamicCast(win,wxCheckBox);
+ if(checkbox)
+ return checkbox->SendClickEvent();
+#endif // wxUSE_CHECKBOX
+
+#if wxUSE_TOGGLEBTN
+ wxToggleButton* toggle = wxDynamicCast(win,wxToggleButton);
+ if(toggle)
+ return toggle->SendClickEvent();
+#endif // wxUSE_TOGGLEBTN
+
+#if wxUSE_RADIOBTN
+ wxRadioButton* radio = wxDynamicCast(win,wxRadioButton);
+ if(radio)
+ return radio->SendClickEvent();
+#endif // wxUSE_RADIOBTN
+
+#if wxUSE_DATEPICKCTRL
+ wxDatePickerCtrl* datepicker = wxDynamicCast(win,wxDatePickerCtrl);
+ if(datepicker)
+ return datepicker->SendClickEvent();
+#endif // wxUSE_DATEPICKCTRL
+
+#if wxUSE_SLIDER
+ wxSlider* slider = wxDynamicCast(win,wxSlider);
+ if(slider)
+ return slider->SendUpdatedEvent();
+#endif // wxUSE_SLIDER
+
+ return false;
+}
+
+bool wxTopLevelWindowPalm::HandleControlRepeat(WXEVENTPTR event)
+{
+ const EventType *palmEvent = (EventType *)event;
+ const int id = palmEvent->data.ctlRepeat.controlID;
+
+ wxWindow* win = FindWindowById(id, this);
+ if(win==NULL)
+ return false;
+
+#if wxUSE_SLIDER
+ wxSlider* slider = wxDynamicCast(win,wxSlider);
+ if(slider)
+ return slider->SendScrollEvent(event);
+#endif // wxUSE_SLIDER
+
+ return false;
+}
+
+bool wxTopLevelWindowPalm::HandleSize(WXEVENTPTR event)
+{
+ const EventType *palmEvent = (EventType *)event;
+ wxSize newSize(palmEvent->data.winResized.newBounds.extent.x,
+ palmEvent->data.winResized.newBounds.extent.y);
+ wxSizeEvent eventWx(newSize,GetId());
+ eventWx.SetEventObject(this);
+ return HandleWindowEvent(eventWx);
+}
+
void wxTopLevelWindowPalm::OnActivate(wxActivateEvent& event)
{
}
/* Palm OS Event handler for the window
- *
- * This function *must* be located outside of the wxTopLevelWindow class because
- * the Palm OS API expects a standalone C function as a callback. You cannot
- * pass a pointer to a member function of a C++ class as a callback because the
- * prototypes don't match. (A member function has a hidden "this" pointer as
+ *
+ * This function *must* be located outside of the wxTopLevelWindow class because
+ * the Palm OS API expects a standalone C function as a callback. You cannot
+ * pass a pointer to a member function of a C++ class as a callback because the
+ * prototypes don't match. (A member function has a hidden "this" pointer as
* its first parameter).
- *
- * This event handler uses a global pointer to the current wxFrame to process
- * the events generated by the Palm OS form API. I know this is ugly, but right
- * now I can't think of any other way to deal with this problem. If someone
- * finds a better solution, please let me know. My email address is
+ *
+ * This event handler uses a global pointer to the current wxFrame to process
+ * the events generated by the Palm OS form API. I know this is ugly, but right
+ * now I can't think of any other way to deal with this problem. If someone
+ * finds a better solution, please let me know. My email address is
* wbo@freeshell.org
*/
-static Boolean FrameFormHandleEvent(EventType* pEvent)
+static Boolean FrameFormHandleEvent(EventType *event)
{
- Boolean fHandled = false;
- FormType* pForm;
- WinHandle hWindow;
- int ItemID=0;
-
- switch (pEvent->eType) {
+ // frame and tlw point to the same object but they are for convenience
+ // of calling proper structure withiout later dynamic typcasting
+ wxFrame* frame = wxDynamicCast(ActiveParentFrame,wxFrame);
+ wxTopLevelWindowPalm* tlw = ActiveParentFrame;
+ Boolean handled = false;
+
+ switch (event->eType) {
case ctlSelectEvent:
+ handled = tlw->HandleControlSelect(event);
+ break;
+ case ctlRepeatEvent:
+ handled = tlw->HandleControlRepeat(event);
+ break;
+ case winResizedEvent:
+ handled = tlw->HandleSize(event);
break;
#if wxUSE_MENUS_NATIVE
case menuOpenEvent:
- fHandled=ActiveParentFrame->HandleMenuOpen();
- break;
+ handled = frame->HandleMenuOpen();
+ break;
case menuEvent:
- ItemID=pEvent->data.menu.itemID;
- fHandled=ActiveParentFrame->HandleMenuSelect(ItemID);
+ handled = frame->HandleMenuSelect(event);
break;
#endif
default:
break;
}
-
- return fHandled;
+
+ return handled;
}