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;
+ }
+}
+