many wxItemContainer-related changes:

1. the main function for item insertion is now DoInsertItems() which allows
   for much more efficient addition of many new items at once
2. the items client data management is done entirely in wxItemContainer
   itself, the derived classes don't have to distinguish between void and
   object client data
3. many fixes for sorted controls, in particular implemented wxCB_SORT support
   in wxGTK combobox


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@47730 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2007-07-26 13:54:14 +00:00
parent 7f73c398d5
commit a236aa2058
98 changed files with 2825 additions and 2678 deletions

View File

@@ -1,6 +1,6 @@
# =========================================================================
# This makefile was generated by
# Bakefile 0.2.1 (http://bakefile.sourceforge.net)
# Bakefile 0.2.2 (http://bakefile.sourceforge.net)
# Do not modify, all changes will be overwritten!
# =========================================================================
@@ -34,6 +34,7 @@ EXTRALIBS_XML = @EXTRALIBS_XML@
EXTRALIBS_HTML = @EXTRALIBS_HTML@
EXTRALIBS_GUI = @EXTRALIBS_GUI@
EXTRALIBS_SDL = @EXTRALIBS_SDL@
CXXWARNINGS = @CXXWARNINGS@
HOST_SUFFIX = @HOST_SUFFIX@
SAMPLES_RPATH_FLAG = @SAMPLES_RPATH_FLAG@
SAMPLES_RPATH_POSTLINK = @SAMPLES_RPATH_POSTLINK@
@@ -47,12 +48,14 @@ WX_VERSION = $(WX_RELEASE).0
LIBDIRNAME = $(wx_top_builddir)/lib
WIDGETS_CXXFLAGS = -D__WX$(TOOLKIT)__ $(__WXUNIV_DEFINE_p) \
$(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) $(__THREAD_DEFINE_p) \
-I$(srcdir) $(__DLLFLAG_p) -I$(srcdir)/../../samples $(CPPFLAGS) $(CXXFLAGS)
-I$(srcdir) $(__DLLFLAG_p) -I$(srcdir)/../../samples $(CXXWARNINGS) \
$(CPPFLAGS) $(CXXFLAGS)
WIDGETS_OBJECTS = \
$(__widgets_os2_lib_res) \
widgets_bmpcombobox.o \
widgets_button.o \
widgets_checkbox.o \
widgets_choice.o \
widgets_clrpicker.o \
widgets_combobox.o \
widgets_datepick.o \
@@ -62,6 +65,7 @@ WIDGETS_OBJECTS = \
widgets_fontpicker.o \
widgets_gauge.o \
widgets_hyperlnk.o \
widgets_itemcontainer.o \
widgets_listbox.o \
widgets_notebook.o \
widgets_odcombobox.o \
@@ -224,6 +228,9 @@ widgets_button.o: $(srcdir)/button.cpp
widgets_checkbox.o: $(srcdir)/checkbox.cpp
$(CXXC) -c -o $@ $(WIDGETS_CXXFLAGS) $(srcdir)/checkbox.cpp
widgets_choice.o: $(srcdir)/choice.cpp
$(CXXC) -c -o $@ $(WIDGETS_CXXFLAGS) $(srcdir)/choice.cpp
widgets_clrpicker.o: $(srcdir)/clrpicker.cpp
$(CXXC) -c -o $@ $(WIDGETS_CXXFLAGS) $(srcdir)/clrpicker.cpp
@@ -251,6 +258,9 @@ widgets_gauge.o: $(srcdir)/gauge.cpp
widgets_hyperlnk.o: $(srcdir)/hyperlnk.cpp
$(CXXC) -c -o $@ $(WIDGETS_CXXFLAGS) $(srcdir)/hyperlnk.cpp
widgets_itemcontainer.o: $(srcdir)/itemcontainer.cpp
$(CXXC) -c -o $@ $(WIDGETS_CXXFLAGS) $(srcdir)/itemcontainer.cpp
widgets_listbox.o: $(srcdir)/listbox.cpp
$(CXXC) -c -o $@ $(WIDGETS_CXXFLAGS) $(srcdir)/listbox.cpp
@@ -285,7 +295,7 @@ widgets_widgets.o: $(srcdir)/widgets.cpp
$(CXXC) -c -o $@ $(WIDGETS_CXXFLAGS) $(srcdir)/widgets.cpp
widgets_sample_rc.o: $(srcdir)/../sample.rc
$(WINDRES) -i$< -o$@ --define __WX$(TOOLKIT)__ $(__WXUNIV_DEFINE_p_2) $(__EXCEPTIONS_DEFINE_p_2) $(__RTTI_DEFINE_p_2) $(__THREAD_DEFINE_p_2) --include-dir $(srcdir) $(__DLLFLAG_p_2) --include-dir $(srcdir)/../../samples $(__RCDEFDIR_p_1) --include-dir $(top_srcdir)/include
$(WINDRES) -i$< -o$@ --define __WX$(TOOLKIT)__ $(__WXUNIV_DEFINE_p_2) $(__EXCEPTIONS_DEFINE_p_2) $(__RTTI_DEFINE_p_2) $(__THREAD_DEFINE_p_2) --include-dir $(srcdir) $(__DLLFLAG_p_2) --include-dir $(srcdir)/../../samples $(__RCDEFDIR_p_1) --include-dir $(top_srcdir)/include
# Include dependency info, if present:

View File

@@ -52,6 +52,7 @@
#include "wx/imaglist.h"
#include "wx/bmpcbox.h"
#include "itemcontainer.h"
#include "widgets.h"
#include "icons/bmpcombobox.xpm"
@@ -82,7 +83,8 @@ enum
BitmapComboBoxPage_Delete,
BitmapComboBoxPage_DeleteText,
BitmapComboBoxPage_DeleteSel,
BitmapComboBoxPage_Combo
BitmapComboBoxPage_Combo,
BitmapComboBoxPage_ContainerTests
};
@@ -90,12 +92,13 @@ enum
// BitmapComboBoxWidgetsPage
// ----------------------------------------------------------------------------
class BitmapComboBoxWidgetsPage : public WidgetsPage
class BitmapComboBoxWidgetsPage : public ItemContainerWidgetsPage
{
public:
BitmapComboBoxWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist);
virtual wxControl *GetWidget() const { return m_combobox; }
virtual wxItemContainer* GetContainer() const { return m_combobox; }
virtual void RecreateWidget() { CreateCombo(); }
// lazy creation of the content
@@ -195,6 +198,7 @@ BEGIN_EVENT_TABLE(BitmapComboBoxWidgetsPage, WidgetsPage)
EVT_BUTTON(BitmapComboBoxPage_AddMany, BitmapComboBoxWidgetsPage::OnButtonAddMany)
EVT_BUTTON(BitmapComboBoxPage_LoadFromFile, BitmapComboBoxWidgetsPage::OnButtonLoadFromFile)
EVT_BUTTON(BitmapComboBoxPage_SetFromFile, BitmapComboBoxWidgetsPage::OnButtonSetFromFile)
EVT_BUTTON(BitmapComboBoxPage_ContainerTests, ItemContainerWidgetsPage::OnButtonTestItemContainer)
EVT_TEXT_ENTER(BitmapComboBoxPage_InsertText, BitmapComboBoxWidgetsPage::OnButtonInsert)
EVT_TEXT(BitmapComboBoxPage_ChangeHeight, BitmapComboBoxWidgetsPage::OnTextChangeHeight)
@@ -233,7 +237,7 @@ IMPLEMENT_WIDGETS_PAGE(BitmapComboBoxWidgetsPage, _T("BitmapCombobox"),
BitmapComboBoxWidgetsPage::BitmapComboBoxWidgetsPage(WidgetsBookCtrl *book,
wxImageList *imaglist)
: WidgetsPage(book, imaglist, bmpcombobox_xpm)
: ItemContainerWidgetsPage(book, imaglist, bmpcombobox_xpm)
{
// init everything
m_chkSort =
@@ -308,6 +312,9 @@ void BitmapComboBoxWidgetsPage::CreateContent()
_T("&Change wxBitmapComboBox contents"));
wxSizer *sizerMiddle = new wxStaticBoxSizer(box2, wxVERTICAL);
btn = new wxButton(this, BitmapComboBoxPage_ContainerTests, _T("Run &tests"));
sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
#if wxUSE_IMAGE
btn = new wxButton(this, BitmapComboBoxPage_AddWidgetIcons, _T("Add &widget icons"));
sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);

