]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/listctrl/listtest.cpp
Fix return value of wxGenericTreeCtrl::FindItem().
[wxWidgets.git] / samples / listctrl / listtest.cpp
index 96afe78e75c7ff0fb9133ff743c820badfd94bed..c7fbde5c45bb6c414cd3e173518b562dfc9dc1d3 100644 (file)
@@ -6,7 +6,7 @@
 // Created:     04/01/98
 // RCS-ID:      $Id$
 // Copyright:   (c) Julian Smart
 // Created:     04/01/98
 // RCS-ID:      $Id$
 // Copyright:   (c) Julian Smart
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // For compilers that support precompilation, includes "wx/wx.h".
 /////////////////////////////////////////////////////////////////////////////
 
 // For compilers that support precompilation, includes "wx/wx.h".
 #include "wx/wx.h"
 #endif
 
 #include "wx/wx.h"
 #endif
 
-#if !defined(__WXMSW__) && !defined(__WXPM__)
-    #include "mondrian.xpm"
+#ifndef wxHAS_IMAGES_IN_RESOURCES
+    #include "../sample.xpm"
 #endif
 
 #endif
 
-#ifndef __WXMSW__
+#ifndef wxHAS_IMAGES_IN_RESOURCES
     #include "bitmaps/toolbrai.xpm"
     #include "bitmaps/toolchar.xpm"
     #include "bitmaps/tooldata.xpm"
     #include "bitmaps/toolbrai.xpm"
     #include "bitmaps/toolchar.xpm"
     #include "bitmaps/tooldata.xpm"
@@ -70,13 +70,13 @@ const wxChar *SMALL_VIRTUAL_VIEW_ITEMS[][2] =
 static const int NUM_ICONS = 9;
 
 int wxCALLBACK
 static const int NUM_ICONS = 9;
 
 int wxCALLBACK
-MyCompareFunction(long item1, long item2, wxIntPtr WXUNUSED(sortData))
+MyCompareFunction(wxIntPtr item1, wxIntPtr item2, wxIntPtr WXUNUSED(sortData))
 {
     // inverse the order
     if (item1 < item2)
 {
     // inverse the order
     if (item1 < item2)
-        return -1;
-    if (item1 > item2)
         return 1;
         return 1;
+    if (item1 > item2)
+        return -1;
 
     return 0;
 }
 
     return 0;
 }
@@ -100,8 +100,6 @@ bool MyApp::OnInit()
     // Show the frame
     frame->Show(true);
 
     // Show the frame
     frame->Show(true);
 
-    SetTopWindow(frame);
-
     return true;
 }
 
     return true;
 }
 
@@ -150,13 +148,17 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
     EVT_MENU(LIST_FREEZE, MyFrame::OnFreeze)
     EVT_MENU(LIST_THAW, MyFrame::OnThaw)
     EVT_MENU(LIST_TOGGLE_LINES, MyFrame::OnToggleLines)
     EVT_MENU(LIST_FREEZE, MyFrame::OnFreeze)
     EVT_MENU(LIST_THAW, MyFrame::OnThaw)
     EVT_MENU(LIST_TOGGLE_LINES, MyFrame::OnToggleLines)
+    EVT_MENU(LIST_TOGGLE_HEADER, MyFrame::OnToggleHeader)
 #ifdef __WXOSX__
     EVT_MENU(LIST_MAC_USE_GENERIC, MyFrame::OnToggleMacUseGeneric)
 #endif // __WXOSX__
     EVT_MENU(LIST_FIND, MyFrame::OnFind)
 
 #ifdef __WXOSX__
     EVT_MENU(LIST_MAC_USE_GENERIC, MyFrame::OnToggleMacUseGeneric)
 #endif // __WXOSX__
     EVT_MENU(LIST_FIND, MyFrame::OnFind)
 
-    EVT_UPDATE_UI(LIST_SHOW_COL_INFO, MyFrame::OnUpdateShowColInfo)
+    EVT_UPDATE_UI(LIST_SHOW_COL_INFO, MyFrame::OnUpdateUIEnableInReport)
+    EVT_UPDATE_UI(LIST_TOGGLE_HEADER, MyFrame::OnUpdateUIEnableInReport)
+
     EVT_UPDATE_UI(LIST_TOGGLE_MULTI_SEL, MyFrame::OnUpdateToggleMultiSel)
     EVT_UPDATE_UI(LIST_TOGGLE_MULTI_SEL, MyFrame::OnUpdateToggleMultiSel)
+    EVT_UPDATE_UI(LIST_TOGGLE_HEADER, MyFrame::OnUpdateToggleHeader)
 END_EVENT_TABLE()
 
 // My frame constructor
 END_EVENT_TABLE()
 
 // My frame constructor
