home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2240.zip / wxWindows-2.4.0 / contrib / src / gizmos / editlbox.cpp < prev    next >
C/C++ Source or Header  |  2002-11-14  |  9KB  |  274 lines

  1. /////////////////////////////////////////////////////////////////////////////
  2. // Name:        editlbox.cpp
  3. // Purpose:     ListBox with editable items
  4. // Author:      Vaclav Slavik
  5. // RCS-ID:      $Id: editlbox.cpp,v 1.13.2.1 2002/11/12 23:28:35 VS Exp $
  6. // Copyright:   (c) Vaclav Slavik
  7. // Licence:     wxWindows licence
  8. /////////////////////////////////////////////////////////////////////////////
  9.  
  10. #ifdef __GNUG__
  11.     #pragma implementation "editlbox.h"
  12. #endif
  13.  
  14. // For compilers that support precompilation, includes "wx/wx.h".
  15. #include "wx/wxprec.h"
  16.  
  17. #ifdef __BORLANDC__
  18.     #pragma hdrstop
  19. #endif
  20.  
  21. // for all others, include the necessary headers (this file is usually all you
  22. // need because it includes almost all "standard" wxWindows headers)
  23. #ifndef WX_PRECOMP
  24.     #include "wx/wx.h"
  25. #endif
  26.  
  27. #include "wx/gizmos/editlbox.h"
  28. #include "wx/sizer.h"
  29. #include "wx/listctrl.h"
  30.  
  31.  
  32.  
  33.  
  34. // list control with auto-resizable column:
  35. class CleverListCtrl : public wxListCtrl
  36. {
  37. public:
  38.    CleverListCtrl(wxWindow *parent,
  39.                   wxWindowID id = -1,
  40.                   const wxPoint &pos = wxDefaultPosition,
  41.                   const wxSize &size = wxDefaultSize,
  42.                   long style = wxLC_ICON,
  43.                   const wxValidator& validator = wxDefaultValidator,
  44.                   const wxString &name = _T("listctrl"))
  45.          : wxListCtrl(parent, id, pos, size, style, validator, name)
  46.     {
  47.         CreateColumns();
  48.     }
  49.  
  50.     void CreateColumns()
  51.     {
  52.         InsertColumn(0, _T("item"));
  53.         SizeColumns();
  54.     }
  55.  
  56.     void SizeColumns()
  57.     {
  58.          int w = GetSize().x;
  59. #ifdef __WXMSW__
  60.          w -= wxSystemSettings::GetMetric(wxSYS_VSCROLL_X) + 6;
  61. #else
  62.          w -= 2*wxSystemSettings::GetMetric(wxSYS_VSCROLL_X);
  63. #endif
  64.          SetColumnWidth(0, w);
  65.     }
  66.  
  67. private:
  68.     DECLARE_EVENT_TABLE()
  69.     void OnSize(wxSizeEvent& event)
  70.     {
  71.         SizeColumns();
  72.         event.Skip();
  73.     }
  74. };
  75.  
  76. BEGIN_EVENT_TABLE(CleverListCtrl, wxListCtrl)
  77.    EVT_SIZE(CleverListCtrl::OnSize)
  78. END_EVENT_TABLE()
  79.  
  80. #include "eldel.xpm"
  81. #include "eldown.xpm"
  82. #include "eledit.xpm"
  83. #include "elnew.xpm"
  84. #include "elup.xpm"
  85.  
  86. IMPLEMENT_CLASS(wxEditableListBox, wxPanel)
  87.  
  88. enum
  89. {
  90.     // ID value doesn't matter, it won't propagate out of wxEditableListBox
  91.     // instance
  92.     wxID_ELB_DELETE = wxID_HIGHEST + 1,
  93.     wxID_ELB_NEW,
  94.     wxID_ELB_UP,
  95.     wxID_ELB_DOWN,
  96.     wxID_ELB_EDIT,
  97.     wxID_ELD_LISTCTRL
  98. };
  99.  
  100. BEGIN_EVENT_TABLE(wxEditableListBox, wxPanel)
  101.     EVT_LIST_ITEM_SELECTED(wxID_ELD_LISTCTRL, wxEditableListBox::OnItemSelected)
  102.     EVT_LIST_END_LABEL_EDIT(wxID_ELD_LISTCTRL, wxEditableListBox::OnEndLabelEdit)
  103.     EVT_BUTTON(wxID_ELB_NEW, wxEditableListBox::OnNewItem)
  104.     EVT_BUTTON(wxID_ELB_UP, wxEditableListBox::OnUpItem)
  105.     EVT_BUTTON(wxID_ELB_DOWN, wxEditableListBox::OnDownItem)
  106.     EVT_BUTTON(wxID_ELB_EDIT, wxEditableListBox::OnEditItem)
  107.     EVT_BUTTON(wxID_ELB_DELETE, wxEditableListBox::OnDelItem)
  108. END_EVENT_TABLE()
  109.  
  110. wxEditableListBox::wxEditableListBox(wxWindow *parent, wxWindowID id,
  111.                           const wxString& label,
  112.                           const wxPoint& pos, const wxSize& size,
  113.                           long style,
  114.                           const wxString& name)
  115.    : wxPanel(parent, id, pos, size, wxTAB_TRAVERSAL, name)
  116. {
  117.     m_style = style;
  118.     m_bEdit = m_bNew = m_bDel = m_bUp = m_bDown = NULL;    
  119.  
  120.     wxSizer *sizer = new wxBoxSizer(wxVERTICAL);
  121.  
  122.     wxPanel *subp = new wxPanel(this, -1, wxDefaultPosition, wxDefaultSize,
  123.                                 wxSUNKEN_BORDER | wxTAB_TRAVERSAL);
  124.     wxSizer *subsizer = new wxBoxSizer(wxHORIZONTAL);
  125.     subsizer->Add(new wxStaticText(subp, -1, label), 1, wxALIGN_CENTRE_VERTICAL | wxLEFT, 4);
  126.  
  127. #ifdef __WXMSW__
  128.     #define BTN_BORDER 4
  129.     // FIXME - why is this needed? There's some reason why sunken border is
  130.     //         ignored by sizers in wxMSW but not in wxGTK that I can't
  131.     //         figure out...
  132. #else
  133.     #define BTN_BORDER 0
  134. #endif
  135.  
  136.     if ( m_style & wxEL_ALLOW_EDIT )
  137.     {
  138.         m_bEdit = new wxBitmapButton(subp, wxID_ELB_EDIT, wxBitmap(eledit_xpm));
  139.         subsizer->Add(m_bEdit, 0, wxALIGN_CENTRE_VERTICAL | wxTOP | wxBOTTOM, BTN_BORDER);
  140.     }
  141.  
  142.     if ( m_style & wxEL_ALLOW_NEW )
  143.     {
  144.         m_bNew = new wxBitmapButton(subp, wxID_ELB_NEW, wxBitmap(elnew_xpm));
  145.         subsizer->Add(m_bNew, 0, wxALIGN_CENTRE_VERTICAL | wxTOP | wxBOTTOM, BTN_BORDER);
  146.     }
  147.  
  148.     if ( m_style & wxEL_ALLOW_DELETE )
  149.     {
  150.         m_bDel = new wxBitmapButton(subp, wxID_ELB_DELETE, wxBitmap(eldel_xpm));
  151.         subsizer->Add(m_bDel, 0, wxALIGN_CENTRE_VERTICAL | wxTOP | wxBOTTOM, BTN_BORDER);
  152.     }
  153.  
  154.     m_bUp = new wxBitmapButton(subp, wxID_ELB_UP, wxBitmap(elup_xpm));
  155.     subsizer->Add(m_bUp, 0, wxALIGN_CENTRE_VERTICAL | wxTOP | wxBOTTOM, BTN_BORDER);
  156.  
  157.     m_bDown = new wxBitmapButton(subp, wxID_ELB_DOWN, wxBitmap(eldown_xpm));
  158.     subsizer->Add(m_bDown, 0, wxALIGN_CENTRE_VERTICAL | wxTOP | wxBOTTOM, BTN_BORDER);
  159.  
  160. #if wxUSE_TOOLTIPS
  161.     if ( m_bEdit ) m_bEdit->SetToolTip(wxT("Edit item"));
  162.     if ( m_bNew ) m_bNew->SetToolTip(wxT("New item"));
  163.     if ( m_bDel ) m_bDel->SetToolTip(wxT("Delete item"));
  164.     m_bUp->SetToolTip(wxT("Move up"));
  165.     m_bDown->SetToolTip(wxT("Move down"));
  166. #endif
  167.  
  168.     subp->SetAutoLayout(TRUE);
  169.     subp->SetSizer(subsizer);
  170.     subsizer->Fit(subp);
  171.  
  172.     sizer->Add(subp, 0, wxEXPAND);
  173.  
  174.     long st = wxLC_REPORT | wxLC_NO_HEADER | wxLC_SINGLE_SEL | wxSUNKEN_BORDER;
  175.     if ( style & wxEL_ALLOW_EDIT )
  176.          st |= wxLC_EDIT_LABELS;
  177.     m_listCtrl = new CleverListCtrl(this, wxID_ELD_LISTCTRL,
  178.                                     wxDefaultPosition, wxDefaultSize, st);
  179.     wxArrayString empty_ar;
  180.     SetStrings(empty_ar);
  181.  
  182.     sizer->Add(m_listCtrl, 1, wxEXPAND);
  183.  
  184.     SetAutoLayout(TRUE);
  185.     SetSizer(sizer);
  186.     Layout();
  187. }
  188.  
  189. void wxEditableListBox::SetStrings(const wxArrayString& strings)
  190. {
  191.     m_listCtrl->DeleteAllItems();
  192.     size_t i;
  193.  
  194.     for (i = 0; i < strings.GetCount(); i++)
  195.         m_listCtrl->InsertItem(i, strings[i]);
  196.  
  197.     m_listCtrl->InsertItem(strings.GetCount(), _T(""));
  198.     m_listCtrl->SetItemState(0, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED);
  199. }
  200.  
  201. void wxEditableListBox::GetStrings(wxArrayString& strings)
  202. {
  203.     strings.Clear();
  204.  
  205.     for (int i = 0; i < m_listCtrl->GetItemCount()-1; i++)
  206.         strings.Add(m_listCtrl->GetItemText(i));
  207. }
  208.  
  209. void wxEditableListBox::OnItemSelected(wxListEvent& event)
  210. {
  211.     m_selection = event.GetIndex();
  212.     m_bUp->Enable(m_selection != 0 && m_selection < m_listCtrl->GetItemCount()-1);
  213.     m_bDown->Enable(m_selection < m_listCtrl->GetItemCount()-2);
  214.     if (m_style & wxEL_ALLOW_EDIT)
  215.         m_bEdit->Enable(m_selection < m_listCtrl->GetItemCount()-1);
  216.     if (m_style & wxEL_ALLOW_DELETE)
  217.         m_bDel->Enable(m_selection < m_listCtrl->GetItemCount()-1);
  218. }
  219.  
  220. void wxEditableListBox::OnNewItem(wxCommandEvent& event)
  221. {
  222.     m_listCtrl->SetItemState(m_listCtrl->GetItemCount()-1,
  223.                              wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED);
  224.     m_listCtrl->EditLabel(m_selection);
  225. }
  226.  
  227. void wxEditableListBox::OnEndLabelEdit(wxListEvent& event)
  228. {
  229.     if ( event.GetIndex() == m_listCtrl->GetItemCount()-1 && 
  230.          !event.GetText().IsEmpty() )
  231.     {
  232.         // The user edited last (empty) line, i.e. added new entry. We have to
  233.         // add new empty line here so that adding one more line is still
  234.         // possible:
  235.         m_listCtrl->InsertItem(m_listCtrl->GetItemCount(), _T(""));
  236.     }
  237. }
  238.  
  239. void wxEditableListBox::OnDelItem(wxCommandEvent& event)
  240. {
  241.     m_listCtrl->DeleteItem(m_selection);
  242.     m_listCtrl->SetItemState(m_selection,
  243.                              wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED);
  244. }
  245.  
  246. void wxEditableListBox::OnEditItem(wxCommandEvent& event)
  247. {
  248.     m_listCtrl->EditLabel(m_selection);
  249. }
  250.  
  251. void wxEditableListBox::OnUpItem(wxCommandEvent& event)
  252. {
  253.     wxString t1, t2;
  254.  
  255.     t1 = m_listCtrl->GetItemText(m_selection - 1);
  256.     t2 = m_listCtrl->GetItemText(m_selection);
  257.     m_listCtrl->SetItemText(m_selection - 1, t2);
  258.     m_listCtrl->SetItemText(m_selection, t1);
  259.     m_listCtrl->SetItemState(m_selection - 1,
  260.                              wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED);
  261. }
  262.  
  263. void wxEditableListBox::OnDownItem(wxCommandEvent& event)
  264. {
  265.     wxString t1, t2;
  266.  
  267.     t1 = m_listCtrl->GetItemText(m_selection + 1);
  268.     t2 = m_listCtrl->GetItemText(m_selection);
  269.     m_listCtrl->SetItemText(m_selection + 1, t2);
  270.     m_listCtrl->SetItemText(m_selection, t1);
  271.     m_listCtrl->SetItemState(m_selection + 1,
  272.                              wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED);
  273. }
  274.