monodll_layout.o \
monodll_lboxcmn.o \
monodll_listctrlcmn.o \
+ monodll_markupparser.o \
monodll_matrix.o \
monodll_menucmn.o \
monodll_mousemanager.o \
monodll_layout.o \
monodll_lboxcmn.o \
monodll_listctrlcmn.o \
+ monodll_markupparser.o \
monodll_matrix.o \
monodll_menucmn.o \
monodll_mousemanager.o \
monolib_layout.o \
monolib_lboxcmn.o \
monolib_listctrlcmn.o \
+ monolib_markupparser.o \
monolib_matrix.o \
monolib_menucmn.o \
monolib_mousemanager.o \
monolib_layout.o \
monolib_lboxcmn.o \
monolib_listctrlcmn.o \
+ monolib_markupparser.o \
monolib_matrix.o \
monolib_menucmn.o \
monolib_mousemanager.o \
coredll_layout.o \
coredll_lboxcmn.o \
coredll_listctrlcmn.o \
+ coredll_markupparser.o \
coredll_matrix.o \
coredll_menucmn.o \
coredll_mousemanager.o \
coredll_layout.o \
coredll_lboxcmn.o \
coredll_listctrlcmn.o \
+ coredll_markupparser.o \
coredll_matrix.o \
coredll_menucmn.o \
coredll_mousemanager.o \
corelib_layout.o \
corelib_lboxcmn.o \
corelib_listctrlcmn.o \
+ corelib_markupparser.o \
corelib_matrix.o \
corelib_menucmn.o \
corelib_mousemanager.o \
corelib_layout.o \
corelib_lboxcmn.o \
corelib_listctrlcmn.o \
+ corelib_markupparser.o \
corelib_matrix.o \
corelib_menucmn.o \
corelib_mousemanager.o \
@COND_USE_GUI_1@monodll_listctrlcmn.o: $(srcdir)/src/common/listctrlcmn.cpp $(MONODLL_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/listctrlcmn.cpp
+@COND_USE_GUI_1@monodll_markupparser.o: $(srcdir)/src/common/markupparser.cpp $(MONODLL_ODEP)
+@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/markupparser.cpp
+
@COND_USE_GUI_1@monodll_matrix.o: $(srcdir)/src/common/matrix.cpp $(MONODLL_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/matrix.cpp
@COND_USE_GUI_1@monolib_listctrlcmn.o: $(srcdir)/src/common/listctrlcmn.cpp $(MONOLIB_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/listctrlcmn.cpp
+@COND_USE_GUI_1@monolib_markupparser.o: $(srcdir)/src/common/markupparser.cpp $(MONOLIB_ODEP)
+@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/markupparser.cpp
+
@COND_USE_GUI_1@monolib_matrix.o: $(srcdir)/src/common/matrix.cpp $(MONOLIB_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/matrix.cpp
@COND_USE_GUI_1@coredll_listctrlcmn.o: $(srcdir)/src/common/listctrlcmn.cpp $(COREDLL_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/common/listctrlcmn.cpp
+@COND_USE_GUI_1@coredll_markupparser.o: $(srcdir)/src/common/markupparser.cpp $(COREDLL_ODEP)
+@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/common/markupparser.cpp
+
@COND_USE_GUI_1@coredll_matrix.o: $(srcdir)/src/common/matrix.cpp $(COREDLL_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/common/matrix.cpp
@COND_USE_GUI_1@corelib_listctrlcmn.o: $(srcdir)/src/common/listctrlcmn.cpp $(CORELIB_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/common/listctrlcmn.cpp
+@COND_USE_GUI_1@corelib_markupparser.o: $(srcdir)/src/common/markupparser.cpp $(CORELIB_ODEP)
+@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/common/markupparser.cpp
+
@COND_USE_GUI_1@corelib_matrix.o: $(srcdir)/src/common/matrix.cpp $(CORELIB_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/common/matrix.cpp
src/common/layout.cpp
src/common/lboxcmn.cpp
src/common/listctrlcmn.cpp
+ src/common/markupparser.cpp
src/common/matrix.cpp
src/common/menucmn.cpp
src/common/mousemanager.cpp
$(OBJS)\monodll_layout.obj \\r
$(OBJS)\monodll_lboxcmn.obj \\r
$(OBJS)\monodll_listctrlcmn.obj \\r
+ $(OBJS)\monodll_markupparser.obj \
$(OBJS)\monodll_matrix.obj \\r
$(OBJS)\monodll_menucmn.obj \\r
$(OBJS)\monodll_mousemanager.obj \\r
$(OBJS)\monodll_layout.obj \\r
$(OBJS)\monodll_lboxcmn.obj \\r
$(OBJS)\monodll_listctrlcmn.obj \\r
+ $(OBJS)\monodll_markupparser.obj \
$(OBJS)\monodll_matrix.obj \\r
$(OBJS)\monodll_menucmn.obj \\r
$(OBJS)\monodll_mousemanager.obj \\r
$(OBJS)\monolib_layout.obj \\r
$(OBJS)\monolib_lboxcmn.obj \\r
$(OBJS)\monolib_listctrlcmn.obj \\r
+ $(OBJS)\monolib_markupparser.obj \
$(OBJS)\monolib_matrix.obj \\r
$(OBJS)\monolib_menucmn.obj \\r
$(OBJS)\monolib_mousemanager.obj \\r
$(OBJS)\monolib_layout.obj \\r
$(OBJS)\monolib_lboxcmn.obj \\r
$(OBJS)\monolib_listctrlcmn.obj \\r
+ $(OBJS)\monolib_markupparser.obj \
$(OBJS)\monolib_matrix.obj \\r
$(OBJS)\monolib_menucmn.obj \\r
$(OBJS)\monolib_mousemanager.obj \\r
$(OBJS)\coredll_layout.obj \\r
$(OBJS)\coredll_lboxcmn.obj \\r
$(OBJS)\coredll_listctrlcmn.obj \\r
+ $(OBJS)\coredll_markupparser.obj \
$(OBJS)\coredll_matrix.obj \\r
$(OBJS)\coredll_menucmn.obj \\r
$(OBJS)\coredll_mousemanager.obj \\r
$(OBJS)\coredll_layout.obj \\r
$(OBJS)\coredll_lboxcmn.obj \\r
$(OBJS)\coredll_listctrlcmn.obj \\r
+ $(OBJS)\coredll_markupparser.obj \
$(OBJS)\coredll_matrix.obj \\r
$(OBJS)\coredll_menucmn.obj \\r
$(OBJS)\coredll_mousemanager.obj \\r
$(OBJS)\corelib_layout.obj \\r
$(OBJS)\corelib_lboxcmn.obj \\r
$(OBJS)\corelib_listctrlcmn.obj \\r
+ $(OBJS)\corelib_markupparser.obj \
$(OBJS)\corelib_matrix.obj \\r
$(OBJS)\corelib_menucmn.obj \\r
$(OBJS)\corelib_mousemanager.obj \\r
$(OBJS)\corelib_layout.obj \\r
$(OBJS)\corelib_lboxcmn.obj \\r
$(OBJS)\corelib_listctrlcmn.obj \\r
+ $(OBJS)\corelib_markupparser.obj \
$(OBJS)\corelib_matrix.obj \\r
$(OBJS)\corelib_menucmn.obj \\r
$(OBJS)\corelib_mousemanager.obj \\r
!endif\r
\r
!if "$(USE_GUI)" == "1"\r
+$(OBJS)\monodll_markupparser.obj: ..\..\src\common\markupparser.cpp
+ $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\common\markupparser.cpp
+!endif
+
+!if "$(USE_GUI)" == "1"
$(OBJS)\monodll_matrix.obj: ..\..\src\common\matrix.cpp\r
$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\common\matrix.cpp\r
!endif\r
!endif\r
\r
!if "$(USE_GUI)" == "1"\r
+$(OBJS)\monolib_markupparser.obj: ..\..\src\common\markupparser.cpp
+ $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\markupparser.cpp
+!endif
+
+!if "$(USE_GUI)" == "1"
$(OBJS)\monolib_matrix.obj: ..\..\src\common\matrix.cpp\r
$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\matrix.cpp\r
!endif\r
!endif\r
\r
!if "$(USE_GUI)" == "1"\r
+$(OBJS)\coredll_markupparser.obj: ..\..\src\common\markupparser.cpp
+ $(CXX) -q -c -P -o$@ $(COREDLL_CXXFLAGS) ..\..\src\common\markupparser.cpp
+!endif
+
+!if "$(USE_GUI)" == "1"
$(OBJS)\coredll_matrix.obj: ..\..\src\common\matrix.cpp\r
$(CXX) -q -c -P -o$@ $(COREDLL_CXXFLAGS) ..\..\src\common\matrix.cpp\r
!endif\r
!endif\r
\r
!if "$(USE_GUI)" == "1"\r
+$(OBJS)\corelib_markupparser.obj: ..\..\src\common\markupparser.cpp
+ $(CXX) -q -c -P -o$@ $(CORELIB_CXXFLAGS) ..\..\src\common\markupparser.cpp
+!endif
+
+!if "$(USE_GUI)" == "1"
$(OBJS)\corelib_matrix.obj: ..\..\src\common\matrix.cpp\r
$(CXX) -q -c -P -o$@ $(CORELIB_CXXFLAGS) ..\..\src\common\matrix.cpp\r
!endif\r
$(OBJS)\monodll_layout.o \\r
$(OBJS)\monodll_lboxcmn.o \\r
$(OBJS)\monodll_listctrlcmn.o \\r
+ $(OBJS)\monodll_markupparser.o \
$(OBJS)\monodll_matrix.o \\r
$(OBJS)\monodll_menucmn.o \\r
$(OBJS)\monodll_mousemanager.o \\r
$(OBJS)\monodll_layout.o \\r
$(OBJS)\monodll_lboxcmn.o \\r
$(OBJS)\monodll_listctrlcmn.o \\r
+ $(OBJS)\monodll_markupparser.o \
$(OBJS)\monodll_matrix.o \\r
$(OBJS)\monodll_menucmn.o \\r
$(OBJS)\monodll_mousemanager.o \\r
$(OBJS)\monolib_layout.o \\r
$(OBJS)\monolib_lboxcmn.o \\r
$(OBJS)\monolib_listctrlcmn.o \\r
+ $(OBJS)\monolib_markupparser.o \
$(OBJS)\monolib_matrix.o \\r
$(OBJS)\monolib_menucmn.o \\r
$(OBJS)\monolib_mousemanager.o \\r
$(OBJS)\monolib_layout.o \\r
$(OBJS)\monolib_lboxcmn.o \\r
$(OBJS)\monolib_listctrlcmn.o \\r
+ $(OBJS)\monolib_markupparser.o \
$(OBJS)\monolib_matrix.o \\r
$(OBJS)\monolib_menucmn.o \\r
$(OBJS)\monolib_mousemanager.o \\r
$(OBJS)\coredll_layout.o \\r
$(OBJS)\coredll_lboxcmn.o \\r
$(OBJS)\coredll_listctrlcmn.o \\r
+ $(OBJS)\coredll_markupparser.o \
$(OBJS)\coredll_matrix.o \\r
$(OBJS)\coredll_menucmn.o \\r
$(OBJS)\coredll_mousemanager.o \\r
$(OBJS)\coredll_layout.o \\r
$(OBJS)\coredll_lboxcmn.o \\r
$(OBJS)\coredll_listctrlcmn.o \\r
+ $(OBJS)\coredll_markupparser.o \
$(OBJS)\coredll_matrix.o \\r
$(OBJS)\coredll_menucmn.o \\r
$(OBJS)\coredll_mousemanager.o \\r
$(OBJS)\corelib_layout.o \\r
$(OBJS)\corelib_lboxcmn.o \\r
$(OBJS)\corelib_listctrlcmn.o \\r
+ $(OBJS)\corelib_markupparser.o \
$(OBJS)\corelib_matrix.o \\r
$(OBJS)\corelib_menucmn.o \\r
$(OBJS)\corelib_mousemanager.o \\r
$(OBJS)\corelib_layout.o \\r
$(OBJS)\corelib_lboxcmn.o \\r
$(OBJS)\corelib_listctrlcmn.o \\r
+ $(OBJS)\corelib_markupparser.o \
$(OBJS)\corelib_matrix.o \\r
$(OBJS)\corelib_menucmn.o \\r
$(OBJS)\corelib_mousemanager.o \\r
endif\r
\r
ifeq ($(USE_GUI),1)\r
+$(OBJS)\monodll_markupparser.o: ../../src/common/markupparser.cpp
+ $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
+endif
+
+ifeq ($(USE_GUI),1)
$(OBJS)\monodll_matrix.o: ../../src/common/matrix.cpp\r
$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<\r
endif\r
endif\r
\r
ifeq ($(USE_GUI),1)\r
+$(OBJS)\monolib_markupparser.o: ../../src/common/markupparser.cpp
+ $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
+endif
+
+ifeq ($(USE_GUI),1)
$(OBJS)\monolib_matrix.o: ../../src/common/matrix.cpp\r
$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<\r
endif\r
endif\r
\r
ifeq ($(USE_GUI),1)\r
+$(OBJS)\coredll_markupparser.o: ../../src/common/markupparser.cpp
+ $(CXX) -c -o $@ $(COREDLL_CXXFLAGS) $(CPPDEPS) $<
+endif
+
+ifeq ($(USE_GUI),1)
$(OBJS)\coredll_matrix.o: ../../src/common/matrix.cpp\r
$(CXX) -c -o $@ $(COREDLL_CXXFLAGS) $(CPPDEPS) $<\r
endif\r
endif\r
\r
ifeq ($(USE_GUI),1)\r
+$(OBJS)\corelib_markupparser.o: ../../src/common/markupparser.cpp
+ $(CXX) -c -o $@ $(CORELIB_CXXFLAGS) $(CPPDEPS) $<
+endif
+
+ifeq ($(USE_GUI),1)
$(OBJS)\corelib_matrix.o: ../../src/common/matrix.cpp\r
$(CXX) -c -o $@ $(CORELIB_CXXFLAGS) $(CPPDEPS) $<\r
endif\r
$(OBJS)\monodll_layout.obj \\r
$(OBJS)\monodll_lboxcmn.obj \\r
$(OBJS)\monodll_listctrlcmn.obj \\r
+ $(OBJS)\monodll_markupparser.obj \
$(OBJS)\monodll_matrix.obj \\r
$(OBJS)\monodll_menucmn.obj \\r
$(OBJS)\monodll_mousemanager.obj \\r
$(OBJS)\monodll_layout.obj \\r
$(OBJS)\monodll_lboxcmn.obj \\r
$(OBJS)\monodll_listctrlcmn.obj \\r
+ $(OBJS)\monodll_markupparser.obj \
$(OBJS)\monodll_matrix.obj \\r
$(OBJS)\monodll_menucmn.obj \\r
$(OBJS)\monodll_mousemanager.obj \\r
$(OBJS)\monolib_layout.obj \\r
$(OBJS)\monolib_lboxcmn.obj \\r
$(OBJS)\monolib_listctrlcmn.obj \\r
+ $(OBJS)\monolib_markupparser.obj \
$(OBJS)\monolib_matrix.obj \\r
$(OBJS)\monolib_menucmn.obj \\r
$(OBJS)\monolib_mousemanager.obj \\r
$(OBJS)\monolib_layout.obj \\r
$(OBJS)\monolib_lboxcmn.obj \\r
$(OBJS)\monolib_listctrlcmn.obj \\r
+ $(OBJS)\monolib_markupparser.obj \
$(OBJS)\monolib_matrix.obj \\r
$(OBJS)\monolib_menucmn.obj \\r
$(OBJS)\monolib_mousemanager.obj \\r
$(OBJS)\coredll_layout.obj \\r
$(OBJS)\coredll_lboxcmn.obj \\r
$(OBJS)\coredll_listctrlcmn.obj \\r
+ $(OBJS)\coredll_markupparser.obj \
$(OBJS)\coredll_matrix.obj \\r
$(OBJS)\coredll_menucmn.obj \\r
$(OBJS)\coredll_mousemanager.obj \\r
$(OBJS)\coredll_layout.obj \\r
$(OBJS)\coredll_lboxcmn.obj \\r
$(OBJS)\coredll_listctrlcmn.obj \\r
+ $(OBJS)\coredll_markupparser.obj \
$(OBJS)\coredll_matrix.obj \\r
$(OBJS)\coredll_menucmn.obj \\r
$(OBJS)\coredll_mousemanager.obj \\r
$(OBJS)\corelib_layout.obj \\r
$(OBJS)\corelib_lboxcmn.obj \\r
$(OBJS)\corelib_listctrlcmn.obj \\r
+ $(OBJS)\corelib_markupparser.obj \
$(OBJS)\corelib_matrix.obj \\r
$(OBJS)\corelib_menucmn.obj \\r
$(OBJS)\corelib_mousemanager.obj \\r
$(OBJS)\corelib_layout.obj \\r
$(OBJS)\corelib_lboxcmn.obj \\r
$(OBJS)\corelib_listctrlcmn.obj \\r
+ $(OBJS)\corelib_markupparser.obj \
$(OBJS)\corelib_matrix.obj \\r
$(OBJS)\corelib_menucmn.obj \\r
$(OBJS)\corelib_mousemanager.obj \\r
!endif\r
\r
!if "$(USE_GUI)" == "1"\r
+$(OBJS)\monodll_markupparser.obj: ..\..\src\common\markupparser.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\markupparser.cpp
+!endif
+
+!if "$(USE_GUI)" == "1"
$(OBJS)\monodll_matrix.obj: ..\..\src\common\matrix.cpp\r
$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\matrix.cpp\r
!endif\r
!endif\r
\r
!if "$(USE_GUI)" == "1"\r
+$(OBJS)\monolib_markupparser.obj: ..\..\src\common\markupparser.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\markupparser.cpp
+!endif
+
+!if "$(USE_GUI)" == "1"
$(OBJS)\monolib_matrix.obj: ..\..\src\common\matrix.cpp\r
$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\matrix.cpp\r
!endif\r
!endif\r
\r
!if "$(USE_GUI)" == "1"\r
+$(OBJS)\coredll_markupparser.obj: ..\..\src\common\markupparser.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(COREDLL_CXXFLAGS) ..\..\src\common\markupparser.cpp
+!endif
+
+!if "$(USE_GUI)" == "1"
$(OBJS)\coredll_matrix.obj: ..\..\src\common\matrix.cpp\r
$(CXX) /c /nologo /TP /Fo$@ $(COREDLL_CXXFLAGS) ..\..\src\common\matrix.cpp\r
!endif\r
!endif\r
\r
!if "$(USE_GUI)" == "1"\r
+$(OBJS)\corelib_markupparser.obj: ..\..\src\common\markupparser.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(CORELIB_CXXFLAGS) ..\..\src\common\markupparser.cpp
+!endif
+
+!if "$(USE_GUI)" == "1"
$(OBJS)\corelib_matrix.obj: ..\..\src\common\matrix.cpp\r
$(CXX) /c /nologo /TP /Fo$@ $(CORELIB_CXXFLAGS) ..\..\src\common\matrix.cpp\r
!endif\r
$(OBJS)\monodll_layout.obj &\r
$(OBJS)\monodll_lboxcmn.obj &\r
$(OBJS)\monodll_listctrlcmn.obj &\r
+ $(OBJS)\monodll_markupparser.obj &
$(OBJS)\monodll_matrix.obj &\r
$(OBJS)\monodll_menucmn.obj &\r
$(OBJS)\monodll_mousemanager.obj &\r
$(OBJS)\monodll_layout.obj &\r
$(OBJS)\monodll_lboxcmn.obj &\r
$(OBJS)\monodll_listctrlcmn.obj &\r
+ $(OBJS)\monodll_markupparser.obj &
$(OBJS)\monodll_matrix.obj &\r
$(OBJS)\monodll_menucmn.obj &\r
$(OBJS)\monodll_mousemanager.obj &\r
$(OBJS)\monolib_layout.obj &\r
$(OBJS)\monolib_lboxcmn.obj &\r
$(OBJS)\monolib_listctrlcmn.obj &\r
+ $(OBJS)\monolib_markupparser.obj &
$(OBJS)\monolib_matrix.obj &\r
$(OBJS)\monolib_menucmn.obj &\r
$(OBJS)\monolib_mousemanager.obj &\r
$(OBJS)\monolib_layout.obj &\r
$(OBJS)\monolib_lboxcmn.obj &\r
$(OBJS)\monolib_listctrlcmn.obj &\r
+ $(OBJS)\monolib_markupparser.obj &
$(OBJS)\monolib_matrix.obj &\r
$(OBJS)\monolib_menucmn.obj &\r
$(OBJS)\monolib_mousemanager.obj &\r
$(OBJS)\coredll_layout.obj &\r
$(OBJS)\coredll_lboxcmn.obj &\r
$(OBJS)\coredll_listctrlcmn.obj &\r
+ $(OBJS)\coredll_markupparser.obj &
$(OBJS)\coredll_matrix.obj &\r
$(OBJS)\coredll_menucmn.obj &\r
$(OBJS)\coredll_mousemanager.obj &\r
$(OBJS)\coredll_layout.obj &\r
$(OBJS)\coredll_lboxcmn.obj &\r
$(OBJS)\coredll_listctrlcmn.obj &\r
+ $(OBJS)\coredll_markupparser.obj &
$(OBJS)\coredll_matrix.obj &\r
$(OBJS)\coredll_menucmn.obj &\r
$(OBJS)\coredll_mousemanager.obj &\r
$(OBJS)\corelib_layout.obj &\r
$(OBJS)\corelib_lboxcmn.obj &\r
$(OBJS)\corelib_listctrlcmn.obj &\r
+ $(OBJS)\corelib_markupparser.obj &
$(OBJS)\corelib_matrix.obj &\r
$(OBJS)\corelib_menucmn.obj &\r
$(OBJS)\corelib_mousemanager.obj &\r
$(OBJS)\corelib_layout.obj &\r
$(OBJS)\corelib_lboxcmn.obj &\r
$(OBJS)\corelib_listctrlcmn.obj &\r
+ $(OBJS)\corelib_markupparser.obj &
$(OBJS)\corelib_matrix.obj &\r
$(OBJS)\corelib_menucmn.obj &\r
$(OBJS)\corelib_mousemanager.obj &\r
!endif\r
\r
!ifeq USE_GUI 1\r
+$(OBJS)\monodll_markupparser.obj : .AUTODEPEND ..\..\src\common\markupparser.cpp
+ $(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
+!endif
+
+!ifeq USE_GUI 1
$(OBJS)\monodll_matrix.obj : .AUTODEPEND ..\..\src\common\matrix.cpp\r
$(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<\r
!endif\r
!endif\r
\r
!ifeq USE_GUI 1\r
+$(OBJS)\monolib_markupparser.obj : .AUTODEPEND ..\..\src\common\markupparser.cpp
+ $(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
+!endif
+
+!ifeq USE_GUI 1
$(OBJS)\monolib_matrix.obj : .AUTODEPEND ..\..\src\common\matrix.cpp\r
$(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<\r
!endif\r
!endif\r
\r
!ifeq USE_GUI 1\r
+$(OBJS)\coredll_markupparser.obj : .AUTODEPEND ..\..\src\common\markupparser.cpp
+ $(CXX) -bt=nt -zq -fo=$^@ $(COREDLL_CXXFLAGS) $<
+!endif
+
+!ifeq USE_GUI 1
$(OBJS)\coredll_matrix.obj : .AUTODEPEND ..\..\src\common\matrix.cpp\r
$(CXX) -bt=nt -zq -fo=$^@ $(COREDLL_CXXFLAGS) $<\r
!endif\r
!endif\r
\r
!ifeq USE_GUI 1\r
+$(OBJS)\corelib_markupparser.obj : .AUTODEPEND ..\..\src\common\markupparser.cpp
+ $(CXX) -bt=nt -zq -fo=$^@ $(CORELIB_CXXFLAGS) $<
+!endif
+
+!ifeq USE_GUI 1
$(OBJS)\corelib_matrix.obj : .AUTODEPEND ..\..\src\common\matrix.cpp\r
$(CXX) -bt=nt -zq -fo=$^@ $(CORELIB_CXXFLAGS) $<\r
!endif\r
# End Source File\r
# Begin Source File\r
\r
+SOURCE=..\..\src\common\markupparser.cpp
+# End Source File
+# Begin Source File
+
SOURCE=..\..\src\common\matrix.cpp\r
# End Source File\r
# Begin Source File\r
RelativePath="..\..\src\common\listctrlcmn.cpp">\r
</File>\r
<File\r
+ RelativePath="..\..\src\common\markupparser.cpp">
+ </File>
+ <File
RelativePath="..\..\src\common\matrix.cpp">\r
</File>\r
<File\r
>\r
</File>\r
<File\r
+ RelativePath="..\..\src\common\markupparser.cpp"
+ >
+ </File>
+ <File
RelativePath="..\..\src\common\matrix.cpp"\r
>\r
</File>\r
>\r
</File>\r
<File\r
+ RelativePath="..\..\src\common\markupparser.cpp"
+ >
+ </File>
+ <File
RelativePath="..\..\src\common\matrix.cpp"\r
>\r
</File>\r
--- /dev/null
+///////////////////////////////////////////////////////////////////////////////
+// Name: wx/private/markupparser.h
+// Purpose: Classes for parsing simple markup.
+// Author: Vadim Zeitlin
+// Created: 2011-02-16
+// RCS-ID: $Id: $
+// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
+// Licence: wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_PRIVATE_MARKUPPARSER_H_
+#define _WX_PRIVATE_MARKUPPARSER_H_
+
+#include "wx/string.h"
+
+// ----------------------------------------------------------------------------
+// wxMarkupSpanAttributes: information about attributes for a markup span.
+// ----------------------------------------------------------------------------
+
+struct wxMarkupSpanAttributes
+{
+ enum OptionalBool
+ {
+ Unspecified = -1,
+ No,
+ Yes
+ };
+
+ wxMarkupSpanAttributes()
+ {
+ m_sizeKind = Size_Unspecified;
+
+ m_isBold =
+ m_isItalic =
+ m_isUnderlined =
+ m_isStrikethrough = Unspecified;
+ }
+
+ // If a string is empty, it means that the corresponding attribute is not
+ // set.
+ wxString m_fgCol,
+ m_bgCol,
+ m_fontFace;
+
+ // There are many ways of specifying the size. First of all, the size may
+ // be relative in which case m_fontSize is either -1 or +1 meaning that
+ // it's one step smaller or larger than the current font. Second, it may be
+ // absolute in which case m_fontSize contains either the size in 1024th of
+ // a point (Pango convention) or its values are in [-3, 3] interval and map
+ // to [xx-small, xx-large] CSS-like font size specification. And finally it
+ // may be not specified at all, of course, in which case the value of
+ // m_fontSize doesn't matter and it shouldn't be used.
+ enum
+ {
+ Size_Unspecified,
+ Size_Relative,
+ Size_Symbolic,
+ Size_PointParts
+ } m_sizeKind;
+ int m_fontSize;
+
+ // If the value is Unspecified, the attribute wasn't given.
+ OptionalBool m_isBold,
+ m_isItalic,
+ m_isUnderlined,
+ m_isStrikethrough;
+};
+
+// ----------------------------------------------------------------------------
+// wxMarkupParserOutput: gathers the results of parsing markup.
+// ----------------------------------------------------------------------------
+
+class wxMarkupParserOutput
+{
+public:
+ wxMarkupParserOutput() { }
+
+ // Virtual functions called by wxMarkupParser while parsing the markup.
+
+ // Called for a run of normal text.
+ virtual void OnText(const wxString& text) = 0;
+
+ // These functions correspond to the simple tags without parameters.
+ virtual void OnBoldStart() = 0;
+ virtual void OnBoldEnd() = 0;
+
+ virtual void OnItalicStart() = 0;
+ virtual void OnItalicEnd() = 0;
+
+ virtual void OnUnderlinedStart() = 0;
+ virtual void OnUnderlinedEnd() = 0;
+
+ virtual void OnStrikethroughStart() = 0;
+ virtual void OnStrikethroughEnd() = 0;
+
+ virtual void OnBigStart() = 0;
+ virtual void OnBigEnd() = 0;
+
+ virtual void OnSmallStart() = 0;
+ virtual void OnSmallEnd() = 0;
+
+ virtual void OnTeletypeStart() = 0;
+ virtual void OnTeletypeEnd() = 0;
+
+ // The generic span start and end functions.
+ virtual void OnSpanStart(const wxMarkupSpanAttributes& attrs) = 0;
+ virtual void OnSpanEnd(const wxMarkupSpanAttributes& attrs) = 0;
+
+private:
+ wxDECLARE_NO_COPY_CLASS(wxMarkupParserOutput);
+};
+
+// ----------------------------------------------------------------------------
+// wxMarkupParser: parses the given markup text into wxMarkupParserOutput.
+// ----------------------------------------------------------------------------
+
+class WXDLLIMPEXP_CORE wxMarkupParser
+{
+public:
+ // Initialize the parser with the object that will receive parsing results.
+ // This object lifetime must be greater than ours.
+ explicit wxMarkupParser(wxMarkupParserOutput& output)
+ : m_output(output)
+ {
+ }
+
+ // Parse the entire string and call wxMarkupParserOutput methods.
+ //
+ // Return true if the string was successfully parsed or false if it failed
+ // (presumably because of syntax errors in the markup).
+ bool Parse(const wxString& text);
+
+ // Quote a normal string, not meant to be interpreted as markup, so that it
+ // produces the same string when parsed as markup. This means, for example,
+ // replacing '<' in the input string with "<" to prevent them from being
+ // interpreted as tag opening characters.
+ static wxString Quote(const wxString& text);
+
+private:
+ // Simple struct combining the name of a tag and its attributes.
+ struct TagAndAttrs
+ {
+ TagAndAttrs(const wxString& name_) : name(name_) { }
+
+ wxString name;
+ wxMarkupSpanAttributes attrs;
+ };
+
+ // Call the wxMarkupParserOutput method corresponding to the given tag.
+ //
+ // Return false if the tag doesn't match any of the known ones.
+ bool OutputTag(const TagAndAttrs& tagAndAttrs, bool start);
+
+ // Parse the attributes and fill the provided TagAndAttrs object with the
+ // information about them. Does nothing if attrs string is empty.
+ //
+ // Returns empty string on success of a [fragment of an] error message if
+ // we failed to parse the attributes.
+ wxString ParseAttrs(wxString attrs, TagAndAttrs& tagAndAttrs);
+
+
+ wxMarkupParserOutput& m_output;
+
+ wxDECLARE_NO_COPY_CLASS(wxMarkupParser);
+};
+
+#endif // _WX_PRIVATE_MARKUPPARSER_H_
--- /dev/null
+///////////////////////////////////////////////////////////////////////////////
+// Name: src/common/markupparser.cpp
+// Purpose: Implementation of wxMarkupParser.
+// Author: Vadim Zeitlin
+// Created: 2011-02-16
+// RCS-ID: $Id: $
+// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
+// Licence: wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
+
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+// for compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+#endif // WX_PRECOMP
+
+#include "wx/private/markupparser.h"
+
+#include "wx/stack.h"
+
+namespace
+{
+
+// ----------------------------------------------------------------------------
+// constants
+// ----------------------------------------------------------------------------
+
+// Array containing the predefined XML 1.0 entities.
+const struct XMLEntity
+{
+ const char *name;
+ int len; // == strlen(name)
+ char value;
+} xmlEntities[] =
+{
+ { "lt", 2, '<' },
+ { "gt", 2, '>' },
+ { "amp", 3, '&' },
+ { "apos", 4, '\''},
+ { "quot", 4, '"' },
+};
+
+// ----------------------------------------------------------------------------
+// helper functions
+// ----------------------------------------------------------------------------
+
+wxString
+ExtractUntil(char ch, wxString::const_iterator& it, wxString::const_iterator end)
+{
+ wxString str;
+ for ( ; it != end; ++it )
+ {
+ if ( *it == ch )
+ return str;
+
+ str += *it;
+ }
+
+ // Return empty string to indicate that we didn't find ch at all.
+ return wxString();
+}
+
+} // anonymous namespace
+
+// ============================================================================
+// wxMarkupParser implementation
+// ============================================================================
+
+wxString
+wxMarkupParser::ParseAttrs(wxString attrs, TagAndAttrs& tagAndAttrs)
+{
+ if ( tagAndAttrs.name.CmpNoCase("span") != 0 && !attrs.empty() )
+ {
+ return wxString::Format("tag \"%s\" can't have attributes",
+ tagAndAttrs.name);
+ }
+
+ // TODO: Parse more attributes described at
+ // http://library.gnome.org/devel/pango/stable/PangoMarkupFormat.html
+ // and at least ignore them gracefully instead of giving errors (but
+ // quite a few of them could be supported as well, notable font_desc).
+
+ wxMarkupSpanAttributes& spanAttrs = tagAndAttrs.attrs;
+
+ while ( !attrs.empty() )
+ {
+ wxString rest;
+ const wxString attr = attrs.BeforeFirst(' ', &rest);
+ attrs = rest;
+
+ // The "original" versions are used for error messages only.
+ wxString valueOrig;
+ const wxString nameOrig = attr.BeforeFirst('=', &valueOrig);
+
+ const wxString name = nameOrig.Lower();
+ wxString value = valueOrig.Lower();
+
+ // All attributes values must be quoted.
+ if ( value.length() < 2 ||
+ (value[0] != value.Last()) ||
+ (value[0] != '"' && value[0] != '\'') )
+ {
+ return wxString::Format("bad quoting for value of \"%s\"",
+ nameOrig);
+ }
+
+ value.assign(value, 1, value.length() - 2);
+
+ if ( name == "foreground" || name == "fgcolor" || name == "color" )
+ {
+ spanAttrs.m_fgCol = value;
+ }
+ else if ( name == "background" || name == "bgcolor" )
+ {
+ spanAttrs.m_bgCol = value;
+ }
+ else if ( name == "font_family" || name == "face" )
+ {
+ spanAttrs.m_fontFace = value;
+ }
+ else if ( name == "font_weight" || name == "weight" )
+ {
+ unsigned long weight;
+
+ if ( value == "ultralight" || value == "light" || value == "normal" )
+ spanAttrs.m_isBold = wxMarkupSpanAttributes::No;
+ else if ( value == "bold" || value == "ultrabold" || value == "heavy" )
+ spanAttrs.m_isBold = wxMarkupSpanAttributes::Yes;
+ else if ( value.ToULong(&weight) )
+ spanAttrs.m_isBold = weight >= 600 ? wxMarkupSpanAttributes::Yes
+ : wxMarkupSpanAttributes::No;
+ else
+ return wxString::Format("invalid font weight \"%s\"", valueOrig);
+ }
+ else if ( name == "font_style" || name == "style" )
+ {
+ if ( value == "normal" )
+ spanAttrs.m_isItalic = wxMarkupSpanAttributes::No;
+ else if ( value == "oblique" || value == "italic" )
+ spanAttrs.m_isItalic = wxMarkupSpanAttributes::Yes;
+ else
+ return wxString::Format("invalid font style \"%s\"", valueOrig);
+ }
+ else if ( name == "size" )
+ {
+ unsigned long size;
+ if ( value.ToULong(&size) )
+ {
+ spanAttrs.m_sizeKind = wxMarkupSpanAttributes::Size_PointParts;
+ spanAttrs.m_fontSize = size;
+ }
+ else if ( value == "smaller" || value == "larger" )
+ {
+ spanAttrs.m_sizeKind = wxMarkupSpanAttributes::Size_Relative;
+ spanAttrs.m_fontSize = value == "smaller" ? -1 : +1;
+ }
+ else // Must be a CSS-like size specification
+ {
+ int cssSize = 1;
+ wxString rest;
+ if ( value.StartsWith("xx-", &rest) )
+ cssSize = 3;
+ else if ( value.StartsWith("x-", &rest) )
+ cssSize = 2;
+ else if ( value == "medium" )
+ cssSize = 0;
+ else
+ rest = value;
+
+ if ( cssSize != 0 )
+ {
+ if ( rest == "small" )
+ cssSize = -cssSize;
+ else if ( rest != "large" )
+ return wxString::Format("invalid font size \"%s\"",
+ valueOrig);
+ }
+
+ spanAttrs.m_sizeKind = wxMarkupSpanAttributes::Size_Symbolic;
+ spanAttrs.m_fontSize = cssSize;
+ }
+ }
+ }
+
+ return wxString();
+}
+
+bool wxMarkupParser::OutputTag(const TagAndAttrs& tagAndAttrs, bool start)
+{
+ if ( tagAndAttrs.name.CmpNoCase("span") == 0 )
+ {
+ if ( start )
+ m_output.OnSpanStart(tagAndAttrs.attrs);
+ else
+ m_output.OnSpanEnd(tagAndAttrs.attrs);
+
+ return true;
+ }
+ else // non-span tag
+ {
+ static const struct TagHandler
+ {
+ const char *name;
+ void (wxMarkupParserOutput::*startFunc)();
+ void (wxMarkupParserOutput::*endFunc)();
+ } tagHandlers[] =
+ {
+ { "b", &wxMarkupParserOutput::OnBoldStart,
+ &wxMarkupParserOutput::OnBoldEnd },
+ { "i", &wxMarkupParserOutput::OnItalicStart,
+ &wxMarkupParserOutput::OnItalicEnd },
+ { "u", &wxMarkupParserOutput::OnUnderlinedStart,
+ &wxMarkupParserOutput::OnUnderlinedEnd },
+ { "s", &wxMarkupParserOutput::OnStrikethroughStart,
+ &wxMarkupParserOutput::OnStrikethroughEnd },
+ { "big", &wxMarkupParserOutput::OnBigStart,
+ &wxMarkupParserOutput::OnBigEnd },
+ { "small", &wxMarkupParserOutput::OnSmallStart,
+ &wxMarkupParserOutput::OnSmallEnd },
+ { "tt", &wxMarkupParserOutput::OnTeletypeStart,
+ &wxMarkupParserOutput::OnTeletypeEnd },
+ };
+
+ for ( unsigned n = 0; n < WXSIZEOF(tagHandlers); n++ )
+ {
+ const TagHandler& h = tagHandlers[n];
+
+ if ( tagAndAttrs.name.CmpNoCase(h.name) == 0 )
+ {
+ if ( start )
+ (m_output.*(h.startFunc))();
+ else
+ (m_output.*(h.endFunc))();
+
+ return true;
+ }
+ }
+ }
+
+ // Unknown tag name.
+ return false;
+}
+
+bool wxMarkupParser::Parse(const wxString& text)
+{
+ // The stack containing the names and corresponding attributes (which are
+ // actually only used for <span> tags) of all of the currently opened tag
+ // or none if we're not inside any tag.
+ wxStack<TagAndAttrs> tags;
+
+ // Current run of text.
+ wxString current;
+
+ const wxString::const_iterator end = text.end();
+ for ( wxString::const_iterator it = text.begin(); it != end; ++it )
+ {
+ switch ( (*it).GetValue() )
+ {
+ case '<':
+ {
+ // Flush the text preceding the tag, if any.
+ if ( !current.empty() )
+ {
+ m_output.OnText(current);
+ current.clear();
+ }
+
+ // Remember the tag starting position for the error
+ // messages.
+ const size_t pos = it - text.begin();
+
+ bool start = true;
+ if ( ++it != end && *it == '/' )
+ {
+ start = false;
+ ++it;
+ }
+
+ const wxString tag = ExtractUntil('>', it, end);
+ if ( tag.empty() )
+ {
+ wxLogDebug("%s at %lu.",
+ it == end ? "Unclosed tag starting"
+ : "Empty tag",
+ pos);
+ return false;
+ }
+
+ if ( start )
+ {
+ wxString attrs;
+ const wxString name = tag.BeforeFirst(' ', &attrs);
+
+ TagAndAttrs tagAndAttrs(name);
+ const wxString err = ParseAttrs(attrs, tagAndAttrs);
+ if ( !err.empty() )
+ {
+ wxLogDebug("Bad attributes for \"%s\" "
+ "at %lu: %s.",
+ name, pos, err);
+ return false;
+ }
+
+ tags.push(tagAndAttrs);
+ }
+ else // end tag
+ {
+ if ( tags.empty() || tags.top().name != tag )
+ {
+ wxLogDebug("Unmatched closing tag \"%s\" at %lu.",
+ tag, pos);
+ return false;
+ }
+ }
+
+ if ( !OutputTag(tags.top(), start) )
+ {
+ wxLogDebug("Unknown tag at %lu.", pos);
+ return false;
+ }
+
+ if ( !start )
+ tags.pop();
+ }
+ break;
+
+ case '>':
+ wxLogDebug("'>' should be escaped as \">\"; at %lu.",
+ it - text.begin());
+ break;
+
+ case '&':
+ // Processing is somewhat complicated: we need to recognize at
+ // least the "<" entity to allow escaping left square
+ // brackets in the markup and, in fact, we recognize all of the
+ // standard XML entities for consistency with Pango markup
+ // parsing.
+ //
+ // However we also allow '&' to appear unescaped, i.e. directly
+ // and not as "&" when it is used to introduce the mnemonic
+ // for the label. In this case we simply leave it alone.
+ //
+ // Notice that this logic makes it impossible to have a label
+ // with "lt;" inside it and using "l" as mnemonic but hopefully
+ // this shouldn't be a problem in practice.
+ {
+ const size_t pos = it - text.begin() + 1;
+
+ unsigned n;
+ for ( n = 0; n < WXSIZEOF(xmlEntities); n++ )
+ {
+ const XMLEntity& xmlEnt = xmlEntities[n];
+ if ( text.compare(pos, xmlEnt.len, xmlEnt.name) == 0
+ && text[pos + xmlEnt.len] == ';' )
+ {
+ // Escape the ampersands if needed to protect them
+ // from being interpreted as mnemonics indicators.
+ if ( xmlEnt.value == '&' )
+ current += "&&";
+ else
+ current += xmlEnt.value;
+
+ it += xmlEnt.len + 1; // +1 for '&' itself
+
+ break;
+ }
+ }
+
+ if ( n < WXSIZEOF(xmlEntities) )
+ break;
+ //else: fall through, '&' is not special
+ }
+
+ default:
+ current += *it;
+ }
+ }
+
+ if ( !tags.empty() )
+ {
+ wxLogDebug("Missing closing tag for \"%s\"", tags.top().name);
+ return false;
+ }
+
+ if ( !current.empty() )
+ m_output.OnText(current);
+
+ return true;
+}
+
+/* static */
+wxString wxMarkupParser::Quote(const wxString& text)
+{
+ wxString quoted;
+ quoted.reserve(text.length());
+
+ for ( wxString::const_iterator it = text.begin(); it != text.end(); ++it )
+ {
+ unsigned n;
+ for ( n = 0; n < WXSIZEOF(xmlEntities); n++ )
+ {
+ const XMLEntity& xmlEnt = xmlEntities[n];
+ if ( *it == xmlEnt.value )
+ {
+ quoted << '&' << xmlEnt.name << ';';
+ break;
+ }
+ }
+
+ if ( n == WXSIZEOF(xmlEntities) )
+ quoted += *it;
+ }
+
+ return quoted;
+}
test_gui_listboxtest.o \
test_gui_listctrltest.o \
test_gui_listviewtest.o \
+ test_gui_markuptest.o \
test_gui_notebooktest.o \
test_gui_ownerdrawncomboboxtest.o \
test_gui_pickerbasetest.o \
test_gui_listviewtest.o: $(srcdir)/controls/listviewtest.cpp $(TEST_GUI_ODEP)
$(CXXC) -c -o $@ $(TEST_GUI_CXXFLAGS) $(srcdir)/controls/listviewtest.cpp
+test_gui_markuptest.o: $(srcdir)/controls/markuptest.cpp $(TEST_GUI_ODEP)
+ $(CXXC) -c -o $@ $(TEST_GUI_CXXFLAGS) $(srcdir)/controls/markuptest.cpp
+
test_gui_notebooktest.o: $(srcdir)/controls/notebooktest.cpp $(TEST_GUI_ODEP)
$(CXXC) -c -o $@ $(TEST_GUI_CXXFLAGS) $(srcdir)/controls/notebooktest.cpp
--- /dev/null
+///////////////////////////////////////////////////////////////////////////////
+// Name: tests/controls/markup.cpp
+// Purpose: wxMarkupParser and related classes unit tests
+// Author: Vadim Zeitlin
+// Created: 2011-02-17
+// RCS-ID: $Id$
+// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
+///////////////////////////////////////////////////////////////////////////////
+
+#include "testprec.h"
+
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+#endif // WX_PRECOMP
+
+#include "wx/private/markupparser.h"
+
+class MarkupTestCase : public CppUnit::TestCase
+{
+public:
+ MarkupTestCase() { }
+
+private:
+ CPPUNIT_TEST_SUITE( MarkupTestCase );
+ CPPUNIT_TEST( RoundTrip );
+ CPPUNIT_TEST( Quote );
+ CPPUNIT_TEST_SUITE_END();
+
+ void RoundTrip();
+ void Quote();
+
+ wxDECLARE_NO_COPY_CLASS(MarkupTestCase);
+};
+
+// register in the unnamed registry so that these tests are run by default
+CPPUNIT_TEST_SUITE_REGISTRATION( MarkupTestCase );
+
+// also include in it's own registry so that these tests can be run alone
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( MarkupTestCase, "MarkupTestCase" );
+
+void MarkupTestCase::RoundTrip()
+{
+ // Define a wxMarkupParserOutput object which produces the same markup
+ // string on output. This is, of course, perfectly useless, but allows us
+ // to test that parsing works as expected.
+ class RoundTripOutput : public wxMarkupParserOutput
+ {
+ public:
+ RoundTripOutput() { }
+
+ void Reset() { m_text.clear(); }
+
+ const wxString& GetText() const { return m_text; }
+
+
+ virtual void OnText(const wxString& text) { m_text += text; }
+
+ virtual void OnBoldStart() { m_text += "<b>"; }
+ virtual void OnBoldEnd() { m_text += "</b>"; }
+
+ virtual void OnItalicStart() { m_text += "<i>"; }
+ virtual void OnItalicEnd() { m_text += "</i>"; }
+
+ virtual void OnUnderlinedStart() { m_text += "<u>"; }
+ virtual void OnUnderlinedEnd() { m_text += "</u>"; }
+
+ virtual void OnStrikethroughStart() { m_text += "<s>"; }
+ virtual void OnStrikethroughEnd() { m_text += "</s>"; }
+
+ virtual void OnBigStart() { m_text += "<big>"; }
+ virtual void OnBigEnd() { m_text += "</big>"; }
+
+ virtual void OnSmallStart() { m_text += "<small>"; }
+ virtual void OnSmallEnd() { m_text += "</small>"; }
+
+ virtual void OnTeletypeStart() { m_text += "<tt>"; }
+ virtual void OnTeletypeEnd() { m_text += "</tt>"; }
+
+ virtual void OnSpanStart(const wxMarkupSpanAttributes& attrs)
+ {
+ m_text << "<span";
+
+ if ( !attrs.m_fgCol.empty() )
+ m_text << " foreground=\"" << attrs.m_fgCol << "\"";
+
+ if ( !attrs.m_bgCol.empty() )
+ m_text << " background=\"" << attrs.m_bgCol << "\"";
+
+ if ( !attrs.m_fontFace.empty() )
+ m_text << " face=\"" << attrs.m_fontFace << "\"";
+
+ wxString size;
+ switch ( attrs.m_sizeKind )
+ {
+ case wxMarkupSpanAttributes::Size_Unspecified:
+ break;
+
+ case wxMarkupSpanAttributes::Size_Relative:
+ size << (attrs.m_fontSize > 0 ? "larger" : "smaller");
+ break;
+
+ case wxMarkupSpanAttributes::Size_Symbolic:
+ {
+ CPPUNIT_ASSERT( attrs.m_fontSize >= -3 &&
+ attrs.m_fontSize <= 3 );
+ static const char *cssSizes[] =
+ {
+ "xx-small", "x-small", "small",
+ "medium",
+ "large", "x-large", "xx-large",
+ };
+
+ size << cssSizes[attrs.m_fontSize + 3];
+ }
+ break;
+
+ case wxMarkupSpanAttributes::Size_PointParts:
+ size.Printf("%u", attrs.m_fontSize);
+ break;
+ }
+
+ if ( !size.empty() )
+ m_text << " size=\"" << size << '"';
+
+ // TODO: Handle the rest of attributes.
+
+ m_text << ">";
+ }
+
+ virtual void OnSpanEnd(const wxMarkupSpanAttributes& WXUNUSED(attrs))
+ {
+ m_text += "</span>";
+ }
+
+ private:
+ wxString m_text;
+ };
+
+
+ RoundTripOutput output;
+ wxMarkupParser parser(output);
+
+ #define CHECK_PARSES_OK(text) \
+ output.Reset(); \
+ CPPUNIT_ASSERT( parser.Parse(text) ); \
+ CPPUNIT_ASSERT_EQUAL( text, output.GetText() )
+
+ #define CHECK_PARSES_AS(text, result) \
+ output.Reset(); \
+ CPPUNIT_ASSERT( parser.Parse(text) ); \
+ CPPUNIT_ASSERT_EQUAL( result, output.GetText() )
+
+ #define CHECK_DOESNT_PARSE(text) \
+ CPPUNIT_ASSERT( !parser.Parse(text) )
+
+ CHECK_PARSES_OK( "" );
+ CHECK_PARSES_OK( "foo" );
+ CHECK_PARSES_OK( "foo<b>bar</b>" );
+ CHECK_PARSES_OK( "1<big>2<small>3</small>4<big>5</big></big>6" );
+ CHECK_PARSES_OK( "first <span foreground=\"red\">second</span> last" );
+ CHECK_PARSES_OK( "first <span foreground=\"red\" "
+ "background=\"#ffffff\">second </span> last" );
+ CHECK_PARSES_OK( "<span size=\"10240\">10pt</span>" );
+ CHECK_PARSES_OK( "<span size=\"x-small\">much smaller</span>" );
+ CHECK_PARSES_OK( "<span size=\"larger\">larger</span>" );
+ CHECK_PARSES_OK
+ (
+ "<u>Please</u> notice: <i><b>any</b></i> <span foreground=\"grey\">"
+ "<s><tt>bugs</tt></s></span> in this code are <span foreground=\"red\" "
+ "size=\"xx-large\">NOT</span> allowed."
+ );
+
+ CHECK_PARSES_OK( "foo&bar" );
+ CHECK_PARSES_AS( "foo&bar", "foo&&bar" );
+ CHECK_PARSES_AS( "<O'Reilly>", "<O'Reilly>" );
+
+ CHECK_DOESNT_PARSE( "<" );
+ CHECK_DOESNT_PARSE( "<b" );
+ CHECK_DOESNT_PARSE( "<b>" );
+ CHECK_DOESNT_PARSE( "<b></i>" );
+ CHECK_DOESNT_PARSE( "<b><i></b></i>" );
+ CHECK_DOESNT_PARSE( "<foo></foo>" );
+
+ #undef CHECK_PARSES_OK
+ #undef CHECK_DOESNT_PARSE
+}
+
+void MarkupTestCase::Quote()
+{
+ CPPUNIT_ASSERT_EQUAL( "", wxMarkupParser::Quote("") );
+ CPPUNIT_ASSERT_EQUAL( "foo", wxMarkupParser::Quote("foo") );
+ CPPUNIT_ASSERT_EQUAL( "<foo>", wxMarkupParser::Quote("<foo>") );
+ CPPUNIT_ASSERT_EQUAL( "B&B", wxMarkupParser::Quote("B&B") );
+ CPPUNIT_ASSERT_EQUAL( """", wxMarkupParser::Quote("\"\"") );
+}
$(OBJS)\test_gui_listboxtest.obj \\r
$(OBJS)\test_gui_listctrltest.obj \\r
$(OBJS)\test_gui_listviewtest.obj \\r
+ $(OBJS)\test_gui_markuptest.obj \
$(OBJS)\test_gui_notebooktest.obj \\r
$(OBJS)\test_gui_ownerdrawncomboboxtest.obj \\r
$(OBJS)\test_gui_pickerbasetest.obj \\r
$(OBJS)\test_gui_listviewtest.obj: .\controls\listviewtest.cpp\r
$(CXX) -q -c -P -o$@ $(TEST_GUI_CXXFLAGS) .\controls\listviewtest.cpp\r
\r
+$(OBJS)\test_gui_markuptest.obj: .\controls\markuptest.cpp
+ $(CXX) -q -c -P -o$@ $(TEST_GUI_CXXFLAGS) .\controls\markuptest.cpp
+
$(OBJS)\test_gui_notebooktest.obj: .\controls\notebooktest.cpp\r
$(CXX) -q -c -P -o$@ $(TEST_GUI_CXXFLAGS) .\controls\notebooktest.cpp\r
\r
$(OBJS)\test_gui_listboxtest.o \\r
$(OBJS)\test_gui_listctrltest.o \\r
$(OBJS)\test_gui_listviewtest.o \\r
+ $(OBJS)\test_gui_markuptest.o \
$(OBJS)\test_gui_notebooktest.o \\r
$(OBJS)\test_gui_ownerdrawncomboboxtest.o \\r
$(OBJS)\test_gui_pickerbasetest.o \\r
$(OBJS)\test_gui_listviewtest.o: ./controls/listviewtest.cpp\r
$(CXX) -c -o $@ $(TEST_GUI_CXXFLAGS) $(CPPDEPS) $<\r
\r
+$(OBJS)\test_gui_markuptest.o: ./controls/markuptest.cpp
+ $(CXX) -c -o $@ $(TEST_GUI_CXXFLAGS) $(CPPDEPS) $<
+
$(OBJS)\test_gui_notebooktest.o: ./controls/notebooktest.cpp\r
$(CXX) -c -o $@ $(TEST_GUI_CXXFLAGS) $(CPPDEPS) $<\r
\r
$(OBJS)\test_gui_listboxtest.obj \\r
$(OBJS)\test_gui_listctrltest.obj \\r
$(OBJS)\test_gui_listviewtest.obj \\r
+ $(OBJS)\test_gui_markuptest.obj \
$(OBJS)\test_gui_notebooktest.obj \\r
$(OBJS)\test_gui_ownerdrawncomboboxtest.obj \\r
$(OBJS)\test_gui_pickerbasetest.obj \\r
$(OBJS)\test_gui_listviewtest.obj: .\controls\listviewtest.cpp\r
$(CXX) /c /nologo /TP /Fo$@ $(TEST_GUI_CXXFLAGS) .\controls\listviewtest.cpp\r
\r
+$(OBJS)\test_gui_markuptest.obj: .\controls\markuptest.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(TEST_GUI_CXXFLAGS) .\controls\markuptest.cpp
+
$(OBJS)\test_gui_notebooktest.obj: .\controls\notebooktest.cpp\r
$(CXX) /c /nologo /TP /Fo$@ $(TEST_GUI_CXXFLAGS) .\controls\notebooktest.cpp\r
\r
$(OBJS)\test_gui_listboxtest.obj &\r
$(OBJS)\test_gui_listctrltest.obj &\r
$(OBJS)\test_gui_listviewtest.obj &\r
+ $(OBJS)\test_gui_markuptest.obj &
$(OBJS)\test_gui_notebooktest.obj &\r
$(OBJS)\test_gui_ownerdrawncomboboxtest.obj &\r
$(OBJS)\test_gui_pickerbasetest.obj &\r
$(OBJS)\test_gui_listviewtest.obj : .AUTODEPEND .\controls\listviewtest.cpp\r
$(CXX) -bt=nt -zq -fo=$^@ $(TEST_GUI_CXXFLAGS) $<\r
\r
+$(OBJS)\test_gui_markuptest.obj : .AUTODEPEND .\controls\markuptest.cpp
+ $(CXX) -bt=nt -zq -fo=$^@ $(TEST_GUI_CXXFLAGS) $<
+
$(OBJS)\test_gui_notebooktest.obj : .AUTODEPEND .\controls\notebooktest.cpp\r
$(CXX) -bt=nt -zq -fo=$^@ $(TEST_GUI_CXXFLAGS) $<\r
\r
controls/listboxtest.cpp
controls/listctrltest.cpp
controls/listviewtest.cpp
+ controls/markuptest.cpp
controls/notebooktest.cpp
controls/ownerdrawncomboboxtest.cpp
controls/pickerbasetest.cpp
# End Source File\r
# Begin Source File\r
\r
+SOURCE=.\controls\markuptest.cpp
+# End Source File
+# Begin Source File
+
SOURCE=.\graphics\measuring.cpp\r
# End Source File\r
# Begin Source File\r
RelativePath=".\controls\listviewtest.cpp">\r
</File>\r
<File\r
+ RelativePath=".\controls\markuptest.cpp">
+ </File>
+ <File
RelativePath=".\graphics\measuring.cpp">\r
</File>\r
<File\r
>\r
</File>\r
<File\r
+ RelativePath=".\controls\markuptest.cpp"
+ >
+ </File>
+ <File
RelativePath=".\graphics\measuring.cpp"\r
>\r
</File>\r
>\r
</File>\r
<File\r
+ RelativePath=".\controls\markuptest.cpp"
+ >
+ </File>
+ <File
RelativePath=".\graphics\measuring.cpp"\r
>\r
</File>\r