added support for ellipsization and markup in wxStaticText (modified patch 1629946)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@45199 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2007-04-01 14:13:15 +00:00
parent 9d529fa05c
commit 39bc0347fd
35 changed files with 1387 additions and 280 deletions

View File

@ -3549,6 +3549,7 @@ COND_USE_GUI_1_WXUNIV_0___CORE_SRC_OBJECTS = \
monodll_sizer.o \
monodll_srchcmn.o \
monodll_statbar.o \
monodll_stattextcmn.o \
monodll_stockitem.o \
monodll_tbarbase.o \
monodll_textcmn.o \
@ -3725,6 +3726,7 @@ COND_USE_GUI_1_WXUNIV_1___CORE_SRC_OBJECTS = \
monodll_sizer.o \
monodll_srchcmn.o \
monodll_statbar.o \
monodll_stattextcmn.o \
monodll_stockitem.o \
monodll_tbarbase.o \
monodll_textcmn.o \
@ -5342,6 +5344,7 @@ COND_USE_GUI_1_WXUNIV_0___CORE_SRC_OBJECTS_1 = \
monolib_sizer.o \
monolib_srchcmn.o \
monolib_statbar.o \
monolib_stattextcmn.o \
monolib_stockitem.o \
monolib_tbarbase.o \
monolib_textcmn.o \
@ -5518,6 +5521,7 @@ COND_USE_GUI_1_WXUNIV_1___CORE_SRC_OBJECTS_1 = \
monolib_sizer.o \
monolib_srchcmn.o \
monolib_statbar.o \
monolib_stattextcmn.o \
monolib_stockitem.o \
monolib_tbarbase.o \
monolib_textcmn.o \
@ -7369,6 +7373,7 @@ COND_USE_GUI_1_WXUNIV_0___CORE_SRC_OBJECTS_2 = \
coredll_sizer.o \
coredll_srchcmn.o \
coredll_statbar.o \
coredll_stattextcmn.o \
coredll_stockitem.o \
coredll_tbarbase.o \
coredll_textcmn.o \
@ -7545,6 +7550,7 @@ COND_USE_GUI_1_WXUNIV_1___CORE_SRC_OBJECTS_2 = \
coredll_sizer.o \
coredll_srchcmn.o \
coredll_statbar.o \
coredll_stattextcmn.o \
coredll_stockitem.o \
coredll_tbarbase.o \
coredll_textcmn.o \
@ -8834,6 +8840,7 @@ COND_USE_GUI_1_WXUNIV_0___CORE_SRC_OBJECTS_3 = \
corelib_sizer.o \
corelib_srchcmn.o \
corelib_statbar.o \
corelib_stattextcmn.o \
corelib_stockitem.o \
corelib_tbarbase.o \
corelib_textcmn.o \
@ -9010,6 +9017,7 @@ COND_USE_GUI_1_WXUNIV_1___CORE_SRC_OBJECTS_3 = \
corelib_sizer.o \
corelib_srchcmn.o \
corelib_statbar.o \
corelib_stattextcmn.o \
corelib_stockitem.o \
corelib_tbarbase.o \
corelib_textcmn.o \
@ -16465,6 +16473,9 @@ monodll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONODLL_ODEP)
@COND_USE_GUI_1@monodll_statbar.o: $(srcdir)/src/common/statbar.cpp $(MONODLL_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/statbar.cpp
@COND_USE_GUI_1@monodll_stattextcmn.o: $(srcdir)/src/common/stattextcmn.cpp $(MONODLL_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/stattextcmn.cpp
@COND_USE_GUI_1@monodll_stockitem.o: $(srcdir)/src/common/stockitem.cpp $(MONODLL_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/stockitem.cpp
@ -20620,6 +20631,9 @@ monolib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONOLIB_ODEP)
@COND_USE_GUI_1@monolib_statbar.o: $(srcdir)/src/common/statbar.cpp $(MONOLIB_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/statbar.cpp
@COND_USE_GUI_1@monolib_stattextcmn.o: $(srcdir)/src/common/stattextcmn.cpp $(MONOLIB_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/stattextcmn.cpp
@COND_USE_GUI_1@monolib_stockitem.o: $(srcdir)/src/common/stockitem.cpp $(MONOLIB_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/stockitem.cpp
@ -25135,6 +25149,9 @@ coredll_win32.o: $(srcdir)/src/univ/themes/win32.cpp $(COREDLL_ODEP)
@COND_USE_GUI_1@coredll_statbar.o: $(srcdir)/src/common/statbar.cpp $(COREDLL_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/common/statbar.cpp
@COND_USE_GUI_1@coredll_stattextcmn.o: $(srcdir)/src/common/stattextcmn.cpp $(COREDLL_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/common/stattextcmn.cpp
@COND_USE_GUI_1@coredll_stockitem.o: $(srcdir)/src/common/stockitem.cpp $(COREDLL_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/common/stockitem.cpp
@ -28105,6 +28122,9 @@ corelib_win32.o: $(srcdir)/src/univ/themes/win32.cpp $(CORELIB_ODEP)
@COND_USE_GUI_1@corelib_statbar.o: $(srcdir)/src/common/statbar.cpp $(CORELIB_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/common/statbar.cpp
@COND_USE_GUI_1@corelib_stattextcmn.o: $(srcdir)/src/common/stattextcmn.cpp $(CORELIB_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/common/stattextcmn.cpp
@COND_USE_GUI_1@corelib_stockitem.o: $(srcdir)/src/common/stockitem.cpp $(CORELIB_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/common/stockitem.cpp

View File

@ -651,6 +651,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
src/common/sizer.cpp
src/common/srchcmn.cpp
src/common/statbar.cpp
src/common/stattextcmn.cpp
src/common/stockitem.cpp
src/common/tbarbase.cpp
src/common/textcmn.cpp

View File

@ -1515,6 +1515,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \
$(OBJS)\monodll_sizer.obj \
$(OBJS)\monodll_srchcmn.obj \
$(OBJS)\monodll_statbar.obj \
$(OBJS)\monodll_stattextcmn.obj \
$(OBJS)\monodll_stockitem.obj \
$(OBJS)\monodll_tbarbase.obj \
$(OBJS)\monodll_textcmn.obj \
@ -1742,6 +1743,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \
$(OBJS)\monodll_sizer.obj \
$(OBJS)\monodll_srchcmn.obj \
$(OBJS)\monodll_statbar.obj \
$(OBJS)\monodll_stattextcmn.obj \
$(OBJS)\monodll_stockitem.obj \
$(OBJS)\monodll_tbarbase.obj \
$(OBJS)\monodll_textcmn.obj \
@ -2137,6 +2139,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \
$(OBJS)\monolib_sizer.obj \
$(OBJS)\monolib_srchcmn.obj \
$(OBJS)\monolib_statbar.obj \
$(OBJS)\monolib_stattextcmn.obj \
$(OBJS)\monolib_stockitem.obj \
$(OBJS)\monolib_tbarbase.obj \
$(OBJS)\monolib_textcmn.obj \
@ -2364,6 +2367,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \
$(OBJS)\monolib_sizer.obj \
$(OBJS)\monolib_srchcmn.obj \
$(OBJS)\monolib_statbar.obj \
$(OBJS)\monolib_stattextcmn.obj \
$(OBJS)\monolib_stockitem.obj \
$(OBJS)\monolib_tbarbase.obj \
$(OBJS)\monolib_textcmn.obj \
@ -2679,6 +2683,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \
$(OBJS)\coredll_sizer.obj \
$(OBJS)\coredll_srchcmn.obj \
$(OBJS)\coredll_statbar.obj \
$(OBJS)\coredll_stattextcmn.obj \
$(OBJS)\coredll_stockitem.obj \
$(OBJS)\coredll_tbarbase.obj \
$(OBJS)\coredll_textcmn.obj \
@ -2906,6 +2911,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \
$(OBJS)\coredll_sizer.obj \
$(OBJS)\coredll_srchcmn.obj \
$(OBJS)\coredll_statbar.obj \
$(OBJS)\coredll_stattextcmn.obj \
$(OBJS)\coredll_stockitem.obj \
$(OBJS)\coredll_tbarbase.obj \
$(OBJS)\coredll_textcmn.obj \
@ -3134,6 +3140,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \
$(OBJS)\corelib_sizer.obj \
$(OBJS)\corelib_srchcmn.obj \
$(OBJS)\corelib_statbar.obj \
$(OBJS)\corelib_stattextcmn.obj \
$(OBJS)\corelib_stockitem.obj \
$(OBJS)\corelib_tbarbase.obj \
$(OBJS)\corelib_textcmn.obj \
@ -3361,6 +3368,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \
$(OBJS)\corelib_sizer.obj \
$(OBJS)\corelib_srchcmn.obj \
$(OBJS)\corelib_statbar.obj \
$(OBJS)\corelib_stattextcmn.obj \
$(OBJS)\corelib_stockitem.obj \
$(OBJS)\corelib_tbarbase.obj \
$(OBJS)\corelib_textcmn.obj \
@ -6384,6 +6392,11 @@ $(OBJS)\monodll_statbar.obj: ..\..\src\common\statbar.cpp
$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) $**
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\monodll_stattextcmn.obj: ..\..\src\common\stattextcmn.cpp
$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) $**
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\monodll_stockitem.obj: ..\..\src\common\stockitem.cpp
$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) $**
@ -8411,6 +8424,11 @@ $(OBJS)\monolib_statbar.obj: ..\..\src\common\statbar.cpp
$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) $**
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\monolib_stattextcmn.obj: ..\..\src\common\stattextcmn.cpp
$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) $**
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\monolib_stockitem.obj: ..\..\src\common\stockitem.cpp
$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) $**
@ -10477,6 +10495,11 @@ $(OBJS)\coredll_statbar.obj: ..\..\src\common\statbar.cpp
$(CXX) -q -c -P -o$@ $(COREDLL_CXXFLAGS) $**
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\coredll_stattextcmn.obj: ..\..\src\common\stattextcmn.cpp
$(CXX) -q -c -P -o$@ $(COREDLL_CXXFLAGS) $**
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\coredll_stockitem.obj: ..\..\src\common\stockitem.cpp
$(CXX) -q -c -P -o$@ $(COREDLL_CXXFLAGS) $**
@ -11762,6 +11785,11 @@ $(OBJS)\corelib_statbar.obj: ..\..\src\common\statbar.cpp
$(CXX) -q -c -P -o$@ $(CORELIB_CXXFLAGS) $**
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\corelib_stattextcmn.obj: ..\..\src\common\stattextcmn.cpp
$(CXX) -q -c -P -o$@ $(CORELIB_CXXFLAGS) $**
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\corelib_stockitem.obj: ..\..\src\common\stockitem.cpp
$(CXX) -q -c -P -o$@ $(CORELIB_CXXFLAGS) $**

View File

@ -1525,6 +1525,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \
$(OBJS)\monodll_sizer.o \
$(OBJS)\monodll_srchcmn.o \
$(OBJS)\monodll_statbar.o \
$(OBJS)\monodll_stattextcmn.o \
$(OBJS)\monodll_stockitem.o \
$(OBJS)\monodll_tbarbase.o \
$(OBJS)\monodll_textcmn.o \
@ -1754,6 +1755,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \
$(OBJS)\monodll_sizer.o \
$(OBJS)\monodll_srchcmn.o \
$(OBJS)\monodll_statbar.o \
$(OBJS)\monodll_stattextcmn.o \
$(OBJS)\monodll_stockitem.o \
$(OBJS)\monodll_tbarbase.o \
$(OBJS)\monodll_textcmn.o \
@ -2153,6 +2155,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \
$(OBJS)\monolib_sizer.o \
$(OBJS)\monolib_srchcmn.o \
$(OBJS)\monolib_statbar.o \
$(OBJS)\monolib_stattextcmn.o \
$(OBJS)\monolib_stockitem.o \
$(OBJS)\monolib_tbarbase.o \
$(OBJS)\monolib_textcmn.o \
@ -2382,6 +2385,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \
$(OBJS)\monolib_sizer.o \
$(OBJS)\monolib_srchcmn.o \
$(OBJS)\monolib_statbar.o \
$(OBJS)\monolib_stattextcmn.o \
$(OBJS)\monolib_stockitem.o \
$(OBJS)\monolib_tbarbase.o \
$(OBJS)\monolib_textcmn.o \
@ -2711,6 +2715,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \
$(OBJS)\coredll_sizer.o \
$(OBJS)\coredll_srchcmn.o \
$(OBJS)\coredll_statbar.o \
$(OBJS)\coredll_stattextcmn.o \
$(OBJS)\coredll_stockitem.o \
$(OBJS)\coredll_tbarbase.o \
$(OBJS)\coredll_textcmn.o \
@ -2940,6 +2945,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \
$(OBJS)\coredll_sizer.o \
$(OBJS)\coredll_srchcmn.o \
$(OBJS)\coredll_statbar.o \
$(OBJS)\coredll_stattextcmn.o \
$(OBJS)\coredll_stockitem.o \
$(OBJS)\coredll_tbarbase.o \
$(OBJS)\coredll_textcmn.o \
@ -3174,6 +3180,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \
$(OBJS)\corelib_sizer.o \
$(OBJS)\corelib_srchcmn.o \
$(OBJS)\corelib_statbar.o \
$(OBJS)\corelib_stattextcmn.o \
$(OBJS)\corelib_stockitem.o \
$(OBJS)\corelib_tbarbase.o \
$(OBJS)\corelib_textcmn.o \
@ -3403,6 +3410,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \
$(OBJS)\corelib_sizer.o \
$(OBJS)\corelib_srchcmn.o \
$(OBJS)\corelib_statbar.o \
$(OBJS)\corelib_stattextcmn.o \
$(OBJS)\corelib_stockitem.o \
$(OBJS)\corelib_tbarbase.o \
$(OBJS)\corelib_textcmn.o \
@ -6635,6 +6643,11 @@ $(OBJS)\monodll_statbar.o: ../../src/common/statbar.cpp
$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
endif
ifeq ($(USE_GUI),1)
$(OBJS)\monodll_stattextcmn.o: ../../src/common/stattextcmn.cpp
$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
endif
ifeq ($(USE_GUI),1)
$(OBJS)\monodll_stockitem.o: ../../src/common/stockitem.cpp
$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
@ -8762,6 +8775,11 @@ $(OBJS)\monolib_statbar.o: ../../src/common/statbar.cpp
$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
endif
ifeq ($(USE_GUI),1)
$(OBJS)\monolib_stattextcmn.o: ../../src/common/stattextcmn.cpp
$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
endif
ifeq ($(USE_GUI),1)
$(OBJS)\monolib_stockitem.o: ../../src/common/stockitem.cpp
$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
@ -10928,6 +10946,11 @@ $(OBJS)\coredll_statbar.o: ../../src/common/statbar.cpp
$(CXX) -c -o $@ $(COREDLL_CXXFLAGS) $(CPPDEPS) $<
endif
ifeq ($(USE_GUI),1)
$(OBJS)\coredll_stattextcmn.o: ../../src/common/stattextcmn.cpp
$(CXX) -c -o $@ $(COREDLL_CXXFLAGS) $(CPPDEPS) $<
endif
ifeq ($(USE_GUI),1)
$(OBJS)\coredll_stockitem.o: ../../src/common/stockitem.cpp
$(CXX) -c -o $@ $(COREDLL_CXXFLAGS) $(CPPDEPS) $<
@ -12313,6 +12336,11 @@ $(OBJS)\corelib_statbar.o: ../../src/common/statbar.cpp
$(CXX) -c -o $@ $(CORELIB_CXXFLAGS) $(CPPDEPS) $<
endif
ifeq ($(USE_GUI),1)
$(OBJS)\corelib_stattextcmn.o: ../../src/common/stattextcmn.cpp
$(CXX) -c -o $@ $(CORELIB_CXXFLAGS) $(CPPDEPS) $<
endif
ifeq ($(USE_GUI),1)
$(OBJS)\corelib_stockitem.o: ../../src/common/stockitem.cpp
$(CXX) -c -o $@ $(CORELIB_CXXFLAGS) $(CPPDEPS) $<

View File

@ -1682,6 +1682,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \
$(OBJS)\monodll_sizer.obj \
$(OBJS)\monodll_srchcmn.obj \
$(OBJS)\monodll_statbar.obj \
$(OBJS)\monodll_stattextcmn.obj \
$(OBJS)\monodll_stockitem.obj \
$(OBJS)\monodll_tbarbase.obj \
$(OBJS)\monodll_textcmn.obj \
@ -1909,6 +1910,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \
$(OBJS)\monodll_sizer.obj \
$(OBJS)\monodll_srchcmn.obj \
$(OBJS)\monodll_statbar.obj \
$(OBJS)\monodll_stattextcmn.obj \
$(OBJS)\monodll_stockitem.obj \
$(OBJS)\monodll_tbarbase.obj \
$(OBJS)\monodll_textcmn.obj \
@ -2310,6 +2312,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \
$(OBJS)\monolib_sizer.obj \
$(OBJS)\monolib_srchcmn.obj \
$(OBJS)\monolib_statbar.obj \
$(OBJS)\monolib_stattextcmn.obj \
$(OBJS)\monolib_stockitem.obj \
$(OBJS)\monolib_tbarbase.obj \
$(OBJS)\monolib_textcmn.obj \
@ -2537,6 +2540,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \
$(OBJS)\monolib_sizer.obj \
$(OBJS)\monolib_srchcmn.obj \
$(OBJS)\monolib_statbar.obj \
$(OBJS)\monolib_stattextcmn.obj \
$(OBJS)\monolib_stockitem.obj \
$(OBJS)\monolib_tbarbase.obj \
$(OBJS)\monolib_textcmn.obj \
@ -2882,6 +2886,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \
$(OBJS)\coredll_sizer.obj \
$(OBJS)\coredll_srchcmn.obj \
$(OBJS)\coredll_statbar.obj \
$(OBJS)\coredll_stattextcmn.obj \
$(OBJS)\coredll_stockitem.obj \
$(OBJS)\coredll_tbarbase.obj \
$(OBJS)\coredll_textcmn.obj \
@ -3109,6 +3114,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \
$(OBJS)\coredll_sizer.obj \
$(OBJS)\coredll_srchcmn.obj \
$(OBJS)\coredll_statbar.obj \
$(OBJS)\coredll_stattextcmn.obj \
$(OBJS)\coredll_stockitem.obj \
$(OBJS)\coredll_tbarbase.obj \
$(OBJS)\coredll_textcmn.obj \
@ -3343,6 +3349,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \
$(OBJS)\corelib_sizer.obj \
$(OBJS)\corelib_srchcmn.obj \
$(OBJS)\corelib_statbar.obj \
$(OBJS)\corelib_stattextcmn.obj \
$(OBJS)\corelib_stockitem.obj \
$(OBJS)\corelib_tbarbase.obj \
$(OBJS)\corelib_textcmn.obj \
@ -3570,6 +3577,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \
$(OBJS)\corelib_sizer.obj \
$(OBJS)\corelib_srchcmn.obj \
$(OBJS)\corelib_statbar.obj \
$(OBJS)\corelib_stattextcmn.obj \
$(OBJS)\corelib_stockitem.obj \
$(OBJS)\corelib_tbarbase.obj \
$(OBJS)\corelib_textcmn.obj \
@ -6717,6 +6725,11 @@ $(OBJS)\monodll_statbar.obj: ..\..\src\common\statbar.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) $**
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\monodll_stattextcmn.obj: ..\..\src\common\stattextcmn.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) $**
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\monodll_stockitem.obj: ..\..\src\common\stockitem.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) $**
@ -8744,6 +8757,11 @@ $(OBJS)\monolib_statbar.obj: ..\..\src\common\statbar.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) $**
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\monolib_stattextcmn.obj: ..\..\src\common\stattextcmn.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) $**
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\monolib_stockitem.obj: ..\..\src\common\stockitem.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) $**
@ -10810,6 +10828,11 @@ $(OBJS)\coredll_statbar.obj: ..\..\src\common\statbar.cpp
$(CXX) /c /nologo /TP /Fo$@ $(COREDLL_CXXFLAGS) $**
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\coredll_stattextcmn.obj: ..\..\src\common\stattextcmn.cpp
$(CXX) /c /nologo /TP /Fo$@ $(COREDLL_CXXFLAGS) $**
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\coredll_stockitem.obj: ..\..\src\common\stockitem.cpp
$(CXX) /c /nologo /TP /Fo$@ $(COREDLL_CXXFLAGS) $**
@ -12095,6 +12118,11 @@ $(OBJS)\corelib_statbar.obj: ..\..\src\common\statbar.cpp
$(CXX) /c /nologo /TP /Fo$@ $(CORELIB_CXXFLAGS) $**
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\corelib_stattextcmn.obj: ..\..\src\common\stattextcmn.cpp
$(CXX) /c /nologo /TP /Fo$@ $(CORELIB_CXXFLAGS) $**
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\corelib_stockitem.obj: ..\..\src\common\stockitem.cpp
$(CXX) /c /nologo /TP /Fo$@ $(CORELIB_CXXFLAGS) $**

View File

@ -387,6 +387,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = &
$(OBJS)\monodll_sizer.obj &
$(OBJS)\monodll_srchcmn.obj &
$(OBJS)\monodll_statbar.obj &
$(OBJS)\monodll_stattextcmn.obj &
$(OBJS)\monodll_stockitem.obj &
$(OBJS)\monodll_tbarbase.obj &
$(OBJS)\monodll_textcmn.obj &
@ -616,6 +617,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = &
$(OBJS)\monodll_sizer.obj &
$(OBJS)\monodll_srchcmn.obj &
$(OBJS)\monodll_statbar.obj &
$(OBJS)\monodll_stattextcmn.obj &
$(OBJS)\monodll_stockitem.obj &
$(OBJS)\monodll_tbarbase.obj &
$(OBJS)\monodll_textcmn.obj &
@ -1019,6 +1021,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = &
$(OBJS)\monolib_sizer.obj &
$(OBJS)\monolib_srchcmn.obj &
$(OBJS)\monolib_statbar.obj &
$(OBJS)\monolib_stattextcmn.obj &
$(OBJS)\monolib_stockitem.obj &
$(OBJS)\monolib_tbarbase.obj &
$(OBJS)\monolib_textcmn.obj &
@ -1248,6 +1251,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = &
$(OBJS)\monolib_sizer.obj &
$(OBJS)\monolib_srchcmn.obj &
$(OBJS)\monolib_statbar.obj &
$(OBJS)\monolib_stattextcmn.obj &
$(OBJS)\monolib_stockitem.obj &
$(OBJS)\monolib_tbarbase.obj &
$(OBJS)\monolib_textcmn.obj &
@ -1588,6 +1592,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = &
$(OBJS)\coredll_sizer.obj &
$(OBJS)\coredll_srchcmn.obj &
$(OBJS)\coredll_statbar.obj &
$(OBJS)\coredll_stattextcmn.obj &
$(OBJS)\coredll_stockitem.obj &
$(OBJS)\coredll_tbarbase.obj &
$(OBJS)\coredll_textcmn.obj &
@ -1817,6 +1822,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = &
$(OBJS)\coredll_sizer.obj &
$(OBJS)\coredll_srchcmn.obj &
$(OBJS)\coredll_statbar.obj &
$(OBJS)\coredll_stattextcmn.obj &
$(OBJS)\coredll_stockitem.obj &
$(OBJS)\coredll_tbarbase.obj &
$(OBJS)\coredll_textcmn.obj &
@ -2053,6 +2059,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = &
$(OBJS)\corelib_sizer.obj &
$(OBJS)\corelib_srchcmn.obj &
$(OBJS)\corelib_statbar.obj &
$(OBJS)\corelib_stattextcmn.obj &
$(OBJS)\corelib_stockitem.obj &
$(OBJS)\corelib_tbarbase.obj &
$(OBJS)\corelib_textcmn.obj &
@ -2282,6 +2289,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = &
$(OBJS)\corelib_sizer.obj &
$(OBJS)\corelib_srchcmn.obj &
$(OBJS)\corelib_statbar.obj &
$(OBJS)\corelib_stattextcmn.obj &
$(OBJS)\corelib_stockitem.obj &
$(OBJS)\corelib_tbarbase.obj &
$(OBJS)\corelib_textcmn.obj &
@ -6889,6 +6897,11 @@ $(OBJS)\monodll_statbar.obj : .AUTODEPEND ..\..\src\common\statbar.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
!endif
!ifeq USE_GUI 1
$(OBJS)\monodll_stattextcmn.obj : .AUTODEPEND ..\..\src\common\stattextcmn.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
!endif
!ifeq USE_GUI 1
$(OBJS)\monodll_stockitem.obj : .AUTODEPEND ..\..\src\common\stockitem.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
@ -9016,6 +9029,11 @@ $(OBJS)\monolib_statbar.obj : .AUTODEPEND ..\..\src\common\statbar.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
!endif
!ifeq USE_GUI 1
$(OBJS)\monolib_stattextcmn.obj : .AUTODEPEND ..\..\src\common\stattextcmn.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
!endif
!ifeq USE_GUI 1
$(OBJS)\monolib_stockitem.obj : .AUTODEPEND ..\..\src\common\stockitem.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
@ -11182,6 +11200,11 @@ $(OBJS)\coredll_statbar.obj : .AUTODEPEND ..\..\src\common\statbar.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(COREDLL_CXXFLAGS) $<
!endif
!ifeq USE_GUI 1
$(OBJS)\coredll_stattextcmn.obj : .AUTODEPEND ..\..\src\common\stattextcmn.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(COREDLL_CXXFLAGS) $<
!endif
!ifeq USE_GUI 1
$(OBJS)\coredll_stockitem.obj : .AUTODEPEND ..\..\src\common\stockitem.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(COREDLL_CXXFLAGS) $<
@ -12567,6 +12590,11 @@ $(OBJS)\corelib_statbar.obj : .AUTODEPEND ..\..\src\common\statbar.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(CORELIB_CXXFLAGS) $<
!endif
!ifeq USE_GUI 1
$(OBJS)\corelib_stattextcmn.obj : .AUTODEPEND ..\..\src\common\stattextcmn.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(CORELIB_CXXFLAGS) $<
!endif
!ifeq USE_GUI 1
$(OBJS)\corelib_stockitem.obj : .AUTODEPEND ..\..\src\common\stockitem.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(CORELIB_CXXFLAGS) $<

View File

@ -790,6 +790,10 @@ SOURCE=..\..\src\common\statbar.cpp
# End Source File
# Begin Source File
SOURCE=..\..\src\common\stattextcmn.cpp
# End Source File
# Begin Source File
SOURCE=..\..\src\common\stockitem.cpp
# End Source File
# Begin Source File

View File

@ -100,6 +100,7 @@ All (GUI):
wxGTK:
- Support for markup and ellipsization in wxStaticText (Francesco Montorsi)
- Native implementation for wxHyperlinkCtrl (Francesco Montorsi)
- Native keyboard navigation implementation
- Don't overwrite primary selection with clipboard and vice versa

View File

@ -26,6 +26,14 @@ adjust its size to exactly fit to the size of the text when
given, the control will not change its size (this style is especially useful
with controls which also have wxALIGN\_RIGHT or CENTER style because otherwise
they won't make sense any longer after a call to SetLabel)}
\twocolitem{\windowstyle{wxST\_ELLIPSIZE\_START}}{If the text width exceeds the
control width, replace the beginning of the text with an ellipsis}
\twocolitem{\windowstyle{wxST\_ELLIPSIZE\_MIDDLE}}{Same as above, but replace
the text in the middle of the control with an ellipsis}
\twocolitem{\windowstyle{wxST\_ELLIPSIZE\_END}}{Same as above, but replace the
end of the text with an ellipsis}
\twocolitem{\windowstyle{wxST_MARKUP}}{Support markup in the label; see
\helpref{SetLabel}{wxstatictextsetlabel} for more information}
\end{twocollist}
See also \helpref{window styles overview}{windowstyles}.
@ -85,6 +93,22 @@ Creation function, for two-step construction. For details see \helpref{wxStaticT
Returns the contents of the control.
Note that the returned string contains both the mnemonics (\texttt{\&} characters),
if any, and markup tags, if any.
Use \helpref{wxStaticText::GetLabelText}{wxstatictextgetlabeltext} if only the
label text is needed.
\membersection{wxStaticText::GetLabelText}\label{wxstatictextgetlabeltext}
\constfunc{const wxString\&}{GetLabelText}{\void}
Returns the control's label or the given \arg{label} string for the static
version without the mnemonics characters (if any) and without the markup
(if the control has \texttt{wxST_MARKUP} style).
\membersection{wxStaticText::SetLabel}\label{wxstatictextsetlabel}
@ -93,12 +117,70 @@ Returns the contents of the control.
Sets the static text label and updates the controls size to exactly fit the
label unless the control has wxST\_NO\_AUTORESIZE flag.
This function allows to set decorated static label text on platforms which
support it (currently only GTK+ 2). For the other platforms, the markup is
ignored.
The supported tags are:
\twocolwidtha{5cm}
\begin{twocollist}\itemsep=0pt
\twocolitem{<b>}{bold text}
\twocolitem{<big>}{bigger text}
\twocolitem{<i>}{italic text}
\twocolitem{<s>}{strike-through text}
\twocolitem{<sub>}{subscript text}
\twocolitem{<sup>}{superscript text}
\twocolitem{<small>}{smaller text}
\twocolitem{<tt>}{monospaced text}
\twocolitem{<u>}{underlined text}
\twocolitem{<span>}{generic formatter tag; see \urlref{Pango Markup}{http://developer.gnome.org/doc/API/2.0/pango/PangoMarkupFormat.html} for more information.}
\end{twocollist}
Note that the string must be well-formed (e.g. all tags must be correctly closed)
otherwise it can be not shown correctly or at all.
Also note that you need to escape the following special characters:
\twocolwidtha{5cm}
\begin{twocollist}\itemsep=0pt
\twocolitem{\textbf{Special character}}{\textbf{Escape as}}
\twocolitem{\texttt{&}}{\texttt{&amp;} or as \texttt{&&}}
\twocolitem{\texttt{'}}{\texttt{&apos;}}
\twocolitem{\texttt{"}}{\texttt{&quot;}}
\twocolitem{\texttt{<}}{\texttt{&lt;}}
\twocolitem{\texttt{>}}{\texttt{&gt;}}
\end{twocollist}
The non-escaped ampersand \texttt{&} characters are interpreted as
mnemonics; see \helpref{wxControl::SetLabel}{wxcontrolsetlabel}.
Example:
%% TEX NOTE: in the following block we need to write the (ugly) &&amp;amp;
%% string in order to force Tex2rtf to show the &&amp; string
\begin{verbatim}
// this will set the wxStaticText to show the "Hello world!" string
// with the "Hello" world in bold on platforms which support markup
pStaticText->SetLabelWithMarkup(wxT("<b>Hello</b> world!"));
// this will make wxStaticText show the string:
//
// Specials: & ' " < >"
//
// with "Specials" in smaller size font if markup is supported
pStaticText->SetLabelWithMarkup(
wxT("<small>Specials</small>: &amp;amp; &amp;apos; &amp;quot;; &amp;lt; &amp;gt;"));
\end{verbatim}
\wxheading{Parameters}
\docparam{label}{The new label to set. It may contain newline characters.}
\docparam{label}{The new label to set. It may contain newline characters and the markup tags described above.}
\membersection{wxStaticText::Wrap}\label{wxstatictextwrpa}
\membersection{wxStaticText::Wrap}\label{wxstatictextwrap}
\func{void}{Wrap}{\param{int }{width}}

View File

@ -46,11 +46,36 @@ public:
// get the control alignment (left/right/centre, top/bottom/centre)
int GetAlignment() const { return m_windowStyle & wxALIGN_MASK; }
// get just the text of the label, without mnemonic characters ('&')
wxString GetLabelText() const { return GetLabelText(GetLabel()); }
virtual void SetLabel(const wxString& label)
{
m_labelOrig = label;
InvalidateBestSize();
wxWindow::SetLabel(label);
}
virtual wxString GetLabel() const
{
// return the original string, as it was passed to SetLabel()
// (i.e. with wx-style mnemonics)
return m_labelOrig;
}
// static utilities:
// get the string without mnemonic characters ('&')
static wxString GetLabelText(const wxString& label);
// get just the text of the label, without mnemonic characters ('&')
wxString GetLabelText() const { return GetLabelText(GetLabel()); }
// removes the mnemonics characters
static wxString RemoveMnemonics(const wxString& str);
// escapes the mnemonics characters ('&') by doubling them
static wxString EscapeMnemonics(const wxString& str);
// controls by default inherit the colours of their parents, if a
// particular control class doesn't want to do it, it can override
@ -64,7 +89,6 @@ public:
// if the button was clicked)
virtual void Command(wxCommandEvent &event);
virtual void SetLabel( const wxString &label );
virtual bool SetFont(const wxFont& font);
// wxControl-specific processing after processing the update event
@ -84,6 +108,9 @@ protected:
// initialize the common fields of wxCommandEvent
void InitCommandEvent(wxCommandEvent& event) const;
// this field contains the label in wx format, i.e. with '&' mnemonics
wxString m_labelOrig;
DECLARE_NO_COPY_CLASS(wxControlBase)
};

View File

@ -1603,13 +1603,6 @@ enum wxBorder
*/
#define wxST_SIZEGRIP 0x0010
/*
* wxStaticText flags
*/
#define wxST_NO_AUTORESIZE 0x0001
#define wxST_DOTS_MIDDLE 0x0002
#define wxST_DOTS_END 0x0004
/*
* wxStaticBitmap flags
*/

View File

@ -43,8 +43,6 @@ public:
const wxValidator& validator = wxDefaultValidator,
const wxString& name = wxControlNameStr);
virtual void SetLabel( const wxString &label );
virtual wxString GetLabel() const;
virtual wxVisualAttributes GetDefaultAttributes() const;
@ -56,6 +54,7 @@ protected:
// sets the label to the given string and also sets it for the given widget
void GTKSetLabelForLabel(GtkLabel *w, const wxString& label);
void GTKSetLabelWithMarkupForLabel(GtkLabel *w, const wxString& label);
// GtkFrame helpers
GtkWidget* GTKCreateFrame(const wxString& label);
@ -67,11 +66,11 @@ protected:
static wxString GTKRemoveMnemonics(const wxString& label);
// converts wx label to GTK+ label, i.e. basically replace "&"s with "_"s
//
// for GTK+ 1 (which doesn't support mnemonics) this is the same as
// GTKRemoveMnemonics()
static wxString GTKConvertMnemonics(const wxString &label);
// converts wx label to GTK+ labels preserving Pango markup
static wxString GTKConvertMnemonicsWithMarkup(const wxString& label);
// These are used by GetDefaultAttributes
static wxVisualAttributes
GetDefaultAttributesFromGTKWidget(GtkWidget* widget,
@ -95,9 +94,6 @@ protected:
// override this and return true.
virtual bool UseGTKStyleBase() const { return false; }
// this field contains the label in wx format, i.e. with "&" mnemonics
wxString m_label;
private:
DECLARE_DYNAMIC_CLASS(wxControl)
};

View File

@ -14,7 +14,7 @@
// wxStaticText
//-----------------------------------------------------------------------------
class WXDLLIMPEXP_CORE wxStaticText : public wxControl
class WXDLLIMPEXP_CORE wxStaticText : public wxStaticTextBase
{
public:
wxStaticText();
@ -43,8 +43,7 @@ public:
static wxVisualAttributes
GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
// see wx/stattext.h
void Wrap(int width);
// implementation
// --------------
@ -59,6 +58,9 @@ protected:
virtual wxSize DoGetBestSize() const;
virtual wxString DoGetLabel() const;
virtual void DoSetLabel(const wxString& str);
DECLARE_DYNAMIC_CLASS(wxStaticText)
};

View File

@ -42,6 +42,9 @@ public:
protected :
virtual wxString DoGetLabel() const;
virtual void DoSetLabel(const wxString& str);
virtual wxSize DoGetBestSize() const ;
DECLARE_DYNAMIC_CLASS_NO_COPY(wxStaticText)

View File

@ -52,6 +52,9 @@ public:
virtual WXWidget GetLabelWidget() const
{ return m_labelWidget; }
virtual void DoSetLabel(const wxString& str);
virtual wxString DoGetLabel() const;
protected:
WXWidget m_labelWidget;
};

View File

@ -49,6 +49,9 @@ protected:
int sizeFlags = wxSIZE_AUTO);
virtual wxSize DoGetBestSize() const;
virtual wxString DoGetLabel() const;
virtual void DoSetLabel(const wxString& str);
DECLARE_DYNAMIC_CLASS_NO_COPY(wxStaticText)
};

View File

@ -67,6 +67,9 @@ protected:
);
virtual wxSize DoGetBestSize(void) const;
virtual void DoSetLabel(const wxString& str);
virtual wxString DoGetLabel() const;
private:
DECLARE_DYNAMIC_CLASS(wxStaticText)
}; // end of CLASS wxStaticText

View File

@ -0,0 +1,95 @@
/////////////////////////////////////////////////////////////////////////////
// Name: include/wx/private/stattext.h
// Purpose: Internal declarations for dlgcmn.cpp and stattextcmn.cpp
// Author: Francesco Montorsi
// Created: 2007-01-07 (extracted from dlgcmn.cpp)
// RCS-ID: $Id$
// Copyright: (c) 1999 Vadim Zeitlin
// (c) 2007 wxWidgets team
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_STATTEXT_H_
#define _WX_PRIVATE_STATTEXT_H_
#if wxUSE_STATTEXT
// ----------------------------------------------------------------------------
// wxTextWrapper
// ----------------------------------------------------------------------------
// this class is used to wrap the text on word boundary: wrapping is done by
// calling OnStartLine() and OnOutputLine() functions
class wxTextWrapper
{
public:
wxTextWrapper() { m_eol = false; }
// win is used for getting the font, text is the text to wrap, width is the
// max line width or -1 to disable wrapping
void Wrap(wxWindow *win, const wxString& text, int widthMax);
// we don't need it, but just to avoid compiler warnings
virtual ~wxTextWrapper() { }
protected:
// line may be empty
virtual void OnOutputLine(const wxString& line) = 0;
// called at the start of every new line (except the very first one)
virtual void OnNewLine() { }
private:
// call OnOutputLine() and set m_eol to true
void DoOutputLine(const wxString& line)
{
OnOutputLine(line);
m_eol = true;
}
// this function is a destructive inspector: when it returns true it also
// resets the flag to false so calling it again woulnd't return true any
// more
bool IsStartOfNewLine()
{
if ( !m_eol )
return false;
m_eol = false;
return true;
}
bool m_eol;
};
enum
{
wxMARKUP_ENTITY_AMP,
wxMARKUP_ENTITY_LT,
wxMARKUP_ENTITY_GT,
wxMARKUP_ENTITY_APOS,
wxMARKUP_ENTITY_QUOT,
wxMARKUP_ENTITY_MAX
};
enum
{
wxMARKUP_ELEMENT_NAME,
wxMARKUP_ELEMENT_VALUE,
wxMARKUP_ELEMENT_MAX
};
// these are the only entities treated in a special way by wxStaticText::SetLabel()
// when the wxST_MARKUP style is used; use as:
//
// wxMarkupEntities[wxMARKUP_ELEMENT_NAME][wxMARKUP_ENTITY_GT] == "&gt;"
// wxMarkupEntities[wxMARKUP_ELEMENT_VALUE][wxMARKUP_ENTITY_GT] == ">"
//
extern const wxChar *wxMarkupEntities[wxMARKUP_ELEMENT_MAX][wxMARKUP_ENTITY_MAX];
#endif // wxUSE_STATTEXT
#endif // _WX_PRIVATE_STATTEXT_H_

View File

@ -18,6 +18,17 @@
#include "wx/control.h"
/*
* wxStaticText flags
*/
#define wxST_NO_AUTORESIZE 0x0001
#define wxST_MARKUP 0x0002
#define wxST_ELLIPSIZE_START 0x0004
#define wxST_ELLIPSIZE_MIDDLE 0x0008
#define wxST_ELLIPSIZE_END 0x0010
extern WXDLLEXPORT_DATA(const wxChar) wxStaticTextNameStr[];
class WXDLLEXPORT wxStaticTextBase : public wxControl
@ -25,20 +36,60 @@ class WXDLLEXPORT wxStaticTextBase : public wxControl
public:
wxStaticTextBase() { }
// in wxGTK wxStaticText doesn't derive from wxStaticTextBase so we have to
// declare this function directly in gtk header
#if !defined(__WXGTK__) || defined(__WXUNIVERSAL__)
// wrap the text of the control so that no line is longer than the given
// width (if possible: this function won't break words)
//
// NB: implemented in dlgcmn.cpp for now
// This function will modify the value returned by GetLabel()!
void Wrap(int width);
#endif // ! native __WXGTK__
// overriden base virtuals
virtual bool AcceptsFocus() const { return false; }
virtual bool HasTransparentBackground() { return true; }
bool IsEllipsized() const
{
return HasFlag(wxST_ELLIPSIZE_START) ||
HasFlag(wxST_ELLIPSIZE_MIDDLE) ||
HasFlag(wxST_ELLIPSIZE_END);
}
// get the string without mnemonic characters ('&') and without markup
// (if wxST_MARKUP is being used)
virtual wxString GetLabelText() const;
// public utilities (symmetric to those in wxControl about mnemonics):
// removes the markup accepted by wxStaticText when wxST_MARKUP is used,
// and then returns the cleaned string
static wxString RemoveMarkup(const wxString& str);
// escapes the alls special symbols (<>"'&) present inside the given string
// using the corresponding entities (&lt; &gt; &quot; &apos; &amp;)
static wxString EscapeMarkup(const wxString& str);
protected: // functions required for wxST_ELLIPSIZE_* support
// just calls RemoveMarkup & Ellipsize on the original label.
virtual wxString GetEllipsizedLabelWithoutMarkup() const;
// replaces parts of the string with ellipsis if needed
wxString Ellipsize(const wxString& label) const;
// to be called when updating the size of the static text:
// updates the label redoing ellipsization calculations
void UpdateLabel();
// These functions are platform-specific and must be overridden in ports
// which do not natively support ellipsization and they must be implemented
// in a way so that the m_label member of wxControl is not touched:
// returns the real label currently displayed inside the control.
virtual wxString DoGetLabel() const { return wxEmptyString; }
// sets the real label currently displayed inside the control,
// _without_ invalidating the size. The text passed is always markup-free.
virtual void DoSetLabel(const wxString& WXUNUSED(str)) { }
private:
DECLARE_NO_COPY_CLASS(wxStaticTextBase)
};

