]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/checklst/checklst.cpp
A fix for attribrute sorting, but it's still broken if there are
[wxWidgets.git] / samples / checklst / checklst.cpp
index 8310a8aa919968cd74b2b6869faf8689ec8268c0..c5d5cd7580e650ada5a5df6d7cbb5620f52aaa6d 100644 (file)
 ///////////////////////////////////////////////////////////////////////////////
 
 #ifdef __GNUG__
 ///////////////////////////////////////////////////////////////////////////////
 
 #ifdef __GNUG__
-//#pragma implementation
+    //#pragma implementation
 #endif
 
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
 #endif
 
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
-  #pragma hdrstop
+    #pragma hdrstop
 #endif
 
 #ifndef WX_PRECOMP
 #endif
 
 #ifndef WX_PRECOMP
-  #include "wx/wx.h"
+#include "wx/wx.h"
 #endif
 
 #ifdef __WXMSW__
 #endif
 
 #ifdef __WXMSW__
-#include  "wx/ownerdrw.h"
+    #include  "wx/ownerdrw.h"
 #endif
 #endif
+
+#include  "wx/log.h"
+
+#include  "wx/sizer.h"
 #include  "wx/menuitem.h"
 #include  "wx/checklst.h"
 
 #include  "wx/menuitem.h"
 #include  "wx/checklst.h"
 
-#ifdef __WXGTK__
-#include "mondrian.xpm"
-#endif
-
 // Define a new application type
 class CheckListBoxApp: public wxApp
 {
 public:
 // Define a new application type
 class CheckListBoxApp: public wxApp
 {
 public:
-  bool OnInit();
+    bool OnInit();
 };
 
 // Define a new frame type
 class CheckListBoxFrame : public wxFrame
 {
 public:
 };
 
 // Define a new frame type
 class CheckListBoxFrame : public wxFrame
 {
 public:
-  // ctor & dtor
-  CheckListBoxFrame(wxFrame *frame, char *title, int x, int y, int w, int h);
-  ~CheckListBoxFrame();
+    // ctor & dtor
+    CheckListBoxFrame(wxFrame *frame, const char *title,
+            int x, int y, int w, int h);
+    ~CheckListBoxFrame();
+
+    // notifications
+    void OnQuit           (wxCommandEvent& event);
+    void OnAbout          (wxCommandEvent& event);
+    void OnListboxSelect  (wxCommandEvent& event);
+    void OnCheckboxToggle (wxCommandEvent& event);
+    void OnListboxDblClick(wxCommandEvent& event);
+    void OnButtonUp       (wxCommandEvent& event);
+    void OnButtonDown     (wxCommandEvent& event);
+
+private:
+    void OnButtonMove(bool up);
 
 
-  // notifications
-  void OnQuit             (wxCommandEvent& event);
-  void OnAbout            (wxCommandEvent& event);
-  void OnListboxSelect    (wxCommandEvent& event);
-  void OnCheckboxToggle   (wxCommandEvent& event);
-  void OnListboxDblClick  (wxCommandEvent& event);
-  bool OnClose            ()                        { return TRUE; }
+    void AdjustColour(size_t index);
 
 
-  DECLARE_EVENT_TABLE()
+    wxCheckListBox *m_pListBox;
 
 
-private:
-  wxCheckListBox *m_pListBox;
+    DECLARE_EVENT_TABLE()
 };
 
 enum
 {
 };
 
 enum
 {
-  Menu_Quit = 1,
-  Control_First = 1000,
-  Control_Listbox, Control_Listbox2,
+    Menu_Quit = 1,
+    Control_First = 1000,
+    Control_Listbox,
+    Btn_Up,
+    Btn_Down
 };
 
 BEGIN_EVENT_TABLE(CheckListBoxFrame, wxFrame)
 };
 
 BEGIN_EVENT_TABLE(CheckListBoxFrame, wxFrame)
