From af67f39da8ecf7c29ba5071ac49456d506c111cf Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 16 Dec 2008 23:56:56 +0000 Subject: [PATCH] added wxRearrange{List,Ctrl,Dialog} and use it in wxHeaderCtrl and wxGrid to provide a way to interactively customize the columns git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57379 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- Makefile.in | 21 +++ build/bakefiles/files.bkl | 2 + build/msw/makefile.bcc | 28 ++++ build/msw/makefile.gcc | 28 ++++ build/msw/makefile.vc | 28 ++++ build/msw/makefile.wat | 28 ++++ build/msw/wx_core.dsp | 8 + build/msw/wx_vc7_core.vcproj | 6 + build/msw/wx_vc8_core.vcproj | 8 + build/msw/wx_vc9_core.vcproj | 8 + docs/changes.txt | 2 + include/wx/headerctrl.h | 11 +- include/wx/rearrangectrl.h | 194 ++++++++++++++++++++++ interface/wx/headerctrl.h | 107 ++++++++++-- interface/wx/rearrangectrl.h | 305 +++++++++++++++++++++++++++++++++++ src/common/headerctrlcmn.cpp | 80 ++++++++- src/common/rearrangectrl.cpp | 245 ++++++++++++++++++++++++++++ src/generic/grid.cpp | 8 + 18 files changed, 1095 insertions(+), 22 deletions(-) create mode 100644 include/wx/rearrangectrl.h create mode 100644 interface/wx/rearrangectrl.h create mode 100644 src/common/rearrangectrl.cpp diff --git a/Makefile.in b/Makefile.in index 88126075e8..374357fcbe 100644 --- a/Makefile.in +++ b/Makefile.in @@ -3673,6 +3673,7 @@ COND_USE_GUI_1_ALL_GUI_HEADERS = \ wx/position.h \ wx/radiobox.h \ wx/radiobut.h \ + wx/rearrangectrl.h \ wx/renderer.h \ wx/scrolbar.h \ wx/scrolbar.h \ @@ -4250,6 +4251,7 @@ COND_USE_GUI_1_WXUNIV_0___CORE_SRC_OBJECTS = \ monodll_prntbase.o \ monodll_quantize.o \ monodll_radiocmn.o \ + monodll_rearrangectrl.o \ monodll_rendcmn.o \ monodll_rgncmn.o \ monodll_settcmn.o \ @@ -4440,6 +4442,7 @@ COND_USE_GUI_1_WXUNIV_1___CORE_SRC_OBJECTS = \ monodll_prntbase.o \ monodll_quantize.o \ monodll_radiocmn.o \ + monodll_rearrangectrl.o \ monodll_rendcmn.o \ monodll_rgncmn.o \ monodll_settcmn.o \ @@ -6070,6 +6073,7 @@ COND_USE_GUI_1_WXUNIV_0___CORE_SRC_OBJECTS_1 = \ monolib_prntbase.o \ monolib_quantize.o \ monolib_radiocmn.o \ + monolib_rearrangectrl.o \ monolib_rendcmn.o \ monolib_rgncmn.o \ monolib_settcmn.o \ @@ -6260,6 +6264,7 @@ COND_USE_GUI_1_WXUNIV_1___CORE_SRC_OBJECTS_1 = \ monolib_prntbase.o \ monolib_quantize.o \ monolib_radiocmn.o \ + monolib_rearrangectrl.o \ monolib_rendcmn.o \ monolib_rgncmn.o \ monolib_settcmn.o \ @@ -8040,6 +8045,7 @@ COND_USE_GUI_1_WXUNIV_0___CORE_SRC_OBJECTS_2 = \ coredll_prntbase.o \ coredll_quantize.o \ coredll_radiocmn.o \ + coredll_rearrangectrl.o \ coredll_rendcmn.o \ coredll_rgncmn.o \ coredll_settcmn.o \ @@ -8230,6 +8236,7 @@ COND_USE_GUI_1_WXUNIV_1___CORE_SRC_OBJECTS_2 = \ coredll_prntbase.o \ coredll_quantize.o \ coredll_radiocmn.o \ + coredll_rearrangectrl.o \ coredll_rendcmn.o \ coredll_rgncmn.o \ coredll_settcmn.o \ @@ -9552,6 +9559,7 @@ COND_USE_GUI_1_WXUNIV_0___CORE_SRC_OBJECTS_3 = \ corelib_prntbase.o \ corelib_quantize.o \ corelib_radiocmn.o \ + corelib_rearrangectrl.o \ corelib_rendcmn.o \ corelib_rgncmn.o \ corelib_settcmn.o \ @@ -9742,6 +9750,7 @@ COND_USE_GUI_1_WXUNIV_1___CORE_SRC_OBJECTS_3 = \ corelib_prntbase.o \ corelib_quantize.o \ corelib_radiocmn.o \ + corelib_rearrangectrl.o \ corelib_rendcmn.o \ corelib_rgncmn.o \ corelib_settcmn.o \ @@ -18365,6 +18374,9 @@ monodll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONODLL_ODEP) @COND_USE_GUI_1@monodll_radiocmn.o: $(srcdir)/src/common/radiocmn.cpp $(MONODLL_ODEP) @COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/radiocmn.cpp +@COND_USE_GUI_1@monodll_rearrangectrl.o: $(srcdir)/src/common/rearrangectrl.cpp $(MONODLL_ODEP) +@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/rearrangectrl.cpp + @COND_USE_GUI_1@monodll_rendcmn.o: $(srcdir)/src/common/rendcmn.cpp $(MONODLL_ODEP) @COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/rendcmn.cpp @@ -23060,6 +23072,9 @@ monolib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONOLIB_ODEP) @COND_USE_GUI_1@monolib_radiocmn.o: $(srcdir)/src/common/radiocmn.cpp $(MONOLIB_ODEP) @COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/radiocmn.cpp +@COND_USE_GUI_1@monolib_rearrangectrl.o: $(srcdir)/src/common/rearrangectrl.cpp $(MONOLIB_ODEP) +@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/rearrangectrl.cpp + @COND_USE_GUI_1@monolib_rendcmn.o: $(srcdir)/src/common/rendcmn.cpp $(MONOLIB_ODEP) @COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/rendcmn.cpp @@ -27944,6 +27959,9 @@ coredll_win32.o: $(srcdir)/src/univ/themes/win32.cpp $(COREDLL_ODEP) @COND_USE_GUI_1@coredll_radiocmn.o: $(srcdir)/src/common/radiocmn.cpp $(COREDLL_ODEP) @COND_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/common/radiocmn.cpp +@COND_USE_GUI_1@coredll_rearrangectrl.o: $(srcdir)/src/common/rearrangectrl.cpp $(COREDLL_ODEP) +@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/common/rearrangectrl.cpp + @COND_USE_GUI_1@coredll_rendcmn.o: $(srcdir)/src/common/rendcmn.cpp $(COREDLL_ODEP) @COND_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/common/rendcmn.cpp @@ -31466,6 +31484,9 @@ corelib_win32.o: $(srcdir)/src/univ/themes/win32.cpp $(CORELIB_ODEP) @COND_USE_GUI_1@corelib_radiocmn.o: $(srcdir)/src/common/radiocmn.cpp $(CORELIB_ODEP) @COND_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/common/radiocmn.cpp +@COND_USE_GUI_1@corelib_rearrangectrl.o: $(srcdir)/src/common/rearrangectrl.cpp $(CORELIB_ODEP) +@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/common/rearrangectrl.cpp + @COND_USE_GUI_1@corelib_rendcmn.o: $(srcdir)/src/common/rendcmn.cpp $(CORELIB_ODEP) @COND_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/common/rendcmn.cpp diff --git a/build/bakefiles/files.bkl b/build/bakefiles/files.bkl index 91b1c34f4d..0b6d686830 100644 --- a/build/bakefiles/files.bkl +++ b/build/bakefiles/files.bkl @@ -684,6 +684,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! src/common/prntbase.cpp src/common/quantize.cpp src/common/radiocmn.cpp + src/common/rearrangectrl.cpp src/common/rendcmn.cpp src/common/rgncmn.cpp src/common/settcmn.cpp @@ -813,6 +814,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! wx/position.h wx/radiobox.h wx/radiobut.h + wx/rearrangectrl.h wx/renderer.h wx/scrolbar.h wx/scrolbar.h diff --git a/build/msw/makefile.bcc b/build/msw/makefile.bcc index 90b61eba64..dab153b014 100644 --- a/build/msw/makefile.bcc +++ b/build/msw/makefile.bcc @@ -1713,6 +1713,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \ $(OBJS)\monodll_prntbase.obj \ $(OBJS)\monodll_quantize.obj \ $(OBJS)\monodll_radiocmn.obj \ + $(OBJS)\monodll_rearrangectrl.obj \ $(OBJS)\monodll_rendcmn.obj \ $(OBJS)\monodll_rgncmn.obj \ $(OBJS)\monodll_settcmn.obj \ @@ -1950,6 +1951,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \ $(OBJS)\monodll_prntbase.obj \ $(OBJS)\monodll_quantize.obj \ $(OBJS)\monodll_radiocmn.obj \ + $(OBJS)\monodll_rearrangectrl.obj \ $(OBJS)\monodll_rendcmn.obj \ $(OBJS)\monodll_rgncmn.obj \ $(OBJS)\monodll_settcmn.obj \ @@ -2388,6 +2390,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \ $(OBJS)\monolib_prntbase.obj \ $(OBJS)\monolib_quantize.obj \ $(OBJS)\monolib_radiocmn.obj \ + $(OBJS)\monolib_rearrangectrl.obj \ $(OBJS)\monolib_rendcmn.obj \ $(OBJS)\monolib_rgncmn.obj \ $(OBJS)\monolib_settcmn.obj \ @@ -2625,6 +2628,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \ $(OBJS)\monolib_prntbase.obj \ $(OBJS)\monolib_quantize.obj \ $(OBJS)\monolib_radiocmn.obj \ + $(OBJS)\monolib_rearrangectrl.obj \ $(OBJS)\monolib_rendcmn.obj \ $(OBJS)\monolib_rgncmn.obj \ $(OBJS)\monolib_settcmn.obj \ @@ -2968,6 +2972,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \ $(OBJS)\coredll_prntbase.obj \ $(OBJS)\coredll_quantize.obj \ $(OBJS)\coredll_radiocmn.obj \ + $(OBJS)\coredll_rearrangectrl.obj \ $(OBJS)\coredll_rendcmn.obj \ $(OBJS)\coredll_rgncmn.obj \ $(OBJS)\coredll_settcmn.obj \ @@ -3205,6 +3210,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \ $(OBJS)\coredll_prntbase.obj \ $(OBJS)\coredll_quantize.obj \ $(OBJS)\coredll_radiocmn.obj \ + $(OBJS)\coredll_rearrangectrl.obj \ $(OBJS)\coredll_rendcmn.obj \ $(OBJS)\coredll_rgncmn.obj \ $(OBJS)\coredll_settcmn.obj \ @@ -3447,6 +3453,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \ $(OBJS)\corelib_prntbase.obj \ $(OBJS)\corelib_quantize.obj \ $(OBJS)\corelib_radiocmn.obj \ + $(OBJS)\corelib_rearrangectrl.obj \ $(OBJS)\corelib_rendcmn.obj \ $(OBJS)\corelib_rgncmn.obj \ $(OBJS)\corelib_settcmn.obj \ @@ -3684,6 +3691,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \ $(OBJS)\corelib_prntbase.obj \ $(OBJS)\corelib_quantize.obj \ $(OBJS)\corelib_radiocmn.obj \ + $(OBJS)\corelib_rearrangectrl.obj \ $(OBJS)\corelib_rendcmn.obj \ $(OBJS)\corelib_rgncmn.obj \ $(OBJS)\corelib_settcmn.obj \ @@ -7161,6 +7169,11 @@ $(OBJS)\monodll_radiocmn.obj: ..\..\src\common\radiocmn.cpp $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\common\radiocmn.cpp !endif +!if "$(USE_GUI)" == "1" +$(OBJS)\monodll_rearrangectrl.obj: ..\..\src\common\rearrangectrl.cpp + $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\common\rearrangectrl.cpp +!endif + !if "$(USE_GUI)" == "1" $(OBJS)\monodll_rendcmn.obj: ..\..\src\common\rendcmn.cpp $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\common\rendcmn.cpp @@ -9370,6 +9383,11 @@ $(OBJS)\monolib_radiocmn.obj: ..\..\src\common\radiocmn.cpp $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\radiocmn.cpp !endif +!if "$(USE_GUI)" == "1" +$(OBJS)\monolib_rearrangectrl.obj: ..\..\src\common\rearrangectrl.cpp + $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\rearrangectrl.cpp +!endif + !if "$(USE_GUI)" == "1" $(OBJS)\monolib_rendcmn.obj: ..\..\src\common\rendcmn.cpp $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\rendcmn.cpp @@ -11603,6 +11621,11 @@ $(OBJS)\coredll_radiocmn.obj: ..\..\src\common\radiocmn.cpp $(CXX) -q -c -P -o$@ $(COREDLL_CXXFLAGS) ..\..\src\common\radiocmn.cpp !endif +!if "$(USE_GUI)" == "1" +$(OBJS)\coredll_rearrangectrl.obj: ..\..\src\common\rearrangectrl.cpp + $(CXX) -q -c -P -o$@ $(COREDLL_CXXFLAGS) ..\..\src\common\rearrangectrl.cpp +!endif + !if "$(USE_GUI)" == "1" $(OBJS)\coredll_rendcmn.obj: ..\..\src\common\rendcmn.cpp $(CXX) -q -c -P -o$@ $(COREDLL_CXXFLAGS) ..\..\src\common\rendcmn.cpp @@ -12965,6 +12988,11 @@ $(OBJS)\corelib_radiocmn.obj: ..\..\src\common\radiocmn.cpp $(CXX) -q -c -P -o$@ $(CORELIB_CXXFLAGS) ..\..\src\common\radiocmn.cpp !endif +!if "$(USE_GUI)" == "1" +$(OBJS)\corelib_rearrangectrl.obj: ..\..\src\common\rearrangectrl.cpp + $(CXX) -q -c -P -o$@ $(CORELIB_CXXFLAGS) ..\..\src\common\rearrangectrl.cpp +!endif + !if "$(USE_GUI)" == "1" $(OBJS)\corelib_rendcmn.obj: ..\..\src\common\rendcmn.cpp $(CXX) -q -c -P -o$@ $(CORELIB_CXXFLAGS) ..\..\src\common\rendcmn.cpp diff --git a/build/msw/makefile.gcc b/build/msw/makefile.gcc index 663281f906..e0c7300937 100644 --- a/build/msw/makefile.gcc +++ b/build/msw/makefile.gcc @@ -1731,6 +1731,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \ $(OBJS)\monodll_prntbase.o \ $(OBJS)\monodll_quantize.o \ $(OBJS)\monodll_radiocmn.o \ + $(OBJS)\monodll_rearrangectrl.o \ $(OBJS)\monodll_rendcmn.o \ $(OBJS)\monodll_rgncmn.o \ $(OBJS)\monodll_settcmn.o \ @@ -1970,6 +1971,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \ $(OBJS)\monodll_prntbase.o \ $(OBJS)\monodll_quantize.o \ $(OBJS)\monodll_radiocmn.o \ + $(OBJS)\monodll_rearrangectrl.o \ $(OBJS)\monodll_rendcmn.o \ $(OBJS)\monodll_rgncmn.o \ $(OBJS)\monodll_settcmn.o \ @@ -2412,6 +2414,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \ $(OBJS)\monolib_prntbase.o \ $(OBJS)\monolib_quantize.o \ $(OBJS)\monolib_radiocmn.o \ + $(OBJS)\monolib_rearrangectrl.o \ $(OBJS)\monolib_rendcmn.o \ $(OBJS)\monolib_rgncmn.o \ $(OBJS)\monolib_settcmn.o \ @@ -2651,6 +2654,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \ $(OBJS)\monolib_prntbase.o \ $(OBJS)\monolib_quantize.o \ $(OBJS)\monolib_radiocmn.o \ + $(OBJS)\monolib_rearrangectrl.o \ $(OBJS)\monolib_rendcmn.o \ $(OBJS)\monolib_rgncmn.o \ $(OBJS)\monolib_settcmn.o \ @@ -3008,6 +3012,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \ $(OBJS)\coredll_prntbase.o \ $(OBJS)\coredll_quantize.o \ $(OBJS)\coredll_radiocmn.o \ + $(OBJS)\coredll_rearrangectrl.o \ $(OBJS)\coredll_rendcmn.o \ $(OBJS)\coredll_rgncmn.o \ $(OBJS)\coredll_settcmn.o \ @@ -3247,6 +3252,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \ $(OBJS)\coredll_prntbase.o \ $(OBJS)\coredll_quantize.o \ $(OBJS)\coredll_radiocmn.o \ + $(OBJS)\coredll_rearrangectrl.o \ $(OBJS)\coredll_rendcmn.o \ $(OBJS)\coredll_rgncmn.o \ $(OBJS)\coredll_settcmn.o \ @@ -3495,6 +3501,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \ $(OBJS)\corelib_prntbase.o \ $(OBJS)\corelib_quantize.o \ $(OBJS)\corelib_radiocmn.o \ + $(OBJS)\corelib_rearrangectrl.o \ $(OBJS)\corelib_rendcmn.o \ $(OBJS)\corelib_rgncmn.o \ $(OBJS)\corelib_settcmn.o \ @@ -3734,6 +3741,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \ $(OBJS)\corelib_prntbase.o \ $(OBJS)\corelib_quantize.o \ $(OBJS)\corelib_radiocmn.o \ + $(OBJS)\corelib_rearrangectrl.o \ $(OBJS)\corelib_rendcmn.o \ $(OBJS)\corelib_rgncmn.o \ $(OBJS)\corelib_settcmn.o \ @@ -7425,6 +7433,11 @@ $(OBJS)\monodll_radiocmn.o: ../../src/common/radiocmn.cpp $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $< endif +ifeq ($(USE_GUI),1) +$(OBJS)\monodll_rearrangectrl.o: ../../src/common/rearrangectrl.cpp + $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $< +endif + ifeq ($(USE_GUI),1) $(OBJS)\monodll_rendcmn.o: ../../src/common/rendcmn.cpp $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $< @@ -9748,6 +9761,11 @@ $(OBJS)\monolib_radiocmn.o: ../../src/common/radiocmn.cpp $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $< endif +ifeq ($(USE_GUI),1) +$(OBJS)\monolib_rearrangectrl.o: ../../src/common/rearrangectrl.cpp + $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $< +endif + ifeq ($(USE_GUI),1) $(OBJS)\monolib_rendcmn.o: ../../src/common/rendcmn.cpp $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $< @@ -12095,6 +12113,11 @@ $(OBJS)\coredll_radiocmn.o: ../../src/common/radiocmn.cpp $(CXX) -c -o $@ $(COREDLL_CXXFLAGS) $(CPPDEPS) $< endif +ifeq ($(USE_GUI),1) +$(OBJS)\coredll_rearrangectrl.o: ../../src/common/rearrangectrl.cpp + $(CXX) -c -o $@ $(COREDLL_CXXFLAGS) $(CPPDEPS) $< +endif + ifeq ($(USE_GUI),1) $(OBJS)\coredll_rendcmn.o: ../../src/common/rendcmn.cpp $(CXX) -c -o $@ $(COREDLL_CXXFLAGS) $(CPPDEPS) $< @@ -13569,6 +13592,11 @@ $(OBJS)\corelib_radiocmn.o: ../../src/common/radiocmn.cpp $(CXX) -c -o $@ $(CORELIB_CXXFLAGS) $(CPPDEPS) $< endif +ifeq ($(USE_GUI),1) +$(OBJS)\corelib_rearrangectrl.o: ../../src/common/rearrangectrl.cpp + $(CXX) -c -o $@ $(CORELIB_CXXFLAGS) $(CPPDEPS) $< +endif + ifeq ($(USE_GUI),1) $(OBJS)\corelib_rendcmn.o: ../../src/common/rendcmn.cpp $(CXX) -c -o $@ $(CORELIB_CXXFLAGS) $(CPPDEPS) $< diff --git a/build/msw/makefile.vc b/build/msw/makefile.vc index 2ed31907f2..626d440eec 100644 --- a/build/msw/makefile.vc +++ b/build/msw/makefile.vc @@ -1893,6 +1893,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \ $(OBJS)\monodll_prntbase.obj \ $(OBJS)\monodll_quantize.obj \ $(OBJS)\monodll_radiocmn.obj \ + $(OBJS)\monodll_rearrangectrl.obj \ $(OBJS)\monodll_rendcmn.obj \ $(OBJS)\monodll_rgncmn.obj \ $(OBJS)\monodll_settcmn.obj \ @@ -2130,6 +2131,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \ $(OBJS)\monodll_prntbase.obj \ $(OBJS)\monodll_quantize.obj \ $(OBJS)\monodll_radiocmn.obj \ + $(OBJS)\monodll_rearrangectrl.obj \ $(OBJS)\monodll_rendcmn.obj \ $(OBJS)\monodll_rgncmn.obj \ $(OBJS)\monodll_settcmn.obj \ @@ -2574,6 +2576,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \ $(OBJS)\monolib_prntbase.obj \ $(OBJS)\monolib_quantize.obj \ $(OBJS)\monolib_radiocmn.obj \ + $(OBJS)\monolib_rearrangectrl.obj \ $(OBJS)\monolib_rendcmn.obj \ $(OBJS)\monolib_rgncmn.obj \ $(OBJS)\monolib_settcmn.obj \ @@ -2811,6 +2814,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \ $(OBJS)\monolib_prntbase.obj \ $(OBJS)\monolib_quantize.obj \ $(OBJS)\monolib_radiocmn.obj \ + $(OBJS)\monolib_rearrangectrl.obj \ $(OBJS)\monolib_rendcmn.obj \ $(OBJS)\monolib_rgncmn.obj \ $(OBJS)\monolib_settcmn.obj \ @@ -3184,6 +3188,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \ $(OBJS)\coredll_prntbase.obj \ $(OBJS)\coredll_quantize.obj \ $(OBJS)\coredll_radiocmn.obj \ + $(OBJS)\coredll_rearrangectrl.obj \ $(OBJS)\coredll_rendcmn.obj \ $(OBJS)\coredll_rgncmn.obj \ $(OBJS)\coredll_settcmn.obj \ @@ -3421,6 +3426,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \ $(OBJS)\coredll_prntbase.obj \ $(OBJS)\coredll_quantize.obj \ $(OBJS)\coredll_radiocmn.obj \ + $(OBJS)\coredll_rearrangectrl.obj \ $(OBJS)\coredll_rendcmn.obj \ $(OBJS)\coredll_rgncmn.obj \ $(OBJS)\coredll_settcmn.obj \ @@ -3669,6 +3675,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \ $(OBJS)\corelib_prntbase.obj \ $(OBJS)\corelib_quantize.obj \ $(OBJS)\corelib_radiocmn.obj \ + $(OBJS)\corelib_rearrangectrl.obj \ $(OBJS)\corelib_rendcmn.obj \ $(OBJS)\corelib_rgncmn.obj \ $(OBJS)\corelib_settcmn.obj \ @@ -3906,6 +3913,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \ $(OBJS)\corelib_prntbase.obj \ $(OBJS)\corelib_quantize.obj \ $(OBJS)\corelib_radiocmn.obj \ + $(OBJS)\corelib_rearrangectrl.obj \ $(OBJS)\corelib_rendcmn.obj \ $(OBJS)\corelib_rgncmn.obj \ $(OBJS)\corelib_settcmn.obj \ @@ -7507,6 +7515,11 @@ $(OBJS)\monodll_radiocmn.obj: ..\..\src\common\radiocmn.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\radiocmn.cpp !endif +!if "$(USE_GUI)" == "1" +$(OBJS)\monodll_rearrangectrl.obj: ..\..\src\common\rearrangectrl.cpp + $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\rearrangectrl.cpp +!endif + !if "$(USE_GUI)" == "1" $(OBJS)\monodll_rendcmn.obj: ..\..\src\common\rendcmn.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\rendcmn.cpp @@ -9716,6 +9729,11 @@ $(OBJS)\monolib_radiocmn.obj: ..\..\src\common\radiocmn.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\radiocmn.cpp !endif +!if "$(USE_GUI)" == "1" +$(OBJS)\monolib_rearrangectrl.obj: ..\..\src\common\rearrangectrl.cpp + $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\rearrangectrl.cpp +!endif + !if "$(USE_GUI)" == "1" $(OBJS)\monolib_rendcmn.obj: ..\..\src\common\rendcmn.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\rendcmn.cpp @@ -11949,6 +11967,11 @@ $(OBJS)\coredll_radiocmn.obj: ..\..\src\common\radiocmn.cpp $(CXX) /c /nologo /TP /Fo$@ $(COREDLL_CXXFLAGS) ..\..\src\common\radiocmn.cpp !endif +!if "$(USE_GUI)" == "1" +$(OBJS)\coredll_rearrangectrl.obj: ..\..\src\common\rearrangectrl.cpp + $(CXX) /c /nologo /TP /Fo$@ $(COREDLL_CXXFLAGS) ..\..\src\common\rearrangectrl.cpp +!endif + !if "$(USE_GUI)" == "1" $(OBJS)\coredll_rendcmn.obj: ..\..\src\common\rendcmn.cpp $(CXX) /c /nologo /TP /Fo$@ $(COREDLL_CXXFLAGS) ..\..\src\common\rendcmn.cpp @@ -13311,6 +13334,11 @@ $(OBJS)\corelib_radiocmn.obj: ..\..\src\common\radiocmn.cpp $(CXX) /c /nologo /TP /Fo$@ $(CORELIB_CXXFLAGS) ..\..\src\common\radiocmn.cpp !endif +!if "$(USE_GUI)" == "1" +$(OBJS)\corelib_rearrangectrl.obj: ..\..\src\common\rearrangectrl.cpp + $(CXX) /c /nologo /TP /Fo$@ $(CORELIB_CXXFLAGS) ..\..\src\common\rearrangectrl.cpp +!endif + !if "$(USE_GUI)" == "1" $(OBJS)\corelib_rendcmn.obj: ..\..\src\common\rendcmn.cpp $(CXX) /c /nologo /TP /Fo$@ $(CORELIB_CXXFLAGS) ..\..\src\common\rendcmn.cpp diff --git a/build/msw/makefile.wat b/build/msw/makefile.wat index 873d10674d..7801cbb6eb 100644 --- a/build/msw/makefile.wat +++ b/build/msw/makefile.wat @@ -404,6 +404,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = & $(OBJS)\monodll_prntbase.obj & $(OBJS)\monodll_quantize.obj & $(OBJS)\monodll_radiocmn.obj & + $(OBJS)\monodll_rearrangectrl.obj & $(OBJS)\monodll_rendcmn.obj & $(OBJS)\monodll_rgncmn.obj & $(OBJS)\monodll_settcmn.obj & @@ -643,6 +644,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = & $(OBJS)\monodll_prntbase.obj & $(OBJS)\monodll_quantize.obj & $(OBJS)\monodll_radiocmn.obj & + $(OBJS)\monodll_rearrangectrl.obj & $(OBJS)\monodll_rendcmn.obj & $(OBJS)\monodll_rgncmn.obj & $(OBJS)\monodll_settcmn.obj & @@ -1090,6 +1092,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = & $(OBJS)\monolib_prntbase.obj & $(OBJS)\monolib_quantize.obj & $(OBJS)\monolib_radiocmn.obj & + $(OBJS)\monolib_rearrangectrl.obj & $(OBJS)\monolib_rendcmn.obj & $(OBJS)\monolib_rgncmn.obj & $(OBJS)\monolib_settcmn.obj & @@ -1329,6 +1332,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = & $(OBJS)\monolib_prntbase.obj & $(OBJS)\monolib_quantize.obj & $(OBJS)\monolib_radiocmn.obj & + $(OBJS)\monolib_rearrangectrl.obj & $(OBJS)\monolib_rendcmn.obj & $(OBJS)\monolib_rgncmn.obj & $(OBJS)\monolib_settcmn.obj & @@ -1697,6 +1701,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = & $(OBJS)\coredll_prntbase.obj & $(OBJS)\coredll_quantize.obj & $(OBJS)\coredll_radiocmn.obj & + $(OBJS)\coredll_rearrangectrl.obj & $(OBJS)\coredll_rendcmn.obj & $(OBJS)\coredll_rgncmn.obj & $(OBJS)\coredll_settcmn.obj & @@ -1936,6 +1941,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = & $(OBJS)\coredll_prntbase.obj & $(OBJS)\coredll_quantize.obj & $(OBJS)\coredll_radiocmn.obj & + $(OBJS)\coredll_rearrangectrl.obj & $(OBJS)\coredll_rendcmn.obj & $(OBJS)\coredll_rgncmn.obj & $(OBJS)\coredll_settcmn.obj & @@ -2186,6 +2192,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = & $(OBJS)\corelib_prntbase.obj & $(OBJS)\corelib_quantize.obj & $(OBJS)\corelib_radiocmn.obj & + $(OBJS)\corelib_rearrangectrl.obj & $(OBJS)\corelib_rendcmn.obj & $(OBJS)\corelib_rgncmn.obj & $(OBJS)\corelib_settcmn.obj & @@ -2425,6 +2432,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = & $(OBJS)\corelib_prntbase.obj & $(OBJS)\corelib_quantize.obj & $(OBJS)\corelib_radiocmn.obj & + $(OBJS)\corelib_rearrangectrl.obj & $(OBJS)\corelib_rendcmn.obj & $(OBJS)\corelib_rgncmn.obj & $(OBJS)\corelib_settcmn.obj & @@ -7670,6 +7678,11 @@ $(OBJS)\monodll_radiocmn.obj : .AUTODEPEND ..\..\src\common\radiocmn.cpp $(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $< !endif +!ifeq USE_GUI 1 +$(OBJS)\monodll_rearrangectrl.obj : .AUTODEPEND ..\..\src\common\rearrangectrl.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $< +!endif + !ifeq USE_GUI 1 $(OBJS)\monodll_rendcmn.obj : .AUTODEPEND ..\..\src\common\rendcmn.cpp $(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $< @@ -9993,6 +10006,11 @@ $(OBJS)\monolib_radiocmn.obj : .AUTODEPEND ..\..\src\common\radiocmn.cpp $(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $< !endif +!ifeq USE_GUI 1 +$(OBJS)\monolib_rearrangectrl.obj : .AUTODEPEND ..\..\src\common\rearrangectrl.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $< +!endif + !ifeq USE_GUI 1 $(OBJS)\monolib_rendcmn.obj : .AUTODEPEND ..\..\src\common\rendcmn.cpp $(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $< @@ -12340,6 +12358,11 @@ $(OBJS)\coredll_radiocmn.obj : .AUTODEPEND ..\..\src\common\radiocmn.cpp $(CXX) -bt=nt -zq -fo=$^@ $(COREDLL_CXXFLAGS) $< !endif +!ifeq USE_GUI 1 +$(OBJS)\coredll_rearrangectrl.obj : .AUTODEPEND ..\..\src\common\rearrangectrl.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(COREDLL_CXXFLAGS) $< +!endif + !ifeq USE_GUI 1 $(OBJS)\coredll_rendcmn.obj : .AUTODEPEND ..\..\src\common\rendcmn.cpp $(CXX) -bt=nt -zq -fo=$^@ $(COREDLL_CXXFLAGS) $< @@ -13814,6 +13837,11 @@ $(OBJS)\corelib_radiocmn.obj : .AUTODEPEND ..\..\src\common\radiocmn.cpp $(CXX) -bt=nt -zq -fo=$^@ $(CORELIB_CXXFLAGS) $< !endif +!ifeq USE_GUI 1 +$(OBJS)\corelib_rearrangectrl.obj : .AUTODEPEND ..\..\src\common\rearrangectrl.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(CORELIB_CXXFLAGS) $< +!endif + !ifeq USE_GUI 1 $(OBJS)\corelib_rendcmn.obj : .AUTODEPEND ..\..\src\common\rendcmn.cpp $(CXX) -bt=nt -zq -fo=$^@ $(CORELIB_CXXFLAGS) $< diff --git a/build/msw/wx_core.dsp b/build/msw/wx_core.dsp index 9d4f15a735..c29f5a6d42 100644 --- a/build/msw/wx_core.dsp +++ b/build/msw/wx_core.dsp @@ -582,6 +582,10 @@ SOURCE=..\..\src\common\radiocmn.cpp # End Source File # Begin Source File +SOURCE=..\..\src\common\rearrangectrl.cpp +# End Source File +# Begin Source File + SOURCE=..\..\src\common\rendcmn.cpp # End Source File # Begin Source File @@ -6357,6 +6361,10 @@ SOURCE=..\..\include\wx\rawbmp.h # End Source File # Begin Source File +SOURCE=..\..\include\wx\rearrangectrl.h +# End Source File +# Begin Source File + SOURCE=..\..\include\wx\region.h # End Source File # Begin Source File diff --git a/build/msw/wx_vc7_core.vcproj b/build/msw/wx_vc7_core.vcproj index edbb0d93bf..c28e20d8c7 100644 --- a/build/msw/wx_vc7_core.vcproj +++ b/build/msw/wx_vc7_core.vcproj @@ -816,6 +816,9 @@ + + @@ -4006,6 +4009,9 @@ + + diff --git a/build/msw/wx_vc8_core.vcproj b/build/msw/wx_vc8_core.vcproj index 19374c34ea..8cdaef4daf 100644 --- a/build/msw/wx_vc8_core.vcproj +++ b/build/msw/wx_vc8_core.vcproj @@ -1126,6 +1126,10 @@ RelativePath="..\..\src\common\radiocmn.cpp" > + + @@ -5363,6 +5367,10 @@ RelativePath="..\..\include\wx\rawbmp.h" > + + diff --git a/build/msw/wx_vc9_core.vcproj b/build/msw/wx_vc9_core.vcproj index 4d70767642..932e01c614 100644 --- a/build/msw/wx_vc9_core.vcproj +++ b/build/msw/wx_vc9_core.vcproj @@ -1122,6 +1122,10 @@ RelativePath="..\..\src\common\radiocmn.cpp" > + + @@ -5359,6 +5363,10 @@ RelativePath="..\..\include\wx\rawbmp.h" > + + diff --git a/docs/changes.txt b/docs/changes.txt index fba0a5bbbb..b7a4c19e4f 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -325,6 +325,8 @@ All (GUI): - Added wxDataViewCtrl class and helper classes. - Integrated wxPropertyGrid in wxWidgets itself (Jaakko Salli). - Provide native implementation of wxCalendarCtrl under wxMSW and wxGTK. +- Added wxHeaderCtrl and allow using it in wxGrid. +- Added wxRearrangeList, wxRearrangeCtrl and wxRearrangeDialog. - Added {wxTextCtrl,wxComboBox}::AutoComplete() and AutoCompleteFileNames(). - Added wxH[V]ScrolledWindow (Brad Anderson, Bryan Petty). - Added wxNotificationMessage class for non-intrusive notifications. diff --git a/include/wx/headerctrl.h b/include/wx/headerctrl.h index e404f166db..0d7dc125d6 100644 --- a/include/wx/headerctrl.h +++ b/include/wx/headerctrl.h @@ -132,7 +132,7 @@ public: // show the columns customization dialog and return true if something was // changed using it (in which case UpdateColumnVisibility() and/or - // UpdateColumnWidth() will have been called) + // UpdateColumnsOrder() will have been called) // // this is called by the control itself from ShowColumnsMenu() (which in // turn is only called by the control if wxHD_ALLOW_HIDE style was @@ -174,6 +174,15 @@ protected: wxFAIL_MSG( "must be overridden if called" ); } + // this method is called from ShowCustomizeDialog() to reorder all columns + // at once and should be implemented for controls using wxHD_ALLOW_REORDER + // style (there is no need to call SetColumnsOrder() from here, this is + // done by the control itself) + virtual void UpdateColumnsOrder(const wxArrayInt& WXUNUSED(order)) + { + wxFAIL_MSG( "must be overridden if called" ); + } + // this method can be overridden in the derived classes to do something // (e.g. update/resize some internal data structures) before the number of // columns in the control changes diff --git a/include/wx/rearrangectrl.h b/include/wx/rearrangectrl.h new file mode 100644 index 0000000000..3a422d0ed1 --- /dev/null +++ b/include/wx/rearrangectrl.h @@ -0,0 +1,194 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/rearrangectrl.h +// Purpose: various controls for rearranging the items interactively +// Author: Vadim Zeitlin +// Created: 2008-12-15 +// RCS-ID: $Id$ +// Copyright: (c) 2008 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_REARRANGECTRL_H_ +#define _WX_REARRANGECTRL_H_ + +#include "wx/checklst.h" +#include "wx/arrstr.h" + +extern WXDLLIMPEXP_DATA_CORE(const char) wxRearrangeListNameStr[]; +extern WXDLLIMPEXP_DATA_CORE(const char) wxRearrangeDialogNameStr[]; + +// ---------------------------------------------------------------------------- +// wxRearrangeList: a (check) list box allowing to move items around +// ---------------------------------------------------------------------------- + +// This class works allows to change the order of the items shown in it as well +// as to check or uncheck them individually. The data structure used to allow +// this is the order array which contains the items indices indexed by their +// position with an added twist that the unchecked items are represented by the +// bitwise complement of the corresponding index (for any architecture using +// two's complement for negative numbers representation (i.e. just about any at +// all) this means that a checked item N is represented by -N-1 in unchecked +// state). +// +// So, for example, the array order [1 -3 0] used in conjunction with the items +// array ["first", "second", "third"] means that the items are displayed in the +// order "second", "third", "first" and the "third" item is unchecked while the +// other two are checked. +class WXDLLIMPEXP_CORE wxRearrangeList : public wxCheckListBox +{ +public: + // ctors and such + // -------------- + + // default ctor, call Create() later + wxRearrangeList() { } + + // ctor creating the control, the arguments are the same as for + // wxCheckListBox except for the extra order array which defines the + // (initial) display order of the items as well as their statuses, see the + // description above + wxRearrangeList(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayInt& order, + const wxArrayString& items, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxRearrangeListNameStr) + { + Create(parent, id, pos, size, order, items, style, validator, name); + } + + // Create() function takes the same parameters as the base class one and + // the order array determining the initial display order + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayInt& order, + const wxArrayString& items, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxRearrangeListNameStr); + + + // items order + // ----------- + + // get the current items order; the returned array uses the same convention + // as the one passed to the ctor + const wxArrayInt& GetCurrentOrder() const { return m_order; } + + // return true if the current item can be moved up or down (i.e. just that + // it's not the first or the last one) + bool CanMoveCurrentUp() const; + bool CanMoveCurrentDown() const; + + // move the current item one position up or down, return true if it was moved + // or false if the current item was the first/last one and so nothing was done + bool MoveCurrentUp(); + bool MoveCurrentDown(); + +private: + // swap two items at the given positions in the listbox + void Swap(int pos1, int pos2); + + // event handler for item checking/unchecking + void OnCheck(wxCommandEvent& event); + + + // the current order array + wxArrayInt m_order; + + + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxRearrangeList) +}; + +// ---------------------------------------------------------------------------- +// wxRearrangeCtrl: composite control containing a wxRearrangeList and buttons +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxRearrangeCtrl : public wxPanel +{ +public: + // ctors/Create function are the same as for wxRearrangeList + wxRearrangeCtrl() + { + Init(); + } + + wxRearrangeCtrl(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayInt& order, + const wxArrayString& items, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxRearrangeListNameStr) + { + Init(); + + Create(parent, id, pos, size, order, items, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayInt& order, + const wxArrayString& items, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxRearrangeListNameStr); + + // get the underlying listbox + wxRearrangeList *GetList() const { return m_list; } + +private: + // common part of all ctors + void Init(); + + // event handlers for the buttons + void OnUpdateButtonUI(wxUpdateUIEvent& event); + void OnButton(wxCommandEvent& event); + + + wxRearrangeList *m_list; + + + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxRearrangeCtrl) +}; + +// ---------------------------------------------------------------------------- +// wxRearrangeDialog: dialog containing a wxRearrangeCtrl +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxRearrangeDialog : public wxDialog +{ +public: + // ctor for the dialog: message is shown inside the dialog itself, order + // and items are passed to wxRearrangeList used internally + wxRearrangeDialog(wxWindow *parent, + const wxString& message, + const wxString& title, + const wxArrayInt& order, + const wxArrayString& items, + const wxPoint& pos = wxDefaultPosition, + const wxString& name = wxRearrangeDialogNameStr); + + // get the order of items after it was modified by the user + wxArrayInt GetOrder() const + { return m_ctrl->GetList()->GetCurrentOrder(); } + +private: + wxRearrangeCtrl *m_ctrl; + + DECLARE_NO_COPY_CLASS(wxRearrangeDialog) +}; + +#endif // _WX_REARRANGECTRL_H_ + diff --git a/interface/wx/headerctrl.h b/interface/wx/headerctrl.h index 3012b7a48f..7f3a5ee756 100644 --- a/interface/wx/headerctrl.h +++ b/interface/wx/headerctrl.h @@ -14,13 +14,13 @@ wxHeaderCtrl is the control containing the column headings which is usually used for display of tabular data. - It is used as part of wxGrid, in wxDataViewCtrl and in the report view of - wxListCtrl but can be also used independently. - In general this class is meant to be used as part of another - control which already stores the column information somewhere as it can't - be used directly: instead you need to inherit from it and implement the - GetColumn() method to provide column information. See wxHeaderCtrlSimple - for a concrete control class which can be used directly. + It is used as part of wxGrid, in generic version wxDataViewCtrl and report + view of wxListCtrl but can be also used independently. In general this + class is meant to be used as part of another control which already stores + the column information somewhere as it can't be used directly: instead you + need to inherit from it and implement the GetColumn() method to provide + column information. See wxHeaderCtrlSimple for a concrete control class + which can be used directly. In addition to labeling the columns, the control has the following features: @@ -56,6 +56,11 @@ @style{wxHD_ALLOW_REORDER} If this style is specified (it is by default), the user can reorder the control columns by dragging them. + @style{wxHD_ALLOW_HIDE} + If this style is specified, the control shows a popup menu allowing the + user to change the columns visibility on right mouse click. Notice that + the program can always hide or show the columns, this style only + affects the users capability to do it. @style{wxHD_DEFAULT_STYLE} Symbolic name for the default control style, currently equal to @c wxHD_ALLOW_REORDER. @@ -300,19 +305,45 @@ public: Show the popup menu allowing the user to show or hide the columns. This functions shows the popup menu containing all columns with check - marks for the ones which are currently shown at the current mouse - position. It is meant to be called from EVT_HEADER_RIGHT_CLICK handler - and should toggle the visibility of the n-th column if the function - returns valid column index and not wxID_NONE which is returned if the - user cancels the menu. - + marks for the ones which are currently shown and allows the user to + check or uncheck them to toggle their visibility. It is called from the + default EVT_HEADER_RIGHT_CLICK handler for the controls which have + wxHD_ALLOW_HIDE style. And if the column has wxHD_ALLOW_REORDER style + as well, the menu also contains an item to customize the columns shown + using which results in ShowCustomizeDialog() being called, please see + its description for more details. + + If a column was toggled, UpdateColumnVisibility() virtual function is + called so it must be implemented for the controls with wxHD_ALLOW_HIDE + style or if you call this function explicitly. + + @param pt + The position of the menu, in the header window coordinates. @param title The title for the menu if not empty. @return - A valid column index or wxID_NONE if the user didn't select any - column. + @true if a column was shown or hidden or @false if nothing was + done, e.g. because the menu was cancelled. + */ + int ShowColumnsMenu(const wxPoint& pt, const wxString& title = wxString()); + + /** + Show the column customization dialog. + + This function displays a modal dialog containing the list of all + columns which the user can use to reorder them as well as show or hide + individual columns. + + If the user accepts the changes done in the dialog, the virtual + methods UpdateColumnVisibility() and UpdateColumnsOrder() will be + called so they must be overridden in the derived class if this method + is ever called. Please notice that the user will be able to invoke it + interactively from the header popup menu if the control has both + wxHD_ALLOW_HIDE and wxHD_ALLOW_REORDER styles. + + @see wxRearrangeDialog */ - int ShowColumnsMenu(const wxString& title = wxString()); + bool ShowCustomizeDialog(); protected: /** @@ -325,6 +356,50 @@ protected: */ virtual wxHeaderColumnBase& GetColumn(unsigned int idx) = 0; + /** + Method called when the column visibility is changed by the user. + + This method is called from ShowColumnsMenu() or ShowCustomizeDialog() + when the user interactively hides or shows a column. A typical + implementation will simply update the internally stored column state. + Notice that there is no need to call UpdateColumn() from this method as + it is already done by wxHeaderCtrl itself. + + The base class version doesn't do anything and must be overridden if + this method is called. + + @param idx + The index of the column whose visibility was toggled. + @param show + The new visibility value, @true if the column is now shown or + @false if it is not hidden. + */ + virtual void UpdateColumnVisibility(unsigned int idx, bool show); + + /** + Method called when the columns order is changed in the customization + dialog. + + This method is only called from ShowCustomizeDialog() when the user + changes the order of columns. In particular it is @em not called if a + single column changes place because the user dragged it to the new + location, the EVT_HEADER_END_REORDER event handler should be used to + react to this. + + A typical implementation in a derived class will update the display + order of the columns in the associated control, if any. Notice that + there is no need to call SetColumnsOrder() from it as wxHeaderCtrl does + it itself. + + The base class version doesn't do anything and must be overridden if + this method is called. + + @param order + The new column order. This array uses the same convention as + SetColumnsOrder(). + */ + virtual void UpdateColumnsOrder(const wxArrayInt& order); + /** Method which may be implemented by the derived classes to allow double clicking the column separator to resize the column to fit its contents. diff --git a/interface/wx/rearrangectrl.h b/interface/wx/rearrangectrl.h new file mode 100644 index 0000000000..721fe1c15e --- /dev/null +++ b/interface/wx/rearrangectrl.h @@ -0,0 +1,305 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/rearrangectrl.h +// Purpose: interface of wxRearrangeList +// Author: Vadim Zeitlin +// Created: 2008-12-15 +// RCS-ID: $Id$ +// Copyright: (c) 2008 Vadim Zeitlin +// Licence: wxWindows license +///////////////////////////////////////////////////////////////////////////// + +/** + @class wxRearrangeList + + A listbox-like control allowing the user to rearrange the items and to + enable or disable them. + + This class allows to change the order of the items shown in it as well as + to check or uncheck them individually. The data structure used to allow + this is the order array which contains the items indices indexed by their + position with an added twist that the unchecked items are represented by + the bitwise complement of the corresponding index (for any architecture + using two's complement for negative numbers representation (i.e. just about + any at all) this means that a checked item N is represented by -N-1 in + unchecked state). In practice this means that you must apply the C bitwise + complement operator when constructing the order array, e.g. + @code + wxArrayInt order; + order.push_back(0); // checked item #0 + order.push_back(~1); // unchecked item #1 + @endcode + + So, for example, the array order [1 -3 0] used in conjunction with the + items array ["first", "second", "third"] means that the items order is + "second", "third", "first" and the "third" item is unchecked while the + other two are checked. + + This convention is used both for the order argument of the control ctor or + Create() and for the array returned from GetCurrentOrder(). + + Usually this control will be used together with other controls allowing to + move the items around in it interactively. The simplest possible solution + is to use wxRearrangeCtrl which combines it with two standard buttons to + move the current item up or down. + + @library{wxcore} + @category{ctrl} +*/ +class wxRearrangeList : public wxCheckListBox +{ +public: + /** + Default constructor. + + Create() must be called later to effectively create the control. + */ + wxRearrangeList(); + + /** + Constructor really creating the control. + + Please see Create() for the parameters description. + */ + wxRearrangeList(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayInt& order, + const wxArrayString& items, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxRearrangeListNameStr); + + /** + Effectively creates the window for an object created using the default + constructor. + + This function is very similar to wxCheckListBox::Create() except that + it has an additional parameter specifying the initial order of the + items. Please see the class documentation for the explanation of the + conventions used by the @a order argument. + + @param parent + The parent window, must be non-@NULL. + @param id + The window identifier. + @param pos + The initial window position. + @param size + The initial window size. + @param order + Array specifying the initial order of the items in @a items array. + @param items + The items to display in the list. + @param style + The control style, there are no special styles for this class but + the base class styles can be used here. + @param validator + Optional window validator. + @param name + Optional window name. + */ + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayInt& order, + const wxArrayString& items, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxRearrangeListNameStr); + + + /** + Return the current order of the items. + + The order may be different from the one passed to the constructor if + MoveCurrentUp() or MoveCurrentDown() were called. + */ + const wxArrayInt& GetCurrentOrder() const; + + /** + Return @true if the currently selected item can be moved up. + + This function is useful for EVT_UPDATE_UI handler for the standard "Up" + button often used together with this control and wxRearrangeCtrl uses + it in this way. + + @return + @true if the currently selected item can be moved up in the + listbox, @false if there is no selection or the current item is the + first one. + + @see CanMoveCurrentDown() + */ + bool CanMoveCurrentUp() const; + + /** + Return @true if the currently selected item can be moved down. + + @see CanMoveCurrentUp() + */ + bool CanMoveCurrentDown() const; + + /** + Move the currently selected item one position above. + + This method is useful to implement the standard "Up" button behaviour + and wxRearrangeCtrl uses it for this. + + @return + @true if the item was moved or @false if this couldn't be done. + + @see MoveCurrentDown() + */ + bool MoveCurrentUp(); + + /** + Move the currently selected item one position below. + + @see MoveCurrentUp() + */ + bool MoveCurrentDown(); +}; + + +/** + @class wxRearrangeCtrl + + A composite control containing a wxRearrangeList and the buttons allowing + to move the items in it. + + This control is in fact a panel containing the wxRearrangeList control and + the "Up" and "Down" buttons to move the currently selected item up or down. + It is used as the main part of a wxRearrangeDialog. + + @library{wxcore} + @category{ctrl} + */ +class wxRearrangeCtrl +{ +public: + /** + Default constructor. + + Create() must be called later to effectively create the control. + */ + wxRearrangeCtrl(); + + /** + Constructor really creating the control. + + Please see Create() for the parameters description. + */ + wxRearrangeCtrl(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayInt& order, + const wxArrayString& items, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxRearrangeListNameStr); + + /** + Effectively creates the window for an object created using the default + constructor. + + The parameters of this method are the same as for + wxRearrangeList::Create(). + */ + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayInt& order, + const wxArrayString& items, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxRearrangeListNameStr); + + /** + Return the listbox which is the main part of this control. + */ + wxRearrangeList *GetList() const; +}; + +/** + @class wxRearrangeDialog + + A dialog allowing the user to rearrange the specified items. + + This dialog can be used to allow the user to modify the order of the items + and to enable or disable them individually. For example: + @code + wxArrayString items; + items.push_back("meat"); + items.push_back("fish"); + items.push_back("fruits"); + items.push_back("beer"); + wxArrayInt order; + order.push_back(3); + order.push_back(0); + order.push_back(1); + order.push_back(2); + + wxRearrangeDialog dlg(NULL, + "You can also uncheck the items you don't like " + "at all.", + "Sort the items in order of preference", + order, items); + if ( dlg.ShowModal() == wxID_OK ) { + order = dlg.GetOrder(); + for ( size_t n = 0; n < order.size(); n++ ) { + if ( order[n] >= 0 ) { + wxLogMessage("Your most preferred item is \"%s\"", + items[order[n]]); + break; + } + } + } + @endcode + + @library{wxcore} + @category{cmndlg} + */ +class wxRearrangeDialog +{ +public: + /** + Constructor creating the dialog. + + @param parent + The dialog parent, possibly @NULL. + @param message + The message shown inside the dialog itself, above the items list. + @param title + The title of the dialog. + @param order + The initial order of the items in the convention used by + wxRearrangeList. + @param items + The items to show in the dialog. + @param pos + Optional dialog position. + @param name + Optional dialog name. + */ + wxRearrangeDialog(wxWindow *parent, + const wxString& message, + const wxString& title, + const wxArrayInt& order, + const wxArrayString& items, + const wxPoint& pos = wxDefaultPosition, + const wxString& name = wxRearrangeDialogNameStr); + + /** + Return the array describing the order of items after it was modified by + the user. + + Please notice that the array will contain negative items if any items + were unchecked. See wxRearrangeList for more information about the + convention used for this array. + */ + wxArrayInt GetOrder() const; +}; diff --git a/src/common/headerctrlcmn.cpp b/src/common/headerctrlcmn.cpp index fe43fe19cd..51282c560c 100644 --- a/src/common/headerctrlcmn.cpp +++ b/src/common/headerctrlcmn.cpp @@ -28,16 +28,39 @@ #endif // WX_PRECOMP #include "wx/headerctrl.h" +#include "wx/rearrangectrl.h" + +namespace +{ // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- -namespace -{ - const unsigned int wxNO_COLUMN = static_cast(-1); +// ---------------------------------------------------------------------------- +// wxHeaderColumnsRearrangeDialog: dialog for customizing our columns +// ---------------------------------------------------------------------------- + +class wxHeaderColumnsRearrangeDialog : public wxRearrangeDialog +{ +public: + wxHeaderColumnsRearrangeDialog(wxWindow *parent, + const wxArrayInt& order, + const wxArrayString& items) + : wxRearrangeDialog + ( + parent, + _("Please select the columns to show and define their order:"), + _("Customize Columns"), + order, + items + ) + { + } +}; + } // anonymous namespace // ============================================================================ @@ -283,8 +306,55 @@ bool wxHeaderCtrlBase::ShowColumnsMenu(const wxPoint& pt, const wxString& title) bool wxHeaderCtrlBase::ShowCustomizeDialog() { - // TODO - return false; + // prepare the data for showing the dialog + wxArrayInt order = GetColumnsOrder(); + + const unsigned count = GetColumnCount(); + + // notice that titles are always in the index order, they will be shown + // rearranged according to the display order in the dialog + wxArrayString titles; + titles.reserve(count); + for ( unsigned n = 0; n < count; n++ ) + titles.push_back(GetColumn(n).GetTitle()); + + // this loop is however over positions and not indices + unsigned pos; + for ( pos = 0; pos < count; pos++ ) + { + int& idx = order[pos]; + if ( GetColumn(idx).IsHidden() ) + { + // indicate that this one is hidden + idx = ~idx; + } + } + + // do show it + wxHeaderColumnsRearrangeDialog dlg(this, order, titles); + if ( dlg.ShowModal() != wxID_OK ) + return false; + + // and apply the changes + order = dlg.GetOrder(); + for ( pos = 0; pos < count; pos++ ) + { + int& idx = order[pos]; + const bool show = idx >= 0; + if ( !show ) + { + // make all indices positive for passing them to SetColumnsOrder() + idx = ~idx; + } + + if ( show != GetColumn(idx).IsShown() ) + UpdateColumnVisibility(idx, show); + } + + UpdateColumnsOrder(order); + SetColumnsOrder(order); + + return true; } // ============================================================================ diff --git a/src/common/rearrangectrl.cpp b/src/common/rearrangectrl.cpp new file mode 100644 index 0000000000..6c9c0c11de --- /dev/null +++ b/src/common/rearrangectrl.cpp @@ -0,0 +1,245 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/rearrangectrl.cpp +// Purpose: implementation of classes in wx/rearrangectrl.h +// Author: Vadim Zeitlin +// Created: 2008-12-15 +// RCS-ID: $Id$ +// Copyright: (c) 2008 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP +#endif // WX_PRECOMP + +#include "wx/rearrangectrl.h" + +// ============================================================================ +// wxRearrangeList implementation +// ============================================================================ + +extern +WXDLLIMPEXP_DATA_CORE(const char) wxRearrangeListNameStr[] = "wxRearrangeList"; + +BEGIN_EVENT_TABLE(wxRearrangeList, wxCheckListBox) + EVT_CHECKLISTBOX(wxID_ANY, wxRearrangeList::OnCheck) +END_EVENT_TABLE() + +bool wxRearrangeList::Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayInt& order, + const wxArrayString& items, + long style, + const wxValidator& validator, + const wxString& name) +{ + // construct the array of items in the order in which they should appear in + // the control + const size_t count = items.size(); + wxCHECK_MSG( order.size() == count, false, "arrays not in sync" ); + + wxArrayString itemsInOrder; + itemsInOrder.reserve(count); + size_t n; + for ( n = 0; n < count; n++ ) + { + int idx = order[n]; + if ( idx < 0 ) + idx = -idx - 1; + itemsInOrder.push_back(items[idx]); + } + + // do create the real control + if ( !wxCheckListBox::Create(parent, id, pos, size, itemsInOrder, + style, validator, name) ) + return false; + + // and now check all the items which should be initially checked + for ( n = 0; n < count; n++ ) + { + if ( order[n] >= 0 ) + Check(n); + } + + m_order = order; + + return true; +} + +bool wxRearrangeList::CanMoveCurrentUp() const +{ + const int sel = GetSelection(); + return sel != wxNOT_FOUND && sel != 0; +} + +bool wxRearrangeList::CanMoveCurrentDown() const +{ + const int sel = GetSelection(); + return sel != wxNOT_FOUND && static_cast(sel) != GetCount() - 1; +} + +bool wxRearrangeList::MoveCurrentUp() +{ + const int sel = GetSelection(); + if ( sel == wxNOT_FOUND || sel == 0 ) + return false; + + Swap(sel, sel - 1); + SetSelection(sel - 1); + + return true; +} + +bool wxRearrangeList::MoveCurrentDown() +{ + const int sel = GetSelection(); + if ( sel == wxNOT_FOUND || static_cast(sel) == GetCount() - 1 ) + return false; + + Swap(sel, sel + 1); + SetSelection(sel + 1); + + return true; +} + +void wxRearrangeList::Swap(int pos1, int pos2) +{ + wxSwap(m_order[pos1], m_order[pos2]); + + const wxString stringTmp = GetString(pos1); + const bool checkedTmp = IsChecked(pos1); + + SetString(pos1, GetString(pos2)); + Check(pos1, IsChecked(pos2)); + + SetString(pos2, stringTmp); + Check(pos2, checkedTmp); +} + +void wxRearrangeList::OnCheck(wxCommandEvent& event) +{ + // update the internal state to match the new item state + const int n = event.GetInt(); + + const bool checked = IsChecked(n); + wxASSERT_MSG( (m_order[n] >= 0) == !checked, + "discrepancy between internal state and GUI" ); + + m_order[n] = ~m_order[n]; +} + +// ============================================================================ +// wxRearrangeCtrl implementation +// ============================================================================ + +BEGIN_EVENT_TABLE(wxRearrangeCtrl, wxPanel) + EVT_UPDATE_UI(wxID_UP, wxRearrangeCtrl::OnUpdateButtonUI) + EVT_UPDATE_UI(wxID_DOWN, wxRearrangeCtrl::OnUpdateButtonUI) + + EVT_BUTTON(wxID_UP, wxRearrangeCtrl::OnButton) + EVT_BUTTON(wxID_DOWN, wxRearrangeCtrl::OnButton) +END_EVENT_TABLE() + +void wxRearrangeCtrl::Init() +{ + m_list = NULL; +} + +bool +wxRearrangeCtrl::Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayInt& order, + const wxArrayString& items, + long style, + const wxValidator& validator, + const wxString& name) +{ + // create all the windows + if ( !wxPanel::Create(parent, id, pos, size, wxTAB_TRAVERSAL, name) ) + return false; + + m_list = new wxRearrangeList(this, wxID_ANY, + wxDefaultPosition, wxDefaultSize, + order, items, + style, validator); + wxButton * const btnUp = new wxButton(this, wxID_UP); + wxButton * const btnDown = new wxButton(this, wxID_DOWN); + + // arrange them in a sizer + wxSizer * const sizerBtns = new wxBoxSizer(wxVERTICAL); + sizerBtns->Add(btnUp, wxSizerFlags().Centre().Border(wxBOTTOM)); + sizerBtns->Add(btnDown, wxSizerFlags().Centre().Border(wxTOP)); + + wxSizer * const sizerTop = new wxBoxSizer(wxHORIZONTAL); + sizerTop->Add(m_list, wxSizerFlags(1).Expand().Border(wxRIGHT)); + sizerTop->Add(sizerBtns, wxSizerFlags(0).Centre().Border(wxLEFT)); + SetSizer(sizerTop); + + m_list->SetFocus(); + + return true; +} + +void wxRearrangeCtrl::OnUpdateButtonUI(wxUpdateUIEvent& event) +{ + event.Enable( event.GetId() == wxID_UP ? m_list->CanMoveCurrentUp() + : m_list->CanMoveCurrentDown() ); +} + +void wxRearrangeCtrl::OnButton(wxCommandEvent& event) +{ + if ( event.GetId() == wxID_UP ) + m_list->MoveCurrentUp(); + else + m_list->MoveCurrentDown(); +} + +// ============================================================================ +// wxRearrangeDialog implementation +// ============================================================================ + +extern +WXDLLIMPEXP_DATA_CORE(const char) wxRearrangeDialogNameStr[] = "wxRearrangeDlg"; + +wxRearrangeDialog::wxRearrangeDialog(wxWindow *parent, + const wxString& message, + const wxString& title, + const wxArrayInt& order, + const wxArrayString& items, + const wxPoint& pos, + const wxString& name) + : wxDialog(parent, wxID_ANY, title, + pos, wxDefaultSize, + wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER, + name) +{ + m_ctrl = new wxRearrangeCtrl(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, + order, items); + + wxSizer * const sizerTop = new wxBoxSizer(wxVERTICAL); + sizerTop->Add(new wxStaticText(this, wxID_ANY, message), + wxSizerFlags().DoubleBorder()); + sizerTop->Add(m_ctrl, + wxSizerFlags(1).Expand().Border()); + sizerTop->Add(CreateSeparatedButtonSizer(wxOK | wxCANCEL), + wxSizerFlags().Expand().Border()); + SetSizerAndFit(sizerTop); +} diff --git a/src/generic/grid.cpp b/src/generic/grid.cpp index 1fd5af31a5..a49d972c5c 100644 --- a/src/generic/grid.cpp +++ b/src/generic/grid.cpp @@ -278,6 +278,14 @@ private: GetOwner()->SendEvent(wxEVT_GRID_COL_SIZE, -1, idx); } + // overridden to react to the columns order changes in the customization + // dialog + virtual void UpdateColumnsOrder(const wxArrayInt& order) + { + GetOwner()->SetColumnsOrder(order); + } + + // event handlers forwarding wxHeaderCtrl events to wxGrid void OnClick(wxHeaderCtrlEvent& event) { -- 2.45.2