Add generic wxMarkupText class implementing handling of markup.

wxMarkupText is a private class that implements generic handling of markup
strings, i.e. can measure them and render them onto a wxDC.

This class will be used for markup support in wxMSW wxButton.

Also add wxMarkupParserAttrOutput which will be useful for other wxMarkupText
implementations.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@67064 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2011-02-27 12:48:21 +00:00
parent e29bf4b056
commit c27126c7bc
14 changed files with 705 additions and 0 deletions

View File

@@ -4612,6 +4612,7 @@ COND_USE_GUI_1_WXUNIV_0___CORE_SRC_OBJECTS = \
monodll_generic_infobar.o \
monodll_listbkg.o \
monodll_logg.o \
monodll_markuptext.o \
monodll_msgdlgg.o \
monodll_numdlgg.o \
monodll_panelg.o \
@@ -4827,6 +4828,7 @@ COND_USE_GUI_1_WXUNIV_1___CORE_SRC_OBJECTS = \
monodll_generic_infobar.o \
monodll_listbkg.o \
monodll_logg.o \
monodll_markuptext.o \
monodll_msgdlgg.o \
monodll_numdlgg.o \
monodll_panelg.o \
@@ -6528,6 +6530,7 @@ COND_USE_GUI_1_WXUNIV_0___CORE_SRC_OBJECTS_1 = \
monolib_generic_infobar.o \
monolib_listbkg.o \
monolib_logg.o \
monolib_markuptext.o \
monolib_msgdlgg.o \
monolib_numdlgg.o \
monolib_panelg.o \
@@ -6743,6 +6746,7 @@ COND_USE_GUI_1_WXUNIV_1___CORE_SRC_OBJECTS_1 = \
monolib_generic_infobar.o \
monolib_listbkg.o \
monolib_logg.o \
monolib_markuptext.o \
monolib_msgdlgg.o \
monolib_numdlgg.o \
monolib_panelg.o \
@@ -8628,6 +8632,7 @@ COND_USE_GUI_1_WXUNIV_0___CORE_SRC_OBJECTS_2 = \
coredll_generic_infobar.o \
coredll_listbkg.o \
coredll_logg.o \
coredll_markuptext.o \
coredll_msgdlgg.o \
coredll_numdlgg.o \
coredll_panelg.o \
@@ -8843,6 +8848,7 @@ COND_USE_GUI_1_WXUNIV_1___CORE_SRC_OBJECTS_2 = \
coredll_generic_infobar.o \
coredll_listbkg.o \
coredll_logg.o \
coredll_markuptext.o \
coredll_msgdlgg.o \
coredll_numdlgg.o \
coredll_panelg.o \
@@ -10206,6 +10212,7 @@ COND_USE_GUI_1_WXUNIV_0___CORE_SRC_OBJECTS_3 = \
corelib_generic_infobar.o \
corelib_listbkg.o \
corelib_logg.o \
corelib_markuptext.o \
corelib_msgdlgg.o \
corelib_numdlgg.o \
corelib_panelg.o \
@@ -10421,6 +10428,7 @@ COND_USE_GUI_1_WXUNIV_1___CORE_SRC_OBJECTS_3 = \
corelib_generic_infobar.o \
corelib_listbkg.o \
corelib_logg.o \
corelib_markuptext.o \
corelib_msgdlgg.o \
corelib_numdlgg.o \
corelib_panelg.o \
@@ -20141,6 +20149,9 @@ monodll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONODLL_ODEP)
@COND_USE_GUI_1@monodll_logg.o: $(srcdir)/src/generic/logg.cpp $(MONODLL_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/generic/logg.cpp
@COND_USE_GUI_1@monodll_markuptext.o: $(srcdir)/src/generic/markuptext.cpp $(MONODLL_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/generic/markuptext.cpp
@COND_USE_GUI_1@monodll_msgdlgg.o: $(srcdir)/src/generic/msgdlgg.cpp $(MONODLL_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/generic/msgdlgg.cpp
@@ -25427,6 +25438,9 @@ monolib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONOLIB_ODEP)
@COND_USE_GUI_1@monolib_logg.o: $(srcdir)/src/generic/logg.cpp $(MONOLIB_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/generic/logg.cpp
@COND_USE_GUI_1@monolib_markuptext.o: $(srcdir)/src/generic/markuptext.cpp $(MONOLIB_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/generic/markuptext.cpp
@COND_USE_GUI_1@monolib_msgdlgg.o: $(srcdir)/src/generic/msgdlgg.cpp $(MONOLIB_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/generic/msgdlgg.cpp
@@ -30893,6 +30907,9 @@ coredll_win32.o: $(srcdir)/src/univ/themes/win32.cpp $(COREDLL_ODEP)
@COND_USE_GUI_1@coredll_logg.o: $(srcdir)/src/generic/logg.cpp $(COREDLL_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/generic/logg.cpp
@COND_USE_GUI_1@coredll_markuptext.o: $(srcdir)/src/generic/markuptext.cpp $(COREDLL_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/generic/markuptext.cpp
@COND_USE_GUI_1@coredll_msgdlgg.o: $(srcdir)/src/generic/msgdlgg.cpp $(COREDLL_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/generic/msgdlgg.cpp
@@ -34862,6 +34879,9 @@ corelib_win32.o: $(srcdir)/src/univ/themes/win32.cpp $(CORELIB_ODEP)
@COND_USE_GUI_1@corelib_logg.o: $(srcdir)/src/generic/logg.cpp $(CORELIB_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/generic/logg.cpp
@COND_USE_GUI_1@corelib_markuptext.o: $(srcdir)/src/generic/markuptext.cpp $(CORELIB_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/generic/markuptext.cpp
@COND_USE_GUI_1@corelib_msgdlgg.o: $(srcdir)/src/generic/msgdlgg.cpp $(CORELIB_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/generic/msgdlgg.cpp

View File

@@ -785,6 +785,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
src/generic/infobar.cpp
src/generic/listbkg.cpp
src/generic/logg.cpp
src/generic/markuptext.cpp
src/generic/msgdlgg.cpp
src/generic/numdlgg.cpp
src/generic/panelg.cpp

View File

@@ -1924,6 +1924,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \
$(OBJS)\monodll_infobar.obj \
$(OBJS)\monodll_listbkg.obj \
$(OBJS)\monodll_logg.obj \
$(OBJS)\monodll_markuptext.obj \
$(OBJS)\monodll_msgdlgg.obj \
$(OBJS)\monodll_numdlgg.obj \
$(OBJS)\monodll_panelg.obj \
@@ -2188,6 +2189,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \
$(OBJS)\monodll_infobar.obj \
$(OBJS)\monodll_listbkg.obj \
$(OBJS)\monodll_logg.obj \
$(OBJS)\monodll_markuptext.obj \
$(OBJS)\monodll_msgdlgg.obj \
$(OBJS)\monodll_numdlgg.obj \
$(OBJS)\monodll_panelg.obj \
@@ -2683,6 +2685,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \
$(OBJS)\monolib_infobar.obj \
$(OBJS)\monolib_listbkg.obj \
$(OBJS)\monolib_logg.obj \
$(OBJS)\monolib_markuptext.obj \
$(OBJS)\monolib_msgdlgg.obj \
$(OBJS)\monolib_numdlgg.obj \
$(OBJS)\monolib_panelg.obj \
@@ -2947,6 +2950,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \
$(OBJS)\monolib_infobar.obj \
$(OBJS)\monolib_listbkg.obj \
$(OBJS)\monolib_logg.obj \
$(OBJS)\monolib_markuptext.obj \
$(OBJS)\monolib_msgdlgg.obj \
$(OBJS)\monolib_numdlgg.obj \
$(OBJS)\monolib_panelg.obj \
@@ -3330,6 +3334,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \
$(OBJS)\coredll_infobar.obj \
$(OBJS)\coredll_listbkg.obj \
$(OBJS)\coredll_logg.obj \
$(OBJS)\coredll_markuptext.obj \
$(OBJS)\coredll_msgdlgg.obj \
$(OBJS)\coredll_numdlgg.obj \
$(OBJS)\coredll_panelg.obj \
@@ -3594,6 +3599,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \
$(OBJS)\coredll_infobar.obj \
$(OBJS)\coredll_listbkg.obj \
$(OBJS)\coredll_logg.obj \
$(OBJS)\coredll_markuptext.obj \
$(OBJS)\coredll_msgdlgg.obj \
$(OBJS)\coredll_numdlgg.obj \
$(OBJS)\coredll_panelg.obj \
@@ -3866,6 +3872,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \
$(OBJS)\corelib_infobar.obj \
$(OBJS)\corelib_listbkg.obj \
$(OBJS)\corelib_logg.obj \
$(OBJS)\corelib_markuptext.obj \
$(OBJS)\corelib_msgdlgg.obj \
$(OBJS)\corelib_numdlgg.obj \
$(OBJS)\corelib_panelg.obj \
@@ -4130,6 +4137,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \
$(OBJS)\corelib_infobar.obj \
$(OBJS)\corelib_listbkg.obj \
$(OBJS)\corelib_logg.obj \
$(OBJS)\corelib_markuptext.obj \
$(OBJS)\corelib_msgdlgg.obj \
$(OBJS)\corelib_numdlgg.obj \
$(OBJS)\corelib_panelg.obj \
@@ -7932,6 +7940,11 @@ $(OBJS)\monodll_logg.obj: ..\..\src\generic\logg.cpp
$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\generic\logg.cpp
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\monodll_markuptext.obj: ..\..\src\generic\markuptext.cpp
$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\generic\markuptext.cpp
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\monodll_msgdlgg.obj: ..\..\src\generic\msgdlgg.cpp
$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\generic\msgdlgg.cpp
@@ -10269,6 +10282,11 @@ $(OBJS)\monolib_logg.obj: ..\..\src\generic\logg.cpp
$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\generic\logg.cpp
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\monolib_markuptext.obj: ..\..\src\generic\markuptext.cpp
$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\generic\markuptext.cpp
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\monolib_msgdlgg.obj: ..\..\src\generic\msgdlgg.cpp
$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\generic\msgdlgg.cpp
@@ -12600,6 +12618,11 @@ $(OBJS)\coredll_logg.obj: ..\..\src\generic\logg.cpp
$(CXX) -q -c -P -o$@ $(COREDLL_CXXFLAGS) ..\..\src\generic\logg.cpp
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\coredll_markuptext.obj: ..\..\src\generic\markuptext.cpp
$(CXX) -q -c -P -o$@ $(COREDLL_CXXFLAGS) ..\..\src\generic\markuptext.cpp
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\coredll_msgdlgg.obj: ..\..\src\generic\msgdlgg.cpp
$(CXX) -q -c -P -o$@ $(COREDLL_CXXFLAGS) ..\..\src\generic\msgdlgg.cpp
@@ -13992,6 +14015,11 @@ $(OBJS)\corelib_logg.obj: ..\..\src\generic\logg.cpp
$(CXX) -q -c -P -o$@ $(CORELIB_CXXFLAGS) ..\..\src\generic\logg.cpp
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\corelib_markuptext.obj: ..\..\src\generic\markuptext.cpp
$(CXX) -q -c -P -o$@ $(CORELIB_CXXFLAGS) ..\..\src\generic\markuptext.cpp
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\corelib_msgdlgg.obj: ..\..\src\generic\msgdlgg.cpp
$(CXX) -q -c -P -o$@ $(CORELIB_CXXFLAGS) ..\..\src\generic\msgdlgg.cpp

View File

@@ -1935,6 +1935,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \
$(OBJS)\monodll_infobar.o \
$(OBJS)\monodll_listbkg.o \
$(OBJS)\monodll_logg.o \
$(OBJS)\monodll_markuptext.o \
$(OBJS)\monodll_msgdlgg.o \
$(OBJS)\monodll_numdlgg.o \
$(OBJS)\monodll_panelg.o \
@@ -2201,6 +2202,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \
$(OBJS)\monodll_infobar.o \
$(OBJS)\monodll_listbkg.o \
$(OBJS)\monodll_logg.o \
$(OBJS)\monodll_markuptext.o \
$(OBJS)\monodll_msgdlgg.o \
$(OBJS)\monodll_numdlgg.o \
$(OBJS)\monodll_panelg.o \
@@ -2700,6 +2702,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \
$(OBJS)\monolib_infobar.o \
$(OBJS)\monolib_listbkg.o \
$(OBJS)\monolib_logg.o \
$(OBJS)\monolib_markuptext.o \
$(OBJS)\monolib_msgdlgg.o \
$(OBJS)\monolib_numdlgg.o \
$(OBJS)\monolib_panelg.o \
@@ -2966,6 +2969,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \
$(OBJS)\monolib_infobar.o \
$(OBJS)\monolib_listbkg.o \
$(OBJS)\monolib_logg.o \
$(OBJS)\monolib_markuptext.o \
$(OBJS)\monolib_msgdlgg.o \
$(OBJS)\monolib_numdlgg.o \
$(OBJS)\monolib_panelg.o \
@@ -3363,6 +3367,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \
$(OBJS)\coredll_infobar.o \
$(OBJS)\coredll_listbkg.o \
$(OBJS)\coredll_logg.o \
$(OBJS)\coredll_markuptext.o \
$(OBJS)\coredll_msgdlgg.o \
$(OBJS)\coredll_numdlgg.o \
$(OBJS)\coredll_panelg.o \
@@ -3629,6 +3634,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \
$(OBJS)\coredll_infobar.o \
$(OBJS)\coredll_listbkg.o \
$(OBJS)\coredll_logg.o \
$(OBJS)\coredll_markuptext.o \
$(OBJS)\coredll_msgdlgg.o \
$(OBJS)\coredll_numdlgg.o \
$(OBJS)\coredll_panelg.o \
@@ -3907,6 +3913,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \
$(OBJS)\corelib_infobar.o \
$(OBJS)\corelib_listbkg.o \
$(OBJS)\corelib_logg.o \
$(OBJS)\corelib_markuptext.o \
$(OBJS)\corelib_msgdlgg.o \
$(OBJS)\corelib_numdlgg.o \
$(OBJS)\corelib_panelg.o \
@@ -4173,6 +4180,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \
$(OBJS)\corelib_infobar.o \
$(OBJS)\corelib_listbkg.o \
$(OBJS)\corelib_logg.o \
$(OBJS)\corelib_markuptext.o \
$(OBJS)\corelib_msgdlgg.o \
$(OBJS)\corelib_numdlgg.o \
$(OBJS)\corelib_panelg.o \
@@ -8082,6 +8090,11 @@ $(OBJS)\monodll_logg.o: ../../src/generic/logg.cpp
$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
endif
ifeq ($(USE_GUI),1)
$(OBJS)\monodll_markuptext.o: ../../src/generic/markuptext.cpp
$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
endif
ifeq ($(USE_GUI),1)
$(OBJS)\monodll_msgdlgg.o: ../../src/generic/msgdlgg.cpp
$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
@@ -10419,6 +10432,11 @@ $(OBJS)\monolib_logg.o: ../../src/generic/logg.cpp
$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
endif
ifeq ($(USE_GUI),1)
$(OBJS)\monolib_markuptext.o: ../../src/generic/markuptext.cpp
$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
endif
ifeq ($(USE_GUI),1)
$(OBJS)\monolib_msgdlgg.o: ../../src/generic/msgdlgg.cpp
$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
@@ -12750,6 +12768,11 @@ $(OBJS)\coredll_logg.o: ../../src/generic/logg.cpp
$(CXX) -c -o $@ $(COREDLL_CXXFLAGS) $(CPPDEPS) $<
endif
ifeq ($(USE_GUI),1)
$(OBJS)\coredll_markuptext.o: ../../src/generic/markuptext.cpp
$(CXX) -c -o $@ $(COREDLL_CXXFLAGS) $(CPPDEPS) $<
endif
ifeq ($(USE_GUI),1)
$(OBJS)\coredll_msgdlgg.o: ../../src/generic/msgdlgg.cpp
$(CXX) -c -o $@ $(COREDLL_CXXFLAGS) $(CPPDEPS) $<
@@ -14142,6 +14165,11 @@ $(OBJS)\corelib_logg.o: ../../src/generic/logg.cpp
$(CXX) -c -o $@ $(CORELIB_CXXFLAGS) $(CPPDEPS) $<
endif
ifeq ($(USE_GUI),1)
$(OBJS)\corelib_markuptext.o: ../../src/generic/markuptext.cpp
$(CXX) -c -o $@ $(CORELIB_CXXFLAGS) $(CPPDEPS) $<
endif
ifeq ($(USE_GUI),1)
$(OBJS)\corelib_msgdlgg.o: ../../src/generic/msgdlgg.cpp
$(CXX) -c -o $@ $(CORELIB_CXXFLAGS) $(CPPDEPS) $<

View File

@@ -2132,6 +2132,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \
$(OBJS)\monodll_infobar.obj \
$(OBJS)\monodll_listbkg.obj \
$(OBJS)\monodll_logg.obj \
$(OBJS)\monodll_markuptext.obj \
$(OBJS)\monodll_msgdlgg.obj \
$(OBJS)\monodll_numdlgg.obj \
$(OBJS)\monodll_panelg.obj \
@@ -2396,6 +2397,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \
$(OBJS)\monodll_infobar.obj \
$(OBJS)\monodll_listbkg.obj \
$(OBJS)\monodll_logg.obj \
$(OBJS)\monodll_markuptext.obj \
$(OBJS)\monodll_msgdlgg.obj \
$(OBJS)\monodll_numdlgg.obj \
$(OBJS)\monodll_panelg.obj \
@@ -2897,6 +2899,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \
$(OBJS)\monolib_infobar.obj \
$(OBJS)\monolib_listbkg.obj \
$(OBJS)\monolib_logg.obj \
$(OBJS)\monolib_markuptext.obj \
$(OBJS)\monolib_msgdlgg.obj \
$(OBJS)\monolib_numdlgg.obj \
$(OBJS)\monolib_panelg.obj \
@@ -3161,6 +3164,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \
$(OBJS)\monolib_infobar.obj \
$(OBJS)\monolib_listbkg.obj \
$(OBJS)\monolib_logg.obj \
$(OBJS)\monolib_markuptext.obj \
$(OBJS)\monolib_msgdlgg.obj \
$(OBJS)\monolib_numdlgg.obj \
$(OBJS)\monolib_panelg.obj \
@@ -3610,6 +3614,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \
$(OBJS)\coredll_infobar.obj \
$(OBJS)\coredll_listbkg.obj \
$(OBJS)\coredll_logg.obj \
$(OBJS)\coredll_markuptext.obj \
$(OBJS)\coredll_msgdlgg.obj \
$(OBJS)\coredll_numdlgg.obj \
$(OBJS)\coredll_panelg.obj \
@@ -3874,6 +3879,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \
$(OBJS)\coredll_infobar.obj \
$(OBJS)\coredll_listbkg.obj \
$(OBJS)\coredll_logg.obj \
$(OBJS)\coredll_markuptext.obj \
$(OBJS)\coredll_msgdlgg.obj \
$(OBJS)\coredll_numdlgg.obj \
$(OBJS)\coredll_panelg.obj \
@@ -4152,6 +4158,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \
$(OBJS)\corelib_infobar.obj \
$(OBJS)\corelib_listbkg.obj \
$(OBJS)\corelib_logg.obj \
$(OBJS)\corelib_markuptext.obj \
$(OBJS)\corelib_msgdlgg.obj \
$(OBJS)\corelib_numdlgg.obj \
$(OBJS)\corelib_panelg.obj \
@@ -4416,6 +4423,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \
$(OBJS)\corelib_infobar.obj \
$(OBJS)\corelib_listbkg.obj \
$(OBJS)\corelib_logg.obj \
$(OBJS)\corelib_markuptext.obj \
$(OBJS)\corelib_msgdlgg.obj \
$(OBJS)\corelib_numdlgg.obj \
$(OBJS)\corelib_panelg.obj \
@@ -8512,6 +8520,11 @@ $(OBJS)\monodll_logg.obj: ..\..\src\generic\logg.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\generic\logg.cpp
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\monodll_markuptext.obj: ..\..\src\generic\markuptext.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\generic\markuptext.cpp
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\monodll_msgdlgg.obj: ..\..\src\generic\msgdlgg.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\generic\msgdlgg.cpp
@@ -10849,6 +10862,11 @@ $(OBJS)\monolib_logg.obj: ..\..\src\generic\logg.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\generic\logg.cpp
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\monolib_markuptext.obj: ..\..\src\generic\markuptext.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\generic\markuptext.cpp
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\monolib_msgdlgg.obj: ..\..\src\generic\msgdlgg.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\generic\msgdlgg.cpp
@@ -13180,6 +13198,11 @@ $(OBJS)\coredll_logg.obj: ..\..\src\generic\logg.cpp
$(CXX) /c /nologo /TP /Fo$@ $(COREDLL_CXXFLAGS) ..\..\src\generic\logg.cpp
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\coredll_markuptext.obj: ..\..\src\generic\markuptext.cpp
$(CXX) /c /nologo /TP /Fo$@ $(COREDLL_CXXFLAGS) ..\..\src\generic\markuptext.cpp
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\coredll_msgdlgg.obj: ..\..\src\generic\msgdlgg.cpp
$(CXX) /c /nologo /TP /Fo$@ $(COREDLL_CXXFLAGS) ..\..\src\generic\msgdlgg.cpp
@@ -14572,6 +14595,11 @@ $(OBJS)\corelib_logg.obj: ..\..\src\generic\logg.cpp
$(CXX) /c /nologo /TP /Fo$@ $(CORELIB_CXXFLAGS) ..\..\src\generic\logg.cpp
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\corelib_markuptext.obj: ..\..\src\generic\markuptext.cpp
$(CXX) /c /nologo /TP /Fo$@ $(CORELIB_CXXFLAGS) ..\..\src\generic\markuptext.cpp
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\corelib_msgdlgg.obj: ..\..\src\generic\msgdlgg.cpp
$(CXX) /c /nologo /TP /Fo$@ $(CORELIB_CXXFLAGS) ..\..\src\generic\msgdlgg.cpp

View File

@@ -486,6 +486,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = &
$(OBJS)\monodll_infobar.obj &
$(OBJS)\monodll_listbkg.obj &
$(OBJS)\monodll_logg.obj &
$(OBJS)\monodll_markuptext.obj &
$(OBJS)\monodll_msgdlgg.obj &
$(OBJS)\monodll_numdlgg.obj &
$(OBJS)\monodll_panelg.obj &
@@ -752,6 +753,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = &
$(OBJS)\monodll_infobar.obj &
$(OBJS)\monodll_listbkg.obj &
$(OBJS)\monodll_logg.obj &
$(OBJS)\monodll_markuptext.obj &
$(OBJS)\monodll_msgdlgg.obj &
$(OBJS)\monodll_numdlgg.obj &
$(OBJS)\monodll_panelg.obj &
@@ -1256,6 +1258,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = &
$(OBJS)\monolib_infobar.obj &
$(OBJS)\monolib_listbkg.obj &
$(OBJS)\monolib_logg.obj &
$(OBJS)\monolib_markuptext.obj &
$(OBJS)\monolib_msgdlgg.obj &
$(OBJS)\monolib_numdlgg.obj &
$(OBJS)\monolib_panelg.obj &
@@ -1522,6 +1525,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = &
$(OBJS)\monolib_infobar.obj &
$(OBJS)\monolib_listbkg.obj &
$(OBJS)\monolib_logg.obj &
$(OBJS)\monolib_markuptext.obj &
$(OBJS)\monolib_msgdlgg.obj &
$(OBJS)\monolib_numdlgg.obj &
$(OBJS)\monolib_panelg.obj &
@@ -1930,6 +1934,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = &
$(OBJS)\coredll_infobar.obj &
$(OBJS)\coredll_listbkg.obj &
$(OBJS)\coredll_logg.obj &
$(OBJS)\coredll_markuptext.obj &
$(OBJS)\coredll_msgdlgg.obj &
$(OBJS)\coredll_numdlgg.obj &
$(OBJS)\coredll_panelg.obj &
@@ -2196,6 +2201,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = &
$(OBJS)\coredll_infobar.obj &
$(OBJS)\coredll_listbkg.obj &
$(OBJS)\coredll_logg.obj &
$(OBJS)\coredll_markuptext.obj &
$(OBJS)\coredll_msgdlgg.obj &
$(OBJS)\coredll_numdlgg.obj &
$(OBJS)\coredll_panelg.obj &
@@ -2476,6 +2482,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = &
$(OBJS)\corelib_infobar.obj &
$(OBJS)\corelib_listbkg.obj &
$(OBJS)\corelib_logg.obj &
$(OBJS)\corelib_markuptext.obj &
$(OBJS)\corelib_msgdlgg.obj &
$(OBJS)\corelib_numdlgg.obj &
$(OBJS)\corelib_panelg.obj &
@@ -2742,6 +2749,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = &
$(OBJS)\corelib_infobar.obj &
$(OBJS)\corelib_listbkg.obj &
$(OBJS)\corelib_logg.obj &
$(OBJS)\corelib_markuptext.obj &
$(OBJS)\corelib_msgdlgg.obj &
$(OBJS)\corelib_numdlgg.obj &
$(OBJS)\corelib_panelg.obj &
@@ -8341,6 +8349,11 @@ $(OBJS)\monodll_logg.obj : .AUTODEPEND ..\..\src\generic\logg.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
!endif
!ifeq USE_GUI 1
$(OBJS)\monodll_markuptext.obj : .AUTODEPEND ..\..\src\generic\markuptext.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
!endif
!ifeq USE_GUI 1
$(OBJS)\monodll_msgdlgg.obj : .AUTODEPEND ..\..\src\generic\msgdlgg.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
@@ -10678,6 +10691,11 @@ $(OBJS)\monolib_logg.obj : .AUTODEPEND ..\..\src\generic\logg.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
!endif
!ifeq USE_GUI 1
$(OBJS)\monolib_markuptext.obj : .AUTODEPEND ..\..\src\generic\markuptext.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
!endif
!ifeq USE_GUI 1
$(OBJS)\monolib_msgdlgg.obj : .AUTODEPEND ..\..\src\generic\msgdlgg.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
@@ -13009,6 +13027,11 @@ $(OBJS)\coredll_logg.obj : .AUTODEPEND ..\..\src\generic\logg.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(COREDLL_CXXFLAGS) $<
!endif
!ifeq USE_GUI 1
$(OBJS)\coredll_markuptext.obj : .AUTODEPEND ..\..\src\generic\markuptext.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(COREDLL_CXXFLAGS) $<
!endif
!ifeq USE_GUI 1
$(OBJS)\coredll_msgdlgg.obj : .AUTODEPEND ..\..\src\generic\msgdlgg.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(COREDLL_CXXFLAGS) $<
@@ -14401,6 +14424,11 @@ $(OBJS)\corelib_logg.obj : .AUTODEPEND ..\..\src\generic\logg.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(CORELIB_CXXFLAGS) $<
!endif
!ifeq USE_GUI 1
$(OBJS)\corelib_markuptext.obj : .AUTODEPEND ..\..\src\generic\markuptext.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(CORELIB_CXXFLAGS) $<
!endif
!ifeq USE_GUI 1
$(OBJS)\corelib_msgdlgg.obj : .AUTODEPEND ..\..\src\generic\msgdlgg.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(CORELIB_CXXFLAGS) $<

View File

@@ -3119,6 +3119,10 @@ SOURCE=..\..\src\generic\logg.cpp
# End Source File
# Begin Source File
SOURCE=..\..\src\generic\markuptext.cpp
# End Source File
# Begin Source File
SOURCE=..\..\src\generic\mdig.cpp
!IF "$(CFG)" == "core - Win32 DLL Universal Release"

View File

@@ -2789,6 +2789,9 @@
<File
RelativePath="..\..\src\generic\logg.cpp">
</File>
<File
RelativePath="..\..\src\generic\markuptext.cpp">
</File>
<File
RelativePath="..\..\src\generic\mdig.cpp">
<FileConfiguration

View File

@@ -3752,6 +3752,10 @@
RelativePath="..\..\src\generic\logg.cpp"
>
</File>
<File
RelativePath="..\..\src\generic\markuptext.cpp"
>
</File>
<File
RelativePath="..\..\src\generic\mdig.cpp"
>

View File

@@ -3748,6 +3748,10 @@
RelativePath="..\..\src\generic\logg.cpp"
>
</File>
<File
RelativePath="..\..\src\generic\markuptext.cpp"
>
</File>
<File
RelativePath="..\..\src\generic\mdig.cpp"
>

View File

@@ -0,0 +1,78 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/generic/private/markuptext.h
// Purpose: Generic wxMarkupText class for managing text with markup.
// Author: Vadim Zeitlin
// Created: 2011-02-21
// RCS-ID: $Id: wxhead.h,v 1.12 2010-04-22 12:44:51 zeitlin Exp $
// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_GENERIC_PRIVATE_MARKUPTEXT_H_
#define _WX_GENERIC_PRIVATE_MARKUPTEXT_H_
#include "wx/defs.h"
class WXDLLIMPEXP_FWD_CORE wxDC;
class WXDLLIMPEXP_FWD_CORE wxRect;
// ----------------------------------------------------------------------------
// wxMarkupText: allows to measure and draw the text containing markup.
// ----------------------------------------------------------------------------
class WXDLLIMPEXP_CORE wxMarkupText
{
public:
// Constants for Render() flags.
enum
{
Render_Default = 0, // Don't show mnemonics visually.
Render_ShowAccels = 1 // Underline mnemonics.
};
// Initialize with the given string containing markup (which is supposed to
// be valid, the caller must check for it before constructing this object).
//
// Notice that the usual rules for mnemonics apply to the markup text: if
// it contains any '&' characters they must be escaped by doubling them,
// otherwise they indicate that the next character is the mnemonic for this
// field.
//
// TODO-MULTILINE-MARKUP: Currently only single line labels are supported,
// search for other occurrences of this comment to find the places which
// need to be updated to support multiline labels with markup.
wxMarkupText(const wxString& markup)
: m_markup(markup)
{
}
// Default copy ctor, assignment operator and dtor are ok.
// Update the markup string.
//
// The same rules for mnemonics as in the ctor apply to this string.
void SetMarkup(const wxString& markup) { m_markup = markup; }
// Return the width and height required by the given string and optionally
// the height of the visible part above the baseline (i.e. ascent minus
// internal leading).
//
// The font currently selected into the DC is used for measuring (notice
// that it is changed by this function but normally -- i.e. if markup is
// valid -- restored to its original value when it returns).
wxSize Measure(wxDC& dc, int *visibleHeight = NULL) const;
// Render the markup string into the given DC in the specified rectangle.
//
// Notice that while the function uses the provided rectangle for alignment
// (it centers the text in it), no clipping is done by it so use Measure()
// and set the clipping region before rendering if necessary.
void Render(wxDC& dc, const wxRect& rect, int flags);
private:
wxString m_markup;
};
#endif // _WX_GENERIC_PRIVATE_MARKUPTEXT_H_

View File

@@ -70,6 +70,10 @@ struct wxMarkupSpanAttributes
// wxMarkupParserOutput: gathers the results of parsing markup.
// ----------------------------------------------------------------------------
// A class deriving directly from this one needs to implement all the pure
// virtual functions below but as the handling of all simple tags (bold, italic
// &c) is often very similar, it is usually more convenient to inherit from
// wxMarkupParserFontOutput defined in wx/private/markupparserfont.h instead.
class wxMarkupParserOutput
{
public:

View File

@@ -0,0 +1,222 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/markupparserattr.h
// Purpose: Classes mapping markup attributes to wxFont/wxColour.
// Author: Vadim Zeitlin
// Created: 2011-02-18
// RCS-ID: $Id: wxhead.h,v 1.12 2010-04-22 12:44:51 zeitlin Exp $
// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_MARKUPPARSERATTR_H_
#define _WX_PRIVATE_MARKUPPARSERATTR_H_
#include "wx/private/markupparser.h"
#include "wx/stack.h"
#include "wx/colour.h"
#include "wx/font.h"
// ----------------------------------------------------------------------------
// wxMarkupParserAttrOutput: simplified wxFont-using version of the above.
// ----------------------------------------------------------------------------
// This class assumes that wxFont and wxColour are used to perform all the
// markup tags and implements the base class virtual functions in terms of
// OnAttr{Start,End}() only.
//
// Notice that you still must implement OnText() inherited from the base class
// when deriving from this one.
class wxMarkupParserAttrOutput : public wxMarkupParserOutput
{
public:
// A simple container of font and colours.
struct Attr
{
Attr(const wxFont& font_,
const wxColour& foreground_ = wxColour(),
const wxColour& background_ = wxColour())
: font(font_), foreground(foreground_), background(background_)
{
}
wxFont font;
wxColour foreground,
background;
};
// This object must be initialized with the font and colours to use
// initially, i.e. the ones used before any tags in the string.
wxMarkupParserAttrOutput(const wxFont& font,
const wxColour& foreground,
const wxColour& background)
{
m_attrs.push(Attr(font, foreground, background));
}
// Indicates the change of the font and/or colours used. Any of the
// fields of the argument may be invalid indicating that the corresponding
// attribute didn't actually change.
virtual void OnAttrStart(const Attr& attr) = 0;
// Indicates the end of the region affected by the given attributes
// (the same ones that were passed to the matching OnAttrStart(), use
// GetAttr() to get the ones that will be used from now on).
virtual void OnAttrEnd(const Attr& attr) = 0;
// Implement all pure virtual methods inherited from the base class in
// terms of our own ones.
virtual void OnBoldStart() { DoChangeFont(&wxFont::Bold); }
virtual void OnBoldEnd() { DoEndAttr(); }
virtual void OnItalicStart() { DoChangeFont(&wxFont::Italic); }
virtual void OnItalicEnd() { DoEndAttr(); }
virtual void OnUnderlinedStart() { DoChangeFont(&wxFont::Underlined); }
virtual void OnUnderlinedEnd() { DoEndAttr(); }
virtual void OnStrikethroughStart() { } // TODO: No support in wxFont yet.
virtual void OnStrikethroughEnd() { }
virtual void OnBigStart() { DoChangeFont(&wxFont::Larger); }
virtual void OnBigEnd() { DoEndAttr(); }
virtual void OnSmallStart() { DoChangeFont(&wxFont::Smaller); }
virtual void OnSmallEnd() { DoEndAttr(); }
virtual void OnTeletypeStart()
{
wxFont font(GetFont());
font.SetFamily(wxFONTFAMILY_TELETYPE);
DoSetFont(font);
}
virtual void OnTeletypeEnd() { DoEndAttr(); }
virtual void OnSpanStart(const wxMarkupSpanAttributes& spanAttr)
{
wxFont font(GetFont());
if ( !spanAttr.m_fontFace.empty() )
font.SetFaceName(spanAttr.m_fontFace);
DoApplyToFont<wxFontWeight>(spanAttr.m_isBold, font, &wxFont::SetWeight,
wxFONTWEIGHT_NORMAL, wxFONTWEIGHT_BOLD);
DoApplyToFont<wxFontStyle>(spanAttr.m_isItalic, font, &wxFont::SetStyle,
wxFONTSTYLE_NORMAL, wxFONTSTYLE_ITALIC);
DoApplyToFont(spanAttr.m_isUnderlined, font, &wxFont::SetUnderlined,
false, true);
// TODO: No support for strike-through yet.
switch ( spanAttr.m_sizeKind )
{
case wxMarkupSpanAttributes::Size_Unspecified:
break;
case wxMarkupSpanAttributes::Size_Relative:
if ( spanAttr.m_fontSize > 0 )
font.MakeLarger();
else
font.MakeSmaller();
break;
case wxMarkupSpanAttributes::Size_Symbolic:
// The values of font size intentionally coincide with the
// values of wxFontSymbolicSize enum elements so simply cast
// one to the other.
font.SetSymbolicSize(
static_cast<wxFontSymbolicSize>(spanAttr.m_fontSize)
);
break;
case wxMarkupSpanAttributes::Size_PointParts:
font.SetPointSize((spanAttr.m_fontSize + 1023)/1024);
break;
}
const Attr attr(font, spanAttr.m_fgCol, spanAttr.m_bgCol);
OnAttrStart(attr);
m_attrs.push(attr);
}
virtual void OnSpanEnd(const wxMarkupSpanAttributes& WXUNUSED(spanAttr))
{
DoEndAttr();
}
protected:
// Get the current attributes, i.e. the ones that should be used for
// rendering (or measuring or whatever) the text at the current position in
// the string.
//
// It may be called from OnAttrStart() to get the old attributes used
// before and from OnAttrEnd() to get the new attributes that will be used
// from now on but is mostly meant to be used from overridden OnText()
// implementations.
const Attr& GetAttr() const { return m_attrs.top(); }
// A shortcut for accessing the font of the current attribute.
const wxFont& GetFont() const { return GetAttr().font; }
private:
// Change only the font to the given one. Call OnAttrStart() to notify
// about the change and update the attributes stack.
void DoSetFont(const wxFont& font)
{
const Attr attr(font);
OnAttrStart(attr);
m_attrs.push(attr);
}
// Apply the given function to the font currently on top of the font stack,
// push the new font on the stack and call OnAttrStart() with it.
void DoChangeFont(wxFont (wxFont::*func)() const)
{
DoSetFont((GetFont().*func)());
}
void DoEndAttr()
{
const Attr attr(m_attrs.top());
m_attrs.pop();
OnAttrEnd(attr);
}
template <typename T>
void
DoApplyToFont(wxMarkupSpanAttributes::OptionalBool isIt,
wxFont& font,
void (wxFont::*func)(T),
T noValue,
T yesValue)
{
switch ( isIt )
{
case wxMarkupSpanAttributes::Unspecified:
break;
case wxMarkupSpanAttributes::No:
(font.*func)(noValue);
break;
case wxMarkupSpanAttributes::Yes:
(font.*func)(yesValue);
break;
}
}
wxStack<Attr> m_attrs;
wxDECLARE_NO_COPY_CLASS(wxMarkupParserAttrOutput);
};
#endif // _WX_PRIVATE_MARKUPPARSERATTR_H_

253
src/generic/markuptext.cpp Normal file
View File

@@ -0,0 +1,253 @@
///////////////////////////////////////////////////////////////////////////////
// Name: src/generic/markuptext.cpp
// Purpose: wxMarkupText implementation
// Author: Vadim Zeitlin
// Created: 2011-02-21
// RCS-ID: $Id: wxhead.cpp,v 1.11 2010-04-22 12:44:51 zeitlin Exp $
// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
// ============================================================================
// declarations
// ============================================================================
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
// for compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#if wxUSE_MARKUP
#ifndef WX_PRECOMP
#include "wx/gdicmn.h"
#include "wx/dc.h"
#endif // WX_PRECOMP
#include "wx/generic/private/markuptext.h"
#include "wx/private/markupparserattr.h"
namespace
{
// ----------------------------------------------------------------------------
// wxMarkupParserMeasureOutput: measure the extends of a markup string.
// ----------------------------------------------------------------------------
class wxMarkupParserMeasureOutput : public wxMarkupParserAttrOutput
{
public:
// Initialize the base class with the font to use. As we don't care about
// colours (which don't affect the text measurements), don't bother to
// specify them at all.
wxMarkupParserMeasureOutput(wxDC& dc, int *visibleHeight)
: wxMarkupParserAttrOutput(dc.GetFont(), wxColour(), wxColour()),
m_dc(dc),
m_visibleHeight(visibleHeight)
{
if ( visibleHeight )
*visibleHeight = 0;
}
const wxSize& GetSize() const { return m_size; }
virtual void OnText(const wxString& text_)
{
const wxString text(wxControl::RemoveMnemonics(text_));
// TODO-MULTILINE-MARKUP: Must use GetMultiLineTextExtent().
const wxSize size = m_dc.GetTextExtent(text);
m_size.x += size.x;
if ( size.y > m_size.y )
m_size.y = size.y;
if ( m_visibleHeight )
{
wxFontMetrics tm = m_dc.GetFontMetrics();
int visibleHeight = tm.ascent - tm.internalLeading;
if ( *m_visibleHeight < visibleHeight )
*m_visibleHeight = visibleHeight;
}
}
virtual void OnAttrStart(const Attr& attr)
{
m_dc.SetFont(attr.font);
}
virtual void OnAttrEnd(const Attr& WXUNUSED(attr))
{
m_dc.SetFont(GetFont());
}
private:
wxDC& m_dc;
// The values that we compute.
wxSize m_size;
int * const m_visibleHeight; // may be NULL
wxDECLARE_NO_COPY_CLASS(wxMarkupParserMeasureOutput);
};
// ----------------------------------------------------------------------------
// wxMarkupParserRenderOutput: render a markup string.
// ----------------------------------------------------------------------------
class wxMarkupParserRenderOutput : public wxMarkupParserAttrOutput
{
public:
// Notice that the bottom of rectangle passed to our ctor is used as the
// baseline for the text we draw, i.e. it needs to be adjusted to exclude
// descent by the caller.
wxMarkupParserRenderOutput(wxDC& dc,
const wxRect& rect,
int flags)
: wxMarkupParserAttrOutput(dc.GetFont(),
dc.GetTextForeground(),
wxColour()),
m_dc(dc),
m_rect(rect),
m_flags(flags)
{
m_pos = m_rect.x;
// We don't initialize the base class initial text background colour to
// the valid value because we want to be able to detect when we revert
// to the "absence of background colour" and set the background mode to
// be transparent in OnAttrStart() below. But do remember it to be able
// to restore it there later -- this doesn't affect us as the text
// background isn't used anyhow when the background mode is transparent
// but it might affect the caller if it sets the background mode to
// opaque and draws some text after using us.
m_origTextBackground = dc.GetTextBackground();
}
virtual void OnText(const wxString& text_)
{
wxString text;
int indexAccel = wxControl::FindAccelIndex(text_, &text);
if ( !(m_flags & wxMarkupText::Render_ShowAccels) )
indexAccel = wxNOT_FOUND;
// Adjust the position (unfortunately we need to do this manually as
// there is no notion of current text position in wx API) rectangle to
// ensure that all text segments use the same baseline (as there is
// nothing equivalent to Windows SetTextAlign(TA_BASELINE) neither).
wxRect rect(m_rect);
rect.x = m_pos;
int descent;
m_dc.GetTextExtent(text, &rect.width, &rect.height, &descent);
rect.height -= descent;
rect.y += m_rect.height - rect.height;
wxRect bounds;
m_dc.DrawLabel(text, wxBitmap(),
rect, wxALIGN_LEFT | wxALIGN_TOP,
indexAccel,
&bounds);
// TODO-MULTILINE-MARKUP: Must update vertical position too.
m_pos += bounds.width;
}
virtual void OnAttrStart(const Attr& attr)
{
m_dc.SetFont(attr.font);
if ( attr.foreground.IsOk() )
m_dc.SetTextForeground(attr.foreground);
if ( attr.background.IsOk() )
{
// Setting the background colour is not enough, we must also change
// the mode to ensure that it is actually used.
m_dc.SetBackgroundMode(wxSOLID);
m_dc.SetTextBackground(attr.background);
}
}
virtual void OnAttrEnd(const Attr& attr)
{
// We always restore the font because we always change it...
m_dc.SetFont(GetFont());
// ...but we only need to restore the colours if we had changed them.
if ( attr.foreground.IsOk() )
m_dc.SetTextForeground(GetAttr().foreground);
if ( attr.background.IsOk() )
{
wxColour background = GetAttr().background;
if ( !background.IsOk() )
{
// Invalid background colour indicates that the background
// should actually be made transparent and in this case the
// actual value of background colour doesn't matter but we also
// restore it just in case, see comment in the ctor.
m_dc.SetBackgroundMode(wxTRANSPARENT);
background = m_origTextBackground;
}
m_dc.SetTextBackground(background);
}
}
private:
wxDC& m_dc;
const wxRect m_rect;
const int m_flags;
wxColour m_origTextBackground;
// Current horizontal text output position.
//
// TODO-MULTILINE-MARKUP: Must keep vertical position too.
int m_pos;
wxDECLARE_NO_COPY_CLASS(wxMarkupParserRenderOutput);
};
} // anonymous namespace
// ============================================================================
// wxMarkupText implementation
// ============================================================================
wxSize wxMarkupText::Measure(wxDC& dc, int *visibleHeight) const
{
wxMarkupParserMeasureOutput out(dc, visibleHeight);
wxMarkupParser parser(out);
if ( !parser.Parse(m_markup) )
{
wxFAIL_MSG( "Invalid markup" );
return wxDefaultSize;
}
return out.GetSize();
}
void wxMarkupText::Render(wxDC& dc, const wxRect& rect, int flags)
{
// We want to center the above-baseline parts of the letter vertically, so
// we use the visible height and not the total height (which includes
// descent and internal leading) here.
int visibleHeight;
wxRect rectText(rect.GetPosition(), Measure(dc, &visibleHeight));
rectText.height = visibleHeight;
wxMarkupParserRenderOutput out(dc, rectText.CentreIn(rect), flags);
wxMarkupParser parser(out);
parser.Parse(m_markup);
}
#endif // wxUSE_MARKUP