From bca8c756a30d54ee4fade96a091d78ad8988fd23 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 1 May 2009 22:52:33 +0000 Subject: [PATCH] added wxMouseEventsManager git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@60463 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 | 1 + include/wx/mousemanager.h | 148 +++++++++++++++++++++++++++++ interface/wx/mousemanager.h | 166 +++++++++++++++++++++++++++++++++ src/common/mousemanager.cpp | 176 +++++++++++++++++++++++++++++++++++ 14 files changed, 656 insertions(+) create mode 100644 include/wx/mousemanager.h create mode 100644 interface/wx/mousemanager.h create mode 100644 src/common/mousemanager.cpp diff --git a/Makefile.in b/Makefile.in index 8959c6bf22..0bde7114c7 100644 --- a/Makefile.in +++ b/Makefile.in @@ -3521,6 +3521,7 @@ COND_USE_GUI_1_ALL_GUI_HEADERS = \ wx/listbox.h \ wx/mdi.h \ wx/menu.h \ + wx/mousemanager.h \ wx/msgdlg.h \ wx/nativewin.h \ wx/numdlg.h \ @@ -4104,6 +4105,7 @@ COND_USE_GUI_1_WXUNIV_0___CORE_SRC_OBJECTS = \ monodll_listctrlcmn.o \ monodll_matrix.o \ monodll_menucmn.o \ + monodll_mousemanager.o \ monodll_nbkbase.o \ monodll_overlaycmn.o \ monodll_paper.o \ @@ -4296,6 +4298,7 @@ COND_USE_GUI_1_WXUNIV_1___CORE_SRC_OBJECTS = \ monodll_listctrlcmn.o \ monodll_matrix.o \ monodll_menucmn.o \ + monodll_mousemanager.o \ monodll_nbkbase.o \ monodll_overlaycmn.o \ monodll_paper.o \ @@ -5917,6 +5920,7 @@ COND_USE_GUI_1_WXUNIV_0___CORE_SRC_OBJECTS_1 = \ monolib_listctrlcmn.o \ monolib_matrix.o \ monolib_menucmn.o \ + monolib_mousemanager.o \ monolib_nbkbase.o \ monolib_overlaycmn.o \ monolib_paper.o \ @@ -6109,6 +6113,7 @@ COND_USE_GUI_1_WXUNIV_1___CORE_SRC_OBJECTS_1 = \ monolib_listctrlcmn.o \ monolib_matrix.o \ monolib_menucmn.o \ + monolib_mousemanager.o \ monolib_nbkbase.o \ monolib_overlaycmn.o \ monolib_paper.o \ @@ -7877,6 +7882,7 @@ COND_USE_GUI_1_WXUNIV_0___CORE_SRC_OBJECTS_2 = \ coredll_listctrlcmn.o \ coredll_matrix.o \ coredll_menucmn.o \ + coredll_mousemanager.o \ coredll_nbkbase.o \ coredll_overlaycmn.o \ coredll_paper.o \ @@ -8069,6 +8075,7 @@ COND_USE_GUI_1_WXUNIV_1___CORE_SRC_OBJECTS_2 = \ coredll_listctrlcmn.o \ coredll_matrix.o \ coredll_menucmn.o \ + coredll_mousemanager.o \ coredll_nbkbase.o \ coredll_overlaycmn.o \ coredll_paper.o \ @@ -9385,6 +9392,7 @@ COND_USE_GUI_1_WXUNIV_0___CORE_SRC_OBJECTS_3 = \ corelib_listctrlcmn.o \ corelib_matrix.o \ corelib_menucmn.o \ + corelib_mousemanager.o \ corelib_nbkbase.o \ corelib_overlaycmn.o \ corelib_paper.o \ @@ -9577,6 +9585,7 @@ COND_USE_GUI_1_WXUNIV_1___CORE_SRC_OBJECTS_3 = \ corelib_listctrlcmn.o \ corelib_matrix.o \ corelib_menucmn.o \ + corelib_mousemanager.o \ corelib_nbkbase.o \ corelib_overlaycmn.o \ corelib_paper.o \ @@ -18173,6 +18182,9 @@ monodll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONODLL_ODEP) @COND_USE_GUI_1@monodll_menucmn.o: $(srcdir)/src/common/menucmn.cpp $(MONODLL_ODEP) @COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/menucmn.cpp +@COND_USE_GUI_1@monodll_mousemanager.o: $(srcdir)/src/common/mousemanager.cpp $(MONODLL_ODEP) +@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/mousemanager.cpp + @COND_USE_GUI_1@monodll_nbkbase.o: $(srcdir)/src/common/nbkbase.cpp $(MONODLL_ODEP) @COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/nbkbase.cpp @@ -22856,6 +22868,9 @@ monolib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONOLIB_ODEP) @COND_USE_GUI_1@monolib_menucmn.o: $(srcdir)/src/common/menucmn.cpp $(MONOLIB_ODEP) @COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/menucmn.cpp +@COND_USE_GUI_1@monolib_mousemanager.o: $(srcdir)/src/common/mousemanager.cpp $(MONOLIB_ODEP) +@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/mousemanager.cpp + @COND_USE_GUI_1@monolib_nbkbase.o: $(srcdir)/src/common/nbkbase.cpp $(MONOLIB_ODEP) @COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/nbkbase.cpp @@ -27728,6 +27743,9 @@ coredll_win32.o: $(srcdir)/src/univ/themes/win32.cpp $(COREDLL_ODEP) @COND_USE_GUI_1@coredll_menucmn.o: $(srcdir)/src/common/menucmn.cpp $(COREDLL_ODEP) @COND_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/common/menucmn.cpp +@COND_USE_GUI_1@coredll_mousemanager.o: $(srcdir)/src/common/mousemanager.cpp $(COREDLL_ODEP) +@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/common/mousemanager.cpp + @COND_USE_GUI_1@coredll_nbkbase.o: $(srcdir)/src/common/nbkbase.cpp $(COREDLL_ODEP) @COND_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/common/nbkbase.cpp @@ -31232,6 +31250,9 @@ corelib_win32.o: $(srcdir)/src/univ/themes/win32.cpp $(CORELIB_ODEP) @COND_USE_GUI_1@corelib_menucmn.o: $(srcdir)/src/common/menucmn.cpp $(CORELIB_ODEP) @COND_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/common/menucmn.cpp +@COND_USE_GUI_1@corelib_mousemanager.o: $(srcdir)/src/common/mousemanager.cpp $(CORELIB_ODEP) +@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/common/mousemanager.cpp + @COND_USE_GUI_1@corelib_nbkbase.o: $(srcdir)/src/common/nbkbase.cpp $(CORELIB_ODEP) @COND_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/common/nbkbase.cpp diff --git a/build/bakefiles/files.bkl b/build/bakefiles/files.bkl index b60fdaf5a5..8c6dc9f1ac 100644 --- a/build/bakefiles/files.bkl +++ b/build/bakefiles/files.bkl @@ -681,6 +681,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! src/common/listctrlcmn.cpp src/common/matrix.cpp src/common/menucmn.cpp + src/common/mousemanager.cpp src/common/nbkbase.cpp src/common/overlaycmn.cpp src/common/paper.cpp @@ -811,6 +812,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! wx/listbox.h wx/mdi.h wx/menu.h + wx/mousemanager.h wx/msgdlg.h wx/nativewin.h wx/numdlg.h diff --git a/build/msw/makefile.bcc b/build/msw/makefile.bcc index be9805b769..52df76ef41 100644 --- a/build/msw/makefile.bcc +++ b/build/msw/makefile.bcc @@ -1705,6 +1705,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \ $(OBJS)\monodll_listctrlcmn.obj \ $(OBJS)\monodll_matrix.obj \ $(OBJS)\monodll_menucmn.obj \ + $(OBJS)\monodll_mousemanager.obj \ $(OBJS)\monodll_nbkbase.obj \ $(OBJS)\monodll_overlaycmn.obj \ $(OBJS)\monodll_paper.obj \ @@ -1944,6 +1945,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \ $(OBJS)\monodll_listctrlcmn.obj \ $(OBJS)\monodll_matrix.obj \ $(OBJS)\monodll_menucmn.obj \ + $(OBJS)\monodll_mousemanager.obj \ $(OBJS)\monodll_nbkbase.obj \ $(OBJS)\monodll_overlaycmn.obj \ $(OBJS)\monodll_paper.obj \ @@ -2386,6 +2388,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \ $(OBJS)\monolib_listctrlcmn.obj \ $(OBJS)\monolib_matrix.obj \ $(OBJS)\monolib_menucmn.obj \ + $(OBJS)\monolib_mousemanager.obj \ $(OBJS)\monolib_nbkbase.obj \ $(OBJS)\monolib_overlaycmn.obj \ $(OBJS)\monolib_paper.obj \ @@ -2625,6 +2628,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \ $(OBJS)\monolib_listctrlcmn.obj \ $(OBJS)\monolib_matrix.obj \ $(OBJS)\monolib_menucmn.obj \ + $(OBJS)\monolib_mousemanager.obj \ $(OBJS)\monolib_nbkbase.obj \ $(OBJS)\monolib_overlaycmn.obj \ $(OBJS)\monolib_paper.obj \ @@ -2972,6 +2976,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \ $(OBJS)\coredll_listctrlcmn.obj \ $(OBJS)\coredll_matrix.obj \ $(OBJS)\coredll_menucmn.obj \ + $(OBJS)\coredll_mousemanager.obj \ $(OBJS)\coredll_nbkbase.obj \ $(OBJS)\coredll_overlaycmn.obj \ $(OBJS)\coredll_paper.obj \ @@ -3211,6 +3216,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \ $(OBJS)\coredll_listctrlcmn.obj \ $(OBJS)\coredll_matrix.obj \ $(OBJS)\coredll_menucmn.obj \ + $(OBJS)\coredll_mousemanager.obj \ $(OBJS)\coredll_nbkbase.obj \ $(OBJS)\coredll_overlaycmn.obj \ $(OBJS)\coredll_paper.obj \ @@ -3456,6 +3462,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \ $(OBJS)\corelib_listctrlcmn.obj \ $(OBJS)\corelib_matrix.obj \ $(OBJS)\corelib_menucmn.obj \ + $(OBJS)\corelib_mousemanager.obj \ $(OBJS)\corelib_nbkbase.obj \ $(OBJS)\corelib_overlaycmn.obj \ $(OBJS)\corelib_paper.obj \ @@ -3695,6 +3702,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \ $(OBJS)\corelib_listctrlcmn.obj \ $(OBJS)\corelib_matrix.obj \ $(OBJS)\corelib_menucmn.obj \ + $(OBJS)\corelib_mousemanager.obj \ $(OBJS)\corelib_nbkbase.obj \ $(OBJS)\corelib_overlaycmn.obj \ $(OBJS)\corelib_paper.obj \ @@ -7142,6 +7150,11 @@ $(OBJS)\monodll_menucmn.obj: ..\..\src\common\menucmn.cpp $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\common\menucmn.cpp !endif +!if "$(USE_GUI)" == "1" +$(OBJS)\monodll_mousemanager.obj: ..\..\src\common\mousemanager.cpp + $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\common\mousemanager.cpp +!endif + !if "$(USE_GUI)" == "1" $(OBJS)\monodll_nbkbase.obj: ..\..\src\common\nbkbase.cpp $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\common\nbkbase.cpp @@ -9363,6 +9376,11 @@ $(OBJS)\monolib_menucmn.obj: ..\..\src\common\menucmn.cpp $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\menucmn.cpp !endif +!if "$(USE_GUI)" == "1" +$(OBJS)\monolib_mousemanager.obj: ..\..\src\common\mousemanager.cpp + $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\mousemanager.cpp +!endif + !if "$(USE_GUI)" == "1" $(OBJS)\monolib_nbkbase.obj: ..\..\src\common\nbkbase.cpp $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\nbkbase.cpp @@ -11608,6 +11626,11 @@ $(OBJS)\coredll_menucmn.obj: ..\..\src\common\menucmn.cpp $(CXX) -q -c -P -o$@ $(COREDLL_CXXFLAGS) ..\..\src\common\menucmn.cpp !endif +!if "$(USE_GUI)" == "1" +$(OBJS)\coredll_mousemanager.obj: ..\..\src\common\mousemanager.cpp + $(CXX) -q -c -P -o$@ $(COREDLL_CXXFLAGS) ..\..\src\common\mousemanager.cpp +!endif + !if "$(USE_GUI)" == "1" $(OBJS)\coredll_nbkbase.obj: ..\..\src\common\nbkbase.cpp $(CXX) -q -c -P -o$@ $(COREDLL_CXXFLAGS) ..\..\src\common\nbkbase.cpp @@ -12982,6 +13005,11 @@ $(OBJS)\corelib_menucmn.obj: ..\..\src\common\menucmn.cpp $(CXX) -q -c -P -o$@ $(CORELIB_CXXFLAGS) ..\..\src\common\menucmn.cpp !endif +!if "$(USE_GUI)" == "1" +$(OBJS)\corelib_mousemanager.obj: ..\..\src\common\mousemanager.cpp + $(CXX) -q -c -P -o$@ $(CORELIB_CXXFLAGS) ..\..\src\common\mousemanager.cpp +!endif + !if "$(USE_GUI)" == "1" $(OBJS)\corelib_nbkbase.obj: ..\..\src\common\nbkbase.cpp $(CXX) -q -c -P -o$@ $(CORELIB_CXXFLAGS) ..\..\src\common\nbkbase.cpp diff --git a/build/msw/makefile.gcc b/build/msw/makefile.gcc index 48afcfb3cd..7c1614b7a4 100644 --- a/build/msw/makefile.gcc +++ b/build/msw/makefile.gcc @@ -1723,6 +1723,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \ $(OBJS)\monodll_listctrlcmn.o \ $(OBJS)\monodll_matrix.o \ $(OBJS)\monodll_menucmn.o \ + $(OBJS)\monodll_mousemanager.o \ $(OBJS)\monodll_nbkbase.o \ $(OBJS)\monodll_overlaycmn.o \ $(OBJS)\monodll_paper.o \ @@ -1964,6 +1965,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \ $(OBJS)\monodll_listctrlcmn.o \ $(OBJS)\monodll_matrix.o \ $(OBJS)\monodll_menucmn.o \ + $(OBJS)\monodll_mousemanager.o \ $(OBJS)\monodll_nbkbase.o \ $(OBJS)\monodll_overlaycmn.o \ $(OBJS)\monodll_paper.o \ @@ -2410,6 +2412,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \ $(OBJS)\monolib_listctrlcmn.o \ $(OBJS)\monolib_matrix.o \ $(OBJS)\monolib_menucmn.o \ + $(OBJS)\monolib_mousemanager.o \ $(OBJS)\monolib_nbkbase.o \ $(OBJS)\monolib_overlaycmn.o \ $(OBJS)\monolib_paper.o \ @@ -2651,6 +2654,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \ $(OBJS)\monolib_listctrlcmn.o \ $(OBJS)\monolib_matrix.o \ $(OBJS)\monolib_menucmn.o \ + $(OBJS)\monolib_mousemanager.o \ $(OBJS)\monolib_nbkbase.o \ $(OBJS)\monolib_overlaycmn.o \ $(OBJS)\monolib_paper.o \ @@ -3012,6 +3016,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \ $(OBJS)\coredll_listctrlcmn.o \ $(OBJS)\coredll_matrix.o \ $(OBJS)\coredll_menucmn.o \ + $(OBJS)\coredll_mousemanager.o \ $(OBJS)\coredll_nbkbase.o \ $(OBJS)\coredll_overlaycmn.o \ $(OBJS)\coredll_paper.o \ @@ -3253,6 +3258,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \ $(OBJS)\coredll_listctrlcmn.o \ $(OBJS)\coredll_matrix.o \ $(OBJS)\coredll_menucmn.o \ + $(OBJS)\coredll_mousemanager.o \ $(OBJS)\coredll_nbkbase.o \ $(OBJS)\coredll_overlaycmn.o \ $(OBJS)\coredll_paper.o \ @@ -3504,6 +3510,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \ $(OBJS)\corelib_listctrlcmn.o \ $(OBJS)\corelib_matrix.o \ $(OBJS)\corelib_menucmn.o \ + $(OBJS)\corelib_mousemanager.o \ $(OBJS)\corelib_nbkbase.o \ $(OBJS)\corelib_overlaycmn.o \ $(OBJS)\corelib_paper.o \ @@ -3745,6 +3752,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \ $(OBJS)\corelib_listctrlcmn.o \ $(OBJS)\corelib_matrix.o \ $(OBJS)\corelib_menucmn.o \ + $(OBJS)\corelib_mousemanager.o \ $(OBJS)\corelib_nbkbase.o \ $(OBJS)\corelib_overlaycmn.o \ $(OBJS)\corelib_paper.o \ @@ -7406,6 +7414,11 @@ $(OBJS)\monodll_menucmn.o: ../../src/common/menucmn.cpp $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $< endif +ifeq ($(USE_GUI),1) +$(OBJS)\monodll_mousemanager.o: ../../src/common/mousemanager.cpp + $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $< +endif + ifeq ($(USE_GUI),1) $(OBJS)\monodll_nbkbase.o: ../../src/common/nbkbase.cpp $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $< @@ -9739,6 +9752,11 @@ $(OBJS)\monolib_menucmn.o: ../../src/common/menucmn.cpp $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $< endif +ifeq ($(USE_GUI),1) +$(OBJS)\monolib_mousemanager.o: ../../src/common/mousemanager.cpp + $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $< +endif + ifeq ($(USE_GUI),1) $(OBJS)\monolib_nbkbase.o: ../../src/common/nbkbase.cpp $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $< @@ -12096,6 +12114,11 @@ $(OBJS)\coredll_menucmn.o: ../../src/common/menucmn.cpp $(CXX) -c -o $@ $(COREDLL_CXXFLAGS) $(CPPDEPS) $< endif +ifeq ($(USE_GUI),1) +$(OBJS)\coredll_mousemanager.o: ../../src/common/mousemanager.cpp + $(CXX) -c -o $@ $(COREDLL_CXXFLAGS) $(CPPDEPS) $< +endif + ifeq ($(USE_GUI),1) $(OBJS)\coredll_nbkbase.o: ../../src/common/nbkbase.cpp $(CXX) -c -o $@ $(COREDLL_CXXFLAGS) $(CPPDEPS) $< @@ -13582,6 +13605,11 @@ $(OBJS)\corelib_menucmn.o: ../../src/common/menucmn.cpp $(CXX) -c -o $@ $(CORELIB_CXXFLAGS) $(CPPDEPS) $< endif +ifeq ($(USE_GUI),1) +$(OBJS)\corelib_mousemanager.o: ../../src/common/mousemanager.cpp + $(CXX) -c -o $@ $(CORELIB_CXXFLAGS) $(CPPDEPS) $< +endif + ifeq ($(USE_GUI),1) $(OBJS)\corelib_nbkbase.o: ../../src/common/nbkbase.cpp $(CXX) -c -o $@ $(CORELIB_CXXFLAGS) $(CPPDEPS) $< diff --git a/build/msw/makefile.vc b/build/msw/makefile.vc index a42c9dcc38..5e01a28d1d 100644 --- a/build/msw/makefile.vc +++ b/build/msw/makefile.vc @@ -1885,6 +1885,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \ $(OBJS)\monodll_listctrlcmn.obj \ $(OBJS)\monodll_matrix.obj \ $(OBJS)\monodll_menucmn.obj \ + $(OBJS)\monodll_mousemanager.obj \ $(OBJS)\monodll_nbkbase.obj \ $(OBJS)\monodll_overlaycmn.obj \ $(OBJS)\monodll_paper.obj \ @@ -2124,6 +2125,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \ $(OBJS)\monodll_listctrlcmn.obj \ $(OBJS)\monodll_matrix.obj \ $(OBJS)\monodll_menucmn.obj \ + $(OBJS)\monodll_mousemanager.obj \ $(OBJS)\monodll_nbkbase.obj \ $(OBJS)\monodll_overlaycmn.obj \ $(OBJS)\monodll_paper.obj \ @@ -2572,6 +2574,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \ $(OBJS)\monolib_listctrlcmn.obj \ $(OBJS)\monolib_matrix.obj \ $(OBJS)\monolib_menucmn.obj \ + $(OBJS)\monolib_mousemanager.obj \ $(OBJS)\monolib_nbkbase.obj \ $(OBJS)\monolib_overlaycmn.obj \ $(OBJS)\monolib_paper.obj \ @@ -2811,6 +2814,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \ $(OBJS)\monolib_listctrlcmn.obj \ $(OBJS)\monolib_matrix.obj \ $(OBJS)\monolib_menucmn.obj \ + $(OBJS)\monolib_mousemanager.obj \ $(OBJS)\monolib_nbkbase.obj \ $(OBJS)\monolib_overlaycmn.obj \ $(OBJS)\monolib_paper.obj \ @@ -3188,6 +3192,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \ $(OBJS)\coredll_listctrlcmn.obj \ $(OBJS)\coredll_matrix.obj \ $(OBJS)\coredll_menucmn.obj \ + $(OBJS)\coredll_mousemanager.obj \ $(OBJS)\coredll_nbkbase.obj \ $(OBJS)\coredll_overlaycmn.obj \ $(OBJS)\coredll_paper.obj \ @@ -3427,6 +3432,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \ $(OBJS)\coredll_listctrlcmn.obj \ $(OBJS)\coredll_matrix.obj \ $(OBJS)\coredll_menucmn.obj \ + $(OBJS)\coredll_mousemanager.obj \ $(OBJS)\coredll_nbkbase.obj \ $(OBJS)\coredll_overlaycmn.obj \ $(OBJS)\coredll_paper.obj \ @@ -3678,6 +3684,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \ $(OBJS)\corelib_listctrlcmn.obj \ $(OBJS)\corelib_matrix.obj \ $(OBJS)\corelib_menucmn.obj \ + $(OBJS)\corelib_mousemanager.obj \ $(OBJS)\corelib_nbkbase.obj \ $(OBJS)\corelib_overlaycmn.obj \ $(OBJS)\corelib_paper.obj \ @@ -3917,6 +3924,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \ $(OBJS)\corelib_listctrlcmn.obj \ $(OBJS)\corelib_matrix.obj \ $(OBJS)\corelib_menucmn.obj \ + $(OBJS)\corelib_mousemanager.obj \ $(OBJS)\corelib_nbkbase.obj \ $(OBJS)\corelib_overlaycmn.obj \ $(OBJS)\corelib_paper.obj \ @@ -7488,6 +7496,11 @@ $(OBJS)\monodll_menucmn.obj: ..\..\src\common\menucmn.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\menucmn.cpp !endif +!if "$(USE_GUI)" == "1" +$(OBJS)\monodll_mousemanager.obj: ..\..\src\common\mousemanager.cpp + $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\mousemanager.cpp +!endif + !if "$(USE_GUI)" == "1" $(OBJS)\monodll_nbkbase.obj: ..\..\src\common\nbkbase.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\nbkbase.cpp @@ -9709,6 +9722,11 @@ $(OBJS)\monolib_menucmn.obj: ..\..\src\common\menucmn.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\menucmn.cpp !endif +!if "$(USE_GUI)" == "1" +$(OBJS)\monolib_mousemanager.obj: ..\..\src\common\mousemanager.cpp + $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\mousemanager.cpp +!endif + !if "$(USE_GUI)" == "1" $(OBJS)\monolib_nbkbase.obj: ..\..\src\common\nbkbase.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\nbkbase.cpp @@ -11954,6 +11972,11 @@ $(OBJS)\coredll_menucmn.obj: ..\..\src\common\menucmn.cpp $(CXX) /c /nologo /TP /Fo$@ $(COREDLL_CXXFLAGS) ..\..\src\common\menucmn.cpp !endif +!if "$(USE_GUI)" == "1" +$(OBJS)\coredll_mousemanager.obj: ..\..\src\common\mousemanager.cpp + $(CXX) /c /nologo /TP /Fo$@ $(COREDLL_CXXFLAGS) ..\..\src\common\mousemanager.cpp +!endif + !if "$(USE_GUI)" == "1" $(OBJS)\coredll_nbkbase.obj: ..\..\src\common\nbkbase.cpp $(CXX) /c /nologo /TP /Fo$@ $(COREDLL_CXXFLAGS) ..\..\src\common\nbkbase.cpp @@ -13328,6 +13351,11 @@ $(OBJS)\corelib_menucmn.obj: ..\..\src\common\menucmn.cpp $(CXX) /c /nologo /TP /Fo$@ $(CORELIB_CXXFLAGS) ..\..\src\common\menucmn.cpp !endif +!if "$(USE_GUI)" == "1" +$(OBJS)\corelib_mousemanager.obj: ..\..\src\common\mousemanager.cpp + $(CXX) /c /nologo /TP /Fo$@ $(CORELIB_CXXFLAGS) ..\..\src\common\mousemanager.cpp +!endif + !if "$(USE_GUI)" == "1" $(OBJS)\corelib_nbkbase.obj: ..\..\src\common\nbkbase.cpp $(CXX) /c /nologo /TP /Fo$@ $(CORELIB_CXXFLAGS) ..\..\src\common\nbkbase.cpp diff --git a/build/msw/makefile.wat b/build/msw/makefile.wat index decbe7458b..7c0e822696 100644 --- a/build/msw/makefile.wat +++ b/build/msw/makefile.wat @@ -400,6 +400,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = & $(OBJS)\monodll_listctrlcmn.obj & $(OBJS)\monodll_matrix.obj & $(OBJS)\monodll_menucmn.obj & + $(OBJS)\monodll_mousemanager.obj & $(OBJS)\monodll_nbkbase.obj & $(OBJS)\monodll_overlaycmn.obj & $(OBJS)\monodll_paper.obj & @@ -641,6 +642,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = & $(OBJS)\monodll_listctrlcmn.obj & $(OBJS)\monodll_matrix.obj & $(OBJS)\monodll_menucmn.obj & + $(OBJS)\monodll_mousemanager.obj & $(OBJS)\monodll_nbkbase.obj & $(OBJS)\monodll_overlaycmn.obj & $(OBJS)\monodll_paper.obj & @@ -1092,6 +1094,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = & $(OBJS)\monolib_listctrlcmn.obj & $(OBJS)\monolib_matrix.obj & $(OBJS)\monolib_menucmn.obj & + $(OBJS)\monolib_mousemanager.obj & $(OBJS)\monolib_nbkbase.obj & $(OBJS)\monolib_overlaycmn.obj & $(OBJS)\monolib_paper.obj & @@ -1333,6 +1336,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = & $(OBJS)\monolib_listctrlcmn.obj & $(OBJS)\monolib_matrix.obj & $(OBJS)\monolib_menucmn.obj & + $(OBJS)\monolib_mousemanager.obj & $(OBJS)\monolib_nbkbase.obj & $(OBJS)\monolib_overlaycmn.obj & $(OBJS)\monolib_paper.obj & @@ -1705,6 +1709,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = & $(OBJS)\coredll_listctrlcmn.obj & $(OBJS)\coredll_matrix.obj & $(OBJS)\coredll_menucmn.obj & + $(OBJS)\coredll_mousemanager.obj & $(OBJS)\coredll_nbkbase.obj & $(OBJS)\coredll_overlaycmn.obj & $(OBJS)\coredll_paper.obj & @@ -1946,6 +1951,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = & $(OBJS)\coredll_listctrlcmn.obj & $(OBJS)\coredll_matrix.obj & $(OBJS)\coredll_menucmn.obj & + $(OBJS)\coredll_mousemanager.obj & $(OBJS)\coredll_nbkbase.obj & $(OBJS)\coredll_overlaycmn.obj & $(OBJS)\coredll_paper.obj & @@ -2199,6 +2205,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = & $(OBJS)\corelib_listctrlcmn.obj & $(OBJS)\corelib_matrix.obj & $(OBJS)\corelib_menucmn.obj & + $(OBJS)\corelib_mousemanager.obj & $(OBJS)\corelib_nbkbase.obj & $(OBJS)\corelib_overlaycmn.obj & $(OBJS)\corelib_paper.obj & @@ -2440,6 +2447,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = & $(OBJS)\corelib_listctrlcmn.obj & $(OBJS)\corelib_matrix.obj & $(OBJS)\corelib_menucmn.obj & + $(OBJS)\corelib_mousemanager.obj & $(OBJS)\corelib_nbkbase.obj & $(OBJS)\corelib_overlaycmn.obj & $(OBJS)\corelib_paper.obj & @@ -7655,6 +7663,11 @@ $(OBJS)\monodll_menucmn.obj : .AUTODEPEND ..\..\src\common\menucmn.cpp $(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $< !endif +!ifeq USE_GUI 1 +$(OBJS)\monodll_mousemanager.obj : .AUTODEPEND ..\..\src\common\mousemanager.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $< +!endif + !ifeq USE_GUI 1 $(OBJS)\monodll_nbkbase.obj : .AUTODEPEND ..\..\src\common\nbkbase.cpp $(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $< @@ -9988,6 +10001,11 @@ $(OBJS)\monolib_menucmn.obj : .AUTODEPEND ..\..\src\common\menucmn.cpp $(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $< !endif +!ifeq USE_GUI 1 +$(OBJS)\monolib_mousemanager.obj : .AUTODEPEND ..\..\src\common\mousemanager.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $< +!endif + !ifeq USE_GUI 1 $(OBJS)\monolib_nbkbase.obj : .AUTODEPEND ..\..\src\common\nbkbase.cpp $(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $< @@ -12345,6 +12363,11 @@ $(OBJS)\coredll_menucmn.obj : .AUTODEPEND ..\..\src\common\menucmn.cpp $(CXX) -bt=nt -zq -fo=$^@ $(COREDLL_CXXFLAGS) $< !endif +!ifeq USE_GUI 1 +$(OBJS)\coredll_mousemanager.obj : .AUTODEPEND ..\..\src\common\mousemanager.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(COREDLL_CXXFLAGS) $< +!endif + !ifeq USE_GUI 1 $(OBJS)\coredll_nbkbase.obj : .AUTODEPEND ..\..\src\common\nbkbase.cpp $(CXX) -bt=nt -zq -fo=$^@ $(COREDLL_CXXFLAGS) $< @@ -13831,6 +13854,11 @@ $(OBJS)\corelib_menucmn.obj : .AUTODEPEND ..\..\src\common\menucmn.cpp $(CXX) -bt=nt -zq -fo=$^@ $(CORELIB_CXXFLAGS) $< !endif +!ifeq USE_GUI 1 +$(OBJS)\corelib_mousemanager.obj : .AUTODEPEND ..\..\src\common\mousemanager.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(CORELIB_CXXFLAGS) $< +!endif + !ifeq USE_GUI 1 $(OBJS)\corelib_nbkbase.obj : .AUTODEPEND ..\..\src\common\nbkbase.cpp $(CXX) -bt=nt -zq -fo=$^@ $(CORELIB_CXXFLAGS) $< diff --git a/build/msw/wx_core.dsp b/build/msw/wx_core.dsp index 524e745dfc..0fd77c5ad3 100644 --- a/build/msw/wx_core.dsp +++ b/build/msw/wx_core.dsp @@ -546,6 +546,10 @@ SOURCE=..\..\src\common\menucmn.cpp # End Source File # Begin Source File +SOURCE=..\..\src\common\mousemanager.cpp +# End Source File +# Begin Source File + SOURCE=..\..\src\common\msgout.cpp # End Source File # Begin Source File @@ -6206,6 +6210,10 @@ SOURCE=..\..\include\wx\minifram.h # End Source File # Begin Source File +SOURCE=..\..\include\wx\mousemanager.h +# End Source File +# Begin Source File + SOURCE=..\..\include\wx\msgdlg.h # End Source File # Begin Source File diff --git a/build/msw/wx_vc7_core.vcproj b/build/msw/wx_vc7_core.vcproj index dd33388933..dd200a458c 100644 --- a/build/msw/wx_vc7_core.vcproj +++ b/build/msw/wx_vc7_core.vcproj @@ -797,6 +797,9 @@ + + @@ -5256,6 +5259,9 @@ + + diff --git a/build/msw/wx_vc8_core.vcproj b/build/msw/wx_vc8_core.vcproj index b4c6d4d7b8..df7a903a85 100644 --- a/build/msw/wx_vc8_core.vcproj +++ b/build/msw/wx_vc8_core.vcproj @@ -1098,6 +1098,10 @@ RelativePath="..\..\src\common\menucmn.cpp" > + + @@ -7027,6 +7031,10 @@ RelativePath="..\..\include\wx\minifram.h" > + + diff --git a/build/msw/wx_vc9_core.vcproj b/build/msw/wx_vc9_core.vcproj index 2e1321a448..b5750330e5 100644 --- a/build/msw/wx_vc9_core.vcproj +++ b/build/msw/wx_vc9_core.vcproj @@ -1094,6 +1094,10 @@ RelativePath="..\..\src\common\menucmn.cpp" > + + @@ -7023,6 +7027,10 @@ RelativePath="..\..\include\wx\minifram.h" > + + diff --git a/docs/changes.txt b/docs/changes.txt index 34fded9b03..9de3209663 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -331,6 +331,7 @@ All (GUI): - wxGrid: add possibility to prevent resizing of individual rows/columns. - wxHTML: add support for table borders width (Laurent Humbertclaude). +- Added wxMouseEventsManager. MSW: diff --git a/include/wx/mousemanager.h b/include/wx/mousemanager.h new file mode 100644 index 0000000000..75c8920df9 --- /dev/null +++ b/include/wx/mousemanager.h @@ -0,0 +1,148 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/mousemanager.h +// Purpose: wxMouseEventsManager class declaration +// Author: Vadim Zeitlin +// Created: 2009-04-20 +// RCS-ID: $Id$ +// Copyright: (c) 2009 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MOUSEMANAGER_H_ +#define _WX_MOUSEMANAGER_H_ + +#include "wx/event.h" + +// ---------------------------------------------------------------------------- +// wxMouseEventsManager +// ---------------------------------------------------------------------------- + +/* + This class handles mouse events and synthesizes high-level notifications + such as clicks and drag events from low level mouse button presses and + mouse movement events. It is useful because handling the mouse events is + less obvious than might seem at a first glance: for example, clicks on an + object should only be generated if the mouse was both pressed and released + over it and not just released (so it requires storing the previous state) + and dragging shouldn't start before the mouse moves away far enough. + + This class encapsulates all these dull details for controls containing + multiple items which can be identified by a positive integer index and you + just need to implement its pure virtual functions to use it. + */ +class WXDLLIMPEXP_CORE wxMouseEventsManager : public wxEvtHandler +{ +public: + // a mouse event manager is always associated with a window and must be + // deleted by the window when it is destroyed + wxMouseEventsManager(wxWindow *win); + + virtual ~wxMouseEventsManager(); + +protected: + // called to find the item at the given position: return wxNOT_FOUND (-1) + // if there is no item here + virtual int MouseHitTest(const wxPoint& pos) = 0; + + // called when the user clicked (i.e. pressed and released mouse over the + // same item), should normally generate a notification about this click and + // return true if it was handled or false otherwise, determining whether + // the original mouse event is skipped or not + virtual bool MouseClicked(int item) = 0; + + // called to start dragging the given item, should generate the appropriate + // BEGIN_DRAG event and return false if dragging this item was forbidden + virtual bool MouseDragBegin(int item, const wxPoint& pos) = 0; + + // called while the item is being dragged, should normally update the + // feedback on screen (usually using wxOverlay) + virtual void MouseDragging(int item, const wxPoint& pos) = 0; + + // called when the mouse is released after dragging the item + virtual void MouseDragEnd(int item, const wxPoint& pos) = 0; + + // called when mouse capture is lost while dragging the item, should remove + // the visual feedback drawn by MouseDragging() + virtual void MouseDragCancelled(int item) = 0; + + + // you don't need to override those but you will want to do if it your + // control renders pressed items differently + + // called when the item is becomes pressed, can be used to change its + // appearance + virtual void MouseClickBegin(int WXUNUSED(item)) { } + + // called if the mouse capture was lost while the item was pressed, can be + // used to restore the default item appearance if it was changed in + // MouseClickBegin() + virtual void MouseClickCancelled(int WXUNUSED(item)) { } + +private: + /* + Here is a small diagram explaining the switches between different + states: + + + /---------->NORMAL<--------------- Drag end + / / / | event + / / | | ^ + / / | | | + Click / N | | mouse | mouse up + event / | | down | + | / | | DRAGGING + | / | | ^ + Y|/ N \ v |Y + +-------------+ +--------+ N +-----------+ + |On same item?| |On item?| -----------|Begin drag?| + +-------------+ +--------+ / +-----------+ + ^ | / ^ + | | / | + \ mouse | / mouse moved | + \ up v v far enough / + \--------PRESSED-------------------/ + + + There are also transitions from PRESSED and DRAGGING to NORMAL in case + the mouse capture is lost or Escape key is pressed which are not shown. + */ + enum State + { + State_Normal, // initial, default state + State_Pressed, // mouse was pressed over an item + State_Dragging // the item is being dragged + }; + + + // various event handlers + void OnCaptureLost(wxMouseCaptureLostEvent& event); + void OnLeftDown(wxMouseEvent& event); + void OnLeftUp(wxMouseEvent& event); + void OnMove(wxMouseEvent& event); + + + // the associated window, never NULL + wxWindow * const m_win; + + // the current state + State m_state; + + // the details of the operation currently in progress, only valid if + // m_state is not normal + + // the item being pressed or dragged (always valid, i.e. != wxNOT_FOUND if + // m_state != State_Normal) + int m_item; + + // the position of the last mouse event of interest: either mouse press in + // State_Pressed or last movement event in State_Dragging + wxPoint m_posLast; + + + DECLARE_EVENT_TABLE() + + wxDECLARE_NO_COPY_CLASS(wxMouseEventsManager); +}; + +#endif // _WX_MOUSEMANAGER_H_ + diff --git a/interface/wx/mousemanager.h b/interface/wx/mousemanager.h new file mode 100644 index 0000000000..2c8b05a1ae --- /dev/null +++ b/interface/wx/mousemanager.h @@ -0,0 +1,166 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/mousemanager.h +// Purpose: documentation of wxMouseEventsManager class +// Author: Vadim Zeitlin +// Created: 2009-04-20 +// RCS-ID: $Id$ +// Copyright: (c) 2009 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +/** + @class wxMouseEventsManager + + Helper for handling mouse input events in windows containing multiple + items. + + This class handles mouse events and synthesizes high-level notifications + such as clicks and drag events from low level mouse button presses and + mouse movement events. It is useful because handling the mouse events is + less obvious than might seem at a first glance: for example, clicks on an + object should only be generated if the mouse was both pressed and released + over it and not just released (so it requires storing the previous state) + and dragging shouldn't start before the mouse moves away far enough. + + This class encapsulates all these dull details for controls containing + multiple items which can be identified by a positive integer index and you + just need to implement its pure virtual functions to use it. + + Notice that this class supposes that all items can be identified by an + integer "index" but it doesn't need to be an ordinal index of the item + (although this is the most common case) -- it can be any value which can + be used to uniquely identify an item. + + @library{core} + @category{events} + */ +class wxMouseEventsManager : public wxEvtHandler +{ +public: + /** + Constructor creates the manager for the window. + + A mouse event manager is always associated with a window and must be + destroyed by the window when it is destroyed (it doesn't need to be + allocated on the heap however). + */ + wxMouseEventsManager(wxWindow *win); + +protected: + /** + Must be overridden to return the item at the given position. + + @param pos + The position to test, in physical coordinates. + @return + The index of the item at the given position or wxNOT_FOUND if there + is no item there. + */ + virtual int MouseHitTest(const wxPoint& pos) = 0; + + /** + Must be overridden to react to mouse clicks. + + This method is called when the user clicked (i.e. pressed and released + mouse over the @e same item) and should normally generate a + notification about this click and return true if it was handled or + false otherwise, determining whether the original mouse event is + skipped or not. + + @param item + The item which was clicked. + @return + @true if the mouse event was processed and @false otherwise. + */ + virtual bool MouseClicked(int item) = 0; + + /** + Must be overridden to allow or deny dragging of the item. + + This method is called when the user attempts to start dragging the + given item. + + @param item + The item which is going to be dragged. + @param pos + The position from where it is being dragged. + @return + @true to allow the item to be dragged (in which case + MouseDragging() and MouseDragEnd() will be called later, unless + MouseDragCancelled() is called instead) or @false to forbid it. + */ + virtual bool MouseDragBegin(int item, const wxPoint& pos) = 0; + + /** + Must be overridden to provide feed back while an item is being dragged. + + This method is called while the item is being dragged and should + normally update the feedback shown on screen (usually this is done + using wxOverlay). + + Notice that this method will never be called for the items for which + MouseDragBegin() returns @false. Consequently, if MouseDragBegin() + always returns @false you can do nothing in this method. + + @param item + The item being dragged. + @param pos + The current position of the item. + + @see MouseDragEnd() + */ + virtual void MouseDragging(int item, const wxPoint& pos) = 0; + + /** + Must be overridden to handle item drop. + + This method is called when the mouse is released after dragging the + item. Normally the item should be positioned at the new location. + + @param item + The item which was dragged and now dropped. + @param pos + The position at which the item was dropped. + + @see MouseDragBegin(), MouseDragging() + */ + virtual void MouseDragEnd(int item, const wxPoint& pos) = 0; + + /** + Must be overridden to handle cancellation of mouse dragging. + + This method is called when mouse capture is lost while dragging the + item and normally should remove the visual feedback drawn by + MouseDragging() as well as reset any internal variables set in + MouseDragBegin(). + + @see wxMouseCaptureLostEvent + */ + virtual void MouseDragCancelled(int item) = 0; + + + /** + May be overridden to update the state of an item when it is pressed. + + This method is called when the item is becomes pressed and can be used + to change its appearance when this happens. It is mostly useful for + button-like items and doesn't need to be overridden if the items + shouldn't change their appearance when pressed. + + @param item + The item being pressed. + */ + virtual void MouseClickBegin(int item); + + /** + Must be overridden to reset the item appearance changed by + MouseClickBegin(). + + This method is called if the mouse capture was lost while the item was + pressed and must be overridden to restore the default item appearance + if it was changed in MouseClickBegin(). + + @see MouseDragCancelled(), wxMouseCaptureLostEvent + */ + virtual void MouseClickCancelled(int item); +}; diff --git a/src/common/mousemanager.cpp b/src/common/mousemanager.cpp new file mode 100644 index 0000000000..c373955038 --- /dev/null +++ b/src/common/mousemanager.cpp @@ -0,0 +1,176 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/mousemanager.cpp +// Purpose: implementation of wxMouseEventsManager class +// Author: Vadim Zeitlin +// Created: 2009-04-21 +// RCS-ID: $Id$ +// Copyright: (c) 2009 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/mousemanager.h" + +// ---------------------------------------------------------------------------- +// event tables +// ---------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxMouseEventsManager, wxEvtHandler) + EVT_MOUSE_CAPTURE_LOST(wxMouseEventsManager::OnCaptureLost) + EVT_LEFT_DOWN(wxMouseEventsManager::OnLeftDown) + EVT_LEFT_UP(wxMouseEventsManager::OnLeftUp) + EVT_MOTION(wxMouseEventsManager::OnMove) +END_EVENT_TABLE() + +// ============================================================================ +// wxMouseEventsManager implementation +// ============================================================================ + +wxMouseEventsManager::wxMouseEventsManager(wxWindow *win) + : m_win(win) +{ + m_state = State_Normal; + m_item = wxNOT_FOUND; + + win->PushEventHandler(this); +} + +wxMouseEventsManager::~wxMouseEventsManager() +{ + m_win->RemoveEventHandler(this); +} + +void wxMouseEventsManager::OnCaptureLost(wxMouseCaptureLostEvent& WXUNUSED(event)) +{ + switch ( m_state ) + { + case State_Normal: + wxFAIL_MSG( "mouse shouldn't be captured in normal state" ); + break; + + case State_Pressed: + MouseClickCancelled(m_item); + break; + + case State_Dragging: + MouseDragCancelled(m_item); + break; + } + + m_state = State_Normal; + m_item = wxNOT_FOUND; +} + +void wxMouseEventsManager::OnLeftDown(wxMouseEvent& event) +{ + wxASSERT_MSG( m_state == State_Normal, + "state hasn't been reset to normal somehow" ); + + m_posLast = event.GetPosition(); + m_item = MouseHitTest(m_posLast); + if ( m_item == wxNOT_FOUND ) + { + event.Skip(); + return; + } + + m_state = State_Pressed; + m_win->CaptureMouse(); + MouseClickBegin(m_item); +} + +void wxMouseEventsManager::OnLeftUp(wxMouseEvent& event) +{ + switch ( m_state ) + { + case State_Normal: + // ignore it, the mouse hasn't been pressed over any item initially + // so releasing it shouldn't do anything + event.Skip(); + + // skip releasing the capture below + return; + + case State_Pressed: + if ( MouseHitTest(event.GetPosition()) == m_item ) + { + // mouse released over the same item, so it was a click + MouseClicked(m_item); + } + break; + + case State_Dragging: + MouseDragEnd(m_item, event.GetPosition()); + break; + } + + m_state = State_Normal; + m_item = wxNOT_FOUND; + m_win->ReleaseMouse(); +} + +void wxMouseEventsManager::OnMove(wxMouseEvent& event) +{ + switch ( m_state ) + { + case State_Normal: + event.Skip(); + break; + + case State_Pressed: + wxASSERT_MSG( event.LeftIsDown(), + "should have detected mouse being released" ); + + { + // it's probably a bad idea to query the system for these + // values every time the mouse is moved so cache them on the + // assumption that they don't change -- which is wrong, of + // course, the user can change them but it doesn't happen often + static const int + dragMinX = wxSystemSettings::GetMetric(wxSYS_DRAG_X); + static const int + dragMinY = wxSystemSettings::GetMetric(wxSYS_DRAG_Y); + + const wxPoint& pos = event.GetPosition(); + const wxPoint ofs = pos - m_posLast; + if ( abs(ofs.x) > dragMinX || abs(ofs.y) > dragMinY ) + { + // the mouse left the rectangle inside which its movements + // are considered to be too small to constitute a start of + // drag operation, do [attempt to] start it now + if ( MouseDragBegin(m_item, pos) ) + { + m_state = State_Dragging; + } + } + else // still didn't move far enough away + { + event.Skip(); + } + } + break; + + case State_Dragging: + m_posLast = event.GetPosition(); + MouseDragging(m_item, m_posLast); + break; + } +} + -- 2.47.2