X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/808e3bce622d9ec7ae8c43581472ae699ed47221..f7204798e2b7db9e5ebd94c327ed0fef72b18862:/src/palmos/control.cpp diff --git a/src/palmos/control.cpp b/src/palmos/control.cpp index b5a89e8932..b9bb06863e 100644 --- a/src/palmos/control.cpp +++ b/src/palmos/control.cpp @@ -44,6 +44,7 @@ #include "wx/checkbox.h" #include "wx/tglbtn.h" #include "wx/radiobut.h" +#include "wx/slider.h" // ---------------------------------------------------------------------------- // wxWin macros @@ -63,9 +64,25 @@ END_EVENT_TABLE() // wxControl ctor/dtor // ---------------------------------------------------------------------------- +void wxControl::Init() +{ + m_palmControl = false; + m_palmField = false; +} + wxControl::~wxControl() { + SetLabel(wxEmptyString); m_isBeingDeleted = true; + + DestroyChildren(); + + uint16_t index; + FormType* form = GetObjectFormIndex(index); + if(form!=NULL && index!=frmInvalidObjectId) + { + FrmRemoveObject((FormType **)&form,index); + } } // ---------------------------------------------------------------------------- @@ -91,38 +108,78 @@ bool wxControl::Create(wxWindow *parent, } bool wxControl::PalmCreateControl(ControlStyleType style, - wxWindow *parent, - wxWindowID id, const wxString& label, const wxPoint& pos, - const wxSize& size) + const wxSize& size, + int groupID) +{ + FormType* form = GetParentForm(); + if(form==NULL) + return false; + + ControlType *control = CtlNewControl( + (void **)&form, + GetId(), + style, + wxEmptyString, + ( pos.x == wxDefaultCoord ) ? winUndefConstraint : pos.x, + ( pos.y == wxDefaultCoord ) ? winUndefConstraint : pos.y, + ( size.x == wxDefaultCoord ) ? winUndefConstraint : size.x, + ( size.y == wxDefaultCoord ) ? winUndefConstraint : size.y, + stdFont, + groupID, + true + ); + + if(control==NULL) + return false; + + m_palmControl = true; + + SetLabel(label); + Show(); + return true; +} + +bool wxControl::PalmCreateField(const wxString& label, + const wxPoint& pos, + const wxSize& size, + bool editable, + bool underlined, + JustificationType justification) { - SetParent(parent); - SetId( id == wxID_ANY ? NewControlId() : id ); FormType* form = GetParentForm(); if(form==NULL) return false; m_label = label; - m_control = CtlNewControl( - (void **)&form, - GetId(), - style, - m_label.c_str(), - ( pos.x == wxDefaultCoord ) ? winUndefConstraint : pos.x, - ( pos.y == wxDefaultCoord ) ? winUndefConstraint : pos.y, - ( size.x == wxDefaultCoord ) ? winUndefConstraint : size.x, - ( size.y == wxDefaultCoord ) ? winUndefConstraint : size.y, - stdFont, - 0, - false - ); - - if(m_control==NULL) + FieldType *field = FldNewField( + (void **)&form, + GetId(), + ( pos.x == wxDefaultCoord ) ? winUndefConstraint : pos.x, + ( pos.y == wxDefaultCoord ) ? winUndefConstraint : pos.y, + ( size.x == wxDefaultCoord ) ? winUndefConstraint : size.x, + ( size.y == wxDefaultCoord ) ? winUndefConstraint : size.y, + stdFont, + 10, + editable, + underlined, + false, + false, + justification, + false, + false, + false + ); + + if(field==NULL) return false; + m_palmField = true; + Show(); + SetLabel(label); return true; } @@ -143,6 +200,24 @@ FormType* wxControl::GetParentForm() const return tlw->GetForm(); } +FormType* wxControl::GetObjectFormIndex(uint16_t& index) const +{ + FormType* form = GetParentForm(); + if(form!=NULL) + index = FrmGetObjectIndex(form, GetId()); + else + index = frmInvalidObjectId; + return form; +} + +void* wxControl::GetObjectPtr() const +{ + uint16_t index; + FormType* form = GetObjectFormIndex(index); + if(form==NULL || index==frmInvalidObjectId)return NULL; + return FrmGetObjectPtr(form,index); +} + wxBorder wxControl::GetDefaultBorder() const { // we want to automatically give controls a sunken style (confusingly, @@ -216,19 +291,21 @@ void wxControl::DoGetSize( int *width, int *height ) const bool wxControl::Enable(bool enable) { - if( m_control == NULL ) + ControlType *control = (ControlType *)GetObjectPtr(); + if( (IsPalmControl()) || (control == NULL)) return false; - if( IsEnabled() == enable) + if( CtlEnabled(control) == enable) return false; - CtlSetEnabled( m_control, enable); + CtlSetEnabled( control, enable); return true; } bool wxControl::IsEnabled() const { - if( m_control == NULL ) + ControlType *control = (ControlType *)GetObjectPtr(); + if( (IsPalmControl()) || (control == NULL)) return false; - return CtlEnabled(m_control); + return CtlEnabled(control); } bool wxControl::IsShown() const @@ -251,31 +328,82 @@ bool wxControl::Show( bool show ) return true; } -void wxControl::SetLabel(const wxString& label) +void wxControl::SetFieldLabel(const wxString& label) { - // setting in wrong control causes crash - if ( ( wxDynamicCast(this,wxButton) != NULL ) || - ( wxDynamicCast(this,wxCheckBox) != NULL ) || - ( wxDynamicCast(this,wxRadioButton) != NULL ) || - ( wxDynamicCast(this,wxToggleButton) != NULL ) ) + FieldType* field = (FieldType*)GetObjectPtr(); + if(field==NULL) + return; + + uint16_t newSize = label.Length() + 1; + MemHandle strHandle = FldGetTextHandle(field); + FldSetTextHandle(field, NULL ); + if (strHandle) { - m_label = label; - // TODO: as manual states, it crashes here - // needs own manipulation on used string pointers - // CtlSetLabel(m_control,m_label); + if(MemHandleResize(strHandle, newSize)!=errNone) + strHandle = 0; } + else + { + strHandle = MemHandleNew( newSize ); + } + if(!strHandle) + return; + + char* str = (char*) MemHandleLock( strHandle ); + if(str==NULL) + return; + + strcpy(str, label.c_str()); + MemHandleUnlock(strHandle); + FldSetTextHandle(field, strHandle); + FldRecalculateField(field, true); +} + +void wxControl::SetControlLabel(const wxString& label) +{ + ControlType* control = (ControlType*)GetObjectPtr(); + if(control==NULL) + return; + CtlSetLabel(control,wxEmptyString); + m_label = label; + if(!m_label.empty()) + CtlSetLabel(control,m_label.c_str()); +} + +void wxControl::SetLabel(const wxString& label) +{ + if(IsPalmField()) + SetFieldLabel(label); + + // unlike other native controls, slider has no label + if(IsPalmControl() && !wxDynamicCast(this,wxSlider)) + SetControlLabel(label); +} + +wxString wxControl::GetFieldLabel() +{ + FieldType* field = (FieldType*)GetObjectPtr(); + if(field==NULL) + return wxEmptyString; + return FldGetTextPtr(field); +} + +wxString wxControl::GetControlLabel() +{ + ControlType* control = (ControlType*)GetObjectPtr(); + if(control==NULL) + return wxEmptyString; + return CtlGetLabel(control); } wxString wxControl::GetLabel() { - // setting in wrong control causes crash - if ( wxDynamicCast(this,wxButton) || - wxDynamicCast(this,wxCheckBox) || - wxDynamicCast(this,wxRadioButton) || - wxDynamicCast(this,wxToggleButton) ) - { - return m_label; - } + if(IsPalmField()) + return GetFieldLabel(); + + // unlike other native controls, slider has no label + if(IsPalmControl() && !wxDynamicCast(this,wxSlider)) + return GetControlLabel(); return wxEmptyString; }