453
samples/widgets/choice.cpp Normal file
View File

@@ -0,0 +1,453 @@
/////////////////////////////////////////////////////////////////////////////
// Program: wxWidgets Widgets Sample
// Name: choice.cpp
// Purpose: Part of the widgets sample showing wxChoice
// Created: 23.07.07
// Id: $Id$
// License: wxWindows license
/////////////////////////////////////////////////////////////////////////////
// ============================================================================
// declarations
// ============================================================================
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
// for compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#if wxUSE_CHOICE
// for all others, include the necessary headers
#ifndef WX_PRECOMP
#include "wx/log.h"
#include "wx/bitmap.h"
#include "wx/button.h"
#include "wx/checkbox.h"
#include "wx/choice.h"
#include "wx/combobox.h"
#include "wx/radiobox.h"
#include "wx/statbox.h"
#include "wx/textctrl.h"
#endif
#include "wx/sizer.h"
#include "wx/checklst.h"
#include "itemcontainer.h"
#include "widgets.h"
#include "icons/choice.xpm"
// ----------------------------------------------------------------------------
// constants
// ----------------------------------------------------------------------------
// control ids
enum
{
ChoicePage_Reset = wxID_HIGHEST,
ChoicePage_Add,
ChoicePage_AddText,
ChoicePage_AddSeveral,
ChoicePage_AddMany,
ChoicePage_Clear,
ChoicePage_Change,
ChoicePage_ChangeText,
ChoicePage_Delete,
ChoicePage_DeleteText,
ChoicePage_DeleteSel,
ChoicePage_Choice,
ChoicePage_ContainerTests
};
// ----------------------------------------------------------------------------
// ChoiceWidgetsPage
// ----------------------------------------------------------------------------
class ChoiceWidgetsPage : public ItemContainerWidgetsPage
{
public:
ChoiceWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist);
virtual wxControl *GetWidget() const { return m_choice; }
virtual wxItemContainer* GetContainer() const { return m_choice; }
virtual void RecreateWidget() { CreateChoice(); }
// lazy creation of the content
virtual void CreateContent();
protected:
// event handlers
void OnButtonReset(wxCommandEvent& event);
void OnButtonChange(wxCommandEvent& event);
void OnButtonDelete(wxCommandEvent& event);
void OnButtonDeleteSel(wxCommandEvent& event);
void OnButtonClear(wxCommandEvent& event);
void OnButtonAdd(wxCommandEvent& event);
void OnButtonAddSeveral(wxCommandEvent& event);
void OnButtonAddMany(wxCommandEvent& event);
void OnChoice(wxCommandEvent& event);
void OnCheckOrRadioBox(wxCommandEvent& event);
void OnUpdateUIAddSeveral(wxUpdateUIEvent& event);
void OnUpdateUIClearButton(wxUpdateUIEvent& event);
void OnUpdateUIDeleteButton(wxUpdateUIEvent& event);
void OnUpdateUIDeleteSelButton(wxUpdateUIEvent& event);
void OnUpdateUIResetButton(wxUpdateUIEvent& event);
// reset the choice parameters
void Reset();
// (re)create the choice
void CreateChoice();
// should it be sorted?
bool m_sorted;
// the controls
// ------------
// the checkboxes
wxCheckBox *m_chkSort;
// the choice itself and the sizer it is in
#ifdef __WXWINCE__
wxChoiceBase
#else
wxChoice
#endif
*m_choice;
wxSizer *m_sizerChoice;
// the text entries for "Add/change string" and "Delete" buttons
wxTextCtrl *m_textAdd,
*m_textChange,
*m_textDelete;
private:
DECLARE_EVENT_TABLE()
DECLARE_WIDGETS_PAGE(ChoiceWidgetsPage)
};
// ----------------------------------------------------------------------------
// event tables
// ----------------------------------------------------------------------------
BEGIN_EVENT_TABLE(ChoiceWidgetsPage, WidgetsPage)
EVT_BUTTON(ChoicePage_Reset, ChoiceWidgetsPage::OnButtonReset)
EVT_BUTTON(ChoicePage_Change, ChoiceWidgetsPage::OnButtonChange)
EVT_BUTTON(ChoicePage_Delete, ChoiceWidgetsPage::OnButtonDelete)
EVT_BUTTON(ChoicePage_DeleteSel, ChoiceWidgetsPage::OnButtonDeleteSel)
EVT_BUTTON(ChoicePage_Clear, ChoiceWidgetsPage::OnButtonClear)
EVT_BUTTON(ChoicePage_Add, ChoiceWidgetsPage::OnButtonAdd)
EVT_BUTTON(ChoicePage_AddSeveral, ChoiceWidgetsPage::OnButtonAddSeveral)
EVT_BUTTON(ChoicePage_AddMany, ChoiceWidgetsPage::OnButtonAddMany)
EVT_BUTTON(ChoicePage_ContainerTests, ItemContainerWidgetsPage::OnButtonTestItemContainer)
EVT_TEXT_ENTER(ChoicePage_AddText, ChoiceWidgetsPage::OnButtonAdd)
EVT_TEXT_ENTER(ChoicePage_DeleteText, ChoiceWidgetsPage::OnButtonDelete)
EVT_UPDATE_UI(ChoicePage_Reset, ChoiceWidgetsPage::OnUpdateUIResetButton)
EVT_UPDATE_UI(ChoicePage_AddSeveral, ChoiceWidgetsPage::OnUpdateUIAddSeveral)
EVT_UPDATE_UI(ChoicePage_Clear, ChoiceWidgetsPage::OnUpdateUIClearButton)
EVT_UPDATE_UI(ChoicePage_DeleteText, ChoiceWidgetsPage::OnUpdateUIClearButton)
EVT_UPDATE_UI(ChoicePage_Delete, ChoiceWidgetsPage::OnUpdateUIDeleteButton)
EVT_UPDATE_UI(ChoicePage_Change, ChoiceWidgetsPage::OnUpdateUIDeleteSelButton)
EVT_UPDATE_UI(ChoicePage_ChangeText, ChoiceWidgetsPage::OnUpdateUIDeleteSelButton)
EVT_UPDATE_UI(ChoicePage_DeleteSel, ChoiceWidgetsPage::OnUpdateUIDeleteSelButton)
EVT_CHOICE(ChoicePage_Choice, ChoiceWidgetsPage::OnChoice)
EVT_CHECKBOX(wxID_ANY, ChoiceWidgetsPage::OnCheckOrRadioBox)
EVT_RADIOBOX(wxID_ANY, ChoiceWidgetsPage::OnCheckOrRadioBox)
END_EVENT_TABLE()
// ============================================================================
// implementation
// ============================================================================
#if defined(__WXUNIVERSAL__)
#define FAMILY_CTRLS UNIVERSAL_CTRLS
#else
#define FAMILY_CTRLS NATIVE_CTRLS
#endif
IMPLEMENT_WIDGETS_PAGE(ChoiceWidgetsPage, _T("Choice"),
FAMILY_CTRLS | WITH_ITEMS_CTRLS
);
ChoiceWidgetsPage::ChoiceWidgetsPage(WidgetsBookCtrl *book,
wxImageList *imaglist)
: ItemContainerWidgetsPage(book, imaglist, choice_xpm)
{
// init everything
m_chkSort = (wxCheckBox *)NULL;
m_choice = NULL;
m_sizerChoice = (wxSizer *)NULL;
}
void ChoiceWidgetsPage::CreateContent()
{
/*
What we create here is a frame having 3 panes: style pane is the
leftmost one, in the middle the pane with buttons allowing to perform
miscellaneous choice operations and the pane containing the choice
itself to the right
*/
wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL);
// left pane
wxStaticBox *box = new wxStaticBox(this, wxID_ANY,
_T("&Set choice parameters"));
wxSizer *sizerLeft = new wxStaticBoxSizer(box, wxVERTICAL);
static const wxString modes[] =
{
_T("single"),
_T("extended"),
_T("multiple"),
};
m_chkSort = CreateCheckBoxAndAddToSizer(sizerLeft, _T("&Sort items"));
wxButton *btn = new wxButton(this, ChoicePage_Reset, _T("&Reset"));
sizerLeft->Add(btn, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 15);
// middle pane
wxStaticBox *box2 = new wxStaticBox(this, wxID_ANY,
_T("&Change choice contents"));
wxSizer *sizerMiddle = new wxStaticBoxSizer(box2, wxVERTICAL);
wxSizer *sizerRow = new wxBoxSizer(wxHORIZONTAL);
btn = new wxButton(this, ChoicePage_Add, _T("&Add this string"));
m_textAdd = new wxTextCtrl(this, ChoicePage_AddText, _T("test item 0"));
sizerRow->Add(btn, 0, wxRIGHT, 5);
sizerRow->Add(m_textAdd, 1, wxLEFT, 5);
sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
btn = new wxButton(this, ChoicePage_AddSeveral, _T("&Insert a few strings"));
sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
btn = new wxButton(this, ChoicePage_AddMany, _T("Add &many strings"));
sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
sizerRow = new wxBoxSizer(wxHORIZONTAL);
btn = new wxButton(this, ChoicePage_Change, _T("C&hange current"));
m_textChange = new wxTextCtrl(this, ChoicePage_ChangeText, wxEmptyString);
sizerRow->Add(btn, 0, wxRIGHT, 5);
sizerRow->Add(m_textChange, 1, wxLEFT, 5);
sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
sizerRow = new wxBoxSizer(wxHORIZONTAL);
btn = new wxButton(this, ChoicePage_Delete, _T("&Delete this item"));
m_textDelete = new wxTextCtrl(this, ChoicePage_DeleteText, wxEmptyString);
sizerRow->Add(btn, 0, wxRIGHT, 5);
sizerRow->Add(m_textDelete, 1, wxLEFT, 5);
sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
btn = new wxButton(this, ChoicePage_DeleteSel, _T("Delete &selection"));
sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
btn = new wxButton(this, ChoicePage_Clear, _T("&Clear"));
sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
btn = new wxButton(this, ChoicePage_ContainerTests, _T("Run &tests"));
sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
// right pane
wxSizer *sizerRight = new wxBoxSizer(wxVERTICAL);
m_choice = new wxChoice(this, ChoicePage_Choice);
sizerRight->Add(m_choice, 1, wxGROW | wxALL, 5);
sizerRight->SetMinSize(150, 0);
m_sizerChoice = sizerRight; // save it to modify it later
// the 3 panes panes compose the window
sizerTop->Add(sizerLeft, 0, wxGROW | (wxALL & ~wxLEFT), 10);
sizerTop->Add(sizerMiddle, 1, wxGROW | wxALL, 10);
sizerTop->Add(sizerRight, 1, wxGROW | (wxALL & ~wxRIGHT), 10);
// final initializations
Reset();
SetSizer(sizerTop);
}
// ----------------------------------------------------------------------------
// operations
// ----------------------------------------------------------------------------
void ChoiceWidgetsPage::Reset()
{
m_chkSort->SetValue(false);
}
void ChoiceWidgetsPage::CreateChoice()
{
int flags = ms_defaultFlags;
if ( m_chkSort->GetValue() )
flags |= wxCB_SORT;
wxArrayString items;
if ( m_choice )
{
int count = m_choice->GetCount();
for ( int n = 0; n < count; n++ )
{
items.Add(m_choice->GetString(n));
}
m_sizerChoice->Detach( m_choice );
delete m_choice;
}
m_choice = new wxChoice(this, ChoicePage_Choice,
wxDefaultPosition, wxDefaultSize,
0, NULL,
flags);
m_choice->Set(items);
m_sizerChoice->Add(m_choice, 1, wxGROW | wxALL, 5);
m_sizerChoice->Layout();
}
// ----------------------------------------------------------------------------
// event handlers
// ----------------------------------------------------------------------------
void ChoiceWidgetsPage::OnButtonReset(wxCommandEvent& WXUNUSED(event))
{
Reset();
CreateChoice();
}
void ChoiceWidgetsPage::OnButtonChange(wxCommandEvent& WXUNUSED(event))
{
int selection = m_choice->GetSelection();
if(selection != wxNOT_FOUND)
{
m_choice->SetString(selection, m_textChange->GetValue());
}
}
void ChoiceWidgetsPage::OnButtonDelete(wxCommandEvent& WXUNUSED(event))
{
unsigned long n;
if ( !m_textDelete->GetValue().ToULong(&n) ||
(n >= (unsigned)m_choice->GetCount()) )
{
return;
}
m_choice->Delete(n);
}
void ChoiceWidgetsPage::OnButtonDeleteSel(wxCommandEvent& WXUNUSED(event))
{
int selection = m_choice->GetSelection();
if(selection != wxNOT_FOUND)
{
m_choice->Delete(selection);
}
}
void ChoiceWidgetsPage::OnButtonClear(wxCommandEvent& WXUNUSED(event))
{
m_choice->Clear();
}
void ChoiceWidgetsPage::OnButtonAdd(wxCommandEvent& WXUNUSED(event))
{
static unsigned int s_item = 0;
wxString s = m_textAdd->GetValue();
if ( !m_textAdd->IsModified() )
{
// update the default string
m_textAdd->SetValue(wxString::Format(_T("test item %u"), ++s_item));
}
m_choice->Append(s);
}
void ChoiceWidgetsPage::OnButtonAddMany(wxCommandEvent& WXUNUSED(event))
{
// "many" means 1000 here
wxArrayString strings;
for ( unsigned int n = 0; n < 1000; n++ )
{
strings.Add(wxString::Format(_T("item #%u"), n));
}
m_choice->Append(strings);
}
void ChoiceWidgetsPage::OnButtonAddSeveral(wxCommandEvent& WXUNUSED(event))
{
wxArrayString items;
items.Add(_T("First"));
items.Add(_T("another one"));
items.Add(_T("and the last (very very very very very very very very very very long) one"));
m_choice->Insert(items, 0);
}
void ChoiceWidgetsPage::OnUpdateUIResetButton(wxUpdateUIEvent& event)
{
event.Enable( m_chkSort->GetValue() );
}
void ChoiceWidgetsPage::OnUpdateUIDeleteButton(wxUpdateUIEvent& event)
{
unsigned long n;
event.Enable(m_textDelete->GetValue().ToULong(&n) &&
(n < (unsigned)m_choice->GetCount()));
}
void ChoiceWidgetsPage::OnUpdateUIDeleteSelButton(wxUpdateUIEvent& event)
{
wxArrayInt selections;
event.Enable(m_choice->GetSelection() != wxNOT_FOUND);
}
void ChoiceWidgetsPage::OnUpdateUIClearButton(wxUpdateUIEvent& event)
{
event.Enable(m_choice->GetCount() != 0);
}
void ChoiceWidgetsPage::OnUpdateUIAddSeveral(wxUpdateUIEvent& event)
{
event.Enable(!m_choice->HasFlag(wxCB_SORT));
}
void ChoiceWidgetsPage::OnChoice(wxCommandEvent& event)
{
long sel = event.GetSelection();
m_textDelete->SetValue(wxString::Format(_T("%ld"), sel));
if (event.IsSelection())
wxLogMessage(_T("Choice item %ld selected"), sel);
else
wxLogMessage(_T("Choice item %ld deselected"), sel);
}
void ChoiceWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& WXUNUSED(event))
{
CreateChoice();
}
#endif // wxUSE_CHOICE

