From 721a9626991bd21815663a52ed6543647127fabf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?W=C5=82odzimierz=20Skiba?= Date: Mon, 7 Feb 2005 15:20:01 +0000 Subject: [PATCH] wxSizeEvent for wxPalmTLW. wxScrollEvent for wxSlider. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@31821 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/palmos/slider.h | 16 ++++- include/wx/palmos/toplevel.h | 4 +- src/palmos/slider.cpp | 118 +++++++++++++++++++++++++++++++---- src/palmos/toplevel.cpp | 40 +++++++++++- 4 files changed, 161 insertions(+), 17 deletions(-) diff --git a/include/wx/palmos/slider.h b/include/wx/palmos/slider.h index 187e258d89..4b0053e234 100644 --- a/include/wx/palmos/slider.h +++ b/include/wx/palmos/slider.h @@ -20,7 +20,10 @@ class WXDLLEXPORT wxSlider : public wxSliderBase { public: - wxSlider(); + wxSlider() + { + Init(); + } wxSlider(wxWindow *parent, wxWindowID id, int value, int minValue, int maxValue, @@ -30,6 +33,7 @@ public: const wxValidator& validator = wxDefaultValidator, const wxString& name = wxSliderNameStr) { + Init(); Create(parent, id, value, minValue, maxValue, pos, size, style, validator, name); } @@ -53,7 +57,7 @@ public: // For trackbars only void SetTickFreq(int n, int pos); - int GetTickFreq() const { return GetPageSize(); } + int GetTickFreq() const; void SetPageSize(int pageSize); int GetPageSize() const; void ClearSel(); @@ -72,10 +76,18 @@ public: // send a notification event, return true if processed bool SendUpdatedEvent(); + bool SendScrollEvent(EventType* event); protected: + virtual wxSize DoGetBestSize() const; +private: + + void Init(); + int m_oldPos; + int m_lineSize; + DECLARE_DYNAMIC_CLASS_NO_COPY(wxSlider) }; diff --git a/include/wx/palmos/toplevel.h b/include/wx/palmos/toplevel.h index 3db01b1fcd..85630b6943 100644 --- a/include/wx/palmos/toplevel.h +++ b/include/wx/palmos/toplevel.h @@ -84,8 +84,10 @@ public: // interface to native frame structure FormType *GetForm() const; - // handle controls + // handle native events bool HandleControlSelect(EventType* event); + bool HandleControlRepeat(EventType* event); + bool HandleSize(EventType* event); protected: // common part of all ctors diff --git a/src/palmos/slider.cpp b/src/palmos/slider.cpp index ccc69ab7d7..94dcd78357 100644 --- a/src/palmos/slider.cpp +++ b/src/palmos/slider.cpp @@ -98,8 +98,10 @@ IMPLEMENT_DYNAMIC_CLASS(wxSlider, wxControl) #endif // Slider -wxSlider::wxSlider() +void wxSlider::Init() { + m_oldPos = 0; + m_lineSize = 1; } bool wxSlider::Create(wxWindow *parent, wxWindowID id, @@ -109,6 +111,16 @@ bool wxSlider::Create(wxWindow *parent, wxWindowID id, const wxValidator& validator, const wxString& name) { + // wxSL_AUTOTICKS is ignored - always on + // wxSL_LABELS is ignored - always off + // wxSL_LEFT is ignored - always off + // wxSL_RIGHT is ignored - always off + // wxSL_TOP is ignored - always off + // wxSL_SELRANGE is ignored - always off + // wxSL_INVERSE is ignored - always off + // wxSL_VERTICAL is impossible in native form + wxCHECK_MSG(!(style & wxSL_VERTICAL), false, _T("non vertical slider on PalmOS")); + if(!wxControl::Create(parent, id, pos, size, style, validator, name)) return false; @@ -116,6 +128,8 @@ bool wxSlider::Create(wxWindow *parent, wxWindowID id, if(form==NULL) return false; + m_oldPos = value; + SliderControlType *slider = CtlNewSliderControl ( (void **)&form, GetId(), @@ -187,68 +201,93 @@ int wxSlider::GetValue() const void wxSlider::SetValue(int value) { SetIntValue(value); + m_oldPos = value; } wxSize wxSlider::DoGetBestSize() const { - return wxSize(0,0); + // 15 is taken as used in one of official samples + // 45 is dummy height tripled, any idea what's better ? + return wxSize(45,15); } -void wxSlider::SetRange(int minValue, int maxValue) +void wxSlider::SetRange(int WXUNUSED(minValue), int WXUNUSED(maxValue)) { + // unsupported feature } -void wxSlider::SetTickFreq(int n, int pos) +void wxSlider::SetTickFreq(int WXUNUSED(n), int WXUNUSED(pos)) { + // unsupported feature } void wxSlider::SetPageSize(int pageSize) { + ControlType *control = (ControlType *)GetObjectPtr(); + if(control==NULL) + return; + uint16_t val = pageSize; + CtlSetSliderValues(control, NULL, NULL, &val, NULL); } void wxSlider::ClearSel() { + // unsupported feature } void wxSlider::ClearTicks() { + // unsupported feature } void wxSlider::SetLineSize(int lineSize) { + m_lineSize = lineSize; } int wxSlider::GetLineSize() const { - return 0; + return m_lineSize; } int wxSlider::GetSelEnd() const { - return 0; + // unsupported feature + return GetValue(); } int wxSlider::GetSelStart() const { - return 0; + // unsupported feature + return GetValue(); } -void wxSlider::SetSelection(int minPos, int maxPos) +void wxSlider::SetSelection(int WXUNUSED(minPos), int WXUNUSED(maxPos)) { + // unsupported feature } -void wxSlider::SetThumbLength(int len) +void wxSlider::SetThumbLength(int WXUNUSED(len)) { + // unsupported feature } int wxSlider::GetThumbLength() const { + // unsupported feature return 0; } -void wxSlider::SetTick(int tickPos) +int wxSlider::GetTickFreq() const { + // unsupported feature + return GetPageSize(); +} + +void wxSlider::SetTick(int WXUNUSED(tickPos)) +{ + // unsupported feature } // ---------------------------------------------------------------------------- @@ -257,12 +296,69 @@ void wxSlider::SetTick(int tickPos) bool wxSlider::SendUpdatedEvent() { + m_oldPos = GetValue(); + + // first track event + wxScrollEvent eventWxTrack(wxEVT_SCROLL_THUMBRELEASE, GetId()); + eventWxTrack.SetPosition(m_oldPos); + eventWxTrack.SetEventObject(this); + GetEventHandler()->ProcessEvent(eventWxTrack); + + // then scroll event wxCommandEvent event(wxEVT_COMMAND_SLIDER_UPDATED, GetId()); event.SetEventObject(this); - event.SetInt(GetValue()); + event.SetInt(m_oldPos); return ProcessCommand(event); } +bool wxSlider::SendScrollEvent(EventType* event) +{ + wxEventType scrollEvent; + int newPos = event->data.ctlRepeat.value; + if ( newPos == GetMax() ) + { + scrollEvent = wxEVT_SCROLL_TOP; + } + else if ( newPos == GetMin() ) + { + scrollEvent = wxEVT_SCROLL_BOTTOM; + } + else if ( newPos == ( m_oldPos + GetLineSize() ) ) + { + scrollEvent = wxEVT_SCROLL_LINEUP; + } + else if ( newPos == ( m_oldPos - GetLineSize() ) ) + { + scrollEvent = wxEVT_SCROLL_LINEDOWN; + } + else if ( newPos == ( m_oldPos + GetPageSize() ) ) + { + scrollEvent = wxEVT_SCROLL_PAGEUP; + } + else if ( newPos == ( m_oldPos - GetPageSize() ) ) + { + scrollEvent = wxEVT_SCROLL_PAGEDOWN; + } + else + { + return false; + } + + m_oldPos = newPos; + + // first track event + wxScrollEvent eventWxTrack(wxEVT_SCROLL_THUMBTRACK, GetId()); + eventWxTrack.SetPosition(newPos); + eventWxTrack.SetEventObject(this); + GetEventHandler()->ProcessEvent(eventWxTrack); + + // then scroll event + wxScrollEvent eventWxScroll(scrollEvent, GetId()); + eventWxScroll.SetPosition(newPos); + eventWxScroll.SetEventObject(this); + return GetEventHandler()->ProcessEvent(eventWxScroll); +} + void wxSlider::Command (wxCommandEvent & event) { } diff --git a/src/palmos/toplevel.cpp b/src/palmos/toplevel.cpp index 2ff38362b7..52116b2db9 100644 --- a/src/palmos/toplevel.cpp +++ b/src/palmos/toplevel.cpp @@ -243,12 +243,13 @@ bool wxTopLevelWindowPalm::SetShape(const wxRegion& region) #endif // !__WXWINCE__ // ---------------------------------------------------------------------------- -// wxTopLevelWindow event handling +// wxTopLevelWindow native event handling // ---------------------------------------------------------------------------- bool wxTopLevelWindowPalm::HandleControlSelect(EventType* event) { int id = event->data.ctlSelect.controlID; + wxWindow* win = FindWindowById(id,this); if(win==NULL) return false; @@ -276,6 +277,30 @@ bool wxTopLevelWindowPalm::HandleControlSelect(EventType* event) return false; } +bool wxTopLevelWindowPalm::HandleControlRepeat(EventType* event) +{ + int id = event->data.ctlRepeat.controlID; + + wxWindow* win = FindWindowById(id,this); + if(win==NULL) + return false; + + wxSlider* slider = wxDynamicCast(win,wxSlider); + if(slider) + return slider->SendScrollEvent(event); + + return false; +} + +bool wxTopLevelWindowPalm::HandleSize(EventType* event) +{ + wxSize newSize(event->data.winResized.newBounds.extent.x, + event->data.winResized.newBounds.extent.y); + wxSizeEvent eventWx(newSize,GetId()); + eventWx.SetEventObject(this); + return GetEventHandler()->ProcessEvent(eventWx); +} + void wxTopLevelWindowPalm::OnActivate(wxActivateEvent& event) { } @@ -296,12 +321,21 @@ void wxTopLevelWindowPalm::OnActivate(wxActivateEvent& event) */ static Boolean FrameFormHandleEvent(EventType* event) { - wxFrame* frame = wxDynamicCast(ActiveParentFrame,wxFrame); + // 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 = frame->HandleControlSelect(event); + 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: