made switching from/to multiple selection mode work better (doesn't require recreating the control any more)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10886 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2001-07-07 16:52:27 +00:00
parent 4d4d8bbfad
commit 776a33cfd3
2 changed files with 109 additions and 99 deletions

View File

@ -95,6 +95,12 @@ END_EVENT_TABLE()
IMPLEMENT_APP(MyApp) IMPLEMENT_APP(MyApp)
// number of items in list/report view
static const int NUM_ITEMS = 30;
// number of items in icon/small icon view
static const int NUM_ICONS = 9;
int wxCALLBACK MyCompareFunction(long item1, long item2, long sortData) int wxCALLBACK MyCompareFunction(long item1, long item2, long sortData)
{ {
// inverse the order // inverse the order
@ -197,30 +203,13 @@ MyFrame::MyFrame(const wxChar *title, int x, int y, int w, int h)
menubar->Append(menuCol, _T("&Colour")); menubar->Append(menuCol, _T("&Colour"));
SetMenuBar(menubar); SetMenuBar(menubar);
m_listCtrl = new MyListCtrl(this, LIST_CTRL,
wxDefaultPosition, wxDefaultSize,
wxLC_REPORT | //wxLC_LIST |
wxSUNKEN_BORDER |
wxLC_EDIT_LABELS |
wxLC_SINGLE_SEL
);
m_logWindow = new wxTextCtrl(this, -1, wxEmptyString, m_logWindow = new wxTextCtrl(this, -1, wxEmptyString,
wxDefaultPosition, wxDefaultSize, wxDefaultPosition, wxDefaultSize,
wxTE_MULTILINE | wxSUNKEN_BORDER); wxTE_MULTILINE | wxSUNKEN_BORDER);
m_logOld = wxLog::SetActiveTarget(new wxLogTextCtrl(m_logWindow)); m_logOld = wxLog::SetActiveTarget(new wxLogTextCtrl(m_logWindow));
#if 0 RecreateList(wxLC_REPORT | wxLC_SINGLE_SEL);
for ( int i = 0; i < 30; i++ )
{
long idx = m_listCtrl->InsertItem(i, wxString::Format(_T("Item %d"), i));
m_listCtrl->SetItemData(idx, i*i);
}
#else
wxCommandEvent event;
OnReportView(event);
#endif
CreateStatusBar(3); CreateStatusBar(3);
} }
@ -278,16 +267,67 @@ void MyFrame::OnSelectAll(wxCommandEvent& WXUNUSED(event))
m_listCtrl->SetItemState(i,wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED); m_listCtrl->SetItemState(i,wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED);
} }
// ----------------------------------------------------------------------------
// changing listctrl modes
// ----------------------------------------------------------------------------
void MyFrame::RecreateList(long flags, bool withText)
{
// we could avoid recreating it if we don't set/clear the wxLC_VIRTUAL
// style, but it is more trouble to do it than not
#if 0
if ( !m_listCtrl || ((flags & wxLC_VIRTUAL) !=
(m_listCtrl->GetWindowStyleFlag() & wxLC_VIRTUAL)) )
#endif
{
delete m_listCtrl;
m_listCtrl = new MyListCtrl(this, LIST_CTRL,
wxDefaultPosition, wxDefaultSize,
flags |
wxSUNKEN_BORDER);
switch ( flags & wxLC_MASK_TYPE )
{
case wxLC_LIST:
InitWithListItems();
break;
case wxLC_ICON:
InitWithIconItems(withText);
break;
case wxLC_SMALL_ICON:
InitWithIconItems(withText, TRUE);
break;
case wxLC_REPORT:
if ( flags & wxLC_VIRTUAL )
InitWithVirtualItems();
else
InitWithReportItems();
break;
default:
wxFAIL_MSG( _T("unknown listctrl mode") );
}
}
#ifdef __WXMSW__
SendSizeEvent();
#endif
m_logWindow->Clear();
}
void MyFrame::OnListView(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnListView(wxCommandEvent& WXUNUSED(event))
{ {
m_listCtrl->ClearAll(); RecreateList(wxLC_LIST);
m_logWindow->Clear(); }
m_listCtrl->SetSingleStyle(wxLC_LIST); void MyFrame::InitWithListItems()
m_listCtrl->SetImageList((wxImageList *) NULL, wxIMAGE_LIST_NORMAL); {
m_listCtrl->SetImageList((wxImageList *) NULL, wxIMAGE_LIST_SMALL); for ( int i = 0; i < NUM_ITEMS; i++ )
for ( int i=0; i < 30; i++)
{ {
m_listCtrl->InsertItem(i, wxString::Format(_T("Item %d"), i)); m_listCtrl->InsertItem(i, wxString::Format(_T("Item %d"), i));
} }
@ -295,11 +335,11 @@ void MyFrame::OnListView(wxCommandEvent& WXUNUSED(event))
void MyFrame::OnReportView(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnReportView(wxCommandEvent& WXUNUSED(event))
{ {
m_logWindow->Clear(); RecreateList(wxLC_REPORT);
m_listCtrl->ClearAll(); }
m_listCtrl->SetSingleStyle(wxLC_REPORT); void MyFrame::InitWithReportItems()
m_listCtrl->SetImageList((wxImageList *) NULL, wxIMAGE_LIST_NORMAL); {
m_listCtrl->SetImageList(m_imageListSmall, wxIMAGE_LIST_SMALL); m_listCtrl->SetImageList(m_imageListSmall, wxIMAGE_LIST_SMALL);
m_listCtrl->InsertColumn(0, "Column 1"); // , wxLIST_FORMAT_LEFT, 140); m_listCtrl->InsertColumn(0, "Column 1"); // , wxLIST_FORMAT_LEFT, 140);
@ -312,7 +352,6 @@ void MyFrame::OnReportView(wxCommandEvent& WXUNUSED(event))
wxStopWatch sw; wxStopWatch sw;
wxString buf; wxString buf;
static const int NUM_ITEMS = 30;//00;
for ( int i = 0; i < NUM_ITEMS; i++ ) for ( int i = 0; i < NUM_ITEMS; i++ )
{ {
buf.Printf(_T("This is item %d"), i); buf.Printf(_T("This is item %d"), i);
@ -353,93 +392,60 @@ void MyFrame::OnReportView(wxCommandEvent& WXUNUSED(event))
m_listCtrl->SetColumnWidth( 2, wxLIST_AUTOSIZE ); m_listCtrl->SetColumnWidth( 2, wxLIST_AUTOSIZE );
} }
void MyFrame::OnIconView(wxCommandEvent& WXUNUSED(event)) void MyFrame::InitWithIconItems(bool withText, bool sameIcon)
{ {
m_logWindow->Clear();
m_listCtrl->ClearAll();
m_listCtrl->SetSingleStyle(wxLC_ICON);
m_listCtrl->SetImageList(m_imageListNormal, wxIMAGE_LIST_NORMAL); m_listCtrl->SetImageList(m_imageListNormal, wxIMAGE_LIST_NORMAL);
m_listCtrl->SetImageList(m_imageListSmall, wxIMAGE_LIST_SMALL); m_listCtrl->SetImageList(m_imageListSmall, wxIMAGE_LIST_SMALL);
for ( int i=0; i < 9; i++) for ( int i = 0; i < NUM_ICONS; i++ )
{ {
m_listCtrl->InsertItem(i, i); int image = sameIcon ? 0 : i;
if ( withText )
{
m_listCtrl->InsertItem(i, wxString::Format(_T("Label %d"), i),
image);
}
else
{
m_listCtrl->InsertItem(i, image);
}
} }
} }
void MyFrame::OnIconView(wxCommandEvent& WXUNUSED(event))
{
RecreateList(wxLC_ICON, FALSE);
}
void MyFrame::OnIconTextView(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnIconTextView(wxCommandEvent& WXUNUSED(event))
{ {
m_logWindow->Clear(); RecreateList(wxLC_ICON);
m_listCtrl->ClearAll();
m_listCtrl->SetSingleStyle(wxLC_ICON);
m_listCtrl->SetImageList(m_imageListNormal, wxIMAGE_LIST_NORMAL);
m_listCtrl->SetImageList(m_imageListSmall, wxIMAGE_LIST_SMALL);
for ( int i=0; i < 9; i++)
{
wxChar buf[20];
wxSprintf(buf, _T("Label %d"), i);
m_listCtrl->InsertItem(i, buf, i);
}
} }
void MyFrame::OnSmallIconView(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnSmallIconView(wxCommandEvent& WXUNUSED(event))
{ {
m_logWindow->Clear(); RecreateList(wxLC_SMALL_ICON, FALSE);
m_listCtrl->ClearAll();
m_listCtrl->SetSingleStyle(wxLC_SMALL_ICON);
m_listCtrl->SetImageList(m_imageListNormal, wxIMAGE_LIST_NORMAL);
m_listCtrl->SetImageList(m_imageListSmall, wxIMAGE_LIST_SMALL);
for ( int i=0; i < 9; i++)
{
m_listCtrl->InsertItem(i, 0);
}
} }
void MyFrame::OnSmallIconTextView(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnSmallIconTextView(wxCommandEvent& WXUNUSED(event))
{ {
m_logWindow->Clear(); RecreateList(wxLC_SMALL_ICON);
m_listCtrl->ClearAll();
m_listCtrl->SetSingleStyle(wxLC_SMALL_ICON);
m_listCtrl->SetImageList(m_imageListNormal, wxIMAGE_LIST_NORMAL);
m_listCtrl->SetImageList(m_imageListSmall, wxIMAGE_LIST_SMALL);
for ( int i=0; i < 9; i++)
{
m_listCtrl->InsertItem(i, "Label", 0);
}
} }
void MyFrame::OnVirtualView(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnVirtualView(wxCommandEvent& WXUNUSED(event))
{ {
m_logWindow->Clear(); RecreateList(wxLC_REPORT | wxLC_VIRTUAL);
}
// we really have to recreate it
delete m_listCtrl;
m_listCtrl = new MyListCtrl(this, LIST_CTRL,
wxDefaultPosition, wxDefaultSize,
wxLC_REPORT |
wxSUNKEN_BORDER |
wxLC_SINGLE_SEL |
wxLC_VIRTUAL
);
void MyFrame::InitWithVirtualItems()
{
m_listCtrl->InsertColumn(0, "First Column"); m_listCtrl->InsertColumn(0, "First Column");
m_listCtrl->InsertColumn(1, "Second Column"); m_listCtrl->InsertColumn(1, "Second Column");
m_listCtrl->SetColumnWidth(0, 150); m_listCtrl->SetColumnWidth(0, 150);
m_listCtrl->SetColumnWidth(1, 150); m_listCtrl->SetColumnWidth(1, 150);
m_listCtrl->SetItemCount(1000000); m_listCtrl->SetItemCount(1000000);
#ifdef __WXMSW__
SendSizeEvent();
#endif
} }
void MyFrame::OnSort(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnSort(wxCommandEvent& WXUNUSED(event))
@ -471,21 +477,16 @@ void MyFrame::OnUpdateShowColInfo(wxUpdateUIEvent& event)
void MyFrame::OnToggleMultiSel(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnToggleMultiSel(wxCommandEvent& WXUNUSED(event))
{ {
m_logWindow->WriteText("Current selection mode: ");
long flags = m_listCtrl->GetWindowStyleFlag(); long flags = m_listCtrl->GetWindowStyleFlag();
if ( flags & wxLC_SINGLE_SEL ) if ( flags & wxLC_SINGLE_SEL )
{ flags &= ~wxLC_SINGLE_SEL;
m_logWindow->WriteText("multiple\n");
m_listCtrl->SetWindowStyleFlag(flags & ~wxLC_SINGLE_SEL);
}
else else
{ flags |= wxLC_SINGLE_SEL;
m_logWindow->WriteText("single\n");
m_listCtrl->SetWindowStyleFlag(flags | wxLC_SINGLE_SEL);
}
m_logWindow->WriteText("Recreate the control now\n"); m_logWindow->WriteText(wxString::Format("Current selection mode: %sle\n",
(flags & wxLC_SINGLE_SEL) ? "sing" : "multip"));
RecreateList(flags);
} }
void MyFrame::OnSetFgColour(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnSetFgColour(wxCommandEvent& WXUNUSED(event))

View File

@ -91,6 +91,15 @@ public:
wxImageList *m_imageListSmall; wxImageList *m_imageListSmall;
private: private:
// recreate the list control with the new flags
void RecreateList(long flags, bool withText = TRUE);
// fill the control with items depending on the view
void InitWithListItems();
void InitWithReportItems();
void InitWithIconItems(bool withText, bool sameIcon = FALSE);
void InitWithVirtualItems();
wxLog *m_logOld; wxLog *m_logOld;
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()