View File

@@ -41,6 +41,7 @@
#include "wx/sizer.h"
#include "itemcontainer.h"
#include "widgets.h"
#if 1
#include "icons/combobox.xpm"
@@ -70,7 +71,8 @@ enum
ComboPage_DeleteSel,
ComboPage_SetValue,
ComboPage_SetValueText,
ComboPage_Combo
ComboPage_Combo,
ComboPage_ContainerTests
};
// kinds of comboboxes
@@ -85,12 +87,13 @@ enum
// ComboboxWidgetsPage
// ----------------------------------------------------------------------------
class ComboboxWidgetsPage : public WidgetsPage
class ComboboxWidgetsPage : public ItemContainerWidgetsPage
{
public:
ComboboxWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist);
virtual wxControl *GetWidget() const { return m_combobox; }
virtual wxItemContainer* GetContainer() const { return m_combobox; }
virtual void RecreateWidget() { CreateCombo(); }
// lazy creation of the content
@@ -175,6 +178,7 @@ BEGIN_EVENT_TABLE(ComboboxWidgetsPage, WidgetsPage)
EVT_BUTTON(ComboPage_AddMany, ComboboxWidgetsPage::OnButtonAddMany)
EVT_BUTTON(ComboPage_SetValue, ComboboxWidgetsPage::OnButtonSetValue)
EVT_BUTTON(ComboPage_SetCurrent, ComboboxWidgetsPage::OnButtonSetCurrent)
EVT_BUTTON(ComboPage_ContainerTests, ItemContainerWidgetsPage::OnButtonTestItemContainer)
EVT_TEXT_ENTER(ComboPage_InsertText, ComboboxWidgetsPage::OnButtonInsert)
EVT_TEXT_ENTER(ComboPage_AddText, ComboboxWidgetsPage::OnButtonAdd)
@@ -217,7 +221,7 @@ IMPLEMENT_WIDGETS_PAGE(ComboboxWidgetsPage, _T("Combobox"),
ComboboxWidgetsPage::ComboboxWidgetsPage(WidgetsBookCtrl *book,
wxImageList *imaglist)
: WidgetsPage(book, imaglist, combobox_xpm)
: ItemContainerWidgetsPage(book, imaglist, combobox_xpm)
{
// init everything
m_chkSort =
@@ -331,6 +335,9 @@ void ComboboxWidgetsPage::CreateContent()
&m_textSetValue);
sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
btn = new wxButton(this, ComboPage_ContainerTests, _T("Run &tests"));
sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
// right pane

View File

@@ -0,0 +1,27 @@
/* XPM */
static char * choice_xpm[] = {
/* width height ncolors chars_per_pixel */
"16 16 5 1",
/* colors */
" s None c None",
". c #000000",
"+ c #c0c0c0",
"@ c #808080",
"# c #ffffff",
/* pixels */
"@@@@@@@@@@@@@@@@",
"@..............@",
"@.########+++++@",
"@.########.....@",
"@.########+...+@",
"@.########++.++@",
"@.+++++++++++++@",
"@@@@@@@@@@@@@@@@",
" ##############",
" ..............",
" .#########+.+.",
" .#########....",
" .#########+++.",
" .#########....",
" .#########+.+.",
" .............."};

View File

@@ -0,0 +1,288 @@
/////////////////////////////////////////////////////////////////////////////
// Program: wxWidgets Widgets Sample
// Name: itemcontainer.cpp
// Purpose: Part of the widgets sample showing wxComboBox
// Created: 20.07.07
// Id: $Id$
// License: wxWindows license
/////////////////////////////////////////////////////////////////////////////
// ============================================================================
// declarations
// ============================================================================
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
// for compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
// for all others, include the necessary headers
#ifndef WX_PRECOMP
#include "wx/log.h"
#include "wx/event.h"
#endif
#include "wx/ctrlsub.h"
#include "itemcontainer.h"
// Help track client data objects in wxItemContainer instances.
class TrackedClientData : public wxClientData
{
public:
TrackedClientData(ItemContainerWidgetsPage* tracker, int value)
: m_tracker(tracker),
m_value(value)
{
m_tracker->StartTrackingData();
}
virtual ~TrackedClientData()
{
m_tracker->StopTrackingData();
}
int GetValue() const
{
return m_value;
}
private:
ItemContainerWidgetsPage *m_tracker;
int m_value;
DECLARE_NO_COPY_CLASS(TrackedClientData)
};
// ============================================================================
// implementation
// ============================================================================
ItemContainerWidgetsPage::ItemContainerWidgetsPage(WidgetsBookCtrl *book,
wxImageList *image_list,
char* icon[])
: WidgetsPage(book, image_list, icon), m_trackedDataObjects(0)
{
m_items.Add(_T("This"));
m_items.Add(_T("is"));
m_items.Add(_T("a"));
m_items.Add(_T("List"));
m_items.Add(_T("of"));
m_items.Add(_T("strings"));
m_itemsSorted = m_items;
}
ItemContainerWidgetsPage::~ItemContainerWidgetsPage()
{
}
wxClientData* ItemContainerWidgetsPage::CreateClientData(int value)
{
return new TrackedClientData(this, value);
}
void ItemContainerWidgetsPage::StartTrackingData()
{
++m_trackedDataObjects;
}
void ItemContainerWidgetsPage::StopTrackingData()
{
--m_trackedDataObjects;
}
bool ItemContainerWidgetsPage::VerifyAllClientDataDestroyed()
{
if ( m_trackedDataObjects )
{
wxString message = _T("Bug in managing wxClientData: ");
if ( m_trackedDataObjects > 0 )
message << m_trackedDataObjects << _T(" lost objects");
else
message << (-m_trackedDataObjects) << _T(" extra deletes");
wxFAIL_MSG(message);
return false;
}
return true;
}
void ItemContainerWidgetsPage::StartTest(const wxString& label)
{
m_container->Clear();
wxLogMessage(_T("Test - %s:"), label.c_str());
}
void ItemContainerWidgetsPage::EndTest(const wxArrayString& items)
{
const unsigned count = m_container->GetCount();
bool ok = count == items.GetCount();
if ( !ok )
{
wxFAIL_MSG(_T("Item count does not match."));
}
else
{
for ( unsigned i = 0; i < count; ++i )
{
wxString str = m_container->GetString(i);
if ( str != items[i] )
{
wxFAIL_MSG(wxString::Format(
_T("Wrong string \"%s\" at position %d (expected \"%s\")"),
str.c_str(), i, items[i].c_str()));
ok = false;
break;
}
if ( m_container->HasClientUntypedData() )
{
void *data = m_container->GetClientData(i);
if ( data && !VerifyClientData((wxUIntPtr)data, str) )
{
ok = false;
break;
}
}
else if ( m_container->HasClientObjectData() )
{
TrackedClientData* obj = (TrackedClientData*)m_container->GetClientObject(i);
if ( obj && !VerifyClientData(obj->GetValue(), str) )
{
ok = false;
break;
}
}
}
if ( !ok )
{
wxLogMessage(DumpContainerData(items));
}
}
m_container->Clear();
ok &= VerifyAllClientDataDestroyed();
wxLogMessage(_T("...%s"), ok ? _T("passed") : _T("failed"));
}
wxString
ItemContainerWidgetsPage::DumpContainerData(const wxArrayString& expected) const
{
wxString str;
str << _T("Current content:\n");
unsigned i;
for ( i = 0; i < m_container->GetCount(); ++i )
{
str << _T(" - ") << m_container->GetString(i) << _T(" [");
if ( m_container->HasClientObjectData() )
{
TrackedClientData *
obj = (TrackedClientData*)m_container->GetClientObject(i);
if ( obj )
str << obj->GetValue();
}
else if ( m_container->HasClientUntypedData() )
{
void *data = m_container->GetClientData(i);
if ( data )
str << (wxUIntPtr)data;
}
str << _T("]\n");
}
str << _T("Expected content:\n");
for ( i = 0; i < expected.GetCount(); ++i )
{
const wxString& item = expected[i];
str << _T(" - ") << item << _T("[");
for( unsigned j = 0; j < m_items.GetCount(); ++j )
{
if ( m_items[j] == item )
str << j;
}
str << _T("]\n");
}
return str;
}
bool ItemContainerWidgetsPage::VerifyClientData(wxUIntPtr i, const wxString& str)
{
if ( i > m_items.GetCount() || m_items[i] != str )
{
wxLogMessage(_T("Client data for '%s' does not match."), str.c_str());
return false;
}
return true;
}
void ItemContainerWidgetsPage::OnButtonTestItemContainer(wxCommandEvent&)
{
m_container = GetContainer();
wxASSERT_MSG(m_container, _T("Widget must have a test widget"));
wxLogMessage(_T("wxItemContainer test for %s, %s:"),
GetWidget()->GetClassInfo()->GetClassName(),
(m_container->IsSorted() ? "Sorted" : "Unsorted"));
const wxArrayString
& expected_result = m_container->IsSorted() ? m_itemsSorted
: m_items;
StartTest(_T("Append one item"));
wxString item = m_items[0];
m_container->Append(item);
EndTest(wxArrayString(1, &item));
StartTest(_T("Append some items"));
m_container->Append(m_items);
EndTest(expected_result);
StartTest(_T("Append some items with data objects"));
wxClientData **objects = new wxClientData *[m_items.GetCount()];
for ( unsigned i = 0; i < m_items.GetCount(); ++i )
objects[i] = CreateClientData(i);
m_container->Append(m_items, objects);
EndTest(expected_result);
delete[] objects;
StartTest(_T("Append some items with data"));
void **data = new void *[m_items.GetCount()];
for ( unsigned i = 0; i < m_items.GetCount(); ++i )
data[i] = (void*)i;
m_container->Append(m_items, data);
EndTest(expected_result);
delete[] data;
StartTest(_T("Append some items with data, one by one"));
for ( unsigned i = 0; i < m_items.GetCount(); ++i )
m_container->Append(m_items[i], (void*)i);
EndTest(expected_result);
StartTest(_T("Append some items with data objects, one by one"));
for ( unsigned i = 0; i < m_items.GetCount(); ++i )
m_container->Append(m_items[i], CreateClientData(i));
EndTest(expected_result);
if ( !m_container->IsSorted() )
{
StartTest(_T("Insert in reverse order with data, one by one"));
for ( unsigned i = m_items.GetCount(); i; --i )
m_container->Insert(m_items[i - 1], 0, (void*)(i - 1));
EndTest(expected_result);
}
}

View File

@@ -0,0 +1,53 @@
/////////////////////////////////////////////////////////////////////////////
// Program: wxWidgets Widgets Sample
// Name: itemcontainer.h
// Purpose: Part of the widgets sample showing wxComboBox
// Created: 20.07.07
// Id: $Id$
// License: wxWindows license
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_SAMPLE_WIDGETS_ITEMCONTAINER_H_
#define _WX_SAMPLE_WIDGETS_ITEMCONTAINER_H_
// for compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
#include "widgets.h"
class ItemContainerWidgetsPage : public WidgetsPage
{
public:
ItemContainerWidgetsPage(WidgetsBookCtrl *book,
wxImageList *image_list,
char* icon[]);
virtual ~ItemContainerWidgetsPage();
void OnButtonTestItemContainer(wxCommandEvent& event);
virtual wxItemContainer* GetContainer() const = 0;
private:
void StartTest(const wxString& label);
void EndTest(const wxArrayString& result);
// Track client data in wxItemContainer instances
wxClientData* CreateClientData(int value);
void StartTrackingData();
void StopTrackingData();
friend class TrackedClientData;
bool VerifyAllClientDataDestroyed();
bool VerifyClientData(wxUIntPtr i, const wxString& str);
wxString DumpContainerData(const wxArrayString& expected) const;
wxArrayString m_items;
wxSortedArrayString m_itemsSorted;
int m_trackedDataObjects;
// holds pointer to the widget being tested
wxItemContainer *m_container;
};
#endif // _WX_SAMPLE_WIDGETS_ITEMCONTAINER_H_

View File

@@ -44,6 +44,7 @@
#include "wx/checklst.h"
#include "itemcontainer.h"
#include "widgets.h"
#include "icons/listbox.xpm"
@@ -66,19 +67,21 @@ enum
ListboxPage_Delete,
ListboxPage_DeleteText,
ListboxPage_DeleteSel,
ListboxPage_Listbox
ListboxPage_Listbox,
ListboxPage_ContainerTests
};
// ----------------------------------------------------------------------------
// ListboxWidgetsPage
// ----------------------------------------------------------------------------
class ListboxWidgetsPage : public WidgetsPage
class ListboxWidgetsPage : public ItemContainerWidgetsPage
{
public:
ListboxWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist);
virtual wxControl *GetWidget() const { return m_lbox; }
virtual wxItemContainer* GetContainer() const { return m_lbox; }
virtual void RecreateWidget() { CreateLbox(); }
// lazy creation of the content
@@ -177,6 +180,7 @@ BEGIN_EVENT_TABLE(ListboxWidgetsPage, WidgetsPage)
EVT_BUTTON(ListboxPage_Add, ListboxWidgetsPage::OnButtonAdd)
EVT_BUTTON(ListboxPage_AddSeveral, ListboxWidgetsPage::OnButtonAddSeveral)
EVT_BUTTON(ListboxPage_AddMany, ListboxWidgetsPage::OnButtonAddMany)
EVT_BUTTON(ListboxPage_ContainerTests, ItemContainerWidgetsPage::OnButtonTestItemContainer)
EVT_TEXT_ENTER(ListboxPage_AddText, ListboxWidgetsPage::OnButtonAdd)
EVT_TEXT_ENTER(ListboxPage_DeleteText, ListboxWidgetsPage::OnButtonDelete)
@@ -214,7 +218,7 @@ IMPLEMENT_WIDGETS_PAGE(ListboxWidgetsPage, _T("Listbox"),
ListboxWidgetsPage::ListboxWidgetsPage(WidgetsBookCtrl *book,
wxImageList *imaglist)
: WidgetsPage(book, imaglist, listbox_xpm)
: ItemContainerWidgetsPage(book, imaglist, listbox_xpm)
{
// init everything
m_radioSelMode = (wxRadioBox *)NULL;
@@ -315,6 +319,9 @@ void ListboxWidgetsPage::CreateContent()
btn = new wxButton(this, ListboxPage_Clear, _T("&Clear"));
sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
btn = new wxButton(this, ListboxPage_ContainerTests, _T("Run &tests"));
sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
// right pane
wxSizer *sizerRight = new wxBoxSizer(wxVERTICAL);
m_lbox = new wxListBox(this, ListboxPage_Listbox,

View File

@@ -1,6 +1,6 @@
# =========================================================================
# This makefile was generated by
# Bakefile 0.2.1 (http://bakefile.sourceforge.net)
# Bakefile 0.2.2 (http://bakefile.sourceforge.net)
# Do not modify, all changes will be overwritten!
# =========================================================================
@@ -22,9 +22,10 @@ BCCDIR = $(MAKEDIR)\..
### Variables: ###
WX_RELEASE_NODOT = 29
COMPILER_PREFIX = bcc
OBJS = \
bcc_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WXDLLFLAG)$(CFG)
LIBDIRNAME = .\..\..\lib\bcc_$(LIBTYPE_SUFFIX)$(CFG)
$(COMPILER_PREFIX)_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WXDLLFLAG)$(CFG)
LIBDIRNAME = .\..\..\lib\$(COMPILER_PREFIX)_$(LIBTYPE_SUFFIX)$(CFG)
SETUPHDIR = \
$(LIBDIRNAME)\$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)
WIDGETS_CXXFLAGS = $(__RUNTIME_LIBS_7) -I$(BCCDIR)\include $(__DEBUGINFO) \
@@ -37,6 +38,7 @@ WIDGETS_OBJECTS = \
$(OBJS)\widgets_bmpcombobox.obj \
$(OBJS)\widgets_button.obj \
$(OBJS)\widgets_checkbox.obj \
$(OBJS)\widgets_choice.obj \
$(OBJS)\widgets_clrpicker.obj \
$(OBJS)\widgets_combobox.obj \
$(OBJS)\widgets_datepick.obj \
@@ -46,6 +48,7 @@ WIDGETS_OBJECTS = \
$(OBJS)\widgets_fontpicker.obj \
$(OBJS)\widgets_gauge.obj \
$(OBJS)\widgets_hyperlnk.obj \
$(OBJS)\widgets_itemcontainer.obj \
$(OBJS)\widgets_listbox.obj \
$(OBJS)\widgets_notebook.obj \
$(OBJS)\widgets_odcombobox.obj \
@@ -269,6 +272,9 @@ $(OBJS)\widgets_button.obj: .\button.cpp
$(OBJS)\widgets_checkbox.obj: .\checkbox.cpp
$(CXX) -q -c -P -o$@ $(WIDGETS_CXXFLAGS) $**
$(OBJS)\widgets_choice.obj: .\choice.cpp
$(CXX) -q -c -P -o$@ $(WIDGETS_CXXFLAGS) $**
$(OBJS)\widgets_clrpicker.obj: .\clrpicker.cpp
$(CXX) -q -c -P -o$@ $(WIDGETS_CXXFLAGS) $**
@@ -296,6 +302,9 @@ $(OBJS)\widgets_gauge.obj: .\gauge.cpp
$(OBJS)\widgets_hyperlnk.obj: .\hyperlnk.cpp
$(CXX) -q -c -P -o$@ $(WIDGETS_CXXFLAGS) $**
$(OBJS)\widgets_itemcontainer.obj: .\itemcontainer.cpp
$(CXX) -q -c -P -o$@ $(WIDGETS_CXXFLAGS) $**
$(OBJS)\widgets_listbox.obj: .\listbox.cpp
$(CXX) -q -c -P -o$@ $(WIDGETS_CXXFLAGS) $**
@@ -330,5 +339,5 @@ $(OBJS)\widgets_widgets.obj: .\widgets.cpp
$(CXX) -q -c -P -o$@ $(WIDGETS_CXXFLAGS) $**
$(OBJS)\widgets_sample.res: .\..\sample.rc
brcc32 -32 -r -fo$@ -i$(BCCDIR)\include -d__WXMSW__ $(__WXUNIV_DEFINE_p_1) $(__DEBUG_DEFINE_p_1) $(__EXCEPTIONS_DEFINE_p_1) $(__RTTI_DEFINE_p_1) $(__THREAD_DEFINE_p_1) $(__UNICODE_DEFINE_p_1) $(__MSLU_DEFINE_p_1) $(__GFXCTX_DEFINE_p_1) -i$(SETUPHDIR) -i.\..\..\include -i. $(__DLLFLAG_p_1) -i.\..\..\samples -dNOPCH $**
brcc32 -32 -r -fo$@ -i$(BCCDIR)\include -d__WXMSW__ $(__WXUNIV_DEFINE_p_1) $(__DEBUG_DEFINE_p_1) $(__EXCEPTIONS_DEFINE_p_1) $(__RTTI_DEFINE_p_1) $(__THREAD_DEFINE_p_1) $(__UNICODE_DEFINE_p_1) $(__MSLU_DEFINE_p_1) $(__GFXCTX_DEFINE_p_1) -i$(SETUPHDIR) -i.\..\..\include -i. $(__DLLFLAG_p_1) -i.\..\..\samples -dNOPCH $**