@@ -169,13 +171,13 @@ MyFrame::MyFrame(const wxChar *title)
     m_numListItems = 10;
 
     // Give it an icon
     m_numListItems = 10;
 
     // Give it an icon
-    SetIcon( wxICON(mondrian) );
+    SetIcon(wxICON(sample));
 
     // Make an image list containing large icons
     m_imageListNormal = new wxImageList(32, 32, true);
     m_imageListSmall = new wxImageList(16, 16, true);
 
 
     // Make an image list containing large icons
     m_imageListNormal = new wxImageList(32, 32, true);
     m_imageListSmall = new wxImageList(16, 16, true);
 
-#ifdef __WXMSW__
+#ifdef wxHAS_IMAGES_IN_RESOURCES
     m_imageListNormal->Add( wxIcon(wxT("icon1"), wxBITMAP_TYPE_ICO_RESOURCE) );
     m_imageListNormal->Add( wxIcon(wxT("icon2"), wxBITMAP_TYPE_ICO_RESOURCE) );
     m_imageListNormal->Add( wxIcon(wxT("icon3"), wxBITMAP_TYPE_ICO_RESOURCE) );
     m_imageListNormal->Add( wxIcon(wxT("icon1"), wxBITMAP_TYPE_ICO_RESOURCE) );
     m_imageListNormal->Add( wxIcon(wxT("icon2"), wxBITMAP_TYPE_ICO_RESOURCE) );
     m_imageListNormal->Add( wxIcon(wxT("icon3"), wxBITMAP_TYPE_ICO_RESOURCE) );
@@ -251,8 +253,11 @@ MyFrame::MyFrame(const wxChar *title)
     menuList->Append(LIST_THAW, wxT("Tha&w\tCtrl-W"));
     menuList->AppendSeparator();
     menuList->AppendCheckItem(LIST_TOGGLE_LINES, wxT("Toggle &lines\tCtrl-I"));
     menuList->Append(LIST_THAW, wxT("Tha&w\tCtrl-W"));
     menuList->AppendSeparator();
     menuList->AppendCheckItem(LIST_TOGGLE_LINES, wxT("Toggle &lines\tCtrl-I"));
-    menuList->Append(LIST_TOGGLE_MULTI_SEL, wxT("&Multiple selection\tCtrl-M"),
-            wxT("Toggle multiple selection"), true);
+    menuList->AppendCheckItem(LIST_TOGGLE_MULTI_SEL,
+                              wxT("&Multiple selection\tCtrl-M"));
+    menuList->Check(LIST_TOGGLE_MULTI_SEL, true);
+    menuList->AppendCheckItem(LIST_TOGGLE_HEADER, "Toggle &header\tCtrl-H");
+    menuList->Check(LIST_TOGGLE_HEADER, true);
 
     wxMenu *menuCol = new wxMenu;
     menuCol->Append(LIST_SET_FG_COL, wxT("&Foreground colour..."));
 
     wxMenu *menuCol = new wxMenu;
     menuCol->Append(LIST_SET_FG_COL, wxT("&Foreground colour..."));
@@ -276,7 +281,7 @@ MyFrame::MyFrame(const wxChar *title)
 
 #ifdef __WXMSW__
     // this is useful to know specially when debugging :)
 
 #ifdef __WXMSW__
     // this is useful to know specially when debugging :)
-    wxLogMessage("Your version of comctl32.dll is: %d", 
+    wxLogMessage("Your version of comctl32.dll is: %d",
                  wxApp::GetComCtl32Version());
 #endif
 
                  wxApp::GetComCtl32Version());
 #endif
 
@@ -354,6 +359,13 @@ void MyFrame::OnToggleLines(wxCommandEvent& event)
     m_listCtrl->SetSingleStyle(wxLC_HRULES | wxLC_VRULES, event.IsChecked());
 }
 
     m_listCtrl->SetSingleStyle(wxLC_HRULES | wxLC_VRULES, event.IsChecked());
 }
 
+void MyFrame::OnToggleHeader(wxCommandEvent& event)
+{
+    wxLogMessage("%s the header", event.IsChecked() ? "Showing" : "Hiding");
+
+    m_listCtrl->ToggleWindowStyle(wxLC_NO_HEADER);
+}
+
 #ifdef __WXOSX__
 
 void MyFrame::OnToggleMacUseGeneric(wxCommandEvent& event)
 #ifdef __WXOSX__
 
 void MyFrame::OnToggleMacUseGeneric(wxCommandEvent& event)