View File

@ -64,13 +64,15 @@ public:
// this function will filter out '&' characters and will put the
// accelerator char (the one immediately after '&') into m_chAccel
virtual void SetLabel(const wxString &label);
virtual wxString GetLabel() const;
virtual void SetLabel(const wxString& label);
// return the current label
virtual wxString GetLabel() const { return m_label; }
// wxUniversal-specific methods
// return the accel index in the string or -1 if none and puts the modified
// string intosecond parameter if non NULL
// string into second parameter if non NULL
static int FindAccelIndex(const wxString& label,
wxString *labelOnly = NULL);
@ -89,6 +91,11 @@ protected:
// common part of all ctors
void Init();
// set m_label and m_indexAccel and refresh the control to show the new
// label (but, unlike SetLabel(), don't call the base class SetLabel() thus
// avoiding to change wxControlBase::m_labelOrig)
void UnivDoSetLabel(const wxString& label);
private:
// label and accel info
wxString m_label;

View File

@ -60,6 +60,9 @@ protected:
// draw the control
virtual void DoDraw(wxControlRenderer *renderer);
virtual void DoSetLabel(const wxString& str);
virtual wxString DoGetLabel() const;
DECLARE_ABSTRACT_CLASS(wxStaticText)
};

View File

@ -53,7 +53,8 @@ enum
{
StaticPage_Reset = wxID_HIGHEST,
StaticPage_BoxText,
StaticPage_LabelText
StaticPage_LabelText,
StaticPage_LabelTextWithMarkup
};
// alignment radiobox values
@ -73,6 +74,13 @@ enum
StaticVAlign_Max
};
enum
{
StaticEllipsize_Start,
StaticEllipsize_Middle,
StaticEllipsize_End
};
// ----------------------------------------------------------------------------
// MyStaticText and MyStaticBox
// ----------------------------------------------------------------------------
@ -155,6 +163,7 @@ protected:
void OnButtonReset(wxCommandEvent& event);
void OnButtonBoxText(wxCommandEvent& event);
void OnButtonLabelText(wxCommandEvent& event);
void OnButtonLabelWithMarkupText(wxCommandEvent& event);
// reset all parameters
void Reset();
@ -167,15 +176,19 @@ protected:
// the check/radio boxes for styles
wxCheckBox *m_chkVert,
*m_chkAutoResize;
*m_chkAutoResize,
*m_chkEllipsize,
*m_chkMarkup;
wxRadioBox *m_radioHAlign,
*m_radioVAlign;
*m_radioVAlign,
*m_radioEllipsize;
// the controls and the sizer containing them
wxStaticBox *m_staticBox;
wxStaticBoxSizer *m_sizerStatBox;
wxStaticText *m_statText;
wxStaticText *m_statText,
*m_statTextWithMarkup;
#if wxUSE_STATLINE
wxStaticLine *m_statLine;
#endif // wxUSE_STATLINE
@ -183,7 +196,8 @@ protected:
// the text entries for command parameters
wxTextCtrl *m_textBox,
*m_textLabel;
*m_textLabel,
*m_textLabelWithMarkup;
private:
DECLARE_EVENT_TABLE()
@ -197,6 +211,7 @@ private:
BEGIN_EVENT_TABLE(StaticWidgetsPage, WidgetsPage)
EVT_BUTTON(StaticPage_Reset, StaticWidgetsPage::OnButtonReset)
EVT_BUTTON(StaticPage_LabelText, StaticWidgetsPage::OnButtonLabelText)
EVT_BUTTON(StaticPage_LabelTextWithMarkup, StaticWidgetsPage::OnButtonLabelWithMarkupText)
EVT_BUTTON(StaticPage_BoxText, StaticWidgetsPage::OnButtonBoxText)
EVT_CHECKBOX(wxID_ANY, StaticWidgetsPage::OnCheckOrRadioBox)
@ -225,11 +240,13 @@ StaticWidgetsPage::StaticWidgetsPage(WidgetsBookCtrl *book,
#if wxUSE_STATLINE
m_statLine = (wxStaticLine *)NULL;
#endif // wxUSE_STATLINE
m_statText = (wxStaticText *)NULL;
m_statText = m_statTextWithMarkup = (wxStaticText *)NULL;
m_staticBox = (wxStaticBox *)NULL;
m_sizerStatBox = (wxStaticBoxSizer *)NULL;
m_sizerStatic = (wxSizer *)NULL;
m_textBox = m_textLabel = m_textLabelWithMarkup = NULL;
}
void StaticWidgetsPage::CreateContent()
@ -241,6 +258,7 @@ void StaticWidgetsPage::CreateContent()
wxSizer *sizerLeft = new wxStaticBoxSizer(box, wxVERTICAL);
m_chkMarkup = CreateCheckBoxAndAddToSizer(sizerLeft, _T("Support &markup"));
m_chkVert = CreateCheckBoxAndAddToSizer(sizerLeft, _T("&Vertical line"));
m_chkAutoResize = CreateCheckBoxAndAddToSizer(sizerLeft, _T("&Fit to text"));
sizerLeft->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer
@ -269,6 +287,24 @@ void StaticWidgetsPage::CreateContent()
sizerLeft->Add(m_radioHAlign, 0, wxGROW | wxALL, 5);
sizerLeft->Add(m_radioVAlign, 0, wxGROW | wxALL, 5);
sizerLeft->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer
m_chkEllipsize = CreateCheckBoxAndAddToSizer(sizerLeft, _T("&Ellipsize"));
static const wxString ellipsizeMode[] =
{
_T("&start"),
_T("&middle"),
_T("&end"),
};
m_radioEllipsize = new wxRadioBox(this, wxID_ANY, _T("&Ellipsize mode"),
wxDefaultPosition, wxDefaultSize,
WXSIZEOF(ellipsizeMode), ellipsizeMode);
sizerLeft->Add(m_radioEllipsize, 0, wxGROW | wxALL, 5);
wxButton *btn = new wxButton(this, StaticPage_Reset, _T("&Reset"));
sizerLeft->Add(btn, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 15);
@ -288,8 +324,23 @@ void StaticWidgetsPage::CreateContent()
wxID_ANY, &m_textLabel);
sizerMiddle->Add(sizerRow, 0, wxGROW | wxALL, 5);
sizerRow = CreateSizerWithTextAndButton(StaticPage_LabelTextWithMarkup,
_T("Change decorated text label"),
wxID_ANY, &m_textLabelWithMarkup);
sizerMiddle->Add(sizerRow, 0, wxGROW | wxALL, 5);
// final initializations
// NB: must be done _before_ calling CreateStatic()
Reset();
m_textBox->SetValue(_T("This is a box"));
m_textLabel->SetValue(_T("And this is a label\ninside the box"));
m_textLabel->SetValue(_T("And this is a\n\tlabel inside the box with a &mnemonic.\n")
_T("Only this text is affected by the ellipsize settings."));
m_textLabelWithMarkup->SetValue(_T("Another label, this time <b>decorated</b> ")
_T("with <u>markup</u>; here you need entities ")
_T("for the symbols: &lt; &gt; &amp; &apos; &quot; ")
_T(" but you can still place &mnemonics..."));
// right pane
wxSizer *sizerRight = new wxBoxSizer(wxHORIZONTAL);
@ -303,9 +354,6 @@ void StaticWidgetsPage::CreateContent()
sizerTop->Add(sizerMiddle, 0, wxGROW | wxALL, 10);
sizerTop->Add(sizerRight, 1, wxGROW | (wxALL & ~wxRIGHT), 10);
// final initializations
Reset();
SetSizer(sizerTop);
}
@ -317,6 +365,8 @@ void StaticWidgetsPage::Reset()
{
m_chkVert->SetValue(false);
m_chkAutoResize->SetValue(true);
m_chkEllipsize->SetValue(true);
m_chkMarkup->SetValue(true);
m_radioHAlign->SetSelection(StaticHAlign_Left);
m_radioVAlign->SetSelection(StaticVAlign_Top);
@ -332,17 +382,26 @@ void StaticWidgetsPage::CreateStatic()
// delete m_sizerStatBox; -- deleted by Remove()
m_sizerStatic->Remove(m_sizerStatBox);
delete m_statText;
delete m_statTextWithMarkup;
#if wxUSE_STATLINE
delete m_statLine;
#endif // wxUSE_STATLINE
}
int flagsBox = 0,
flagsText = ms_defaultFlags;
flagsText = ms_defaultFlags,
flagsDummyText = ms_defaultFlags;
if ( !m_chkAutoResize->GetValue() )
{
flagsText |= wxST_NO_AUTORESIZE;
flagsDummyText |= wxST_NO_AUTORESIZE;
}
if ( m_chkMarkup->GetValue() )
{
flagsText |= wxST_MARKUP;
flagsDummyText |= wxST_MARKUP;
}
int align = 0;
@ -384,6 +443,29 @@ void StaticWidgetsPage::CreateStatic()
break;
}
if ( m_chkEllipsize->GetValue() )
{
switch ( m_radioEllipsize->GetSelection() )
{
default:
wxFAIL_MSG(_T("unexpected radiobox selection"));
// fall through
case StaticEllipsize_Start:
flagsDummyText |= wxST_ELLIPSIZE_START;
break;
case StaticEllipsize_Middle:
flagsDummyText |= wxST_ELLIPSIZE_MIDDLE;
break;
case StaticEllipsize_End:
flagsDummyText |= wxST_ELLIPSIZE_END;
break;
}
}
flagsDummyText |= align;
flagsText |= align;
flagsBox |= align;
@ -395,7 +477,11 @@ void StaticWidgetsPage::CreateStatic()
m_statText = new MyStaticText(this, wxID_ANY, m_textLabel->GetValue(),
wxDefaultPosition, wxDefaultSize,
flagsText);
flagsDummyText);
m_statTextWithMarkup = new wxStaticText(this, wxID_ANY,
m_textLabelWithMarkup->GetValue(),
wxDefaultPosition, wxDefaultSize,
flagsText);
#if wxUSE_STATLINE
m_statLine = new wxStaticLine(this, wxID_ANY,
@ -407,7 +493,7 @@ void StaticWidgetsPage::CreateStatic()
#if wxUSE_STATLINE
m_sizerStatBox->Add(m_statLine, 0, wxGROW | wxALL, 5);
#endif // wxUSE_STATLINE
m_sizerStatBox->Add(0, 0, 1);
m_sizerStatBox->Add(m_statTextWithMarkup, 1, wxGROW | wxALL, 5);
m_sizerStatic->Add(m_sizerStatBox, 1, wxGROW);
@ -425,8 +511,13 @@ void StaticWidgetsPage::OnButtonReset(wxCommandEvent& WXUNUSED(event))
CreateStatic();
}
void StaticWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& WXUNUSED(event))
void StaticWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& event)
{
if (event.GetEventObject() == wx_static_cast(wxObject*, m_chkEllipsize))
{
m_radioEllipsize->Enable(event.IsChecked());
}
CreateStatic();
}
@ -435,8 +526,29 @@ void StaticWidgetsPage::OnButtonBoxText(wxCommandEvent& WXUNUSED(event))
m_sizerStatBox->GetStaticBox()->SetLabel(m_textBox->GetValue());
}
void StaticWidgetsPage::OnButtonLabelWithMarkupText(wxCommandEvent& WXUNUSED(event))
{
m_statTextWithMarkup->SetLabel(m_textLabelWithMarkup->GetValue());
// test GetLabel() and GetLabelText(); the first should return the
// label as it is written in the relative text control; the second should
// return the label as it's shown in the wxStaticText
wxLogMessage(wxT("The original label should be '%s'"),
m_statTextWithMarkup->GetLabel().c_str());
wxLogMessage(wxT("The label text is '%s'"),
m_statTextWithMarkup->GetLabelText().c_str());
}
void StaticWidgetsPage::OnButtonLabelText(wxCommandEvent& WXUNUSED(event))
{
m_statText->SetLabel(m_textLabel->GetValue());
// test GetLabel() and GetLabelText(); the first should return the
// label as it is written in the relative text control; the second should
// return the label as it's shown in the wxStaticText
wxLogMessage(wxT("The original label should be '%s'"),
m_statText->GetLabel().c_str());
wxLogMessage(wxT("The label text is '%s'"),
m_statText->GetLabelText().c_str());
}

