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:
parent
4d4d8bbfad
commit
776a33cfd3
@ -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))
|
||||||
|
@ -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()
|
||||||
|
Loading…
Reference in New Issue
Block a user