@@ -559,8 +571,14 @@ void MyFrame::InitWithIconItems(bool withText, bool sameIcon)
 
         if ( withText )
         {
 
         if ( withText )
         {
-            m_listCtrl->InsertItem(i, wxString::Format(wxT("Label %d"), i),
-                                   image);
+            // Make labels of different widths to test the layout.
+            wxString label;
+            if ( !(i % 5) )
+                label.Printf("Longer label %d", i);
+            else
+                label.Printf("Label %d", i);
+
+            m_listCtrl->InsertItem(i, label, image);
         }
         else
         {
         }
         else
         {
@@ -778,7 +796,7 @@ void MyFrame::OnShowColInfo(wxCommandEvent& WXUNUSED(event))
     }
 }
 
     }
 }
 
-void MyFrame::OnUpdateShowColInfo(wxUpdateUIEvent& event)
+void MyFrame::OnUpdateUIEnableInReport(wxUpdateUIEvent& event)
 {
     event.Enable( (m_listCtrl->GetWindowStyleFlag() & wxLC_REPORT) != 0 );
 }
 {
     event.Enable( (m_listCtrl->GetWindowStyleFlag() & wxLC_REPORT) != 0 );
 }
@@ -799,7 +817,12 @@ void MyFrame::OnToggleMultiSel(wxCommandEvent& WXUNUSED(event))
 
 void MyFrame::OnUpdateToggleMultiSel(wxUpdateUIEvent& event)
 {
 
 void MyFrame::OnUpdateToggleMultiSel(wxUpdateUIEvent& event)
 {
-     event.Check((m_listCtrl->GetWindowStyleFlag() & wxLC_SINGLE_SEL) == 0);
+     event.Check(!m_listCtrl->HasFlag(wxLC_SINGLE_SEL));
+}
+
+void MyFrame::OnUpdateToggleHeader(wxUpdateUIEvent& event)
+{
+    event.Check(!m_listCtrl->HasFlag(wxLC_NO_HEADER));
 }
 
 void MyFrame::OnSetFgColour(wxCommandEvent& WXUNUSED(event))
 }
 
 void MyFrame::OnSetFgColour(wxCommandEvent& WXUNUSED(event))
@@ -821,16 +844,26 @@ void MyFrame::OnAdd(wxCommandEvent& WXUNUSED(event))
 
 void MyFrame::OnEdit(wxCommandEvent& WXUNUSED(event))
 {
 
 void MyFrame::OnEdit(wxCommandEvent& WXUNUSED(event))
 {
-    long itemCur = m_listCtrl->GetNextItem(-1, wxLIST_NEXT_ALL,
-                                           wxLIST_STATE_FOCUSED);
-
-    if ( itemCur != -1 )
+    // demonstrate cancelling editing: this currently is wxMSW-only
+#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__)
+    if ( m_listCtrl->GetEditControl() )
     {
     {
-        m_listCtrl->EditLabel(itemCur);
+        m_listCtrl->EndEditLabel(true);
     }
     }
-    else
+    else // start editing
+#endif // __WXMSW__
     {
     {
-        m_logWindow->WriteText(wxT("No item to edit"));
+        long itemCur = m_listCtrl->GetNextItem(-1, wxLIST_NEXT_ALL,
+                                               wxLIST_STATE_FOCUSED);
+
+        if ( itemCur != -1 )
+        {
+            m_listCtrl->EditLabel(itemCur);
+        }
+        else
+        {
+            m_logWindow->WriteText(wxT("No item to edit"));
+        }
     }
 }
 
     }
 }
 
@@ -1117,8 +1150,8 @@ void MyListCtrl::OnListKeyDown(wxListEvent& event)
             }
             break;
 
             }
             break;
 
-        case '1': // show sub item bounding rectangle
-        case '2':
+        case '1': // show sub item bounding rectangle for the given column
+        case '2': // (and icon/label rectangle if Shift/Ctrl is pressed)
         case '3':
         case '4': // this column is invalid but we want to test it too
             if ( InReportView() )
         case '3':
         case '4': // this column is invalid but we want to test it too
             if ( InReportView() )
@@ -1126,7 +1159,14 @@ void MyListCtrl::OnListKeyDown(wxListEvent& event)
                 int subItem = event.GetKeyCode() - '1';
                 item = event.GetIndex();
                 wxRect r;
                 int subItem = event.GetKeyCode() - '1';
                 item = event.GetIndex();
                 wxRect r;
-                if ( !GetSubItemRect(item, subItem, r) )
+
+                int code = wxLIST_RECT_BOUNDS;
+                if ( wxGetKeyState(WXK_SHIFT) )
+                    code = wxLIST_RECT_ICON;
+                else if ( wxGetKeyState(WXK_CONTROL) )
+                    code = wxLIST_RECT_LABEL;
+
+                if ( !GetSubItemRect(item, subItem, r, code) )
                 {
                     wxLogError(wxT("Failed to retrieve rect of item %ld column %d"), item, subItem + 1);
                     break;
                 {
                     wxLogError(wxT("Failed to retrieve rect of item %ld column %d"), item, subItem + 1);
                     break;