-  EVT_MENU(Menu_Quit, CheckListBoxFrame::OnQuit)
-  EVT_LISTBOX(Control_Listbox, CheckListBoxFrame::OnListboxSelect)
-  EVT_CHECKLISTBOX(Control_Listbox, CheckListBoxFrame::OnCheckboxToggle)
-  EVT_COMMAND(Control_Listbox, wxEVT_COMMAND_LISTBOX_DOUBLECLICKED,
-              CheckListBoxFrame::OnListboxDblClick)
+    EVT_MENU(Menu_Quit, CheckListBoxFrame::OnQuit)
+
+    EVT_LISTBOX(Control_Listbox, CheckListBoxFrame::OnListboxSelect)
+    EVT_CHECKLISTBOX(Control_Listbox, CheckListBoxFrame::OnCheckboxToggle)
+    EVT_LISTBOX_DCLICK(Control_Listbox, CheckListBoxFrame::OnListboxDblClick)
+
+    EVT_BUTTON(Btn_Up, CheckListBoxFrame::OnButtonUp)
+    EVT_BUTTON(Btn_Down, CheckListBoxFrame::OnButtonDown)
 END_EVENT_TABLE()
 
 IMPLEMENT_APP(CheckListBoxApp);
 END_EVENT_TABLE()
 
 IMPLEMENT_APP(CheckListBoxApp);
@@ -83,112 +94,201 @@ IMPLEMENT_APP(CheckListBoxApp);
 // init our app: create windows
 bool CheckListBoxApp::OnInit(void)
 {
 // init our app: create windows
 bool CheckListBoxApp::OnInit(void)
 {
-  CheckListBoxFrame *pFrame = new CheckListBoxFrame(NULL, "wxWindows Ownerdraw Sample",
-                                                50, 50, 450, 320);
-  SetTopWindow(pFrame);
-
-  return TRUE;
+    CheckListBoxFrame *pFrame = new CheckListBoxFrame
+                                    (
+                                     NULL,
+                                     "wxWindows Checklistbox Sample",
+                                     50, 50, 480, 320
+                                    );
+    SetTopWindow(pFrame);
+
+    return TRUE;
 }
 
 // main frame constructor
 }
 
 // main frame constructor
-CheckListBoxFrame::CheckListBoxFrame(wxFrame *frame, char *title, int x, int y, int w, int h)
-         : wxFrame(frame, -1, title, wxPoint(x, y), wxSize(w, h))
+CheckListBoxFrame::CheckListBoxFrame(wxFrame *frame,
+        const char *title,
+        int x, int y, int w, int h)
+: wxFrame(frame, -1, title, wxPoint(x, y), wxSize(w, h))
 {
 {
-  // set the icon
-  SetIcon(wxICON(mondrian));
-
-  // Make a menubar
-  wxMenu *file_menu = new wxMenu;
-
-  // construct submenu
-  file_menu->Append(Menu_Quit, "E&xit");
-
-  wxMenuBar *menu_bar = new wxMenuBar;
-  menu_bar->Append(file_menu, "&File");
-  SetMenuBar(menu_bar);
-
-  // make a panel with some controls
-  wxPanel *pPanel = new wxPanel(this, -1, wxPoint(0, 0),
-                                wxSize(400, 200), wxTAB_TRAVERSAL);
-
-  // check list box
-  static const char* aszChoices[] = { "Hello", "world", "and",
-                                      "goodbye", "cruel", "world",
-                                      "-------", "owner-drawn", "listbox" };
-
-  wxString *astrChoices = new wxString[WXSIZEOF(aszChoices)];
-  unsigned int ui;
-  for ( ui = 0; ui < WXSIZEOF(aszChoices); ui++ )
-    astrChoices[ui] = aszChoices[ui];
-
-  m_pListBox = new wxCheckListBox
-                   (
-                     pPanel,             // parent
-                     Control_Listbox,    // control id
-                     wxPoint(10, 10),    // listbox poistion
-                     wxSize(400, 200),   // listbox size
-                     WXSIZEOF(aszChoices), // number of strings
-                     astrChoices         // array of strings
-                   );
-
-  delete [] astrChoices;
-
-#ifdef __WXMSW__
-  for ( ui = 0; ui < WXSIZEOF(aszChoices); ui += 2 ) {
-    m_pListBox->GetItem(ui)->SetBackgroundColour(wxColor(200, 200, 200));
-  }
-#endif
-
-  m_pListBox->Check(2);
-
-  // create the status line
-  const int widths[] = { -1, 60 };
-  CreateStatusBar(2);
-  SetStatusWidths(2, widths);
-  SetStatusText("no selection", 0);
-
-  Show(TRUE);
+    // create the status line
+    const int widths[] = { -1, 60 };
+    CreateStatusBar(2);
+    SetStatusWidths(2, widths);
+    wxLogStatus(this, _T("no selection"));
+
+    // Make a menubar
+    wxMenu *file_menu = new wxMenu;
+
+    // construct submenu
+    file_menu->Append(Menu_Quit, "E&xit");
+
+    wxMenuBar *menu_bar = new wxMenuBar;
+    menu_bar->Append(file_menu, "&File");
+    SetMenuBar(menu_bar);
+
+    // make a panel with some controls
+    wxPanel *panel = new wxPanel(this, -1, wxPoint(0, 0),
+                                 wxSize(400, 200), wxTAB_TRAVERSAL);
+
+    // check list box
+    static const char* aszChoices[] =
+    {
+        "Zeroth",
+        "First", "Second", "Third",
+        "Fourth", "Fifth", "Sixth",
+        "Seventh", "Eighth", "Nineth"
+    };
+
+    wxString *astrChoices = new wxString[WXSIZEOF(aszChoices)];
+    unsigned int ui;
+    for ( ui = 0; ui < WXSIZEOF(aszChoices); ui++ )
+        astrChoices[ui] = aszChoices[ui];
+
+    m_pListBox = new wxCheckListBox
+        (
+         panel,                 // parent
+         Control_Listbox,       // control id
+         wxPoint(10, 10),       // listbox poistion
+         wxSize(400, 100),      // listbox size
+         WXSIZEOF(aszChoices),  // number of strings
+         astrChoices            // array of strings
+        );
+
+    //m_pListBox->SetBackgroundColour(*wxGREEN);
+
+    delete [] astrChoices;
+
+    // set grey background for every second entry
+    for ( ui = 0; ui < WXSIZEOF(aszChoices); ui += 2 ) {
+        AdjustColour(ui);
+    }
+
+    m_pListBox->Check(2);
+
+    // create buttons for moving the items around
+    wxButton *button1 = new wxButton(panel, Btn_Up, "   &Up  ", wxPoint(420, 90));
+    wxButton *button2 = new wxButton(panel, Btn_Down, "&Down", wxPoint(420, 120));
+
+
+    wxBoxSizer *mainsizer = new wxBoxSizer( wxVERTICAL );
+  
+    mainsizer->Add( m_pListBox, 1, wxGROW|wxALL, 10 );
+    
+    wxBoxSizer *bottomsizer = new wxBoxSizer( wxHORIZONTAL );
+    
+    bottomsizer->Add( button1, 0, wxALL, 10 );
+    bottomsizer->Add( button2, 0, wxALL, 10 );
+
+    mainsizer->Add( bottomsizer, 0, wxCENTER );
+  
+    // tell frame to make use of sizer (or constraints, if any)
+    panel->SetAutoLayout( TRUE );
+    panel->SetSizer( mainsizer );
+
+    // don't allow frame to get smaller than what the sizers tell ye
+    mainsizer->SetSizeHints( this );  
+
+  
+    Show(TRUE);
 }
 
 CheckListBoxFrame::~CheckListBoxFrame()
 {
 }
 
 }
 
 CheckListBoxFrame::~CheckListBoxFrame()
 {
 }
 
-void CheckListBoxFrame::OnQuit(wxCommandEvent& event)
+void CheckListBoxFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
 {
 {
-  Close(TRUE);
+    Close(TRUE);
 }
 
 }
 
