Files
wxWidgets/src/palmos/control.cpp

517 lines
14 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// Name: src/palmos/control.cpp
// Purpose: wxControl class
// Author: William Osborne - minimal working wxPalmOS port
// Modified by: Wlodzimierz ABX Skiba - native implementation
// Created: 10/13/04
// RCS-ID: $Id$
// Copyright: (c) William Osborne, Wlodzimierz Skiba
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// ============================================================================
// declarations
// ============================================================================
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#if wxUSE_CONTROLS
#include "wx/control.h"
#ifndef WX_PRECOMP
#include "wx/event.h"
#include "wx/app.h"
#include "wx/dcclient.h"
#include "wx/log.h"
#include "wx/settings.h"
#include "wx/button.h"
#include "wx/checkbox.h"
#include "wx/radiobut.h"
#include "wx/slider.h"
#include "wx/toplevel.h"
#endif
#include "wx/tglbtn.h"
#include <Control.h>
#include <Form.h>
#ifdef __WXPALMOS6__
#include <StatusBar.h>
#else
#include <PenInputMgr.h>
#endif // __WXPALMOS6__
// ----------------------------------------------------------------------------
// wxWin macros
// ----------------------------------------------------------------------------
IMPLEMENT_ABSTRACT_CLASS(wxControl, wxWindow)
BEGIN_EVENT_TABLE(wxControl, wxWindow)
EVT_ERASE_BACKGROUND(wxControl::OnEraseBackground)
END_EVENT_TABLE()
// ============================================================================
// wxControl implementation
// ============================================================================
// ----------------------------------------------------------------------------
// wxControl ctor/dtor
// ----------------------------------------------------------------------------
void wxControl::Init()
{
m_palmControl = false;
m_palmField = false;
}
wxControl::~wxControl()
{
SendDestroyEvent();
SetLabel(wxEmptyString);
DestroyChildren();
uint16_t index;
FormType* form = (FormType*)GetObjectFormIndex(index);
if(form!=NULL && index!=frmInvalidObjectId)
{
FrmRemoveObject((FormType **)&form,index);
}
}
// ----------------------------------------------------------------------------
// control window creation
// ----------------------------------------------------------------------------
bool wxControl::Create(wxWindow *parent,
wxWindowID id,
const wxPoint& pos,
const wxSize& size,
long style,
const wxValidator& wxVALIDATOR_PARAM(validator),
const wxString& name)
{
if ( !wxWindow::Create(parent, id, pos, size, style, name) )
return false;
#if wxUSE_VALIDATORS
SetValidator(validator);
#endif
return true;
}
bool wxControl::PalmCreateControl(int style,
const wxString& label,
const wxPoint& pos,
const wxSize& size,
uint8_t groupID)
{
FormType* form = (FormType*)GetParentForm();
if(form==NULL)
return false;
wxCoord x = pos.x == wxDefaultCoord ? 0 : pos.x,
y = pos.y == wxDefaultCoord ? 0 : pos.y,
w = size.x == wxDefaultCoord ? 1 : size.x,
h = size.y == wxDefaultCoord ? 1 : size.y;
wxWindow *win = this;
while(win->GetParent())
{
win = win->GetParent();
wxPoint pt(win->GetClientAreaOrigin());
x += pt.x;
y += pt.y;
}
ControlType *control = CtlNewControl(
(void **)&form,
GetId(),
(ControlStyleType)style,
NULL,
x,
y,
w,
h,
stdFont,
groupID,
true
);
if(control==NULL)
return false;
m_palmControl = true;
SetInitialSize(size);
SetLabel(label);
Show();
return true;
}
bool wxControl::PalmCreateField(const wxString& label,
const wxPoint& pos,
const wxSize& size,
bool editable,
bool underlined,
int justification)
{
FormType* form = (FormType*)GetParentForm();
if(form==NULL)
return false;
m_label = label;
wxCoord x = pos.x == wxDefaultCoord ? 0 : pos.x,
y = pos.y == wxDefaultCoord ? 0 : pos.y,
w = size.x == wxDefaultCoord ? 1 : size.x,
h = size.y == wxDefaultCoord ? 1 : size.y;
AdjustForParentClientOrigin(x, y);
FieldType *field = FldNewField(
(void **)&form,
GetId(),
x,
y,
w,
h,
stdFont,
10,
editable,
underlined,
false,
false,
(JustificationType)justification,
false,
false,
false
);
if(field==NULL)
return false;
m_palmField = true;
SetInitialSize(size);
SetLabel(label);
Show();
return true;
}
// ----------------------------------------------------------------------------
// various accessors
// ----------------------------------------------------------------------------
WXFORMPTR wxControl::GetParentForm() const
{
wxWindow* parentTLW = GetParent();
while ( parentTLW && !parentTLW->IsTopLevel() )
{
parentTLW = parentTLW->GetParent();
}
wxTopLevelWindowPalm* tlw = wxDynamicCast(parentTLW, wxTopLevelWindowPalm);
if(!tlw)
return NULL;
return tlw->GetForm();
}
WXFORMPTR wxControl::GetObjectFormIndex(uint16_t& index) const
{
FormType* form = (FormType* )GetParentForm();
if(form!=NULL)
index = FrmGetObjectIndex(form, GetId());
else
index = frmInvalidObjectId;
return form;
}
void* wxControl::GetObjectPtr() const
{
uint16_t index;
FormType* form = (FormType*)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,
// it may not really mean sunken at all as we map it to WS_EX_CLIENTEDGE
// which is not sunken at all under Windows XP -- rather, just the default)
return wxBORDER_SUNKEN;
}
void wxControl::SetIntValue(int val)
{
FormType* form = (FormType*)GetParentForm();
if(form==NULL)
return;
uint16_t index = FrmGetObjectIndex(form, GetId());
if(index==frmInvalidObjectId)
return;
FrmSetControlValue(form, index, val);
}
void wxControl::SetBoolValue(bool val)
{
SetIntValue(val?1:0);
}
bool wxControl::GetBoolValue() const
{
FormType* form = (FormType*)GetParentForm();
if(form==NULL)
return false;
uint16_t index = FrmGetObjectIndex(form, GetId());
if(index==frmInvalidObjectId)
return false;
return ( FrmGetControlValue(form, index) == 1 );
}
wxSize wxControl::DoGetBestSize() const
{
return wxSize(16, 16);
}
void wxControl::DoGetBounds( WXRECTANGLEPTR rect ) const
{
if(rect==NULL)
return;
FormType* form = (FormType*)GetParentForm();
if(form==NULL)
return;
uint16_t index = FrmGetObjectIndex(form,GetId());
if(index==frmInvalidObjectId)
return;
FrmGetObjectBounds(form,index,(RectangleType*)rect);
}
void wxControl::DoSetBounds( WXRECTANGLEPTR rect )
{
if(rect==NULL)
return;
FormType* form = (FormType*)GetParentForm();
if(form==NULL)
return;
uint16_t index = FrmGetObjectIndex(form,GetId());
if(index==frmInvalidObjectId)
return;
FrmSetObjectBounds(form,index,(RectangleType*)rect);
}
void wxControl::DoGetPosition( int *x, int *y ) const
{
int ox = 0, oy = 0;
AdjustForParentClientOrigin(ox, oy);
RectangleType rect;
DoGetBounds(&rect);
if(x)
*x = rect.topLeft.x - ox;
if(y)
*y = rect.topLeft.y - oy;
}
void wxControl::DoGetSize( int *width, int *height ) const
{
RectangleType rect;
DoGetBounds(&rect);
if(width)
*width = rect.extent.x;
if(height)
*height = rect.extent.y;
}
void wxControl::DoMoveWindow(int x, int y, int width, int height)
{
wxRect area = GetRect();
RectangleType rect;
rect.topLeft.x = x;
rect.topLeft.y = y;
rect.extent.x = width;
rect.extent.y = height;
DoSetBounds(&rect);
GetParent()->Refresh(true, &area);
}
bool wxControl::Enable(bool enable)
{
ControlType *control = (ControlType *)GetObjectPtr();
if( !IsPalmControl() || (control == NULL))
return false;
if( CtlEnabled(control) == enable)
return false;
CtlSetEnabled( control, enable);
return true;
}
bool wxControl::IsEnabled() const
{
ControlType *control = (ControlType *)GetObjectPtr();
if( !IsPalmControl() || (control == NULL))
return false;
return CtlEnabled(control);
}
bool wxControl::IsShown() const
{
return StatGetAttribute ( statAttrBarVisible , NULL );
}
bool wxControl::Show( bool show )
{
FormType* form = (FormType*)GetParentForm();
if(form==NULL)
return false;
uint16_t index = FrmGetObjectIndex(form,GetId());
if(index==frmInvalidObjectId)
return false;
if(show)
FrmShowObject(form,index);
else
FrmHideObject(form,index);
return true;
}
void wxControl::SetFieldLabel(const wxString& label)
{
FieldType* field = (FieldType*)GetObjectPtr();
if(field==NULL)
return;
uint16_t newSize = label.length() + 1;
MemHandle strHandle = FldGetTextHandle(field);
FldSetTextHandle(field, NULL );
if (strHandle)
{
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, "");
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);
}
#if 0
wxString wxControl::GetLabel()
{
if(IsPalmField())
return GetFieldLabel();
// unlike other native controls, slider has no label
if(IsPalmControl() && !wxDynamicCast(this,wxSlider))
return GetControlLabel();
return wxEmptyString;
}
#endif
/* static */ wxVisualAttributes
wxControl::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant))
{
wxVisualAttributes attrs;
// old school (i.e. not "common") controls use the standard dialog font
// by default
attrs.font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
// most, or at least many, of the controls use the same colours as the
// buttons -- others will have to override this (and possibly simply call
// GetCompositeControlsDefaultAttributes() from their versions)
attrs.colFg = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNTEXT);
attrs.colBg = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE);
return attrs;
}
// another version for the "composite", i.e. non simple controls
/* static */ wxVisualAttributes
wxControl::GetCompositeControlsDefaultAttributes(wxWindowVariant WXUNUSED(variant))
{
wxVisualAttributes attrs;
attrs.font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
attrs.colFg = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT);
attrs.colBg = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
return attrs;
}
// ----------------------------------------------------------------------------
// message handling
// ----------------------------------------------------------------------------
bool wxControl::ProcessCommand(wxCommandEvent& event)
{
return HandleWindowEvent(event);
}
void wxControl::OnEraseBackground(wxEraseEvent& event)
{
}
#endif // wxUSE_CONTROLS