View File

@@ -1,6 +1,6 @@
# =========================================================================
# This makefile was generated by
# Bakefile 0.2.1 (http://bakefile.sourceforge.net)
# Bakefile 0.2.2 (http://bakefile.sourceforge.net)
# Do not modify, all changes will be overwritten!
# =========================================================================
@@ -14,9 +14,10 @@ include ../../build/msw/config.gcc
CPPDEPS = -MT$@ -MF$@.d -MD
WX_RELEASE_NODOT = 29
COMPILER_PREFIX = gcc
OBJS = \
gcc_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WXDLLFLAG)$(CFG)
LIBDIRNAME = .\..\..\lib\gcc_$(LIBTYPE_SUFFIX)$(CFG)
$(COMPILER_PREFIX)_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WXDLLFLAG)$(CFG)
LIBDIRNAME = .\..\..\lib\$(COMPILER_PREFIX)_$(LIBTYPE_SUFFIX)$(CFG)
SETUPHDIR = \
$(LIBDIRNAME)\$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)
WIDGETS_CXXFLAGS = $(__DEBUGINFO) $(__OPTIMIZEFLAG_2) $(__THREADSFLAG) \
@@ -30,6 +31,7 @@ WIDGETS_OBJECTS = \
$(OBJS)\widgets_bmpcombobox.o \
$(OBJS)\widgets_button.o \
$(OBJS)\widgets_checkbox.o \
$(OBJS)\widgets_choice.o \
$(OBJS)\widgets_clrpicker.o \
$(OBJS)\widgets_combobox.o \
$(OBJS)\widgets_datepick.o \
@@ -39,6 +41,7 @@ WIDGETS_OBJECTS = \
$(OBJS)\widgets_fontpicker.o \
$(OBJS)\widgets_gauge.o \
$(OBJS)\widgets_hyperlnk.o \
$(OBJS)\widgets_itemcontainer.o \
$(OBJS)\widgets_listbox.o \
$(OBJS)\widgets_notebook.o \
$(OBJS)\widgets_odcombobox.o \
@@ -262,6 +265,9 @@ $(OBJS)\widgets_button.o: ./button.cpp
$(OBJS)\widgets_checkbox.o: ./checkbox.cpp
$(CXX) -c -o $@ $(WIDGETS_CXXFLAGS) $(CPPDEPS) $<
$(OBJS)\widgets_choice.o: ./choice.cpp
$(CXX) -c -o $@ $(WIDGETS_CXXFLAGS) $(CPPDEPS) $<
$(OBJS)\widgets_clrpicker.o: ./clrpicker.cpp
$(CXX) -c -o $@ $(WIDGETS_CXXFLAGS) $(CPPDEPS) $<
@@ -289,6 +295,9 @@ $(OBJS)\widgets_gauge.o: ./gauge.cpp
$(OBJS)\widgets_hyperlnk.o: ./hyperlnk.cpp
$(CXX) -c -o $@ $(WIDGETS_CXXFLAGS) $(CPPDEPS) $<
$(OBJS)\widgets_itemcontainer.o: ./itemcontainer.cpp
$(CXX) -c -o $@ $(WIDGETS_CXXFLAGS) $(CPPDEPS) $<
$(OBJS)\widgets_listbox.o: ./listbox.cpp
$(CXX) -c -o $@ $(WIDGETS_CXXFLAGS) $(CPPDEPS) $<
@@ -323,7 +332,7 @@ $(OBJS)\widgets_widgets.o: ./widgets.cpp
$(CXX) -c -o $@ $(WIDGETS_CXXFLAGS) $(CPPDEPS) $<
$(OBJS)\widgets_sample_rc.o: ./../sample.rc
windres --use-temp-file -i$< -o$@ --define __WXMSW__ $(__WXUNIV_DEFINE_p_1) $(__DEBUG_DEFINE_p_1) $(__EXCEPTIONS_DEFINE_p_1) $(__RTTI_DEFINE_p_1) $(__THREAD_DEFINE_p_1) $(__UNICODE_DEFINE_p_1) $(__MSLU_DEFINE_p_1) $(__GFXCTX_DEFINE_p_1) --include-dir $(SETUPHDIR) --include-dir ./../../include --include-dir . $(__DLLFLAG_p_1) --include-dir ./../../samples --define NOPCH
windres --use-temp-file -i$< -o$@ --define __WXMSW__ $(__WXUNIV_DEFINE_p_1) $(__DEBUG_DEFINE_p_1) $(__EXCEPTIONS_DEFINE_p_1) $(__RTTI_DEFINE_p_1) $(__THREAD_DEFINE_p_1) $(__UNICODE_DEFINE_p_1) $(__MSLU_DEFINE_p_1) $(__GFXCTX_DEFINE_p_1) --include-dir $(SETUPHDIR) --include-dir ./../../include --include-dir . $(__DLLFLAG_p_1) --include-dir ./../../samples --define NOPCH
.PHONY: all clean

