]> git.saurik.com Git - wxWidgets.git/commitdiff
added wxMouseEventsManager
authorVadim Zeitlin <vadim@wxwidgets.org>
Fri, 1 May 2009 22:52:33 +0000 (22:52 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Fri, 1 May 2009 22:52:33 +0000 (22:52 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@60463 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

14 files changed:
Makefile.in
build/bakefiles/files.bkl
build/msw/makefile.bcc
build/msw/makefile.gcc
build/msw/makefile.vc
build/msw/makefile.wat
build/msw/wx_core.dsp
build/msw/wx_vc7_core.vcproj
build/msw/wx_vc8_core.vcproj
build/msw/wx_vc9_core.vcproj
docs/changes.txt
include/wx/mousemanager.h [new file with mode: 0644]
interface/wx/mousemanager.h [new file with mode: 0644]
src/common/mousemanager.cpp [new file with mode: 0644]

index 8959c6bf22937b39f5a70f6db04542b3f1dcdcc0..0bde7114c755a7290f4c0737bc00b2e9f6a2b362 100644 (file)
@@ -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
 
index b60fdaf5a5392f809206f67d26d114c4cbd692e1..8c6dc9f1ac66784122cbe822f82226dbde5eaacc 100644 (file)
@@ -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
index be9805b76953b150a7cfa779f0059af11d37638f..52df76ef41e0a8e2b90dcd7ab79b4f3ed28a7d95 100644 (file)
@@ -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
index 48afcfb3cd842b227b39f98661768b06ecc6d572..7c1614b7a4501e137665b3d18271924b9b00d68b 100644 (file)
@@ -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) $<
index a42c9dcc38268435c1efd7b8b862b16cdc2d78fe..5e01a28d1d2ce37642f15a99f5ee8730ee900791 100644 (file)
@@ -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
index decbe7458b1e5cfaa07d6cd97e20f0a0c6c7b1a0..7c0e82269664175f5fbbb2a5ae55ff8c59299ee4 100644 (file)
@@ -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) $<
index 524e745dfcd5e788f97602895e05e5aaeef74d51..0fd77c5ad3240d68b0b0f515493a6ccf3ddaa72b 100644 (file)
@@ -546,6 +546,10 @@ SOURCE=..\..\src\common\menucmn.cpp
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=..\..\src\common\mousemanager.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=..\..\src\common\msgout.cpp\r
 # End Source File\r
 # Begin Source File\r
@@ -6206,6 +6210,10 @@ SOURCE=..\..\include\wx\minifram.h
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=..\..\include\wx\mousemanager.h\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=..\..\include\wx\msgdlg.h\r
 # End Source File\r
 # Begin Source File\r
index dd3338893376a72e61ba5e341ac5fd7ba4b48a6b..dd200a458c4fd3509492352d389e6d341a3a6612 100644 (file)
                        <File\r
                                RelativePath="..\..\src\common\menucmn.cpp">\r
                        </File>\r
+                       <File\r
+                               RelativePath="..\..\src\common\mousemanager.cpp">\r
+                       </File>\r
                        <File\r
                                RelativePath="..\..\src\common\msgout.cpp">\r
                        </File>\r
                        <File\r
                                RelativePath="..\..\include\wx\minifram.h">\r
                        </File>\r
+                       <File\r
+                               RelativePath="..\..\include\wx\mousemanager.h">\r
+                       </File>\r
                        <File\r
                                RelativePath="..\..\include\wx\msgdlg.h">\r
                        </File>\r
index b4c6d4d7b8bd1d6faf185dd777da16e70e2aa9d1..df7a903a851be06cf6fea6b4f6bb90f37aaab150 100644 (file)
                                RelativePath="..\..\src\common\menucmn.cpp"\r
                                >\r
                        </File>\r
+                       <File\r
+                               RelativePath="..\..\src\common\mousemanager.cpp"\r
+                               >\r
+                       </File>\r
                        <File\r
                                RelativePath="..\..\src\common\msgout.cpp"\r
                                >\r
                                RelativePath="..\..\include\wx\minifram.h"\r
                                >\r
                        </File>\r
+                       <File\r
+                               RelativePath="..\..\include\wx\mousemanager.h"\r
+                               >\r
+                       </File>\r
                        <File\r
                                RelativePath="..\..\include\wx\msgdlg.h"\r
                                >\r
index 2e1321a448654cd2f49861c9082017ca7d449749..b5750330e5de18c8b208f26394d34d94e1db8870 100644 (file)
                                RelativePath="..\..\src\common\menucmn.cpp"\r
                                >\r
                        </File>\r
+                       <File\r
+                               RelativePath="..\..\src\common\mousemanager.cpp"\r
+                               >\r
+                       </File>\r
                        <File\r
                                RelativePath="..\..\src\common\msgout.cpp"\r
                                >\r
                                RelativePath="..\..\include\wx\minifram.h"\r
                                >\r
                        </File>\r
+                       <File\r
+                               RelativePath="..\..\include\wx\mousemanager.h"\r
+                               >\r
+                       </File>\r
                        <File\r
                                RelativePath="..\..\include\wx\msgdlg.h"\r
                                >\r
index 34fded9b03a0e90ea7b1059fcef4d578ac475290..9de3209663a8b339ffe858f3f887f4f50d898c2f 100644 (file)
@@ -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 (file)
index 0000000..75c8920
--- /dev/null
@@ -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 <vadim@wxwidgets.org>
+// 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 (file)
index 0000000..2c8b05a
--- /dev/null
@@ -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 <vadim@wxwidgets.org>
+// 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 (file)
index 0000000..c373955
--- /dev/null
@@ -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 <vadim@wxwidgets.org>
+// 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;
+    }
+}
+