From f55d21ebb5d3392dd7e5990f7bdbb523f3089f6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Sat, 5 May 2001 18:05:12 +0000 Subject: [PATCH] added new gizmo: wxEditableListBox git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10004 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- contrib/include/wx/gizmos/editlbox.h | 58 +++++ contrib/samples/gizmos/editlbox/Makefile.in | 23 ++ contrib/samples/gizmos/editlbox/test.cpp | 64 ++++++ contrib/samples/gizmos/editlbox/test.rc | 3 + contrib/src/gizmos/Makefile.in | 4 +- contrib/src/gizmos/editlbox.cpp | 230 ++++++++++++++++++++ contrib/src/gizmos/eldel.xpm | 22 ++ contrib/src/gizmos/eldown.xpm | 21 ++ contrib/src/gizmos/eledit.xpm | 22 ++ contrib/src/gizmos/elnew.xpm | 24 ++ contrib/src/gizmos/elup.xpm | 21 ++ 11 files changed, 490 insertions(+), 2 deletions(-) create mode 100644 contrib/include/wx/gizmos/editlbox.h create mode 100644 contrib/samples/gizmos/editlbox/Makefile.in create mode 100644 contrib/samples/gizmos/editlbox/test.cpp create mode 100644 contrib/samples/gizmos/editlbox/test.rc create mode 100644 contrib/src/gizmos/editlbox.cpp create mode 100644 contrib/src/gizmos/eldel.xpm create mode 100644 contrib/src/gizmos/eldown.xpm create mode 100644 contrib/src/gizmos/eledit.xpm create mode 100644 contrib/src/gizmos/elnew.xpm create mode 100644 contrib/src/gizmos/elup.xpm diff --git a/contrib/include/wx/gizmos/editlbox.h b/contrib/include/wx/gizmos/editlbox.h new file mode 100644 index 0000000000..256c50511f --- /dev/null +++ b/contrib/include/wx/gizmos/editlbox.h @@ -0,0 +1,58 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: editlbox.h +// Purpose: ListBox with editable items +// Author: Vaclav Slavik +// RCS-ID: $Id$ +// Copyright: (c) Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + + +#ifndef __WX_EDITLBOX_H__ +#define __WX_EDITLBOX_H__ + +#ifdef __GNUG__ + #pragma interface "editlbox.h" +#endif + +#include "wx/panel.h" + + +class WXDLLEXPORT wxBitmapButton; +class WXDLLEXPORT wxListCtrl; +class WXDLLEXPORT wxListEvent; + +// This class provides a composite control that lets the +// user easily enter list of strings + +class WXDLLEXPORT wxEditableListBox : public wxPanel +{ + DECLARE_CLASS(wxEditableListBox); + +public: + wxEditableListBox(wxWindow *parent, wxWindowID id, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize); + + void SetStrings(const wxArrayString& strings); + void GetStrings(wxArrayString& strings); + +protected: + wxBitmapButton *m_bDel, *m_bNew, *m_bUp, *m_bDown, *m_bEdit; + wxListCtrl *m_listCtrl; + int m_selection; + bool m_edittingNew; + + void OnItemSelected(wxListEvent& event); + void OnEndLabelEdit(wxListEvent& event); + void OnNewItem(wxCommandEvent& event); + void OnDelItem(wxCommandEvent& event); + void OnEditItem(wxCommandEvent& event); + void OnUpItem(wxCommandEvent& event); + void OnDownItem(wxCommandEvent& event); + + DECLARE_EVENT_TABLE() +}; + +#endif diff --git a/contrib/samples/gizmos/editlbox/Makefile.in b/contrib/samples/gizmos/editlbox/Makefile.in new file mode 100644 index 0000000000..465981c704 --- /dev/null +++ b/contrib/samples/gizmos/editlbox/Makefile.in @@ -0,0 +1,23 @@ +# +# File: Makefile.in +# Author: Julian Smart +# Created: 2000 +# Updated: +# Copyright: (c) 2000 Julian Smart +# +# "%W% %G%" +# +# Makefile for the editlbox example (UNIX). + +top_srcdir = @top_srcdir@/.. +top_builddir = ../../../.. +program_dir = contrib/samples/gizmos/editlbox + +PROGRAM=test +OBJECTS=test.o + +APPEXTRALIBS=$(top_builddir)/lib/libgizmos.@WX_TARGET_LIBRARY_TYPE@ +APPEXTRADEFS=-I$(top_srcdir)/contrib/include + +include $(top_builddir)/src/makeprog.env + diff --git a/contrib/samples/gizmos/editlbox/test.cpp b/contrib/samples/gizmos/editlbox/test.cpp new file mode 100644 index 0000000000..eb96a93698 --- /dev/null +++ b/contrib/samples/gizmos/editlbox/test.cpp @@ -0,0 +1,64 @@ +// For compilers that support precompilation, includes "wx/wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// for all others, include the necessary headers (this file is usually all you +// need because it includes almost all "standard" wxWindows headers) +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +#include "wx/gizmos/editlbox.h" +#include "wx/sizer.h" + +class MyApp : public wxApp +{ +public: + virtual bool OnInit(); +}; + +IMPLEMENT_APP(MyApp) + + +bool MyApp::OnInit() +{ + wxDialog dlg(NULL, -1, _("Test dialog"), wxDefaultPosition, wxDefaultSize, + wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER); + + wxSizer *sizer = new wxBoxSizer(wxVERTICAL); + sizer->Add(new wxEditableListBox(&dlg, -1, _("Match these wildcards:"), + wxDefaultPosition,wxSize(300,200)), + 1, wxEXPAND|wxALL, 10); + + sizer->Add(5,5); + + wxEditableListBox *lb = new wxEditableListBox(&dlg, -1, _("Except:"), + wxDefaultPosition,wxSize(300,200)); + wxArrayString ar; + ar.Add(_T("*.cpp")); + ar.Add(_T("*.h")); + ar.Add(_T("*.c")); + lb->SetStrings(ar); + + sizer->Add(lb, 1, wxEXPAND|wxALL, 10); + + sizer->Add(5,5); + + sizer->Add(new wxButton(&dlg, wxID_OK, _("OK")), 0, wxALIGN_RIGHT | wxALL, 10); + dlg.SetAutoLayout(TRUE); + dlg.SetSizer(sizer); + sizer->Fit(&dlg); + + dlg.ShowModal(); + + wxString res = _("'Except' contains these strings:\n\n"); + lb->GetStrings(ar); + for (size_t i = 0; i < ar.GetCount(); i++) + res << ar[i] << _T("\n"); + wxMessageBox(res); + + return TRUE; +} diff --git a/contrib/samples/gizmos/editlbox/test.rc b/contrib/samples/gizmos/editlbox/test.rc new file mode 100644 index 0000000000..878f3352fb --- /dev/null +++ b/contrib/samples/gizmos/editlbox/test.rc @@ -0,0 +1,3 @@ +#include "wx/msw/wx.rc" + + diff --git a/contrib/src/gizmos/Makefile.in b/contrib/src/gizmos/Makefile.in index 979d88de28..b015c7d15f 100644 --- a/contrib/src/gizmos/Makefile.in +++ b/contrib/src/gizmos/Makefile.in @@ -13,9 +13,9 @@ LIBVERSION_AGE=0 HEADER_PATH=$(top_srcdir)/contrib/include/wx HEADER_SUBDIR=gizmos -HEADERS=multicell.h splittree.h +HEADERS=multicell.h splittree.h editlbox.h -OBJECTS=multicell.o splittree.o +OBJECTS=multicell.o splittree.o editlbox.o APPEXTRADEFS=-I$(top_srcdir)/contrib/include diff --git a/contrib/src/gizmos/editlbox.cpp b/contrib/src/gizmos/editlbox.cpp new file mode 100644 index 0000000000..28a43fa5d1 --- /dev/null +++ b/contrib/src/gizmos/editlbox.cpp @@ -0,0 +1,230 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: editlbox.cpp +// Purpose: ListBox with editable items +// Author: Vaclav Slavik +// RCS-ID: $Id$ +// Copyright: (c) Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifdef __GNUG__ + #pragma implementation "editlbox.h" +#endif + +// For compilers that support precompilation, includes "wx/wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// for all others, include the necessary headers (this file is usually all you +// need because it includes almost all "standard" wxWindows headers) +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +#include "wx/gizmos/editlbox.h" +#include "wx/sizer.h" +#include "wx/listctrl.h" + + + + +// list control with auto-resizable column: +class CleverListCtrl : public wxListCtrl +{ +public: + CleverListCtrl(wxWindow *parent, + wxWindowID id = -1, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = wxLC_ICON, + const wxValidator& validator = wxDefaultValidator, + const wxString &name = "listctrl") + : wxListCtrl(parent, id, pos, size, style, validator, name) + { + CreateColumns(); + } + + void CreateColumns() + { + InsertColumn(0, _T("item")); + SizeColumns(); + } + + void SizeColumns() + { + int w = GetSize().x; + w -= wxSystemSettings::GetSystemMetric(wxSYS_VSCROLL_X) + 6; + SetColumnWidth(0, w); + } + +private: + DECLARE_EVENT_TABLE() + void OnSize(wxSizeEvent& event) + { + SizeColumns(); + } +}; + +BEGIN_EVENT_TABLE(CleverListCtrl, wxListCtrl) + EVT_SIZE(CleverListCtrl::OnSize) +END_EVENT_TABLE() + + +#include "eldel.xpm" +#include "eldown.xpm" +#include "eledit.xpm" +#include "elnew.xpm" +#include "elup.xpm" + +IMPLEMENT_CLASS(wxEditableListBox, wxPanel) + +enum +{ + // ID value doesn't matter, it won't propagate out of wxEditableListBox + // instance + wxID_ELB_DELETE = wxID_HIGHEST + 1, + wxID_ELB_NEW, + wxID_ELB_UP, + wxID_ELB_DOWN, + wxID_ELB_EDIT, + wxID_ELD_LISTCTRL +}; + +BEGIN_EVENT_TABLE(wxEditableListBox, wxPanel) + EVT_LIST_ITEM_SELECTED(wxID_ELD_LISTCTRL, wxEditableListBox::OnItemSelected) + EVT_LIST_END_LABEL_EDIT(wxID_ELD_LISTCTRL, wxEditableListBox::OnEndLabelEdit) + EVT_BUTTON(wxID_ELB_NEW, wxEditableListBox::OnNewItem) + EVT_BUTTON(wxID_ELB_UP, wxEditableListBox::OnUpItem) + EVT_BUTTON(wxID_ELB_DOWN, wxEditableListBox::OnDownItem) + EVT_BUTTON(wxID_ELB_EDIT, wxEditableListBox::OnEditItem) + EVT_BUTTON(wxID_ELB_DELETE, wxEditableListBox::OnDelItem) +END_EVENT_TABLE() + +wxEditableListBox::wxEditableListBox(wxWindow *parent, wxWindowID id, + const wxString& label, + const wxPoint& pos, const wxSize& size) + : wxPanel(parent, id, pos, size), m_edittingNew(FALSE) +{ + wxSizer *sizer = new wxBoxSizer(wxVERTICAL); + + wxPanel *subp = new wxPanel(this, -1, wxDefaultPosition, wxDefaultSize, + wxSUNKEN_BORDER | wxTAB_TRAVERSAL); + wxSizer *subsizer = new wxBoxSizer(wxHORIZONTAL); + subsizer->Add(new wxStaticText(subp, -1, label), 1, wxALIGN_CENTRE_VERTICAL | wxLEFT, 4); + m_bEdit = new wxBitmapButton(subp, wxID_ELB_EDIT, wxBitmap(eledit_xpm)); + m_bNew = new wxBitmapButton(subp, wxID_ELB_NEW, wxBitmap(elnew_xpm)); + m_bDel = new wxBitmapButton(subp, wxID_ELB_DELETE, wxBitmap(eldel_xpm)); + m_bUp = new wxBitmapButton(subp, wxID_ELB_UP, wxBitmap(elup_xpm)); + m_bDown = new wxBitmapButton(subp, wxID_ELB_DOWN, wxBitmap(eldown_xpm)); + subsizer->Add(m_bEdit, 0, wxALIGN_CENTRE_VERTICAL); + subsizer->Add(m_bNew, 0, wxALIGN_CENTRE_VERTICAL); + subsizer->Add(m_bDel, 0, wxALIGN_CENTRE_VERTICAL); + subsizer->Add(m_bUp, 0, wxALIGN_CENTRE_VERTICAL); + subsizer->Add(m_bDown, 0, wxALIGN_CENTRE_VERTICAL); + + subp->SetAutoLayout(TRUE); + subp->SetSizer(subsizer); + subsizer->Fit(subp); + + sizer->Add(subp, 0, wxEXPAND); + m_listCtrl = new CleverListCtrl(this, wxID_ELD_LISTCTRL, + wxDefaultPosition, wxDefaultSize, + wxLC_REPORT | wxLC_NO_HEADER | + wxLC_SINGLE_SEL | wxSUNKEN_BORDER); + wxArrayString empty_ar; + SetStrings(empty_ar); + + sizer->Add(m_listCtrl, 1, wxEXPAND); + + SetAutoLayout(TRUE); + SetSizer(sizer); +} + +void wxEditableListBox::SetStrings(const wxArrayString& strings) +{ + m_listCtrl->DeleteAllItems(); + size_t i; + + for (i = 0; i < strings.GetCount(); i++) + m_listCtrl->InsertItem(i, strings[i]); + + m_listCtrl->InsertItem(strings.GetCount(), _T("")); + m_listCtrl->SetItemState(0, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED); +} + +void wxEditableListBox::GetStrings(wxArrayString& strings) +{ + strings.Clear(); + + for (int i = 0; i < m_listCtrl->GetItemCount()-1; i++) + strings.Add(m_listCtrl->GetItemText(i)); +} + +void wxEditableListBox::OnItemSelected(wxListEvent& event) +{ + m_selection = event.GetIndex(); + m_bUp->Enable(m_selection != 0 && m_selection < m_listCtrl->GetItemCount()-1); + m_bDown->Enable(m_selection < m_listCtrl->GetItemCount()-2); + m_bEdit->Enable(m_selection < m_listCtrl->GetItemCount()-1); + m_bDel->Enable(m_selection < m_listCtrl->GetItemCount()-1); +} + +void wxEditableListBox::OnNewItem(wxCommandEvent& event) +{ + m_listCtrl->SetItemState(m_listCtrl->GetItemCount()-1, + wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED); + m_edittingNew = TRUE; + m_listCtrl->EditLabel(m_selection); +} + +void wxEditableListBox::OnEndLabelEdit(wxListEvent& event) +{ + if (m_edittingNew) + { + m_edittingNew = FALSE; + if (!event.GetText().IsEmpty()) + { + printf("X-\n"); + m_listCtrl->InsertItem(m_listCtrl->GetItemCount(), _T("")); + } + } +} + +void wxEditableListBox::OnDelItem(wxCommandEvent& event) +{ + m_listCtrl->DeleteItem(m_selection); + m_listCtrl->SetItemState(m_selection, + wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED); +} + +void wxEditableListBox::OnEditItem(wxCommandEvent& event) +{ + m_listCtrl->EditLabel(m_selection); +} + +void wxEditableListBox::OnUpItem(wxCommandEvent& event) +{ + wxString t1, t2; + + t1 = m_listCtrl->GetItemText(m_selection - 1); + t2 = m_listCtrl->GetItemText(m_selection); + m_listCtrl->SetItemText(m_selection - 1, t2); + m_listCtrl->SetItemText(m_selection, t1); + m_listCtrl->SetItemState(m_selection - 1, + wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED); +} + +void wxEditableListBox::OnDownItem(wxCommandEvent& event) +{ + wxString t1, t2; + + t1 = m_listCtrl->GetItemText(m_selection + 1); + t2 = m_listCtrl->GetItemText(m_selection); + m_listCtrl->SetItemText(m_selection + 1, t2); + m_listCtrl->SetItemText(m_selection, t1); + m_listCtrl->SetItemState(m_selection + 1, + wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED); +} diff --git a/contrib/src/gizmos/eldel.xpm b/contrib/src/gizmos/eldel.xpm new file mode 100644 index 0000000000..9b83bb0441 --- /dev/null +++ b/contrib/src/gizmos/eldel.xpm @@ -0,0 +1,22 @@ +/* XPM */ +static char * eldel_xpm[] = { +"16 16 3 1", +" c None", +". c #7F0000", +"+ c #FFFFFF", +" ", +" ", +" ", +" ..+ ..+ ", +" ....+ ..+ ", +" ....+ ..+ ", +" ...+ .+ ", +" .....+ ", +" ...+ ", +" .....+ ", +" ...+ ..+ ", +" ...+ ..+ ", +" ...+ .+ ", +" ...+ .+ ", +" . . ", +" "}; diff --git a/contrib/src/gizmos/eldown.xpm b/contrib/src/gizmos/eldown.xpm new file mode 100644 index 0000000000..656cb9c4f1 --- /dev/null +++ b/contrib/src/gizmos/eldown.xpm @@ -0,0 +1,21 @@ +/* XPM */ +static char * eldown_xpm[] = { +"16 16 2 1", +" c None", +". c #000000", +" ", +" ", +" ... ", +" ... ", +" ... ", +" ... ", +" ... ", +" ... ", +" ........... ", +" ......... ", +" ....... ", +" ..... ", +" ... ", +" . ", +" ", +" "}; diff --git a/contrib/src/gizmos/eledit.xpm b/contrib/src/gizmos/eledit.xpm new file mode 100644 index 0000000000..4cbd05eafd --- /dev/null +++ b/contrib/src/gizmos/eledit.xpm @@ -0,0 +1,22 @@ +/* XPM */ +static char * eledit_xpm[] = { +"16 16 3 1", +" c None", +". c #000000", +"+ c #00007F", +" ", +" ", +" .. .. ", +" . ", +" . ", +" ++++ . ++++ ", +" ++ . ++ ++", +" +++++ . ++++++", +" ++ ++ . ++ ", +" ++ ++ . ++ ++", +" +++++ . ++++ ", +" . ", +" . ", +" .. .. ", +" ", +" "}; diff --git a/contrib/src/gizmos/elnew.xpm b/contrib/src/gizmos/elnew.xpm new file mode 100644 index 0000000000..3d0d67f4ac --- /dev/null +++ b/contrib/src/gizmos/elnew.xpm @@ -0,0 +1,24 @@ +/* XPM */ +static char * elnew_xpm[] = { +"16 16 5 1", +" c None", +". c #7F7F7F", +"+ c #FFFFFF", +"@ c #FFFF00", +"# c #000000", +" ", +" ", +" . .+ .@ ", +" . .@.@# # # ", +" @.@+.... # ", +" ... @@ ", +" @ . @. # ", +" .# .@ ", +" . # ", +" # ", +" # ", +" # ", +" # ", +" # # # # # # ", +" ", +" "}; diff --git a/contrib/src/gizmos/elup.xpm b/contrib/src/gizmos/elup.xpm new file mode 100644 index 0000000000..01193ed821 --- /dev/null +++ b/contrib/src/gizmos/elup.xpm @@ -0,0 +1,21 @@ +/* XPM */ +static char * elup_xpm[] = { +"16 16 2 1", +" c None", +". c #000000", +" ", +" . ", +" ... ", +" ..... ", +" ....... ", +" ......... ", +" ........... ", +" ... ", +" ... ", +" ... ", +" ... ", +" ... ", +" ... ", +" ", +" ", +" "};