View File

@@ -1,6 +1,6 @@
# =========================================================================
# This makefile was generated by
# Bakefile 0.2.1 (http://bakefile.sourceforge.net)
# Bakefile 0.2.2 (http://bakefile.sourceforge.net)
# Do not modify, all changes will be overwritten!
# =========================================================================
@@ -11,34 +11,34 @@
# -------------------------------------------------------------------------
# C++ compiler
CXX = g++
CXX := g++
# Standard flags for C++
CXXFLAGS =
CXXFLAGS :=
# Standard preprocessor flags (common for CC and CXX)
CPPFLAGS =
CPPFLAGS :=
# Standard linker flags
LDFLAGS =
LDFLAGS :=
# Location and arguments of wx-config script
WX_CONFIG = wx-config
WX_CONFIG := wx-config
# Port of the wx library to build against [gtk1,gtk2,msw,x11,motif,mgl,mac,$(shell $(WX_CONFIG) --selected-config | cut -d '-' -f 1)]
WX_PORT = $(shell $(WX_CONFIG) --selected-config | cut -d '-' -f 1)
# Port of the wx library to build against [gtk1,gtk2,msw,x11,motif,mgl,mac,dfb]
WX_PORT := $(shell $(WX_CONFIG) --selected-config | cut -d '-' -f 1)
# Use DLL build of wx library to use? [0,1,$(shell if test -z `$(WX_CONFIG) --selected-config | cut -d '-' -f 5`; then echo 1; else echo 0; fi)]
WX_SHARED = $(shell if test -z `$(WX_CONFIG) --selected-config | cut -d '-' -f 5`; then echo 1; else echo 0; fi)
# Use DLL build of wx library to use? [0,1]
WX_SHARED := $(shell if test -z `$(WX_CONFIG) --selected-config | cut -d '-' -f 5`; then echo 1; else echo 0; fi)
# Compile Unicode build of wxWidgets? [0,1,$(shell $(WX_CONFIG) --selected-config | cut -d '-' -f 2 | sed 's/unicode/1/;s/ansi/0/')]
WX_UNICODE = $(shell $(WX_CONFIG) --selected-config | cut -d '-' -f 2 | sed 's/unicode/1/;s/ansi/0/')
# Compile Unicode build of wxWidgets? [0,1]
WX_UNICODE := $(shell $(WX_CONFIG) --selected-config | cut -d '-' -f 2 | sed 's/unicode/1/;s/ansi/0/')
# Use debug build of wxWidgets (define __WXDEBUG__)? [0,1,$(shell $(WX_CONFIG) --selected-config | cut -d '-' -f 3 | sed 's/debug/1/;s/release/0/')]
WX_DEBUG = $(shell $(WX_CONFIG) --selected-config | cut -d '-' -f 3 | sed 's/debug/1/;s/release/0/')
# Use debug build of wxWidgets (define __WXDEBUG__)? [0,1]
WX_DEBUG := $(shell $(WX_CONFIG) --selected-config | cut -d '-' -f 3 | sed 's/debug/1/;s/release/0/')
# Version of the wx library to build against.
WX_VERSION = $(shell $(WX_CONFIG) --selected-config | sed -e 's/.*-\([0-9]*\)\.\([0-9]*\)$$/\1\2/')
WX_VERSION := $(shell $(WX_CONFIG) --selected-config | sed -e 's/.*-\([0-9]*\)\.\([0-9]*\)$$/\1\2/')
@@ -60,6 +60,7 @@ WIDGETS_OBJECTS = \
widgets_bmpcombobox.o \
widgets_button.o \
widgets_checkbox.o \
widgets_choice.o \
widgets_clrpicker.o \
widgets_combobox.o \
widgets_datepick.o \
@@ -69,6 +70,7 @@ WIDGETS_OBJECTS = \
widgets_fontpicker.o \
widgets_gauge.o \
widgets_hyperlnk.o \
widgets_itemcontainer.o \
widgets_listbox.o \
widgets_notebook.o \
widgets_odcombobox.o \
@@ -131,6 +133,9 @@ widgets_button.o: ./button.cpp
widgets_checkbox.o: ./checkbox.cpp
$(CXX) -c -o $@ $(WIDGETS_CXXFLAGS) $(CPPDEPS) $<
widgets_choice.o: ./choice.cpp
$(CXX) -c -o $@ $(WIDGETS_CXXFLAGS) $(CPPDEPS) $<
widgets_clrpicker.o: ./clrpicker.cpp
$(CXX) -c -o $@ $(WIDGETS_CXXFLAGS) $(CPPDEPS) $<
@@ -158,6 +163,9 @@ widgets_gauge.o: ./gauge.cpp
widgets_hyperlnk.o: ./hyperlnk.cpp
$(CXX) -c -o $@ $(WIDGETS_CXXFLAGS) $(CPPDEPS) $<
widgets_itemcontainer.o: ./itemcontainer.cpp
$(CXX) -c -o $@ $(WIDGETS_CXXFLAGS) $(CPPDEPS) $<
widgets_listbox.o: ./listbox.cpp
$(CXX) -c -o $@ $(WIDGETS_CXXFLAGS) $(CPPDEPS) $<

