X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/776a33cfd3efe66e053146e34085833f01523b35..8262f9aecb42cefb62a6c574812a2db3dcc33661:/samples/listctrl/listtest.cpp?ds=sidebyside diff --git a/samples/listctrl/listtest.cpp b/samples/listctrl/listtest.cpp index 8a966df2b5..c1fd9dc512 100644 --- a/samples/listctrl/listtest.cpp +++ b/samples/listctrl/listtest.cpp @@ -60,6 +60,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(LIST_SMALL_ICON_TEXT_VIEW, MyFrame::OnSmallIconTextView) EVT_MENU(LIST_VIRTUAL_VIEW, MyFrame::OnVirtualView) + EVT_MENU(LIST_FOCUS_LAST, MyFrame::OnFocusLast) EVT_MENU(LIST_TOGGLE_FIRST, MyFrame::OnToggleFirstSel) EVT_MENU(LIST_DESELECT_ALL, MyFrame::OnDeselectAll) EVT_MENU(LIST_SELECT_ALL, MyFrame::OnSelectAll) @@ -71,6 +72,9 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(LIST_SET_BG_COL, MyFrame::OnSetBgColour) EVT_MENU(LIST_TOGGLE_MULTI_SEL, MyFrame::OnToggleMultiSel) EVT_MENU(LIST_SHOW_COL_INFO, MyFrame::OnShowColInfo) + EVT_MENU(LIST_SHOW_SEL_INFO, MyFrame::OnShowSelInfo) + EVT_MENU(LIST_FREEZE, MyFrame::OnFreeze) + EVT_MENU(LIST_THAW, MyFrame::OnThaw) EVT_UPDATE_UI(LIST_SHOW_COL_INFO, MyFrame::OnUpdateShowColInfo) END_EVENT_TABLE() @@ -88,7 +92,15 @@ BEGIN_EVENT_TABLE(MyListCtrl, wxListCtrl) EVT_LIST_ITEM_DESELECTED(LIST_CTRL, MyListCtrl::OnDeselected) EVT_LIST_KEY_DOWN(LIST_CTRL, MyListCtrl::OnListKeyDown) EVT_LIST_ITEM_ACTIVATED(LIST_CTRL, MyListCtrl::OnActivated) + EVT_LIST_ITEM_FOCUSED(LIST_CTRL, MyListCtrl::OnFocused) + EVT_LIST_COL_CLICK(LIST_CTRL, MyListCtrl::OnColClick) + EVT_LIST_COL_RIGHT_CLICK(LIST_CTRL, MyListCtrl::OnColRightClick) + EVT_LIST_COL_BEGIN_DRAG(LIST_CTRL, MyListCtrl::OnColBeginDrag) + EVT_LIST_COL_DRAGGING(LIST_CTRL, MyListCtrl::OnColDragging) + EVT_LIST_COL_END_DRAG(LIST_CTRL, MyListCtrl::OnColEndDrag) + + EVT_LIST_CACHE_HINT(LIST_CTRL, MyListCtrl::OnCacheHint) EVT_CHAR(MyListCtrl::OnChar) END_EVENT_TABLE() @@ -111,7 +123,7 @@ int wxCALLBACK MyCompareFunction(long item1, long item2, long sortData) bool MyApp::OnInit() { // Create the main frame window - MyFrame *frame = new MyFrame("wxListCtrl Test", 50, 50, 450, 340); + MyFrame *frame = new MyFrame(wxT("wxListCtrl Test"), 50, 50, 450, 340); // Show the frame frame->Show(TRUE); @@ -178,10 +190,13 @@ MyFrame::MyFrame(const wxChar *title, int x, int y, int w, int h) menuView->Append(LIST_VIRTUAL_VIEW, _T("Virtual view\tF7")); wxMenu *menuList = new wxMenu; - menuList->Append(LIST_TOGGLE_FIRST, _T("&Toggle first item\tCtrl-T")); + menuList->Append(LIST_FOCUS_LAST, _T("&Make last item current\tCtrl-L")); + menuList->Append(LIST_TOGGLE_FIRST, _T("To&ggle first item\tCtrl-G")); menuList->Append(LIST_DESELECT_ALL, _T("&Deselect All\tCtrl-D")); menuList->Append(LIST_SELECT_ALL, _T("S&elect All\tCtrl-A")); + menuList->AppendSeparator(); menuList->Append(LIST_SHOW_COL_INFO, _T("Show &column info\tCtrl-C")); + menuList->Append(LIST_SHOW_SEL_INFO, _T("Show &selected items\tCtrl-S")); menuList->AppendSeparator(); menuList->Append(LIST_SORT, _T("&Sort\tCtrl-S")); menuList->AppendSeparator(); @@ -189,6 +204,9 @@ MyFrame::MyFrame(const wxChar *title, int x, int y, int w, int h) menuList->Append(LIST_DELETE, _T("&Delete first item\tCtrl-X")); menuList->Append(LIST_DELETE_ALL, _T("Delete &all items")); menuList->AppendSeparator(); + menuList->Append(LIST_FREEZE, _T("Free&ze\tCtrl-Z")); + menuList->Append(LIST_THAW, _T("Tha&w\tCtrl-W")); + menuList->AppendSeparator(); menuList->Append(LIST_TOGGLE_MULTI_SEL, _T("&Multiple selection\tCtrl-M"), _T("Toggle multiple selection"), TRUE); @@ -248,6 +266,32 @@ void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) dialog.ShowModal(); } +void MyFrame::OnFreeze(wxCommandEvent& event) +{ + wxLogMessage(_T("Freezing the control")); + + m_listCtrl->Freeze(); +} + +void MyFrame::OnThaw(wxCommandEvent& event) +{ + wxLogMessage(_T("Thawing the control")); + + m_listCtrl->Thaw(); +} + +void MyFrame::OnFocusLast(wxCommandEvent& WXUNUSED(event)) +{ + long index = m_listCtrl->GetItemCount() - 1; + if ( index == -1 ) + { + return; + } + + m_listCtrl->SetItemState(index, wxLIST_STATE_FOCUSED, wxLIST_STATE_FOCUSED); + m_listCtrl->EnsureVisible(index); +} + void MyFrame::OnToggleFirstSel(wxCommandEvent& WXUNUSED(event)) { m_listCtrl->SetItemState(0, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED); @@ -342,27 +386,32 @@ void MyFrame::InitWithReportItems() { m_listCtrl->SetImageList(m_imageListSmall, wxIMAGE_LIST_SMALL); + // under MSW for SetColumnWidth() to work we need to create the items with + // images initially +#if 1 + wxListItem itemCol; + itemCol.m_mask = wxLIST_MASK_TEXT | wxLIST_MASK_IMAGE; + itemCol.m_text = "Column 1"; + itemCol.m_image = -1; + m_listCtrl->InsertColumn(0, itemCol); + itemCol.m_text = "Column 2"; + m_listCtrl->InsertColumn(1, itemCol); + itemCol.m_text = "Column 3"; + m_listCtrl->InsertColumn(2, itemCol); +#else m_listCtrl->InsertColumn(0, "Column 1"); // , wxLIST_FORMAT_LEFT, 140); m_listCtrl->InsertColumn(1, "Column 2"); // , wxLIST_FORMAT_LEFT, 140); m_listCtrl->InsertColumn(2, "One More Column (2)"); // , wxLIST_FORMAT_LEFT, 140); +#endif // to speed up inserting we hide the control temporarily m_listCtrl->Hide(); wxStopWatch sw; - wxString buf; for ( int i = 0; i < NUM_ITEMS; i++ ) { - buf.Printf(_T("This is item %d"), i); - long tmp = m_listCtrl->InsertItem(i, buf, 0); - m_listCtrl->SetItemData(tmp, i); - - buf.Printf(_T("Col 1, item %d"), i); - tmp = m_listCtrl->SetItem(i, 1, buf); - - buf.Printf(_T("Item %d in column 2"), i); - tmp = m_listCtrl->SetItem(i, 2, buf); + m_listCtrl->InsertItemInReportView(i); } m_logWindow->WriteText(wxString::Format(_T("%d items inserted in %ldms\n"), @@ -459,13 +508,39 @@ void MyFrame::OnSort(wxCommandEvent& WXUNUSED(event)) sw.Time())); } +void MyFrame::OnShowSelInfo(wxCommandEvent& event) +{ + int selCount = m_listCtrl->GetSelectedItemCount(); + wxLogMessage(_T("%d items selected:"), selCount); + + // don't show too many items + size_t shownCount = 0; + + long item = m_listCtrl->GetNextItem(-1, wxLIST_NEXT_ALL, + wxLIST_STATE_SELECTED); + while ( item != -1 ) + { + wxLogMessage(_T("\t%ld (%s)"), + item, m_listCtrl->GetItemText(item).c_str()); + + if ( ++shownCount > 10 ) + { + wxLogMessage(_T("\t... more selected items snipped...")); + break; + } + + item = m_listCtrl->GetNextItem(item, wxLIST_NEXT_ALL, + wxLIST_STATE_SELECTED); + } +} + void MyFrame::OnShowColInfo(wxCommandEvent& event) { int count = m_listCtrl->GetColumnCount(); - wxLogMessage("%d columns:", count); + wxLogMessage(wxT("%d columns:"), count); for ( int c = 0; c < count; c++ ) { - wxLogMessage("\tcolumn %d has width %d", c, + wxLogMessage(wxT("\tcolumn %d has width %d"), c, m_listCtrl->GetColumnWidth(c)); } } @@ -483,7 +558,7 @@ void MyFrame::OnToggleMultiSel(wxCommandEvent& WXUNUSED(event)) else flags |= wxLC_SINGLE_SEL; - m_logWindow->WriteText(wxString::Format("Current selection mode: %sle\n", + m_logWindow->WriteText(wxString::Format(wxT("Current selection mode: %sle\n"), (flags & wxLC_SINGLE_SEL) ? "sing" : "multip")); RecreateList(flags); @@ -531,31 +606,74 @@ void MyFrame::OnDeleteAll(wxCommandEvent& WXUNUSED(event)) // MyListCtrl +void MyListCtrl::OnCacheHint(wxListEvent& event) +{ + wxLogMessage( wxT("OnCacheHint: cache items %ld..%ld"), + event.GetCacheFrom(), event.GetCacheTo() ); +} + +void MyListCtrl::SetColumnImage(int col, int image) +{ + wxListItem item; + item.SetMask(wxLIST_MASK_IMAGE); + item.SetImage(image); + SetColumn(col, item); +} + void MyListCtrl::OnColClick(wxListEvent& event) { - wxLogMessage( "OnColumnClick at %d.", event.GetColumn() ); + int col = event.GetColumn(); + SetColumnImage(col, 0); + + wxLogMessage( wxT("OnColumnClick at %d."), col ); +} + +void MyListCtrl::OnColRightClick(wxListEvent& event) +{ + int col = event.GetColumn(); + SetColumnImage(col, -1); + + wxLogMessage( wxT("OnColumnRightClick at %d."), event.GetColumn() ); +} + +void MyListCtrl::OnColBeginDrag(wxListEvent& event) +{ + wxLogMessage( wxT("OnColBeginDrag: column %d."), event.GetColumn() ); +} + +void MyListCtrl::OnColDragging(wxListEvent& event) +{ + wxLogMessage( wxT("OnColDragging: column %d."), event.GetColumn() ); +} + +void MyListCtrl::OnColEndDrag(wxListEvent& event) +{ + wxLogMessage( wxT("OnColEndDrag: column %d."), event.GetColumn() ); } void MyListCtrl::OnBeginDrag(wxListEvent& event) { - wxLogMessage( "OnBeginDrag at %d,%d.", - event.m_pointDrag.x, event.m_pointDrag.y ); + const wxPoint& pt = event.m_pointDrag; + + int flags; + wxLogMessage( wxT("OnBeginDrag at (%d, %d), item %ld."), + pt.x, pt.y, HitTest(pt, flags) ); } void MyListCtrl::OnBeginRDrag(wxListEvent& event) { - wxLogMessage( "OnBeginRDrag at %d,%d.", + wxLogMessage( wxT("OnBeginRDrag at %d,%d."), event.m_pointDrag.x, event.m_pointDrag.y ); } void MyListCtrl::OnBeginLabelEdit(wxListEvent& event) { - wxLogMessage("OnBeginLabelEdit: %s", event.m_item.m_text.c_str()); + wxLogMessage( wxT("OnBeginLabelEdit: %s"), event.m_item.m_text.c_str()); } void MyListCtrl::OnEndLabelEdit(wxListEvent& event) { - wxLogMessage("OnEndLabelEdit: %s", event.m_item.m_text.c_str()); + wxLogMessage( wxT("OnEndLabelEdit: %s"), event.m_item.m_text.c_str()); } void MyListCtrl::OnDeleteItem(wxListEvent& event) @@ -613,12 +731,12 @@ void MyListCtrl::OnSelected(wxListEvent& event) info.m_mask = wxLIST_MASK_TEXT; if ( GetItem(info) ) { - wxLogMessage("Value of the 2nd field of the selected item: %s", + wxLogMessage(wxT("Value of the 2nd field of the selected item: %s"), info.m_text.c_str()); } else { - wxFAIL_MSG("wxListCtrl::GetItem() failed"); + wxFAIL_MSG(wxT("wxListCtrl::GetItem() failed")); } } } @@ -633,18 +751,105 @@ void MyListCtrl::OnActivated(wxListEvent& event) LogEvent(event, _T("OnActivated")); } -void MyListCtrl::OnListKeyDown(wxListEvent& event) +void MyListCtrl::OnFocused(wxListEvent& event) { - LogEvent(event, _T("OnListKeyDown")); + LogEvent(event, _T("OnFocused")); +} - event.Skip(); +void MyListCtrl::OnListKeyDown(wxListEvent& event) +{ + switch ( event.GetCode() ) + { + case 'c': // colorize + case 'C': + { + wxListItem info; + info.m_itemId = event.GetIndex(); + GetItem(info); + + wxListItemAttr *attr = info.GetAttributes(); + if ( !attr || !attr->HasTextColour() ) + { + info.SetTextColour(*wxCYAN); + + SetItem(info); + + RefreshItem(info.m_itemId); + } + } + break; + + case 'n': // next + case 'N': + { + long item = GetNextItem(-1, + wxLIST_NEXT_ALL, wxLIST_STATE_FOCUSED); + if ( item++ == GetItemCount() - 1 ) + { + item = 0; + } + + wxLogMessage(_T("Focusing item %ld"), item); + + SetItemState(item, wxLIST_STATE_FOCUSED, wxLIST_STATE_FOCUSED); + EnsureVisible(item); + } + break; + + case WXK_DELETE: + { + long item = GetNextItem(-1, + wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); + while ( item != -1 ) + { + DeleteItem(item); + + wxLogMessage(_T("Item %ld deleted"), item); + + // -1 because the indices were shifted by DeleteItem() + item = GetNextItem(item - 1, + wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); + } + } + break; + + case WXK_INSERT: + if ( GetWindowStyle() & wxLC_REPORT ) + { + if ( GetWindowStyle() & wxLC_VIRTUAL ) + { + SetItemCount(GetItemCount() + 1); + } + else // !virtual + { + InsertItemInReportView(event.GetIndex()); + } + } + //else: fall through + + default: + LogEvent(event, _T("OnListKeyDown")); + + event.Skip(); + } } void MyListCtrl::OnChar(wxKeyEvent& event) { wxLogMessage(_T("Got char event.")); - event.Skip(); + switch ( event.GetKeyCode() ) + { + case 'n': + case 'N': + case 'c': + case 'C': + // these are the keys we process ourselves + break; + + default: + event.Skip(); + } } void MyListCtrl::LogEvent(const wxListEvent& event, const wxChar *eventName) @@ -664,3 +869,22 @@ int MyListCtrl::OnGetItemImage(long item) const return 0; } +wxListItemAttr *MyListCtrl::OnGetItemAttr(long item) const +{ + return item % 2 ? NULL : (wxListItemAttr *)&m_attr; +} + +void MyListCtrl::InsertItemInReportView(int i) +{ + wxString buf; + buf.Printf(_T("This is item %d"), i); + long tmp = InsertItem(i, buf, 0); + SetItemData(tmp, i); + + buf.Printf(_T("Col 1, item %d"), i); + SetItem(i, 1, buf); + + buf.Printf(_T("Item %d in column 2"), i); + SetItem(i, 2, buf); +} +