monodll_sizer.o \
monodll_srchcmn.o \
monodll_statbar.o \
+ monodll_stattextcmn.o \
monodll_stockitem.o \
monodll_tbarbase.o \
monodll_textcmn.o \
monodll_sizer.o \
monodll_srchcmn.o \
monodll_statbar.o \
+ monodll_stattextcmn.o \
monodll_stockitem.o \
monodll_tbarbase.o \
monodll_textcmn.o \
monolib_sizer.o \
monolib_srchcmn.o \
monolib_statbar.o \
+ monolib_stattextcmn.o \
monolib_stockitem.o \
monolib_tbarbase.o \
monolib_textcmn.o \
monolib_sizer.o \
monolib_srchcmn.o \
monolib_statbar.o \
+ monolib_stattextcmn.o \
monolib_stockitem.o \
monolib_tbarbase.o \
monolib_textcmn.o \
coredll_sizer.o \
coredll_srchcmn.o \
coredll_statbar.o \
+ coredll_stattextcmn.o \
coredll_stockitem.o \
coredll_tbarbase.o \
coredll_textcmn.o \
coredll_sizer.o \
coredll_srchcmn.o \
coredll_statbar.o \
+ coredll_stattextcmn.o \
coredll_stockitem.o \
coredll_tbarbase.o \
coredll_textcmn.o \
corelib_sizer.o \
corelib_srchcmn.o \
corelib_statbar.o \
+ corelib_stattextcmn.o \
corelib_stockitem.o \
corelib_tbarbase.o \
corelib_textcmn.o \
corelib_sizer.o \
corelib_srchcmn.o \
corelib_statbar.o \
+ corelib_stattextcmn.o \
corelib_stockitem.o \
corelib_tbarbase.o \
corelib_textcmn.o \
@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
@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
@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
@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
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
$(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 \
$(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 \
$(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 \
$(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 \
$(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 \
$(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 \
$(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 \
$(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 \
$(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) $**
$(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) $**
$(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) $**
$(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) $**
$(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 \
$(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 \
$(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 \
$(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 \
$(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 \
$(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 \
$(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 \
$(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 \
$(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) $<
$(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) $<
$(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) $<
$(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) $<
$(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 \
$(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 \
$(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 \
$(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 \
$(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 \
$(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 \
$(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 \
$(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 \
$(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) $**
$(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) $**
$(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) $**
$(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) $**
$(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 &
$(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 &
$(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 &
$(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 &
$(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 &
$(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 &
$(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 &
$(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 &
$(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) $<
$(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) $<
$(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) $<
$(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) $<
# 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
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
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}.
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}
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{&} or as \texttt{&&}}
+\twocolitem{\texttt{'}}{\texttt{'}}
+\twocolitem{\texttt{"}}{\texttt{"}}
+\twocolitem{\texttt{<}}{\texttt{<}}
+\twocolitem{\texttt{>}}{\texttt{>}}
+\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;
+%% string in order to force Tex2rtf to show the && 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; &apos; &quot;; &lt; &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}}
// 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
// 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
// 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)
};
*/
#define wxST_SIZEGRIP 0x0010
-/*
- * wxStaticText flags
- */
-#define wxST_NO_AUTORESIZE 0x0001
-#define wxST_DOTS_MIDDLE 0x0002
-#define wxST_DOTS_END 0x0004
-
/*
* wxStaticBitmap flags
*/
const wxValidator& validator = wxDefaultValidator,
const wxString& name = wxControlNameStr);
- virtual void SetLabel( const wxString &label );
- virtual wxString GetLabel() const;
virtual wxVisualAttributes GetDefaultAttributes() const;
// 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);
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,
// 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)
};
// wxStaticText
//-----------------------------------------------------------------------------
-class WXDLLIMPEXP_CORE wxStaticText : public wxControl
+class WXDLLIMPEXP_CORE wxStaticText : public wxStaticTextBase
{
public:
wxStaticText();
static wxVisualAttributes
GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
- // see wx/stattext.h
- void Wrap(int width);
+
// implementation
// --------------
virtual wxSize DoGetBestSize() const;
+ virtual wxString DoGetLabel() const;
+ virtual void DoSetLabel(const wxString& str);
+
DECLARE_DYNAMIC_CLASS(wxStaticText)
};
protected :
+ virtual wxString DoGetLabel() const;
+ virtual void DoSetLabel(const wxString& str);
+
virtual wxSize DoGetBestSize() const ;
DECLARE_DYNAMIC_CLASS_NO_COPY(wxStaticText)
virtual WXWidget GetLabelWidget() const
{ return m_labelWidget; }
+ virtual void DoSetLabel(const wxString& str);
+ virtual wxString DoGetLabel() const;
+
protected:
WXWidget m_labelWidget;
};
int sizeFlags = wxSIZE_AUTO);
virtual wxSize DoGetBestSize() const;
+ virtual wxString DoGetLabel() const;
+ virtual void DoSetLabel(const wxString& str);
+
DECLARE_DYNAMIC_CLASS_NO_COPY(wxStaticText)
};
);
virtual wxSize DoGetBestSize(void) const;
+ virtual void DoSetLabel(const wxString& str);
+ virtual wxString DoGetLabel() const;
+
private:
DECLARE_DYNAMIC_CLASS(wxStaticText)
}; // end of CLASS wxStaticText
--- /dev/null
+/////////////////////////////////////////////////////////////////////////////
+// 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] == ">"
+// 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_
#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
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 (< > " ' &)
+ 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)
};
// 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);
// 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;
// draw the control
virtual void DoDraw(wxControlRenderer *renderer);
+ virtual void DoSetLabel(const wxString& str);
+ virtual wxString DoGetLabel() const;
+
DECLARE_ABSTRACT_CLASS(wxStaticText)
};
{
StaticPage_Reset = wxID_HIGHEST,
StaticPage_BoxText,
- StaticPage_LabelText
+ StaticPage_LabelText,
+ StaticPage_LabelTextWithMarkup
};
// alignment radiobox values
StaticVAlign_Max
};
+enum
+{
+ StaticEllipsize_Start,
+ StaticEllipsize_Middle,
+ StaticEllipsize_End
+};
+
// ----------------------------------------------------------------------------
// MyStaticText and MyStaticBox
// ----------------------------------------------------------------------------
void OnButtonReset(wxCommandEvent& event);
void OnButtonBoxText(wxCommandEvent& event);
void OnButtonLabelText(wxCommandEvent& event);
+ void OnButtonLabelWithMarkupText(wxCommandEvent& event);
// reset all parameters
void Reset();
// 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
// the text entries for command parameters
wxTextCtrl *m_textBox,
- *m_textLabel;
+ *m_textLabel,
+ *m_textLabelWithMarkup;
private:
DECLARE_EVENT_TABLE()
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)
#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()
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
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);
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: < > & ' " ")
+ _T(" but you can still place &mnemonics..."));
// right pane
wxSizer *sizerRight = new wxBoxSizer(wxHORIZONTAL);
sizerTop->Add(sizerMiddle, 0, wxGROW | wxALL, 10);
sizerTop->Add(sizerRight, 1, wxGROW | (wxALL & ~wxRIGHT), 10);
- // final initializations
- Reset();
-
SetSizer(sizerTop);
}
{
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);
// 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;
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;
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,
#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);
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();
}
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());
}
}
}
-
-void wxControlBase::SetLabel( const wxString &label )
-{
- InvalidateBestSize();
- wxWindow::SetLabel(label);
-}
-
bool wxControlBase::SetFont(const wxFont& font)
{
InvalidateBestSize();
#endif // wxUSE_RADIOBTN
}
+/* static */
+wxString wxControlBase::RemoveMnemonics(const wxString& str)
+{
+ return wxStripMenuCodes(str, wxStrip_Mnemonics);
+}
+
// ----------------------------------------------------------------------------
// wxStaticBitmap
// ----------------------------------------------------------------------------
#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
#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:
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)
--- /dev/null
+/////////////////////////////////////////////////////////////////////////////
+// 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("&"), wxT("<"), wxT(">"), wxT("'"), wxT(""") },
+ { 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 "&"), 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
{
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);
}
#include "wx/fontutil.h"
#include "wx/gtk/private.h"
+#include "wx/private/stattext.h"
+
+
// ============================================================================
// wxControl implementation
// ============================================================================
// wxControl dealing with labels
// ----------------------------------------------------------------------------
-void wxControl::SetLabel( const wxString &label )
+void wxControl::GTKSetLabelForLabel(GtkLabel *w, const wxString& label)
{
- // keep the original string internally to be able to return it later (for
- // consistency with the other ports)
- m_label = label;
+ // save the original label
+ wxControlBase::SetLabel(label);
- InvalidateBestSize();
+ const wxString labelGTK = GTKConvertMnemonics(label);
+ gtk_label_set_text_with_mnemonic(w, wxGTK_CONV(labelGTK));
}
-wxString wxControl::GetLabel() const
+void wxControl::GTKSetLabelWithMarkupForLabel(GtkLabel *w, const wxString& label)
{
- return m_label;
+ const wxString labelGTK = GTKConvertMnemonicsWithMarkup(label);
+ gtk_label_set_markup_with_mnemonic(w, wxGTK_CONV(labelGTK));
}
-void wxControl::GTKSetLabelForLabel(GtkLabel *w, const wxString& label)
-{
- // don't call the virtual function which might call this one back again
- wxControl::SetLabel(label);
-
- const wxString labelGTK = GTKConvertMnemonics(label);
-
- gtk_label_set_text_with_mnemonic(w, wxGTK_CONV(labelGTK));
-}
// ----------------------------------------------------------------------------
// GtkFrame helpers
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)
}
// ----------------------------------------------------------------------------
-// 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++ )
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("&");
+ 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
//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
return GTKProcessMnemonics(label, MNEMONICS_CONVERT);
}
+/* static */
+wxString wxControl::GTKConvertMnemonicsWithMarkup(const wxString& label)
+{
+ return GTKProcessMnemonics(label, MNEMONICS_CONVERT_MARKUP);
+}
+
// ----------------------------------------------------------------------------
// wxControl styles (a.k.a. attributes)
// ----------------------------------------------------------------------------
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,
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 )
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);
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() );
}
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
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))
{
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 );
MacPostControlCreate( pos, size );
+ SetLabel(label);
+
return true;
}
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() );
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
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)),
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;
NULL);
}
+/*
+ FIXME: UpdateLabel() should be called on size events to allow correct
+ dynamic ellipsizing of the label
+*/
+
#endif // wxUSE_STATTEXT
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);
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;
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,
}
}
-
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,
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
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
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;
,nHeight
,nSizeFlags
);
+
+ // eventually update label (if ellipsizing is on):
+ UpdateLabel();
+
Refresh();
} // end of wxStaticText::DoSetSize
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;
,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());
+}
+
}
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);
}
}
-wxString wxControl::GetLabel() const
-{
- return m_label;
-}
-
#endif // wxUSE_CONTROLS
// size management
// ----------------------------------------------------------------------------
-void wxStaticText::SetLabel(const wxString& label)
-{
- wxControl::SetLabel(label);
-}
-
wxSize wxStaticText::DoGetBestClientSize() const
{
wxStaticText *self = wxConstCast(this, wxStaticText);
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