View File

@@ -1,6 +1,6 @@
# =========================================================================
# This makefile was generated by
# Bakefile 0.2.1 (http://bakefile.sourceforge.net)
# Bakefile 0.2.2 (http://bakefile.sourceforge.net)
# Do not modify, all changes will be overwritten!
# =========================================================================
@@ -13,9 +13,11 @@
### Variables: ###
WX_RELEASE_NODOT = 29
COMPILER_PREFIX = vc
OBJS = \
vc_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WXDLLFLAG)$(CFG)$(DIR_SUFFIX_CPU)
LIBDIRNAME = .\..\..\lib\vc$(DIR_SUFFIX_CPU)_$(LIBTYPE_SUFFIX)$(CFG)
$(COMPILER_PREFIX)_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WXDLLFLAG)$(CFG)$(DIR_SUFFIX_CPU)
LIBDIRNAME = \
.\..\..\lib\$(COMPILER_PREFIX)$(DIR_SUFFIX_CPU)_$(LIBTYPE_SUFFIX)$(CFG)
SETUPHDIR = \
$(LIBDIRNAME)\$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)
WIDGETS_CXXFLAGS = /M$(__RUNTIME_LIBS_8)$(__DEBUGRUNTIME_3) /DWIN32 \
@@ -30,6 +32,7 @@ WIDGETS_OBJECTS = \
$(OBJS)\widgets_bmpcombobox.obj \
$(OBJS)\widgets_button.obj \
$(OBJS)\widgets_checkbox.obj \
$(OBJS)\widgets_choice.obj \
$(OBJS)\widgets_clrpicker.obj \
$(OBJS)\widgets_combobox.obj \
$(OBJS)\widgets_datepick.obj \
@@ -39,6 +42,7 @@ WIDGETS_OBJECTS = \
$(OBJS)\widgets_fontpicker.obj \
$(OBJS)\widgets_gauge.obj \
$(OBJS)\widgets_hyperlnk.obj \
$(OBJS)\widgets_itemcontainer.obj \
$(OBJS)\widgets_listbox.obj \
$(OBJS)\widgets_notebook.obj \
$(OBJS)\widgets_odcombobox.obj \
@@ -344,6 +348,9 @@ $(OBJS)\widgets_button.obj: .\button.cpp
$(OBJS)\widgets_checkbox.obj: .\checkbox.cpp
$(CXX) /c /nologo /TP /Fo$@ $(WIDGETS_CXXFLAGS) $**
$(OBJS)\widgets_choice.obj: .\choice.cpp
$(CXX) /c /nologo /TP /Fo$@ $(WIDGETS_CXXFLAGS) $**
$(OBJS)\widgets_clrpicker.obj: .\clrpicker.cpp
$(CXX) /c /nologo /TP /Fo$@ $(WIDGETS_CXXFLAGS) $**
@@ -371,6 +378,9 @@ $(OBJS)\widgets_gauge.obj: .\gauge.cpp
$(OBJS)\widgets_hyperlnk.obj: .\hyperlnk.cpp
$(CXX) /c /nologo /TP /Fo$@ $(WIDGETS_CXXFLAGS) $**
$(OBJS)\widgets_itemcontainer.obj: .\itemcontainer.cpp
$(CXX) /c /nologo /TP /Fo$@ $(WIDGETS_CXXFLAGS) $**
$(OBJS)\widgets_listbox.obj: .\listbox.cpp
$(CXX) /c /nologo /TP /Fo$@ $(WIDGETS_CXXFLAGS) $**

