]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/listctrl/listtest.cpp
fixing file paths after renaming
[wxWidgets.git] / samples / listctrl / listtest.cpp
index 864a49dbfbb699a20436e84066be2fc3c17f8560..6d1422e2661d791342be22b92ac497eceaddc683 100644 (file)
@@ -75,6 +75,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
     EVT_MENU(LIST_VIRTUAL_VIEW, MyFrame::OnVirtualView)
     EVT_MENU(LIST_SMALL_VIRTUAL_VIEW, MyFrame::OnSmallVirtualView)
 
+    EVT_MENU(LIST_GOTO, MyFrame::OnGoTo)
     EVT_MENU(LIST_FOCUS_LAST, MyFrame::OnFocusLast)
     EVT_MENU(LIST_TOGGLE_FIRST, MyFrame::OnToggleFirstSel)
     EVT_MENU(LIST_DESELECT_ALL, MyFrame::OnDeselectAll)
@@ -130,7 +131,7 @@ END_EVENT_TABLE()
 IMPLEMENT_APP(MyApp)
 
 // number of items in list/report view
-static const int NUM_ITEMS = 30;
+static const int NUM_ITEMS = 10;
 
 // number of items in icon/small icon view
 static const int NUM_ICONS = 9;
@@ -165,15 +166,12 @@ bool MyApp::OnInit()
 
 // My frame constructor
 MyFrame::MyFrame(const wxChar *title)
-       : wxFrame(NULL, wxID_ANY, title)
+       : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(600, 500))
 {
     m_listCtrl = NULL;
     m_logWindow = NULL;
     m_smallVirtual = false;
 
-    if (wxSystemSettings::GetScreenType() > wxSYS_SCREEN_SMALL)
-        SetSize(wxSize(450, 340));
-
     // Give it an icon
     SetIcon( wxICON(mondrian) );
 
@@ -228,6 +226,7 @@ MyFrame::MyFrame(const wxChar *title)
 #endif
 
     wxMenu *menuList = new wxMenu;
+    menuList->Append(LIST_GOTO, _T("&Go to item #3\tCtrl-3"));
     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"));
@@ -264,14 +263,14 @@ MyFrame::MyFrame(const wxChar *title)
     m_panel = new wxPanel(this, wxID_ANY);
     m_logWindow = new wxTextCtrl(m_panel, wxID_ANY, wxEmptyString,
                                  wxDefaultPosition, wxDefaultSize,
-                                 wxTE_MULTILINE | wxSUNKEN_BORDER);
+                                 wxTE_READONLY | wxTE_MULTILINE | wxSUNKEN_BORDER);
 
     m_logOld = wxLog::SetActiveTarget(new wxLogTextCtrl(m_logWindow));
 
     RecreateList(wxLC_REPORT | wxLC_SINGLE_SEL);
 
 #if wxUSE_STATUSBAR
-    CreateStatusBar(3);
+    CreateStatusBar();
 #endif // wxUSE_STATUSBAR
 }
 
@@ -349,6 +348,18 @@ void MyFrame::OnToggleMacUseGeneric(wxCommandEvent& event)
     wxSystemOptions::SetOption(wxT("mac.listctrl.always_use_generic"), event.IsChecked());
 }
 
+void MyFrame::OnGoTo(wxCommandEvent& WXUNUSED(event))
+{
+    long index = 3;
+    m_listCtrl->SetItemState(index, wxLIST_STATE_FOCUSED, wxLIST_STATE_FOCUSED);
+
+    long sel = m_listCtrl->GetNextItem(-1, wxLIST_NEXT_ALL,
+                                        wxLIST_STATE_SELECTED);
+    if ( sel != -1 )
+        m_listCtrl->SetItemState(sel, 0, wxLIST_STATE_SELECTED);
+    m_listCtrl->SetItemState(index, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED);
+}
+
 void MyFrame::OnFocusLast(wxCommandEvent& WXUNUSED(event))
 {
     long index = m_listCtrl->GetItemCount() - 1;
@@ -819,13 +830,27 @@ void MyListCtrl::OnBeginRDrag(wxListEvent& event)
 void MyListCtrl::OnBeginLabelEdit(wxListEvent& event)
 {
     wxLogMessage( wxT("OnBeginLabelEdit: %s"), event.m_item.m_text.c_str());
+
+    wxTextCtrl * const text = GetEditControl();
+    if ( !text )
+    {
+        wxLogMessage("BUG: started to edit but no edit control");
+    }
+    else
+    {
+        wxLogMessage("Edit control value: \"%s\"", text->GetValue());
+    }
 }
 
 void MyListCtrl::OnEndLabelEdit(wxListEvent& event)
 {
     wxLogMessage( wxT("OnEndLabelEdit: %s"),
-                  event.IsEditCancelled() ? _T("[cancelled]")
-                                          : event.m_item.m_text.c_str());
+        (
+            event.IsEditCancelled() ? 
+            wxString("[cancelled]") : 
+            event.m_item.m_text
+        ).c_str()
+    );
 }
 
 void MyListCtrl::OnDeleteItem(wxListEvent& event)