-void CheckListBoxFrame::OnAbout(wxCommandEvent& event)
+void CheckListBoxFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
 {
 {
-  wxMessageDialog dialog(this, "Demo of wxCheckListBox control\n"
-                         "About wxCheckListBox", wxYES_NO | wxCANCEL);
-  dialog.ShowModal();
+    wxMessageBox(wxT("Demo of wxCheckListBox control\n"
+                    "© Vadim Zeitlin 1998-1999"),
+                 wxT("About wxCheckListBox"),
+                 wxICON_INFORMATION, this);
 }
 
 void CheckListBoxFrame::OnListboxSelect(wxCommandEvent& event)
 {
 }
 
 void CheckListBoxFrame::OnListboxSelect(wxCommandEvent& event)
 {
-  wxString strSelection;
-  unsigned int nSel = event.GetSelection();
-  strSelection.sprintf("item %d selected (%schecked)", nSel,
-                       m_pListBox->IsChecked((int)nSel) ? "" : "not ");
-  SetStatusText(strSelection);
+    int nSel = event.GetSelection();
+    wxLogStatus(this, wxT("Item %d selected (%schecked)"), nSel,
+                      m_pListBox->IsChecked(nSel) ? _T("") : wxT("not "));
 }
 
 }
 
-void CheckListBoxFrame::OnListboxDblClick(wxCommandEvent& event)
+void CheckListBoxFrame::OnListboxDblClick(wxCommandEvent& WXUNUSED(event))
 {
 {
-  wxString strSelection;
-  strSelection.sprintf("item %d double clicked", m_pListBox->GetSelection());
-  wxMessageDialog dialog(this, strSelection);
-  dialog.ShowModal();
+    wxString strSelection;
+    strSelection.sprintf(wxT("Item %d double clicked"), m_pListBox->GetSelection());
+    wxMessageDialog dialog(this, strSelection, wxT("wxCheckListBox message"), wxICON_INFORMATION);
+    dialog.ShowModal();
 }
 
 void CheckListBoxFrame::OnCheckboxToggle(wxCommandEvent& event)
 {
 }
 
 void CheckListBoxFrame::OnCheckboxToggle(wxCommandEvent& event)
 {
-  wxString strSelection;
-  unsigned int nItem = event.GetInt();
+    unsigned int nItem = event.GetInt();
+
+    wxLogStatus(this, wxT("item %d was %schecked"), nItem,
+                      m_pListBox->IsChecked(nItem) ? wxT("") : wxT("un"));
+}
+
+void CheckListBoxFrame::OnButtonUp(wxCommandEvent& WXUNUSED(event))
+{
+    OnButtonMove(TRUE);
+}
 
 
-  strSelection.sprintf("item %d was %schecked", nItem,
-                       m_pListBox->IsChecked(nItem) ? "" : "un");
-  SetStatusText(strSelection);
+void CheckListBoxFrame::OnButtonDown(wxCommandEvent& WXUNUSED(event))
+{
+    OnButtonMove(FALSE);
+}
+
+void CheckListBoxFrame::OnButtonMove(bool up)
+{
+    int selection = m_pListBox->GetSelection();
+    if ( selection != -1 )
+    {
+        wxString label = m_pListBox->GetString(selection);
+
+        int positionNew = up ? selection - 1 : selection + 2;
+        if ( positionNew < 0 || positionNew > m_pListBox->GetCount() )
+        {
+            wxLogStatus(this, wxT("Can't move this item %s"), up ? wxT("up") : wxT("down"));
+        }
+        else
+        {
+            bool wasChecked = m_pListBox->IsChecked(selection);
+
+            int positionOld = up ? selection + 1 : selection;
+
+            // insert the item
+            m_pListBox->InsertItems(1, &label, positionNew);
+
+            // and delete the old one
+            m_pListBox->Delete(positionOld);
+
+            int selectionNew = up ? positionNew : positionNew - 1;
+            m_pListBox->Check(selectionNew, wasChecked);
+            m_pListBox->SetSelection(selectionNew);
+
+            AdjustColour(selection);
+            AdjustColour(selectionNew);
+
+            wxLogStatus(this, wxT("Item moved %s"), up ? wxT("up") : wxT("down"));
+        }
+    }
+    else
+    {
+        wxLogStatus(this, wxT("Please select an item"));
+    }
+}
+
+void CheckListBoxFrame::AdjustColour(size_t index)
+{
+    // not implemented in other ports yet
+#ifdef __WXMSW__
+    // even items have grey backround, odd ones - white
+    unsigned char c = index % 2 ? 255 : 200;
+    m_pListBox->GetItem(index)->SetBackgroundColour(wxColor(c, c, c));
+#endif // wxMSW
 }
 }