View File

@@ -1,6 +1,6 @@
# =========================================================================
# This makefile was generated by
# Bakefile 0.2.1 (http://bakefile.sourceforge.net)
# Bakefile 0.2.2 (http://bakefile.sourceforge.net)
# Do not modify, all changes will be overwritten!
# =========================================================================
@@ -225,9 +225,10 @@ __DLLFLAG_p = -dWXUSINGDLL
### Variables: ###
WX_RELEASE_NODOT = 29
COMPILER_PREFIX = wat
OBJS = &
wat_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WXDLLFLAG)$(CFG)
LIBDIRNAME = .\..\..\lib\wat_$(LIBTYPE_SUFFIX)$(CFG)
$(COMPILER_PREFIX)_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WXDLLFLAG)$(CFG)
LIBDIRNAME = .\..\..\lib\$(COMPILER_PREFIX)_$(LIBTYPE_SUFFIX)$(CFG)
SETUPHDIR = &
$(LIBDIRNAME)\$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)
WIDGETS_CXXFLAGS = $(__DEBUGINFO_0) $(__OPTIMIZEFLAG_2) $(__THREADSFLAG_5) &
@@ -241,6 +242,7 @@ WIDGETS_OBJECTS = &
$(OBJS)\widgets_bmpcombobox.obj &
$(OBJS)\widgets_button.obj &
$(OBJS)\widgets_checkbox.obj &
$(OBJS)\widgets_choice.obj &
$(OBJS)\widgets_clrpicker.obj &
$(OBJS)\widgets_combobox.obj &
$(OBJS)\widgets_datepick.obj &
@@ -250,6 +252,7 @@ WIDGETS_OBJECTS = &
$(OBJS)\widgets_fontpicker.obj &
$(OBJS)\widgets_gauge.obj &
$(OBJS)\widgets_hyperlnk.obj &
$(OBJS)\widgets_itemcontainer.obj &
$(OBJS)\widgets_listbox.obj &
$(OBJS)\widgets_notebook.obj &
$(OBJS)\widgets_odcombobox.obj &
@@ -300,6 +303,9 @@ $(OBJS)\widgets_button.obj : .AUTODEPEND .\button.cpp
$(OBJS)\widgets_checkbox.obj : .AUTODEPEND .\checkbox.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(WIDGETS_CXXFLAGS) $<
$(OBJS)\widgets_choice.obj : .AUTODEPEND .\choice.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(WIDGETS_CXXFLAGS) $<
$(OBJS)\widgets_clrpicker.obj : .AUTODEPEND .\clrpicker.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(WIDGETS_CXXFLAGS) $<
@@ -327,6 +333,9 @@ $(OBJS)\widgets_gauge.obj : .AUTODEPEND .\gauge.cpp
$(OBJS)\widgets_hyperlnk.obj : .AUTODEPEND .\hyperlnk.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(WIDGETS_CXXFLAGS) $<
$(OBJS)\widgets_itemcontainer.obj : .AUTODEPEND .\itemcontainer.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(WIDGETS_CXXFLAGS) $<
$(OBJS)\widgets_listbox.obj : .AUTODEPEND .\listbox.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(WIDGETS_CXXFLAGS) $<
@@ -361,5 +370,5 @@ $(OBJS)\widgets_widgets.obj : .AUTODEPEND .\widgets.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(WIDGETS_CXXFLAGS) $<
$(OBJS)\widgets_sample.res : .AUTODEPEND .\..\sample.rc
wrc -q -ad -bt=nt -r -fo=$^@ -d__WXMSW__ $(__WXUNIV_DEFINE_p) $(__DEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) $(__THREAD_DEFINE_p) $(__UNICODE_DEFINE_p) $(__GFXCTX_DEFINE_p) -i=$(SETUPHDIR) -i=.\..\..\include -i=. $(__DLLFLAG_p) -i=.\..\..\samples -dNOPCH $<
wrc -q -ad -bt=nt -r -fo=$^@ -d__WXMSW__ $(__WXUNIV_DEFINE_p) $(__DEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) $(__THREAD_DEFINE_p) $(__UNICODE_DEFINE_p) $(__GFXCTX_DEFINE_p) -i=$(SETUPHDIR) -i=.\..\..\include -i=. $(__DLLFLAG_p) -i=.\..\..\samples -dNOPCH $<