View File

@ -120,13 +120,6 @@ void wxControlBase::InitCommandEvent(wxCommandEvent& event) const
}
}
void wxControlBase::SetLabel( const wxString &label )
{
InvalidateBestSize();
wxWindow::SetLabel(label);
}
bool wxControlBase::SetFont(const wxFont& font)
{
InvalidateBestSize();
@ -159,6 +152,12 @@ void wxControlBase::DoUpdateWindowUI(wxUpdateUIEvent& event)
#endif // wxUSE_RADIOBTN
}
/* static */
wxString wxControlBase::RemoveMnemonics(const wxString& str)
{
return wxStripMenuCodes(str, wxStrip_Mnemonics);
}
// ----------------------------------------------------------------------------
// wxStaticBitmap
// ----------------------------------------------------------------------------

View File

@ -38,61 +38,8 @@
#include "wx/statline.h"
#include "wx/sysopt.h"
#include "wx/private/stattext.h"
#if wxUSE_STATTEXT
// ----------------------------------------------------------------------------
// wxTextWrapper
// ----------------------------------------------------------------------------
// this class is used to wrap the text on word boundary: wrapping is done by
// calling OnStartLine() and OnOutputLine() functions
class wxTextWrapper
{
public:
wxTextWrapper() { m_eol = false; }
// win is used for getting the font, text is the text to wrap, width is the
// max line width or -1 to disable wrapping
void Wrap(wxWindow *win, const wxString& text, int widthMax);
// we don't need it, but just to avoid compiler warnings
virtual ~wxTextWrapper() { }
protected:
// line may be empty
virtual void OnOutputLine(const wxString& line) = 0;
// called at the start of every new line (except the very first one)
virtual void OnNewLine() { }
private:
// call OnOutputLine() and set m_eol to true
void DoOutputLine(const wxString& line)
{
OnOutputLine(line);
m_eol = true;
}
// this function is a destructive inspector: when it returns true it also
// resets the flag to false so calling it again woulnd't return true any
// more
bool IsStartOfNewLine()
{
if ( !m_eol )
return false;
m_eol = false;
return true;
}
bool m_eol;
};
#endif // wxUSE_STATTEXT
// ----------------------------------------------------------------------------
// wxDialogBase
@ -126,58 +73,6 @@ void wxDialogBase::Init()
#if wxUSE_STATTEXT
void wxTextWrapper::Wrap(wxWindow *win, const wxString& text, int widthMax)
{
const wxChar *lastSpace = NULL;
wxString line;
const wxChar *lineStart = text.c_str();
for ( const wxChar *p = lineStart; ; p++ )
{
if ( IsStartOfNewLine() )
{
OnNewLine();
lastSpace = NULL;
line.clear();
lineStart = p;
}
if ( *p == _T('\n') || *p == _T('\0') )
{
DoOutputLine(line);
if ( *p == _T('\0') )
break;
}
else // not EOL
{
if ( *p == _T(' ') )
lastSpace = p;
line += *p;
if ( widthMax >= 0 && lastSpace )
{
int width;
win->GetTextExtent(line, &width, NULL);
if ( width > widthMax )
{
// remove the last word from this line
line.erase(lastSpace - lineStart, p + 1 - lineStart);
DoOutputLine(line);
// go back to the last word of this line which we didn't
// output yet
p = lastSpace;
}
}
//else: no wrapping at all or impossible to wrap
}
}
}
class wxTextSizerWrapper : public wxTextWrapper
{
public:
@ -238,45 +133,6 @@ wxSizer *wxDialogBase::CreateTextSizer(const wxString& message)
return wrapper.CreateSizer(text, widthMax);
}
class wxLabelWrapper : public wxTextWrapper
{
public:
void WrapLabel(wxWindow *text, int widthMax)
{
m_text.clear();
Wrap(text, text->GetLabel(), widthMax);
text->SetLabel(m_text);
}
protected:
virtual void OnOutputLine(const wxString& line)
{
m_text += line;
}
virtual void OnNewLine()
{
m_text += _T('\n');
}
private:
wxString m_text;
};
// NB: don't "factor out" the scope operator, SGI MIPSpro 7.3 (but not 7.4)
// gets confused if it doesn't immediately follow the class name
void
#if defined(__WXGTK__) && !defined(__WXUNIVERSAL__)
wxStaticText::
#else
wxStaticTextBase::
#endif
Wrap(int width)
{
wxLabelWrapper wrapper;
wrapper.WrapLabel(this, width);
}
#endif // wxUSE_STATTEXT
wxSizer *wxDialogBase::CreateButtonSizer(long flags)

480
src/common/stattextcmn.cpp Normal file
View File

