wxWidgets/include/wx/pickerbase.h

177 lines
5.2 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// Name: wx/pickerbase.h
// Purpose: wxPickerBase definition
// Author: Francesco Montorsi (based on Vadim Zeitlin's code)
// Modified by:
// Created: 14/4/2006
// Copyright: (c) Vadim Zeitlin, Francesco Montorsi
// RCS-ID: $Id$
// Licence: wxWindows Licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PICKERBASE_H_BASE_
#define _WX_PICKERBASE_H_BASE_
#include "wx/control.h"
class WXDLLIMPEXP_CORE wxTextCtrl;
extern WXDLLEXPORT_DATA(const wxChar) wxButtonNameStr[];
// ----------------------------------------------------------------------------
// wxPickerBase is the base class for the picker controls which support
// a wxPB_USE_TEXTCTRL style; i.e. for those pickers which can use an auxiliary
// text control next to the 'real' picker.
//
// The wxTextPickerHelper class manages enabled/disabled state of the text control,
// its sizing and positioning.
// ----------------------------------------------------------------------------
#define wxPB_USE_TEXTCTRL 0x0002
class WXDLLIMPEXP_CORE wxPickerBase : public wxControl
{
public:
// ctor: text is the associated text control
wxPickerBase() : m_text(NULL), m_picker(NULL), m_sizer(NULL)
{ m_container.SetContainerWindow(this); }
virtual ~wxPickerBase() {}
// if present, intercepts wxPB_USE_TEXTCTRL style and creates the text control
// The 3rd argument is the initial wxString to display in the text control
bool CreateBase(wxWindow *parent, wxWindowID id,
const wxString& text = wxEmptyString,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize, long style = 0,
const wxValidator& validator = wxDefaultValidator,
const wxString& name = wxButtonNameStr);
public: // public API
// margin between the text control and the picker
void SetInternalMargin(int newmargin)
{ GetTextCtrlItem()->SetBorder(newmargin); m_sizer->Layout(); }
int GetInternalMargin() const
{ return GetTextCtrlItem()->GetBorder(); }
// proportion of the text control respect the picker
// (which has a fixed proportion value of 1)
void SetTextCtrlProportion(int prop)
{ GetTextCtrlItem()->SetProportion(prop); m_sizer->Layout(); }
int GetTextCtrlProportion() const
{ return GetTextCtrlItem()->GetProportion(); }
bool IsTextCtrlGrowable() const
{ return (GetTextCtrlItem()->GetFlag() & wxGROW) != 0; }
void SetTextCtrlGrowable(bool grow = true)
{
int f = GetDefaultTextCtrlFlag();
if ( grow )
f |= wxGROW;
else
f &= ~wxGROW;
GetTextCtrlItem()->SetFlag(f);
}
bool IsPickerCtrlGrowable() const
{ return (GetPickerCtrlItem()->GetFlag() & wxGROW) != 0; }
void SetPickerCtrlGrowable(bool grow = true)
{
int f = GetDefaultPickerCtrlFlag();
if ( grow )
f |= wxGROW;
else
f &= ~wxGROW;
GetPickerCtrlItem()->SetFlag(f);
}
bool HasTextCtrl() const
{ return m_text != NULL; }
wxTextCtrl *GetTextCtrl()
{ return m_text; }
wxControl *GetPickerCtrl()
{ return m_picker; }
public: // methods that derived class must/may override
virtual void UpdatePickerFromTextCtrl() = 0;
virtual void UpdateTextCtrlFromPicker() = 0;
protected: // utility functions
// event handlers
void OnTextCtrlDelete(wxWindowDestroyEvent &);
void OnTextCtrlUpdate(wxCommandEvent &);
void OnTextCtrlKillFocus(wxFocusEvent &);
void OnSize(wxSizeEvent &);
// returns the set of styles for the attached wxTextCtrl
// from given wxPickerBase's styles
virtual long GetTextCtrlStyle(long style) const
{ return (style & wxWINDOW_STYLE_MASK); }
// returns the set of styles for the m_picker
virtual long GetPickerStyle(long style) const
{ return (style & wxWINDOW_STYLE_MASK); }
wxSizerItem *GetPickerCtrlItem() const
{
if (this->HasTextCtrl())
return m_sizer->GetItem((size_t)1);
return m_sizer->GetItem((size_t)0);
}
wxSizerItem *GetTextCtrlItem() const
{
wxASSERT(this->HasTextCtrl());
return m_sizer->GetItem((size_t)0);
}
int GetDefaultPickerCtrlFlag() const
{
// on macintosh, without additional borders
// there's not enough space for focus rect
return wxALIGN_CENTER_VERTICAL|wxGROW
#ifdef __WXMAC__
| wxTOP | wxRIGHT | wxBOTTOM
#endif
;
}
int GetDefaultTextCtrlFlag() const
{
// on macintosh, without wxALL there's not enough space for focus rect
return wxALIGN_CENTER_VERTICAL
#ifdef __WXMAC__
| wxALL
#else
| wxRIGHT
#endif
;
}
void PostCreation();
protected:
wxTextCtrl *m_text; // can be NULL
wxControl *m_picker;
wxBoxSizer *m_sizer;
private:
DECLARE_ABSTRACT_CLASS(wxPickerBase)
DECLARE_EVENT_TABLE()
// This class must be something just like a panel...
WX_DECLARE_CONTROL_CONTAINER();
};
#endif
// _WX_PICKERBASE_H_BASE_