From ea11bf3abcec34e31b9919a2e222e61f82643830 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Mon, 22 Aug 2011 12:18:43 +0000 Subject: [PATCH] Add new wxBannerWindow class. A simple banner showing either a bitmap or some text on gradient background. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@68838 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- Makefile.in | 22 ++ build/bakefiles/files.bkl | 2 + build/msw/makefile.bcc | 24 ++ build/msw/makefile.gcc | 24 ++ build/msw/makefile.vc | 24 ++ build/msw/makefile.wat | 24 ++ build/msw/wx_adv.dsp | 8 + build/msw/wx_core.dsp | 4 + build/msw/wx_vc7_adv.vcproj | 6 + build/msw/wx_vc7_core.vcproj | 3 + build/msw/wx_vc8_adv.vcproj | 8 + build/msw/wx_vc8_core.vcproj | 4 + build/msw/wx_vc9_adv.vcproj | 8 + build/msw/wx_vc9_core.vcproj | 4 + configure | 53 ++++ configure.in | 6 + docs/changes.txt | 1 + docs/doxygen/images/generic/bannerwindow.png | Bin 0 -> 50556 bytes include/wx/bannerwindow.h | 137 ++++++++++ include/wx/motif/setup0.h | 1 + include/wx/msw/setup0.h | 1 + include/wx/msw/wince/setup.h | 1 + include/wx/os2/setup0.h | 1 + include/wx/osx/setup0.h | 1 + include/wx/palmos/setup0.h | 1 + include/wx/setup_inc.h | 1 + include/wx/univ/setup0.h | 1 + interface/wx/bannerwindow.h | 151 +++++++++++ samples/xrc/Makefile.in | 4 +- samples/xrc/makefile.bcc | 2 +- samples/xrc/makefile.gcc | 2 +- samples/xrc/makefile.vc | 2 +- samples/xrc/makefile.wat | 2 +- samples/xrc/xrcdemo.bkl | 1 + setup.h.in | 1 + src/generic/bannerwindow.cpp | 262 +++++++++++++++++++ 36 files changed, 791 insertions(+), 6 deletions(-) create mode 100644 docs/doxygen/images/generic/bannerwindow.png create mode 100644 include/wx/bannerwindow.h create mode 100644 interface/wx/bannerwindow.h create mode 100644 src/generic/bannerwindow.cpp diff --git a/Makefile.in b/Makefile.in index 4a339baefe..7f8608caa8 100644 --- a/Makefile.in +++ b/Makefile.in @@ -3676,6 +3676,7 @@ COND_TOOLKIT_WINCE_ADVANCED_PLATFORM_NATIVE_HDR = \ COND_WXUNIV_0_ADVANCED_HDR = \ wx/aboutdlg.h \ wx/animate.h \ + wx/bannerwindow.h \ wx/bmpcbox.h \ wx/calctrl.h \ wx/commandlinkbutton.h \ @@ -3723,6 +3724,7 @@ COND_WXUNIV_0_ADVANCED_HDR = \ COND_WXUNIV_1_ADVANCED_HDR = \ wx/aboutdlg.h \ wx/animate.h \ + wx/bannerwindow.h \ wx/bmpcbox.h \ wx/calctrl.h \ wx/commandlinkbutton.h \ @@ -6073,6 +6075,7 @@ COND_WXUNIV_0___ADVANCED_SRC_OBJECTS = \ monodll_hyperlnkcmn.o \ monodll_odcombocmn.o \ monodll_aboutdlgg.o \ + monodll_bannerwindow.o \ monodll_bmpcboxg.o \ monodll_calctrlg.o \ monodll_commandlinkbuttong.o \ @@ -6105,6 +6108,7 @@ COND_WXUNIV_1___ADVANCED_SRC_OBJECTS = \ monodll_hyperlnkcmn.o \ monodll_odcombocmn.o \ monodll_aboutdlgg.o \ + monodll_bannerwindow.o \ monodll_bmpcboxg.o \ monodll_calctrlg.o \ monodll_commandlinkbuttong.o \ @@ -8003,6 +8007,7 @@ COND_WXUNIV_0___ADVANCED_SRC_OBJECTS_1 = \ monolib_hyperlnkcmn.o \ monolib_odcombocmn.o \ monolib_aboutdlgg.o \ + monolib_bannerwindow.o \ monolib_bmpcboxg.o \ monolib_calctrlg.o \ monolib_commandlinkbuttong.o \ @@ -8035,6 +8040,7 @@ COND_WXUNIV_1___ADVANCED_SRC_OBJECTS_1 = \ monolib_hyperlnkcmn.o \ monolib_odcombocmn.o \ monolib_aboutdlgg.o \ + monolib_bannerwindow.o \ monolib_bmpcboxg.o \ monolib_calctrlg.o \ monolib_commandlinkbuttong.o \ @@ -11776,6 +11782,7 @@ COND_WXUNIV_0___ADVANCED_SRC_OBJECTS_2 = \ advdll_hyperlnkcmn.o \ advdll_odcombocmn.o \ advdll_aboutdlgg.o \ + advdll_bannerwindow.o \ advdll_bmpcboxg.o \ advdll_calctrlg.o \ advdll_commandlinkbuttong.o \ @@ -11808,6 +11815,7 @@ COND_WXUNIV_1___ADVANCED_SRC_OBJECTS_2 = \ advdll_hyperlnkcmn.o \ advdll_odcombocmn.o \ advdll_aboutdlgg.o \ + advdll_bannerwindow.o \ advdll_bmpcboxg.o \ advdll_calctrlg.o \ advdll_commandlinkbuttong.o \ @@ -11880,6 +11888,7 @@ COND_WXUNIV_0___ADVANCED_SRC_OBJECTS_3 = \ advlib_hyperlnkcmn.o \ advlib_odcombocmn.o \ advlib_aboutdlgg.o \ + advlib_bannerwindow.o \ advlib_bmpcboxg.o \ advlib_calctrlg.o \ advlib_commandlinkbuttong.o \ @@ -11912,6 +11921,7 @@ COND_WXUNIV_1___ADVANCED_SRC_OBJECTS_3 = \ advlib_hyperlnkcmn.o \ advlib_odcombocmn.o \ advlib_aboutdlgg.o \ + advlib_bannerwindow.o \ advlib_bmpcboxg.o \ advlib_calctrlg.o \ advlib_commandlinkbuttong.o \ @@ -20342,6 +20352,9 @@ monodll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONODLL_ODEP) @COND_USE_GUI_1@monodll_aboutdlgg.o: $(srcdir)/src/generic/aboutdlgg.cpp $(MONODLL_ODEP) @COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/generic/aboutdlgg.cpp +@COND_USE_GUI_1@monodll_bannerwindow.o: $(srcdir)/src/generic/bannerwindow.cpp $(MONODLL_ODEP) +@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/generic/bannerwindow.cpp + @COND_USE_GUI_1@monodll_bmpcboxg.o: $(srcdir)/src/generic/bmpcboxg.cpp $(MONODLL_ODEP) @COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/generic/bmpcboxg.cpp @@ -25667,6 +25680,9 @@ monolib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONOLIB_ODEP) @COND_USE_GUI_1@monolib_aboutdlgg.o: $(srcdir)/src/generic/aboutdlgg.cpp $(MONOLIB_ODEP) @COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/generic/aboutdlgg.cpp +@COND_USE_GUI_1@monolib_bannerwindow.o: $(srcdir)/src/generic/bannerwindow.cpp $(MONOLIB_ODEP) +@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/generic/bannerwindow.cpp + @COND_USE_GUI_1@monolib_bmpcboxg.o: $(srcdir)/src/generic/bmpcboxg.cpp $(MONOLIB_ODEP) @COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/generic/bmpcboxg.cpp @@ -35204,6 +35220,9 @@ advdll_odcombocmn.o: $(srcdir)/src/common/odcombocmn.cpp $(ADVDLL_ODEP) advdll_aboutdlgg.o: $(srcdir)/src/generic/aboutdlgg.cpp $(ADVDLL_ODEP) $(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/generic/aboutdlgg.cpp +advdll_bannerwindow.o: $(srcdir)/src/generic/bannerwindow.cpp $(ADVDLL_ODEP) + $(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/generic/bannerwindow.cpp + advdll_bmpcboxg.o: $(srcdir)/src/generic/bmpcboxg.cpp $(ADVDLL_ODEP) $(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/generic/bmpcboxg.cpp @@ -35558,6 +35577,9 @@ advlib_odcombocmn.o: $(srcdir)/src/common/odcombocmn.cpp $(ADVLIB_ODEP) advlib_aboutdlgg.o: $(srcdir)/src/generic/aboutdlgg.cpp $(ADVLIB_ODEP) $(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/generic/aboutdlgg.cpp +advlib_bannerwindow.o: $(srcdir)/src/generic/bannerwindow.cpp $(ADVLIB_ODEP) + $(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/generic/bannerwindow.cpp + advlib_bmpcboxg.o: $(srcdir)/src/generic/bmpcboxg.cpp $(ADVLIB_ODEP) $(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/generic/bmpcboxg.cpp diff --git a/build/bakefiles/files.bkl b/build/bakefiles/files.bkl index 0f59a801da..38fbc2d7e5 100644 --- a/build/bakefiles/files.bkl +++ b/build/bakefiles/files.bkl @@ -2953,6 +2953,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! src/common/hyperlnkcmn.cpp src/common/odcombocmn.cpp src/generic/aboutdlgg.cpp + src/generic/bannerwindow.cpp src/generic/bmpcboxg.cpp src/generic/calctrlg.cpp src/generic/commandlinkbuttong.cpp @@ -2978,6 +2979,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! wx/aboutdlg.h wx/animate.h + wx/bannerwindow.h wx/bmpcbox.h wx/calctrl.h wx/commandlinkbutton.h diff --git a/build/msw/makefile.bcc b/build/msw/makefile.bcc index 5dd84848d0..1d39fdb2a2 100644 --- a/build/msw/makefile.bcc +++ b/build/msw/makefile.bcc @@ -2226,6 +2226,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS = \ $(OBJS)\monodll_hyperlnkcmn.obj \ $(OBJS)\monodll_odcombocmn.obj \ $(OBJS)\monodll_aboutdlgg.obj \ + $(OBJS)\monodll_bannerwindow.obj \ $(OBJS)\monodll_bmpcboxg.obj \ $(OBJS)\monodll_calctrlg.obj \ $(OBJS)\monodll_commandlinkbuttong.obj \ @@ -2270,6 +2271,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS = \ $(OBJS)\monodll_hyperlnkcmn.obj \ $(OBJS)\monodll_odcombocmn.obj \ $(OBJS)\monodll_aboutdlgg.obj \ + $(OBJS)\monodll_bannerwindow.obj \ $(OBJS)\monodll_bmpcboxg.obj \ $(OBJS)\monodll_calctrlg.obj \ $(OBJS)\monodll_commandlinkbuttong.obj \ @@ -2990,6 +2992,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS = \ $(OBJS)\monolib_hyperlnkcmn.obj \ $(OBJS)\monolib_odcombocmn.obj \ $(OBJS)\monolib_aboutdlgg.obj \ + $(OBJS)\monolib_bannerwindow.obj \ $(OBJS)\monolib_bmpcboxg.obj \ $(OBJS)\monolib_calctrlg.obj \ $(OBJS)\monolib_commandlinkbuttong.obj \ @@ -3034,6 +3037,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS = \ $(OBJS)\monolib_hyperlnkcmn.obj \ $(OBJS)\monolib_odcombocmn.obj \ $(OBJS)\monolib_aboutdlgg.obj \ + $(OBJS)\monolib_bannerwindow.obj \ $(OBJS)\monolib_bmpcboxg.obj \ $(OBJS)\monolib_calctrlg.obj \ $(OBJS)\monolib_commandlinkbuttong.obj \ @@ -4194,6 +4198,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS = \ $(OBJS)\advdll_hyperlnkcmn.obj \ $(OBJS)\advdll_odcombocmn.obj \ $(OBJS)\advdll_aboutdlgg.obj \ + $(OBJS)\advdll_bannerwindow.obj \ $(OBJS)\advdll_bmpcboxg.obj \ $(OBJS)\advdll_calctrlg.obj \ $(OBJS)\advdll_commandlinkbuttong.obj \ @@ -4238,6 +4243,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS = \ $(OBJS)\advdll_hyperlnkcmn.obj \ $(OBJS)\advdll_odcombocmn.obj \ $(OBJS)\advdll_aboutdlgg.obj \ + $(OBJS)\advdll_bannerwindow.obj \ $(OBJS)\advdll_bmpcboxg.obj \ $(OBJS)\advdll_calctrlg.obj \ $(OBJS)\advdll_commandlinkbuttong.obj \ @@ -4280,6 +4286,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS = \ $(OBJS)\advlib_hyperlnkcmn.obj \ $(OBJS)\advlib_odcombocmn.obj \ $(OBJS)\advlib_aboutdlgg.obj \ + $(OBJS)\advlib_bannerwindow.obj \ $(OBJS)\advlib_bmpcboxg.obj \ $(OBJS)\advlib_calctrlg.obj \ $(OBJS)\advlib_commandlinkbuttong.obj \ @@ -4324,6 +4331,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS = \ $(OBJS)\advlib_hyperlnkcmn.obj \ $(OBJS)\advlib_odcombocmn.obj \ $(OBJS)\advlib_aboutdlgg.obj \ + $(OBJS)\advlib_bannerwindow.obj \ $(OBJS)\advlib_bmpcboxg.obj \ $(OBJS)\advlib_calctrlg.obj \ $(OBJS)\advlib_commandlinkbuttong.obj \ @@ -8117,6 +8125,11 @@ $(OBJS)\monodll_aboutdlgg.obj: ..\..\src\generic\aboutdlgg.cpp !endif !if "$(USE_GUI)" == "1" +$(OBJS)\monodll_bannerwindow.obj: ..\..\src\generic\bannerwindow.cpp + $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\generic\bannerwindow.cpp +!endif + +!if "$(USE_GUI)" == "1" $(OBJS)\monodll_bmpcboxg.obj: ..\..\src\generic\bmpcboxg.cpp $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\generic\bmpcboxg.cpp !endif @@ -10468,6 +10481,11 @@ $(OBJS)\monolib_aboutdlgg.obj: ..\..\src\generic\aboutdlgg.cpp !endif !if "$(USE_GUI)" == "1" +$(OBJS)\monolib_bannerwindow.obj: ..\..\src\generic\bannerwindow.cpp + $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\generic\bannerwindow.cpp +!endif + +!if "$(USE_GUI)" == "1" $(OBJS)\monolib_bmpcboxg.obj: ..\..\src\generic\bmpcboxg.cpp $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\generic\bmpcboxg.cpp !endif @@ -14225,6 +14243,9 @@ $(OBJS)\advdll_odcombocmn.obj: ..\..\src\common\odcombocmn.cpp $(OBJS)\advdll_aboutdlgg.obj: ..\..\src\generic\aboutdlgg.cpp $(CXX) -q -c -P -o$@ $(ADVDLL_CXXFLAGS) ..\..\src\generic\aboutdlgg.cpp +$(OBJS)\advdll_bannerwindow.obj: ..\..\src\generic\bannerwindow.cpp + $(CXX) -q -c -P -o$@ $(ADVDLL_CXXFLAGS) ..\..\src\generic\bannerwindow.cpp + $(OBJS)\advdll_bmpcboxg.obj: ..\..\src\generic\bmpcboxg.cpp $(CXX) -q -c -P -o$@ $(ADVDLL_CXXFLAGS) ..\..\src\generic\bmpcboxg.cpp @@ -14351,6 +14372,9 @@ $(OBJS)\advlib_odcombocmn.obj: ..\..\src\common\odcombocmn.cpp $(OBJS)\advlib_aboutdlgg.obj: ..\..\src\generic\aboutdlgg.cpp $(CXX) -q -c -P -o$@ $(ADVLIB_CXXFLAGS) ..\..\src\generic\aboutdlgg.cpp +$(OBJS)\advlib_bannerwindow.obj: ..\..\src\generic\bannerwindow.cpp + $(CXX) -q -c -P -o$@ $(ADVLIB_CXXFLAGS) ..\..\src\generic\bannerwindow.cpp + $(OBJS)\advlib_bmpcboxg.obj: ..\..\src\generic\bmpcboxg.cpp $(CXX) -q -c -P -o$@ $(ADVLIB_CXXFLAGS) ..\..\src\generic\bmpcboxg.cpp diff --git a/build/msw/makefile.gcc b/build/msw/makefile.gcc index 7b65f91e43..656b0327de 100644 --- a/build/msw/makefile.gcc +++ b/build/msw/makefile.gcc @@ -2240,6 +2240,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS = \ $(OBJS)\monodll_hyperlnkcmn.o \ $(OBJS)\monodll_odcombocmn.o \ $(OBJS)\monodll_aboutdlgg.o \ + $(OBJS)\monodll_bannerwindow.o \ $(OBJS)\monodll_bmpcboxg.o \ $(OBJS)\monodll_calctrlg.o \ $(OBJS)\monodll_commandlinkbuttong.o \ @@ -2284,6 +2285,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS = \ $(OBJS)\monodll_hyperlnkcmn.o \ $(OBJS)\monodll_odcombocmn.o \ $(OBJS)\monodll_aboutdlgg.o \ + $(OBJS)\monodll_bannerwindow.o \ $(OBJS)\monodll_bmpcboxg.o \ $(OBJS)\monodll_calctrlg.o \ $(OBJS)\monodll_commandlinkbuttong.o \ @@ -3010,6 +3012,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS = \ $(OBJS)\monolib_hyperlnkcmn.o \ $(OBJS)\monolib_odcombocmn.o \ $(OBJS)\monolib_aboutdlgg.o \ + $(OBJS)\monolib_bannerwindow.o \ $(OBJS)\monolib_bmpcboxg.o \ $(OBJS)\monolib_calctrlg.o \ $(OBJS)\monolib_commandlinkbuttong.o \ @@ -3054,6 +3057,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS = \ $(OBJS)\monolib_hyperlnkcmn.o \ $(OBJS)\monolib_odcombocmn.o \ $(OBJS)\monolib_aboutdlgg.o \ + $(OBJS)\monolib_bannerwindow.o \ $(OBJS)\monolib_bmpcboxg.o \ $(OBJS)\monolib_calctrlg.o \ $(OBJS)\monolib_commandlinkbuttong.o \ @@ -4242,6 +4246,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS = \ $(OBJS)\advdll_hyperlnkcmn.o \ $(OBJS)\advdll_odcombocmn.o \ $(OBJS)\advdll_aboutdlgg.o \ + $(OBJS)\advdll_bannerwindow.o \ $(OBJS)\advdll_bmpcboxg.o \ $(OBJS)\advdll_calctrlg.o \ $(OBJS)\advdll_commandlinkbuttong.o \ @@ -4286,6 +4291,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS = \ $(OBJS)\advdll_hyperlnkcmn.o \ $(OBJS)\advdll_odcombocmn.o \ $(OBJS)\advdll_aboutdlgg.o \ + $(OBJS)\advdll_bannerwindow.o \ $(OBJS)\advdll_bmpcboxg.o \ $(OBJS)\advdll_calctrlg.o \ $(OBJS)\advdll_commandlinkbuttong.o \ @@ -4332,6 +4338,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS = \ $(OBJS)\advlib_hyperlnkcmn.o \ $(OBJS)\advlib_odcombocmn.o \ $(OBJS)\advlib_aboutdlgg.o \ + $(OBJS)\advlib_bannerwindow.o \ $(OBJS)\advlib_bmpcboxg.o \ $(OBJS)\advlib_calctrlg.o \ $(OBJS)\advlib_commandlinkbuttong.o \ @@ -4376,6 +4383,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS = \ $(OBJS)\advlib_hyperlnkcmn.o \ $(OBJS)\advlib_odcombocmn.o \ $(OBJS)\advlib_aboutdlgg.o \ + $(OBJS)\advlib_bannerwindow.o \ $(OBJS)\advlib_bmpcboxg.o \ $(OBJS)\advlib_calctrlg.o \ $(OBJS)\advlib_commandlinkbuttong.o \ @@ -8267,6 +8275,11 @@ $(OBJS)\monodll_aboutdlgg.o: ../../src/generic/aboutdlgg.cpp endif ifeq ($(USE_GUI),1) +$(OBJS)\monodll_bannerwindow.o: ../../src/generic/bannerwindow.cpp + $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $< +endif + +ifeq ($(USE_GUI),1) $(OBJS)\monodll_bmpcboxg.o: ../../src/generic/bmpcboxg.cpp $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $< endif @@ -10618,6 +10631,11 @@ $(OBJS)\monolib_aboutdlgg.o: ../../src/generic/aboutdlgg.cpp endif ifeq ($(USE_GUI),1) +$(OBJS)\monolib_bannerwindow.o: ../../src/generic/bannerwindow.cpp + $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $< +endif + +ifeq ($(USE_GUI),1) $(OBJS)\monolib_bmpcboxg.o: ../../src/generic/bmpcboxg.cpp $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $< endif @@ -14375,6 +14393,9 @@ $(OBJS)\advdll_odcombocmn.o: ../../src/common/odcombocmn.cpp $(OBJS)\advdll_aboutdlgg.o: ../../src/generic/aboutdlgg.cpp $(CXX) -c -o $@ $(ADVDLL_CXXFLAGS) $(CPPDEPS) $< +$(OBJS)\advdll_bannerwindow.o: ../../src/generic/bannerwindow.cpp + $(CXX) -c -o $@ $(ADVDLL_CXXFLAGS) $(CPPDEPS) $< + $(OBJS)\advdll_bmpcboxg.o: ../../src/generic/bmpcboxg.cpp $(CXX) -c -o $@ $(ADVDLL_CXXFLAGS) $(CPPDEPS) $< @@ -14501,6 +14522,9 @@ $(OBJS)\advlib_odcombocmn.o: ../../src/common/odcombocmn.cpp $(OBJS)\advlib_aboutdlgg.o: ../../src/generic/aboutdlgg.cpp $(CXX) -c -o $@ $(ADVLIB_CXXFLAGS) $(CPPDEPS) $< +$(OBJS)\advlib_bannerwindow.o: ../../src/generic/bannerwindow.cpp + $(CXX) -c -o $@ $(ADVLIB_CXXFLAGS) $(CPPDEPS) $< + $(OBJS)\advlib_bmpcboxg.o: ../../src/generic/bmpcboxg.cpp $(CXX) -c -o $@ $(ADVLIB_CXXFLAGS) $(CPPDEPS) $< diff --git a/build/msw/makefile.vc b/build/msw/makefile.vc index fea35eea34..7948df179b 100644 --- a/build/msw/makefile.vc +++ b/build/msw/makefile.vc @@ -2434,6 +2434,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS = \ $(OBJS)\monodll_hyperlnkcmn.obj \ $(OBJS)\monodll_odcombocmn.obj \ $(OBJS)\monodll_aboutdlgg.obj \ + $(OBJS)\monodll_bannerwindow.obj \ $(OBJS)\monodll_bmpcboxg.obj \ $(OBJS)\monodll_calctrlg.obj \ $(OBJS)\monodll_commandlinkbuttong.obj \ @@ -2478,6 +2479,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS = \ $(OBJS)\monodll_hyperlnkcmn.obj \ $(OBJS)\monodll_odcombocmn.obj \ $(OBJS)\monodll_aboutdlgg.obj \ + $(OBJS)\monodll_bannerwindow.obj \ $(OBJS)\monodll_bmpcboxg.obj \ $(OBJS)\monodll_calctrlg.obj \ $(OBJS)\monodll_commandlinkbuttong.obj \ @@ -3204,6 +3206,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS = \ $(OBJS)\monolib_hyperlnkcmn.obj \ $(OBJS)\monolib_odcombocmn.obj \ $(OBJS)\monolib_aboutdlgg.obj \ + $(OBJS)\monolib_bannerwindow.obj \ $(OBJS)\monolib_bmpcboxg.obj \ $(OBJS)\monolib_calctrlg.obj \ $(OBJS)\monolib_commandlinkbuttong.obj \ @@ -3248,6 +3251,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS = \ $(OBJS)\monolib_hyperlnkcmn.obj \ $(OBJS)\monolib_odcombocmn.obj \ $(OBJS)\monolib_aboutdlgg.obj \ + $(OBJS)\monolib_bannerwindow.obj \ $(OBJS)\monolib_bmpcboxg.obj \ $(OBJS)\monolib_calctrlg.obj \ $(OBJS)\monolib_commandlinkbuttong.obj \ @@ -4498,6 +4502,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS = \ $(OBJS)\advdll_hyperlnkcmn.obj \ $(OBJS)\advdll_odcombocmn.obj \ $(OBJS)\advdll_aboutdlgg.obj \ + $(OBJS)\advdll_bannerwindow.obj \ $(OBJS)\advdll_bmpcboxg.obj \ $(OBJS)\advdll_calctrlg.obj \ $(OBJS)\advdll_commandlinkbuttong.obj \ @@ -4542,6 +4547,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS = \ $(OBJS)\advdll_hyperlnkcmn.obj \ $(OBJS)\advdll_odcombocmn.obj \ $(OBJS)\advdll_aboutdlgg.obj \ + $(OBJS)\advdll_bannerwindow.obj \ $(OBJS)\advdll_bmpcboxg.obj \ $(OBJS)\advdll_calctrlg.obj \ $(OBJS)\advdll_commandlinkbuttong.obj \ @@ -4590,6 +4596,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS = \ $(OBJS)\advlib_hyperlnkcmn.obj \ $(OBJS)\advlib_odcombocmn.obj \ $(OBJS)\advlib_aboutdlgg.obj \ + $(OBJS)\advlib_bannerwindow.obj \ $(OBJS)\advlib_bmpcboxg.obj \ $(OBJS)\advlib_calctrlg.obj \ $(OBJS)\advlib_commandlinkbuttong.obj \ @@ -4634,6 +4641,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS = \ $(OBJS)\advlib_hyperlnkcmn.obj \ $(OBJS)\advlib_odcombocmn.obj \ $(OBJS)\advlib_aboutdlgg.obj \ + $(OBJS)\advlib_bannerwindow.obj \ $(OBJS)\advlib_bmpcboxg.obj \ $(OBJS)\advlib_calctrlg.obj \ $(OBJS)\advlib_commandlinkbuttong.obj \ @@ -8697,6 +8705,11 @@ $(OBJS)\monodll_aboutdlgg.obj: ..\..\src\generic\aboutdlgg.cpp !endif !if "$(USE_GUI)" == "1" +$(OBJS)\monodll_bannerwindow.obj: ..\..\src\generic\bannerwindow.cpp + $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\generic\bannerwindow.cpp +!endif + +!if "$(USE_GUI)" == "1" $(OBJS)\monodll_bmpcboxg.obj: ..\..\src\generic\bmpcboxg.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\generic\bmpcboxg.cpp !endif @@ -11048,6 +11061,11 @@ $(OBJS)\monolib_aboutdlgg.obj: ..\..\src\generic\aboutdlgg.cpp !endif !if "$(USE_GUI)" == "1" +$(OBJS)\monolib_bannerwindow.obj: ..\..\src\generic\bannerwindow.cpp + $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\generic\bannerwindow.cpp +!endif + +!if "$(USE_GUI)" == "1" $(OBJS)\monolib_bmpcboxg.obj: ..\..\src\generic\bmpcboxg.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\generic\bmpcboxg.cpp !endif @@ -14805,6 +14823,9 @@ $(OBJS)\advdll_odcombocmn.obj: ..\..\src\common\odcombocmn.cpp $(OBJS)\advdll_aboutdlgg.obj: ..\..\src\generic\aboutdlgg.cpp $(CXX) /c /nologo /TP /Fo$@ $(ADVDLL_CXXFLAGS) ..\..\src\generic\aboutdlgg.cpp +$(OBJS)\advdll_bannerwindow.obj: ..\..\src\generic\bannerwindow.cpp + $(CXX) /c /nologo /TP /Fo$@ $(ADVDLL_CXXFLAGS) ..\..\src\generic\bannerwindow.cpp + $(OBJS)\advdll_bmpcboxg.obj: ..\..\src\generic\bmpcboxg.cpp $(CXX) /c /nologo /TP /Fo$@ $(ADVDLL_CXXFLAGS) ..\..\src\generic\bmpcboxg.cpp @@ -14931,6 +14952,9 @@ $(OBJS)\advlib_odcombocmn.obj: ..\..\src\common\odcombocmn.cpp $(OBJS)\advlib_aboutdlgg.obj: ..\..\src\generic\aboutdlgg.cpp $(CXX) /c /nologo /TP /Fo$@ $(ADVLIB_CXXFLAGS) ..\..\src\generic\aboutdlgg.cpp +$(OBJS)\advlib_bannerwindow.obj: ..\..\src\generic\bannerwindow.cpp + $(CXX) /c /nologo /TP /Fo$@ $(ADVLIB_CXXFLAGS) ..\..\src\generic\bannerwindow.cpp + $(OBJS)\advlib_bmpcboxg.obj: ..\..\src\generic\bmpcboxg.cpp $(CXX) /c /nologo /TP /Fo$@ $(ADVLIB_CXXFLAGS) ..\..\src\generic\bmpcboxg.cpp diff --git a/build/msw/makefile.wat b/build/msw/makefile.wat index bdaeb130e2..9f2d8525e1 100644 --- a/build/msw/makefile.wat +++ b/build/msw/makefile.wat @@ -792,6 +792,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS = & $(OBJS)\monodll_hyperlnkcmn.obj & $(OBJS)\monodll_odcombocmn.obj & $(OBJS)\monodll_aboutdlgg.obj & + $(OBJS)\monodll_bannerwindow.obj & $(OBJS)\monodll_bmpcboxg.obj & $(OBJS)\monodll_calctrlg.obj & $(OBJS)\monodll_commandlinkbuttong.obj & @@ -836,6 +837,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS = & $(OBJS)\monodll_hyperlnkcmn.obj & $(OBJS)\monodll_odcombocmn.obj & $(OBJS)\monodll_aboutdlgg.obj & + $(OBJS)\monodll_bannerwindow.obj & $(OBJS)\monodll_bmpcboxg.obj & $(OBJS)\monodll_calctrlg.obj & $(OBJS)\monodll_commandlinkbuttong.obj & @@ -1567,6 +1569,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS = & $(OBJS)\monolib_hyperlnkcmn.obj & $(OBJS)\monolib_odcombocmn.obj & $(OBJS)\monolib_aboutdlgg.obj & + $(OBJS)\monolib_bannerwindow.obj & $(OBJS)\monolib_bmpcboxg.obj & $(OBJS)\monolib_calctrlg.obj & $(OBJS)\monolib_commandlinkbuttong.obj & @@ -1611,6 +1614,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS = & $(OBJS)\monolib_hyperlnkcmn.obj & $(OBJS)\monolib_odcombocmn.obj & $(OBJS)\monolib_aboutdlgg.obj & + $(OBJS)\monolib_bannerwindow.obj & $(OBJS)\monolib_bmpcboxg.obj & $(OBJS)\monolib_calctrlg.obj & $(OBJS)\monolib_commandlinkbuttong.obj & @@ -2815,6 +2819,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS = & $(OBJS)\advdll_hyperlnkcmn.obj & $(OBJS)\advdll_odcombocmn.obj & $(OBJS)\advdll_aboutdlgg.obj & + $(OBJS)\advdll_bannerwindow.obj & $(OBJS)\advdll_bmpcboxg.obj & $(OBJS)\advdll_calctrlg.obj & $(OBJS)\advdll_commandlinkbuttong.obj & @@ -2859,6 +2864,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS = & $(OBJS)\advdll_hyperlnkcmn.obj & $(OBJS)\advdll_odcombocmn.obj & $(OBJS)\advdll_aboutdlgg.obj & + $(OBJS)\advdll_bannerwindow.obj & $(OBJS)\advdll_bmpcboxg.obj & $(OBJS)\advdll_calctrlg.obj & $(OBJS)\advdll_commandlinkbuttong.obj & @@ -2907,6 +2913,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS = & $(OBJS)\advlib_hyperlnkcmn.obj & $(OBJS)\advlib_odcombocmn.obj & $(OBJS)\advlib_aboutdlgg.obj & + $(OBJS)\advlib_bannerwindow.obj & $(OBJS)\advlib_bmpcboxg.obj & $(OBJS)\advlib_calctrlg.obj & $(OBJS)\advlib_commandlinkbuttong.obj & @@ -2951,6 +2958,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS = & $(OBJS)\advlib_hyperlnkcmn.obj & $(OBJS)\advlib_odcombocmn.obj & $(OBJS)\advlib_aboutdlgg.obj & + $(OBJS)\advlib_bannerwindow.obj & $(OBJS)\advlib_bmpcboxg.obj & $(OBJS)\advlib_calctrlg.obj & $(OBJS)\advlib_commandlinkbuttong.obj & @@ -8526,6 +8534,11 @@ $(OBJS)\monodll_aboutdlgg.obj : .AUTODEPEND ..\..\src\generic\aboutdlgg.cpp !endif !ifeq USE_GUI 1 +$(OBJS)\monodll_bannerwindow.obj : .AUTODEPEND ..\..\src\generic\bannerwindow.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $< +!endif + +!ifeq USE_GUI 1 $(OBJS)\monodll_bmpcboxg.obj : .AUTODEPEND ..\..\src\generic\bmpcboxg.cpp $(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $< !endif @@ -10877,6 +10890,11 @@ $(OBJS)\monolib_aboutdlgg.obj : .AUTODEPEND ..\..\src\generic\aboutdlgg.cpp !endif !ifeq USE_GUI 1 +$(OBJS)\monolib_bannerwindow.obj : .AUTODEPEND ..\..\src\generic\bannerwindow.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $< +!endif + +!ifeq USE_GUI 1 $(OBJS)\monolib_bmpcboxg.obj : .AUTODEPEND ..\..\src\generic\bmpcboxg.cpp $(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $< !endif @@ -14634,6 +14652,9 @@ $(OBJS)\advdll_odcombocmn.obj : .AUTODEPEND ..\..\src\common\odcombocmn.cpp $(OBJS)\advdll_aboutdlgg.obj : .AUTODEPEND ..\..\src\generic\aboutdlgg.cpp $(CXX) -bt=nt -zq -fo=$^@ $(ADVDLL_CXXFLAGS) $< +$(OBJS)\advdll_bannerwindow.obj : .AUTODEPEND ..\..\src\generic\bannerwindow.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(ADVDLL_CXXFLAGS) $< + $(OBJS)\advdll_bmpcboxg.obj : .AUTODEPEND ..\..\src\generic\bmpcboxg.cpp $(CXX) -bt=nt -zq -fo=$^@ $(ADVDLL_CXXFLAGS) $< @@ -14760,6 +14781,9 @@ $(OBJS)\advlib_odcombocmn.obj : .AUTODEPEND ..\..\src\common\odcombocmn.cpp $(OBJS)\advlib_aboutdlgg.obj : .AUTODEPEND ..\..\src\generic\aboutdlgg.cpp $(CXX) -bt=nt -zq -fo=$^@ $(ADVLIB_CXXFLAGS) $< +$(OBJS)\advlib_bannerwindow.obj : .AUTODEPEND ..\..\src\generic\bannerwindow.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(ADVLIB_CXXFLAGS) $< + $(OBJS)\advlib_bmpcboxg.obj : .AUTODEPEND ..\..\src\generic\bmpcboxg.cpp $(CXX) -bt=nt -zq -fo=$^@ $(ADVLIB_CXXFLAGS) $< diff --git a/build/msw/wx_adv.dsp b/build/msw/wx_adv.dsp index 142a143e04..a780126fa2 100644 --- a/build/msw/wx_adv.dsp +++ b/build/msw/wx_adv.dsp @@ -563,6 +563,10 @@ SOURCE=..\..\src\generic\animateg.cpp # End Source File # Begin Source File +SOURCE=..\..\src\generic\bannerwindow.cpp +# End Source File +# Begin Source File + SOURCE=..\..\src\generic\bmpcboxg.cpp # End Source File # Begin Source File @@ -1012,6 +1016,10 @@ SOURCE=..\..\include\wx\animate.h # End Source File # Begin Source File +SOURCE=..\..\include\wx\bannerwindow.h +# End Source File +# Begin Source File + SOURCE=..\..\include\wx\bmpcbox.h # End Source File # Begin Source File diff --git a/build/msw/wx_core.dsp b/build/msw/wx_core.dsp index 8f33605177..995d25ffa7 100644 --- a/build/msw/wx_core.dsp +++ b/build/msw/wx_core.dsp @@ -5984,6 +5984,10 @@ SOURCE=..\..\include\wx\aui\auibook.h # End Source File # Begin Source File +SOURCE=..\..\include\wx\bannerwindow.h +# End Source File +# Begin Source File + SOURCE=..\..\include\wx\ribbon\bar.h # End Source File # Begin Source File diff --git a/build/msw/wx_vc7_adv.vcproj b/build/msw/wx_vc7_adv.vcproj index fd8c6ffbfe..8aae4bbc49 100644 --- a/build/msw/wx_vc7_adv.vcproj +++ b/build/msw/wx_vc7_adv.vcproj @@ -738,6 +738,9 @@ RelativePath="..\..\src\generic\animateg.cpp"> + + + + + + + + @@ -1445,6 +1449,10 @@ > + + diff --git a/build/msw/wx_vc8_core.vcproj b/build/msw/wx_vc8_core.vcproj index d3d8da208a..3be4420e15 100644 --- a/build/msw/wx_vc8_core.vcproj +++ b/build/msw/wx_vc8_core.vcproj @@ -6772,6 +6772,10 @@ > + + diff --git a/build/msw/wx_vc9_adv.vcproj b/build/msw/wx_vc9_adv.vcproj index 174463f822..fe4b1d162f 100644 --- a/build/msw/wx_vc9_adv.vcproj +++ b/build/msw/wx_vc9_adv.vcproj @@ -1013,6 +1013,10 @@ > + + @@ -1441,6 +1445,10 @@ > + + diff --git a/build/msw/wx_vc9_core.vcproj b/build/msw/wx_vc9_core.vcproj index d8110a956b..6b1255c1d2 100644 --- a/build/msw/wx_vc9_core.vcproj +++ b/build/msw/wx_vc9_core.vcproj @@ -6768,6 +6768,10 @@ > + + diff --git a/configure b/configure index f602dbf16b..41ff05c2e6 100755 --- a/configure +++ b/configure @@ -1809,6 +1809,7 @@ Optional Features: --enable-markup support wxControl::SetLabelMarkup --enable-accel use accelerators --enable-animatectrl use wxAnimationCtrl class + --enable-bannerwindow use wxBannerWindow class --enable-artstd use standard XPM icons in wxArtProvider --enable-arttango use Tango icons in wxArtProvider --enable-bmpbutton use wxBitmapButton class @@ -9853,6 +9854,7 @@ echo "${ECHO_T}$result" >&6; } if test "$wxUSE_CONTROLS" = "no"; then DEFAULT_wxUSE_ACCEL=no DEFAULT_wxUSE_ANIMATIONCTRL=no + DEFAULT_wxUSE_BANNERWINDOW=no DEFAULT_wxUSE_BMPBUTTON=no DEFAULT_wxUSE_BUTTON=no DEFAULT_wxUSE_CALCTRL=no @@ -10044,6 +10046,50 @@ fi echo "${ECHO_T}$result" >&6; } + enablestring= + defaultval=$wxUSE_ALL_FEATURES + if test -z "$defaultval"; then + if test x"$enablestring" = xdisable; then + defaultval=yes + else + defaultval=no + fi + fi + + { echo "$as_me:$LINENO: checking for --${enablestring:-enable}-bannerwindow" >&5 +echo $ECHO_N "checking for --${enablestring:-enable}-bannerwindow... $ECHO_C" >&6; } + # Check whether --enable-bannerwindow was given. +if test "${enable_bannerwindow+set}" = set; then + enableval=$enable_bannerwindow; + if test "$enableval" = yes; then + wx_cv_use_bannerwindow='wxUSE_BANNERWINDOW=yes' + else + wx_cv_use_bannerwindow='wxUSE_BANNERWINDOW=no' + fi + +else + + wx_cv_use_bannerwindow='wxUSE_BANNERWINDOW=${'DEFAULT_wxUSE_BANNERWINDOW":-$defaultval}" + +fi + + + eval "$wx_cv_use_bannerwindow" + + if test x"$enablestring" = xdisable; then + if test $wxUSE_BANNERWINDOW = no; then + result=yes + else + result=no + fi + else + result=$wxUSE_BANNERWINDOW + fi + + { echo "$as_me:$LINENO: result: $result" >&5 +echo "${ECHO_T}$result" >&6; } + + enablestring= defaultval=$wxUSE_ALL_FEATURES if test -z "$defaultval"; then @@ -47255,6 +47301,13 @@ _ACEOF SAMPLES_SUBDIRS="$SAMPLES_SUBDIRS animate" fi +if test "$wxUSE_BANNERWINDOW" = "yes"; then + cat >>confdefs.h <<\_ACEOF +#define wxUSE_BANNERWINDOW 1 +_ACEOF + +fi + if test "$wxUSE_BUTTON" = "yes"; then cat >>confdefs.h <<\_ACEOF #define wxUSE_BUTTON 1 diff --git a/configure.in b/configure.in index f2a5156351..69a7babfea 100644 --- a/configure.in +++ b/configure.in @@ -877,6 +877,7 @@ dnl disabled if test "$wxUSE_CONTROLS" = "no"; then DEFAULT_wxUSE_ACCEL=no DEFAULT_wxUSE_ANIMATIONCTRL=no + DEFAULT_wxUSE_BANNERWINDOW=no DEFAULT_wxUSE_BMPBUTTON=no DEFAULT_wxUSE_BUTTON=no DEFAULT_wxUSE_CALCTRL=no @@ -940,6 +941,7 @@ WX_ARG_FEATURE(markup, [ --enable-markup support wxControl::SetLab dnl please keep the settings below in alphabetical order WX_ARG_FEATURE(accel, [ --enable-accel use accelerators], wxUSE_ACCEL) WX_ARG_FEATURE(animatectrl, [ --enable-animatectrl use wxAnimationCtrl class], wxUSE_ANIMATIONCTRL) +WX_ARG_FEATURE(bannerwindow,[ --enable-bannerwindow use wxBannerWindow class], wxUSE_BANNERWINDOW) WX_ARG_FEATURE(artstd, [ --enable-artstd use standard XPM icons in wxArtProvider], wxUSE_ARTPROVIDER_STD) WX_ARG_FEATURE(arttango, [ --enable-arttango use Tango icons in wxArtProvider], wxUSE_ARTPROVIDER_TANGO) WX_ARG_FEATURE(bmpbutton, [ --enable-bmpbutton use wxBitmapButton class], wxUSE_BMPBUTTON) @@ -6795,6 +6797,10 @@ if test "$wxUSE_ANIMATIONCTRL" = "yes"; then SAMPLES_SUBDIRS="$SAMPLES_SUBDIRS animate" fi +if test "$wxUSE_BANNERWINDOW" = "yes"; then + AC_DEFINE(wxUSE_BANNERWINDOW) +fi + if test "$wxUSE_BUTTON" = "yes"; then AC_DEFINE(wxUSE_BUTTON) USES_CONTROLS=1 diff --git a/docs/changes.txt b/docs/changes.txt index c25a86af53..fd5ba917f5 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -450,6 +450,7 @@ All (GUI): - Added documented, public wxNavigationEnabled<> class. - Added wxTextCtrl::PositionToCoords() (Navaneeth). - Added support for wxHELP button to wxMessageDialog. +- Added wxBannerWindow class. - Support float, double and file name values in wxGenericValidator (troelsk). - Fix keyboard navigation in wxGrid with hidden columns (ivan_14_32). - Add wxDataViewEvent::IsEditCancelled() (Allonii). diff --git a/docs/doxygen/images/generic/bannerwindow.png b/docs/doxygen/images/generic/bannerwindow.png new file mode 100644 index 0000000000000000000000000000000000000000..e8a9a482ca34414c13c4727e961aebd7e5c836ce GIT binary patch literal 50556 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

q;Nu9K`=e$;X0Tgd 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 qnPRnOu+x7 +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_BANNERWINDOW_H_ +#define _WX_BANNERWINDOW_H_ + +#include "wx/defs.h" + +#if wxUSE_BANNERWINDOW + +#include "wx/bitmap.h" +#include "wx/event.h" +#include "wx/window.h" + +class WXDLLIMPEXP_FWD_CORE wxBitmap; +class WXDLLIMPEXP_FWD_CORE wxColour; +class WXDLLIMPEXP_FWD_CORE wxDC; + +extern WXDLLIMPEXP_DATA_CORE(const char) wxBannerWindowNameStr[]; + +// ---------------------------------------------------------------------------- +// A simple banner window showing either a bitmap or text. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxBannerWindow : public wxWindow +{ +public: + // Default constructor, use Create() later. + wxBannerWindow() { Init(); } + + // Convenient constructor that should be used in the majority of cases. + // + // The banner orientation changes how the text in it is displayed and also + // defines where is the bitmap truncated if it's too big to fit but doesn't + // do anything for the banner position, this is supposed to be taken care + // of in the usual way, e.g. using sizers. + wxBannerWindow(wxWindow* parent, wxDirection dir = wxLEFT) + { + Init(); + + Create(parent, wxID_ANY, dir); + } + + // Full constructor provided for consistency with the other classes only. + wxBannerWindow(wxWindow* parent, + wxWindowID winid, + wxDirection dir = wxLEFT, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxBannerWindowNameStr) + { + Init(); + + Create(parent, winid, dir, pos, size, style, name); + } + + // Can be only called on objects created with the default constructor. + bool Create(wxWindow* parent, + wxWindowID winid, + wxDirection dir = wxLEFT, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxBannerWindowNameStr); + + + // Provide an existing bitmap to show. For wxLEFT orientation the bitmap is + // truncated from the top, for wxTOP and wxBOTTOM -- from the right and for + // wxRIGHT -- from the bottom, so put the most important part of the bitmap + // information in the opposite direction. + void SetBitmap(const wxBitmap& bmp); + + // Set the text to display. This is mutually exclusive with SetBitmap(). + // Title is rendered in bold and should be single line, message can have + // multiple lines but is not wrapped automatically. + void SetText(const wxString& title, const wxString& message); + + // Set the colours between which the gradient runs. This can be combined + // with SetText() but not SetBitmap(). + void SetGradient(const wxColour& start, const wxColour& end); + +protected: + virtual wxSize DoGetBestClientSize() const; + +private: + // Common part of all constructors. + void Init(); + + // Fully invalidates the window. + void OnSize(wxSizeEvent& event); + + // Redraws the window using either m_bitmap or m_title/m_message. + void OnPaint(wxPaintEvent& event); + + // Helper of OnPaint(): draw the bitmap at the correct position depending + // on our orientation. + void DrawBitmapBackground(wxDC& dc); + + // Helper of OnPaint(): draw the text in the appropriate direction. + void DrawBannerTextLine(wxDC& dc, const wxString& str, const wxPoint& pos); + + // Return the font to use for the title. Currently this is hardcoded as a + // larger bold version of the standard window font but could be made + // configurable in the future. + wxFont GetTitleFont() const; + + + // The window side along which the banner is laid out. + wxDirection m_direction; + + // If valid, this bitmap is drawn as is. + wxBitmap m_bitmap; + + // The title and main message to draw, used if m_bitmap is invalid. + wxString m_title, + m_message; + + // Start and stop gradient colours, only used when drawing text. + wxColour m_colStart, + m_colEnd; + + wxDECLARE_EVENT_TABLE(); + + wxDECLARE_NO_COPY_CLASS(wxBannerWindow); +}; + +#endif // wxUSE_BANNERWINDOW + +#endif // _WX_BANNERWINDOW_H_ diff --git a/include/wx/motif/setup0.h b/include/wx/motif/setup0.h index 4e1a836115..a111fd3e32 100644 --- a/include/wx/motif/setup0.h +++ b/include/wx/motif/setup0.h @@ -803,6 +803,7 @@ // // Recommended setting: 1 #define wxUSE_ANIMATIONCTRL 1 // wxAnimationCtrl +#define wxUSE_BANNERWINDOW 1 // wxBannerWindow #define wxUSE_BUTTON 1 // wxButton #define wxUSE_BMPBUTTON 1 // wxBitmapButton #define wxUSE_CALENDARCTRL 1 // wxCalendarCtrl diff --git a/include/wx/msw/setup0.h b/include/wx/msw/setup0.h index 04a5c132b7..75770ea0e9 100644 --- a/include/wx/msw/setup0.h +++ b/include/wx/msw/setup0.h @@ -803,6 +803,7 @@ // // Recommended setting: 1 #define wxUSE_ANIMATIONCTRL 1 // wxAnimationCtrl +#define wxUSE_BANNERWINDOW 1 // wxBannerWindow #define wxUSE_BUTTON 1 // wxButton #define wxUSE_BMPBUTTON 1 // wxBitmapButton #define wxUSE_CALENDARCTRL 1 // wxCalendarCtrl diff --git a/include/wx/msw/wince/setup.h b/include/wx/msw/wince/setup.h index ce854d68cd..f0c50f6861 100644 --- a/include/wx/msw/wince/setup.h +++ b/include/wx/msw/wince/setup.h @@ -803,6 +803,7 @@ // // Recommended setting: 1 #define wxUSE_ANIMATIONCTRL 1 // wxAnimationCtrl +#define wxUSE_BANNERWINDOW 1 // wxBannerWindow #define wxUSE_BUTTON 1 // wxButton #define wxUSE_BMPBUTTON 1 // wxBitmapButton #define wxUSE_CALENDARCTRL 1 // wxCalendarCtrl diff --git a/include/wx/os2/setup0.h b/include/wx/os2/setup0.h index 267647d251..dae9cb5c3c 100644 --- a/include/wx/os2/setup0.h +++ b/include/wx/os2/setup0.h @@ -803,6 +803,7 @@ // // Recommended setting: 1 #define wxUSE_ANIMATIONCTRL 1 // wxAnimationCtrl +#define wxUSE_BANNERWINDOW 1 // wxBannerWindow #define wxUSE_BUTTON 1 // wxButton #define wxUSE_BMPBUTTON 1 // wxBitmapButton #define wxUSE_CALENDARCTRL 1 // wxCalendarCtrl diff --git a/include/wx/osx/setup0.h b/include/wx/osx/setup0.h index 57192429e2..ab17bb42f0 100644 --- a/include/wx/osx/setup0.h +++ b/include/wx/osx/setup0.h @@ -804,6 +804,7 @@ // // Recommended setting: 1 #define wxUSE_ANIMATIONCTRL 1 // wxAnimationCtrl +#define wxUSE_BANNERWINDOW 1 // wxBannerWindow #define wxUSE_BUTTON 1 // wxButton #define wxUSE_BMPBUTTON 1 // wxBitmapButton #define wxUSE_CALENDARCTRL 1 // wxCalendarCtrl diff --git a/include/wx/palmos/setup0.h b/include/wx/palmos/setup0.h index 96b03fa46d..aad15675d2 100644 --- a/include/wx/palmos/setup0.h +++ b/include/wx/palmos/setup0.h @@ -803,6 +803,7 @@ // // Recommended setting: 1 #define wxUSE_ANIMATIONCTRL 1 // wxAnimationCtrl +#define wxUSE_BANNERWINDOW 1 // wxBannerWindow #define wxUSE_BUTTON 1 // wxButton #define wxUSE_BMPBUTTON 1 // wxBitmapButton #define wxUSE_CALENDARCTRL 1 // wxCalendarCtrl diff --git a/include/wx/setup_inc.h b/include/wx/setup_inc.h index e85a56bf4c..48a5a85155 100644 --- a/include/wx/setup_inc.h +++ b/include/wx/setup_inc.h @@ -799,6 +799,7 @@ // // Recommended setting: 1 #define wxUSE_ANIMATIONCTRL 1 // wxAnimationCtrl +#define wxUSE_BANNERWINDOW 1 // wxBannerWindow #define wxUSE_BUTTON 1 // wxButton #define wxUSE_BMPBUTTON 1 // wxBitmapButton #define wxUSE_CALENDARCTRL 1 // wxCalendarCtrl diff --git a/include/wx/univ/setup0.h b/include/wx/univ/setup0.h index ee5870c5c9..4407173b17 100644 --- a/include/wx/univ/setup0.h +++ b/include/wx/univ/setup0.h @@ -802,6 +802,7 @@ // // Recommended setting: 1 #define wxUSE_ANIMATIONCTRL 1 // wxAnimationCtrl +#define wxUSE_BANNERWINDOW 1 // wxBannerWindow #define wxUSE_BUTTON 1 // wxButton #define wxUSE_BMPBUTTON 1 // wxBitmapButton #define wxUSE_CALENDARCTRL 1 // wxCalendarCtrl diff --git a/interface/wx/bannerwindow.h b/interface/wx/bannerwindow.h new file mode 100644 index 0000000000..50f70bb3b7 --- /dev/null +++ b/interface/wx/bannerwindow.h @@ -0,0 +1,151 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: interface.wx/bannerwindow.h +// Purpose: wxBannerWindow class documentation +// Author: Vadim Zeitlin +// Created: 2011-08-16 +// RCS-ID: $Id$ +// Copyright: (c) 2011 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +/** + A simple banner window showing either a bitmap or text. + + Banner windows can be used to present some overview of the current window + contents to the user in an aesthetically pleasant way. They are typically + positioned along the left or top edge of the window (although this class + also supports right- and bottom-aligned banners) and show either a bitmap + with a logo or a few lines of text on a gradient-filled background. + + Using this class is very simple, e.g.: + @code + MyFrame::MyFrame(...) + { + ... create the frame itself ... + + // Create and initialize the banner. + wxBannerWindow* banner = new wxBannerWindow(this, wxTOP); + banner->SetText("Welcome to my wonderful program", + " Before doing anything else, you need to connect to " + "the online server.\n" + " Please enter your credentials in the controls below."); + + // And position it along the left edge of the window. + wxSizer* sizer = new wxBoxSizer(wxVERTICAL); + sizer->Add(banner, wxSizerFlags().Expand()); + + ... add the rest of the window contents to the same sizer ... + + SetSizerAndFit(sizer); + } + @endcode + + This class is currently implemented generically and so looks the same under + all platforms. + + @library{wxadv} + @category{miscwnd} + @genericAppearance{bannerwindow.png} + + @since 2.9.3 + */ +class wxBannerWindow : public wxWindow +{ +public: + /** + Default constructor, use Create() later. + + This constructor is only used for two-step creation, if possible, + prefer using the constructor below directly instead of using this one + and calling Create() later. + */ + wxBannerWindow(); + + /** + Convenient constructor that should be used in the majority of cases. + + The only really important arguments of the full constructor below are + @a parent and @a dir so this class provides a convenient constructor + taking only them. + + The banner orientation changes how the text in it is displayed and also + defines where is the bitmap truncated if it's too big to fit but doesn't + do anything for the banner position, this is supposed to be taken care + of in the usual way, e.g. using sizers. + */ + wxBannerWindow(wxWindow* parent, wxDirection dir = wxLEFT); + + /** + Full constructor provided for consistency with the other classes only. + + Prefer to use the shorter constructor documented above. You should + rarely, if ever, need to use non-default values for any other + parameters: as the banner window doesn't generate any events, its + identifier is not particularly useful; its position and size will be + almost always managed by the containing sizer and it doesn't have any + specific styles. So only the parent and the banner direction need to be + specified. + */ + wxBannerWindow(wxWindow* parent, + wxWindowID winid, + wxDirection dir = wxLEFT, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxBannerWindowNameStr); + + /** + Really create the banner window for the objects created using the + default constructor. + + It's an error to call Create() for the objects created using + non-default constructor. + */ + bool Create(wxWindow* parent, + wxWindowID winid, + wxDirection dir = wxLEFT, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxBannerWindowNameStr); + + + /** + Provide the bitmap to use as background. + + Notice that the bitmap should be big enough to always cover the entire + banner, e.g. for a horizontal banner with wxTOP style its width should + be bigger than any reasonable window size. + + For wxLEFT orientation the bitmap is truncated from the top, for wxTOP + and wxBOTTOM -- from the right and for wxRIGHT -- from the bottom, so + put the most important part of the bitmap information in the opposite + direction. + + If no valid background bitmap is specified, the banner draws gradient + background but if a valid bitmap is given here, the gradient is not + draw and the start and end colours specified for it are ignored. + + @param bmp Bitmap to use as background. May be invalid to indicate + that no background bitmap should be used. + */ + void SetBitmap(const wxBitmap& bmp); + + /** + Set the text to display. + + This is mutually exclusive with SetBitmap(). + + Title is rendered in bold and should be single line, message can have + multiple lines but is not wrapped automatically, include explicit line + breaks in the string if you want to have multiple lines. + */ + void SetText(const wxString& title, const wxString& message); + + /** + Set the colours between which the gradient runs. + + The gradient colours are ignored if SetBitmap() is used. + */ + void SetGradient(const wxColour& start, const wxColour& end); +}; diff --git a/samples/xrc/Makefile.in b/samples/xrc/Makefile.in index b0f9c9e6e6..9855f6aa9b 100644 --- a/samples/xrc/Makefile.in +++ b/samples/xrc/Makefile.in @@ -43,7 +43,7 @@ wx_top_builddir = @wx_top_builddir@ DESTDIR = WX_RELEASE = 2.9 -WX_VERSION = $(WX_RELEASE).2 +WX_VERSION = $(WX_RELEASE).3 LIBDIRNAME = $(wx_top_builddir)/lib XRCDEMO_CXXFLAGS = -D__WX$(TOOLKIT)__ $(__WXUNIV_DEFINE_p) $(__DEBUG_DEFINE_p) \ $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) $(__THREAD_DEFINE_p) \ @@ -196,7 +196,7 @@ xrcdemo$(EXEEXT): $(XRCDEMO_OBJECTS) $(__xrcdemo___win32rc) data: @mkdir -p ./rc - @for f in artprov.xpm artprov.xrc basicdlg.xpm basicdlg.xrc controls.xpm controls.xrc custclas.xpm custclas.xrc derivdlg.xpm derivdlg.xrc fileopen.gif filesave.gif frame.xrc fuzzy.gif menu.xrc platform.xpm platform.xrc quotes.gif resource.xrc toolbar.xrc uncenter.xpm objref.xrc objrefdlg.xpm uncenter.xrc update.gif variable.xpm variable.xrc throbber.gif stop.xpm; do \ + @for f in artprov.xpm artprov.xrc basicdlg.xpm basicdlg.xrc controls.xpm controls.xrc custclas.xpm custclas.xrc derivdlg.xpm derivdlg.xrc fileopen.gif filesave.gif frame.xrc fuzzy.gif menu.xrc platform.xpm platform.xrc quotes.gif resource.xrc toolbar.xrc uncenter.xpm objref.xrc objrefdlg.xpm uncenter.xrc update.gif variable.xpm variable.xrc throbber.gif stop.xpm wxbanner.gif; do \ if test ! -f ./rc/$$f -a ! -d ./rc/$$f ; \ then x=yep ; \ else x=`find $(srcdir)/rc/$$f -newer ./rc/$$f -print` ; \ diff --git a/samples/xrc/makefile.bcc b/samples/xrc/makefile.bcc index 640ceb508d..fce255c64c 100644 --- a/samples/xrc/makefile.bcc +++ b/samples/xrc/makefile.bcc @@ -256,7 +256,7 @@ $(OBJS)\xrcdemo.exe: $(XRCDEMO_OBJECTS) $(OBJS)\xrcdemo_sample.res data: if not exist $(OBJS)\rc mkdir $(OBJS)\rc - for %f in (artprov.xpm artprov.xrc basicdlg.xpm basicdlg.xrc controls.xpm controls.xrc custclas.xpm custclas.xrc derivdlg.xpm derivdlg.xrc fileopen.gif filesave.gif frame.xrc fuzzy.gif menu.xrc platform.xpm platform.xrc quotes.gif resource.xrc toolbar.xrc uncenter.xpm objref.xrc objrefdlg.xpm uncenter.xrc update.gif variable.xpm variable.xrc throbber.gif stop.xpm) do if not exist $(OBJS)\rc\%f copy .\rc\%f $(OBJS)\rc + for %f in (artprov.xpm artprov.xrc basicdlg.xpm basicdlg.xrc controls.xpm controls.xrc custclas.xpm custclas.xrc derivdlg.xpm derivdlg.xrc fileopen.gif filesave.gif frame.xrc fuzzy.gif menu.xrc platform.xpm platform.xrc quotes.gif resource.xrc toolbar.xrc uncenter.xpm objref.xrc objrefdlg.xpm uncenter.xrc update.gif variable.xpm variable.xrc throbber.gif stop.xpm wxbanner.gif) do if not exist $(OBJS)\rc\%f copy .\rc\%f $(OBJS)\rc $(OBJS)\xrcdemo_sample.res: .\..\..\samples\sample.rc brcc32 -32 -r -fo$@ -i$(BCCDIR)\include -d__WXMSW__ $(__WXUNIV_DEFINE_p_1) $(__DEBUG_DEFINE_p_1) $(__NDEBUG_DEFINE_p_1) $(__EXCEPTIONS_DEFINE_p_1) $(__RTTI_DEFINE_p_1) $(__THREAD_DEFINE_p_1) $(__UNICODE_DEFINE_p_1) $(__MSLU_DEFINE_p_1) -i$(SETUPHDIR) -i.\..\..\include $(____CAIRO_INCLUDEDIR_FILENAMES_1_p) -i. $(__DLLFLAG_p_1) -i.\..\..\samples -dNOPCH .\..\..\samples\sample.rc diff --git a/samples/xrc/makefile.gcc b/samples/xrc/makefile.gcc index c0fd8fd972..5da3226c0a 100644 --- a/samples/xrc/makefile.gcc +++ b/samples/xrc/makefile.gcc @@ -243,7 +243,7 @@ $(OBJS)\xrcdemo.exe: $(XRCDEMO_OBJECTS) $(OBJS)\xrcdemo_sample_rc.o data: if not exist $(OBJS)\rc mkdir $(OBJS)\rc - for %%f in (artprov.xpm artprov.xrc basicdlg.xpm basicdlg.xrc controls.xpm controls.xrc custclas.xpm custclas.xrc derivdlg.xpm derivdlg.xrc fileopen.gif filesave.gif frame.xrc fuzzy.gif menu.xrc platform.xpm platform.xrc quotes.gif resource.xrc toolbar.xrc uncenter.xpm objref.xrc objrefdlg.xpm uncenter.xrc update.gif variable.xpm variable.xrc throbber.gif stop.xpm) do if not exist $(OBJS)\rc\%%f copy .\rc\%%f $(OBJS)\rc + for %%f in (artprov.xpm artprov.xrc basicdlg.xpm basicdlg.xrc controls.xpm controls.xrc custclas.xpm custclas.xrc derivdlg.xpm derivdlg.xrc fileopen.gif filesave.gif frame.xrc fuzzy.gif menu.xrc platform.xpm platform.xrc quotes.gif resource.xrc toolbar.xrc uncenter.xpm objref.xrc objrefdlg.xpm uncenter.xrc update.gif variable.xpm variable.xrc throbber.gif stop.xpm wxbanner.gif) do if not exist $(OBJS)\rc\%%f copy .\rc\%%f $(OBJS)\rc $(OBJS)\xrcdemo_sample_rc.o: ./../../samples/sample.rc windres --use-temp-file -i$< -o$@ --define __WXMSW__ $(__WXUNIV_DEFINE_p_1) $(__DEBUG_DEFINE_p_1) $(__NDEBUG_DEFINE_p_1) $(__EXCEPTIONS_DEFINE_p_1) $(__RTTI_DEFINE_p_1) $(__THREAD_DEFINE_p_1) $(__UNICODE_DEFINE_p_1) $(__MSLU_DEFINE_p_1) --include-dir $(SETUPHDIR) --include-dir ./../../include $(__CAIRO_INCLUDEDIR_p) --include-dir . $(__DLLFLAG_p_1) --include-dir ./../../samples --define NOPCH diff --git a/samples/xrc/makefile.vc b/samples/xrc/makefile.vc index 8cf1f97d86..3ca05cfbeb 100644 --- a/samples/xrc/makefile.vc +++ b/samples/xrc/makefile.vc @@ -366,7 +366,7 @@ $(OBJS)\xrcdemo.exe: $(XRCDEMO_OBJECTS) $(OBJS)\xrcdemo_sample.res data: if not exist $(OBJS)\rc mkdir $(OBJS)\rc - for %f in (artprov.xpm artprov.xrc basicdlg.xpm basicdlg.xrc controls.xpm controls.xrc custclas.xpm custclas.xrc derivdlg.xpm derivdlg.xrc fileopen.gif filesave.gif frame.xrc fuzzy.gif menu.xrc platform.xpm platform.xrc quotes.gif resource.xrc toolbar.xrc uncenter.xpm objref.xrc objrefdlg.xpm uncenter.xrc update.gif variable.xpm variable.xrc throbber.gif stop.xpm) do if not exist $(OBJS)\rc\%f copy .\rc\%f $(OBJS)\rc + for %f in (artprov.xpm artprov.xrc basicdlg.xpm basicdlg.xrc controls.xpm controls.xrc custclas.xpm custclas.xrc derivdlg.xpm derivdlg.xrc fileopen.gif filesave.gif frame.xrc fuzzy.gif menu.xrc platform.xpm platform.xrc quotes.gif resource.xrc toolbar.xrc uncenter.xpm objref.xrc objrefdlg.xpm uncenter.xrc update.gif variable.xpm variable.xrc throbber.gif stop.xpm wxbanner.gif) do if not exist $(OBJS)\rc\%f copy .\rc\%f $(OBJS)\rc $(OBJS)\xrcdemo_sample.res: .\..\..\samples\sample.rc rc /fo$@ /d WIN32 $(____DEBUGRUNTIME_3_p_1) $(__NO_VC_CRTDBG_p_1) /d __WXMSW__ $(__WXUNIV_DEFINE_p_1) $(__DEBUG_DEFINE_p_1) $(__NDEBUG_DEFINE_p_1) $(__EXCEPTIONS_DEFINE_p_1) $(__RTTI_DEFINE_p_1) $(__THREAD_DEFINE_p_1) $(__UNICODE_DEFINE_p_1) $(__MSLU_DEFINE_p_1) /i $(SETUPHDIR) /i .\..\..\include $(____CAIRO_INCLUDEDIR_FILENAMES_1_p) /i . $(__DLLFLAG_p_1) /d _WINDOWS /i .\..\..\samples /d NOPCH .\..\..\samples\sample.rc diff --git a/samples/xrc/makefile.wat b/samples/xrc/makefile.wat index 6baceeba05..9bcee4fd9f 100644 --- a/samples/xrc/makefile.wat +++ b/samples/xrc/makefile.wat @@ -286,7 +286,7 @@ $(OBJS)\xrcdemo.exe : $(XRCDEMO_OBJECTS) $(OBJS)\xrcdemo_sample.res data : .SYMBOLIC if not exist $(OBJS)\rc mkdir $(OBJS)\rc - for %f in (artprov.xpm artprov.xrc basicdlg.xpm basicdlg.xrc controls.xpm controls.xrc custclas.xpm custclas.xrc derivdlg.xpm derivdlg.xrc fileopen.gif filesave.gif frame.xrc fuzzy.gif menu.xrc platform.xpm platform.xrc quotes.gif resource.xrc toolbar.xrc uncenter.xpm objref.xrc objrefdlg.xpm uncenter.xrc update.gif variable.xpm variable.xrc throbber.gif stop.xpm) do if not exist $(OBJS)\rc\%f copy .\rc\%f $(OBJS)\rc + for %f in (artprov.xpm artprov.xrc basicdlg.xpm basicdlg.xrc controls.xpm controls.xrc custclas.xpm custclas.xrc derivdlg.xpm derivdlg.xrc fileopen.gif filesave.gif frame.xrc fuzzy.gif menu.xrc platform.xpm platform.xrc quotes.gif resource.xrc toolbar.xrc uncenter.xpm objref.xrc objrefdlg.xpm uncenter.xrc update.gif variable.xpm variable.xrc throbber.gif stop.xpm wxbanner.gif) do if not exist $(OBJS)\rc\%f copy .\rc\%f $(OBJS)\rc $(OBJS)\xrcdemo_sample.res : .AUTODEPEND .\..\..\samples\sample.rc wrc -q -ad -bt=nt -r -fo=$^@ -d__WXMSW__ $(__WXUNIV_DEFINE_p) $(__DEBUG_DEFINE_p) $(__NDEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) $(__THREAD_DEFINE_p) $(__UNICODE_DEFINE_p) -i=$(SETUPHDIR) -i=.\..\..\include $(____CAIRO_INCLUDEDIR_FILENAMES) -i=. $(__DLLFLAG_p) -i=.\..\..\samples -dNOPCH $< diff --git a/samples/xrc/xrcdemo.bkl b/samples/xrc/xrcdemo.bkl index 0d949591dc..747f8dba7a 100644 --- a/samples/xrc/xrcdemo.bkl +++ b/samples/xrc/xrcdemo.bkl @@ -38,6 +38,7 @@ objref.xrc objrefdlg.xpm uncenter.xrc update.gif variable.xpm variable.xrc throbber.gif stop.xpm + wxbanner.gif diff --git a/setup.h.in b/setup.h.in index 39a678f315..3db9177dbe 100644 --- a/setup.h.in +++ b/setup.h.in @@ -365,6 +365,7 @@ #define wxUSE_TIPWINDOW 0 #define wxUSE_ANIMATIONCTRL 0 +#define wxUSE_BANNERWINDOW 0 #define wxUSE_BUTTON 0 #define wxUSE_BMPBUTTON 0 #define wxUSE_CALENDARCTRL 0 diff --git a/src/generic/bannerwindow.cpp b/src/generic/bannerwindow.cpp new file mode 100644 index 0000000000..8aa9335677 --- /dev/null +++ b/src/generic/bannerwindow.cpp @@ -0,0 +1,262 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/bannerwindow.h +// Purpose: wxBannerWindow class implementation +// Author: Vadim Zeitlin +// Created: 2011-08-16 +// RCS-ID: $Id$ +// Copyright: (c) 2011 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_BANNERWINDOW + +#include "wx/bannerwindow.h" + +#ifndef WX_PRECOMP + #include "wx/bitmap.h" + #include "wx/colour.h" +#endif + +#include "wx/dcbuffer.h" + +namespace +{ + +// Some constants for banner layout, currently they're hard coded but we could +// easily make them configurable if needed later. +const int MARGIN_X = 5; +const int MARGIN_Y = 5; + +} // anonymous namespace + +extern WXDLLEXPORT_DATA(const char) wxBannerWindowNameStr[] = "bannerwindow"; + +BEGIN_EVENT_TABLE(wxBannerWindow, wxWindow) + EVT_SIZE(wxBannerWindow::OnSize) + EVT_PAINT(wxBannerWindow::OnPaint) +END_EVENT_TABLE() + +void wxBannerWindow::Init() +{ + m_direction = wxLEFT; + + m_colStart = *wxWHITE; + m_colEnd = *wxBLUE; +} + +bool +wxBannerWindow::Create(wxWindow* parent, + wxWindowID winid, + wxDirection dir, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) +{ + if ( !wxWindow::Create(parent, winid, pos, size, style, name) ) + return false; + + wxASSERT_MSG + ( + dir == wxLEFT || dir == wxRIGHT || dir == wxTOP || dir == wxBOTTOM, + wxS("Invalid banner direction") + ); + + m_direction = dir; + + SetBackgroundStyle(wxBG_STYLE_PAINT); + + return true; +} + +void wxBannerWindow::SetBitmap(const wxBitmap& bmp) +{ + m_bitmap = bmp; + + InvalidateBestSize(); + + Refresh(); +} + +void wxBannerWindow::SetText(const wxString& title, const wxString& message) +{ + m_title = title; + m_message = message; + + InvalidateBestSize(); + + Refresh(); +} + +void wxBannerWindow::SetGradient(const wxColour& start, const wxColour& end) +{ + m_colStart = start; + m_colEnd = end; + + Refresh(); +} + +wxFont wxBannerWindow::GetTitleFont() const +{ + wxFont font = GetFont(); + font.MakeBold().MakeLarger(); + return font; +} + +wxSize wxBannerWindow::DoGetBestClientSize() const +{ + if ( m_bitmap.IsOk() ) + { + return m_bitmap.GetSize(); + } + else + { + wxClientDC dc(const_cast(this)); + const wxSize sizeText = dc.GetMultiLineTextExtent(m_message); + + dc.SetFont(GetTitleFont()); + + const wxSize sizeTitle = dc.GetTextExtent(m_title); + + wxSize sizeWin(wxMax(sizeTitle.x, sizeText.x), sizeTitle.y + sizeText.y); + + // If we draw the text vertically width and height are swapped. + if ( m_direction == wxLEFT || m_direction == wxRIGHT ) + wxSwap(sizeWin.x, sizeWin.y); + + sizeWin += 2*wxSize(MARGIN_X, MARGIN_Y); + + return sizeWin; + } +} + +void wxBannerWindow::OnSize(wxSizeEvent& event) +{ + Refresh(); + + event.Skip(); +} + +void wxBannerWindow::OnPaint(wxPaintEvent& WXUNUSED(event)) +{ + if ( m_bitmap.IsOk() && m_title.empty() && m_message.empty() ) + { + // No need for buffering in this case. + wxPaintDC dc(this); + + DrawBitmapBackground(dc); + } + else // We need to compose our contents ourselves. + { + wxAutoBufferedPaintDC dc(this); + + // Deal with the background first. + if ( m_bitmap.IsOk() ) + { + DrawBitmapBackground(dc); + } + else // Draw gradient background. + { + wxDirection gradientDir; + if ( m_direction == wxLEFT ) + { + gradientDir = wxTOP; + } + else if ( m_direction == wxRIGHT ) + { + gradientDir = wxBOTTOM; + } + else // For both wxTOP and wxBOTTOM. + { + gradientDir = wxRIGHT; + } + + dc.GradientFillLinear(GetClientRect(), m_colStart, m_colEnd, + gradientDir); + } + + // Now draw the text on top of it. + dc.SetFont(GetTitleFont()); + + wxPoint pos(MARGIN_X, MARGIN_Y); + DrawBannerTextLine(dc, m_title, pos); + pos.y += dc.GetTextExtent(m_title).y; + + dc.SetFont(GetFont()); + + wxArrayString lines = wxSplit(m_message, '\n', '\0'); + const unsigned numLines = lines.size(); + for ( unsigned n = 0; n < numLines; n++ ) + { + const wxString& line = lines[n]; + + DrawBannerTextLine(dc, line, pos); + pos.y += dc.GetTextExtent(line).y; + } + } +} + +void wxBannerWindow::DrawBitmapBackground(wxDC& dc) +{ + switch ( m_direction ) + { + case wxTOP: + case wxBOTTOM: + case wxRIGHT: + // Draw the bitmap normally, its rightmost or bottom part could be + // truncated, as it's meant to be. + dc.DrawBitmap(m_bitmap, 0, 0); + break; + + case wxLEFT: + // The top most part of the bitmap may be truncated but its bottom + // must be always visible so intentionally draw it possibly partly + // outside of the window. + dc.DrawBitmap(m_bitmap, + 0, GetClientSize().y - m_bitmap.GetHeight()); + break; + + // This case is there only to prevent g++ warnings about not handling + // some enum elements in the switch, it can't really happen. + case wxALL: + wxFAIL_MSG( wxS("Unreachable") ); + } +} + +void +wxBannerWindow::DrawBannerTextLine(wxDC& dc, + const wxString& str, + const wxPoint& pos) +{ + switch ( m_direction ) + { + case wxTOP: + case wxBOTTOM: + // The simple case: we just draw the text normally. + dc.DrawText(str, pos); + break; + + case wxLEFT: + // We draw the text vertically and start from the lower left + // corner and not the upper left one as usual. + dc.DrawRotatedText(str, pos.y, GetClientSize().y - pos.x, 90); + break; + + case wxRIGHT: + // We also draw the text vertically but now we start from the upper + // right corner and draw it from top to bottom. + dc.DrawRotatedText(str, GetClientSize().x - pos.y, pos.x, -90); + break; + + case wxALL: + wxFAIL_MSG( wxS("Unreachable") ); + } +} + +#endif // wxUSE_BANNERWINDOW -- 2.45.2