From 4758baf5eb87bd1f1251a21e3fa8e5d658b9a3b6 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 25 Mar 2012 17:55:59 +0000 Subject: [PATCH] Refactor wxAUI: extract wxAuiTabArt in a separate file. No real changes, just extract wxAuiTabArt into its own file. Also rename wxAuiDefaultTabArt to wxAuiSimpleTabArt in preparation for having other tab art classes as the default one. See #14098. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@71001 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- Makefile.in | 21 +- build/bakefiles/files.bkl | 2 + build/msw/makefile.bcc | 20 +- build/msw/makefile.gcc | 20 +- build/msw/makefile.vc | 20 +- build/msw/makefile.wat | 20 +- build/msw/wx_aui.dsp | 8 + build/msw/wx_core.dsp | 4 + build/msw/wx_vc7_aui.vcproj | 6 + build/msw/wx_vc7_core.vcproj | 3 + build/msw/wx_vc8_aui.vcproj | 8 + build/msw/wx_vc8_core.vcproj | 4 + build/msw/wx_vc9_aui.vcproj | 8 + build/msw/wx_vc9_core.vcproj | 4 + include/wx/aui/auibook.h | 253 +-------- include/wx/aui/tabart.h | 282 ++++++++++ src/aui/auibook.cpp | 1236 +---------------------------------------- src/aui/tabart.cpp | 1260 ++++++++++++++++++++++++++++++++++++++++++ 18 files changed, 1684 insertions(+), 1495 deletions(-) create mode 100644 include/wx/aui/tabart.h create mode 100644 src/aui/tabart.cpp diff --git a/Makefile.in b/Makefile.in index 5761b97..c10f4f2 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1840,7 +1840,8 @@ AUIDLL_OBJECTS = \ auidll_floatpane.o \ auidll_auibook.o \ auidll_auibar.o \ - auidll_tabmdi.o + auidll_tabmdi.o \ + auidll_tabart.o AUIDLL_ODEP = $(_____pch_wxprec_auidll_wx_wxprec_h_gch___depname) AUILIB_CXXFLAGS = $(__auilib_PCH_INC) -D__WX$(TOOLKIT)__ $(__WXUNIV_DEFINE_p) \ $(__DEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) \ @@ -1853,7 +1854,8 @@ AUILIB_OBJECTS = \ auilib_floatpane.o \ auilib_auibook.o \ auilib_auibar.o \ - auilib_tabmdi.o + auilib_tabmdi.o \ + auilib_tabart.o AUILIB_ODEP = $(_____pch_wxprec_auilib_wx_wxprec_h_gch___depname) RIBBONDLL_CXXFLAGS = $(__ribbondll_PCH_INC) -D__WX$(TOOLKIT)__ \ $(__WXUNIV_DEFINE_p) $(__DEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) \ @@ -4198,6 +4200,7 @@ COND_USE_GUI_1_ALL_GUI_HEADERS = \ wx/aui/auibar.h \ wx/aui/tabmdi.h \ wx/aui/aui.h \ + wx/aui/tabart.h \ wx/propgrid/advprops.h \ wx/propgrid/editors.h \ wx/propgrid/manager.h \ @@ -4514,6 +4517,7 @@ COND_USE_GUI_1___MONOLIB_GUI_SRC_OBJECTS = \ monodll_auibook.o \ monodll_auibar.o \ monodll_tabmdi.o \ + monodll_tabart.o \ monodll_advprops.o \ monodll_editors.o \ monodll_manager.o \ @@ -6408,6 +6412,7 @@ COND_USE_GUI_1___MONOLIB_GUI_SRC_OBJECTS_1 = \ monolib_auibook.o \ monolib_auibar.o \ monolib_tabmdi.o \ + monolib_tabart.o \ monolib_advprops.o \ monolib_editors.o \ monolib_manager.o \ @@ -17403,6 +17408,9 @@ monodll_auibar.o: $(srcdir)/src/aui/auibar.cpp $(MONODLL_ODEP) monodll_tabmdi.o: $(srcdir)/src/aui/tabmdi.cpp $(MONODLL_ODEP) $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/aui/tabmdi.cpp +monodll_tabart.o: $(srcdir)/src/aui/tabart.cpp $(MONODLL_ODEP) + $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/aui/tabart.cpp + monodll_advprops.o: $(srcdir)/src/propgrid/advprops.cpp $(MONODLL_ODEP) $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/propgrid/advprops.cpp @@ -22701,6 +22709,9 @@ monolib_auibar.o: $(srcdir)/src/aui/auibar.cpp $(MONOLIB_ODEP) monolib_tabmdi.o: $(srcdir)/src/aui/tabmdi.cpp $(MONOLIB_ODEP) $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/aui/tabmdi.cpp +monolib_tabart.o: $(srcdir)/src/aui/tabart.cpp $(MONOLIB_ODEP) + $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/aui/tabart.cpp + monolib_advprops.o: $(srcdir)/src/propgrid/advprops.cpp $(MONOLIB_ODEP) $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/propgrid/advprops.cpp @@ -36462,6 +36473,9 @@ auidll_auibar.o: $(srcdir)/src/aui/auibar.cpp $(AUIDLL_ODEP) auidll_tabmdi.o: $(srcdir)/src/aui/tabmdi.cpp $(AUIDLL_ODEP) $(CXXC) -c -o $@ $(AUIDLL_CXXFLAGS) $(srcdir)/src/aui/tabmdi.cpp +auidll_tabart.o: $(srcdir)/src/aui/tabart.cpp $(AUIDLL_ODEP) + $(CXXC) -c -o $@ $(AUIDLL_CXXFLAGS) $(srcdir)/src/aui/tabart.cpp + auilib_framemanager.o: $(srcdir)/src/aui/framemanager.cpp $(AUILIB_ODEP) $(CXXC) -c -o $@ $(AUILIB_CXXFLAGS) $(srcdir)/src/aui/framemanager.cpp @@ -36480,6 +36494,9 @@ auilib_auibar.o: $(srcdir)/src/aui/auibar.cpp $(AUILIB_ODEP) auilib_tabmdi.o: $(srcdir)/src/aui/tabmdi.cpp $(AUILIB_ODEP) $(CXXC) -c -o $@ $(AUILIB_CXXFLAGS) $(srcdir)/src/aui/tabmdi.cpp +auilib_tabart.o: $(srcdir)/src/aui/tabart.cpp $(AUILIB_ODEP) + $(CXXC) -c -o $@ $(AUILIB_CXXFLAGS) $(srcdir)/src/aui/tabart.cpp + ribbondll_version_rc.o: $(srcdir)/src/msw/version.rc $(RIBBONDLL_ODEP) $(WINDRES) -i$< -o$@ --define __WX$(TOOLKIT)__ $(__WXUNIV_DEFINE_p_67) $(__DEBUG_DEFINE_p_66) $(__EXCEPTIONS_DEFINE_p_65) $(__RTTI_DEFINE_p_65) $(__THREAD_DEFINE_p_65) --define WXBUILDING --define WXDLLNAME=$(WXDLLNAMEPREFIXGUI)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_ribbon$(WXCOMPILER)$(VENDORTAG)$(WXDLLVERSIONTAG) $(__RCDEFDIR_p) --include-dir $(top_srcdir)/include $(__INC_TIFF_BUILD_p_66) $(__INC_TIFF_p_66) $(__INC_JPEG_p_66) $(__INC_PNG_p_65) $(__INC_ZLIB_p_67) $(__INC_REGEX_p_65) $(__INC_EXPAT_p_65) --define WXUSINGDLL --define WXMAKINGDLL_RIBBON diff --git a/build/bakefiles/files.bkl b/build/bakefiles/files.bkl index 13ce7bb..00ec561 100644 --- a/build/bakefiles/files.bkl +++ b/build/bakefiles/files.bkl @@ -3555,6 +3555,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! src/aui/auibook.cpp src/aui/auibar.cpp src/aui/tabmdi.cpp + src/aui/tabart.cpp wx/aui/framemanager.h @@ -3564,6 +3565,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! wx/aui/auibar.h wx/aui/tabmdi.h wx/aui/aui.h + wx/aui/tabart.h diff --git a/build/msw/makefile.bcc b/build/msw/makefile.bcc index 5df0cea..69d9335 100644 --- a/build/msw/makefile.bcc +++ b/build/msw/makefile.bcc @@ -1325,7 +1325,8 @@ AUIDLL_OBJECTS = \ $(OBJS)\auidll_floatpane.obj \ $(OBJS)\auidll_auibook.obj \ $(OBJS)\auidll_auibar.obj \ - $(OBJS)\auidll_tabmdi.obj + $(OBJS)\auidll_tabmdi.obj \ + $(OBJS)\auidll_tabart.obj AUILIB_CXXFLAGS = $(__RUNTIME_LIBS) -I$(BCCDIR)\include $(__DEBUGINFO) \ $(__OPTIMIZEFLAG) $(__THREADSFLAG) -D__WXMSW__ $(__WXUNIV_DEFINE_p) \ $(__DEBUG_DEFINE_p) $(__NDEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) \ @@ -1342,7 +1343,8 @@ AUILIB_OBJECTS = \ $(OBJS)\auilib_floatpane.obj \ $(OBJS)\auilib_auibook.obj \ $(OBJS)\auilib_auibar.obj \ - $(OBJS)\auilib_tabmdi.obj + $(OBJS)\auilib_tabmdi.obj \ + $(OBJS)\auilib_tabart.obj RIBBONDLL_CXXFLAGS = $(__RUNTIME_LIBS) -I$(BCCDIR)\include $(__DEBUGINFO) \ $(__OPTIMIZEFLAG) $(__THREADSFLAG) -D__WXMSW__ $(__WXUNIV_DEFINE_p) \ $(__DEBUG_DEFINE_p) $(__NDEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) \ @@ -1688,6 +1690,7 @@ ____MONOLIB_GUI_SRC_FILENAMES_OBJECTS = \ $(OBJS)\monodll_auibook.obj \ $(OBJS)\monodll_auibar.obj \ $(OBJS)\monodll_tabmdi.obj \ + $(OBJS)\monodll_tabart.obj \ $(OBJS)\monodll_advprops.obj \ $(OBJS)\monodll_editors.obj \ $(OBJS)\monodll_manager.obj \ @@ -2471,6 +2474,7 @@ ____MONOLIB_GUI_SRC_FILENAMES_1_OBJECTS = \ $(OBJS)\monolib_auibook.obj \ $(OBJS)\monolib_auibar.obj \ $(OBJS)\monolib_tabmdi.obj \ + $(OBJS)\monolib_tabart.obj \ $(OBJS)\monolib_advprops.obj \ $(OBJS)\monolib_editors.obj \ $(OBJS)\monolib_manager.obj \ @@ -7072,6 +7076,9 @@ $(OBJS)\monodll_auibar.obj: ..\..\src\aui\auibar.cpp $(OBJS)\monodll_tabmdi.obj: ..\..\src\aui\tabmdi.cpp $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\aui\tabmdi.cpp +$(OBJS)\monodll_tabart.obj: ..\..\src\aui\tabart.cpp + $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\aui\tabart.cpp + $(OBJS)\monodll_advprops.obj: ..\..\src\propgrid\advprops.cpp $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\propgrid\advprops.cpp @@ -9477,6 +9484,9 @@ $(OBJS)\monolib_auibar.obj: ..\..\src\aui\auibar.cpp $(OBJS)\monolib_tabmdi.obj: ..\..\src\aui\tabmdi.cpp $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\aui\tabmdi.cpp +$(OBJS)\monolib_tabart.obj: ..\..\src\aui\tabart.cpp + $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\aui\tabart.cpp + $(OBJS)\monolib_advprops.obj: ..\..\src\propgrid\advprops.cpp $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\propgrid\advprops.cpp @@ -15430,6 +15440,9 @@ $(OBJS)\auidll_auibar.obj: ..\..\src\aui\auibar.cpp $(OBJS)\auidll_tabmdi.obj: ..\..\src\aui\tabmdi.cpp $(CXX) -q -c -P -o$@ $(AUIDLL_CXXFLAGS) ..\..\src\aui\tabmdi.cpp +$(OBJS)\auidll_tabart.obj: ..\..\src\aui\tabart.cpp + $(CXX) -q -c -P -o$@ $(AUIDLL_CXXFLAGS) ..\..\src\aui\tabart.cpp + $(OBJS)\auilib_dummy.obj: ..\..\src\common\dummy.cpp $(CXX) -q -c -P -o$@ $(AUILIB_CXXFLAGS) -H ..\..\src\common\dummy.cpp @@ -15451,6 +15464,9 @@ $(OBJS)\auilib_auibar.obj: ..\..\src\aui\auibar.cpp $(OBJS)\auilib_tabmdi.obj: ..\..\src\aui\tabmdi.cpp $(CXX) -q -c -P -o$@ $(AUILIB_CXXFLAGS) ..\..\src\aui\tabmdi.cpp +$(OBJS)\auilib_tabart.obj: ..\..\src\aui\tabart.cpp + $(CXX) -q -c -P -o$@ $(AUILIB_CXXFLAGS) ..\..\src\aui\tabart.cpp + $(OBJS)\ribbondll_dummy.obj: ..\..\src\common\dummy.cpp $(CXX) -q -c -P -o$@ $(RIBBONDLL_CXXFLAGS) -H ..\..\src\common\dummy.cpp diff --git a/build/msw/makefile.gcc b/build/msw/makefile.gcc index 0ead02d..22519d2 100644 --- a/build/msw/makefile.gcc +++ b/build/msw/makefile.gcc @@ -1324,7 +1324,8 @@ AUIDLL_OBJECTS = \ $(OBJS)\auidll_floatpane.o \ $(OBJS)\auidll_auibook.o \ $(OBJS)\auidll_auibar.o \ - $(OBJS)\auidll_tabmdi.o + $(OBJS)\auidll_tabmdi.o \ + $(OBJS)\auidll_tabart.o AUILIB_CXXFLAGS = $(__DEBUGINFO) $(__OPTIMIZEFLAG) $(__THREADSFLAG) $(GCCFLAGS) \ -DHAVE_W32API_H -D__WXMSW__ $(__WXUNIV_DEFINE_p) $(__DEBUG_DEFINE_p) \ $(__NDEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) \ @@ -1340,7 +1341,8 @@ AUILIB_OBJECTS = \ $(OBJS)\auilib_floatpane.o \ $(OBJS)\auilib_auibook.o \ $(OBJS)\auilib_auibar.o \ - $(OBJS)\auilib_tabmdi.o + $(OBJS)\auilib_tabmdi.o \ + $(OBJS)\auilib_tabart.o RIBBONDLL_CXXFLAGS = $(__DEBUGINFO) $(__OPTIMIZEFLAG) $(__THREADSFLAG) \ $(GCCFLAGS) -DHAVE_W32API_H -D__WXMSW__ $(__WXUNIV_DEFINE_p) \ $(__DEBUG_DEFINE_p) $(__NDEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) \ @@ -1699,6 +1701,7 @@ ____MONOLIB_GUI_SRC_FILENAMES_OBJECTS = \ $(OBJS)\monodll_auibook.o \ $(OBJS)\monodll_auibar.o \ $(OBJS)\monodll_tabmdi.o \ + $(OBJS)\monodll_tabart.o \ $(OBJS)\monodll_advprops.o \ $(OBJS)\monodll_editors.o \ $(OBJS)\monodll_manager.o \ @@ -2488,6 +2491,7 @@ ____MONOLIB_GUI_SRC_FILENAMES_1_OBJECTS = \ $(OBJS)\monolib_auibook.o \ $(OBJS)\monolib_auibar.o \ $(OBJS)\monolib_tabmdi.o \ + $(OBJS)\monolib_tabart.o \ $(OBJS)\monolib_advprops.o \ $(OBJS)\monolib_editors.o \ $(OBJS)\monolib_manager.o \ @@ -7240,6 +7244,9 @@ $(OBJS)\monodll_auibar.o: ../../src/aui/auibar.cpp $(OBJS)\monodll_tabmdi.o: ../../src/aui/tabmdi.cpp $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $< +$(OBJS)\monodll_tabart.o: ../../src/aui/tabart.cpp + $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $< + $(OBJS)\monodll_advprops.o: ../../src/propgrid/advprops.cpp $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $< @@ -9645,6 +9652,9 @@ $(OBJS)\monolib_auibar.o: ../../src/aui/auibar.cpp $(OBJS)\monolib_tabmdi.o: ../../src/aui/tabmdi.cpp $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $< +$(OBJS)\monolib_tabart.o: ../../src/aui/tabart.cpp + $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $< + $(OBJS)\monolib_advprops.o: ../../src/propgrid/advprops.cpp $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $< @@ -15598,6 +15608,9 @@ $(OBJS)\auidll_auibar.o: ../../src/aui/auibar.cpp $(OBJS)\auidll_tabmdi.o: ../../src/aui/tabmdi.cpp $(CXX) -c -o $@ $(AUIDLL_CXXFLAGS) $(CPPDEPS) $< +$(OBJS)\auidll_tabart.o: ../../src/aui/tabart.cpp + $(CXX) -c -o $@ $(AUIDLL_CXXFLAGS) $(CPPDEPS) $< + $(OBJS)\auilib_dummy.o: ../../src/common/dummy.cpp $(CXX) -c -o $@ $(AUILIB_CXXFLAGS) $(CPPDEPS) $< @@ -15619,6 +15632,9 @@ $(OBJS)\auilib_auibar.o: ../../src/aui/auibar.cpp $(OBJS)\auilib_tabmdi.o: ../../src/aui/tabmdi.cpp $(CXX) -c -o $@ $(AUILIB_CXXFLAGS) $(CPPDEPS) $< +$(OBJS)\auilib_tabart.o: ../../src/aui/tabart.cpp + $(CXX) -c -o $@ $(AUILIB_CXXFLAGS) $(CPPDEPS) $< + $(OBJS)\ribbondll_dummy.o: ../../src/common/dummy.cpp $(CXX) -c -o $@ $(RIBBONDLL_CXXFLAGS) $(CPPDEPS) $< diff --git a/build/msw/makefile.vc b/build/msw/makefile.vc index 03625d4..9dcb750 100644 --- a/build/msw/makefile.vc +++ b/build/msw/makefile.vc @@ -1463,7 +1463,8 @@ AUIDLL_OBJECTS = \ $(OBJS)\auidll_floatpane.obj \ $(OBJS)\auidll_auibook.obj \ $(OBJS)\auidll_auibar.obj \ - $(OBJS)\auidll_tabmdi.obj + $(OBJS)\auidll_tabmdi.obj \ + $(OBJS)\auidll_tabart.obj AUIDLL_RESOURCES = \ $(OBJS)\auidll_version.res AUILIB_CXXFLAGS = /M$(__RUNTIME_LIBS_472)$(__DEBUGRUNTIME) /DWIN32 \ @@ -1486,7 +1487,8 @@ AUILIB_OBJECTS = \ $(OBJS)\auilib_floatpane.obj \ $(OBJS)\auilib_auibook.obj \ $(OBJS)\auilib_auibar.obj \ - $(OBJS)\auilib_tabmdi.obj + $(OBJS)\auilib_tabmdi.obj \ + $(OBJS)\auilib_tabart.obj RIBBONDLL_CXXFLAGS = /M$(__RUNTIME_LIBS_488)$(__DEBUGRUNTIME) /DWIN32 \ $(__DEBUGINFO) \ /Fd$(LIBDIRNAME)\wx$(PORTNAME)$(WXUNIVNAME)$(WX_VERSION_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_ribbon_vc$(VENDORTAG).pdb \ @@ -1969,6 +1971,7 @@ ____MONOLIB_GUI_SRC_FILENAMES_OBJECTS = \ $(OBJS)\monodll_auibook.obj \ $(OBJS)\monodll_auibar.obj \ $(OBJS)\monodll_tabmdi.obj \ + $(OBJS)\monodll_tabart.obj \ $(OBJS)\monodll_advprops.obj \ $(OBJS)\monodll_editors.obj \ $(OBJS)\monodll_manager.obj \ @@ -2758,6 +2761,7 @@ ____MONOLIB_GUI_SRC_FILENAMES_1_OBJECTS = \ $(OBJS)\monolib_auibook.obj \ $(OBJS)\monolib_auibar.obj \ $(OBJS)\monolib_tabmdi.obj \ + $(OBJS)\monolib_tabart.obj \ $(OBJS)\monolib_advprops.obj \ $(OBJS)\monolib_editors.obj \ $(OBJS)\monolib_manager.obj \ @@ -7745,6 +7749,9 @@ $(OBJS)\monodll_auibar.obj: ..\..\src\aui\auibar.cpp $(OBJS)\monodll_tabmdi.obj: ..\..\src\aui\tabmdi.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\aui\tabmdi.cpp +$(OBJS)\monodll_tabart.obj: ..\..\src\aui\tabart.cpp + $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\aui\tabart.cpp + $(OBJS)\monodll_advprops.obj: ..\..\src\propgrid\advprops.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\propgrid\advprops.cpp @@ -10150,6 +10157,9 @@ $(OBJS)\monolib_auibar.obj: ..\..\src\aui\auibar.cpp $(OBJS)\monolib_tabmdi.obj: ..\..\src\aui\tabmdi.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\aui\tabmdi.cpp +$(OBJS)\monolib_tabart.obj: ..\..\src\aui\tabart.cpp + $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\aui\tabart.cpp + $(OBJS)\monolib_advprops.obj: ..\..\src\propgrid\advprops.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\propgrid\advprops.cpp @@ -16103,6 +16113,9 @@ $(OBJS)\auidll_auibar.obj: ..\..\src\aui\auibar.cpp $(OBJS)\auidll_tabmdi.obj: ..\..\src\aui\tabmdi.cpp $(CXX) /c /nologo /TP /Fo$@ $(AUIDLL_CXXFLAGS) ..\..\src\aui\tabmdi.cpp +$(OBJS)\auidll_tabart.obj: ..\..\src\aui\tabart.cpp + $(CXX) /c /nologo /TP /Fo$@ $(AUIDLL_CXXFLAGS) ..\..\src\aui\tabart.cpp + $(OBJS)\auilib_dummy.obj: ..\..\src\common\dummy.cpp $(CXX) /c /nologo /TP /Fo$@ $(AUILIB_CXXFLAGS) /Ycwx/wxprec.h ..\..\src\common\dummy.cpp @@ -16124,6 +16137,9 @@ $(OBJS)\auilib_auibar.obj: ..\..\src\aui\auibar.cpp $(OBJS)\auilib_tabmdi.obj: ..\..\src\aui\tabmdi.cpp $(CXX) /c /nologo /TP /Fo$@ $(AUILIB_CXXFLAGS) ..\..\src\aui\tabmdi.cpp +$(OBJS)\auilib_tabart.obj: ..\..\src\aui\tabart.cpp + $(CXX) /c /nologo /TP /Fo$@ $(AUILIB_CXXFLAGS) ..\..\src\aui\tabart.cpp + $(OBJS)\ribbondll_dummy.obj: ..\..\src\common\dummy.cpp $(CXX) /c /nologo /TP /Fo$@ $(RIBBONDLL_CXXFLAGS) /Ycwx/wxprec.h ..\..\src\common\dummy.cpp diff --git a/build/msw/makefile.wat b/build/msw/makefile.wat index 283c85f..780d09c 100644 --- a/build/msw/makefile.wat +++ b/build/msw/makefile.wat @@ -211,6 +211,7 @@ ____MONOLIB_GUI_SRC_FILENAMES_OBJECTS = & $(OBJS)\monodll_auibook.obj & $(OBJS)\monodll_auibar.obj & $(OBJS)\monodll_tabmdi.obj & + $(OBJS)\monodll_tabart.obj & $(OBJS)\monodll_advprops.obj & $(OBJS)\monodll_editors.obj & $(OBJS)\monodll_manager.obj & @@ -1005,6 +1006,7 @@ ____MONOLIB_GUI_SRC_FILENAMES_1_OBJECTS = & $(OBJS)\monolib_auibook.obj & $(OBJS)\monolib_auibar.obj & $(OBJS)\monolib_tabmdi.obj & + $(OBJS)\monolib_tabart.obj & $(OBJS)\monolib_advprops.obj & $(OBJS)\monolib_editors.obj & $(OBJS)\monolib_manager.obj & @@ -4844,7 +4846,8 @@ AUIDLL_OBJECTS = & $(OBJS)\auidll_floatpane.obj & $(OBJS)\auidll_auibook.obj & $(OBJS)\auidll_auibar.obj & - $(OBJS)\auidll_tabmdi.obj + $(OBJS)\auidll_tabmdi.obj & + $(OBJS)\auidll_tabart.obj AUILIB_CXXFLAGS = $(__DEBUGINFO) $(__OPTIMIZEFLAG) $(__THREADSFLAG) & $(__RUNTIME_LIBS) -d__WXMSW__ $(__WXUNIV_DEFINE_p) $(__DEBUG_DEFINE_p) & $(__NDEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) & @@ -4861,7 +4864,8 @@ AUILIB_OBJECTS = & $(OBJS)\auilib_floatpane.obj & $(OBJS)\auilib_auibook.obj & $(OBJS)\auilib_auibar.obj & - $(OBJS)\auilib_tabmdi.obj + $(OBJS)\auilib_tabmdi.obj & + $(OBJS)\auilib_tabart.obj RIBBONDLL_CXXFLAGS = -bd $(__DEBUGINFO) $(__OPTIMIZEFLAG) $(__THREADSFLAG) & $(__RUNTIME_LIBS) -d__WXMSW__ $(__WXUNIV_DEFINE_p) $(__DEBUG_DEFINE_p) & $(__NDEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) & @@ -7511,6 +7515,9 @@ $(OBJS)\monodll_auibar.obj : .AUTODEPEND ..\..\src\aui\auibar.cpp $(OBJS)\monodll_tabmdi.obj : .AUTODEPEND ..\..\src\aui\tabmdi.cpp $(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $< +$(OBJS)\monodll_tabart.obj : .AUTODEPEND ..\..\src\aui\tabart.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $< + $(OBJS)\monodll_advprops.obj : .AUTODEPEND ..\..\src\propgrid\advprops.cpp $(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $< @@ -9916,6 +9923,9 @@ $(OBJS)\monolib_auibar.obj : .AUTODEPEND ..\..\src\aui\auibar.cpp $(OBJS)\monolib_tabmdi.obj : .AUTODEPEND ..\..\src\aui\tabmdi.cpp $(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $< +$(OBJS)\monolib_tabart.obj : .AUTODEPEND ..\..\src\aui\tabart.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $< + $(OBJS)\monolib_advprops.obj : .AUTODEPEND ..\..\src\propgrid\advprops.cpp $(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $< @@ -15869,6 +15879,9 @@ $(OBJS)\auidll_auibar.obj : .AUTODEPEND ..\..\src\aui\auibar.cpp $(OBJS)\auidll_tabmdi.obj : .AUTODEPEND ..\..\src\aui\tabmdi.cpp $(CXX) -bt=nt -zq -fo=$^@ $(AUIDLL_CXXFLAGS) $< +$(OBJS)\auidll_tabart.obj : .AUTODEPEND ..\..\src\aui\tabart.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(AUIDLL_CXXFLAGS) $< + $(OBJS)\auilib_dummy.obj : .AUTODEPEND ..\..\src\common\dummy.cpp $(CXX) -bt=nt -zq -fo=$^@ $(AUILIB_CXXFLAGS) $< @@ -15890,6 +15903,9 @@ $(OBJS)\auilib_auibar.obj : .AUTODEPEND ..\..\src\aui\auibar.cpp $(OBJS)\auilib_tabmdi.obj : .AUTODEPEND ..\..\src\aui\tabmdi.cpp $(CXX) -bt=nt -zq -fo=$^@ $(AUILIB_CXXFLAGS) $< +$(OBJS)\auilib_tabart.obj : .AUTODEPEND ..\..\src\aui\tabart.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(AUILIB_CXXFLAGS) $< + $(OBJS)\ribbondll_dummy.obj : .AUTODEPEND ..\..\src\common\dummy.cpp $(CXX) -bt=nt -zq -fo=$^@ $(RIBBONDLL_CXXFLAGS) $< diff --git a/build/msw/wx_aui.dsp b/build/msw/wx_aui.dsp index 286cf66..dd2d7b5 100644 --- a/build/msw/wx_aui.dsp +++ b/build/msw/wx_aui.dsp @@ -554,6 +554,10 @@ SOURCE=..\..\include\wx\aui\framemanager.h # End Source File # Begin Source File +SOURCE=..\..\include\wx\aui\tabart.h +# End Source File +# Begin Source File + SOURCE=..\..\include\wx\aui\tabmdi.h # End Source File # End Group @@ -582,6 +586,10 @@ SOURCE=..\..\src\aui\framemanager.cpp # End Source File # Begin Source File +SOURCE=..\..\src\aui\tabart.cpp +# End Source File +# Begin Source File + SOURCE=..\..\src\aui\tabmdi.cpp # End Source File # End Group diff --git a/build/msw/wx_core.dsp b/build/msw/wx_core.dsp index b7734c7..14e9842 100644 --- a/build/msw/wx_core.dsp +++ b/build/msw/wx_core.dsp @@ -6892,6 +6892,10 @@ SOURCE=..\..\include\wx\stc\stc.h # End Source File # Begin Source File +SOURCE=..\..\include\wx\aui\tabart.h +# End Source File +# Begin Source File + SOURCE=..\..\include\wx\aui\tabmdi.h # End Source File # Begin Source File diff --git a/build/msw/wx_vc7_aui.vcproj b/build/msw/wx_vc7_aui.vcproj index fe10da9..2a8bcde 100644 --- a/build/msw/wx_vc7_aui.vcproj +++ b/build/msw/wx_vc7_aui.vcproj @@ -790,6 +790,9 @@ RelativePath="..\..\include\wx\aui\framemanager.h"> + + @@ -813,6 +816,9 @@ RelativePath="..\..\src\aui\framemanager.cpp"> + + diff --git a/build/msw/wx_vc7_core.vcproj b/build/msw/wx_vc7_core.vcproj index a888915..486e897 100644 --- a/build/msw/wx_vc7_core.vcproj +++ b/build/msw/wx_vc7_core.vcproj @@ -5745,6 +5745,9 @@ RelativePath="..\..\include\wx\stc\stc.h"> + + + + @@ -1105,6 +1109,10 @@ > + + diff --git a/build/msw/wx_vc8_core.vcproj b/build/msw/wx_vc8_core.vcproj index 85402b6..8fa0297 100644 --- a/build/msw/wx_vc8_core.vcproj +++ b/build/msw/wx_vc8_core.vcproj @@ -7680,6 +7680,10 @@ > + + diff --git a/build/msw/wx_vc9_aui.vcproj b/build/msw/wx_vc9_aui.vcproj index db13af0..ae4a2e5 100644 --- a/build/msw/wx_vc9_aui.vcproj +++ b/build/msw/wx_vc9_aui.vcproj @@ -1071,6 +1071,10 @@ > + + @@ -1101,6 +1105,10 @@ > + + diff --git a/build/msw/wx_vc9_core.vcproj b/build/msw/wx_vc9_core.vcproj index efca076..1091d8f 100644 --- a/build/msw/wx_vc9_core.vcproj +++ b/build/msw/wx_vc9_core.vcproj @@ -7676,6 +7676,10 @@ > + + diff --git a/include/wx/aui/auibook.h b/include/wx/aui/auibook.h index e8e4527..290ae5e 100644 --- a/include/wx/aui/auibook.h +++ b/include/wx/aui/auibook.h @@ -2,7 +2,7 @@ // Name: wx/aui/auibook.h // Purpose: wxaui: wx advanced user interface - notebook // Author: Benjamin I. Williams -// Modified by: +// Modified by: Jens Lody // Created: 2006-06-28 // Copyright: (C) Copyright 2006, Kirix Corporation, All Rights Reserved. // Licence: wxWindows Library Licence, Version 3.1 @@ -21,9 +21,8 @@ #if wxUSE_AUI +#include "wx/aui/tabart.h" #include "wx/aui/framemanager.h" -#include "wx/aui/dockart.h" -#include "wx/aui/floatpane.h" #include "wx/bookctrl.h" @@ -119,254 +118,6 @@ WX_DECLARE_USER_EXPORTED_OBJARRAY(wxAuiTabContainerButton, wxAuiTabContainerButt #endif -// tab art class - -class WXDLLIMPEXP_AUI wxAuiTabArt -{ -public: - - wxAuiTabArt() { } - virtual ~wxAuiTabArt() { } - - virtual wxAuiTabArt* Clone() = 0; - virtual void SetFlags(unsigned int flags) = 0; - - virtual void SetSizingInfo(const wxSize& tabCtrlSize, - size_t tabCount) = 0; - - virtual void SetNormalFont(const wxFont& font) = 0; - virtual void SetSelectedFont(const wxFont& font) = 0; - virtual void SetMeasuringFont(const wxFont& font) = 0; - virtual void SetColour(const wxColour& colour) = 0; - virtual void SetActiveColour(const wxColour& colour) = 0; - - virtual void DrawBackground( - wxDC& dc, - wxWindow* wnd, - const wxRect& rect) = 0; - - virtual void DrawTab(wxDC& dc, - wxWindow* wnd, - const wxAuiNotebookPage& pane, - const wxRect& inRect, - int closeButtonState, - wxRect* outTabRect, - wxRect* outButtonRect, - int* xExtent) = 0; - - virtual void DrawButton( - wxDC& dc, - wxWindow* wnd, - const wxRect& inRect, - int bitmapId, - int buttonState, - int orientation, - wxRect* outRect) = 0; - - virtual wxSize GetTabSize( - wxDC& dc, - wxWindow* wnd, - const wxString& caption, - const wxBitmap& bitmap, - bool active, - int closeButtonState, - int* xExtent) = 0; - - virtual int ShowDropDown( - wxWindow* wnd, - const wxAuiNotebookPageArray& items, - int activeIdx) = 0; - - virtual int GetIndentSize() = 0; - - virtual int GetBestTabCtrlSize( - wxWindow* wnd, - const wxAuiNotebookPageArray& pages, - const wxSize& requiredBmpSize) = 0; -}; - - -class WXDLLIMPEXP_AUI wxAuiDefaultTabArt : public wxAuiTabArt -{ - -public: - - wxAuiDefaultTabArt(); - virtual ~wxAuiDefaultTabArt(); - - wxAuiTabArt* Clone(); - void SetFlags(unsigned int flags); - void SetSizingInfo(const wxSize& tabCtrlSize, - size_t tabCount); - - void SetNormalFont(const wxFont& font); - void SetSelectedFont(const wxFont& font); - void SetMeasuringFont(const wxFont& font); - void SetColour(const wxColour& colour); - void SetActiveColour(const wxColour& colour); - - void DrawBackground( - wxDC& dc, - wxWindow* wnd, - const wxRect& rect); - - void DrawTab(wxDC& dc, - wxWindow* wnd, - const wxAuiNotebookPage& pane, - const wxRect& inRect, - int closeButtonState, - wxRect* outTabRect, - wxRect* outButtonRect, - int* xExtent); - - void DrawButton( - wxDC& dc, - wxWindow* wnd, - const wxRect& inRect, - int bitmapId, - int buttonState, - int orientation, - wxRect* outRect); - - int GetIndentSize(); - - wxSize GetTabSize( - wxDC& dc, - wxWindow* wnd, - const wxString& caption, - const wxBitmap& bitmap, - bool active, - int closeButtonState, - int* xExtent); - - int ShowDropDown( - wxWindow* wnd, - const wxAuiNotebookPageArray& items, - int activeIdx); - - int GetBestTabCtrlSize(wxWindow* wnd, - const wxAuiNotebookPageArray& pages, - const wxSize& requiredBmpSize); - -protected: - - wxFont m_normalFont; - wxFont m_selectedFont; - wxFont m_measuringFont; - wxColour m_baseColour; - wxPen m_baseColourPen; - wxPen m_borderPen; - wxBrush m_baseColourBrush; - wxColour m_activeColour; - wxBitmap m_activeCloseBmp; - wxBitmap m_disabledCloseBmp; - wxBitmap m_activeLeftBmp; - wxBitmap m_disabledLeftBmp; - wxBitmap m_activeRightBmp; - wxBitmap m_disabledRightBmp; - wxBitmap m_activeWindowListBmp; - wxBitmap m_disabledWindowListBmp; - - int m_fixedTabWidth; - int m_tabCtrlHeight; - unsigned int m_flags; -}; - - -class WXDLLIMPEXP_AUI wxAuiSimpleTabArt : public wxAuiTabArt -{ - -public: - - wxAuiSimpleTabArt(); - virtual ~wxAuiSimpleTabArt(); - - wxAuiTabArt* Clone(); - void SetFlags(unsigned int flags); - - void SetSizingInfo(const wxSize& tabCtrlSize, - size_t tabCount); - - void SetNormalFont(const wxFont& font); - void SetSelectedFont(const wxFont& font); - void SetMeasuringFont(const wxFont& font); - void SetColour(const wxColour& colour); - void SetActiveColour(const wxColour& colour); - - void DrawBackground( - wxDC& dc, - wxWindow* wnd, - const wxRect& rect); - - void DrawTab(wxDC& dc, - wxWindow* wnd, - const wxAuiNotebookPage& pane, - const wxRect& inRect, - int closeButtonState, - wxRect* outTabRect, - wxRect* outButtonRect, - int* xExtent); - - void DrawButton( - wxDC& dc, - wxWindow* wnd, - const wxRect& inRect, - int bitmapId, - int buttonState, - int orientation, - wxRect* outRect); - - int GetIndentSize(); - - wxSize GetTabSize( - wxDC& dc, - wxWindow* wnd, - const wxString& caption, - const wxBitmap& bitmap, - bool active, - int closeButtonState, - int* xExtent); - - int ShowDropDown( - wxWindow* wnd, - const wxAuiNotebookPageArray& items, - int activeIdx); - - int GetBestTabCtrlSize(wxWindow* wnd, - const wxAuiNotebookPageArray& pages, - const wxSize& requiredBmpSize); - -protected: - - wxFont m_normalFont; - wxFont m_selectedFont; - wxFont m_measuringFont; - wxPen m_normalBkPen; - wxPen m_selectedBkPen; - wxBrush m_normalBkBrush; - wxBrush m_selectedBkBrush; - wxBrush m_bkBrush; - wxBitmap m_activeCloseBmp; - wxBitmap m_disabledCloseBmp; - wxBitmap m_activeLeftBmp; - wxBitmap m_disabledLeftBmp; - wxBitmap m_activeRightBmp; - wxBitmap m_disabledRightBmp; - wxBitmap m_activeWindowListBmp; - wxBitmap m_disabledWindowListBmp; - - int m_fixedTabWidth; - unsigned int m_flags; -}; - - - - - - - - - class WXDLLIMPEXP_AUI wxAuiTabContainer { public: diff --git a/include/wx/aui/tabart.h b/include/wx/aui/tabart.h new file mode 100644 index 0000000..e1418f2 --- /dev/null +++ b/include/wx/aui/tabart.h @@ -0,0 +1,282 @@ +////////////////////////////////////////////////////////////////////////////// +// Name: wx/aui/tabart.h +// Purpose: wxaui: wx advanced user interface - notebook +// Author: Benjamin I. Williams +// Modified by: Jens Lody (extracted from wx/aui/auibook.h) +// Created: 2012-03-21 +// RCS-ID: $Id:$ +// Copyright: (C) Copyright 2006, Kirix Corporation, All Rights Reserved. +// Licence: wxWindows Library Licence, Version 3.1 +/////////////////////////////////////////////////////////////////////////////// + + +#ifndef _WX_AUI_TABART_H_ +#define _WX_AUI_TABART_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_AUI + +#include "wx/colour.h" +#include "wx/gdicmn.h" +#include "wx/font.h" +#include "wx/pen.h" +#include "wx/brush.h" +#include "wx/bitmap.h" + + +class wxAuiNotebookPage; +class wxAuiNotebookPageArray; +class wxWindow; +class wxDC; + + +// tab art class + +class WXDLLIMPEXP_AUI wxAuiTabArt +{ +public: + + wxAuiTabArt() { } + virtual ~wxAuiTabArt() { } + + virtual wxAuiTabArt* Clone() = 0; + virtual void SetFlags(unsigned int flags) = 0; + + virtual void SetSizingInfo(const wxSize& tabCtrlSize, + size_t tabCount) = 0; + + virtual void SetNormalFont(const wxFont& font) = 0; + virtual void SetSelectedFont(const wxFont& font) = 0; + virtual void SetMeasuringFont(const wxFont& font) = 0; + virtual void SetColour(const wxColour& colour) = 0; + virtual void SetActiveColour(const wxColour& colour) = 0; + + virtual void DrawBackground( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect) = 0; + + virtual void DrawTab(wxDC& dc, + wxWindow* wnd, + const wxAuiNotebookPage& pane, + const wxRect& inRect, + int closeButtonState, + wxRect* outTabRect, + wxRect* outButtonRect, + int* xExtent) = 0; + + virtual void DrawButton( + wxDC& dc, + wxWindow* wnd, + const wxRect& inRect, + int bitmapId, + int buttonState, + int orientation, + wxRect* outRect) = 0; + + virtual wxSize GetTabSize( + wxDC& dc, + wxWindow* wnd, + const wxString& caption, + const wxBitmap& bitmap, + bool active, + int closeButtonState, + int* xExtent) = 0; + + virtual int ShowDropDown( + wxWindow* wnd, + const wxAuiNotebookPageArray& items, + int activeIdx) = 0; + + virtual int GetIndentSize() = 0; + + virtual int GetBestTabCtrlSize( + wxWindow* wnd, + const wxAuiNotebookPageArray& pages, + const wxSize& requiredBmpSize) = 0; +}; + + +class WXDLLIMPEXP_AUI wxAuiGenericTabArt : public wxAuiTabArt +{ + +public: + + wxAuiGenericTabArt(); + virtual ~wxAuiGenericTabArt(); + + wxAuiTabArt* Clone(); + void SetFlags(unsigned int flags); + void SetSizingInfo(const wxSize& tabCtrlSize, + size_t tabCount); + + void SetNormalFont(const wxFont& font); + void SetSelectedFont(const wxFont& font); + void SetMeasuringFont(const wxFont& font); + void SetColour(const wxColour& colour); + void SetActiveColour(const wxColour& colour); + + void DrawBackground( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect); + + void DrawTab(wxDC& dc, + wxWindow* wnd, + const wxAuiNotebookPage& pane, + const wxRect& inRect, + int closeButtonState, + wxRect* outTabRect, + wxRect* outButtonRect, + int* xExtent); + + void DrawButton( + wxDC& dc, + wxWindow* wnd, + const wxRect& inRect, + int bitmapId, + int buttonState, + int orientation, + wxRect* outRect); + + int GetIndentSize(); + + wxSize GetTabSize( + wxDC& dc, + wxWindow* wnd, + const wxString& caption, + const wxBitmap& bitmap, + bool active, + int closeButtonState, + int* xExtent); + + int ShowDropDown( + wxWindow* wnd, + const wxAuiNotebookPageArray& items, + int activeIdx); + + int GetBestTabCtrlSize(wxWindow* wnd, + const wxAuiNotebookPageArray& pages, + const wxSize& requiredBmpSize); + +protected: + + wxFont m_normalFont; + wxFont m_selectedFont; + wxFont m_measuringFont; + wxColour m_baseColour; + wxPen m_baseColourPen; + wxPen m_borderPen; + wxBrush m_baseColourBrush; + wxColour m_activeColour; + wxBitmap m_activeCloseBmp; + wxBitmap m_disabledCloseBmp; + wxBitmap m_activeLeftBmp; + wxBitmap m_disabledLeftBmp; + wxBitmap m_activeRightBmp; + wxBitmap m_disabledRightBmp; + wxBitmap m_activeWindowListBmp; + wxBitmap m_disabledWindowListBmp; + + int m_fixedTabWidth; + int m_tabCtrlHeight; + unsigned int m_flags; +}; + + +class WXDLLIMPEXP_AUI wxAuiSimpleTabArt : public wxAuiTabArt +{ + +public: + + wxAuiSimpleTabArt(); + virtual ~wxAuiSimpleTabArt(); + + wxAuiTabArt* Clone(); + void SetFlags(unsigned int flags); + + void SetSizingInfo(const wxSize& tabCtrlSize, + size_t tabCount); + + void SetNormalFont(const wxFont& font); + void SetSelectedFont(const wxFont& font); + void SetMeasuringFont(const wxFont& font); + void SetColour(const wxColour& colour); + void SetActiveColour(const wxColour& colour); + + void DrawBackground( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect); + + void DrawTab(wxDC& dc, + wxWindow* wnd, + const wxAuiNotebookPage& pane, + const wxRect& inRect, + int closeButtonState, + wxRect* outTabRect, + wxRect* outButtonRect, + int* xExtent); + + void DrawButton( + wxDC& dc, + wxWindow* wnd, + const wxRect& inRect, + int bitmapId, + int buttonState, + int orientation, + wxRect* outRect); + + int GetIndentSize(); + + wxSize GetTabSize( + wxDC& dc, + wxWindow* wnd, + const wxString& caption, + const wxBitmap& bitmap, + bool active, + int closeButtonState, + int* xExtent); + + int ShowDropDown( + wxWindow* wnd, + const wxAuiNotebookPageArray& items, + int activeIdx); + + int GetBestTabCtrlSize(wxWindow* wnd, + const wxAuiNotebookPageArray& pages, + const wxSize& requiredBmpSize); + +protected: + + wxFont m_normalFont; + wxFont m_selectedFont; + wxFont m_measuringFont; + wxPen m_normalBkPen; + wxPen m_selectedBkPen; + wxBrush m_normalBkBrush; + wxBrush m_selectedBkBrush; + wxBrush m_bkBrush; + wxBitmap m_activeCloseBmp; + wxBitmap m_disabledCloseBmp; + wxBitmap m_activeLeftBmp; + wxBitmap m_disabledLeftBmp; + wxBitmap m_activeRightBmp; + wxBitmap m_disabledRightBmp; + wxBitmap m_activeWindowListBmp; + wxBitmap m_disabledWindowListBmp; + + int m_fixedTabWidth; + unsigned int m_flags; +}; + +#define wxAuiDefaultTabArt wxAuiGenericTabArt + +#endif // wxUSE_AUI + +#endif // _WX_AUI_TABART_H_ diff --git a/src/aui/auibook.cpp b/src/aui/auibook.cpp index f299944..3d423f2 100644 --- a/src/aui/auibook.cpp +++ b/src/aui/auibook.cpp @@ -2,7 +2,7 @@ // Name: src/aui/auibook.cpp // Purpose: wxaui: wx advanced user interface - notebook // Author: Benjamin I. Williams -// Modified by: +// Modified by: Jens Lody // Created: 2006-06-28 // Copyright: (C) Copyright 2006, Kirix Corporation, All Rights Reserved // Licence: wxWindows Library Licence, Version 3.1 @@ -24,14 +24,10 @@ #ifndef WX_PRECOMP #include "wx/settings.h" - #include "wx/image.h" - #include "wx/menu.h" + #include "wx/clientdc.h" #endif #include "wx/aui/tabmdi.h" -#include "wx/dcbuffer.h" - -#include "wx/renderer.h" #ifdef __WXMAC__ #include "wx/osx/private.h" @@ -63,1234 +59,6 @@ IMPLEMENT_CLASS(wxAuiTabCtrl, wxControl) IMPLEMENT_DYNAMIC_CLASS(wxAuiNotebookEvent, wxBookCtrlEvent) - - - -// these functions live in dockart.cpp -- they'll eventually -// be moved to a new utility cpp file - -wxBitmap wxAuiBitmapFromBits(const unsigned char bits[], int w, int h, - const wxColour& color); - -wxString wxAuiChopText(wxDC& dc, const wxString& text, int max_size); - -static void DrawButtons(wxDC& dc, - const wxRect& _rect, - const wxBitmap& bmp, - const wxColour& bkcolour, - int button_state) -{ - wxRect rect = _rect; - - if (button_state == wxAUI_BUTTON_STATE_PRESSED) - { - rect.x++; - rect.y++; - } - - if (button_state == wxAUI_BUTTON_STATE_HOVER || - button_state == wxAUI_BUTTON_STATE_PRESSED) - { - dc.SetBrush(wxBrush(bkcolour.ChangeLightness(120))); - dc.SetPen(wxPen(bkcolour.ChangeLightness(75))); - - // draw the background behind the button - dc.DrawRectangle(rect.x, rect.y, 15, 15); - } - - // draw the button itself - dc.DrawBitmap(bmp, rect.x, rect.y, true); -} - -static void IndentPressedBitmap(wxRect* rect, int button_state) -{ - if (button_state == wxAUI_BUTTON_STATE_PRESSED) - { - rect->x++; - rect->y++; - } -} - - - -// -- GUI helper classes and functions -- - -class wxAuiCommandCapture : public wxEvtHandler -{ -public: - - wxAuiCommandCapture() { m_lastId = 0; } - int GetCommandId() const { return m_lastId; } - - bool ProcessEvent(wxEvent& evt) - { - if (evt.GetEventType() == wxEVT_COMMAND_MENU_SELECTED) - { - m_lastId = evt.GetId(); - return true; - } - - if (GetNextHandler()) - return GetNextHandler()->ProcessEvent(evt); - - return false; - } - -private: - int m_lastId; -}; - - -// -- bitmaps -- - -#if defined( __WXMAC__ ) - static const unsigned char close_bits[]={ - 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFE, 0x03, 0xF8, 0x01, 0xF0, 0x19, 0xF3, - 0xB8, 0xE3, 0xF0, 0xE1, 0xE0, 0xE0, 0xF0, 0xE1, 0xB8, 0xE3, 0x19, 0xF3, - 0x01, 0xF0, 0x03, 0xF8, 0x0F, 0xFE, 0xFF, 0xFF }; -#elif defined( __WXGTK__) - static const unsigned char close_bits[]={ - 0xff, 0xff, 0xff, 0xff, 0x07, 0xf0, 0xfb, 0xef, 0xdb, 0xed, 0x8b, 0xe8, - 0x1b, 0xec, 0x3b, 0xee, 0x1b, 0xec, 0x8b, 0xe8, 0xdb, 0xed, 0xfb, 0xef, - 0x07, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; -#else - static const unsigned char close_bits[]={ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xf3, 0xcf, 0xf9, - 0x9f, 0xfc, 0x3f, 0xfe, 0x3f, 0xfe, 0x9f, 0xfc, 0xcf, 0xf9, 0xe7, 0xf3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; -#endif - -static const unsigned char left_bits[] = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xfe, 0x3f, 0xfe, - 0x1f, 0xfe, 0x0f, 0xfe, 0x1f, 0xfe, 0x3f, 0xfe, 0x7f, 0xfe, 0xff, 0xfe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - -static const unsigned char right_bits[] = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x9f, 0xff, 0x1f, 0xff, - 0x1f, 0xfe, 0x1f, 0xfc, 0x1f, 0xfe, 0x1f, 0xff, 0x9f, 0xff, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - -static const unsigned char list_bits[] = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0f, 0xf8, 0xff, 0xff, 0x0f, 0xf8, 0x1f, 0xfc, 0x3f, 0xfe, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - - - - - - -// -- wxAuiDefaultTabArt class implementation -- - -wxAuiDefaultTabArt::wxAuiDefaultTabArt() -{ - m_normalFont = *wxNORMAL_FONT; - m_selectedFont = *wxNORMAL_FONT; - m_selectedFont.SetWeight(wxBOLD); - m_measuringFont = m_selectedFont; - - m_fixedTabWidth = 100; - m_tabCtrlHeight = 0; - -#if defined( __WXMAC__ ) && wxOSX_USE_COCOA_OR_CARBON - wxColor baseColour = wxColour( wxMacCreateCGColorFromHITheme(kThemeBrushToolbarBackground)); -#else - wxColor baseColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); -#endif - - // the baseColour is too pale to use as our base colour, - // so darken it a bit -- - if ((255-baseColour.Red()) + - (255-baseColour.Green()) + - (255-baseColour.Blue()) < 60) - { - baseColour = baseColour.ChangeLightness(92); - } - - m_activeColour = baseColour; - m_baseColour = baseColour; - wxColor borderColour = baseColour.ChangeLightness(75); - - m_borderPen = wxPen(borderColour); - m_baseColourPen = wxPen(m_baseColour); - m_baseColourBrush = wxBrush(m_baseColour); - - m_activeCloseBmp = wxAuiBitmapFromBits(close_bits, 16, 16, *wxBLACK); - m_disabledCloseBmp = wxAuiBitmapFromBits(close_bits, 16, 16, wxColour(128,128,128)); - - m_activeLeftBmp = wxAuiBitmapFromBits(left_bits, 16, 16, *wxBLACK); - m_disabledLeftBmp = wxAuiBitmapFromBits(left_bits, 16, 16, wxColour(128,128,128)); - - m_activeRightBmp = wxAuiBitmapFromBits(right_bits, 16, 16, *wxBLACK); - m_disabledRightBmp = wxAuiBitmapFromBits(right_bits, 16, 16, wxColour(128,128,128)); - - m_activeWindowListBmp = wxAuiBitmapFromBits(list_bits, 16, 16, *wxBLACK); - m_disabledWindowListBmp = wxAuiBitmapFromBits(list_bits, 16, 16, wxColour(128,128,128)); - - m_flags = 0; -} - -wxAuiDefaultTabArt::~wxAuiDefaultTabArt() -{ -} - -wxAuiTabArt* wxAuiDefaultTabArt::Clone() -{ - return new wxAuiDefaultTabArt(*this); -} - -void wxAuiDefaultTabArt::SetFlags(unsigned int flags) -{ - m_flags = flags; -} - -void wxAuiDefaultTabArt::SetSizingInfo(const wxSize& tab_ctrl_size, - size_t tab_count) -{ - m_fixedTabWidth = 100; - - int tot_width = (int)tab_ctrl_size.x - GetIndentSize() - 4; - - if (m_flags & wxAUI_NB_CLOSE_BUTTON) - tot_width -= m_activeCloseBmp.GetWidth(); - if (m_flags & wxAUI_NB_WINDOWLIST_BUTTON) - tot_width -= m_activeWindowListBmp.GetWidth(); - - if (tab_count > 0) - { - m_fixedTabWidth = tot_width/(int)tab_count; - } - - - if (m_fixedTabWidth < 100) - m_fixedTabWidth = 100; - - if (m_fixedTabWidth > tot_width/2) - m_fixedTabWidth = tot_width/2; - - if (m_fixedTabWidth > 220) - m_fixedTabWidth = 220; - - m_tabCtrlHeight = tab_ctrl_size.y; -} - - -void wxAuiDefaultTabArt::DrawBackground(wxDC& dc, - wxWindow* WXUNUSED(wnd), - const wxRect& rect) -{ - // draw background - - wxColor top_color = m_baseColour.ChangeLightness(90); - wxColor bottom_color = m_baseColour.ChangeLightness(170); - wxRect r; - - if (m_flags &wxAUI_NB_BOTTOM) - r = wxRect(rect.x, rect.y, rect.width+2, rect.height); - // TODO: else if (m_flags &wxAUI_NB_LEFT) {} - // TODO: else if (m_flags &wxAUI_NB_RIGHT) {} - else //for wxAUI_NB_TOP - r = wxRect(rect.x, rect.y, rect.width+2, rect.height-3); - - dc.GradientFillLinear(r, top_color, bottom_color, wxSOUTH); - - - // draw base lines - - dc.SetPen(m_borderPen); - int y = rect.GetHeight(); - int w = rect.GetWidth(); - - if (m_flags &wxAUI_NB_BOTTOM) - { - dc.SetBrush(wxBrush(bottom_color)); - dc.DrawRectangle(-1, 0, w+2, 4); - } - // TODO: else if (m_flags &wxAUI_NB_LEFT) {} - // TODO: else if (m_flags &wxAUI_NB_RIGHT) {} - else //for wxAUI_NB_TOP - { - dc.SetBrush(m_baseColourBrush); - dc.DrawRectangle(-1, y-4, w+2, 4); - } -} - - -// DrawTab() draws an individual tab. -// -// dc - output dc -// in_rect - rectangle the tab should be confined to -// caption - tab's caption -// active - whether or not the tab is active -// out_rect - actual output rectangle -// x_extent - the advance x; where the next tab should start - -void wxAuiDefaultTabArt::DrawTab(wxDC& dc, - wxWindow* wnd, - const wxAuiNotebookPage& page, - const wxRect& in_rect, - int close_button_state, - wxRect* out_tab_rect, - wxRect* out_button_rect, - int* x_extent) -{ - wxCoord normal_textx, normal_texty; - wxCoord selected_textx, selected_texty; - wxCoord texty; - - // if the caption is empty, measure some temporary text - wxString caption = page.caption; - if (caption.empty()) - caption = wxT("Xj"); - - dc.SetFont(m_selectedFont); - dc.GetTextExtent(caption, &selected_textx, &selected_texty); - - dc.SetFont(m_normalFont); - dc.GetTextExtent(caption, &normal_textx, &normal_texty); - - // figure out the size of the tab - wxSize tab_size = GetTabSize(dc, - wnd, - page.caption, - page.bitmap, - page.active, - close_button_state, - x_extent); - - wxCoord tab_height = m_tabCtrlHeight - 3; - wxCoord tab_width = tab_size.x; - wxCoord tab_x = in_rect.x; - wxCoord tab_y = in_rect.y + in_rect.height - tab_height; - - - caption = page.caption; - - - // select pen, brush and font for the tab to be drawn - - if (page.active) - { - dc.SetFont(m_selectedFont); - texty = selected_texty; - } - else - { - dc.SetFont(m_normalFont); - texty = normal_texty; - } - - - // create points that will make the tab outline - - int clip_width = tab_width; - if (tab_x + clip_width > in_rect.x + in_rect.width) - clip_width = (in_rect.x + in_rect.width) - tab_x; - -/* - wxPoint clip_points[6]; - clip_points[0] = wxPoint(tab_x, tab_y+tab_height-3); - clip_points[1] = wxPoint(tab_x, tab_y+2); - clip_points[2] = wxPoint(tab_x+2, tab_y); - clip_points[3] = wxPoint(tab_x+clip_width-1, tab_y); - clip_points[4] = wxPoint(tab_x+clip_width+1, tab_y+2); - clip_points[5] = wxPoint(tab_x+clip_width+1, tab_y+tab_height-3); - - // FIXME: these ports don't provide wxRegion ctor from array of points -#if !defined(__WXDFB__) && !defined(__WXCOCOA__) - // set the clipping region for the tab -- - wxRegion clipping_region(WXSIZEOF(clip_points), clip_points); - dc.SetClippingRegion(clipping_region); -#endif // !wxDFB && !wxCocoa -*/ - // since the above code above doesn't play well with WXDFB or WXCOCOA, - // we'll just use a rectangle for the clipping region for now -- - dc.SetClippingRegion(tab_x, tab_y, clip_width+1, tab_height-3); - - - wxPoint border_points[6]; - if (m_flags &wxAUI_NB_BOTTOM) - { - border_points[0] = wxPoint(tab_x, tab_y); - border_points[1] = wxPoint(tab_x, tab_y+tab_height-6); - border_points[2] = wxPoint(tab_x+2, tab_y+tab_height-4); - border_points[3] = wxPoint(tab_x+tab_width-2, tab_y+tab_height-4); - border_points[4] = wxPoint(tab_x+tab_width, tab_y+tab_height-6); - border_points[5] = wxPoint(tab_x+tab_width, tab_y); - } - else //if (m_flags & wxAUI_NB_TOP) {} - { - border_points[0] = wxPoint(tab_x, tab_y+tab_height-4); - border_points[1] = wxPoint(tab_x, tab_y+2); - border_points[2] = wxPoint(tab_x+2, tab_y); - border_points[3] = wxPoint(tab_x+tab_width-2, tab_y); - border_points[4] = wxPoint(tab_x+tab_width, tab_y+2); - border_points[5] = wxPoint(tab_x+tab_width, tab_y+tab_height-4); - } - // TODO: else if (m_flags &wxAUI_NB_LEFT) {} - // TODO: else if (m_flags &wxAUI_NB_RIGHT) {} - - int drawn_tab_yoff = border_points[1].y; - int drawn_tab_height = border_points[0].y - border_points[1].y; - - - if (page.active) - { - // draw active tab - - // draw base background color - wxRect r(tab_x, tab_y, tab_width, tab_height); - dc.SetPen(wxPen(m_activeColour)); - dc.SetBrush(wxBrush(m_activeColour)); - dc.DrawRectangle(r.x+1, r.y+1, r.width-1, r.height-4); - - // this white helps fill out the gradient at the top of the tab - dc.SetPen(*wxWHITE_PEN); - dc.SetBrush(*wxWHITE_BRUSH); - dc.DrawRectangle(r.x+2, r.y+1, r.width-3, r.height-4); - - // these two points help the rounded corners appear more antialiased - dc.SetPen(wxPen(m_activeColour)); - dc.DrawPoint(r.x+2, r.y+1); - dc.DrawPoint(r.x+r.width-2, r.y+1); - - // set rectangle down a bit for gradient drawing - r.SetHeight(r.GetHeight()/2); - r.x += 2; - r.width -= 3; - r.y += r.height; - r.y -= 2; - - // draw gradient background - wxColor top_color = *wxWHITE; - wxColor bottom_color = m_activeColour; - dc.GradientFillLinear(r, bottom_color, top_color, wxNORTH); - } - else - { - // draw inactive tab - - wxRect r(tab_x, tab_y+1, tab_width, tab_height-3); - - // start the gradent up a bit and leave the inside border inset - // by a pixel for a 3D look. Only the top half of the inactive - // tab will have a slight gradient - r.x += 3; - r.y++; - r.width -= 4; - r.height /= 2; - r.height--; - - // -- draw top gradient fill for glossy look - wxColor top_color = m_baseColour; - wxColor bottom_color = top_color.ChangeLightness(160); - dc.GradientFillLinear(r, bottom_color, top_color, wxNORTH); - - r.y += r.height; - r.y--; - - // -- draw bottom fill for glossy look - top_color = m_baseColour; - bottom_color = m_baseColour; - dc.GradientFillLinear(r, top_color, bottom_color, wxSOUTH); - } - - // draw tab outline - dc.SetPen(m_borderPen); - dc.SetBrush(*wxTRANSPARENT_BRUSH); - dc.DrawPolygon(WXSIZEOF(border_points), border_points); - - // there are two horizontal grey lines at the bottom of the tab control, - // this gets rid of the top one of those lines in the tab control - if (page.active) - { - if (m_flags &wxAUI_NB_BOTTOM) - dc.SetPen(wxPen(m_baseColour.ChangeLightness(170))); - // TODO: else if (m_flags &wxAUI_NB_LEFT) {} - // TODO: else if (m_flags &wxAUI_NB_RIGHT) {} - else //for wxAUI_NB_TOP - dc.SetPen(m_baseColourPen); - dc.DrawLine(border_points[0].x+1, - border_points[0].y, - border_points[5].x, - border_points[5].y); - } - - - int text_offset = tab_x + 8; - int close_button_width = 0; - if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN) - { - close_button_width = m_activeCloseBmp.GetWidth(); - } - - int bitmap_offset = 0; - if (page.bitmap.IsOk()) - { - bitmap_offset = tab_x + 8; - - // draw bitmap - dc.DrawBitmap(page.bitmap, - bitmap_offset, - drawn_tab_yoff + (drawn_tab_height/2) - (page.bitmap.GetHeight()/2), - true); - - text_offset = bitmap_offset + page.bitmap.GetWidth(); - text_offset += 3; // bitmap padding - - } - else - { - text_offset = tab_x + 8; - } - - - wxString draw_text = wxAuiChopText(dc, - caption, - tab_width - (text_offset-tab_x) - close_button_width); - - // draw tab text - dc.DrawText(draw_text, - text_offset, - drawn_tab_yoff + (drawn_tab_height)/2 - (texty/2) - 1); - - // draw focus rectangle - if (page.active && (wnd->FindFocus() == wnd)) - { - wxRect focusRectText(text_offset, (drawn_tab_yoff + (drawn_tab_height)/2 - (texty/2) - 1), - selected_textx, selected_texty); - - wxRect focusRect; - wxRect focusRectBitmap; - - if (page.bitmap.IsOk()) - focusRectBitmap = wxRect(bitmap_offset, drawn_tab_yoff + (drawn_tab_height/2) - (page.bitmap.GetHeight()/2), - page.bitmap.GetWidth(), page.bitmap.GetHeight()); - - if (page.bitmap.IsOk() && draw_text.IsEmpty()) - focusRect = focusRectBitmap; - else if (!page.bitmap.IsOk() && !draw_text.IsEmpty()) - focusRect = focusRectText; - else if (page.bitmap.IsOk() && !draw_text.IsEmpty()) - focusRect = focusRectText.Union(focusRectBitmap); - - focusRect.Inflate(2, 2); - - wxRendererNative::Get().DrawFocusRect(wnd, dc, focusRect, 0); - } - - // draw close button if necessary - if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN) - { - wxBitmap bmp = m_disabledCloseBmp; - - if (close_button_state == wxAUI_BUTTON_STATE_HOVER || - close_button_state == wxAUI_BUTTON_STATE_PRESSED) - { - bmp = m_activeCloseBmp; - } - - int offsetY = tab_y-1; - if (m_flags & wxAUI_NB_BOTTOM) - offsetY = 1; - - wxRect rect(tab_x + tab_width - close_button_width - 1, - offsetY + (tab_height/2) - (bmp.GetHeight()/2), - close_button_width, - tab_height); - - IndentPressedBitmap(&rect, close_button_state); - dc.DrawBitmap(bmp, rect.x, rect.y, true); - - *out_button_rect = rect; - } - - *out_tab_rect = wxRect(tab_x, tab_y, tab_width, tab_height); - - dc.DestroyClippingRegion(); -} - -int wxAuiDefaultTabArt::GetIndentSize() -{ - return 5; -} - -wxSize wxAuiDefaultTabArt::GetTabSize(wxDC& dc, - wxWindow* WXUNUSED(wnd), - const wxString& caption, - const wxBitmap& bitmap, - bool WXUNUSED(active), - int close_button_state, - int* x_extent) -{ - wxCoord measured_textx, measured_texty, tmp; - - dc.SetFont(m_measuringFont); - dc.GetTextExtent(caption, &measured_textx, &measured_texty); - - dc.GetTextExtent(wxT("ABCDEFXj"), &tmp, &measured_texty); - - // add padding around the text - wxCoord tab_width = measured_textx; - wxCoord tab_height = measured_texty; - - // if the close button is showing, add space for it - if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN) - tab_width += m_activeCloseBmp.GetWidth() + 3; - - // if there's a bitmap, add space for it - if (bitmap.IsOk()) - { - tab_width += bitmap.GetWidth(); - tab_width += 3; // right side bitmap padding - tab_height = wxMax(tab_height, bitmap.GetHeight()); - } - - // add padding - tab_width += 16; - tab_height += 10; - - if (m_flags & wxAUI_NB_TAB_FIXED_WIDTH) - { - tab_width = m_fixedTabWidth; - } - - *x_extent = tab_width; - - return wxSize(tab_width, tab_height); -} - - -void wxAuiDefaultTabArt::DrawButton(wxDC& dc, - wxWindow* WXUNUSED(wnd), - const wxRect& in_rect, - int bitmap_id, - int button_state, - int orientation, - wxRect* out_rect) -{ - wxBitmap bmp; - wxRect rect; - - switch (bitmap_id) - { - case wxAUI_BUTTON_CLOSE: - if (button_state & wxAUI_BUTTON_STATE_DISABLED) - bmp = m_disabledCloseBmp; - else - bmp = m_activeCloseBmp; - break; - case wxAUI_BUTTON_LEFT: - if (button_state & wxAUI_BUTTON_STATE_DISABLED) - bmp = m_disabledLeftBmp; - else - bmp = m_activeLeftBmp; - break; - case wxAUI_BUTTON_RIGHT: - if (button_state & wxAUI_BUTTON_STATE_DISABLED) - bmp = m_disabledRightBmp; - else - bmp = m_activeRightBmp; - break; - case wxAUI_BUTTON_WINDOWLIST: - if (button_state & wxAUI_BUTTON_STATE_DISABLED) - bmp = m_disabledWindowListBmp; - else - bmp = m_activeWindowListBmp; - break; - } - - - if (!bmp.IsOk()) - return; - - rect = in_rect; - - if (orientation == wxLEFT) - { - rect.SetX(in_rect.x); - rect.SetY(((in_rect.y + in_rect.height)/2) - (bmp.GetHeight()/2)); - rect.SetWidth(bmp.GetWidth()); - rect.SetHeight(bmp.GetHeight()); - } - else - { - rect = wxRect(in_rect.x + in_rect.width - bmp.GetWidth(), - ((in_rect.y + in_rect.height)/2) - (bmp.GetHeight()/2), - bmp.GetWidth(), bmp.GetHeight()); - } - - IndentPressedBitmap(&rect, button_state); - dc.DrawBitmap(bmp, rect.x, rect.y, true); - - *out_rect = rect; -} - -int wxAuiDefaultTabArt::ShowDropDown(wxWindow* wnd, - const wxAuiNotebookPageArray& pages, - int /*active_idx*/) -{ - wxMenu menuPopup; - - size_t i, count = pages.GetCount(); - for (i = 0; i < count; ++i) - { - const wxAuiNotebookPage& page = pages.Item(i); - wxString caption = page.caption; - - // if there is no caption, make it a space. This will prevent - // an assert in the menu code. - if (caption.IsEmpty()) - caption = wxT(" "); - - wxMenuItem* item = new wxMenuItem(NULL, 1000+i, caption); - if (page.bitmap.IsOk()) - item->SetBitmap(page.bitmap); - menuPopup.Append(item); - } - - // find out where to put the popup menu of window items - wxPoint pt = ::wxGetMousePosition(); - pt = wnd->ScreenToClient(pt); - - // find out the screen coordinate at the bottom of the tab ctrl - wxRect cli_rect = wnd->GetClientRect(); - pt.y = cli_rect.y + cli_rect.height; - - wxAuiCommandCapture* cc = new wxAuiCommandCapture; - wnd->PushEventHandler(cc); - wnd->PopupMenu(&menuPopup, pt); - int command = cc->GetCommandId(); - wnd->PopEventHandler(true); - - if (command >= 1000) - return command-1000; - - return -1; -} - -int wxAuiDefaultTabArt::GetBestTabCtrlSize(wxWindow* wnd, - const wxAuiNotebookPageArray& pages, - const wxSize& requiredBmp_size) -{ - wxClientDC dc(wnd); - dc.SetFont(m_measuringFont); - - // sometimes a standard bitmap size needs to be enforced, especially - // if some tabs have bitmaps and others don't. This is important because - // it prevents the tab control from resizing when tabs are added. - wxBitmap measureBmp; - if (requiredBmp_size.IsFullySpecified()) - { - measureBmp.Create(requiredBmp_size.x, - requiredBmp_size.y); - } - - - int max_y = 0; - size_t i, page_count = pages.GetCount(); - for (i = 0; i < page_count; ++i) - { - wxAuiNotebookPage& page = pages.Item(i); - - wxBitmap bmp; - if (measureBmp.IsOk()) - bmp = measureBmp; - else - bmp = page.bitmap; - - // we don't use the caption text because we don't - // want tab heights to be different in the case - // of a very short piece of text on one tab and a very - // tall piece of text on another tab - int x_ext = 0; - wxSize s = GetTabSize(dc, - wnd, - wxT("ABCDEFGHIj"), - bmp, - true, - wxAUI_BUTTON_STATE_HIDDEN, - &x_ext); - - max_y = wxMax(max_y, s.y); - } - - return max_y+2; -} - -void wxAuiDefaultTabArt::SetNormalFont(const wxFont& font) -{ - m_normalFont = font; -} - -void wxAuiDefaultTabArt::SetSelectedFont(const wxFont& font) -{ - m_selectedFont = font; -} - -void wxAuiDefaultTabArt::SetMeasuringFont(const wxFont& font) -{ - m_measuringFont = font; -} - -void wxAuiDefaultTabArt::SetColour(const wxColour& colour) -{ - m_baseColour = colour; - m_borderPen = wxPen(m_baseColour.ChangeLightness(75)); - m_baseColourPen = wxPen(m_baseColour); - m_baseColourBrush = wxBrush(m_baseColour); -} - -void wxAuiDefaultTabArt::SetActiveColour(const wxColour& colour) -{ - m_activeColour = colour; -} - -// -- wxAuiSimpleTabArt class implementation -- - -wxAuiSimpleTabArt::wxAuiSimpleTabArt() -{ - m_normalFont = *wxNORMAL_FONT; - m_selectedFont = *wxNORMAL_FONT; - m_selectedFont.SetWeight(wxBOLD); - m_measuringFont = m_selectedFont; - - m_flags = 0; - m_fixedTabWidth = 100; - - wxColour baseColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); - - wxColour backgroundColour = baseColour; - wxColour normaltabColour = baseColour; - wxColour selectedtabColour = *wxWHITE; - - m_bkBrush = wxBrush(backgroundColour); - m_normalBkBrush = wxBrush(normaltabColour); - m_normalBkPen = wxPen(normaltabColour); - m_selectedBkBrush = wxBrush(selectedtabColour); - m_selectedBkPen = wxPen(selectedtabColour); - - m_activeCloseBmp = wxAuiBitmapFromBits(close_bits, 16, 16, *wxBLACK); - m_disabledCloseBmp = wxAuiBitmapFromBits(close_bits, 16, 16, wxColour(128,128,128)); - - m_activeLeftBmp = wxAuiBitmapFromBits(left_bits, 16, 16, *wxBLACK); - m_disabledLeftBmp = wxAuiBitmapFromBits(left_bits, 16, 16, wxColour(128,128,128)); - - m_activeRightBmp = wxAuiBitmapFromBits(right_bits, 16, 16, *wxBLACK); - m_disabledRightBmp = wxAuiBitmapFromBits(right_bits, 16, 16, wxColour(128,128,128)); - - m_activeWindowListBmp = wxAuiBitmapFromBits(list_bits, 16, 16, *wxBLACK); - m_disabledWindowListBmp = wxAuiBitmapFromBits(list_bits, 16, 16, wxColour(128,128,128)); - -} - -wxAuiSimpleTabArt::~wxAuiSimpleTabArt() -{ -} - -wxAuiTabArt* wxAuiSimpleTabArt::Clone() -{ - return new wxAuiSimpleTabArt(*this); -} - -void wxAuiSimpleTabArt::SetFlags(unsigned int flags) -{ - m_flags = flags; -} - -void wxAuiSimpleTabArt::SetSizingInfo(const wxSize& tab_ctrl_size, - size_t tab_count) -{ - m_fixedTabWidth = 100; - - int tot_width = (int)tab_ctrl_size.x - GetIndentSize() - 4; - - if (m_flags & wxAUI_NB_CLOSE_BUTTON) - tot_width -= m_activeCloseBmp.GetWidth(); - if (m_flags & wxAUI_NB_WINDOWLIST_BUTTON) - tot_width -= m_activeWindowListBmp.GetWidth(); - - if (tab_count > 0) - { - m_fixedTabWidth = tot_width/(int)tab_count; - } - - - if (m_fixedTabWidth < 100) - m_fixedTabWidth = 100; - - if (m_fixedTabWidth > tot_width/2) - m_fixedTabWidth = tot_width/2; - - if (m_fixedTabWidth > 220) - m_fixedTabWidth = 220; -} - -void wxAuiSimpleTabArt::SetColour(const wxColour& colour) -{ - m_bkBrush = wxBrush(colour); - m_normalBkBrush = wxBrush(colour); - m_normalBkPen = wxPen(colour); -} - -void wxAuiSimpleTabArt::SetActiveColour(const wxColour& colour) -{ - m_selectedBkBrush = wxBrush(colour); - m_selectedBkPen = wxPen(colour); -} - -void wxAuiSimpleTabArt::DrawBackground(wxDC& dc, - wxWindow* WXUNUSED(wnd), - const wxRect& rect) -{ - // draw background - dc.SetBrush(m_bkBrush); - dc.SetPen(*wxTRANSPARENT_PEN); - dc.DrawRectangle(-1, -1, rect.GetWidth()+2, rect.GetHeight()+2); - - // draw base line - dc.SetPen(*wxGREY_PEN); - dc.DrawLine(0, rect.GetHeight()-1, rect.GetWidth(), rect.GetHeight()-1); -} - - -// DrawTab() draws an individual tab. -// -// dc - output dc -// in_rect - rectangle the tab should be confined to -// caption - tab's caption -// active - whether or not the tab is active -// out_rect - actual output rectangle -// x_extent - the advance x; where the next tab should start - -void wxAuiSimpleTabArt::DrawTab(wxDC& dc, - wxWindow* wnd, - const wxAuiNotebookPage& page, - const wxRect& in_rect, - int close_button_state, - wxRect* out_tab_rect, - wxRect* out_button_rect, - int* x_extent) -{ - wxCoord normal_textx, normal_texty; - wxCoord selected_textx, selected_texty; - wxCoord textx, texty; - - // if the caption is empty, measure some temporary text - wxString caption = page.caption; - if (caption.empty()) - caption = wxT("Xj"); - - dc.SetFont(m_selectedFont); - dc.GetTextExtent(caption, &selected_textx, &selected_texty); - - dc.SetFont(m_normalFont); - dc.GetTextExtent(caption, &normal_textx, &normal_texty); - - // figure out the size of the tab - wxSize tab_size = GetTabSize(dc, - wnd, - page.caption, - page.bitmap, - page.active, - close_button_state, - x_extent); - - wxCoord tab_height = tab_size.y; - wxCoord tab_width = tab_size.x; - wxCoord tab_x = in_rect.x; - wxCoord tab_y = in_rect.y + in_rect.height - tab_height; - - caption = page.caption; - - // select pen, brush and font for the tab to be drawn - - if (page.active) - { - dc.SetPen(m_selectedBkPen); - dc.SetBrush(m_selectedBkBrush); - dc.SetFont(m_selectedFont); - textx = selected_textx; - texty = selected_texty; - } - else - { - dc.SetPen(m_normalBkPen); - dc.SetBrush(m_normalBkBrush); - dc.SetFont(m_normalFont); - textx = normal_textx; - texty = normal_texty; - } - - - // -- draw line -- - - wxPoint points[7]; - points[0].x = tab_x; - points[0].y = tab_y + tab_height - 1; - points[1].x = tab_x + tab_height - 3; - points[1].y = tab_y + 2; - points[2].x = tab_x + tab_height + 3; - points[2].y = tab_y; - points[3].x = tab_x + tab_width - 2; - points[3].y = tab_y; - points[4].x = tab_x + tab_width; - points[4].y = tab_y + 2; - points[5].x = tab_x + tab_width; - points[5].y = tab_y + tab_height - 1; - points[6] = points[0]; - - dc.SetClippingRegion(in_rect); - - dc.DrawPolygon(WXSIZEOF(points) - 1, points); - - dc.SetPen(*wxGREY_PEN); - - //dc.DrawLines(active ? WXSIZEOF(points) - 1 : WXSIZEOF(points), points); - dc.DrawLines(WXSIZEOF(points), points); - - - int text_offset; - - int close_button_width = 0; - if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN) - { - close_button_width = m_activeCloseBmp.GetWidth(); - text_offset = tab_x + (tab_height/2) + ((tab_width-close_button_width)/2) - (textx/2); - } - else - { - text_offset = tab_x + (tab_height/3) + (tab_width/2) - (textx/2); - } - - // set minimum text offset - if (text_offset < tab_x + tab_height) - text_offset = tab_x + tab_height; - - // chop text if necessary - wxString draw_text = wxAuiChopText(dc, - caption, - tab_width - (text_offset-tab_x) - close_button_width); - - // draw tab text - dc.DrawText(draw_text, - text_offset, - (tab_y + tab_height)/2 - (texty/2) + 1); - - - // draw focus rectangle - if (page.active && (wnd->FindFocus() == wnd)) - { - wxRect focusRect(text_offset, ((tab_y + tab_height)/2 - (texty/2) + 1), - selected_textx, selected_texty); - - focusRect.Inflate(2, 2); - - wxRendererNative::Get().DrawFocusRect(wnd, dc, focusRect, 0); - } - - // draw close button if necessary - if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN) - { - wxBitmap bmp; - if (page.active) - bmp = m_activeCloseBmp; - else - bmp = m_disabledCloseBmp; - - wxRect rect(tab_x + tab_width - close_button_width - 1, - tab_y + (tab_height/2) - (bmp.GetHeight()/2) + 1, - close_button_width, - tab_height - 1); - DrawButtons(dc, rect, bmp, *wxWHITE, close_button_state); - - *out_button_rect = rect; - } - - - *out_tab_rect = wxRect(tab_x, tab_y, tab_width, tab_height); - - dc.DestroyClippingRegion(); -} - -int wxAuiSimpleTabArt::GetIndentSize() -{ - return 0; -} - -wxSize wxAuiSimpleTabArt::GetTabSize(wxDC& dc, - wxWindow* WXUNUSED(wnd), - const wxString& caption, - const wxBitmap& WXUNUSED(bitmap), - bool WXUNUSED(active), - int close_button_state, - int* x_extent) -{ - wxCoord measured_textx, measured_texty; - - dc.SetFont(m_measuringFont); - dc.GetTextExtent(caption, &measured_textx, &measured_texty); - - wxCoord tab_height = measured_texty + 4; - wxCoord tab_width = measured_textx + tab_height + 5; - - if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN) - tab_width += m_activeCloseBmp.GetWidth(); - - if (m_flags & wxAUI_NB_TAB_FIXED_WIDTH) - { - tab_width = m_fixedTabWidth; - } - - *x_extent = tab_width - (tab_height/2) - 1; - - return wxSize(tab_width, tab_height); -} - - -void wxAuiSimpleTabArt::DrawButton(wxDC& dc, - wxWindow* WXUNUSED(wnd), - const wxRect& in_rect, - int bitmap_id, - int button_state, - int orientation, - wxRect* out_rect) -{ - wxBitmap bmp; - wxRect rect; - - switch (bitmap_id) - { - case wxAUI_BUTTON_CLOSE: - if (button_state & wxAUI_BUTTON_STATE_DISABLED) - bmp = m_disabledCloseBmp; - else - bmp = m_activeCloseBmp; - break; - case wxAUI_BUTTON_LEFT: - if (button_state & wxAUI_BUTTON_STATE_DISABLED) - bmp = m_disabledLeftBmp; - else - bmp = m_activeLeftBmp; - break; - case wxAUI_BUTTON_RIGHT: - if (button_state & wxAUI_BUTTON_STATE_DISABLED) - bmp = m_disabledRightBmp; - else - bmp = m_activeRightBmp; - break; - case wxAUI_BUTTON_WINDOWLIST: - if (button_state & wxAUI_BUTTON_STATE_DISABLED) - bmp = m_disabledWindowListBmp; - else - bmp = m_activeWindowListBmp; - break; - } - - if (!bmp.IsOk()) - return; - - rect = in_rect; - - if (orientation == wxLEFT) - { - rect.SetX(in_rect.x); - rect.SetY(((in_rect.y + in_rect.height)/2) - (bmp.GetHeight()/2)); - rect.SetWidth(bmp.GetWidth()); - rect.SetHeight(bmp.GetHeight()); - } - else - { - rect = wxRect(in_rect.x + in_rect.width - bmp.GetWidth(), - ((in_rect.y + in_rect.height)/2) - (bmp.GetHeight()/2), - bmp.GetWidth(), bmp.GetHeight()); - } - - - DrawButtons(dc, rect, bmp, *wxWHITE, button_state); - - *out_rect = rect; -} - -int wxAuiSimpleTabArt::ShowDropDown(wxWindow* wnd, - const wxAuiNotebookPageArray& pages, - int active_idx) -{ - wxMenu menuPopup; - - size_t i, count = pages.GetCount(); - for (i = 0; i < count; ++i) - { - const wxAuiNotebookPage& page = pages.Item(i); - menuPopup.AppendCheckItem(1000+i, page.caption); - } - - if (active_idx != -1) - { - menuPopup.Check(1000+active_idx, true); - } - - // find out where to put the popup menu of window - // items. Subtract 100 for now to center the menu - // a bit, until a better mechanism can be implemented - wxPoint pt = ::wxGetMousePosition(); - pt = wnd->ScreenToClient(pt); - if (pt.x < 100) - pt.x = 0; - else - pt.x -= 100; - - // find out the screen coordinate at the bottom of the tab ctrl - wxRect cli_rect = wnd->GetClientRect(); - pt.y = cli_rect.y + cli_rect.height; - - wxAuiCommandCapture* cc = new wxAuiCommandCapture; - wnd->PushEventHandler(cc); - wnd->PopupMenu(&menuPopup, pt); - int command = cc->GetCommandId(); - wnd->PopEventHandler(true); - - if (command >= 1000) - return command-1000; - - return -1; -} - -int wxAuiSimpleTabArt::GetBestTabCtrlSize(wxWindow* wnd, - const wxAuiNotebookPageArray& WXUNUSED(pages), - const wxSize& WXUNUSED(requiredBmp_size)) -{ - wxClientDC dc(wnd); - dc.SetFont(m_measuringFont); - int x_ext = 0; - wxSize s = GetTabSize(dc, - wnd, - wxT("ABCDEFGHIj"), - wxNullBitmap, - true, - wxAUI_BUTTON_STATE_HIDDEN, - &x_ext); - return s.y+3; -} - -void wxAuiSimpleTabArt::SetNormalFont(const wxFont& font) -{ - m_normalFont = font; -} - -void wxAuiSimpleTabArt::SetSelectedFont(const wxFont& font) -{ - m_selectedFont = font; -} - -void wxAuiSimpleTabArt::SetMeasuringFont(const wxFont& font) -{ - m_measuringFont = font; -} - - - - // -- wxAuiTabContainer class implementation -- diff --git a/src/aui/tabart.cpp b/src/aui/tabart.cpp new file mode 100644 index 0000000..068070d --- /dev/null +++ b/src/aui/tabart.cpp @@ -0,0 +1,1260 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/aui/tabart.cpp +// Purpose: wxaui: wx advanced user interface - notebook-art +// Author: Benjamin I. Williams +// Modified by: Jens Lody (moved from auibook.cpp in extra file) +// Created: 2012-03-21 +// RCS-ID: $Id:$ +// Copyright: (C) Copyright 2006, Kirix Corporation, All Rights Reserved +// Licence: wxWindows Library Licence, Version 3.1 +/////////////////////////////////////////////////////////////////////////////// + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_AUI + +#ifndef WX_PRECOMP + #include "wx/dc.h" + #include "wx/dcclient.h" + #include "wx/settings.h" + #include "wx/bitmap.h" + #include "wx/menu.h" +#endif + +#include "wx/renderer.h" +#include "wx/aui/auibook.h" + +#ifdef __WXMAC__ +#include "wx/osx/private.h" +#endif + + +// -- GUI helper classes and functions -- + +class wxAuiCommandCapture : public wxEvtHandler +{ +public: + + wxAuiCommandCapture() { m_lastId = 0; } + int GetCommandId() const { return m_lastId; } + + bool ProcessEvent(wxEvent& evt) + { + if (evt.GetEventType() == wxEVT_COMMAND_MENU_SELECTED) + { + m_lastId = evt.GetId(); + return true; + } + + if (GetNextHandler()) + return GetNextHandler()->ProcessEvent(evt); + + return false; + } + +private: + int m_lastId; +}; + + +// these functions live in dockart.cpp -- they'll eventually +// be moved to a new utility cpp file + +wxBitmap wxAuiBitmapFromBits(const unsigned char bits[], int w, int h, + const wxColour& color); + +wxString wxAuiChopText(wxDC& dc, const wxString& text, int max_size); + +static void DrawButtons(wxDC& dc, + const wxRect& _rect, + const wxBitmap& bmp, + const wxColour& bkcolour, + int button_state) +{ + wxRect rect = _rect; + + if (button_state == wxAUI_BUTTON_STATE_PRESSED) + { + rect.x++; + rect.y++; + } + + if (button_state == wxAUI_BUTTON_STATE_HOVER || + button_state == wxAUI_BUTTON_STATE_PRESSED) + { + dc.SetBrush(wxBrush(bkcolour.ChangeLightness(120))); + dc.SetPen(wxPen(bkcolour.ChangeLightness(75))); + + // draw the background behind the button + dc.DrawRectangle(rect.x, rect.y, 15, 15); + } + + // draw the button itself + dc.DrawBitmap(bmp, rect.x, rect.y, true); +} + +static void IndentPressedBitmap(wxRect* rect, int button_state) +{ + if (button_state == wxAUI_BUTTON_STATE_PRESSED) + { + rect->x++; + rect->y++; + } +} + +// -- bitmaps -- + +#if defined( __WXMAC__ ) + static const unsigned char close_bits[]={ + 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFE, 0x03, 0xF8, 0x01, 0xF0, 0x19, 0xF3, + 0xB8, 0xE3, 0xF0, 0xE1, 0xE0, 0xE0, 0xF0, 0xE1, 0xB8, 0xE3, 0x19, 0xF3, + 0x01, 0xF0, 0x03, 0xF8, 0x0F, 0xFE, 0xFF, 0xFF }; +#elif defined( __WXGTK__) + static const unsigned char close_bits[]={ + 0xff, 0xff, 0xff, 0xff, 0x07, 0xf0, 0xfb, 0xef, 0xdb, 0xed, 0x8b, 0xe8, + 0x1b, 0xec, 0x3b, 0xee, 0x1b, 0xec, 0x8b, 0xe8, 0xdb, 0xed, 0xfb, 0xef, + 0x07, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; +#else + static const unsigned char close_bits[]={ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xf3, 0xcf, 0xf9, + 0x9f, 0xfc, 0x3f, 0xfe, 0x3f, 0xfe, 0x9f, 0xfc, 0xcf, 0xf9, 0xe7, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; +#endif + +static const unsigned char left_bits[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xfe, 0x3f, 0xfe, + 0x1f, 0xfe, 0x0f, 0xfe, 0x1f, 0xfe, 0x3f, 0xfe, 0x7f, 0xfe, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + +static const unsigned char right_bits[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x9f, 0xff, 0x1f, 0xff, + 0x1f, 0xfe, 0x1f, 0xfc, 0x1f, 0xfe, 0x1f, 0xff, 0x9f, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + +static const unsigned char list_bits[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0f, 0xf8, 0xff, 0xff, 0x0f, 0xf8, 0x1f, 0xfc, 0x3f, 0xfe, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + + + + + + +// -- wxAuiGenericTabArt class implementation -- + +wxAuiGenericTabArt::wxAuiGenericTabArt() +{ + m_normalFont = *wxNORMAL_FONT; + m_selectedFont = *wxNORMAL_FONT; + m_selectedFont.SetWeight(wxBOLD); + m_measuringFont = m_selectedFont; + + m_fixedTabWidth = 100; + m_tabCtrlHeight = 0; + +#if defined( __WXMAC__ ) && wxOSX_USE_COCOA_OR_CARBON + wxColor baseColour = wxColour( wxMacCreateCGColorFromHITheme(kThemeBrushToolbarBackground)); +#else + wxColor baseColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); +#endif + + // the baseColour is too pale to use as our base colour, + // so darken it a bit -- + if ((255-baseColour.Red()) + + (255-baseColour.Green()) + + (255-baseColour.Blue()) < 60) + { + baseColour = baseColour.ChangeLightness(92); + } + + m_activeColour = baseColour; + m_baseColour = baseColour; + wxColor borderColour = baseColour.ChangeLightness(75); + + m_borderPen = wxPen(borderColour); + m_baseColourPen = wxPen(m_baseColour); + m_baseColourBrush = wxBrush(m_baseColour); + + m_activeCloseBmp = wxAuiBitmapFromBits(close_bits, 16, 16, *wxBLACK); + m_disabledCloseBmp = wxAuiBitmapFromBits(close_bits, 16, 16, wxColour(128,128,128)); + + m_activeLeftBmp = wxAuiBitmapFromBits(left_bits, 16, 16, *wxBLACK); + m_disabledLeftBmp = wxAuiBitmapFromBits(left_bits, 16, 16, wxColour(128,128,128)); + + m_activeRightBmp = wxAuiBitmapFromBits(right_bits, 16, 16, *wxBLACK); + m_disabledRightBmp = wxAuiBitmapFromBits(right_bits, 16, 16, wxColour(128,128,128)); + + m_activeWindowListBmp = wxAuiBitmapFromBits(list_bits, 16, 16, *wxBLACK); + m_disabledWindowListBmp = wxAuiBitmapFromBits(list_bits, 16, 16, wxColour(128,128,128)); + + m_flags = 0; +} + +wxAuiGenericTabArt::~wxAuiGenericTabArt() +{ +} + +wxAuiTabArt* wxAuiGenericTabArt::Clone() +{ + return new wxAuiGenericTabArt(*this); +} + +void wxAuiGenericTabArt::SetFlags(unsigned int flags) +{ + m_flags = flags; +} + +void wxAuiGenericTabArt::SetSizingInfo(const wxSize& tab_ctrl_size, + size_t tab_count) +{ + m_fixedTabWidth = 100; + + int tot_width = (int)tab_ctrl_size.x - GetIndentSize() - 4; + + if (m_flags & wxAUI_NB_CLOSE_BUTTON) + tot_width -= m_activeCloseBmp.GetWidth(); + if (m_flags & wxAUI_NB_WINDOWLIST_BUTTON) + tot_width -= m_activeWindowListBmp.GetWidth(); + + if (tab_count > 0) + { + m_fixedTabWidth = tot_width/(int)tab_count; + } + + + if (m_fixedTabWidth < 100) + m_fixedTabWidth = 100; + + if (m_fixedTabWidth > tot_width/2) + m_fixedTabWidth = tot_width/2; + + if (m_fixedTabWidth > 220) + m_fixedTabWidth = 220; + + m_tabCtrlHeight = tab_ctrl_size.y; +} + + +void wxAuiGenericTabArt::DrawBackground(wxDC& dc, + wxWindow* WXUNUSED(wnd), + const wxRect& rect) +{ + // draw background + + wxColor top_color = m_baseColour.ChangeLightness(90); + wxColor bottom_color = m_baseColour.ChangeLightness(170); + wxRect r; + + if (m_flags &wxAUI_NB_BOTTOM) + r = wxRect(rect.x, rect.y, rect.width+2, rect.height); + // TODO: else if (m_flags &wxAUI_NB_LEFT) {} + // TODO: else if (m_flags &wxAUI_NB_RIGHT) {} + else //for wxAUI_NB_TOP + r = wxRect(rect.x, rect.y, rect.width+2, rect.height-3); + + dc.GradientFillLinear(r, top_color, bottom_color, wxSOUTH); + + + // draw base lines + + dc.SetPen(m_borderPen); + int y = rect.GetHeight(); + int w = rect.GetWidth(); + + if (m_flags &wxAUI_NB_BOTTOM) + { + dc.SetBrush(wxBrush(bottom_color)); + dc.DrawRectangle(-1, 0, w+2, 4); + } + // TODO: else if (m_flags &wxAUI_NB_LEFT) {} + // TODO: else if (m_flags &wxAUI_NB_RIGHT) {} + else //for wxAUI_NB_TOP + { + dc.SetBrush(m_baseColourBrush); + dc.DrawRectangle(-1, y-4, w+2, 4); + } +} + + +// DrawTab() draws an individual tab. +// +// dc - output dc +// in_rect - rectangle the tab should be confined to +// caption - tab's caption +// active - whether or not the tab is active +// out_rect - actual output rectangle +// x_extent - the advance x; where the next tab should start + +void wxAuiGenericTabArt::DrawTab(wxDC& dc, + wxWindow* wnd, + const wxAuiNotebookPage& page, + const wxRect& in_rect, + int close_button_state, + wxRect* out_tab_rect, + wxRect* out_button_rect, + int* x_extent) +{ + wxCoord normal_textx, normal_texty; + wxCoord selected_textx, selected_texty; + wxCoord texty; + + // if the caption is empty, measure some temporary text + wxString caption = page.caption; + if (caption.empty()) + caption = wxT("Xj"); + + dc.SetFont(m_selectedFont); + dc.GetTextExtent(caption, &selected_textx, &selected_texty); + + dc.SetFont(m_normalFont); + dc.GetTextExtent(caption, &normal_textx, &normal_texty); + + // figure out the size of the tab + wxSize tab_size = GetTabSize(dc, + wnd, + page.caption, + page.bitmap, + page.active, + close_button_state, + x_extent); + + wxCoord tab_height = m_tabCtrlHeight - 3; + wxCoord tab_width = tab_size.x; + wxCoord tab_x = in_rect.x; + wxCoord tab_y = in_rect.y + in_rect.height - tab_height; + + + caption = page.caption; + + + // select pen, brush and font for the tab to be drawn + + if (page.active) + { + dc.SetFont(m_selectedFont); + texty = selected_texty; + } + else + { + dc.SetFont(m_normalFont); + texty = normal_texty; + } + + + // create points that will make the tab outline + + int clip_width = tab_width; + if (tab_x + clip_width > in_rect.x + in_rect.width) + clip_width = (in_rect.x + in_rect.width) - tab_x; + +/* + wxPoint clip_points[6]; + clip_points[0] = wxPoint(tab_x, tab_y+tab_height-3); + clip_points[1] = wxPoint(tab_x, tab_y+2); + clip_points[2] = wxPoint(tab_x+2, tab_y); + clip_points[3] = wxPoint(tab_x+clip_width-1, tab_y); + clip_points[4] = wxPoint(tab_x+clip_width+1, tab_y+2); + clip_points[5] = wxPoint(tab_x+clip_width+1, tab_y+tab_height-3); + + // FIXME: these ports don't provide wxRegion ctor from array of points +#if !defined(__WXDFB__) && !defined(__WXCOCOA__) + // set the clipping region for the tab -- + wxRegion clipping_region(WXSIZEOF(clip_points), clip_points); + dc.SetClippingRegion(clipping_region); +#endif // !wxDFB && !wxCocoa +*/ + // since the above code above doesn't play well with WXDFB or WXCOCOA, + // we'll just use a rectangle for the clipping region for now -- + dc.SetClippingRegion(tab_x, tab_y, clip_width+1, tab_height-3); + + + wxPoint border_points[6]; + if (m_flags &wxAUI_NB_BOTTOM) + { + border_points[0] = wxPoint(tab_x, tab_y); + border_points[1] = wxPoint(tab_x, tab_y+tab_height-6); + border_points[2] = wxPoint(tab_x+2, tab_y+tab_height-4); + border_points[3] = wxPoint(tab_x+tab_width-2, tab_y+tab_height-4); + border_points[4] = wxPoint(tab_x+tab_width, tab_y+tab_height-6); + border_points[5] = wxPoint(tab_x+tab_width, tab_y); + } + else //if (m_flags & wxAUI_NB_TOP) {} + { + border_points[0] = wxPoint(tab_x, tab_y+tab_height-4); + border_points[1] = wxPoint(tab_x, tab_y+2); + border_points[2] = wxPoint(tab_x+2, tab_y); + border_points[3] = wxPoint(tab_x+tab_width-2, tab_y); + border_points[4] = wxPoint(tab_x+tab_width, tab_y+2); + border_points[5] = wxPoint(tab_x+tab_width, tab_y+tab_height-4); + } + // TODO: else if (m_flags &wxAUI_NB_LEFT) {} + // TODO: else if (m_flags &wxAUI_NB_RIGHT) {} + + int drawn_tab_yoff = border_points[1].y; + int drawn_tab_height = border_points[0].y - border_points[1].y; + + + if (page.active) + { + // draw active tab + + // draw base background color + wxRect r(tab_x, tab_y, tab_width, tab_height); + dc.SetPen(wxPen(m_activeColour)); + dc.SetBrush(wxBrush(m_activeColour)); + dc.DrawRectangle(r.x+1, r.y+1, r.width-1, r.height-4); + + // this white helps fill out the gradient at the top of the tab + dc.SetPen(*wxWHITE_PEN); + dc.SetBrush(*wxWHITE_BRUSH); + dc.DrawRectangle(r.x+2, r.y+1, r.width-3, r.height-4); + + // these two points help the rounded corners appear more antialiased + dc.SetPen(wxPen(m_activeColour)); + dc.DrawPoint(r.x+2, r.y+1); + dc.DrawPoint(r.x+r.width-2, r.y+1); + + // set rectangle down a bit for gradient drawing + r.SetHeight(r.GetHeight()/2); + r.x += 2; + r.width -= 3; + r.y += r.height; + r.y -= 2; + + // draw gradient background + wxColor top_color = *wxWHITE; + wxColor bottom_color = m_activeColour; + dc.GradientFillLinear(r, bottom_color, top_color, wxNORTH); + } + else + { + // draw inactive tab + + wxRect r(tab_x, tab_y+1, tab_width, tab_height-3); + + // start the gradent up a bit and leave the inside border inset + // by a pixel for a 3D look. Only the top half of the inactive + // tab will have a slight gradient + r.x += 3; + r.y++; + r.width -= 4; + r.height /= 2; + r.height--; + + // -- draw top gradient fill for glossy look + wxColor top_color = m_baseColour; + wxColor bottom_color = top_color.ChangeLightness(160); + dc.GradientFillLinear(r, bottom_color, top_color, wxNORTH); + + r.y += r.height; + r.y--; + + // -- draw bottom fill for glossy look + top_color = m_baseColour; + bottom_color = m_baseColour; + dc.GradientFillLinear(r, top_color, bottom_color, wxSOUTH); + } + + // draw tab outline + dc.SetPen(m_borderPen); + dc.SetBrush(*wxTRANSPARENT_BRUSH); + dc.DrawPolygon(WXSIZEOF(border_points), border_points); + + // there are two horizontal grey lines at the bottom of the tab control, + // this gets rid of the top one of those lines in the tab control + if (page.active) + { + if (m_flags &wxAUI_NB_BOTTOM) + dc.SetPen(wxPen(m_baseColour.ChangeLightness(170))); + // TODO: else if (m_flags &wxAUI_NB_LEFT) {} + // TODO: else if (m_flags &wxAUI_NB_RIGHT) {} + else //for wxAUI_NB_TOP + dc.SetPen(m_baseColourPen); + dc.DrawLine(border_points[0].x+1, + border_points[0].y, + border_points[5].x, + border_points[5].y); + } + + + int text_offset = tab_x + 8; + int close_button_width = 0; + if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN) + { + close_button_width = m_activeCloseBmp.GetWidth(); + } + + int bitmap_offset = 0; + if (page.bitmap.IsOk()) + { + bitmap_offset = tab_x + 8; + + // draw bitmap + dc.DrawBitmap(page.bitmap, + bitmap_offset, + drawn_tab_yoff + (drawn_tab_height/2) - (page.bitmap.GetHeight()/2), + true); + + text_offset = bitmap_offset + page.bitmap.GetWidth(); + text_offset += 3; // bitmap padding + + } + else + { + text_offset = tab_x + 8; + } + + + wxString draw_text = wxAuiChopText(dc, + caption, + tab_width - (text_offset-tab_x) - close_button_width); + + // draw tab text + dc.DrawText(draw_text, + text_offset, + drawn_tab_yoff + (drawn_tab_height)/2 - (texty/2) - 1); + + // draw focus rectangle + if (page.active && (wnd->FindFocus() == wnd)) + { + wxRect focusRectText(text_offset, (drawn_tab_yoff + (drawn_tab_height)/2 - (texty/2) - 1), + selected_textx, selected_texty); + + wxRect focusRect; + wxRect focusRectBitmap; + + if (page.bitmap.IsOk()) + focusRectBitmap = wxRect(bitmap_offset, drawn_tab_yoff + (drawn_tab_height/2) - (page.bitmap.GetHeight()/2), + page.bitmap.GetWidth(), page.bitmap.GetHeight()); + + if (page.bitmap.IsOk() && draw_text.IsEmpty()) + focusRect = focusRectBitmap; + else if (!page.bitmap.IsOk() && !draw_text.IsEmpty()) + focusRect = focusRectText; + else if (page.bitmap.IsOk() && !draw_text.IsEmpty()) + focusRect = focusRectText.Union(focusRectBitmap); + + focusRect.Inflate(2, 2); + + wxRendererNative::Get().DrawFocusRect(wnd, dc, focusRect, 0); + } + + // draw close button if necessary + if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN) + { + wxBitmap bmp = m_disabledCloseBmp; + + if (close_button_state == wxAUI_BUTTON_STATE_HOVER || + close_button_state == wxAUI_BUTTON_STATE_PRESSED) + { + bmp = m_activeCloseBmp; + } + + int offsetY = tab_y-1; + if (m_flags & wxAUI_NB_BOTTOM) + offsetY = 1; + + wxRect rect(tab_x + tab_width - close_button_width - 1, + offsetY + (tab_height/2) - (bmp.GetHeight()/2), + close_button_width, + tab_height); + + IndentPressedBitmap(&rect, close_button_state); + dc.DrawBitmap(bmp, rect.x, rect.y, true); + + *out_button_rect = rect; + } + + *out_tab_rect = wxRect(tab_x, tab_y, tab_width, tab_height); + + dc.DestroyClippingRegion(); +} + +int wxAuiGenericTabArt::GetIndentSize() +{ + return 5; +} + +wxSize wxAuiGenericTabArt::GetTabSize(wxDC& dc, + wxWindow* WXUNUSED(wnd), + const wxString& caption, + const wxBitmap& bitmap, + bool WXUNUSED(active), + int close_button_state, + int* x_extent) +{ + wxCoord measured_textx, measured_texty, tmp; + + dc.SetFont(m_measuringFont); + dc.GetTextExtent(caption, &measured_textx, &measured_texty); + + dc.GetTextExtent(wxT("ABCDEFXj"), &tmp, &measured_texty); + + // add padding around the text + wxCoord tab_width = measured_textx; + wxCoord tab_height = measured_texty; + + // if the close button is showing, add space for it + if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN) + tab_width += m_activeCloseBmp.GetWidth() + 3; + + // if there's a bitmap, add space for it + if (bitmap.IsOk()) + { + tab_width += bitmap.GetWidth(); + tab_width += 3; // right side bitmap padding + tab_height = wxMax(tab_height, bitmap.GetHeight()); + } + + // add padding + tab_width += 16; + tab_height += 10; + + if (m_flags & wxAUI_NB_TAB_FIXED_WIDTH) + { + tab_width = m_fixedTabWidth; + } + + *x_extent = tab_width; + + return wxSize(tab_width, tab_height); +} + + +void wxAuiGenericTabArt::DrawButton(wxDC& dc, + wxWindow* WXUNUSED(wnd), + const wxRect& in_rect, + int bitmap_id, + int button_state, + int orientation, + wxRect* out_rect) +{ + wxBitmap bmp; + wxRect rect; + + switch (bitmap_id) + { + case wxAUI_BUTTON_CLOSE: + if (button_state & wxAUI_BUTTON_STATE_DISABLED) + bmp = m_disabledCloseBmp; + else + bmp = m_activeCloseBmp; + break; + case wxAUI_BUTTON_LEFT: + if (button_state & wxAUI_BUTTON_STATE_DISABLED) + bmp = m_disabledLeftBmp; + else + bmp = m_activeLeftBmp; + break; + case wxAUI_BUTTON_RIGHT: + if (button_state & wxAUI_BUTTON_STATE_DISABLED) + bmp = m_disabledRightBmp; + else + bmp = m_activeRightBmp; + break; + case wxAUI_BUTTON_WINDOWLIST: + if (button_state & wxAUI_BUTTON_STATE_DISABLED) + bmp = m_disabledWindowListBmp; + else + bmp = m_activeWindowListBmp; + break; + } + + + if (!bmp.IsOk()) + return; + + rect = in_rect; + + if (orientation == wxLEFT) + { + rect.SetX(in_rect.x); + rect.SetY(((in_rect.y + in_rect.height)/2) - (bmp.GetHeight()/2)); + rect.SetWidth(bmp.GetWidth()); + rect.SetHeight(bmp.GetHeight()); + } + else + { + rect = wxRect(in_rect.x + in_rect.width - bmp.GetWidth(), + ((in_rect.y + in_rect.height)/2) - (bmp.GetHeight()/2), + bmp.GetWidth(), bmp.GetHeight()); + } + + IndentPressedBitmap(&rect, button_state); + dc.DrawBitmap(bmp, rect.x, rect.y, true); + + *out_rect = rect; +} + +int wxAuiGenericTabArt::ShowDropDown(wxWindow* wnd, + const wxAuiNotebookPageArray& pages, + int /*active_idx*/) +{ + wxMenu menuPopup; + + size_t i, count = pages.GetCount(); + for (i = 0; i < count; ++i) + { + const wxAuiNotebookPage& page = pages.Item(i); + wxString caption = page.caption; + + // if there is no caption, make it a space. This will prevent + // an assert in the menu code. + if (caption.IsEmpty()) + caption = wxT(" "); + + wxMenuItem* item = new wxMenuItem(NULL, 1000+i, caption); + if (page.bitmap.IsOk()) + item->SetBitmap(page.bitmap); + menuPopup.Append(item); + } + + // find out where to put the popup menu of window items + wxPoint pt = ::wxGetMousePosition(); + pt = wnd->ScreenToClient(pt); + + // find out the screen coordinate at the bottom of the tab ctrl + wxRect cli_rect = wnd->GetClientRect(); + pt.y = cli_rect.y + cli_rect.height; + + wxAuiCommandCapture* cc = new wxAuiCommandCapture; + wnd->PushEventHandler(cc); + wnd->PopupMenu(&menuPopup, pt); + int command = cc->GetCommandId(); + wnd->PopEventHandler(true); + + if (command >= 1000) + return command-1000; + + return -1; +} + +int wxAuiGenericTabArt::GetBestTabCtrlSize(wxWindow* wnd, + const wxAuiNotebookPageArray& pages, + const wxSize& requiredBmp_size) +{ + wxClientDC dc(wnd); + dc.SetFont(m_measuringFont); + + // sometimes a standard bitmap size needs to be enforced, especially + // if some tabs have bitmaps and others don't. This is important because + // it prevents the tab control from resizing when tabs are added. + wxBitmap measureBmp; + if (requiredBmp_size.IsFullySpecified()) + { + measureBmp.Create(requiredBmp_size.x, + requiredBmp_size.y); + } + + + int max_y = 0; + size_t i, page_count = pages.GetCount(); + for (i = 0; i < page_count; ++i) + { + wxAuiNotebookPage& page = pages.Item(i); + + wxBitmap bmp; + if (measureBmp.IsOk()) + bmp = measureBmp; + else + bmp = page.bitmap; + + // we don't use the caption text because we don't + // want tab heights to be different in the case + // of a very short piece of text on one tab and a very + // tall piece of text on another tab + int x_ext = 0; + wxSize s = GetTabSize(dc, + wnd, + wxT("ABCDEFGHIj"), + bmp, + true, + wxAUI_BUTTON_STATE_HIDDEN, + &x_ext); + + max_y = wxMax(max_y, s.y); + } + + return max_y+2; +} + +void wxAuiGenericTabArt::SetNormalFont(const wxFont& font) +{ + m_normalFont = font; +} + +void wxAuiGenericTabArt::SetSelectedFont(const wxFont& font) +{ + m_selectedFont = font; +} + +void wxAuiGenericTabArt::SetMeasuringFont(const wxFont& font) +{ + m_measuringFont = font; +} + +void wxAuiGenericTabArt::SetColour(const wxColour& colour) +{ + m_baseColour = colour; + m_borderPen = wxPen(m_baseColour.ChangeLightness(75)); + m_baseColourPen = wxPen(m_baseColour); + m_baseColourBrush = wxBrush(m_baseColour); +} + +void wxAuiGenericTabArt::SetActiveColour(const wxColour& colour) +{ + m_activeColour = colour; +} + +// -- wxAuiSimpleTabArt class implementation -- + +wxAuiSimpleTabArt::wxAuiSimpleTabArt() +{ + m_normalFont = *wxNORMAL_FONT; + m_selectedFont = *wxNORMAL_FONT; + m_selectedFont.SetWeight(wxBOLD); + m_measuringFont = m_selectedFont; + + m_flags = 0; + m_fixedTabWidth = 100; + + wxColour baseColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); + + wxColour backgroundColour = baseColour; + wxColour normaltabColour = baseColour; + wxColour selectedtabColour = *wxWHITE; + + m_bkBrush = wxBrush(backgroundColour); + m_normalBkBrush = wxBrush(normaltabColour); + m_normalBkPen = wxPen(normaltabColour); + m_selectedBkBrush = wxBrush(selectedtabColour); + m_selectedBkPen = wxPen(selectedtabColour); + + m_activeCloseBmp = wxAuiBitmapFromBits(close_bits, 16, 16, *wxBLACK); + m_disabledCloseBmp = wxAuiBitmapFromBits(close_bits, 16, 16, wxColour(128,128,128)); + + m_activeLeftBmp = wxAuiBitmapFromBits(left_bits, 16, 16, *wxBLACK); + m_disabledLeftBmp = wxAuiBitmapFromBits(left_bits, 16, 16, wxColour(128,128,128)); + + m_activeRightBmp = wxAuiBitmapFromBits(right_bits, 16, 16, *wxBLACK); + m_disabledRightBmp = wxAuiBitmapFromBits(right_bits, 16, 16, wxColour(128,128,128)); + + m_activeWindowListBmp = wxAuiBitmapFromBits(list_bits, 16, 16, *wxBLACK); + m_disabledWindowListBmp = wxAuiBitmapFromBits(list_bits, 16, 16, wxColour(128,128,128)); + +} + +wxAuiSimpleTabArt::~wxAuiSimpleTabArt() +{ +} + +wxAuiTabArt* wxAuiSimpleTabArt::Clone() +{ + return new wxAuiSimpleTabArt(*this); +} + +void wxAuiSimpleTabArt::SetFlags(unsigned int flags) +{ + m_flags = flags; +} + +void wxAuiSimpleTabArt::SetSizingInfo(const wxSize& tab_ctrl_size, + size_t tab_count) +{ + m_fixedTabWidth = 100; + + int tot_width = (int)tab_ctrl_size.x - GetIndentSize() - 4; + + if (m_flags & wxAUI_NB_CLOSE_BUTTON) + tot_width -= m_activeCloseBmp.GetWidth(); + if (m_flags & wxAUI_NB_WINDOWLIST_BUTTON) + tot_width -= m_activeWindowListBmp.GetWidth(); + + if (tab_count > 0) + { + m_fixedTabWidth = tot_width/(int)tab_count; + } + + + if (m_fixedTabWidth < 100) + m_fixedTabWidth = 100; + + if (m_fixedTabWidth > tot_width/2) + m_fixedTabWidth = tot_width/2; + + if (m_fixedTabWidth > 220) + m_fixedTabWidth = 220; +} + +void wxAuiSimpleTabArt::SetColour(const wxColour& colour) +{ + m_bkBrush = wxBrush(colour); + m_normalBkBrush = wxBrush(colour); + m_normalBkPen = wxPen(colour); +} + +void wxAuiSimpleTabArt::SetActiveColour(const wxColour& colour) +{ + m_selectedBkBrush = wxBrush(colour); + m_selectedBkPen = wxPen(colour); +} + +void wxAuiSimpleTabArt::DrawBackground(wxDC& dc, + wxWindow* WXUNUSED(wnd), + const wxRect& rect) +{ + // draw background + dc.SetBrush(m_bkBrush); + dc.SetPen(*wxTRANSPARENT_PEN); + dc.DrawRectangle(-1, -1, rect.GetWidth()+2, rect.GetHeight()+2); + + // draw base line + dc.SetPen(*wxGREY_PEN); + dc.DrawLine(0, rect.GetHeight()-1, rect.GetWidth(), rect.GetHeight()-1); +} + + +// DrawTab() draws an individual tab. +// +// dc - output dc +// in_rect - rectangle the tab should be confined to +// caption - tab's caption +// active - whether or not the tab is active +// out_rect - actual output rectangle +// x_extent - the advance x; where the next tab should start + +void wxAuiSimpleTabArt::DrawTab(wxDC& dc, + wxWindow* wnd, + const wxAuiNotebookPage& page, + const wxRect& in_rect, + int close_button_state, + wxRect* out_tab_rect, + wxRect* out_button_rect, + int* x_extent) +{ + wxCoord normal_textx, normal_texty; + wxCoord selected_textx, selected_texty; + wxCoord textx, texty; + + // if the caption is empty, measure some temporary text + wxString caption = page.caption; + if (caption.empty()) + caption = wxT("Xj"); + + dc.SetFont(m_selectedFont); + dc.GetTextExtent(caption, &selected_textx, &selected_texty); + + dc.SetFont(m_normalFont); + dc.GetTextExtent(caption, &normal_textx, &normal_texty); + + // figure out the size of the tab + wxSize tab_size = GetTabSize(dc, + wnd, + page.caption, + page.bitmap, + page.active, + close_button_state, + x_extent); + + wxCoord tab_height = tab_size.y; + wxCoord tab_width = tab_size.x; + wxCoord tab_x = in_rect.x; + wxCoord tab_y = in_rect.y + in_rect.height - tab_height; + + caption = page.caption; + + // select pen, brush and font for the tab to be drawn + + if (page.active) + { + dc.SetPen(m_selectedBkPen); + dc.SetBrush(m_selectedBkBrush); + dc.SetFont(m_selectedFont); + textx = selected_textx; + texty = selected_texty; + } + else + { + dc.SetPen(m_normalBkPen); + dc.SetBrush(m_normalBkBrush); + dc.SetFont(m_normalFont); + textx = normal_textx; + texty = normal_texty; + } + + + // -- draw line -- + + wxPoint points[7]; + points[0].x = tab_x; + points[0].y = tab_y + tab_height - 1; + points[1].x = tab_x + tab_height - 3; + points[1].y = tab_y + 2; + points[2].x = tab_x + tab_height + 3; + points[2].y = tab_y; + points[3].x = tab_x + tab_width - 2; + points[3].y = tab_y; + points[4].x = tab_x + tab_width; + points[4].y = tab_y + 2; + points[5].x = tab_x + tab_width; + points[5].y = tab_y + tab_height - 1; + points[6] = points[0]; + + dc.SetClippingRegion(in_rect); + + dc.DrawPolygon(WXSIZEOF(points) - 1, points); + + dc.SetPen(*wxGREY_PEN); + + //dc.DrawLines(active ? WXSIZEOF(points) - 1 : WXSIZEOF(points), points); + dc.DrawLines(WXSIZEOF(points), points); + + + int text_offset; + + int close_button_width = 0; + if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN) + { + close_button_width = m_activeCloseBmp.GetWidth(); + text_offset = tab_x + (tab_height/2) + ((tab_width-close_button_width)/2) - (textx/2); + } + else + { + text_offset = tab_x + (tab_height/3) + (tab_width/2) - (textx/2); + } + + // set minimum text offset + if (text_offset < tab_x + tab_height) + text_offset = tab_x + tab_height; + + // chop text if necessary + wxString draw_text = wxAuiChopText(dc, + caption, + tab_width - (text_offset-tab_x) - close_button_width); + + // draw tab text + dc.DrawText(draw_text, + text_offset, + (tab_y + tab_height)/2 - (texty/2) + 1); + + + // draw focus rectangle + if (page.active && (wnd->FindFocus() == wnd)) + { + wxRect focusRect(text_offset, ((tab_y + tab_height)/2 - (texty/2) + 1), + selected_textx, selected_texty); + + focusRect.Inflate(2, 2); + + wxRendererNative::Get().DrawFocusRect(wnd, dc, focusRect, 0); + } + + // draw close button if necessary + if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN) + { + wxBitmap bmp; + if (page.active) + bmp = m_activeCloseBmp; + else + bmp = m_disabledCloseBmp; + + wxRect rect(tab_x + tab_width - close_button_width - 1, + tab_y + (tab_height/2) - (bmp.GetHeight()/2) + 1, + close_button_width, + tab_height - 1); + DrawButtons(dc, rect, bmp, *wxWHITE, close_button_state); + + *out_button_rect = rect; + } + + + *out_tab_rect = wxRect(tab_x, tab_y, tab_width, tab_height); + + dc.DestroyClippingRegion(); +} + +int wxAuiSimpleTabArt::GetIndentSize() +{ + return 0; +} + +wxSize wxAuiSimpleTabArt::GetTabSize(wxDC& dc, + wxWindow* WXUNUSED(wnd), + const wxString& caption, + const wxBitmap& WXUNUSED(bitmap), + bool WXUNUSED(active), + int close_button_state, + int* x_extent) +{ + wxCoord measured_textx, measured_texty; + + dc.SetFont(m_measuringFont); + dc.GetTextExtent(caption, &measured_textx, &measured_texty); + + wxCoord tab_height = measured_texty + 4; + wxCoord tab_width = measured_textx + tab_height + 5; + + if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN) + tab_width += m_activeCloseBmp.GetWidth(); + + if (m_flags & wxAUI_NB_TAB_FIXED_WIDTH) + { + tab_width = m_fixedTabWidth; + } + + *x_extent = tab_width - (tab_height/2) - 1; + + return wxSize(tab_width, tab_height); +} + + +void wxAuiSimpleTabArt::DrawButton(wxDC& dc, + wxWindow* WXUNUSED(wnd), + const wxRect& in_rect, + int bitmap_id, + int button_state, + int orientation, + wxRect* out_rect) +{ + wxBitmap bmp; + wxRect rect; + + switch (bitmap_id) + { + case wxAUI_BUTTON_CLOSE: + if (button_state & wxAUI_BUTTON_STATE_DISABLED) + bmp = m_disabledCloseBmp; + else + bmp = m_activeCloseBmp; + break; + case wxAUI_BUTTON_LEFT: + if (button_state & wxAUI_BUTTON_STATE_DISABLED) + bmp = m_disabledLeftBmp; + else + bmp = m_activeLeftBmp; + break; + case wxAUI_BUTTON_RIGHT: + if (button_state & wxAUI_BUTTON_STATE_DISABLED) + bmp = m_disabledRightBmp; + else + bmp = m_activeRightBmp; + break; + case wxAUI_BUTTON_WINDOWLIST: + if (button_state & wxAUI_BUTTON_STATE_DISABLED) + bmp = m_disabledWindowListBmp; + else + bmp = m_activeWindowListBmp; + break; + } + + if (!bmp.IsOk()) + return; + + rect = in_rect; + + if (orientation == wxLEFT) + { + rect.SetX(in_rect.x); + rect.SetY(((in_rect.y + in_rect.height)/2) - (bmp.GetHeight()/2)); + rect.SetWidth(bmp.GetWidth()); + rect.SetHeight(bmp.GetHeight()); + } + else + { + rect = wxRect(in_rect.x + in_rect.width - bmp.GetWidth(), + ((in_rect.y + in_rect.height)/2) - (bmp.GetHeight()/2), + bmp.GetWidth(), bmp.GetHeight()); + } + + + DrawButtons(dc, rect, bmp, *wxWHITE, button_state); + + *out_rect = rect; +} + +int wxAuiSimpleTabArt::ShowDropDown(wxWindow* wnd, + const wxAuiNotebookPageArray& pages, + int active_idx) +{ + wxMenu menuPopup; + + size_t i, count = pages.GetCount(); + for (i = 0; i < count; ++i) + { + const wxAuiNotebookPage& page = pages.Item(i); + menuPopup.AppendCheckItem(1000+i, page.caption); + } + + if (active_idx != -1) + { + menuPopup.Check(1000+active_idx, true); + } + + // find out where to put the popup menu of window + // items. Subtract 100 for now to center the menu + // a bit, until a better mechanism can be implemented + wxPoint pt = ::wxGetMousePosition(); + pt = wnd->ScreenToClient(pt); + if (pt.x < 100) + pt.x = 0; + else + pt.x -= 100; + + // find out the screen coordinate at the bottom of the tab ctrl + wxRect cli_rect = wnd->GetClientRect(); + pt.y = cli_rect.y + cli_rect.height; + + wxAuiCommandCapture* cc = new wxAuiCommandCapture; + wnd->PushEventHandler(cc); + wnd->PopupMenu(&menuPopup, pt); + int command = cc->GetCommandId(); + wnd->PopEventHandler(true); + + if (command >= 1000) + return command-1000; + + return -1; +} + +int wxAuiSimpleTabArt::GetBestTabCtrlSize(wxWindow* wnd, + const wxAuiNotebookPageArray& WXUNUSED(pages), + const wxSize& WXUNUSED(requiredBmp_size)) +{ + wxClientDC dc(wnd); + dc.SetFont(m_measuringFont); + int x_ext = 0; + wxSize s = GetTabSize(dc, + wnd, + wxT("ABCDEFGHIj"), + wxNullBitmap, + true, + wxAUI_BUTTON_STATE_HIDDEN, + &x_ext); + return s.y+3; +} + +void wxAuiSimpleTabArt::SetNormalFont(const wxFont& font) +{ + m_normalFont = font; +} + +void wxAuiSimpleTabArt::SetSelectedFont(const wxFont& font) +{ + m_selectedFont = font; +} + +void wxAuiSimpleTabArt::SetMeasuringFont(const wxFont& font) +{ + m_measuringFont = font; +} + +#endif // wxUSE_AUI -- 2.7.4