@ -0,0 +1,480 @@
/////////////////////////////////////////////////////////////////////////////
// Name: src/common/stattextcmn.cpp
// Purpose: common (to all ports) wxStaticText functions
// Author: Vadim Zeitlin, Francesco Montorsi
// Created: 2007-01-07 (extracted from dlgcmn.cpp)
// RCS-ID: $Id$
// Copyright: (c) 1999-2006 Vadim Zeitlin
// (c) 2007 Francesco Montorsi
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// ============================================================================
// declarations
// ============================================================================
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/private/stattext.h"
#ifndef WX_PRECOMP
#include "wx/button.h"
#include "wx/dcclient.h"
#include "wx/intl.h"
#include "wx/settings.h"
#include "wx/stattext.h"
#include "wx/sizer.h"
#include "wx/containr.h"
#endif
#if wxUSE_STATTEXT
const wxChar *wxMarkupEntities[][wxMARKUP_ENTITY_MAX] =
{
// the entities handled by SetLabel() when wxST_MARKUP is used and their referenced string
{ wxT("&amp;"), wxT("&lt;"), wxT("&gt;"), wxT("&apos;"), wxT("&quot;") },
{ wxT("&"), wxT("<"), wxT(">"), wxT("'"), wxT("\"") }
};
// ----------------------------------------------------------------------------
// wxTextWrapper
// ----------------------------------------------------------------------------
void wxTextWrapper::Wrap(wxWindow *win, const wxString& text, int widthMax)
{
const wxChar *lastSpace = NULL;
wxString line;
const wxChar *lineStart = text.c_str();
for ( const wxChar *p = lineStart; ; p++ )
{
if ( IsStartOfNewLine() )
{
OnNewLine();
lastSpace = NULL;
line.clear();
lineStart = p;
}
if ( *p == _T('\n') || *p == _T('\0') )
{
DoOutputLine(line);
if ( *p == _T('\0') )
break;
}
else // not EOL
{
if ( *p == _T(' ') )
lastSpace = p;
line += *p;
if ( widthMax >= 0 && lastSpace )
{
int width;
win->GetTextExtent(line, &width, NULL);
if ( width > widthMax )
{
// remove the last word from this line
line.erase(lastSpace - lineStart, p + 1 - lineStart);
DoOutputLine(line);
// go back to the last word of this line which we didn't
// output yet
p = lastSpace;
}
}
//else: no wrapping at all or impossible to wrap
}
}
}
// ----------------------------------------------------------------------------
// wxLabelWrapper: helper class for wxStaticTextBase::Wrap()
// ----------------------------------------------------------------------------
class wxLabelWrapper : public wxTextWrapper
{
public:
void WrapLabel(wxWindow *text, int widthMax)
{
m_text.clear();
Wrap(text, text->GetLabel(), widthMax);
text->SetLabel(m_text);
}
protected:
virtual void OnOutputLine(const wxString& line)
{
m_text += line;
}
virtual void OnNewLine()
{
m_text += _T('\n');
}
private:
wxString m_text;
};
// ----------------------------------------------------------------------------
// wxStaticTextBase
// ----------------------------------------------------------------------------
void wxStaticTextBase::Wrap(int width)
{
wxLabelWrapper wrapper;
wrapper.WrapLabel(this, width);
}
wxString wxStaticTextBase::GetLabelText() const
{
wxString ret(GetLabel());
if (HasFlag(wxST_MARKUP))
ret = RemoveMarkup(ret);
return RemoveMnemonics(ret);
}
/*static*/
wxString wxStaticTextBase::RemoveMarkup(const wxString& text)
{
// strip out of "text" the markup for platforms which don't support it natively
bool inside_tag = false;
wxString label;
const wxChar *source = text;
for (size_t i=0, max=text.length(); i<max; i++)
{
switch (source[i])
{
case wxT('<'):
if (inside_tag)
{
wxLogDebug(wxT("Invalid markup !"));
return wxEmptyString;
}
inside_tag = true;
break;
case wxT('>'):
if (!inside_tag)
{
wxLogDebug(wxT("Invalid markup !"));
return wxEmptyString;
}
inside_tag = false;
break;
case wxT('&'):
{
if (i == max-1)
{
wxLogDebug(wxT("Cannot use & as last character of the string '%s'"),
text.c_str());
return wxEmptyString;
}
// is this ampersand introducing a mnemonic or rather an entity?
bool isMnemonic = true;
for (size_t j=0; j < wxMARKUP_ENTITY_MAX; j++)
{
const wxChar *entity = wxMarkupEntities[wxMARKUP_ELEMENT_NAME][j];
size_t entityLen = wxStrlen(entity);
if (max - i >= entityLen &&
wxStrncmp(entity, &source[i], entityLen) == 0)
{
// replace the &entity; string with the entity reference
label << wxMarkupEntities[wxMARKUP_ELEMENT_VALUE][j];
// little exception: when the entity reference is "&"
// (i.e. when entity is "&amp;"), substitute it with &&
// instead of a single ampersand:
if (*wxMarkupEntities[wxMARKUP_ELEMENT_VALUE][j] == wxT('&'))
label << wxT('&');
i += entityLen - 1; // the -1 is because main for()
// loop already increments i
isMnemonic = false;
break;
}
}
if (isMnemonic)
label << text[i];
}
break;
default:
if (!inside_tag)
label << text[i];
}
}
return label;
}
/* static */
wxString wxStaticTextBase::EscapeMarkup(const wxString& text)
{
wxString ret;
for (const wxChar *source = text; *source != wxT('\0'); source++)
{
bool isEntity = false;
// search in the list of the entities and eventually escape this character
for (size_t j=0; j < wxMARKUP_ENTITY_MAX; j++)
{
if (*source == *wxMarkupEntities[wxMARKUP_ELEMENT_VALUE][j])
{
ret << wxMarkupEntities[wxMARKUP_ELEMENT_NAME][j];
isEntity = true;
break;
}
}
if (!isEntity)
ret << *source; // this character does not need to be escaped
}
return ret;
}
// ----------------------------------------------------------------------------
// wxStaticTextBase - generic implementation for wxST_ELLIPSIZE_* support
// ----------------------------------------------------------------------------
void wxStaticTextBase::UpdateLabel()
{
if (!IsEllipsized())
return;
wxString newlabel = GetEllipsizedLabelWithoutMarkup();
// we need to touch the "real" label (i.e. the text set inside the control,
// using port-specific functions) instead of the string returned by GetLabel().
//
// In fact, we must be careful not to touch the original label passed to
// SetLabel() otherwise GetLabel() will behave in a strange way to the user
// (e.g. returning a "Ver...ing" instead of "Very long string") !
if (newlabel == DoGetLabel())
return;
DoSetLabel(newlabel);
}
wxString wxStaticTextBase::GetEllipsizedLabelWithoutMarkup() const
{
// this function should be used only by ports which do not support
// ellipsis in static texts: we first remove markup (which cannot
// be handled safely by Ellipsize()) and then ellipsize the result.
wxString ret(m_labelOrig);
// the order of the following two blocks is important!
if (HasFlag(wxST_MARKUP))
ret = RemoveMarkup(ret);
if (IsEllipsized())
ret = Ellipsize(ret);
return ret;
}
#define wxELLIPSE_REPLACEMENT wxT("...")
wxString wxStaticTextBase::Ellipsize(const wxString& label) const
{
wxSize sz(GetSize());
if (sz.GetWidth() < 2 || sz.GetHeight() < 2)
{
// the size of this window is not valid (yet)
return label;
}
wxClientDC dc(wx_const_cast(wxStaticTextBase*, this));
dc.SetFont(GetFont());
wxArrayInt charOffsets;
wxString ret;
// these cannot be cached as they can change because of e.g. a font change
int replacementWidth = dc.GetTextExtent(wxELLIPSE_REPLACEMENT).GetWidth();
int marginWidth = dc.GetCharWidth()*2;
// handle correctly labels with newlines
wxString curLine;
wxSize reqsize;
size_t len;
for ( const wxChar *pc = label; ; pc++ )
{
switch ( *pc )
{
case _T('\n'):
case _T('\0'):
len = curLine.length();
if (len > 0 &&
dc.GetPartialTextExtents(curLine, charOffsets))
{
wxASSERT(charOffsets.GetCount() == len);
size_t totalWidth = charOffsets.Last();
if ( totalWidth > (size_t)sz.GetWidth() )
{
// we need to ellipsize this row
int excessPixels = totalWidth - sz.GetWidth() +
replacementWidth +
marginWidth; // security margin (NEEDED!)
// remove characters in excess
size_t initialChar, // index of first char to erase
nChars; // how many chars do we need to erase?
if (HasFlag(wxST_ELLIPSIZE_START))
{
initialChar = 0;
for (nChars=0;
nChars < len && charOffsets[nChars] < excessPixels;
nChars++)
;
}
else if (HasFlag(wxST_ELLIPSIZE_MIDDLE))
{
// the start & end of the removed span of chars
initialChar = len/2;
size_t endChar = len/2;
int removed = 0;
for ( ; removed < excessPixels; )
{
if (initialChar > 0)
{
// width of the initialChar-th character
int width = charOffsets[initialChar] -
charOffsets[initialChar-1];
// remove the initialChar-th character
removed += width;
initialChar--;
}
if (endChar < len - 1 &&
removed < excessPixels)
{
// width of the (endChar+1)-th character
int width = charOffsets[endChar+1] -
charOffsets[endChar];
// remove the endChar-th character
removed += width;
endChar++;
}
if (initialChar == 0 && endChar == len-1)
{
nChars = len+1;
break;
}
}
initialChar++;
nChars = endChar - initialChar + 1;
}
else
{
wxASSERT(HasFlag(wxST_ELLIPSIZE_END));
wxASSERT(len > 0);
int maxWidth = totalWidth - excessPixels;
for (initialChar=0;
initialChar < len &&
charOffsets[initialChar] < maxWidth;
initialChar++)
;
if (initialChar == 0)
{
nChars = len;
}
else
{
initialChar--; // go back one character
nChars = len - initialChar;
}
}
if (nChars > len)
{
// need to remove the entire row!
curLine.clear();
}
else
{
// erase nChars characters after initialChar (included):
curLine.erase(initialChar, nChars+1);
// if there is space for the replacement dots, add them
if (sz.GetWidth() > replacementWidth)
curLine.insert(initialChar, wxELLIPSE_REPLACEMENT);
}
// if everything was ok, we should have shortened this line
// enough to make it fit in sz.GetWidth():
wxASSERT(dc.GetTextExtent(curLine).GetWidth() < sz.GetWidth());
}
}
// add this (ellipsized) row to the rest of the label
ret << curLine << *pc;
curLine.clear();
if ( *pc == _T('\0') )
return ret;
break;
// we need to remove mnemonics from the label for
// correct calculations
case _T('&'):
// pc+1 is safe: at worst we'll hit the \0
if (*(pc+1) == _T('&'))
curLine += _T('&'); // && becomes &
//else: remove this ampersand
break;
// we need also to expand tabs to properly calc their size
case _T('\t'):
// Windows natively expands the TABs to 6 spaces. Do the same:
curLine += wxT(" ");
break;
default:
curLine += *pc;
}
}
//return ret;
}
#endif // wxUSE_STATTEXT

View File

@ -203,6 +203,9 @@ void wxCheckBox::SetLabel( const wxString& label )
{
wxCHECK_RET( m_widgetLabel != NULL, wxT("invalid checkbox") );
// save the label inside m_label in case user calls GetLabel() later
wxControl::SetLabel(label);
GTKSetLabelForLabel(GTK_LABEL(m_widgetLabel), label);
}

View File