View File

@@ -45,6 +45,7 @@
#include "wx/odcombo.h"
#include "itemcontainer.h"
#include "widgets.h"
#include "icons/odcombobox.xpm"
@@ -76,7 +77,8 @@ enum
ODComboPage_Delete,
ODComboPage_DeleteText,
ODComboPage_DeleteSel,
ODComboPage_Combo
ODComboPage_Combo,
ODComboPage_ContainerTests
};
@@ -84,12 +86,13 @@ enum
// ODComboboxWidgetsPage
// ----------------------------------------------------------------------------
class ODComboboxWidgetsPage : public WidgetsPage
class ODComboboxWidgetsPage : public ItemContainerWidgetsPage
{
public:
ODComboboxWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist);
virtual wxControl *GetWidget() const { return m_combobox; }
virtual wxItemContainer* GetContainer() const { return m_combobox; }
virtual void RecreateWidget() { CreateCombo(); }
// lazy creation of the content
@@ -188,6 +191,7 @@ BEGIN_EVENT_TABLE(ODComboboxWidgetsPage, WidgetsPage)
EVT_BUTTON(ODComboPage_Add, ODComboboxWidgetsPage::OnButtonAdd)
EVT_BUTTON(ODComboPage_AddSeveral, ODComboboxWidgetsPage::OnButtonAddSeveral)
EVT_BUTTON(ODComboPage_AddMany, ODComboboxWidgetsPage::OnButtonAddMany)
EVT_BUTTON(ODComboPage_ContainerTests, ItemContainerWidgetsPage::OnButtonTestItemContainer)
EVT_TEXT_ENTER(ODComboPage_InsertText, ODComboboxWidgetsPage::OnButtonInsert)
EVT_TEXT_ENTER(ODComboPage_AddText, ODComboboxWidgetsPage::OnButtonAdd)
@@ -296,7 +300,7 @@ IMPLEMENT_WIDGETS_PAGE(ODComboboxWidgetsPage, _T("OwnerDrawnCombobox"),
ODComboboxWidgetsPage::ODComboboxWidgetsPage(WidgetsBookCtrl *book,
wxImageList *imaglist)
: WidgetsPage(book, imaglist, odcombobox_xpm)
: ItemContainerWidgetsPage(book, imaglist, odcombobox_xpm)
{
// init everything
m_chkSort =
@@ -394,6 +398,9 @@ void ODComboboxWidgetsPage::CreateContent()
_T("&Change combobox contents"));
wxSizer *sizerMiddle = new wxStaticBoxSizer(box2, wxVERTICAL);
btn = new wxButton(this, ODComboPage_ContainerTests, _T("Run &tests"));
sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
sizerRow = CreateSizerWithTextAndLabel(_T("Current selection"),
ODComboPage_CurText,
&text);

View File

@@ -9,6 +9,7 @@
bmpcombobox.cpp
button.cpp
checkbox.cpp
choice.cpp
clrpicker.cpp
combobox.cpp
datepick.cpp
@@ -18,6 +19,7 @@
fontpicker.cpp
gauge.cpp
hyperlnk.cpp
itemcontainer.cpp
listbox.cpp
notebook.cpp
odcombobox.cpp

View File

@@ -480,6 +480,10 @@ SOURCE=.\checkbox.cpp
# End Source File
# Begin Source File
SOURCE=.\choice.cpp
# End Source File
# Begin Source File
SOURCE=.\clrpicker.cpp
# End Source File
# Begin Source File
@@ -516,6 +520,10 @@ SOURCE=.\hyperlnk.cpp
# End Source File
# Begin Source File
SOURCE=.\itemcontainer.cpp
# End Source File
# Begin Source File
SOURCE=.\listbox.cpp
# End Source File
# Begin Source File