@@ -884,8 +909,7 @@ void MyListCtrl::OnListKeyDown(wxListEvent& event)
 
     switch ( event.GetKeyCode() )
     {
-        case 'c': // colorize
-        case 'C':
+        case 'C': // colorize
             {
                 wxListItem info;
                 info.m_itemId = event.GetIndex();
@@ -909,8 +933,7 @@ void MyListCtrl::OnListKeyDown(wxListEvent& event)
             }
             break;
 
-        case 'n': // next
-        case 'N':
+        case 'N': // next
             item = GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_FOCUSED);
             if ( item++ == GetItemCount() - 1 )
             {
@@ -923,8 +946,7 @@ void MyListCtrl::OnListKeyDown(wxListEvent& event)
             EnsureVisible(item);
             break;
 
-        case 'r': // show bounding Rect
-        case 'R':
+        case 'R': // show bounding rectangle
             {
                 item = event.GetIndex();
                 wxRect r;
@@ -939,7 +961,27 @@ void MyListCtrl::OnListKeyDown(wxListEvent& event)
             }
             break;
 
-        case WXK_DELETE:
+        case 'U': // update
+            if ( !IsVirtual() )
+                break;
+
+            if ( m_updated != -1 )
+                RefreshItem(m_updated);
+
+            m_updated = event.GetIndex();
+            if ( m_updated != -1 )
+            {
+                // we won't see changes to this item as it's selected, update
+                // the next one (or the first one if we're on the last item)
+                if ( ++m_updated == GetItemCount() )
+                    m_updated = 0;
+
+                wxLogMessage("Updating colour of the item %ld", m_updated);
+                RefreshItem(m_updated);
+            }
+            break;
+
+        case 'D': // delete
             item = GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
             while ( item != -1 )
             {
@@ -953,7 +995,7 @@ void MyListCtrl::OnListKeyDown(wxListEvent& event)
             }
             break;
 
-        case WXK_INSERT:
+        case 'I': // insert
             if ( GetWindowStyle() & wxLC_REPORT )
             {
                 if ( GetWindowStyle() & wxLC_VIRTUAL )
@@ -984,6 +1026,14 @@ void MyListCtrl::OnChar(wxKeyEvent& event)
         case 'N':
         case 'c':
         case 'C':
+        case 'r':
+        case 'R':
+        case 'u':
+        case 'U':
+        case 'd':
+        case 'D':
+        case 'i':
+        case 'I':
             // these are the keys we process ourselves
             break;
 
@@ -1035,7 +1085,7 @@ wxString MyListCtrl::OnGetItemText(long item, long column) const
     {
         return SMALL_VIRTUAL_VIEW_ITEMS[item][column];
     }
-    else
+    else // "big" virtual control
     {
         return wxString::Format(_T("Column %ld of item %ld"), column, item);
     }
@@ -1046,7 +1096,7 @@ int MyListCtrl::OnGetItemColumnImage(long item, long column) const
     if (!column)
         return 0;
 
-    if (!(item %3) && column == 1)
+    if (!(item % 3) && column == 1)
         return 0;
 
     return -1;
@@ -1054,6 +1104,14 @@ int MyListCtrl::OnGetItemColumnImage(long item, long column) const
 
 wxListItemAttr *MyListCtrl::OnGetItemAttr(long item) const
 {
+    // test to check that RefreshItem() works correctly: when m_updated is
+    // set to some item and it is refreshed, we highlight the item
+    if ( item == m_updated )
+    {
+        static wxListItemAttr s_attrHighlight(*wxRED, wxNullColour, wxNullFont);
+        return &s_attrHighlight;
+    }
+
     return item % 2 ? NULL : (wxListItemAttr *)&m_attr;
 }
 
@@ -1074,16 +1132,29 @@ void MyListCtrl::InsertItemInReportView(int i)
 #if USE_CONTEXT_MENU
 void MyListCtrl::OnContextMenu(wxContextMenuEvent& event)
 {
-    wxPoint point = event.GetPosition();
-    // If from keyboard
-    if (point.x == -1 && point.y == -1) {
-        wxSize size = GetSize();
-        point.x = size.x / 2;
-        point.y = size.y / 2;
-    } else {
-        point = ScreenToClient(point);
+    if (GetEditControl() == NULL)
+    {
+        wxPoint point = event.GetPosition();
+        // If from keyboard
+        if ( (point.x == -1) && (point.y == -1) )
+        {
+            wxSize size = GetSize();
+            point.x = size.x / 2;
+            point.y = size.y / 2;
+        }
+        else
+        {
+            point = ScreenToClient(point);
+        }
+        ShowContextMenu(point);
+    }
+    else
+    {
+        // the user is editing:
+        // allow the text control to display its context menu
+        // if it has one (it has on Windows) rather than display our one
+        event.Skip();
     }
-    ShowContextMenu(point);
 }
 #endif