@ -22,6 +22,9 @@
#include "wx/fontutil.h"
#include "wx/gtk/private.h"
#include "wx/private/stattext.h"
// ============================================================================
// wxControl implementation
// ============================================================================
@ -89,30 +92,22 @@ void wxControl::PostCreation(const wxSize& size)
// wxControl dealing with labels
// ----------------------------------------------------------------------------
void wxControl::SetLabel( const wxString &label )
{
// keep the original string internally to be able to return it later (for
// consistency with the other ports)
m_label = label;
InvalidateBestSize();
}
wxString wxControl::GetLabel() const
{
return m_label;
}
void wxControl::GTKSetLabelForLabel(GtkLabel *w, const wxString& label)
{
// don't call the virtual function which might call this one back again
wxControl::SetLabel(label);
// save the original label
wxControlBase::SetLabel(label);
const wxString labelGTK = GTKConvertMnemonics(label);
gtk_label_set_text_with_mnemonic(w, wxGTK_CONV(labelGTK));
}
void wxControl::GTKSetLabelWithMarkupForLabel(GtkLabel *w, const wxString& label)
{
const wxString labelGTK = GTKConvertMnemonicsWithMarkup(label);
gtk_label_set_markup_with_mnemonic(w, wxGTK_CONV(labelGTK));
}
// ----------------------------------------------------------------------------
// GtkFrame helpers
//
@ -130,8 +125,8 @@ GtkWidget* wxControl::GTKCreateFrame(const wxString& label)
GtkWidget* framewidget = gtk_frame_new(NULL);
gtk_frame_set_label_widget(GTK_FRAME(framewidget), labelwidget);
return framewidget; //note that the label is already set so you'll
//only need to call wxControl::SetLabel afterwards
return framewidget; // note that the label is already set so you'll
// only need to call wxControl::SetLabel afterwards
}
void wxControl::GTKSetLabelForFrame(GtkFrame *w, const wxString& label)
@ -154,22 +149,19 @@ void wxControl::GTKFrameSetMnemonicWidget(GtkFrame* w, GtkWidget* widget)
}
// ----------------------------------------------------------------------------
// worker function implementing both GTKConvert/RemoveMnemonics()
//
// notice that under GTK+ 1 we only really need to support MNEMONICS_REMOVE as
// it doesn't support mnemonics anyhow but this would make the code so ugly
// that we do the same thing for GKT+ 1 and 2
// worker function implementing GTK*Mnemonics() functions
// ----------------------------------------------------------------------------
enum MnemonicsFlag
{
MNEMONICS_REMOVE,
MNEMONICS_CONVERT
MNEMONICS_CONVERT,
MNEMONICS_CONVERT_MARKUP
};
static wxString GTKProcessMnemonics(const wxString& label, MnemonicsFlag flag)
static wxString GTKProcessMnemonics(const wxChar* label, MnemonicsFlag flag)
{
const size_t len = label.length();
const size_t len = wxStrlen(label);
wxString labelGTK;
labelGTK.reserve(len);
for ( size_t i = 0; i < len; i++ )
@ -182,21 +174,50 @@ static wxString GTKProcessMnemonics(const wxString& label, MnemonicsFlag flag)
if ( i == len - 1 )
{
// "&" at the end of string is an error
wxLogDebug(wxT("Invalid label \"%s\"."), label.c_str());
wxLogDebug(wxT("Invalid label \"%s\"."), label);
break;
}
if ( flag == MNEMONICS_CONVERT_MARKUP )
{
bool isMnemonic = true;
// is this ampersand introducing a mnemonic or rather an entity?
for (size_t j=0; j < wxMARKUP_ENTITY_MAX; j++)
{
const wxChar *entity = wxMarkupEntities[wxMARKUP_ELEMENT_NAME][j];
size_t entityLen = wxStrlen(entity);
if (len - i >= entityLen &&
wxStrncmp(entity, &label[i], entityLen) == 0)
{
labelGTK << entity;
i += entityLen - 1; // the -1 is because main for()
// loop already increments i
isMnemonic = false;
break;
}
}
if (!isMnemonic)
continue;
}
ch = label[++i]; // skip '&' itself
switch ( ch )
{
case wxT('&'):
// special case: "&&" is not a mnemonic at all but just
// an escaped "&"
labelGTK += wxT('&');
if ( flag == MNEMONICS_CONVERT_MARKUP )
labelGTK += wxT("&amp;");
else
labelGTK += wxT('&');
break;
case wxT('_'):
if ( flag == MNEMONICS_CONVERT )
if ( flag != MNEMONICS_REMOVE )
{
// '_' can't be a GTK mnemonic apparently so
// replace it with something similar
@ -206,14 +227,14 @@ static wxString GTKProcessMnemonics(const wxString& label, MnemonicsFlag flag)
//else: fall through
default:
if ( flag == MNEMONICS_CONVERT )
if ( flag != MNEMONICS_REMOVE )
labelGTK += wxT('_');
labelGTK += ch;
}
break;
case wxT('_'):
if ( flag == MNEMONICS_CONVERT )
if ( flag != MNEMONICS_REMOVE )
{
// escape any existing underlines in the string so that
// they don't become mnemonics accidentally
@ -242,6 +263,12 @@ wxString wxControl::GTKConvertMnemonics(const wxString& label)
return GTKProcessMnemonics(label, MNEMONICS_CONVERT);
}
/* static */
wxString wxControl::GTKConvertMnemonicsWithMarkup(const wxString& label)
{
return GTKProcessMnemonics(label, MNEMONICS_CONVERT_MARKUP);
}
// ----------------------------------------------------------------------------
// wxControl styles (a.k.a. attributes)
// ----------------------------------------------------------------------------

View File

@ -41,7 +41,7 @@ wxStaticText::wxStaticText(wxWindow *parent,
long style,
const wxString &name)
{
Create( parent, id, label, pos, size, style, name );
Create( parent, id, label, pos, size, style, name );
}
bool wxStaticText::Create(wxWindow *parent,
@ -61,9 +61,7 @@ bool wxStaticText::Create(wxWindow *parent,
return FALSE;
}
const wxString labelGTK = GTKConvertMnemonics(label);
m_label = label;
m_widget = gtk_label_new_with_mnemonic(wxGTK_CONV(labelGTK));
m_widget = gtk_label_new(NULL);
GtkJustification justify;
if ( style & wxALIGN_CENTER )
@ -89,6 +87,24 @@ bool wxStaticText::Create(wxWindow *parent,
gtk_label_set_line_wrap( GTK_LABEL(m_widget), TRUE );
#ifdef __WXGTK26__
if (!gtk_check_version(2,6,0))
{
// set ellipsize mode
PangoEllipsizeMode ellipsizeMode = PANGO_ELLIPSIZE_NONE;
if ( style & wxST_ELLIPSIZE_START )
ellipsizeMode = PANGO_ELLIPSIZE_START;
else if ( style & wxST_ELLIPSIZE_MIDDLE )
ellipsizeMode = PANGO_ELLIPSIZE_MIDDLE;
else if ( style & wxST_ELLIPSIZE_END )
ellipsizeMode = PANGO_ELLIPSIZE_END;
gtk_label_set_ellipsize( GTK_LABEL(m_widget), ellipsizeMode );
}
#endif // __WXGTK26__
SetLabel(label);
m_parent->DoAddChild( this );
PostCreation(size);
@ -110,20 +126,39 @@ bool wxStaticText::Create(wxWindow *parent,
wxString wxStaticText::GetLabel() const
{
GtkLabel *label = GTK_LABEL(m_widget);
wxString str = wxGTK_CONV_BACK( gtk_label_get_text( label ) );
return wxString(str);
// we need to return the label just like it was passed to the last call
// to SetLabel(): i.e. with wx-style mnemonics and with markup
return wxControl::GetLabel();
}
void wxStaticText::SetLabel( const wxString &label )
void wxStaticText::SetLabel( const wxString& str )
{
wxCHECK_RET( m_widget != NULL, wxT("invalid static text") );
GTKSetLabelForLabel(GTK_LABEL(m_widget), label);
// save the label inside m_labelOrig in case user calls GetLabel() later
m_labelOrig = str;
wxString label(str);
if (gtk_check_version(2,6,0) &&
IsEllipsized())
{
// GTK+ < 2.6 does not support ellipsization:
// since we need to use our generic code for ellipsization (which does not
// behaves well in conjunction with markup; i.e. it may break the markup
// validity erasing portions of the string), we also need to strip out
// the markup (if present) from the label.
label = GetEllipsizedLabelWithoutMarkup();
}
if ( HasFlag(wxST_MARKUP) )
GTKSetLabelWithMarkupForLabel(GTK_LABEL(m_widget), label);
else
GTKSetLabelForLabel(GTK_LABEL(m_widget), label);
// adjust the label size to the new label unless disabled
if ( !HasFlag(wxST_NO_AUTORESIZE) )
if ( !HasFlag(wxST_NO_AUTORESIZE) &&
!IsEllipsized() ) // if ellipsize is ON, then we don't want to get resized!
SetSize( GetBestSize() );
}
@ -171,6 +206,13 @@ void wxStaticText::DoSetSize(int x, int y,
int sizeFlags )
{
wxControl::DoSetSize( x, y, width, height, sizeFlags );
if (gtk_check_version(2,6,0))
{
// GTK+ < 2.6 does not support ellipsization - we need to run our
// generic code (actually it will be run only if IsEllipsized() == true)
UpdateLabel();
}
}
wxSize wxStaticText::DoGetBestSize() const
@ -215,6 +257,20 @@ void wxStaticText::GTKWidgetDoSetMnemonic(GtkWidget* w)
gtk_label_set_mnemonic_widget(GTK_LABEL(m_widget), w);
}
// These functions should be used only when GTK+ < 2.6 by wxStaticTextBase::UpdateLabel()
wxString wxStaticText::DoGetLabel() const
{
GtkLabel *label = GTK_LABEL(m_widget);
return wxGTK_CONV_BACK( gtk_label_get_text( label ) );
}
void wxStaticText::DoSetLabel(const wxString& str)
{
GTKSetLabelForLabel(GTK_LABEL(m_widget), str);
}
// static
wxVisualAttributes
wxStaticText::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant))

View File

@ -43,24 +43,21 @@ bool wxStaticText::Create( wxWindow *parent,
{
m_macIsUserPane = false;
m_label = GetLabelText( label );
if ( !wxControl::Create( parent, id, pos, size, style, wxDefaultValidator, name ) )
return false;
Rect bounds = wxMacGetBoundsForControl( this, pos, size );
wxMacCFStringHolder str( m_label, m_font.GetEncoding() );
m_peer = new wxMacControl( this );
OSStatus err = CreateStaticTextControl(
MAC_WXHWND(parent->MacGetTopLevelWindowRef()),
&bounds, str, NULL, m_peer->GetControlRefAddr() );
&bounds, NULL, NULL, m_peer->GetControlRefAddr() );
verify_noerr( err );
if ( ( style & wxST_DOTS_END ) || ( style & wxST_DOTS_MIDDLE ) )
if ( ( style & wxST_ELLIPSIZE_END ) || ( style & wxST_ELLIPSIZE_MIDDLE ) )
{
TruncCode tCode = truncEnd;
if ( style & wxST_DOTS_MIDDLE )
if ( style & wxST_ELLIPSIZE_MIDDLE )
tCode = truncMiddle;
err = m_peer->SetData( kControlStaticTextTruncTag, tCode );
@ -69,6 +66,8 @@ bool wxStaticText::Create( wxWindow *parent,
MacPostControlCreate( pos, size );
SetLabel(label);
return true;
}
@ -133,16 +132,28 @@ wxSize wxStaticText::DoGetBestSize() const
return wxSize( bounds.h, bounds.v );
}
void wxStaticText::SetLabel( const wxString& st )
void wxStaticText::SetLabel(const wxString& label)
{
m_label = GetLabelText( st );
m_labelOrig = label;
wxMacCFStringHolder str( m_label, m_font.GetEncoding() );
CFStringRef ref = str;
OSStatus err = m_peer->SetData<CFStringRef>(kControlEntireControl, kControlStaticTextCFStringTag, ref );
verify_noerr( err );
// middle/end ellipsization is handled by the OS:
if ( HasFlag(wxST_ELLIPSIZE_END) || HasFlag(wxST_ELLIPSIZE_MIDDLE) )
{
// remove markup
wxString str(label);
if (HasFlag(wxST_MARKUP))
str = RemoveMarkup(label);
if ( !(GetWindowStyle() & wxST_NO_AUTORESIZE) )
// and leave ellipsization to the OS
DoSetLabel(str);
}
else // not supported natively
{
DoSetLabel(GetEllipsizedLabelWithoutMarkup());
}
if ( !(GetWindowStyle() & wxST_NO_AUTORESIZE) &&
!IsEllipsized() ) // don't resize if we adjust to current size
{
InvalidateBestSize();
SetSize( GetBestSize() );
@ -170,4 +181,26 @@ bool wxStaticText::SetFont(const wxFont& font)
return ret;
}
// for wxST_ELLIPSIZE_* support:
void wxStaticText::DoSetLabel(const wxString& label)
{
m_label = RemoveMnemonics(label);
wxMacCFStringHolder str( m_label, m_font.GetEncoding() );
OSStatus err = m_peer->SetData<CFStringRef>(kControlEntireControl, kControlStaticTextCFStringTag, str);
verify_noerr( err );
}
wxString wxStaticText::DoGetLabel() const
{
return m_label;
}
/*
FIXME: UpdateLabel() should be called on size events when wxST_ELLIPSIZE_START is set
to allow correct dynamic ellipsizing of the label
*/
#endif //if wxUSE_STATTEXT

View File

@ -47,14 +47,12 @@ bool wxStaticText::Create(wxWindow *parent, wxWindowID id,
Widget borderWidget =
(Widget) wxCreateBorderWidget( (WXWidget)parentWidget, style );
wxXmString text( GetLabelText( label ) );
m_labelWidget =
XtVaCreateManagedWidget (wxConstCast(name.mb_str(), char),
xmLabelWidgetClass,
borderWidget ? borderWidget : parentWidget,
wxFont::GetFontTag(), m_font.GetFontTypeC(XtDisplay(parentWidget)),
XmNlabelString, text(),
XmNalignment, ((style & wxALIGN_RIGHT) ? XmALIGNMENT_END :
((style & wxALIGN_CENTRE) ? XmALIGNMENT_CENTER :
XmALIGNMENT_BEGINNING)),
@ -68,12 +66,33 @@ bool wxStaticText::Create(wxWindow *parent, wxWindowID id,
ChangeBackgroundColour ();
SetLabel(label);
return true;
}
void wxStaticText::SetLabel(const wxString& label)
{
wxXmString label_str(GetLabelText(label));
m_labelOrig = label; // save original label
// Motif does not support neither ellipsize nor markup in static text:
DoSetLabel(GetEllipsizedLabelWithoutMarkup());
}
// for wxST_ELLIPSIZE_* support:
wxString wxStaticText::DoGetLabel() const
{
XmString label = NULL;
XtVaGetValues((Widget)m_labelWidget, XmNlabelString, &label, NULL);
return wxXmStringToString(label);
}
void wxStaticText::DoSetLabel(const wxString& str)
{
// build our own cleaned label
wxXmString label_str(RemoveMnemonics(str));
// This variable means we don't need so many casts later.
Widget widget = (Widget) m_labelWidget;
@ -84,4 +103,9 @@ void wxStaticText::SetLabel(const wxString& label)
NULL);
}
/*
FIXME: UpdateLabel() should be called on size events to allow correct
dynamic ellipsizing of the label
*/
#endif // wxUSE_STATTEXT

View File

@ -162,6 +162,10 @@ bool wxControl::MSWCreateControl(const wxChar *classname,
return false;
}
// saving the label in m_labelOrig to return it verbatim
// later in GetLabel()
m_labelOrig = label;
// install wxWidgets window proc for this window
SubclassWin(m_hWnd);

View File

@ -121,6 +121,16 @@ WXDWORD wxStaticText::MSWGetStyle(long style, WXDWORD *exstyle) const
msStyle |= SS_LEFT;
// this style is necessary to receive mouse events
// Win NT and later have the SS_ENDELLIPSIS style which is useful to us:
if (wxGetOsVersion() == wxOS_WINDOWS_NT)
{
// for now, add the SS_ENDELLIPSIS style if wxST_ELLIPSIZE_END is given;
// we may need to remove it later in ::SetLabel() if the given label
// has newlines
if ( style & wxST_ELLIPSIZE_END )
msStyle |= SS_ENDELLIPSIS;
}
msStyle |= SS_NOTIFY;
return msStyle;
@ -181,20 +191,60 @@ wxSize wxStaticText::DoGetBestSize() const
void wxStaticText::DoSetSize(int x, int y, int w, int h, int sizeFlags)
{
// we need to refresh the window after changing its size as the standard
// control doesn't always update itself properly
// note: we first need to set the size and _then_ call UpdateLabel
wxStaticTextBase::DoSetSize(x, y, w, h, sizeFlags);
// do we need to ellipsize the contents?
long styleReal = ::GetWindowLong(GetHwnd(), GWL_STYLE);
if ( !(styleReal & SS_ENDELLIPSIS) )
{
// we don't have SS_ENDELLIPSIS style:
// we need to (eventually) do ellipsization ourselves
UpdateLabel();
}
//else: we don't or the OS will do it for us
// we need to refresh the window after changing its size as the standard
// control doesn't always update itself properly
Refresh();
}
void wxStaticText::SetLabel(const wxString& label)
{
wxStaticTextBase::SetLabel(label);
long styleReal = ::GetWindowLong(GetHwnd(), GWL_STYLE);
if ( HasFlag(wxST_ELLIPSIZE_END) &&
wxGetOsVersion() == wxOS_WINDOWS_NT )
{
// adding SS_ENDELLIPSIS or SS_ENDELLIPSIS "disables" the correct
// newline handling in static texts: the newlines in the labels are
// shown as square. Thus we don't use it even on newer OS when
// the static label contains a newline.
if ( label.Contains(wxT('\n')) )
styleReal &= ~SS_ENDELLIPSIS;
else
styleReal |= SS_ENDELLIPSIS;
::SetWindowLong(GetHwnd(), GWL_STYLE, styleReal);
}
else // style not supported natively
{
styleReal &= ~SS_ENDELLIPSIS;
::SetWindowLong(GetHwnd(), GWL_STYLE, styleReal);
}
// this call will save the label in m_labelOrig and set it into this window
// (through wxWindow::SetLabel)
m_labelOrig = label;
if ((styleReal & SS_ENDELLIPSIS) == 0)
DoSetLabel(GetEllipsizedLabelWithoutMarkup());
else
DoSetLabel(RemoveMarkup(label));
// adjust the size of the window to fit to the label unless autoresizing is
// disabled
if ( !(GetWindowStyle() & wxST_NO_AUTORESIZE) )
if ( !HasFlag(wxST_NO_AUTORESIZE) &&
!IsEllipsized() ) // if ellipsize is ON, then we don't want to get resized!
{
InvalidateBestSize();
DoSetSize(wxDefaultCoord, wxDefaultCoord, wxDefaultCoord, wxDefaultCoord,
@ -202,14 +252,13 @@ void wxStaticText::SetLabel(const wxString& label)
}
}
bool wxStaticText::SetFont(const wxFont& font)
{
bool ret = wxControl::SetFont(font);
// adjust the size of the window to fit to the label unless autoresizing is
// disabled
if ( !(GetWindowStyle() & wxST_NO_AUTORESIZE) )
if ( !HasFlag(wxST_NO_AUTORESIZE) )
{
InvalidateBestSize();
DoSetSize(wxDefaultCoord, wxDefaultCoord, wxDefaultCoord, wxDefaultCoord,
@ -219,4 +268,17 @@ bool wxStaticText::SetFont(const wxFont& font)
return ret;
}
// for wxST_ELLIPSIZE_* support:
wxString wxStaticText::DoGetLabel() const
{
return wxGetWindowText(GetHwnd());
}
void wxStaticText::DoSetLabel(const wxString& str)
{
SetWindowText(GetHwnd(), str.c_str());
}
#endif // wxUSE_STATTEXT

View File

@ -66,11 +66,9 @@ bool wxStaticText::Create( wxWindow* pParent,
else
lSstyle |= DT_LEFT;
wxString sLabel = ::wxPMTextToLabel(rsLabel);
m_hWnd = (WXHWND)::WinCreateWindow( (HWND)GetHwndOf(pParent) // Parent window handle
,WC_STATIC // Window class
,(PSZ)sLabel.c_str() // Initial Text
,NULL // Initial Text
,(ULONG)lSstyle // Style flags
,0L, 0L, 0L, 0L // Origin -- 0 size
,(HWND)GetHwndOf(pParent) // owner window handle (same as parent
@ -103,12 +101,14 @@ bool wxStaticText::Create( wxWindow* pParent,
SetYComp(0);
SetSize( nX, nY, nWidth, nHeight );
SetLabel(rsLabel);
return true;
} // end of wxStaticText::Create
wxSize wxStaticText::DoGetBestSize() const
{
wxString sText(wxGetWindowText(GetHWND()));
wxString sText(GetLabel());
int nWidthTextMax = 0;
int nWidthLine = 0;
int nHeightTextTotal = 0;
@ -205,6 +205,10 @@ void wxStaticText::DoSetSize(
,nHeight
,nSizeFlags
);
// eventually update label (if ellipsizing is on):
UpdateLabel();
Refresh();
} // end of wxStaticText::DoSetSize
@ -229,14 +233,17 @@ void wxStaticText::SetLabel(
const wxString& rsLabel
)
{
wxString sLabel = ::wxPMTextToLabel(rsLabel);
::WinSetWindowText(GetHwnd(), (PSZ)sLabel.c_str());
m_labelOrig = rsLabel; // save original label
// OS/2 does not support neither ellipsize nor markup in static text:
DoSetLabel(GetEllipsizedLabelWithoutMarkup(label));
//
// Adjust the size of the window to fit to the label unless autoresizing is
// disabled
//
if (!(GetWindowStyle() & wxST_NO_AUTORESIZE))
if (!(GetWindowStyle() & wxST_NO_AUTORESIZE) &&
!IsEllipsized())
{
wxCoord vX;
wxCoord vY;
@ -263,3 +270,19 @@ MRESULT wxStaticText::OS2WindowProc(
,lParam
);
} // end of wxStaticText::OS2WindowProc
// for wxST_ELLIPSIZE_* support:
void wxStaticText::DoSetLabel(const wxString& str)
{
wxString sLabel = ::wxPMTextToLabel(str);
::WinSetWindowText(GetHwnd(), (PSZ)sLabel.c_str());
}
wxString wxStaticText::DoGetLabel() const
{
// FIXME: how to retrieve the text?
//return wxGetWindowText(GetHWND());
}

View File

@ -122,6 +122,14 @@ int wxControl::FindAccelIndex(const wxString& label, wxString *labelOnly)
}
void wxControl::SetLabel(const wxString& label)
{
// save original label
wxControlBase::SetLabel(label);
UnivDoSetLabel(label);
}
void wxControl::UnivDoSetLabel(const wxString& label)
{
wxString labelOld = m_label;
m_indexAccel = FindAccelIndex(label, &m_label);
@ -132,9 +140,4 @@ void wxControl::SetLabel(const wxString& label)
}
}
wxString wxControl::GetLabel() const
{
return m_label;
}
#endif // wxUSE_CONTROLS

View File

@ -66,11 +66,6 @@ bool wxStaticText::Create(wxWindow *parent,
// size management
// ----------------------------------------------------------------------------
void wxStaticText::SetLabel(const wxString& label)
{
wxControl::SetLabel(label);
}
wxSize wxStaticText::DoGetBestClientSize() const
{
wxStaticText *self = wxConstCast(this, wxStaticText);
@ -99,4 +94,28 @@ void wxStaticText::DoDraw(wxControlRenderer *renderer)
renderer->DrawLabel();
}
void wxStaticText::SetLabel(const wxString& str)
{
// save original label
m_labelOrig = str;
// draw as real label the result of GetEllipsizedLabelWithoutMarkup:
DoSetLabel(GetEllipsizedLabelWithoutMarkup());
}
void wxStaticText::DoSetLabel(const wxString& str)
{
UnivDoSetLabel(str);
}
wxString wxStaticText::DoGetLabel() const
{
return wxControl::GetLabel();
}
/*
FIXME: UpdateLabel() should be called on size events to allow correct
dynamic ellipsizing of the label
*/
#endif // wxUSE_STATTEXT