Compare commits

...

1 Commits

Author SHA1 Message Date
Bryan Petty
1bd2272a78 This commit was manufactured by cvs2svn to create tag 'WX_2_2_5_1'.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/tags/WX_2_2_5_1@9311 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
2001-02-06 02:25:37 +00:00
2064 changed files with 342455 additions and 110674 deletions

View File

@@ -21,10 +21,23 @@ linux-gnu.system.cache
*.d *.d
*.swp *.swp
*.swo *.swo
*.swq
Release Release
Debug Debug
ReleaseDLL ReleaseDll
DebugDLL DebugDll
ReleaseUnicode
DebugUnicode
ReleaseUnicodeDll
DebugUnicodeDll
BaseRelease
BaseDebug
BaseReleaseDll
BaseDebugDll
BaseReleaseUnicode
BaseDebugUnicode
BaseReleaseUnicodeDll
BaseDebugUnicodeDll
robert robert
stamp-h.in stamp-h.in
Makefile Makefile

View File

@@ -16,45 +16,30 @@ varaibles and PATH entries.
Continue with item c) below. Continue with item c) below.
b) If using the GNU MinGW32 or GNU CygWin32 compilers b) If using the GNU Mingw32 or GNU Cygwin32 compilers
You'll need the compiler itself which is available from You can get Mingw32 from http://www.mingw.org
http://www.cygwin.com Cygwin32 is available at http://www.cygwin.com
When using MingW32 you'll need GNU make which is a part The makefile might have small problems with Cygwin's tools
of the CygWin32 toolchain and is also available as a stand so it is recommended to use Mingw32 and its toolchain instead
alone port without the infamous Cygwin.dll from if possible.
http://agnes.dida.physik.uni-essen.de/~janjaap/mingw32
The makefile has small problems with Cygwin<69>s tools
so it is recommended not to use these (but MingGW32
and its make.exe).
-> Set your path so that it includes the directory -> Set your path so that it includes the directory
where your compiler and tools reside where your compiler and tools reside
b-2) Using Mingw32 with gcc-2.95 and Anders Norlander's -> If your are using an old Mingw32 version (gcc-2.95 or older),
Win32 headers you might need to fix some headers with the patches contained
in the wxWin\Mingw32-gcc295.patches file. PLEASE APPLY THESE
PATCHES BY HAND! There are apparently a few different versions
of the headers floating around. Note that these patches are
not needed if you are using Mingw32 gcc-2.95.2 or newer.
Using the newer gcc-2.95/Noralander header combination -> Edit wx/src/makeg95.env and set the MINGW32 variable at the top of
will allow you to compile more of the MSW code, such the file to either 1 (you have Mingw32) or 0 (you have Cygwin32).
as OLE and Drag-n-Drop. If using MINGW32, also set the MINGW32VERSION variable
appropiately.
Instructions are similar to those for Regular Mingw32 except
->Get the compiler from
ftp://ftp.xraylith.wisc.edu/pub/khan/gnu-win32/mingw32/gcc-2.95/
->patch the gcc headers with info in wxWin\Mingw32-gcc295.patches.
PLEASE APPLY THESE PATCHES BY HAND! There are apparently a few
different versions of the headers floating around.
->Edit wx/src/makeg95.env and set the MINGW32 variable at the top of
the file to either 1 (you have Mingw32) or 0 (you have Cygwin32).
If using MINGW32, also set the MINGW32VERSION variable
appropriately.
c) Build instructions c) Build instructions
@@ -64,9 +49,9 @@ c) Build instructions
-> Copy c:\wxWin\include\wx\msw\setup0.h -> Copy c:\wxWin\include\wx\msw\setup0.h
to c:\wxWin\include\wx\msw\setup.h to c:\wxWin\include\wx\msw\setup.h
-> Edit c:\wxWin\include\wx\msw\setup.h so that -> Edit c:\wxWin\include\wx\msw\setup.h so that
most features are enabled (i.e. defined to 1) with most features are enabled (i.e. defined to 1), for example:
#define wxUSE_ODBC 0 #define wxUSE_ODBC 0
#define wxUSE_SOCKETS 0 #define wxUSE_SOCKETS 1
#define wxUSE_HTML 1 #define wxUSE_HTML 1
#define wxUSE_THREADS 1 #define wxUSE_THREADS 1
#define wxUSE_FS_INET 0 #define wxUSE_FS_INET 0
@@ -77,14 +62,12 @@ c) Build instructions
#define wxUSE_LIBJPEG 1 #define wxUSE_LIBJPEG 1
#define wxUSE_LIBPNG 1 #define wxUSE_LIBPNG 1
and iostreams ares disabled with and std iostreams are disabled with
#define wxUSE_STD_IOSTREAM 0 #define wxUSE_STD_IOSTREAM 0
note: ODBC and SOCKETS can be 1 for gcc-2.95
-> type: cd c:\wxWin\src\msw -> type: cd c:\wxWin\src\msw
-> type: make -f makefile.g95 (if using GNU tools) -> type: make -f makefile.g95 (if using GNU tools)
or type: make -f makefile.vc (if using MS VC++) or type: nmake -f makefile.vc (if using MS VC++)
II) Unix ports II) Unix ports
@@ -132,6 +115,20 @@ ftp server at ftp://sourceware.cygnus.com/pub/cygwin/.
Of course, you can also build the library using plain makefiles (see Of course, you can also build the library using plain makefiles (see
section I). section I).
IV) wxBase
----------------------------------------
wxBase is the non GUI part of wxWindows. Currently it can be only built using
configure (i.e. under Unix and probably under Win32 with cygwin) and with
Visual C++.
To build it using configure, just add "--disable-gui" argument to it.
To build wxBase with VC++, use the project files wxBase.dsp and wxBaseDll.dsp
included in the CVS. See http://www.wxwindows.org/vadim/wxDocs/buildmsw.html
for the instructions on how to generate the project files for the programs
using wxBase.
V) MacOS V) MacOS
---------------------------------------- ----------------------------------------

View File

@@ -67,6 +67,8 @@ oldincludedir = /usr/include
DESTDIR = DESTDIR =
localedir = $(datadir)/locale
pkgdatadir = $(datadir)/@PACKAGE@ pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@
@@ -123,18 +125,28 @@ DEMODIR = $(WXDIR)/demos
UTILSDIR = $(WXDIR)/utils UTILSDIR = $(WXDIR)/utils
MISCDIR = $(WXDIR)/misc MISCDIR = $(WXDIR)/misc
DOCDIR = $(WXDIR)/docs DOCDIR = $(WXDIR)/docs
INTLDIR = $(WXDIR)/locale
########################## Archive name ############################### ########################## Archive name ###############################
WXARCHIVE = @DISTDIR@-$(WX_MAJOR_VERSION_NUMBER).$(WX_MINOR_VERSION_NUMBER).$(WX_RELEASE_NUMBER).tgz WXARCHIVE = @DISTDIR@-$(WX_MAJOR_VERSION_NUMBER).$(WX_MINOR_VERSION_NUMBER).$(WX_RELEASE_NUMBER).tar.gz
WXGLARCHIVE = @DISTDIR@-gl-$(WX_MAJOR_VERSION_NUMBER).$(WX_MINOR_VERSION_NUMBER).$(WX_RELEASE_NUMBER).tgz WXGLARCHIVE = @DISTDIR@-gl-$(WX_MAJOR_VERSION_NUMBER).$(WX_MINOR_VERSION_NUMBER).$(WX_RELEASE_NUMBER).tar.gz
WXSAMPLES = wx$(TOOLKIT)-samples-$(WX_MAJOR_VERSION_NUMBER).$(WX_MINOR_VERSION_NUMBER).$(WX_RELEASE_NUMBER).tgz WXSAMPLES = wx$(TOOLKIT)-samples-$(WX_MAJOR_VERSION_NUMBER).$(WX_MINOR_VERSION_NUMBER).$(WX_RELEASE_NUMBER).tar.gz
WXDEMOS = wx$(TOOLKIT)-demos-$(WX_MAJOR_VERSION_NUMBER).$(WX_MINOR_VERSION_NUMBER).$(WX_RELEASE_NUMBER).tgz WXDEMOS = wx$(TOOLKIT)-demos-$(WX_MAJOR_VERSION_NUMBER).$(WX_MINOR_VERSION_NUMBER).$(WX_RELEASE_NUMBER).tar.gz
WXARCHIVE_BZIP = @DISTDIR@-$(WX_MAJOR_VERSION_NUMBER).$(WX_MINOR_VERSION_NUMBER).$(WX_RELEASE_NUMBER).tar.bz2
WXGLARCHIVE_BZIP = @DISTDIR@-gl-$(WX_MAJOR_VERSION_NUMBER).$(WX_MINOR_VERSION_NUMBER).$(WX_RELEASE_NUMBER).tar.bz2
WXSAMPLES_BZIP = wx$(TOOLKIT)-samples-$(WX_MAJOR_VERSION_NUMBER).$(WX_MINOR_VERSION_NUMBER).$(WX_RELEASE_NUMBER).tar.bz2
WXDEMOS_BZIP = wx$(TOOLKIT)-demos-$(WX_MAJOR_VERSION_NUMBER).$(WX_MINOR_VERSION_NUMBER).$(WX_RELEASE_NUMBER).tar.bz2
DISTDIR = ./_dist_dir/@DISTDIR@ DISTDIR = ./_dist_dir/@DISTDIR@
############################## Files ################################## ############################## Files ##################################
WX_LINGUAS = `cd $(top_srcdir)/locale && ls *.mo 2> /dev/null | sed -n 's/\.mo//p'`
# this line will include a file which defines ALL_SOURCES, ALL_OBJECTS, # this line will include a file which defines ALL_SOURCES, ALL_OBJECTS,
# ALL_DEPFILES and ALL_HEADERS variables with the complete list of .cpp, .o, # ALL_DEPFILES and ALL_HEADERS variables with the complete list of .cpp, .o,
# .d and .h/.inl files for the current toolkit # .d and .h/.inl files for the current toolkit
@@ -380,7 +392,7 @@ afminstall: preinstall
# this is the real install target: copies the library, wx-config and the # this is the real install target: copies the library, wx-config and the
# headers to the installation directory # headers to the installation directory
preinstall: $(top_builddir)/lib/@WX_TARGET_LIBRARY@ $(top_builddir)/wx@TOOLKIT_DIR@-config preinstall: $(top_builddir)/lib/@WX_TARGET_LIBRARY@ $(top_builddir)/wx@TOOLKIT_NAME@-config
@echo " " @echo " "
@echo " Installing wxWindows..." @echo " Installing wxWindows..."
@echo " " @echo " "
@@ -389,15 +401,15 @@ preinstall: $(top_builddir)/lib/@WX_TARGET_LIBRARY@ $(top_builddir)/wx@TOOLKIT_D
$(INSTALL) -d $(bindir) $(INSTALL) -d $(bindir)
$(INSTALL) -d $(libdir) $(INSTALL) -d $(libdir)
$(INSTALL_SCRIPT) $(top_builddir)/wx@TOOLKIT_DIR@-config $(bindir)/wx@TOOLKIT_DIR@-config $(INSTALL_SCRIPT) $(top_builddir)/wx@TOOLKIT_NAME@-config $(bindir)/wx@TOOLKIT_NAME@-config
cd $(bindir) && rm -f wx-config && $(LN_S) wx@TOOLKIT_DIR@-config wx-config cd $(bindir) && rm -f wx-config && $(LN_S) wx@TOOLKIT_NAME@-config wx-config
$(INSTALL_PROGRAM) $(top_builddir)/lib/@WX_TARGET_LIBRARY@ $(libdir)/@WX_TARGET_LIBRARY@ $(INSTALL_PROGRAM) $(top_builddir)/lib/@WX_TARGET_LIBRARY@ $(libdir)/@WX_TARGET_LIBRARY@
$(INSTALL) -d $(libdir)/wx $(INSTALL) -d $(libdir)/wx
$(INSTALL) -d $(libdir)/wx/include $(INSTALL) -d $(libdir)/wx/include
$(INSTALL) -d $(libdir)/wx/include/wx $(INSTALL) -d $(libdir)/wx/include/wx
$(INSTALL) -d $(libdir)/wx/include/wx/@TOOLKIT_DIR@ $(INSTALL) -d $(libdir)/wx/include/wx/@TOOLKIT_NAME@
$(INSTALL_DATA) $(top_builddir)/include/wx/@TOOLKIT_DIR@/setup.h $(libdir)/wx/include/wx/@TOOLKIT_DIR@/setup.h $(INSTALL_DATA) $(top_builddir)/include/wx/@TOOLKIT_DIR@/setup.h $(libdir)/wx/include/wx/@TOOLKIT_NAME@/setup.h
$(INSTALL) -d $(includedir)/wx $(INSTALL) -d $(includedir)/wx
@if test "$(USE_GUI)" = 1; then $(INSTALL) -d $(includedir)/wx/@TOOLKIT_DIR@; fi @if test "$(USE_GUI)" = 1; then $(INSTALL) -d $(includedir)/wx/@TOOLKIT_DIR@; fi
@@ -410,6 +422,14 @@ preinstall: $(top_builddir)/lib/@WX_TARGET_LIBRARY@ $(top_builddir)/wx@TOOLKIT_D
echo "$(INSTALL_DATA) $(top_srcdir)/include/wx/$$p $(includedir)/wx/$$p"; \ echo "$(INSTALL_DATA) $(top_srcdir)/include/wx/$$p $(includedir)/wx/$$p"; \
done done
$(INSTALL) -d $(localedir)
@for p in $(WX_LINGUAS); do \
$(INSTALL) -d $(localedir)/$$p; \
$(INSTALL) -d $(localedir)/$$p/LC_MESSAGES; \
$(INSTALL_DATA) $(top_srcdir)/locale/$$p.mo $(localedir)/$$p/LC_MESSAGES/wxstd.mo; \
echo "$(INSTALL_DATA) $(top_srcdir)/locale/$$p.mo $(localedir)/$$p/LC_MESSAGES/wxstd.mo"; \
done
preinstall_gl: $(top_builddir)/lib/@WX_TARGET_LIBRARY_GL@ preinstall_gl: $(top_builddir)/lib/@WX_TARGET_LIBRARY_GL@
@echo " " @echo " "
@echo " Installing wxWindows OpenGl add-on..." @echo " Installing wxWindows OpenGl add-on..."
@@ -445,9 +465,9 @@ uninstall:
@$(RM) $(libdir)/@WX_LIBRARY_LINK2_GL@ @$(RM) $(libdir)/@WX_LIBRARY_LINK2_GL@
@$(RM) $(libdir)/@WX_LIBRARY_LINK3_GL@ @$(RM) $(libdir)/@WX_LIBRARY_LINK3_GL@
@echo " Removing helper files..." @echo " Removing helper files..."
@$(RM) $(libdir)/wx/include/wx/@TOOLKIT_DIR@/setup.h @$(RM) $(libdir)/wx/include/wx/@TOOLKIT_NAME@/setup.h
@$(RM) $(bindir)/wx-config @$(RM) $(bindir)/wx-config
@$(RM) $(bindir)/wx@TOOLKIT_DIR@-config @$(RM) $(bindir)/wx@TOOLKIT_NAME@-config
@$(RM) $(datadir)/wx/afm/* @$(RM) $(datadir)/wx/afm/*
@$(RM) $(datadir)/wx/gs_afm/* @$(RM) $(datadir)/wx/gs_afm/*
# FIXME: wxBase doesnt install these next 3 dirs. # FIXME: wxBase doesnt install these next 3 dirs.
@@ -458,8 +478,15 @@ uninstall:
@list='$(HEADERS)'; for p in $$list; do \ @list='$(HEADERS)'; for p in $$list; do \
$(RM) $(includedir)/wx/$$p; \ $(RM) $(includedir)/wx/$$p; \
done done
@echo " Removing i18n files..."
@-for p in $(WX_LINGUAS); do \
$(RM) $(localedir)/$$p/LC_MESSAGES/wxstd.mo; \
rmdir $(localedir)/$$p/LC_MESSAGES; \
rmdir $(localedir)/$$p; \
done
@echo " Removing directories..." @echo " Removing directories..."
@if test -d $(libdir)/wx/include/wx/@TOOLKIT_DIR@; then rmdir $(libdir)/wx/include/wx/@TOOLKIT_DIR@; fi @-rmdir $(localedir)
@if test -d $(libdir)/wx/include/wx/@TOOLKIT_NAME@; then rmdir $(libdir)/wx/include/wx/@TOOLKIT_NAME@; fi
@if test -d $(libdir)/wx/include/wx; then rmdir $(libdir)/wx/include/wx; fi @if test -d $(libdir)/wx/include/wx; then rmdir $(libdir)/wx/include/wx; fi
@if test -d $(libdir)/wx/include; then rmdir $(libdir)/wx/include; fi @if test -d $(libdir)/wx/include; then rmdir $(libdir)/wx/include; fi
@if test -d $(libdir)/wx; then rmdir $(libdir)/wx; fi @if test -d $(libdir)/wx; then rmdir $(libdir)/wx; fi
@@ -505,10 +532,13 @@ ALL_DIST: distclean
# but is not used when building wxBase distribution # but is not used when building wxBase distribution
ALL_GUI_DIST: ALL_DIST ALL_GUI_DIST: ALL_DIST
cp $(WXDIR)/wx$(TOOLKIT).spec $(DISTDIR) cp $(WXDIR)/wx$(TOOLKIT).spec $(DISTDIR)
cp $(WXDIR)/wxBase.spec $(DISTDIR)
cp $(DOCDIR)/$(TOOLKITDIR)/install.txt $(DISTDIR)/INSTALL.txt cp $(DOCDIR)/$(TOOLKITDIR)/install.txt $(DISTDIR)/INSTALL.txt
cp $(DOCDIR)/$(TOOLKITDIR)/changes.txt $(DISTDIR)/CHANGES.txt cp $(DOCDIR)/$(TOOLKITDIR)/changes.txt $(DISTDIR)/CHANGES.txt
cp $(DOCDIR)/$(TOOLKITDIR)/readme.txt $(DISTDIR)/README.txt cp $(DOCDIR)/$(TOOLKITDIR)/readme.txt $(DISTDIR)/README.txt
cp $(DOCDIR)/$(TOOLKITDIR)/todo.txt $(DISTDIR)/TODO.txt cp $(DOCDIR)/$(TOOLKITDIR)/todo.txt $(DISTDIR)/TODO.txt
cp $(DOCDIR)/base/todo.txt $(DISTDIR)/wxBASE.todo
cp $(DOCDIR)/base/install.txt $(DISTDIR)/wxBASE.install
mkdir $(DISTDIR)/include mkdir $(DISTDIR)/include
mkdir $(DISTDIR)/include/wx mkdir $(DISTDIR)/include/wx
mkdir $(DISTDIR)/include/wx/$(TOOLKITDIR) mkdir $(DISTDIR)/include/wx/$(TOOLKITDIR)
@@ -577,13 +607,15 @@ BASE_DIST: ALL_DIST
cp $(WXDIR)/@PORT_FILES@ $(DISTDIR)/@PORT_FILES@ cp $(WXDIR)/@PORT_FILES@ $(DISTDIR)/@PORT_FILES@
cp $(WXDIR)/@RPM_FILES@ $(DISTDIR)/@RPM_FILES@ cp $(WXDIR)/@RPM_FILES@ $(DISTDIR)/@RPM_FILES@
cp $(WXDIR)/@RPM_SPEC@ $(DISTDIR)/@RPM_SPEC@ cp $(WXDIR)/@RPM_SPEC@ $(DISTDIR)/@RPM_SPEC@
cp $(WXDIR)/wxBase.dsp $(DISTDIR) cp $(WXDIR)/wxBase*.ds[pw] $(DISTDIR)
cp $(DOCDIR)/install.txt $(DISTDIR)/INSTALL.txt cp $(DOCDIR)/base/install.txt $(DISTDIR)/INSTALL.txt
cp $(DOCDIR)/changes.txt $(DISTDIR)/CHANGES.txt cp $(DOCDIR)/changes.txt $(DISTDIR)/CHANGES.txt
cp $(DOCDIR)/readme.txt $(DISTDIR)/README.txt cp $(DOCDIR)/readme.txt $(DISTDIR)/README.txt
cp $(DOCDIR)/todo.txt $(DISTDIR)/TODO.txt cp $(DOCDIR)/base/todo.txt $(DISTDIR)/TODO.txt
cp $(SRCDIR)/*.in $(DISTDIR)/src cp $(SRCDIR)/*.in $(DISTDIR)/src
cp $(WXDIR)/src/common/unzip.h $(DISTDIR)/src/common/unzip.h cp $(WXDIR)/src/common/*.inc $(DISTDIR)/src/common
cp $(WXDIR)/src/common/base.rc $(DISTDIR)/src/common
cp $(WXDIR)/src/common/unzip.h $(DISTDIR)/src/common
list='$(HEADERS)'; for p in $$list; do \ list='$(HEADERS)'; for p in $$list; do \
cp $(WXDIR)/include/wx/$$p $(DISTDIR)/include/wx/$$p; \ cp $(WXDIR)/include/wx/$$p $(DISTDIR)/include/wx/$$p; \
done done
@@ -591,8 +623,18 @@ BASE_DIST: ALL_DIST
cp $(WXDIR)/src/$$p $(DISTDIR)/src/$$p; \ cp $(WXDIR)/src/$$p $(DISTDIR)/src/$$p; \
done done
mkdir $(DISTDIR)/samples
cp $(SAMPDIR)/Makefile.in $(DISTDIR)/samples
cp $(SAMPDIR)/configure $(DISTDIR)/samples
cp $(SAMPDIR)/configure.in $(DISTDIR)/samples
mkdir $(DISTDIR)/samples/console
cp $(SAMPDIR)/console/Makefile.in $(DISTDIR)/samples/console
cp $(SAMPDIR)/console/makefile.unx $(DISTDIR)/samples/console
cp $(SAMPDIR)/console/console.cpp $(DISTDIR)/samples/console
cp $(SAMPDIR)/console/testdata.fc $(DISTDIR)/samples/console
GTK_DIST: ALL_GUI_DIST GTK_DIST: ALL_GUI_DIST
cp $(WXDIR)/wxGTK.spec $(DISTDIR)
cp $(INCDIR)/wx/gtk/*.h $(DISTDIR)/include/wx/gtk cp $(INCDIR)/wx/gtk/*.h $(DISTDIR)/include/wx/gtk
cp $(INCDIR)/wx/gtk/*.xpm $(DISTDIR)/include/wx/gtk cp $(INCDIR)/wx/gtk/*.xpm $(DISTDIR)/include/wx/gtk
cp $(GTKDIR)/*.cpp $(DISTDIR)/src/gtk cp $(GTKDIR)/*.cpp $(DISTDIR)/src/gtk
@@ -657,6 +699,7 @@ DEMOS_DIST: ALL_GUI_DIST
cp $(DEMODIR)/life/*.h $(DISTDIR)/demos/life cp $(DEMODIR)/life/*.h $(DISTDIR)/demos/life
cp $(DEMODIR)/life/*.xpm $(DISTDIR)/demos/life cp $(DEMODIR)/life/*.xpm $(DISTDIR)/demos/life
cp $(DEMODIR)/life/*.inc $(DISTDIR)/demos/life cp $(DEMODIR)/life/*.inc $(DISTDIR)/demos/life
cp $(DEMODIR)/life/*.lif $(DISTDIR)/demos/life
cp $(DEMODIR)/life/bitmaps/*.xpm $(DISTDIR)/demos/life/bitmaps cp $(DEMODIR)/life/bitmaps/*.xpm $(DISTDIR)/demos/life/bitmaps
mkdir $(DISTDIR)/demos/poem mkdir $(DISTDIR)/demos/poem
@@ -1144,6 +1187,12 @@ MISC_DIST: ALL_GUI_DIST
mkdir $(DISTDIR)/misc/gs_afm mkdir $(DISTDIR)/misc/gs_afm
cp $(MISCDIR)/gs_afm/*.afm $(DISTDIR)/misc/gs_afm cp $(MISCDIR)/gs_afm/*.afm $(DISTDIR)/misc/gs_afm
INTL_DIST:
mkdir $(DISTDIR)/locale
cp $(INTLDIR)/Makefile $(DISTDIR)/locale
cp $(INTLDIR)/*.po $(DISTDIR)/locale
-cp $(INTLDIR)/*.mo $(DISTDIR)/locale
MANUAL_DIST: MANUAL_DIST:
mkdir $(DISTDIR)/docs mkdir $(DISTDIR)/docs
mkdir $(DISTDIR)/docs/latex mkdir $(DISTDIR)/docs/latex
@@ -1158,40 +1207,44 @@ MANUAL_DIST:
# those files needed for the Debian source package. # those files needed for the Debian source package.
# see utils/wxPython/distrib for scripts to make a proper wxPython dist. # see utils/wxPython/distrib for scripts to make a proper wxPython dist.
PYTHON_DIST: PYTHON_DIST:
mkdir $(DISTDIR)/utils/wxPython mkdir $(DISTDIR)/wxPython
mkdir $(DISTDIR)/utils/wxPython/demo mkdir $(DISTDIR)/wxPython/contrib
mkdir $(DISTDIR)/utils/wxPython/demo/bitmaps mkdir $(DISTDIR)/wxPython/contrib/glcanvas
mkdir $(DISTDIR)/utils/wxPython/demo/data mkdir $(DISTDIR)/wxPython/contrib/glcanvas/gtk
mkdir $(DISTDIR)/utils/wxPython/distrib mkdir $(DISTDIR)/wxPython/contrib/ogl
mkdir $(DISTDIR)/utils/wxPython/lib mkdir $(DISTDIR)/wxPython/contrib/stc
mkdir $(DISTDIR)/utils/wxPython/lib/editor mkdir $(DISTDIR)/wxPython/demo
mkdir $(DISTDIR)/utils/wxPython/lib/sizers mkdir $(DISTDIR)/wxPython/demo/bitmaps
mkdir $(DISTDIR)/utils/wxPython/modules mkdir $(DISTDIR)/wxPython/demo/data
mkdir $(DISTDIR)/utils/wxPython/modules/html mkdir $(DISTDIR)/wxPython/src
mkdir $(DISTDIR)/utils/wxPython/modules/utils mkdir $(DISTDIR)/wxPython/src/gtk
mkdir $(DISTDIR)/utils/wxPython/modules/utils/gtk mkdir $(DISTDIR)/wxPython/wxPython
mkdir $(DISTDIR)/utils/wxPython/src mkdir $(DISTDIR)/wxPython/wxPython/lib
mkdir $(DISTDIR)/utils/wxPython/src/gtk mkdir $(DISTDIR)/wxPython/wxPython/lib/editor
mkdir $(DISTDIR)/wxPython/wxPython/lib/sizers
cp $(UTILSDIR)/wxPython/*.txt $(DISTDIR)/utils/wxPython cp $(WXDIR)/wxPython/*.txt $(DISTDIR)/wxPython
-cp $(UTILSDIR)/wxPython/demo/* $(DISTDIR)/utils/wxPython/demo cp $(WXDIR)/wxPython/*.py $(DISTDIR)/wxPython
-cp $(UTILSDIR)/wxPython/demo/bitmaps/* $(DISTDIR)/utils/wxPython/demo/bitmaps cp $(WXDIR)/wxPython/setup.cfg $(DISTDIR)/wxPython
-cp $(UTILSDIR)/wxPython/demo/data/* $(DISTDIR)/utils/wxPython/demo/data cp $(WXDIR)/wxPython/MANIFEST.in $(DISTDIR)/wxPython
cp $(UTILSDIR)/wxPython/distrib/build.py $(DISTDIR)/utils/wxPython/distrib -cp $(WXDIR)/wxPython/contrib/glcanvas/* $(DISTDIR)/wxPython/contrib/glcanvas
cp $(UTILSDIR)/wxPython/lib/*.py $(DISTDIR)/utils/wxPython/lib cp $(WXDIR)/wxPython/contrib/glcanvas/gtk/glcanvas.* $(DISTDIR)/wxPython/contrib/glcanvas/gtk
cp $(UTILSDIR)/wxPython/lib/editor/*.py $(DISTDIR)/utils/wxPython/lib/editor -cp $(WXDIR)/wxPython/contrib/ogl/* $(DISTDIR)/wxPython/contrib/ogl
cp $(UTILSDIR)/wxPython/lib/sizers/*.py $(DISTDIR)/utils/wxPython/lib/sizers -cp $(WXDIR)/wxPython/contrib/stc/* $(DISTDIR)/wxPython/contrib/stc
-cp $(UTILSDIR)/wxPython/modules/html/* $(DISTDIR)/utils/wxPython/modules/html -cp $(WXDIR)/wxPython/demo/* $(DISTDIR)/wxPython/demo
-cp $(UTILSDIR)/wxPython/modules/utils/* $(DISTDIR)/utils/wxPython/modules/utils -cp $(WXDIR)/wxPython/demo/bitmaps/* $(DISTDIR)/wxPython/demo/bitmaps
cp $(UTILSDIR)/wxPython/modules/utils/gtk/utils.* $(DISTDIR)/utils/wxPython/modules/utils/gtk -cp $(WXDIR)/wxPython/demo/data/* $(DISTDIR)/wxPython/demo/data
-cp $(UTILSDIR)/wxPython/src/* $(DISTDIR)/utils/wxPython/src -cp $(WXDIR)/wxPython/src/* $(DISTDIR)/wxPython/src
cp $(UTILSDIR)/wxPython/src/gtk/*.py $(DISTDIR)/utils/wxPython/src/gtk cp $(WXDIR)/wxPython/src/gtk/*.py $(DISTDIR)/wxPython/src/gtk
cp $(UTILSDIR)/wxPython/src/gtk/*.cpp $(DISTDIR)/utils/wxPython/src/gtk cp $(WXDIR)/wxPython/src/gtk/*.cpp $(DISTDIR)/wxPython/src/gtk
cp $(WXDIR)/wxPython/wxPython/lib/*.py $(DISTDIR)/wxPython/wxPython/lib
cp $(WXDIR)/wxPython/wxPython/lib/editor/*.py $(DISTDIR)/wxPython/wxPython/lib/editor
distclean: distclean:
$(RM) -r _dist_dir $(RM) -r _dist_dir
dist: @GUIDIST@ dist: @GUIDIST@
cp $(WXDIR)/src/files.lst $(DISTDIR)/src/
@echo "*** Creating wxWindows distribution in $(DISTDIR)..." @echo "*** Creating wxWindows distribution in $(DISTDIR)..."
cd _dist_dir; tar ch @DISTDIR@ | gzip -f9 > $(WXARCHIVE); mv $(WXARCHIVE) .. cd _dist_dir; tar ch @DISTDIR@ | gzip -f9 > $(WXARCHIVE); mv $(WXARCHIVE) ..
@if test "$(USE_GUI)" = 1; then \ @if test "$(USE_GUI)" = 1; then \
@@ -1204,6 +1257,20 @@ dist: @GUIDIST@
mv wxDemos demos; \ mv wxDemos demos; \
fi fi
bzip-dist: @GUIDIST@
cp $(WXDIR)/src/files.lst $(DISTDIR)/src/
@echo "*** Creating wxWindows distribution in $(DISTDIR)..."
cd _dist_dir; tar ch @DISTDIR@ | bzip2 -f9 > $(WXARCHIVE_BZIP); mv $(WXARCHIVE_BZIP) ..
@if test "$(USE_GUI)" = 1; then \
cd $(DISTDIR); \
mv samples wxSamples; \
tar ch wxSamples | bzip2 -f9 > ../../$(WXSAMPLES_BZIP); \
mv wxSamples samples; \
mv demos wxDemos; \
tar ch wxDemos | bzip2 -f9 > ../../$(WXDEMOS_BZIP); \
mv wxDemos demos; \
fi
debian-dist: @GUIDIST@ MANUAL_DIST PYTHON_DIST debian-dist: @GUIDIST@ MANUAL_DIST PYTHON_DIST
mkdir $(DISTDIR)/debian mkdir $(DISTDIR)/debian
-cp $(WXDIR)/debian/* $(DISTDIR)/debian -cp $(WXDIR)/debian/* $(DISTDIR)/debian

268
config.guess vendored
View File

@@ -1,6 +1,7 @@
#! /bin/sh #! /bin/sh
# Attempt to guess a canonical system name. # Attempt to guess a canonical system name.
# Copyright (C) 1992, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999
# Free Software Foundation, Inc.
# #
# This file is free software; you can redistribute it and/or modify it # This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by # under the terms of the GNU General Public License as published by
@@ -23,6 +24,7 @@
# Written by Per Bothner <bothner@cygnus.com>. # Written by Per Bothner <bothner@cygnus.com>.
# The master version of this file is at the FSF in /home/gd/gnu/lib. # The master version of this file is at the FSF in /home/gd/gnu/lib.
# Please send patches to the Autoconf mailing list <autoconf@gnu.org>.
# #
# This script attempts to guess a canonical system name similar to # This script attempts to guess a canonical system name similar to
# config.sub. If it succeeds, it prints the system name on stdout, and # config.sub. If it succeeds, it prints the system name on stdout, and
@@ -35,6 +37,20 @@
# (but try to keep the structure clean). # (but try to keep the structure clean).
# #
# Use $HOST_CC if defined. $CC may point to a cross-compiler
if test x"$CC_FOR_BUILD" = x; then
if test x"$HOST_CC" != x; then
CC_FOR_BUILD="$HOST_CC"
else
if test x"$CC" != x; then
CC_FOR_BUILD="$CC"
else
CC_FOR_BUILD=cc
fi
fi
fi
# This is needed to find uname on a Pyramid OSx when run in the BSD universe. # This is needed to find uname on a Pyramid OSx when run in the BSD universe.
# (ghazi@noc.rutgers.edu 8/24/94.) # (ghazi@noc.rutgers.edu 8/24/94.)
if (test -f /.attbin/uname) >/dev/null 2>&1 ; then if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
@@ -46,7 +62,8 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
trap 'rm -f dummy.c dummy.o dummy; exit 1' 1 2 15 dummy=dummy-$$
trap 'rm -f $dummy.c $dummy.o $dummy; exit 1' 1 2 15
# Note: order is significant - the case branches are not exclusive. # Note: order is significant - the case branches are not exclusive.
@@ -59,7 +76,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
# A Tn.n version is a released field test version. # A Tn.n version is a released field test version.
# A Xn.n version is an unreleased experimental baselevel. # A Xn.n version is an unreleased experimental baselevel.
# 1.2 uses "1.2" for uname -r. # 1.2 uses "1.2" for uname -r.
cat <<EOF >dummy.s cat <<EOF >$dummy.s
.globl main .globl main
.ent main .ent main
main: main:
@@ -76,9 +93,9 @@ main:
ret \$31,(\$26),1 ret \$31,(\$26),1
.end main .end main
EOF EOF
${CC-cc} dummy.s -o dummy 2>/dev/null $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
if test "$?" = 0 ; then if test "$?" = 0 ; then
./dummy ./$dummy
case "$?" in case "$?" in
7) 7)
UNAME_MACHINE="alpha" UNAME_MACHINE="alpha"
@@ -97,8 +114,14 @@ EOF
;; ;;
esac esac
fi fi
rm -f dummy.s dummy rm -f $dummy.s $dummy
echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr [[A-Z]] [[a-z]]` echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
exit 0 ;;
Alpha\ *:Windows_NT*:*)
# How do we know it's Interix rather than the generic POSIX subsystem?
# Should we change UNAME_MACHINE based on the output of uname instead
# of the specific Alpha model?
echo alpha-pc-interix
exit 0 ;; exit 0 ;;
21064:Windows_NT:50:3) 21064:Windows_NT:50:3)
echo alpha-dec-winnt3.5 echo alpha-dec-winnt3.5
@@ -142,7 +165,7 @@ EOF
SR2?01:HI-UX/MPP:*:*) SR2?01:HI-UX/MPP:*:*)
echo hppa1.1-hitachi-hiuxmpp echo hppa1.1-hitachi-hiuxmpp
exit 0;; exit 0;;
Pyramid*:OSx*:*:*|MIS*:OSx*:*:*|MIS*:SMP_DC-OSx*:*:*) Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
if test "`(/bin/universe) 2>/dev/null`" = att ; then if test "`(/bin/universe) 2>/dev/null`" = att ; then
echo pyramid-pyramid-sysv3 echo pyramid-pyramid-sysv3
@@ -150,7 +173,7 @@ EOF
echo pyramid-pyramid-bsd echo pyramid-pyramid-bsd
fi fi
exit 0 ;; exit 0 ;;
NILE:*:*:dcosx) NILE*:*:*:dcosx)
echo pyramid-pyramid-svr4 echo pyramid-pyramid-svr4
exit 0 ;; exit 0 ;;
sun4H:SunOS:5.*:*) sun4H:SunOS:5.*:*)
@@ -201,6 +224,32 @@ EOF
atari*:OpenBSD:*:*) atari*:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE} echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
# The situation for MiNT is a little confusing. The machine name
# can be virtually everything (everything which is not
# "atarist" or "atariste" at least should have a processor
# > m68000). The system name ranges from "MiNT" over "FreeMiNT"
# to the lowercase version "mint" (or "freemint"). Finally
# the system name "TOS" denotes a system which is actually not
# MiNT. But MiNT is downward compatible to TOS, so this should
# be no problem.
atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
echo m68k-atari-mint${UNAME_RELEASE}
exit 0 ;;
atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
echo m68k-atari-mint${UNAME_RELEASE}
exit 0 ;;
*falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
echo m68k-atari-mint${UNAME_RELEASE}
exit 0 ;;
milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
echo m68k-milan-mint${UNAME_RELEASE}
exit 0 ;;
hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
echo m68k-hades-mint${UNAME_RELEASE}
exit 0 ;;
*:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
echo m68k-unknown-mint${UNAME_RELEASE}
exit 0 ;;
sun3*:NetBSD:*:*) sun3*:NetBSD:*:*)
echo m68k-sun-netbsd${UNAME_RELEASE} echo m68k-sun-netbsd${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
@@ -234,12 +283,16 @@ EOF
VAX*:ULTRIX*:*:*) VAX*:ULTRIX*:*:*)
echo vax-dec-ultrix${UNAME_RELEASE} echo vax-dec-ultrix${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
2020:CLIX:*:*) 2020:CLIX:*:* | 2430:CLIX:*:*)
echo clipper-intergraph-clix${UNAME_RELEASE} echo clipper-intergraph-clix${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
mips:*:*:UMIPS | mips:*:*:RISCos) mips:*:*:UMIPS | mips:*:*:RISCos)
sed 's/^ //' << EOF >dummy.c sed 's/^ //' << EOF >$dummy.c
int main (argc, argv) int argc; char **argv; { #ifdef __cplusplus
int main (int argc, char *argv[]) {
#else
int main (argc, argv) int argc; char *argv[]; {
#endif
#if defined (host_mips) && defined (MIPSEB) #if defined (host_mips) && defined (MIPSEB)
#if defined (SYSTYPE_SYSV) #if defined (SYSTYPE_SYSV)
printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
@@ -254,10 +307,10 @@ EOF
exit (-1); exit (-1);
} }
EOF EOF
${CC-cc} dummy.c -o dummy \ $CC_FOR_BUILD $dummy.c -o $dummy \
&& ./dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
&& rm dummy.c dummy && exit 0 && rm $dummy.c $dummy && exit 0
rm -f dummy.c dummy rm -f $dummy.c $dummy
echo mips-mips-riscos${UNAME_RELEASE} echo mips-mips-riscos${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
Night_Hawk:Power_UNIX:*:*) Night_Hawk:Power_UNIX:*:*)
@@ -309,7 +362,7 @@ EOF
exit 0 ;; exit 0 ;;
*:AIX:2:3) *:AIX:2:3)
if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
sed 's/^ //' << EOF >dummy.c sed 's/^ //' << EOF >$dummy.c
#include <sys/systemcfg.h> #include <sys/systemcfg.h>
main() main()
@@ -320,8 +373,8 @@ EOF
exit(0); exit(0);
} }
EOF EOF
${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0 $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0
rm -f dummy.c dummy rm -f $dummy.c $dummy
echo rs6000-ibm-aix3.2.5 echo rs6000-ibm-aix3.2.5
elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
echo rs6000-ibm-aix3.2.4 echo rs6000-ibm-aix3.2.4
@@ -368,8 +421,8 @@ EOF
case "${UNAME_MACHINE}" in case "${UNAME_MACHINE}" in
9000/31? ) HP_ARCH=m68000 ;; 9000/31? ) HP_ARCH=m68000 ;;
9000/[34]?? ) HP_ARCH=m68k ;; 9000/[34]?? ) HP_ARCH=m68k ;;
9000/6?? | 9000/7?? | 9000/80[24] | 9000/8?[13679] | 9000/892 ) 9000/[678][0-9][0-9])
sed 's/^ //' << EOF >dummy.c sed 's/^ //' << EOF >$dummy.c
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
@@ -400,14 +453,14 @@ EOF
exit (0); exit (0);
} }
EOF EOF
(${CC-cc} dummy.c -o dummy 2>/dev/null ) && HP_ARCH=`./dummy` ($CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
rm -f dummy.c dummy rm -f $dummy.c $dummy
esac esac
HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
echo ${HP_ARCH}-hp-hpux${HPUX_REV} echo ${HP_ARCH}-hp-hpux${HPUX_REV}
exit 0 ;; exit 0 ;;
3050*:HI-UX:*:*) 3050*:HI-UX:*:*)
sed 's/^ //' << EOF >dummy.c sed 's/^ //' << EOF >$dummy.c
#include <unistd.h> #include <unistd.h>
int int
main () main ()
@@ -432,8 +485,8 @@ EOF
exit (0); exit (0);
} }
EOF EOF
${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0 $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0
rm -f dummy.c dummy rm -f $dummy.c $dummy
echo unknown-hitachi-hiuxwe2 echo unknown-hitachi-hiuxwe2
exit 0 ;; exit 0 ;;
9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
@@ -442,6 +495,9 @@ EOF
9000/8??:4.3bsd:*:*) 9000/8??:4.3bsd:*:*)
echo hppa1.0-hp-bsd echo hppa1.0-hp-bsd
exit 0 ;; exit 0 ;;
*9??*:MPE/iX:*:*)
echo hppa1.0-hp-mpeix
exit 0 ;;
hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
echo hppa1.1-hp-osf echo hppa1.1-hp-osf
exit 0 ;; exit 0 ;;
@@ -458,6 +514,9 @@ EOF
parisc*:Lites*:*:*) parisc*:Lites*:*:*)
echo hppa1.1-hp-lites echo hppa1.1-hp-lites
exit 0 ;; exit 0 ;;
hppa*:OpenBSD:*:*)
echo hppa-unknown-openbsd
exit 0 ;;
C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
echo c1-convex-bsd echo c1-convex-bsd
exit 0 ;; exit 0 ;;
@@ -490,11 +549,14 @@ EOF
CRAY*TS:*:*:*) CRAY*TS:*:*:*)
echo t90-cray-unicos${UNAME_RELEASE} echo t90-cray-unicos${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
CRAY*T3E:*:*:*)
echo t3e-cray-unicosmk${UNAME_RELEASE}
exit 0 ;;
CRAY-2:*:*:*) CRAY-2:*:*:*)
echo cray2-cray-unicos echo cray2-cray-unicos
exit 0 ;; exit 0 ;;
F300:UNIX_System_V:*:*) F300:UNIX_System_V:*:*)
FUJITSU_SYS=`uname -p | tr [A-Z] [a-z] | sed -e 's/\///'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
exit 0 ;; exit 0 ;;
@@ -507,13 +569,22 @@ EOF
hp300:OpenBSD:*:*) hp300:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE} echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
i?86:BSD/386:*:* | i?86:BSD/OS:*:*)
echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
exit 0 ;;
sparc*:BSD/OS:*:*) sparc*:BSD/OS:*:*)
echo sparc-unknown-bsdi${UNAME_RELEASE} echo sparc-unknown-bsdi${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
i?86:BSD/386:*:* | *:BSD/OS:*:*) *:BSD/OS:*:*)
echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
*:FreeBSD:*:*) *:FreeBSD:*:*)
if test -x /usr/bin/objformat; then
if test "elf" = "`/usr/bin/objformat`"; then
echo ${UNAME_MACHINE}-unknown-freebsdelf`echo ${UNAME_RELEASE}|sed -e 's/[-_].*//'`
exit 0
fi
fi
echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
exit 0 ;; exit 0 ;;
*:NetBSD:*:*) *:NetBSD:*:*)
@@ -523,13 +594,22 @@ EOF
echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
exit 0 ;; exit 0 ;;
i*:CYGWIN*:*) i*:CYGWIN*:*)
echo ${UNAME_MACHINE}-pc-cygwin32 echo ${UNAME_MACHINE}-pc-cygwin
exit 0 ;; exit 0 ;;
i*:MINGW*:*) i*:MINGW*:*)
echo ${UNAME_MACHINE}-pc-mingw32 echo ${UNAME_MACHINE}-pc-mingw32
exit 0 ;; exit 0 ;;
i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
# How do we know it's Interix rather than the generic POSIX subsystem?
# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
# UNAME_MACHINE based on the output of uname instead of i386?
echo i386-pc-interix
exit 0 ;;
i*:UWIN*:*)
echo ${UNAME_MACHINE}-pc-uwin
exit 0 ;;
p*:CYGWIN*:*) p*:CYGWIN*:*)
echo powerpcle-unknown-cygwin32 echo powerpcle-unknown-cygwin
exit 0 ;; exit 0 ;;
prep*:SunOS:5.*:*) prep*:SunOS:5.*:*)
echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
@@ -541,12 +621,14 @@ EOF
# uname on the ARM produces all sorts of strangeness, and we need to # uname on the ARM produces all sorts of strangeness, and we need to
# filter it out. # filter it out.
case "$UNAME_MACHINE" in case "$UNAME_MACHINE" in
armv*) UNAME_MACHINE=$UNAME_MACHINE ;;
arm* | sa110*) UNAME_MACHINE="arm" ;; arm* | sa110*) UNAME_MACHINE="arm" ;;
esac esac
# The BFD linker knows what the default object file format is, so # The BFD linker knows what the default object file format is, so
# first see if it will tell us. # first see if it will tell us. cd to the root directory to prevent
ld_help_string=`ld --help 2>&1` # problems with other programs or directories called `ld' in the path.
ld_help_string=`cd /; ld --help 2>&1`
ld_supported_emulations=`echo $ld_help_string \ ld_supported_emulations=`echo $ld_help_string \
| sed -ne '/supported emulations:/!d | sed -ne '/supported emulations:/!d
s/[ ][ ]*/ /g s/[ ][ ]*/ /g
@@ -559,11 +641,40 @@ EOF
sparclinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;; sparclinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
armlinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;; armlinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
m68klinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;; m68klinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
elf32ppc) echo "powerpc-unknown-linux-gnu" ; exit 0 ;; elf32ppc)
# Determine Lib Version
cat >$dummy.c <<EOF
#include <features.h>
#if defined(__GLIBC__)
extern char __libc_version[];
extern char __libc_release[];
#endif
main(argc, argv)
int argc;
char *argv[];
{
#if defined(__GLIBC__)
printf("%s %s\n", __libc_version, __libc_release);
#else
printf("unkown\n");
#endif
return 0;
}
EOF
LIBC=""
$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null
if test "$?" = 0 ; then
./$dummy | grep 1\.99 > /dev/null
if test "$?" = 0 ; then
LIBC="libc1"
fi
fi
rm -f $dummy.c $dummy
echo powerpc-unknown-linux-gnu${LIBC} ; exit 0 ;;
esac esac
if test "${UNAME_MACHINE}" = "alpha" ; then if test "${UNAME_MACHINE}" = "alpha" ; then
sed 's/^ //' <<EOF >dummy.s sed 's/^ //' <<EOF >$dummy.s
.globl main .globl main
.ent main .ent main
main: main:
@@ -581,9 +692,9 @@ EOF
.end main .end main
EOF EOF
LIBC="" LIBC=""
${CC-cc} dummy.s -o dummy 2>/dev/null $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
if test "$?" = 0 ; then if test "$?" = 0 ; then
./dummy ./$dummy
case "$?" in case "$?" in
7) 7)
UNAME_MACHINE="alpha" UNAME_MACHINE="alpha"
@@ -602,20 +713,21 @@ EOF
;; ;;
esac esac
objdump --private-headers dummy | \ objdump --private-headers $dummy | \
grep ld.so.1 > /dev/null grep ld.so.1 > /dev/null
if test "$?" = 0 ; then if test "$?" = 0 ; then
LIBC="libc1" LIBC="libc1"
fi fi
fi fi
rm -f dummy.s dummy rm -f $dummy.s $dummy
echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0 echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0
elif test "${UNAME_MACHINE}" = "mips" ; then elif test "${UNAME_MACHINE}" = "mips" ; then
cat >dummy.c <<EOF cat >$dummy.c <<EOF
main(argc, argv) #ifdef __cplusplus
int argc; int main (int argc, char *argv[]) {
char *argv[]; #else
{ int main (argc, argv) int argc; char *argv[]; {
#endif
#ifdef __MIPSEB__ #ifdef __MIPSEB__
printf ("%s-unknown-linux-gnu\n", argv[1]); printf ("%s-unknown-linux-gnu\n", argv[1]);
#endif #endif
@@ -625,8 +737,8 @@ main(argc, argv)
return 0; return 0;
} }
EOF EOF
${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0 $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0
rm -f dummy.c dummy rm -f $dummy.c $dummy
else else
# Either a pre-BFD a.out linker (linux-gnuoldld) # Either a pre-BFD a.out linker (linux-gnuoldld)
# or one that does not give us useful --help. # or one that does not give us useful --help.
@@ -645,12 +757,13 @@ EOF
;; ;;
esac esac
# Determine whether the default compiler is a.out or elf # Determine whether the default compiler is a.out or elf
cat >dummy.c <<EOF cat >$dummy.c <<EOF
#include <features.h> #include <features.h>
main(argc, argv) #ifdef __cplusplus
int argc; int main (int argc, char *argv[]) {
char *argv[]; #else
{ int main (argc, argv) int argc; char *argv[]; {
#endif
#ifdef __ELF__ #ifdef __ELF__
# ifdef __GLIBC__ # ifdef __GLIBC__
# if __GLIBC__ >= 2 # if __GLIBC__ >= 2
@@ -667,8 +780,8 @@ main(argc, argv)
return 0; return 0;
} }
EOF EOF
${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0 $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0
rm -f dummy.c dummy rm -f $dummy.c $dummy
fi ;; fi ;;
# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions
# are messed up and put the nodename in both sysname and nodename. # are messed up and put the nodename in both sysname and nodename.
@@ -690,6 +803,14 @@ EOF
echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE} echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
fi fi
exit 0 ;; exit 0 ;;
i?86:*:5:7*)
UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
(/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
(/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) && UNAME_MACHINE=i586
(/bin/uname -X|egrep '^Machine.*Pent.*II' >/dev/null) && UNAME_MACHINE=i686
(/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) && UNAME_MACHINE=i585
echo ${UNAME_MACHINE}-${UNAME_SYSTEM}${UNAME_VERSION}-sysv${UNAME_RELEASE}
exit 0 ;;
i?86:*:3.2:*) i?86:*:3.2:*)
if test -f /usr/options/cb.name; then if test -f /usr/options/cb.name; then
UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name` UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
@@ -699,18 +820,15 @@ EOF
(/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
(/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
&& UNAME_MACHINE=i586 && UNAME_MACHINE=i586
(/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \
&& UNAME_MACHINE=i686
(/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \
&& UNAME_MACHINE=i686
echo ${UNAME_MACHINE}-pc-sco$UNAME_REL echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
else else
echo ${UNAME_MACHINE}-pc-sysv32 echo ${UNAME_MACHINE}-pc-sysv32
fi fi
exit 0 ;; exit 0 ;;
i?86:UnixWare:*:*)
if /bin/uname -X 2>/dev/null >/dev/null ; then
(/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
&& UNAME_MACHINE=i586
fi
echo ${UNAME_MACHINE}-unixware-${UNAME_RELEASE}-${UNAME_VERSION}
exit 0 ;;
pc:*:*:*) pc:*:*:*)
# uname -m prints for DJGPP always 'pc', but it prints nothing about # uname -m prints for DJGPP always 'pc', but it prints nothing about
# the processor, so we play safe by assuming i386. # the processor, so we play safe by assuming i386.
@@ -752,7 +870,7 @@ EOF
mc68030:UNIX_System_V:4.*:*) mc68030:UNIX_System_V:4.*:*)
echo m68k-atari-sysv4 echo m68k-atari-sysv4
exit 0 ;; exit 0 ;;
i?86:LynxOS:2.*:*) i?86:LynxOS:2.*:* | i?86:LynxOS:3.[01]*:*)
echo i386-unknown-lynxos${UNAME_RELEASE} echo i386-unknown-lynxos${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
TSUNAMI:LynxOS:2.*:*) TSUNAMI:LynxOS:2.*:*)
@@ -764,6 +882,9 @@ EOF
SM[BE]S:UNIX_SV:*:*) SM[BE]S:UNIX_SV:*:*)
echo mips-dde-sysv${UNAME_RELEASE} echo mips-dde-sysv${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
RM*:ReliantUNIX-*:*:*)
echo mips-sni-sysv4
exit 0 ;;
RM*:SINIX-*:*:*) RM*:SINIX-*:*:*)
echo mips-sni-sysv4 echo mips-sni-sysv4
exit 0 ;; exit 0 ;;
@@ -794,7 +915,7 @@ EOF
news*:NEWS-OS:*:6*) news*:NEWS-OS:*:6*)
echo mips-sony-newsos6 echo mips-sony-newsos6
exit 0 ;; exit 0 ;;
R3000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R4000:UNIX_SV:*:*) R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
if [ -d /usr/nec ]; then if [ -d /usr/nec ]; then
echo mips-nec-sysv${UNAME_RELEASE} echo mips-nec-sysv${UNAME_RELEASE}
else else
@@ -810,12 +931,24 @@ EOF
BePC:BeOS:*:*) # BeOS running on Intel PC compatible. BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
echo i586-pc-beos echo i586-pc-beos
exit 0 ;; exit 0 ;;
SX-4:SUPER-UX:*:*)
echo sx4-nec-superux${UNAME_RELEASE}
exit 0 ;;
SX-5:SUPER-UX:*:*)
echo sx5-nec-superux${UNAME_RELEASE}
exit 0 ;;
Power*:Rhapsody:*:*)
echo powerpc-apple-rhapsody${UNAME_RELEASE}
exit 0 ;;
*:Rhapsody:*:*)
echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
exit 0 ;;
esac esac
#echo '(No uname command or uname output not recognized.)' 1>&2 #echo '(No uname command or uname output not recognized.)' 1>&2
#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
cat >dummy.c <<EOF cat >$dummy.c <<EOF
#ifdef _SEQUENT_ #ifdef _SEQUENT_
# include <sys/types.h> # include <sys/types.h>
# include <sys/utsname.h> # include <sys/utsname.h>
@@ -853,7 +986,10 @@ main ()
#endif #endif
int version; int version;
version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); if (version < 4)
printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
else
printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
exit (0); exit (0);
#endif #endif
@@ -913,8 +1049,8 @@ main ()
} }
EOF EOF
${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy && rm dummy.c dummy && exit 0 $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm $dummy.c $dummy && exit 0
rm -f dummy.c dummy rm -f $dummy.c $dummy
# Apollos put the system type in the environment. # Apollos put the system type in the environment.

308
config.sub vendored
View File

@@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Configuration validation subroutine script, version 1.1. # Configuration validation subroutine script, version 1.1.
# Copyright (C) 1991, 92-97, 1998 Free Software Foundation, Inc. # Copyright (C) 1991, 92-97, 1998, 1999 Free Software Foundation, Inc.
# This file is (in principle) common to ALL GNU software. # This file is (in principle) common to ALL GNU software.
# The presence of a machine in this file suggests that SOME GNU software # The presence of a machine in this file suggests that SOME GNU software
# can handle that machine. It does not imply ALL GNU software can. # can handle that machine. It does not imply ALL GNU software can.
@@ -98,11 +98,21 @@ case $os in
os= os=
basic_machine=$1 basic_machine=$1
;; ;;
-sim | -cisco | -oki | -wec | -winbond)
os=
basic_machine=$1
;;
-scout)
;;
-wrs)
os=vxworks
basic_machine=$1
;;
-hiux*) -hiux*)
os=-hiuxwe2 os=-hiuxwe2
;; ;;
-sco5) -sco5)
os=sco3.2v5 os=-sco3.2v5
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;; ;;
-sco4) -sco4)
@@ -121,6 +131,9 @@ case $os in
os=-sco3.2v2 os=-sco3.2v2
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;; ;;
-udk*)
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;;
-isc) -isc)
os=-isc2.2 os=-isc2.2
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
@@ -151,14 +164,21 @@ case $basic_machine in
# Some are omitted here because they have special meanings below. # Some are omitted here because they have special meanings below.
tahoe | i860 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \ tahoe | i860 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \
| arme[lb] | pyramid | mn10200 | mn10300 | tron | a29k \ | arme[lb] | pyramid | mn10200 | mn10300 | tron | a29k \
| 580 | i960 | h8300 | hppa | hppa1.0 | hppa1.1 | hppa2.0 \ | 580 | i960 | h8300 \
| alpha | alphaev5 | alphaev56 | we32k | ns16k | clipper \ | hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \
| i370 | sh | powerpc | powerpcle | 1750a | dsp16xx | pdp11 \ | alpha | alphaev[4-7] | alphaev56 | alphapca5[67] \
| mips64 | mipsel | mips64el | mips64orion | mips64orionel \ | we32k | ns16k | clipper | i370 | sh | powerpc | powerpcle \
| mipstx39 | mipstx39el \ | 1750a | dsp16xx | pdp11 | mips16 | mips64 | mipsel | mips64el \
| sparc | sparclet | sparclite | sparc64 | v850) | mips64orion | mips64orionel | mipstx39 | mipstx39el \
| mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \
| mips64vr5000 | miprs64vr5000el \
| sparc | sparclet | sparclite | sparc64 | sparcv9 | v850 | c4x \
| thumb | d10v)
basic_machine=$basic_machine-unknown basic_machine=$basic_machine-unknown
;; ;;
m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | z8k | v70 | h8500 | w65)
;;
# We use `pc' rather than `unknown' # We use `pc' rather than `unknown'
# because (1) that's what they normally are, and # because (1) that's what they normally are, and
# (2) the word "unknown" tends to confuse beginning users. # (2) the word "unknown" tends to confuse beginning users.
@@ -174,24 +194,41 @@ case $basic_machine in
vax-* | tahoe-* | i[34567]86-* | i860-* | m32r-* | m68k-* | m68000-* \ vax-* | tahoe-* | i[34567]86-* | i860-* | m32r-* | m68k-* | m68000-* \
| m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \ | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \
| mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \ | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
| power-* | none-* | 580-* | cray2-* | h8300-* | i960-* \ | power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \
| xmp-* | ymp-* | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* \ | xmp-* | ymp-* \
| alpha-* | alphaev5-* | alphaev56-* | we32k-* | cydra-* \ | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* | hppa2.0n-* \
| ns16k-* | pn-* | np1-* | xps100-* | clipper-* | orion-* \ | alpha-* | alphaev[4-7]-* | alphaev56-* | alphapca5[67]-* \
| we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \
| clipper-* | orion-* \
| sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \ | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \
| sparc64-* | mips64-* | mipsel-* \ | sparc64-* | sparcv9-* | sparc86x-* | mips16-* | mips64-* | mipsel-* \
| mips64el-* | mips64orion-* | mips64orionel-* \ | mips64el-* | mips64orion-* | mips64orionel-* \
| mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \
| mipstx39-* | mipstx39el-* \ | mipstx39-* | mipstx39el-* \
| f301-*) | f301-* | armv*-* | t3e-* \
| m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \
| thumb-* | v850-* | d30v-* | tic30-* | c30-* )
;; ;;
# Recognize the various machine names and aliases which stand # Recognize the various machine names and aliases which stand
# for a CPU type and a company and sometimes even an OS. # for a CPU type and a company and sometimes even an OS.
386bsd)
basic_machine=i386-unknown
os=-bsd
;;
3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
basic_machine=m68000-att basic_machine=m68000-att
;; ;;
3b*) 3b*)
basic_machine=we32k-att basic_machine=we32k-att
;; ;;
a29khif)
basic_machine=a29k-amd
os=-udi
;;
adobe68k)
basic_machine=m68010-adobe
os=-scout
;;
alliant | fx80) alliant | fx80)
basic_machine=fx80-alliant basic_machine=fx80-alliant
;; ;;
@@ -221,6 +258,10 @@ case $basic_machine in
basic_machine=m68k-apollo basic_machine=m68k-apollo
os=-sysv os=-sysv
;; ;;
apollo68bsd)
basic_machine=m68k-apollo
os=-bsd
;;
aux) aux)
basic_machine=m68k-apple basic_machine=m68k-apple
os=-aux os=-aux
@@ -297,6 +338,10 @@ case $basic_machine in
encore | umax | mmax) encore | umax | mmax)
basic_machine=ns32k-encore basic_machine=ns32k-encore
;; ;;
es1800 | OSE68k | ose68k | ose | OSE)
basic_machine=m68k-ericsson
os=-ose
;;
fx2800) fx2800)
basic_machine=i860-alliant basic_machine=i860-alliant
;; ;;
@@ -315,6 +360,14 @@ case $basic_machine in
basic_machine=h8300-hitachi basic_machine=h8300-hitachi
os=-hms os=-hms
;; ;;
h8300xray)
basic_machine=h8300-hitachi
os=-xray
;;
h8500hms)
basic_machine=h8500-hitachi
os=-hms
;;
harris) harris)
basic_machine=m88k-harris basic_machine=m88k-harris
os=-sysv3 os=-sysv3
@@ -330,13 +383,30 @@ case $basic_machine in
basic_machine=m68k-hp basic_machine=m68k-hp
os=-hpux os=-hpux
;; ;;
hp3k9[0-9][0-9] | hp9[0-9][0-9])
basic_machine=hppa1.0-hp
;;
hp9k2[0-9][0-9] | hp9k31[0-9]) hp9k2[0-9][0-9] | hp9k31[0-9])
basic_machine=m68000-hp basic_machine=m68000-hp
;; ;;
hp9k3[2-9][0-9]) hp9k3[2-9][0-9])
basic_machine=m68k-hp basic_machine=m68k-hp
;; ;;
hp9k7[0-9][0-9] | hp7[0-9][0-9] | hp9k8[0-9]7 | hp8[0-9]7) hp9k6[0-9][0-9] | hp6[0-9][0-9])
basic_machine=hppa1.0-hp
;;
hp9k7[0-79][0-9] | hp7[0-79][0-9])
basic_machine=hppa1.1-hp
;;
hp9k78[0-9] | hp78[0-9])
# FIXME: really hppa2.0-hp
basic_machine=hppa1.1-hp
;;
hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
# FIXME: really hppa2.0-hp
basic_machine=hppa1.1-hp
;;
hp9k8[0-9][13679] | hp8[0-9][13679])
basic_machine=hppa1.1-hp basic_machine=hppa1.1-hp
;; ;;
hp9k8[0-9][0-9] | hp8[0-9][0-9]) hp9k8[0-9][0-9] | hp8[0-9][0-9])
@@ -345,6 +415,14 @@ case $basic_machine in
hppa-next) hppa-next)
os=-nextstep3 os=-nextstep3
;; ;;
hppaosf)
basic_machine=hppa1.1-hp
os=-osf
;;
hppro)
basic_machine=hppa1.1-hp
os=-proelf
;;
i370-ibm* | ibm*) i370-ibm* | ibm*)
basic_machine=i370-ibm basic_machine=i370-ibm
os=-mvs os=-mvs
@@ -366,6 +444,22 @@ case $basic_machine in
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
os=-solaris2 os=-solaris2
;; ;;
i386mach)
basic_machine=i386-mach
os=-mach
;;
i386-vsta | vsta)
basic_machine=i386-unknown
os=-vsta
;;
i386-go32 | go32)
basic_machine=i386-unknown
os=-go32
;;
i386-mingw32 | mingw32)
basic_machine=i386-unknown
os=-mingw32
;;
iris | iris4d) iris | iris4d)
basic_machine=mips-sgi basic_machine=mips-sgi
case $os in case $os in
@@ -394,6 +488,10 @@ case $basic_machine in
miniframe) miniframe)
basic_machine=m68000-convergent basic_machine=m68000-convergent
;; ;;
*mint | *MiNT)
basic_machine=m68k-atari
os=-mint
;;
mipsel*-linux*) mipsel*-linux*)
basic_machine=mipsel-unknown basic_machine=mipsel-unknown
os=-linux-gnu os=-linux-gnu
@@ -408,10 +506,26 @@ case $basic_machine in
mips3*) mips3*)
basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
;; ;;
monitor)
basic_machine=m68k-rom68k
os=-coff
;;
msdos)
basic_machine=i386-unknown
os=-msdos
;;
ncr3000) ncr3000)
basic_machine=i486-ncr basic_machine=i486-ncr
os=-sysv4 os=-sysv4
;; ;;
netbsd386)
basic_machine=i386-unknown
os=-netbsd
;;
netwinder)
basic_machine=armv4l-corel
os=-linux
;;
news | news700 | news800 | news900) news | news700 | news800 | news900)
basic_machine=m68k-sony basic_machine=m68k-sony
os=-newsos os=-newsos
@@ -424,6 +538,10 @@ case $basic_machine in
basic_machine=mips-sony basic_machine=mips-sony
os=-newsos os=-newsos
;; ;;
necv70)
basic_machine=v70-nec
os=-sysv
;;
next | m*-next ) next | m*-next )
basic_machine=m68k-next basic_machine=m68k-next
case $os in case $os in
@@ -449,9 +567,25 @@ case $basic_machine in
basic_machine=i960-intel basic_machine=i960-intel
os=-nindy os=-nindy
;; ;;
mon960)
basic_machine=i960-intel
os=-mon960
;;
np1) np1)
basic_machine=np1-gould basic_machine=np1-gould
;; ;;
op50n-* | op60c-*)
basic_machine=hppa1.1-oki
os=-proelf
;;
OSE68000 | ose68000)
basic_machine=m68000-ericsson
os=-ose
;;
os68k)
basic_machine=m68k-none
os=-os68k
;;
pa-hitachi) pa-hitachi)
basic_machine=hppa1.1-hitachi basic_machine=hppa1.1-hitachi
os=-hiuxwe2 os=-hiuxwe2
@@ -469,19 +603,19 @@ case $basic_machine in
pc532 | pc532-*) pc532 | pc532-*)
basic_machine=ns32k-pc532 basic_machine=ns32k-pc532
;; ;;
pentium | p5 | k5 | nexen) pentium | p5 | k5 | k6 | nexen)
basic_machine=i586-pc basic_machine=i586-pc
;; ;;
pentiumpro | p6 | k6 | 6x86) pentiumpro | p6 | 6x86)
basic_machine=i686-pc basic_machine=i686-pc
;; ;;
pentiumii | pentium2) pentiumii | pentium2)
basic_machine=i786-pc basic_machine=i786-pc
;; ;;
pentium-* | p5-* | k5-* | nexen-*) pentium-* | p5-* | k5-* | k6-* | nexen-*)
basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
;; ;;
pentiumpro-* | p6-* | k6-* | 6x86-*) pentiumpro-* | p6-* | 6x86-*)
basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
;; ;;
pentiumii-* | pentium2-*) pentiumii-* | pentium2-*)
@@ -505,12 +639,20 @@ case $basic_machine in
ps2) ps2)
basic_machine=i386-ibm basic_machine=i386-ibm
;; ;;
rom68k)
basic_machine=m68k-rom68k
os=-coff
;;
rm[46]00) rm[46]00)
basic_machine=mips-siemens basic_machine=mips-siemens
;; ;;
rtpc | rtpc-*) rtpc | rtpc-*)
basic_machine=romp-ibm basic_machine=romp-ibm
;; ;;
sa29200)
basic_machine=a29k-amd
os=-udi
;;
sequent) sequent)
basic_machine=i386-sequent basic_machine=i386-sequent
;; ;;
@@ -518,6 +660,10 @@ case $basic_machine in
basic_machine=sh-hitachi basic_machine=sh-hitachi
os=-hms os=-hms
;; ;;
sparclite-wrs)
basic_machine=sparclite-wrs
os=-vxworks
;;
sps7) sps7)
basic_machine=m68k-bull basic_machine=m68k-bull
os=-sysv2 os=-sysv2
@@ -525,6 +671,13 @@ case $basic_machine in
spur) spur)
basic_machine=spur-unknown basic_machine=spur-unknown
;; ;;
st2000)
basic_machine=m68k-tandem
;;
stratus)
basic_machine=i860-stratus
os=-sysv4
;;
sun2) sun2)
basic_machine=m68000-sun basic_machine=m68000-sun
;; ;;
@@ -569,6 +722,10 @@ case $basic_machine in
basic_machine=i386-sequent basic_machine=i386-sequent
os=-dynix os=-dynix
;; ;;
t3e)
basic_machine=t3e-cray
os=-unicos
;;
tx39) tx39)
basic_machine=mipstx39-unknown basic_machine=mipstx39-unknown
;; ;;
@@ -586,6 +743,10 @@ case $basic_machine in
basic_machine=a29k-nyu basic_machine=a29k-nyu
os=-sym1 os=-sym1
;; ;;
v810 | necv810)
basic_machine=v810-nec
os=-none
;;
vaxv) vaxv)
basic_machine=vax-dec basic_machine=vax-dec
os=-sysv os=-sysv
@@ -609,6 +770,14 @@ case $basic_machine in
basic_machine=a29k-wrs basic_machine=a29k-wrs
os=-vxworks os=-vxworks
;; ;;
w65*)
basic_machine=w65-wdc
os=-none
;;
w89k-*)
basic_machine=hppa1.1-winbond
os=-proelf
;;
xmp) xmp)
basic_machine=xmp-cray basic_machine=xmp-cray
os=-unicos os=-unicos
@@ -616,6 +785,10 @@ case $basic_machine in
xps | xps100) xps | xps100)
basic_machine=xps100-honeywell basic_machine=xps100-honeywell
;; ;;
z8k-*-coff)
basic_machine=z8k-unknown
os=-sim
;;
none) none)
basic_machine=none-none basic_machine=none-none
os=-none os=-none
@@ -623,6 +796,15 @@ case $basic_machine in
# Here we handle the default manufacturer of certain CPU types. It is in # Here we handle the default manufacturer of certain CPU types. It is in
# some cases the only manufacturer, in others, it is the most popular. # some cases the only manufacturer, in others, it is the most popular.
w89k)
basic_machine=hppa1.1-winbond
;;
op50n)
basic_machine=hppa1.1-oki
;;
op60c)
basic_machine=hppa1.1-oki
;;
mips) mips)
if [ x$os = x-linux-gnu ]; then if [ x$os = x-linux-gnu ]; then
basic_machine=mips-unknown basic_machine=mips-unknown
@@ -645,7 +827,7 @@ case $basic_machine in
we32k) we32k)
basic_machine=we32k-att basic_machine=we32k-att
;; ;;
sparc) sparc | sparcv9)
basic_machine=sparc-sun basic_machine=sparc-sun
;; ;;
cydra) cydra)
@@ -657,6 +839,16 @@ case $basic_machine in
orion105) orion105)
basic_machine=clipper-highlevel basic_machine=clipper-highlevel
;; ;;
mac | mpw | mac-mpw)
basic_machine=m68k-apple
;;
pmac | pmac-mpw)
basic_machine=powerpc-apple
;;
c4x*)
basic_machine=c4x-none
os=-coff
;;
*) *)
echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
exit 1 exit 1
@@ -710,13 +902,21 @@ case $os in
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
| -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
| -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
| -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \ | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
| -cygwin32* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
| -mingw32* | -linux-gnu* | -uxpv* | -beos*) | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
| -interix* | -uwin* | -rhapsody* | -openstep* | -oskit*)
# Remember, each alternative MUST END IN *, to match a version number. # Remember, each alternative MUST END IN *, to match a version number.
;; ;;
-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
| -windows* | -osx | -abug | -netware* | -os9* | -beos* \
| -macos* | -mpw* | -magic* | -mon960* | -lnews*)
;;
-mac*)
os=`echo $os | sed -e 's|mac|macos|'`
;;
-linux*) -linux*)
os=`echo $os | sed -e 's|linux|linux-gnu|'` os=`echo $os | sed -e 's|linux|linux-gnu|'`
;; ;;
@@ -741,6 +941,9 @@ case $os in
-acis*) -acis*)
os=-aos os=-aos
;; ;;
-386bsd)
os=-bsd
;;
-ctix* | -uts*) -ctix* | -uts*)
os=-sysv os=-sysv
;; ;;
@@ -772,9 +975,18 @@ case $os in
# This must come after -sysvr4. # This must come after -sysvr4.
-sysv*) -sysv*)
;; ;;
-ose*)
os=-ose
;;
-es1800*)
os=-ose
;;
-xenix) -xenix)
os=-xenix os=-xenix
;; ;;
-*mint | -*MiNT)
os=-mint
;;
-none) -none)
;; ;;
*) *)
@@ -800,6 +1012,9 @@ case $basic_machine in
*-acorn) *-acorn)
os=-riscix1.2 os=-riscix1.2
;; ;;
arm*-corel)
os=-linux
;;
arm*-semi) arm*-semi)
os=-aout os=-aout
;; ;;
@@ -821,6 +1036,15 @@ case $basic_machine in
# default. # default.
# os=-sunos4 # os=-sunos4
;; ;;
m68*-cisco)
os=-aout
;;
mips*-cisco)
os=-elf
;;
mips*-*)
os=-elf
;;
*-tti) # must be before sparc entry or we get the wrong os. *-tti) # must be before sparc entry or we get the wrong os.
os=-sysv3 os=-sysv3
;; ;;
@@ -833,6 +1057,15 @@ case $basic_machine in
*-ibm) *-ibm)
os=-aix os=-aix
;; ;;
*-wec)
os=-proelf
;;
*-winbond)
os=-proelf
;;
*-oki)
os=-proelf
;;
*-hp) *-hp)
os=-hpux os=-hpux
;; ;;
@@ -896,6 +1129,18 @@ case $basic_machine in
f301-fujitsu) f301-fujitsu)
os=-uxpv os=-uxpv
;; ;;
*-rom68k)
os=-coff
;;
*-*bug)
os=-coff
;;
*-apple)
os=-macos
;;
*-atari*)
os=-mint
;;
*) *)
os=-none os=-none
;; ;;
@@ -917,9 +1162,15 @@ case $basic_machine in
-aix*) -aix*)
vendor=ibm vendor=ibm
;; ;;
-beos*)
vendor=be
;;
-hpux*) -hpux*)
vendor=hp vendor=hp
;; ;;
-mpeix*)
vendor=hp
;;
-hiux*) -hiux*)
vendor=hitachi vendor=hitachi
;; ;;
@@ -947,6 +1198,15 @@ case $basic_machine in
-aux*) -aux*)
vendor=apple vendor=apple
;; ;;
-hms*)
vendor=hitachi
;;
-mpw* | -macos*)
vendor=apple
;;
-*mint | -*MiNT)
vendor=atari
;;
esac esac
basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
;; ;;

1805
configure vendored

File diff suppressed because it is too large Load Diff

View File

@@ -456,11 +456,11 @@ dnl
dnl WX_INTERFACE_AGE = 0 dnl WX_INTERFACE_AGE = 0
WX_MAJOR_VERSION_NUMBER=2 WX_MAJOR_VERSION_NUMBER=2
WX_MINOR_VERSION_NUMBER=1 WX_MINOR_VERSION_NUMBER=2
WX_RELEASE_NUMBER=14 WX_RELEASE_NUMBER=5
WX_INTERFACE_AGE=0 WX_INTERFACE_AGE=5
WX_BINARY_AGE=0 WX_BINARY_AGE=5
WX_VERSION=$WX_MAJOR_VERSION_NUMBER.$WX_MINOR_VERSION_NUMBER.$WX_RELEASE_NUMBER WX_VERSION=$WX_MAJOR_VERSION_NUMBER.$WX_MINOR_VERSION_NUMBER.$WX_RELEASE_NUMBER
@@ -492,6 +492,7 @@ USE_ALPHA=
USE_OSF= USE_OSF=
USE_BSD= USE_BSD=
USE_FREEBSD= USE_FREEBSD=
USE_NETBSD=
USE_VMS= USE_VMS=
USE_ULTRIX= USE_ULTRIX=
USE_CYGWIN= USE_CYGWIN=
@@ -572,19 +573,27 @@ case "${host}" in
AC_DEFINE(__BSD__) AC_DEFINE(__BSD__)
DEFAULT_DEFAULT_wxUSE_MOTIF=1 DEFAULT_DEFAULT_wxUSE_MOTIF=1
;; ;;
*-*-freebsd* | *-*-netbsd*) *-*-freebsd*)
USE_BSD=1 USE_BSD=1
USE_FREEBSD=1 USE_FREEBSD=1
AC_DEFINE(__FREEBSD__) AC_DEFINE(__FREEBSD__)
AC_DEFINE(__BSD__) AC_DEFINE(__BSD__)
DEFAULT_DEFAULT_wxUSE_GTK=1 DEFAULT_DEFAULT_wxUSE_GTK=1
;; ;;
*-*-netbsd*)
USE_BSD=1
USE_NETBSD=1
AC_DEFINE(__FREEBSD__)
AC_DEFINE(__NETBSD__)
DEFAULT_DEFAULT_wxUSE_GTK=1
;;
*-*-osf* ) *-*-osf* )
USE_ALPHA=1 USE_ALPHA=1
USE_OSF=1 USE_OSF=1
AC_DEFINE(__ALPHA__) AC_DEFINE(__ALPHA__)
AC_DEFINE(__OSF__) AC_DEFINE(__OSF__)
DEFAULT_DEFAULT_wxUSE_MOTIF=1 DEFAULT_DEFAULT_wxUSE_MOTIF=1
NEEDS_D_REENTRANT_FOR_R_FUNCS=1
;; ;;
*-*-dgux5* ) *-*-dgux5* )
USE_ALPHA=1 USE_ALPHA=1
@@ -1028,7 +1037,6 @@ WX_ARG_ENABLE(textfile, [ --enable-textfile use wxTextFile classes],
WX_ARG_ENABLE(unicode, [ --enable-unicode compile wxString with Unicode support], wxUSE_UNICODE) WX_ARG_ENABLE(unicode, [ --enable-unicode compile wxString with Unicode support], wxUSE_UNICODE)
WX_ARG_ENABLE(wcsrtombs, [ --enable-wcsrtombs use wcsrtombs instead of buggy (GNU libc1/Linux libc5) wcstombs], wxUSE_WCSRTOMBS) WX_ARG_ENABLE(wcsrtombs, [ --enable-wcsrtombs use wcsrtombs instead of buggy (GNU libc1/Linux libc5) wcstombs], wxUSE_WCSRTOMBS)
WX_ARG_ENABLE(wxprintfv, [ --enable-wxprintfv use wxWindows implementation of vprintf()], wxUSE_EXPERIMENTAL_PRINTF) WX_ARG_ENABLE(wxprintfv, [ --enable-wxprintfv use wxWindows implementation of vprintf()], wxUSE_EXPERIMENTAL_PRINTF)
WX_ARG_ENABLE(joystick, [ --enable-joystick compile in joystick support (Linux only)], wxUSE_JOYSTICK)
WX_ARG_ENABLE(std_iostreams, [ --enable-std_iostreams use standard C++ stream classes], wxUSE_STD_IOSTREAM) WX_ARG_ENABLE(std_iostreams, [ --enable-std_iostreams use standard C++ stream classes], wxUSE_STD_IOSTREAM)
WX_ARG_ENABLE(filesystem, [ --enable-filesystem use virtual file systems classes], wxUSE_FILESYSTEM) WX_ARG_ENABLE(filesystem, [ --enable-filesystem use virtual file systems classes], wxUSE_FILESYSTEM)
WX_ARG_ENABLE(fs_inet, [ --enable-fs_inet use virtual HTTP/FTP filesystems], wxUSE_FS_INET) WX_ARG_ENABLE(fs_inet, [ --enable-fs_inet use virtual HTTP/FTP filesystems], wxUSE_FS_INET)
@@ -1208,6 +1216,7 @@ WX_ARG_ENABLE(splines, [ --enable-splines use spline drawing code],
WX_ARG_ENABLE(validators, [ --enable-validators use wxValidator and derived classes], wxUSE_VALIDATORS) WX_ARG_ENABLE(validators, [ --enable-validators use wxValidator and derived classes], wxUSE_VALIDATORS)
WX_ARG_ENABLE(busyinfo, [ --enable-busyinfo use wxBusyInfo], wxUSE_BUSYINFO) WX_ARG_ENABLE(busyinfo, [ --enable-busyinfo use wxBusyInfo], wxUSE_BUSYINFO)
WX_ARG_ENABLE(plot, [ --enable-plot use wxPlot], wxUSE_PLOT) WX_ARG_ENABLE(plot, [ --enable-plot use wxPlot], wxUSE_PLOT)
WX_ARG_ENABLE(joystick, [ --enable-joystick compile in joystick support (Linux only)], wxUSE_JOYSTICK)
dnl --------------------------------------------------------------------------- dnl ---------------------------------------------------------------------------
dnl support for image formats that do not rely on external library dnl support for image formats that do not rely on external library
@@ -1389,7 +1398,7 @@ if test ! -d sub ; then
mkdir sub mkdir sub
fi fi
echo dummy > sub/file echo dummy > sub/file
${MAKE-make} -f confMake VPATH=sub 2> config.log > /dev/null ${MAKE-make} -f confMake VPATH=sub 2>&5 > /dev/null
RESULT=$? RESULT=$?
rm -f sub/file check final_file confMake rm -f sub/file check final_file confMake
rmdir sub rmdir sub
@@ -1531,6 +1540,7 @@ GUI_TK_LIBRARY=
GUI_TK_LINK= GUI_TK_LINK=
WXGTK12= WXGTK12=
WXGTK127=
WXGTK13= WXGTK13=
WXWINE= WXWINE=
@@ -1556,10 +1566,10 @@ if test "$wxUSE_CYGWIN" = 1 || test "$wxUSE_MINGW" = 1 ; then
dnl --- This will bloat the executable, but it'll work for now... dnl --- This will bloat the executable, but it'll work for now...
LIBS="$LIBS -lkernel32 -luser32 -lgdi32 -lcomdlg32 -lwinspool -lwinmm -lshell32 -lcomctl32 -lctl3d32 -lcrtdll -ladvapi32 -lwsock32" LIBS="$LIBS -lkernel32 -luser32 -lgdi32 -lcomdlg32 -lwinspool -lwinmm -lshell32 -lcomctl32 -lctl3d32 -lcrtdll -ladvapi32 -lwsock32"
dnl add extra odbc libs if we have compiled in odbc dnl add extra odbc libs if we have compiled in odbc
if test "$wxUSE_ODBC" = "yes" ; then if test "$wxUSE_ODBC" = "yes" ; then
LIBS="$LIBS -lodbc32 -lole32 -loleaut32" LIBS="$LIBS -lodbc32 -lole32 -loleaut32"
fi fi
dnl -mwindows is needed to avoid that spawning of a console window dnl -mwindows is needed to avoid that spawning of a console window
if test "$wxUSE_MINGW" = 1; then if test "$wxUSE_MINGW" = 1; then
@@ -1591,6 +1601,7 @@ fi
if test "$wxUSE_GTK" = 1; then if test "$wxUSE_GTK" = 1; then
dnl avoid calling AM_PATH_GTK twice, so check first for the newer version dnl avoid calling AM_PATH_GTK twice, so check first for the newer version
dnl and only then, if it wasn't found, for an older one dnl and only then, if it wasn't found, for an older one
AM_PATH_GTK(1.2.7, WXGTK127=1)
AM_PATH_GTK(1.2.3, WXGTK12=1) AM_PATH_GTK(1.2.3, WXGTK12=1)
if test "$WXGTK12" != 1; then if test "$WXGTK12" != 1; then
@@ -1850,8 +1861,8 @@ if test "$wxUSE_MOTIF" = 1; then
version = XpmLibraryVersion(); version = XpmLibraryVersion();
], ],
[ [
XPM_LINK="-lXpm " XPM_LINK="-lXpm "
AC_DEFINE(wxHAVE_LIB_XPM) AC_DEFINE(wxHAVE_LIB_XPM)
AC_MSG_RESULT(found in default search path) AC_MSG_RESULT(found in default search path)
COMPILED_X_PROGRAM=0 COMPILED_X_PROGRAM=0
], ],
@@ -1900,11 +1911,18 @@ else
TOOLKIT_DIR="os2" TOOLKIT_DIR="os2"
fi fi
dnl the (base) name of the library and support files for this toolkit
if test "$wxUSE_DEBUG_FLAG" = "yes"; then
TOOLKIT_NAME="${TOOLKIT_DIR}d"
else
TOOLKIT_NAME="${TOOLKIT_DIR}"
fi
dnl the symbol which allows conditional compilation for the given toolkit dnl the symbol which allows conditional compilation for the given toolkit
TOOLKIT_DEF="-D__WX${TOOLKIT}__" TOOLKIT_DEF="-D__WX${TOOLKIT}__"
dnl the name of the (libtool) library dnl the name of the (libtool) library
WX_LIBRARY="wx_${TOOLKIT_DIR}" WX_LIBRARY="wx_${TOOLKIT_NAME}"
dnl the sources, their dependenices and the headers dnl the sources, their dependenices and the headers
ALL_OBJECTS="\$(GUIOBJS) \$(COMMONOBJS) \$(GENERICOBJS) \$(UNIXOBJS) \$(HTMLOBJS) \$(OGLOBJS)" ALL_OBJECTS="\$(GUIOBJS) \$(COMMONOBJS) \$(GENERICOBJS) \$(UNIXOBJS) \$(HTMLOBJS) \$(OGLOBJS)"
@@ -1940,7 +1958,16 @@ fi
else else
USE_GUI=0 USE_GUI=0
dnl this may be (almost) unneccesary for wxBase now we use TOOLKIT_NAME
TOOLKIT_DIR="base" TOOLKIT_DIR="base"
dnl the base name of the library and wxXXX-config files
if test "$wxUSE_DEBUG_FLAG" = "yes"; then
TOOLKIT_NAME="${TOOLKIT_DIR}d"
else
TOOLKIT_NAME="${TOOLKIT_DIR}"
fi
TOOLKIT_DEF="-D__WXBASE__" TOOLKIT_DEF="-D__WXBASE__"
dnl the sources, their dependenices and the headers dnl the sources, their dependenices and the headers
@@ -1952,7 +1979,7 @@ else
fi fi
dnl building wxBase only dnl building wxBase only
WX_LIBRARY="wxbase" WX_LIBRARY="wx_${TOOLKIT_NAME}"
PORT_FILES="src/files.lst" PORT_FILES="src/files.lst"
RPM_FILES="src/rpmfiles.lst" RPM_FILES="src/rpmfiles.lst"
@@ -1989,6 +2016,7 @@ PIC_FLAG=
WX_ALL= WX_ALL=
WX_ALL_INSTALLED= WX_ALL_INSTALLED=
BURNT_LIBRARY_NAME= BURNT_LIBRARY_NAME=
WX_TARGET_LIBRARY_SONAME=
dnl --- the marker for quick search, leave it here: SHARED_LIB_SETUP --- dnl --- the marker for quick search, leave it here: SHARED_LIB_SETUP ---
@@ -1999,12 +2027,16 @@ if test "$wxUSE_SHARED" = "yes"; then
SHARED_LD="${CC} -shared -fPIC -o" SHARED_LD="${CC} -shared -fPIC -o"
PIC_FLAG="-fPIC" PIC_FLAG="-fPIC"
else else
dnl no idea why it wants it, but it does
LDFLAGS="-L/usr/lib"
SHARED_LD="${CXX} -b -o" SHARED_LD="${CXX} -b -o"
PIC_FLAG="+Z" PIC_FLAG="+Z"
fi fi
WX_LIBRARY_NAME_SHARED="libwx_${TOOLKIT_DIR}.sl" WX_LIBRARY_NAME_SHARED="libwx_${TOOLKIT_NAME}.sl"
WX_LIBRARY_NAME_SHARED_GL="libwx_${TOOLKIT_DIR}_gl.sl" WX_LIBRARY_NAME_SHARED_GL="libwx_${TOOLKIT_NAME}_gl.sl"
if test "$wxUSE_OPENGL" = "yes"; then if test "$wxUSE_OPENGL" = "yes"; then
WX_ALL_INSTALLED="preinstall_gl"
WX_ALL="${WX_LIBRARY_NAME_SHARED} ${WX_LIBRARY_NAME_SHARED_GL}" WX_ALL="${WX_LIBRARY_NAME_SHARED} ${WX_LIBRARY_NAME_SHARED_GL}"
else else
WX_ALL="${WX_LIBRARY_NAME_SHARED}" WX_ALL="${WX_LIBRARY_NAME_SHARED}"
@@ -2018,6 +2050,8 @@ if test "$wxUSE_SHARED" = "yes"; then
if test "$wxUSE_BURNT_NAME" = "yes" ; then if test "$wxUSE_BURNT_NAME" = "yes" ; then
BURNT_LIBRARY_NAME="-Wl,-soname,${WX_LIBRARY_LINK1}" BURNT_LIBRARY_NAME="-Wl,-soname,${WX_LIBRARY_LINK1}"
BURNT_LIBRARY_NAME_GL="-Wl,-soname,${WX_LIBRARY_LINK1_GL}" BURNT_LIBRARY_NAME_GL="-Wl,-soname,${WX_LIBRARY_LINK1_GL}"
dnl substitute this in makelib.env for the contrib libs
WX_TARGET_LIBRARY_SONAME="-Wl,-soname,\$(TARGETLIB_LINK1)"
fi fi
if test "$wxUSE_OPENGL" = "yes"; then if test "$wxUSE_OPENGL" = "yes"; then
WX_ALL_INSTALLED="CREATE_INSTALLED_LINKS CREATE_INSTALLED_LINKS_GL" WX_ALL_INSTALLED="CREATE_INSTALLED_LINKS CREATE_INSTALLED_LINKS_GL"
@@ -2046,6 +2080,10 @@ if test "$wxUSE_SHARED" = "yes"; then
if test "$GCC" = yes ; then if test "$GCC" = yes ; then
SHARED_LD="${CC} -shared -o" SHARED_LD="${CC} -shared -o"
PIC_FLAG="-fPIC" PIC_FLAG="-fPIC"
dnl newer versions of gcc need -isystem to compile X headers on
dnl Solaris (which use old style C syntax)
CPPFLAGS="$CPPFLAGS -isystem /usr/openwin/include"
else else
SHARED_LD="${CXX} -G -o" SHARED_LD="${CXX} -G -o"
PIC_FLAG="-KPIC" PIC_FLAG="-KPIC"
@@ -2096,13 +2134,23 @@ if test "$wxUSE_SHARED" = "yes"; then
dnl only static for now dnl only static for now
WX_TARGET_LIBRARY="${WX_LIBRARY_NAME_STATIC}" WX_TARGET_LIBRARY="${WX_LIBRARY_NAME_STATIC}"
WX_TARGET_LIBRARY_GL="${WX_LIBRARY_NAME_STATIC_GL}" WX_TARGET_LIBRARY_GL="${WX_LIBRARY_NAME_STATIC_GL}"
WX_ALL="${WX_LIBRARY_NAME_STATIC}" if test "$wxUSE_OPENGL" = "yes"; then
WX_ALL_INSTALLED="preinstall_gl"
WX_ALL="${WX_LIBRARY_NAME_STATIC} ${WX_LIBRARY_NAME_STATIC_GL}"
else
WX_ALL="${WX_LIBRARY_NAME_STATIC}"
fi
;; ;;
*-*-mingw32* ) *-*-mingw32* )
dnl only static for now dnl only static for now
WX_TARGET_LIBRARY="${WX_LIBRARY_NAME_STATIC}" WX_TARGET_LIBRARY="${WX_LIBRARY_NAME_STATIC}"
WX_TARGET_LIBRARY_GL="${WX_LIBRARY_NAME_STATIC_GL}" WX_TARGET_LIBRARY_GL="${WX_LIBRARY_NAME_STATIC_GL}"
WX_ALL="${WX_LIBRARY_NAME_STATIC}" if test "$wxUSE_OPENGL" = "yes"; then
WX_ALL_INSTALLED="preinstall_gl"
WX_ALL="${WX_LIBRARY_NAME_STATIC} ${WX_LIBRARY_NAME_STATIC_GL}"
else
WX_ALL="${WX_LIBRARY_NAME_STATIC}"
fi
;; ;;
*-pc-os2_emx ) *-pc-os2_emx )
dnl only static for now dnl only static for now
@@ -2132,7 +2180,20 @@ else
dnl set target to static dnl set target to static
WX_TARGET_LIBRARY="${WX_LIBRARY_NAME_STATIC}" WX_TARGET_LIBRARY="${WX_LIBRARY_NAME_STATIC}"
WX_TARGET_LIBRARY_GL="${WX_LIBRARY_NAME_STATIC_GL}" WX_TARGET_LIBRARY_GL="${WX_LIBRARY_NAME_STATIC_GL}"
WX_ALL="${WX_LIBRARY_NAME_STATIC}"
if test "$wxUSE_OPENGL" = "yes"; then
WX_ALL_INSTALLED="preinstall_gl"
WX_ALL="${WX_LIBRARY_NAME_STATIC} ${WX_LIBRARY_NAME_STATIC_GL}"
else
WX_ALL="${WX_LIBRARY_NAME_STATIC}"
fi
dnl give static wxBase build a working install target
if test "$wxUSE_GUI" = "no"; then
dnl we're here because WX_ALL_INSTALLED is empty, but play safe anyway
WX_ALL_INSTALLED="${WX_ALL_INSTALLED} preinstall"
fi
WX_TARGET_LIBRARY_TYPE="a" WX_TARGET_LIBRARY_TYPE="a"
fi fi
@@ -2249,53 +2310,81 @@ AC_CHECK_LIB(c, wcslen, [
dnl check for vprintf/vsprintf() which are GNU extensions dnl check for vprintf/vsprintf() which are GNU extensions
AC_FUNC_VPRINTF AC_FUNC_VPRINTF
dnl check for vsnprintf() - a safe version of vsprintf()
AC_CHECK_FUNCS(vsnprintf,
AC_DEFINE(HAVE_VSNPRINTF),
AC_MSG_WARN(unsafe function sprintf will be used instead of snprintf)
)
dnl check for vsscanf() - on some platforms (Linux, glibc 2.1.1) it's
dnl available in the library but the prototype is missing, so we can't use
dnl AC_CHECK_FUNCS here, do it manually
AC_LANG_SAVE AC_LANG_SAVE
AC_LANG_CPLUSPLUS AC_LANG_CPLUSPLUS
dnl check for vsscanf() and vsnprintf() - on some platforms (Linux, glibc
dnl 2.1.1 for the first one, HP-UX for the second) it's available in the
dnl library but the prototype is missing, so we can't use AC_CHECK_FUNCS here,
dnl do it manually
dnl we use AC_TRY_COMPILE() here instead of AC_TRY_RUN() to make the checks
dnl work for cross-compilation, but AC_TRY_COMPILE() normally only compiles
dnl one function while we need at least 2 - hence the ugly hack below. To
dnl understand why it works, remember that AC_TRY_COMPILE() just prepends
dnl "int main() {" in the beginning of the code and "; return 0; }" at the
dnl end...
dnl check for vsnprintf() - a safe version of vsprintf()
AC_CACHE_CHECK([for vsnprintf], wx_cv_func_vsnprintf,
[
AC_TRY_COMPILE([
#include <stdio.h>
#include <stdarg.h>
], [
int wx_test_vsnprintf(const char *, ...);
wx_test_vsnprintf("%s");
return 0;
}
int wx_test_vsnprintf(const char *fmt, ...)
{
char *s;
va_list argp;
va_start(argp, fmt);
vsnprintf(s, 42, fmt, argp);
va_end(argp);
], [
AC_DEFINE(HAVE_VSNPRINTF)
wx_cv_func_vsnprintf=yes
], [
AC_MSG_WARN(unsafe function sprintf will be used instead of snprintf)
wx_cv_func_vsnprintf=no
])
])
dnl check for vsscanf()
AC_CACHE_CHECK([for vsscanf], wx_cv_func_vsscanf, AC_CACHE_CHECK([for vsscanf], wx_cv_func_vsscanf,
[ [
AC_TRY_RUN( AC_TRY_COMPILE([
[ #include <stdio.h>
#include <stdio.h> #include <stdarg.h>
#include <stdarg.h> ], [
int wx_test_vsscanf(const char *, ...);
int try_vsscanf(const char *format, ...) wx_test_vsscanf("%d");
{ return 0;
va_list ap;
va_start(ap, format);
vsscanf("17", format, ap);
va_end(ap);
} }
int main() int wx_test_vsscanf(const char *fmt, ...)
{ {
int i; va_list argp;
try_vsscanf("%d", &i); va_start(argp, fmt);
return i == 17 ? 0 : 1; vsscanf("42", fmt, argp);
} va_end(argp);
], [ ], [
AC_DEFINE(HAVE_VSSCANF) AC_DEFINE(HAVE_VSSCANF)
wx_cv_func_vsscanf=yes wx_cv_func_vsscanf=yes
], ], [
wx_cv_func_vsscanf=no, wx_cv_func_vsscanf=no
wx_cv_func_vsscanf=no ])
)
]) ])
AC_LANG_RESTORE AC_LANG_RESTORE
dnl under MSW we always have Sleep() dnl the following tests are for Unix(like) systems only
if test "$TOOLKIT" != "MSW"; then if test "$TOOLKIT" != "MSW"; then
dnl check for POSIX signals if we need them dnl check for POSIX signals if we need them
@@ -2306,6 +2395,30 @@ if test "$wxUSE_ON_FATAL_EXCEPTION" = "yes" -a "$wxUSE_UNIX" = "yes"; then
AC_MSG_WARN([No POSIX signal functions on this system, wxApp::OnFatalException will not be called]) AC_MSG_WARN([No POSIX signal functions on this system, wxApp::OnFatalException will not be called])
wxUSE_ON_FATAL_EXCEPTION=no wxUSE_ON_FATAL_EXCEPTION=no
fi fi
if test "$wxUSE_ON_FATAL_EXCEPTION" = "yes"; then
AC_LANG_SAVE
AC_LANG_CPLUSPLUS
AC_CACHE_CHECK([for sa_handler type], wx_cv_type_sa_handler,
[
AC_TRY_COMPILE([#include <signal.h>],
[
extern void testSigHandler(int);
struct sigaction sa;
sa.sa_handler = testSigHandler;
], [
wx_cv_type_sa_handler=int
], [
wx_cv_type_sa_handler=void
])
])
AC_LANG_RESTORE
AC_DEFINE_UNQUOTED(wxTYPE_SA_HANDLER, $wx_cv_type_sa_handler)
fi
fi fi
dnl check for vfork() (even if it's the same as fork() in modern Unices) dnl check for vfork() (even if it's the same as fork() in modern Unices)
@@ -2419,12 +2532,19 @@ fi
if test "$wxUSE_THREADS" = "yes" ; then if test "$wxUSE_THREADS" = "yes" ; then
dnl find if POSIX threads are available dnl find if POSIX threads are available
dnl AIX calls the library libpthreads - thanks IBM!
if test "$wxUSE_AIX" = 1; then
THREADS_LIB=pthreads
else
THREADS_LIB=pthread
fi
dnl standard lib name is pthread dnl standard lib name is pthread
dnl We no longer test for pthread-0.7 as it breaks compilation on some dnl We no longer test for pthread-0.7 as it breaks compilation on some
dnl glibc2 systems, especially for static linkage. dnl glibc2 systems, especially for static linkage.
AC_CHECK_LIB(pthread, pthread_create, [ AC_CHECK_LIB($THREADS_LIB, pthread_create, [
THREADS_OBJ="threadpsx.lo" THREADS_OBJ="threadpsx.lo"
THREADS_LINK="pthread" THREADS_LINK=$THREADS_LIB
], [ ], [
dnl thread functions are in libc_r under FreeBSD dnl thread functions are in libc_r under FreeBSD
AC_CHECK_LIB(c_r, pthread_create, [ AC_CHECK_LIB(c_r, pthread_create, [
@@ -2473,21 +2593,33 @@ if test "$wxUSE_THREADS" = "yes" ; then
)] )]
) )
dnl VZ: we should be checking for all of the following functions instead: dnl to be able to set the thread priority, we need to have all of the
dnl following functions:
dnl 1. pthread_attr_getschedpolicy dnl 1. pthread_attr_getschedpolicy
dnl 2. sched_get_priority_min and sched_get_priority_max dnl 2. sched_get_priority_min and sched_get_priority_max
dnl (this one can be in either libpthread or libposix4 (under Solaris))
dnl 3. pthread_attr_getschedparam and pthread_attr_setschedparam dnl 3. pthread_attr_getschedparam and pthread_attr_setschedparam
dnl but it seems that if the first one is there, the other ones are too (of HAVE_PRIOR_FUNCS=0
dnl course the proper solution would be to implement AC_FUNC_THREAD above
dnl and do test for them all - anyone?)
AC_CHECK_LIB($THREADS_LINK, pthread_attr_getschedpolicy, AC_CHECK_LIB($THREADS_LINK, pthread_attr_getschedpolicy,
AC_DEFINE(HAVE_THREAD_PRIORITY_FUNCTIONS), AC_CHECK_LIB($THREADS_LINK, pthread_attr_setschedparam,
[AC_CHECK_LIB("posix4", pthread_attr_getschedpolicy, AC_CHECK_LIB($THREADS_LINK, sched_get_priority_max,
[AC_DEFINE(HAVE_THREAD_PRIORITY_FUNCTIONS) POSIX4_LINK="-lposix4"], HAVE_PRIOR_FUNCS=1,
AC_MSG_WARN(Setting thread priority will not work) AC_CHECK_LIB("posix4", sched_get_priority_max,
)] [
HAVE_PRIOR_FUNCS=1
POSIX4_LINK="-lposix4"
],
)
)
)
) )
if test "$HAVE_PRIOR_FUNCS" = 1; then
AC_DEFINE(HAVE_THREAD_PRIORITY_FUNCTIONS)
else
AC_MSG_WARN(Setting thread priority will not work)
fi
AC_CHECK_LIB($THREADS_LINK, pthread_cancel, AC_CHECK_LIB($THREADS_LINK, pthread_cancel,
AC_DEFINE(HAVE_PTHREAD_CANCEL), AC_DEFINE(HAVE_PTHREAD_CANCEL),
AC_MSG_WARN([wxThread::Kill() will not work properly])) AC_MSG_WARN([wxThread::Kill() will not work properly]))
@@ -2544,6 +2676,10 @@ if test "$WXGTK12" = 1 ; then
AC_DEFINE_UNQUOTED(__WXGTK12__,$WXGTK12) AC_DEFINE_UNQUOTED(__WXGTK12__,$WXGTK12)
fi fi
if test "$WXGTK127" = 1 ; then
AC_DEFINE_UNQUOTED(__WXGTK127__,$WXGTK127)
fi
if test "$WXWINE" = 1 ; then if test "$WXWINE" = 1 ; then
TOOLKIT_DEF="${TOOLKIT_DEF} -D__WXWINE__" TOOLKIT_DEF="${TOOLKIT_DEF} -D__WXWINE__"
fi fi
@@ -2591,12 +2727,13 @@ fi
DEP_INFO_FLAGS= DEP_INFO_FLAGS=
CODE_GEN_FLAGS= CODE_GEN_FLAGS=
CODE_GEN_FLAGS_CXX=
if test "$GCC" = yes ; then if test "$GCC" = yes ; then
if test "$wxUSE_NO_RTTI" = "yes" ; then if test "$wxUSE_NO_RTTI" = "yes" ; then
CODE_GEN_FLAGS="$CODE_GEN_FLAGS -fno-rtti" CODE_GEN_FLAGS_CXX="$CODE_GEN_FLAGS_CXX -fno-rtti"
fi fi
if test "$wxUSE_NO_EXCEPTIONS" = "yes" ; then if test "$wxUSE_NO_EXCEPTIONS" = "yes" ; then
CODE_GEN_FLAGS="$CODE_GEN_FLAGS -fno-exceptions" CODE_GEN_FLAGS_CXX="$CODE_GEN_FLAGS_CXX -fno-exceptions"
fi fi
if test "$wxUSE_PERMISSIVE" = "yes" ; then if test "$wxUSE_PERMISSIVE" = "yes" ; then
CODE_GEN_FLAGS="$CODE_GEN_FLAGS -fpermissive" CODE_GEN_FLAGS="$CODE_GEN_FLAGS -fpermissive"
@@ -2706,10 +2843,10 @@ if test "$wxUSE_OPENGL" = "yes"; then
AC_DEFINE(wxUSE_OPENGL) AC_DEFINE(wxUSE_OPENGL)
AC_DEFINE(wxUSE_GLCANVAS) AC_DEFINE(wxUSE_GLCANVAS)
AC_CHECK_LIB(GL, glFlush, [ AC_CHECK_LIB(GL, glFlush, [
OPENGL_LINK="-lGL" OPENGL_LINK="-lGL -lGLU"
],[ ],[
AC_CHECK_LIB(MesaGL, glFlush, [ AC_CHECK_LIB(MesaGL, glFlush, [
OPENGL_LINK="-lMesaGL" OPENGL_LINK="-lMesaGL -lMesaGLU"
],) ],)
],) ],)
],wxUSE_OPENGL=0) ],wxUSE_OPENGL=0)
@@ -2812,6 +2949,7 @@ if test "$wxUSE_INTL" = "yes" ; then
else else
AC_DEFINE(wxUSE_INTL) AC_DEFINE(wxUSE_INTL)
SAMPLES_SUBDIRS="$SAMPLES_SUBDIRS internat" SAMPLES_SUBDIRS="$SAMPLES_SUBDIRS internat"
GUIDIST="$GUIDIST INTL_DIST"
fi fi
fi fi
@@ -3109,10 +3247,24 @@ if test "$wxUSE_DYNLIB_CLASS" = "yes"; then
[ [
AC_DEFINE(HAVE_SHL_LOAD) AC_DEFINE(HAVE_SHL_LOAD)
HAVE_SHL_FUNCS=1 HAVE_SHL_FUNCS=1
],
[
AC_CHECK_LIB(shl_load, dld,
[
HAVE_SHL_FUNCS=1
LIBS="$LIBS -ldld"
])
]) ])
]) ])
]) ])
dnl check also for dlerror()
if test "$HAVE_DL_FUNCS" = 1; then
AC_CHECK_FUNCS(dlerror,
AC_DEFINE(HAVE_DLERROR),
AC_CHECK_LIB(dl, dlerror, AC_DEFINE(HAVE_DLERROR)))
fi
if test "$HAVE_DL_FUNCS" = 0; then if test "$HAVE_DL_FUNCS" = 0; then
if test "$HAVE_SHL_FUNCS" = 0; then if test "$HAVE_SHL_FUNCS" = 0; then
if test "$USE_UNIX" = 1; then if test "$USE_UNIX" = 1; then
@@ -3554,15 +3706,16 @@ dnl ---------------------------------------------------------------------------
dnl Output the makefiles and such from the results found above dnl Output the makefiles and such from the results found above
dnl --------------------------------------------------------------------------- dnl ---------------------------------------------------------------------------
GUILIBS="$GUI_TK_LIBRARY $OPENGL_LINK $TOOLKIT_LINK" GUILIBS="$GUI_TK_LIBRARY $TOOLKIT_LINK"
OPENGL_LIBS="$OPENGL_LINK"
dnl all additional libraries (except wxWindows itself) we link with dnl all additional libraries (except wxWindows itself) we link with
dnl dnl
dnl note that we always link with -lm - extended.c uses floor() and is always dnl note that we always link with -lm - extended.c uses floor() and is always
dnl linked in dnl linked in
EXTRA_LIBS="-lm $LIBS $ZLIB_LINK $POSIX4_LINK $INET_LINK $WCHAR_LINK $THREADS_LINK $DMALLOC_LINK $DL_LINK" EXTRA_LIBS="$LIBS $POSIX4_LINK $INET_LINK $WCHAR_LINK $THREADS_LINK $DMALLOC_LINK $DL_LINK $ZLIB_LINK -lm"
if test "$wxUSE_GUI" = "yes"; then if test "$wxUSE_GUI" = "yes"; then
EXTRA_LIBS="$EXTRA_LIBS $GUILIBS $PNG_LINK $JPEG_LINK $TIFF_LINK" EXTRA_LIBS="$GUILIBS $PNG_LINK $JPEG_LINK $TIFF_LINK $EXTRA_LIBS"
fi fi
dnl all the libraries needed to link wxWindows programs when using the dnl all the libraries needed to link wxWindows programs when using the
@@ -3572,6 +3725,13 @@ LD_LIBS="\${top_builddir}/lib/${WX_LIBRARY_NAME_STATIC} $EXTRA_LIBS"
dnl all -I options we must pass to the compiler dnl all -I options we must pass to the compiler
INCLUDES="-I. -I\${top_builddir}/include -I\${top_srcdir}/include $ZLIB_INCLUDE $PNG_INCLUDE $JPEG_INCLUDE $TIFF_INCLUDE $TOOLKIT_INCLUDE" INCLUDES="-I. -I\${top_builddir}/include -I\${top_srcdir}/include $ZLIB_INCLUDE $PNG_INCLUDE $JPEG_INCLUDE $TIFF_INCLUDE $TOOLKIT_INCLUDE"
dnl wxGTK does not need TOOLKIT includes in wx-config
if test "$wxUSE_GTK" = 1; then
WXCONFIG_INCLUDE=""
else
WXCONFIG_INCLUDE="$TOOLKIT_INCLUDE"
fi
dnl C/C++ compiler options used to compile wxWindows dnl C/C++ compiler options used to compile wxWindows
if test "$GXX" = yes ; then if test "$GXX" = yes ; then
dnl CXXWARNINGS="-Wall -W -Wcast-qual -Werror" dnl CXXWARNINGS="-Wall -W -Wcast-qual -Werror"
@@ -3581,7 +3741,7 @@ if test "$GXX" = yes ; then
fi fi
EXTRA_CFLAGS="$WXDEBUG $WXODBCFLAG $PROFILE $OPTIMISE $INCLUDES" EXTRA_CFLAGS="$WXDEBUG $WXODBCFLAG $PROFILE $OPTIMISE $INCLUDES"
CFLAGS=`echo $CFLAGS $EXTRA_CFLAGS | sed 's/ \\+/ /g'` CFLAGS=`echo $CFLAGS $EXTRA_CFLAGS $CXXWARNINGS | sed 's/ \\+/ /g'`
CXXFLAGS=`echo $CXXFLAGS $EXTRA_CFLAGS $CXXWARNINGS | sed 's/ \+/ /g'` CXXFLAGS=`echo $CXXFLAGS $EXTRA_CFLAGS $CXXWARNINGS | sed 's/ \+/ /g'`
LDFLAGS="$LDFLAGS $PROFILE" LDFLAGS="$LDFLAGS $PROFILE"
@@ -3593,7 +3753,7 @@ if test "$wxUSE_GUI" = "yes"; then
dnl TODO some samples are never built so far: dnl TODO some samples are never built so far:
dnl ipc, mfc, nativdlg, oleauto, ownerdrw, proplist dnl ipc, mfc, nativdlg, oleauto, ownerdrw, proplist
SAMPLES_SUBDIRS="$SAMPLES_SUBDIRS controls dialogs dragimag drawing dynamic \ SAMPLES_SUBDIRS="$SAMPLES_SUBDIRS controls dialogs dragimag drawing dynamic \
font fractal image menu minimal richedit" font image menu minimal richedit"
dnl this is needed to be able to find AFM files dnl this is needed to be able to find AFM files
CPPFLAGS="$CPPFLAGS \$(EXTRADEFS) \$(APPEXTRADEFS)" CPPFLAGS="$CPPFLAGS \$(EXTRADEFS) \$(APPEXTRADEFS)"
@@ -3647,8 +3807,10 @@ AC_SUBST(SHARED_LD)
AC_SUBST(PIC_FLAG) AC_SUBST(PIC_FLAG)
AC_SUBST(DEP_INFO_FLAGS) AC_SUBST(DEP_INFO_FLAGS)
AC_SUBST(CODE_GEN_FLAGS) AC_SUBST(CODE_GEN_FLAGS)
AC_SUBST(CODE_GEN_FLAGS_CXX)
AC_SUBST(BURNT_LIBRARY_NAME) AC_SUBST(BURNT_LIBRARY_NAME)
AC_SUBST(BURNT_LIBRARY_NAME_GL) AC_SUBST(BURNT_LIBRARY_NAME_GL)
AC_SUBST(WX_TARGET_LIBRARY_SONAME)
AC_SUBST(WX_TARGET_LIBRARY_TYPE) AC_SUBST(WX_TARGET_LIBRARY_TYPE)
dnl debugging options dnl debugging options
@@ -3660,7 +3822,9 @@ AC_SUBST(AFMINSTALL)
AC_SUBST(TOOLKIT) AC_SUBST(TOOLKIT)
AC_SUBST(TOOLKIT_DEF) AC_SUBST(TOOLKIT_DEF)
AC_SUBST(TOOLKIT_DIR) AC_SUBST(TOOLKIT_DIR)
AC_SUBST(TOOLKIT_NAME)
AC_SUBST(TOOLKIT_INCLUDE) AC_SUBST(TOOLKIT_INCLUDE)
AC_SUBST(WXCONFIG_INCLUDE)
dnl what to compile dnl what to compile
AC_SUBST(GUIHEADERS) AC_SUBST(GUIHEADERS)
@@ -3694,6 +3858,7 @@ AC_SUBST(USER_SUBDIRS)
dnl additional libraries and linker settings dnl additional libraries and linker settings
AC_SUBST(LDFLAGS) AC_SUBST(LDFLAGS)
AC_SUBST(EXTRA_LIBS) AC_SUBST(EXTRA_LIBS)
AC_SUBST(OPENGL_LIBS)
AC_SUBST(EXTRADEFS) AC_SUBST(EXTRADEFS)
AC_SUBST(LIBS) AC_SUBST(LIBS)
AC_SUBST(LD_LIBS) AC_SUBST(LD_LIBS)
@@ -3756,11 +3921,11 @@ AC_OUTPUT([
], ],
[ [
chmod +x wx-config chmod +x wx-config
mv wx-config wx${TOOLKIT_DIR}-config mv wx-config wx${TOOLKIT_NAME}-config
${LN_S} wx${TOOLKIT_DIR}-config wx-config ${LN_S} wx${TOOLKIT_NAME}-config wx-config
dnl the debian installer wants setup.h to be in the lib subdir dnl the debian build process wants setup.h in the lib subdir so we
dnl so we *copy* it there dnl can pretend wxWin is already installed, so we *copy* it there
if test ! -d lib; then if test ! -d lib; then
mkdir lib mkdir lib
@@ -3774,11 +3939,11 @@ AC_OUTPUT([
if test ! -d lib/wx/include/wx; then if test ! -d lib/wx/include/wx; then
mkdir lib/wx/include/wx mkdir lib/wx/include/wx
fi fi
if test ! -d lib/wx/include/wx/${TOOLKIT_DIR}; then if test ! -d lib/wx/include/wx/${TOOLKIT_NAME}; then
mkdir lib/wx/include/wx/${TOOLKIT_DIR} mkdir lib/wx/include/wx/${TOOLKIT_NAME}
fi fi
if test -f setup.h; then if test -f setup.h; then
cp -f setup.h lib/wx/include/wx/${TOOLKIT_DIR}/setup.h cp -f setup.h lib/wx/include/wx/${TOOLKIT_NAME}/setup.h
fi fi
dnl *move* setup.h to its final place dnl *move* setup.h to its final place
@@ -3799,6 +3964,7 @@ AC_OUTPUT([
], ],
[ [
TOOLKIT_DIR="${TOOLKIT_DIR}" TOOLKIT_DIR="${TOOLKIT_DIR}"
TOOLKIT_NAME="${TOOLKIT_NAME}"
LN_S="${LN_S}" LN_S="${LN_S}"
] ]
) )

6
contrib/configure vendored
View File

@@ -819,6 +819,9 @@ trap 'rm -fr `echo "
src/stc/Makefile src/stc/Makefile
samples/Makefile samples/Makefile
samples/mmedia/Makefile samples/mmedia/Makefile
samples/ogl/Makefile
samples/ogl/ogledit/Makefile
samples/ogl/studio/Makefile
samples/stc/Makefile samples/stc/Makefile
" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 " | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
EOF EOF
@@ -905,6 +908,9 @@ CONFIG_FILES=\${CONFIG_FILES-"Makefile
src/stc/Makefile src/stc/Makefile
samples/Makefile samples/Makefile
samples/mmedia/Makefile samples/mmedia/Makefile
samples/ogl/Makefile
samples/ogl/ogledit/Makefile
samples/ogl/studio/Makefile
samples/stc/Makefile samples/stc/Makefile
"} "}
EOF EOF

View File

@@ -44,5 +44,8 @@ AC_OUTPUT([
src/stc/Makefile src/stc/Makefile
samples/Makefile samples/Makefile
samples/mmedia/Makefile samples/mmedia/Makefile
samples/ogl/Makefile
samples/ogl/ogledit/Makefile
samples/ogl/studio/Makefile
samples/stc/Makefile samples/stc/Makefile
]) ])

5
contrib/docs/.cvsignore Normal file
View File

@@ -0,0 +1,5 @@
html
htmlhelp
pdf
winhelp
htb

Binary file not shown.

Before

Width:  |  Height:  |  Size: 225 B

After

Width:  |  Height:  |  Size: 978 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 231 B

After

Width:  |  Height:  |  Size: 996 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 164 B

After

Width:  |  Height:  |  Size: 959 B

View File

@@ -1,5 +1,5 @@
[OPTIONS] [OPTIONS]
BMROOT=d:\wx2\wxwind~1\docs\latex\ogl ; Assume that bitmaps are where the source is BMROOT=d:\wx2\wxwind~1\contrib\docs\latex\ogl ; Assume that bitmaps are where the source is
TITLE=OGL Manual TITLE=OGL Manual
CONTENTS=Contents CONTENTS=Contents
COMPRESS=HIGH COMPRESS=HIGH

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 B

After

Width:  |  Height:  |  Size: 998 B

File diff suppressed because it is too large Load Diff

View File

@@ -1,12 +1,10 @@
# # $Id$
# Makefile : Builds wxWindows utils for Unix.
# CONTRIB_SAMPLES=mmedia ogl stc
all: all:
cd mmedia; make @for d in $(CONTRIB_SAMPLES); do (cd $$d && $(MAKE)); done
cd stc; make
clean: clean:
cd mmedia; make clean @for d in $(CONTRIB_SAMPLES); do (cd $$d && $(MAKE) clean); done
cd stc; make clean

View File

@@ -1,13 +1,5 @@
# # Makefile for mmedia sample.
# File: makefile.unx # $Id$
# Author: Julian Smart
# Created: 1998
# Updated:
# Copyright: (c) 1998 Julian Smart
#
# "%W% %G%"
#
# Makefile for minimal example (UNIX).
top_srcdir = @top_srcdir@/.. top_srcdir = @top_srcdir@/..
top_builddir = ../../.. top_builddir = ../../..
@@ -17,25 +9,8 @@ PROGRAM=mmboard
OBJECTS=mmboard.o mmbman.o OBJECTS=mmboard.o mmbman.o
EXTRA_LIBS= $(top_builddir)/contrib/src/mmedia/libmmedia.@WX_TARGET_LIBRARY_TYPE@ @ESD_LINK@ APPEXTRALIBS=$(top_builddir)/lib/libmmedia.@WX_TARGET_LIBRARY_TYPE@ @ESD_LINK@
APPEXTRADEFS=-I$(top_srcdir)/contrib/include APPEXTRADEFS=-I$(top_srcdir)/contrib/include
# the comment at the end of the next line is needed because otherwise autoconf include $(top_builddir)/src/makeprog.env
# would remove this line completely - it contains a built-in hack to remove
# any VPATH assignment not containing ':'
VPATH = @PATH_IFS@$(top_srcdir)/contrib/samples/mmedia # ':' for autoconf
include ../../../src/make.env
.SUFFIXES: .o .cpp .c
.cpp.o:
$(CC) -c $(CPPFLAGS) $(EXTRA_CPPFLAGS) -o $@ $<
all: $(PROGRAM)
clean:
rm -f *.o $(PROGRAM)
mmboard: $(OBJECTS)
$(CC) $(LDFLAGS) -o mmboard $(OBJECTS) $(EXTRA_LIBS) $(LDLIBS) $(top_builddir)/lib/@WX_TARGET_LIBRARY@

View File

@@ -0,0 +1,12 @@
#
# Makefile : Builds wxWindows utils for Unix.
#
OGL_SAMPLES=ogledit studio
all:
@for d in $(OGL_SAMPLES); do (cd $$d && $(MAKE)); done
clean:
@for d in $(OGL_SAMPLES); do (cd $$d && $(MAKE) clean); done

View File

@@ -1,39 +0,0 @@
#
# File: Makefile
# Author: Julian Smart
# Created: 1999
# Updated:
# Copyright: (c) 2000 Julian Smart
#
# Makefile for OGL demo (GTK version)
#
# This makefile requires wxWindows/GTK to be
# installed (possibly using "make install")
# on your system.
#
CPP = gcc -g
CC = gcc
WXCONFIG=../../../../wx-config
WXINCLUDE=-I../../../../include -I../../../include
WXLIB=-L../../../../lib -L../../../src/ogl
OBJECTS=ogledit.o palette.o doc.o view.o
ogledit: $(OBJECTS)
$(CPP) -o ogledit $(OBJECTS) `$(WXCONFIG) --libs` $(WXLIB) -logl
ogledit.o: ogledit.cpp
$(CPP) `$(WXCONFIG) --cflags` -I../../src $(WXINCLUDE) -c ogledit.cpp
palette.o: palette.cpp
$(CPP) `$(WXCONFIG) --cflags` -I../../src $(WXINCLUDE) -c palette.cpp
doc.o: doc.cpp
$(CPP) `$(WXCONFIG) --cflags` -I../../src $(WXINCLUDE) -c doc.cpp
view.o: view.cpp
$(CPP) `$(WXCONFIG) --cflags` -I../../src $(WXINCLUDE) -c view.cpp
clean:
rm -f *.o ogledit

View File

@@ -0,0 +1,16 @@
# Makefile for OGLEdit example.
# $Id$
top_srcdir = @top_srcdir@/..
top_builddir = ../../../..
program_dir = contrib/samples/ogl/ogledit
PROGRAM=ogledit
OBJECTS=$(PROGRAM).o doc.o view.o palette.o
APPEXTRALIBS=$(top_builddir)/lib/libogl.@WX_TARGET_LIBRARY_TYPE@
APPEXTRADEFS=-I$(top_srcdir)/contrib/include
include $(top_builddir)/src/makeprog.env

View File

@@ -1,20 +1,39 @@
# #
# File: makefile.unx # File: Makefile
# Author: Julian Smart # Author: Julian Smart
# Created: 1998 # Created: 1999
# Updated: # Updated:
# Copyright: (c) 1998 Julian Smart # Copyright: (c) 2000 Julian Smart
# #
# "%W% %G%" # Makefile for OGL demo (GTK version)
#
# This makefile requires wxWindows/GTK to be
# installed (possibly using "make install")
# on your system.
# #
# Makefile for OGLEdit example (UNIX).
PROGRAM=ogledit CPP = gcc -g
CC = gcc
WXCONFIG=../../../../wx-config
WXINCLUDE=-I../../../../include -I../../../include
WXLIB=-L../../../../lib -L../../../src/ogl
OBJECTS=$(PROGRAM).o doc.o view.o palette.o OBJECTS=ogledit.o palette.o doc.o view.o
# EXTRACPPFLAGS=-I$(WXDIR)/contrib/include ogledit: $(OBJECTS)
EXTRALDLIBS=-logl$(GUISUFFIX) $(CPP) -o ogledit $(OBJECTS) `$(WXCONFIG) --libs` $(WXLIB) -logl
include ../../../../src/makeprog.env ogledit.o: ogledit.cpp
$(CPP) `$(WXCONFIG) --cflags` -I../../src $(WXINCLUDE) -c ogledit.cpp
palette.o: palette.cpp
$(CPP) `$(WXCONFIG) --cflags` -I../../src $(WXINCLUDE) -c palette.cpp
doc.o: doc.cpp
$(CPP) `$(WXCONFIG) --cflags` -I../../src $(WXINCLUDE) -c doc.cpp
view.o: view.cpp
$(CPP) `$(WXCONFIG) --cflags` -I../../src $(WXINCLUDE) -c view.cpp
clean:
rm -f *.o ogledit

View File

@@ -1,57 +0,0 @@
#
# File: Makefile
# Author: Julian Smart
# Created: 1999
# Updated:
# Copyright: (c) 2000 Julian Smart
#
# Makefile for OGL demo (GTK version)
#
# This makefile requires wxWindows/GTK to be
# installed (possibly using "make install")
# on your system.
#
CPP = gcc -g
CC = gcc
WXCONFIG=../../../../wx-config
WXINCLUDE=-I../../../../include -I../../../include
WXLIB=-L../../../../lib -L../../../src/ogl
OBJECTS=studio.o cspalette.o csprint.o dialogs.o doc.o mainfrm.o project.o shapes.o symbols.o view.o
studio: $(OBJECTS)
$(CPP) -o studio $(OBJECTS) `$(WXCONFIG) --libs` $(WXLIB) -logl
studio.o: studio.cpp
$(CPP) `$(WXCONFIG) --cflags` -I../../src $(WXINCLUDE) -c studio.cpp
cspalette.o: cspalette.cpp
$(CPP) `$(WXCONFIG) --cflags` -I../../src $(WXINCLUDE) -c cspalette.cpp
doc.o: doc.cpp
$(CPP) `$(WXCONFIG) --cflags` -I../../src $(WXINCLUDE) -c doc.cpp
view.o: view.cpp
$(CPP) `$(WXCONFIG) --cflags` -I../../src $(WXINCLUDE) -c view.cpp
dialogs.o: dialogs.cpp
$(CPP) `$(WXCONFIG) --cflags` -I../../src $(WXINCLUDE) -c dialogs.cpp
mainfrm.o: mainfrm.cpp
$(CPP) `$(WXCONFIG) --cflags` -I../../src $(WXINCLUDE) -c mainfrm.cpp
project.o: project.cpp
$(CPP) `$(WXCONFIG) --cflags` -I../../src $(WXINCLUDE) -c project.cpp
shapes.o: shapes.cpp
$(CPP) `$(WXCONFIG) --cflags` -I../../src $(WXINCLUDE) -c shapes.cpp
symbols.o: symbols.cpp
$(CPP) `$(WXCONFIG) --cflags` -I../../src $(WXINCLUDE) -c symbols.cpp
csprint.o: csprint.cpp
$(CPP) `$(WXCONFIG) --cflags` -I../../src $(WXINCLUDE) -c csprint.cpp
clean:
rm -f *.o studio

View File

@@ -0,0 +1,19 @@
# Makefile for OGL Studio.
# $Id$
top_srcdir = @top_srcdir@/..
top_builddir = ../../../..
program_dir = contrib/samples/ogl/studio
PROGRAM=studio
DATAFILES=studio_resources.wxr
OBJECTS=$(PROGRAM).o doc.o shapes.o symbols.o view.o cspalette.o\
mainfrm.o project.o dialogs.o csprint.o
APPEXTRALIBS=$(top_builddir)/lib/libogl.@WX_TARGET_LIBRARY_TYPE@
APPEXTRADEFS=-I$(top_srcdir)/contrib/include -I$(top_srcdir)/$(program_dir)/bitmaps
include $(top_builddir)/src/makeprog.env

View File

@@ -1,39 +1,57 @@
# #
# File: makefile.unx # File: Makefile
# Author: Julian Smart # Author: Julian Smart
# Created: 1998 # Created: 1999
# Updated: # Updated:
# Copyright: (c) 1998 Julian Smart # Copyright: (c) 2000 Julian Smart
# #
# "%W% %G%" # Makefile for OGL demo (GTK version)
#
# This makefile requires wxWindows/GTK to be
# installed (possibly using "make install")
# on your system.
# #
# Makefile for OGL Studio (UNIX).
PROGRAM=studio CPP = gcc -g
CC = gcc
WXCONFIG=../../../../wx-config
WXINCLUDE=-I../../../../include -I../../../include
WXLIB=-L../../../../lib -L../../../src/ogl
OBJECTS=$(PROGRAM).o doc.o shapes.o symbols.o view.o cspalette.o\ OBJECTS=studio.o cspalette.o csprint.o dialogs.o doc.o mainfrm.o project.o shapes.o symbols.o view.o
mainfrm.o project.o dialogs.o csprint.o
EXTRACPPFLAGS=-I$(WXDIR)/utils/ogl/src -I./bitmaps studio: $(OBJECTS)
EXTRALDLIBS=-logl$(GUISUFFIX) $(CPP) -o studio $(OBJECTS) `$(WXCONFIG) --libs` $(WXLIB) -logl
#WXDIR=/home/jacs/wx2 studio.o: studio.cpp
$(CPP) `$(WXCONFIG) --cflags` -I../../src $(WXINCLUDE) -c studio.cpp
include $(WXDIR)/src/makeprog.env cspalette.o: cspalette.cpp
$(CPP) `$(WXCONFIG) --cflags` -I../../src $(WXINCLUDE) -c cspalette.cpp
cleanogl: doc.o: doc.cpp
cd $(WXDIR)/utils/ogl/src; make -f makefile.unx cleanmotif $(CPP) `$(WXCONFIG) --cflags` -I../../src $(WXINCLUDE) -c doc.cpp
ogl: view.o: view.cpp
cd $(WXDIR)/utils/ogl/src; make -f makefile.unx motif $(CPP) `$(WXCONFIG) --cflags` -I../../src $(WXINCLUDE) -c view.cpp
wx: dialogs.o: dialogs.cpp
cd $(WXDIR)/src/motif; make -f makefile.unx motif $(CPP) `$(WXCONFIG) --cflags` -I../../src $(WXINCLUDE) -c dialogs.cpp
cleanwx: mainfrm.o: mainfrm.cpp
cd $(WXDIR)/src/motif; make -f makefile.unx cleanmotif $(CPP) `$(WXCONFIG) --cflags` -I../../src $(WXINCLUDE) -c mainfrm.cpp
cleanall: cleanmotif cleanogl cleanwx project.o: project.cpp
$(CPP) `$(WXCONFIG) --cflags` -I../../src $(WXINCLUDE) -c project.cpp
makeall: wx ogl motif shapes.o: shapes.cpp
$(CPP) `$(WXCONFIG) --cflags` -I../../src $(WXINCLUDE) -c shapes.cpp
symbols.o: symbols.cpp
$(CPP) `$(WXCONFIG) --cflags` -I../../src $(WXINCLUDE) -c symbols.cpp
csprint.o: csprint.cpp
$(CPP) `$(WXCONFIG) --cflags` -I../../src $(WXINCLUDE) -c csprint.cpp
clean:
rm -f *.o studio

View File

@@ -13,9 +13,9 @@ PROGRAM=stctest
OBJECTS=$(PROGRAM).o OBJECTS=$(PROGRAM).o
APPEXTRALIBS=$(top_builddir)/contrib/src/stc/libstc.@WX_TARGET_LIBRARY_TYPE@ APPEXTRALIBS=$(top_builddir)/lib/libstc.@WX_TARGET_LIBRARY_TYPE@
APPEXTRADEFS=-I$(top_srcdir)/contrib/include APPEXTRADEFS=-I$(top_srcdir)/contrib/include
DATAFILES=stctest.cpp DATAFILES=stctest.cpp
include ../../../src/makeprog.env include $(top_builddir)/src/makeprog.env

View File

@@ -1,6 +1,4 @@
# # $Id$
# Makefile : Builds wxWindows contrib src for Unix.
#
CONTRIB_SUBDIRS=ogl mmedia stc CONTRIB_SUBDIRS=ogl mmedia stc

View File

@@ -1,7 +1,8 @@
# # $Id$
top_srcdir = @top_srcdir@ top_srcdir = @top_srcdir@/..
top_builddir = ../../.. top_builddir = ../../..
libsrc_dir = contrib/src/mmedia
TARGET_LIBNAME=libmmedia TARGET_LIBNAME=libmmedia
@@ -9,17 +10,20 @@ LIBVERSION_CURRENT=1
LIBVERSION_REVISION=0 LIBVERSION_REVISION=0
LIBVERSION_AGE=0 LIBVERSION_AGE=0
HEADER_PATH=$(top_srcdir)/contrib/include/wx
HEADER_SUBDIR=mmedia
HEADERS=cdbase.h cdunix.h cdwin.h sndaiff.h sndbase.h sndcodec.h \
sndcpcm.h sndesd.h sndfile.h sndg72x.h sndmsad.h sndoss.h \
sndpcm.h sndulaw.h sndwav.h sndwin.h vidbase.h vidwin.h \
vidxanm.h
OBJECTS=cdbase.o cdwin.o g711.o g721.o g723_24.o \ OBJECTS=cdbase.o cdwin.o g711.o g721.o g723_24.o \
g723_40.o g72x.o sndaiff.o sndbase.o sndcodec.o \ g723_40.o g72x.o sndaiff.o sndbase.o sndcodec.o \
sndcpcm.o sndfile.o sndg72x.o sndpcm.o sndulaw.o \ sndcpcm.o sndfile.o sndg72x.o sndpcm.o sndulaw.o \
sndwav.o sndwin.o vidbase.o vidwin.o vidxanm.o sndoss.o sndesd.o sndwav.o sndwin.o vidbase.o vidwin.o vidxanm.o sndoss.o sndesd.o
# the comment at the end of the next line is needed because otherwise autoconf APPEXTRADEFS=-I$(top_srcdir)/contrib/include
# would remove this line completely - it contains a built-in hack to remove
# any VPATH assignment not containing ':'
VPATH = :$(top_srcdir)/src/mmedia # ':' for autoconf
APPEXTRADEFS=-I$(top_srcdir)/include
include $(top_builddir)/src/makelib.env include $(top_builddir)/src/makelib.env

View File

@@ -1,7 +1,8 @@
# # $Id$
top_srcdir = @top_srcdir@ top_srcdir = @top_srcdir@/..
top_builddir = ../../.. top_builddir = ../../..
libsrc_dir = contrib/src/ogl
TARGET_LIBNAME=libogl TARGET_LIBNAME=libogl
@@ -9,14 +10,17 @@ LIBVERSION_CURRENT=1
LIBVERSION_REVISION=0 LIBVERSION_REVISION=0
LIBVERSION_AGE=0 LIBVERSION_AGE=0
OBJECTS=basic.o bmpshape.o composit.o divided.o lines.o misc.o \ HEADER_PATH=$(top_srcdir)/contrib/include/wx
basic2.o canvas.o constrnt.o drawn.o mfutils.o ogldiag.o HEADER_SUBDIR=ogl
# the comment at the end of the next line is needed because otherwise autoconf HEADERS=basic.h basicp.h bmpshape.h canvas.h composit.h constrnt.h \
# would remove this line completely - it contains a built-in hack to remove divided.h drawn.h drawnp.h lines.h linesp.h mfutils.h misc.h \
# any VPATH assignment not containing ':' ogl.h ogldiag.h
VPATH = :$(top_srcdir)/src/ogl # ':' for autoconf
APPEXTRADEFS=-I$(top_srcdir)/include OBJECTS=basic.o bmpshape.o composit.o divided.o lines.o misc.o \
basic2.o canvas.o constrnt.o drawn.o mfutils.o ogldiag.o
APPEXTRADEFS=-I$(top_srcdir)/contrib/include
include $(top_builddir)/src/makelib.env include $(top_builddir)/src/makelib.env

View File

@@ -132,7 +132,8 @@ DOCSOURCES=$(LOCALDOCDIR)\ogl.tex \
$(LOCALDOCDIR)\topics.tex $(LOCALDOCDIR)\sample.tex $(LOCALDOCDIR)\topics.tex $(LOCALDOCDIR)\sample.tex
html: $(DOCDIR)\html\ogl\ogl.htm html: $(DOCDIR)\html\ogl\ogl.htm
htmlhelp: $(DOCDIR)\html\ogl\ogl.chm htmlhelp: $(DOCDIR)\htmlhelp\ogl.chm
htb: $(DOCDIR)\htb\ogl.htb
hlp: $(DOCDIR)\winhelp\ogl.hlp hlp: $(DOCDIR)\winhelp\ogl.hlp
pdfrtf: $(DOCDIR)\pdf\ogl.rtf pdfrtf: $(DOCDIR)\pdf\ogl.rtf
ps: $(DOCDIR)\ps\ogl.ps ps: $(DOCDIR)\ps\ogl.ps
@@ -166,16 +167,27 @@ $(DOCDIR)\html\ogl\ogl.htm: $(DOCSOURCES)
copy *.gif $(DOCDIR)\html\ogl copy *.gif $(DOCDIR)\html\ogl
-start $(WAITFLAG) tex2rtf $(LOCALDOCDIR)\ogl.tex $(DOCDIR)\html\ogl\ogl.htm -twice -html -start $(WAITFLAG) tex2rtf $(LOCALDOCDIR)\ogl.tex $(DOCDIR)\html\ogl\ogl.htm -twice -html
-erase $(DOCDIR)\html\ogl\*.con -erase $(DOCDIR)\html\ogl\*.con
-erase *.con -erase *.con
-erase $(DOCDIR)\html\ogl\*.ref -erase $(DOCDIR)\html\ogl\*.ref
cd $(THISDIR) cd $(THISDIR)
$(DOCDIR)\htmlhelp\ogl.chm: $(DOCDIR)\html\ogl\ogl.htm $(DOCDIR)\html\ogl\ogl.hhp
$(DOCDIR)\html\ogl\ogl.chm: $(DOCDIR)\html\ogl\ogl.htm $(DOCDIR)\html\ogl\ogl.hhp
cd $(DOCDIR)\html\ogl cd $(DOCDIR)\html\ogl
-hhc ogl.hhp -hhc ogl.hhp
move ogl.chm $(DOCDIR)\htmlhelp\ogl.chm
cd $(THISDIR) cd $(THISDIR)
# An htb file is a zip file containing the .htm, .gif, .hhp, .hhc and .hhk
# files, renamed to htb.
# This can then be used with e.g. helpview.
# Optionally, a cached version of the .hhp file can be generated with hhp2cached.
$(DOCDIR)\htb\ogl.htb: $(DOCDIR)\html\ogl\ogl.htm
cd $(DOCDIR)\html\ogl
-erase /Y ogl.zip ogl.htb
zip32 ogl.zip *.htm *.gif *.hhp *.hhc *.hhk
-mkdir $(DOCDIR)\htb
move ogl.zip $(DOCDIR)\htb\ogl.htb
cd $(THISDIR)
$(LOCALDOCDIR)\ogl.dvi: $(DOCSOURCES) $(LOCALDOCDIR)\ogl.dvi: $(DOCSOURCES)
cd $(LOCALDOCDIR) cd $(LOCALDOCDIR)
@@ -193,4 +205,3 @@ $(WXDIR)\docs\ps\ogl.ps: $(LOCALDOCDIR)\ogl.dvi
move ogl.ps $(WXDIR)\docs\ps\ogl.ps move ogl.ps $(WXDIR)\docs\ps\ogl.ps
cd $(THISDIR) cd $(THISDIR)

View File

@@ -5,12 +5,11 @@
# Version: $Id$ # Version: $Id$
############################################################################### ###############################################################################
top_srcdir = @top_srcdir@ top_srcdir = @top_srcdir@/..
top_builddir = ../../.. top_builddir = ../../..
this_dir = $(top_srcdir)/src/stc scintilla_dir = $(top_srcdir)/contrib/src/stc/scintilla
scintilla_dir=$(this_dir)/scintilla libsrc_dir = contrib/src/stc@PATH_IFS@$(scintilla_dir)/src
VPATH=$(this_dir)@PATH_IFS@$(scintilla_dir)/src # ':' for autoconf
TARGET_LIBNAME=libstc TARGET_LIBNAME=libstc
@@ -18,23 +17,40 @@ LIBVERSION_CURRENT=1
LIBVERSION_REVISION=0 LIBVERSION_REVISION=0
LIBVERSION_AGE=0 LIBVERSION_AGE=0
OBJECTS=PlatWX.o ScintillaWX.o stc.o \ HEADER_PATH=$(top_srcdir)/contrib/include/wx
Accessor.o \ HEADER_SUBDIR=stc
AutoComplete.o \
CallTip.o \
CellBuffer.o \
ContractionState.o \
Document.o \
Editor.o \
Indicator.o \
KeyMap.o \
KeyWords.o \
LineMarker.o \
PropSet.o \
ScintillaBase.o \
Style.o \
ViewStyle.o
APPEXTRADEFS=-D__WX__ -DSCI_LEXER -I$(scintilla_dir)/src -I$(scintilla_dir)/include -I$(top_srcdir)/include HEADERS=stc.h
OBJECTS=PlatWX.o ScintillaWX.o stc.o \
DocumentAccessor.o \
LexCPP.o \
LexHTML.o \
LexLua.o \
LexOthers.o \
LexPerl.o \
LexPython.o \
LexSQL.o \
LexVB.o \
UniConversion.o \
WindowAccessor.o \
AutoComplete.o \
CallTip.o \
CellBuffer.o \
ContractionState.o \
Document.o \
Editor.o \
Indicator.o \
KeyMap.o \
KeyWords.o \
LineMarker.o \
PropSet.o \
ScintillaBase.o \
Style.o \
ViewStyle.o \
PosRegExp.o \
APPEXTRADEFS=-D__WX__ -DSCI_LEXER -I$(scintilla_dir)/src -I$(scintilla_dir)/include -I$(top_srcdir)/contrib/include
include $(top_builddir)/src/makelib.env include $(top_builddir)/src/makelib.env

View File

@@ -4,17 +4,23 @@
// Robin Dunn <robin@aldunn.com> // Robin Dunn <robin@aldunn.com>
// The License.txt file describes the conditions under which this software may be distributed. // The License.txt file describes the conditions under which this software may be distributed.
#include <ctype.h>
#include "Platform.h" #include "Platform.h"
#include "wx/stc/stc.h" #include "wx/stc/stc.h"
#ifdef __WXGTK__
#include <gtk/gtk.h>
#endif
Point Point::FromLong(long lpoint) { Point Point::FromLong(long lpoint) {
return Point(lpoint & 0xFFFF, lpoint >> 32); return Point(lpoint & 0xFFFF, lpoint >> 16);
} }
wxRect wxRectFromPRectangle(PRectangle prc) { wxRect wxRectFromPRectangle(PRectangle prc) {
wxRect rc(prc.left, prc.top, wxRect rc(prc.left, prc.top,
prc.right-prc.left+1, prc.bottom-prc.top+1); prc.right-prc.left, prc.bottom-prc.top);
return rc; return rc;
} }
@@ -105,14 +111,15 @@ Font::Font() {
Font::~Font() { Font::~Font() {
} }
void Font::Create(const char *faceName, int size, bool bold, bool italic) { void Font::Create(const char *faceName, int characterSet, int size, bool bold, bool italic) {
Release(); Release();
id = new wxFont(size, id = new wxFont(size,
wxDEFAULT, wxDEFAULT,
italic ? wxITALIC : wxNORMAL, italic ? wxITALIC : wxNORMAL,
bold ? wxBOLD : wxNORMAL, bold ? wxBOLD : wxNORMAL,
false, false,
faceName); faceName,
wxFONTENCODING_DEFAULT);
} }
@@ -181,13 +188,21 @@ void Surface::BrushColor(Colour back) {
} }
void Surface::SetFont(Font &font_) { void Surface::SetFont(Font &font_) {
hdc->SetFont(*font_.GetID()); if (font_.GetID()) {
hdc->SetFont(*font_.GetID());
}
} }
int Surface::LogPixelsY() { int Surface::LogPixelsY() {
return hdc->GetPPI().y; return hdc->GetPPI().y;
} }
int Surface::DeviceHeightFont(int points) {
return points * LogPixelsY() / 72;
}
void Surface::MoveTo(int x_, int y_) { void Surface::MoveTo(int x_, int y_) {
x = x_; x = x_;
y = y_; y = y_;
@@ -232,7 +247,7 @@ void Surface::FillRectangle(PRectangle rc, Surface &surfacePattern) {
void Surface::RoundedRectangle(PRectangle rc, Colour fore, Colour back) { void Surface::RoundedRectangle(PRectangle rc, Colour fore, Colour back) {
PenColour(fore); PenColour(fore);
BrushColor(back); BrushColor(back);
hdc->DrawRoundedRectangle(wxRectFromPRectangle(rc), 8); hdc->DrawRoundedRectangle(wxRectFromPRectangle(rc), 4);
} }
void Surface::Ellipse(PRectangle rc, Colour fore, Colour back) { void Surface::Ellipse(PRectangle rc, Colour fore, Colour back) {
@@ -242,7 +257,8 @@ void Surface::Ellipse(PRectangle rc, Colour fore, Colour back) {
} }
void Surface::Copy(PRectangle rc, Point from, Surface &surfaceSource) { void Surface::Copy(PRectangle rc, Point from, Surface &surfaceSource) {
hdc->Blit(rc.left, rc.top, rc.Width(), rc.Height(), wxRect r = wxRectFromPRectangle(rc);
hdc->Blit(r.x, r.y, r.width, r.height,
surfaceSource.hdc, from.x, from.y, wxCOPY); surfaceSource.hdc, from.x, from.y, wxCOPY);
} }
@@ -344,7 +360,8 @@ void Surface::SetClip(PRectangle rc) {
hdc->SetClippingRegion(wxRectFromPRectangle(rc)); hdc->SetClippingRegion(wxRectFromPRectangle(rc));
} }
void Surface::FlushCachedState() {
}
Window::~Window() { Window::~Window() {
} }
@@ -365,7 +382,8 @@ PRectangle Window::GetPosition() {
} }
void Window::SetPosition(PRectangle rc) { void Window::SetPosition(PRectangle rc) {
id->SetSize(rc.left, rc.top, rc.Width(), rc.Height()); wxRect r = wxRectFromPRectangle(rc);
id->SetSize(r);
} }
void Window::SetPositionRelative(PRectangle rc, Window) { void Window::SetPositionRelative(PRectangle rc, Window) {
@@ -374,7 +392,7 @@ void Window::SetPositionRelative(PRectangle rc, Window) {
PRectangle Window::GetClientPosition() { PRectangle Window::GetClientPosition() {
wxSize sz = id->GetClientSize(); wxSize sz = id->GetClientSize();
return PRectangle(0, 0, sz.x - 1, sz.y - 1); return PRectangle(0, 0, sz.x, sz.y);
} }
void Window::Show(bool show) { void Window::Show(bool show) {
@@ -386,7 +404,8 @@ void Window::InvalidateAll() {
} }
void Window::InvalidateRectangle(PRectangle rc) { void Window::InvalidateRectangle(PRectangle rc) {
id->Refresh(false, &wxRectFromPRectangle(rc)); wxRect r = wxRectFromPRectangle(rc);
id->Refresh(false, &r);
} }
void Window::SetFont(Font &font) { void Window::SetFont(Font &font) {
@@ -432,6 +451,76 @@ void Window::SetTitle(const char *s) {
} }
class wxSTCListBox : public wxListBox {
public:
wxSTCListBox(wxWindow* parent, wxWindowID id)
: wxListBox(parent, id, wxDefaultPosition, wxDefaultSize,
0, NULL, wxLB_SINGLE | wxLB_SORT | wxSIMPLE_BORDER)
{}
void OnFocus(wxFocusEvent& event) {
GetParent()->SetFocus();
event.Skip();
}
#ifdef __WXGTK__
void DoSetFirstItem(int n);
#endif
private:
DECLARE_EVENT_TABLE()
};
BEGIN_EVENT_TABLE(wxSTCListBox, wxListBox)
EVT_SET_FOCUS(wxSTCListBox::OnFocus)
END_EVENT_TABLE()
#ifdef __WXGTK__
// This can be removed after 2.2.2 I think
void wxSTCListBox::DoSetFirstItem( int n )
{
wxCHECK_RET( m_list, wxT("invalid listbox") );
if (gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (m_list))
return;
// terribly efficient
const gchar *vadjustment_key = "gtk-vadjustment";
guint vadjustment_key_id = g_quark_from_static_string (vadjustment_key);
GtkAdjustment *adjustment =
(GtkAdjustment*) gtk_object_get_data_by_id (GTK_OBJECT (m_list), vadjustment_key_id);
wxCHECK_RET( adjustment, wxT("invalid listbox code") );
GList *target = g_list_nth( m_list->children, n );
wxCHECK_RET( target, wxT("invalid listbox index") );
GtkWidget *item = GTK_WIDGET(target->data);
wxCHECK_RET( item, wxT("invalid listbox code") );
// find the last item before this one which is already realized
size_t nItemsBefore;
for ( nItemsBefore = 0; item && (item->allocation.y == -1); nItemsBefore++ )
{
target = target->prev;
if ( !target )
{
// nothing we can do if there are no allocated items yet
return;
}
item = GTK_WIDGET(target->data);
}
gtk_adjustment_set_value(adjustment,
item->allocation.y +
nItemsBefore*item->allocation.height);
}
#endif
ListBox::ListBox() { ListBox::ListBox() {
} }
@@ -440,8 +529,32 @@ ListBox::~ListBox() {
} }
void ListBox::Create(Window &parent, int ctrlID) { void ListBox::Create(Window &parent, int ctrlID) {
id = new wxListBox(parent.id, ctrlID, wxDefaultPosition, wxDefaultSize, id = new wxSTCListBox(parent.id, ctrlID);
0, NULL, wxLB_SINGLE | wxLB_SORT); // id = new wxListBox(parent.id, ctrlID, wxDefaultPosition, wxDefaultSize,
// 0, NULL, wxLB_SINGLE | wxLB_SORT | wxSIMPLE_BORDER);
}
PRectangle ListBox::GetDesiredRect() {
wxSize sz = ((wxListBox*)id)->GetBestSize();
PRectangle rc;
rc.top = 0;
rc.left = 0;
if (sz.x > 150) // TODO: A better way to determine these max sizes
sz.x = 150;
if (sz.y > 100)
sz.y = 100;
rc.right = sz.x;
rc.bottom = sz.y;
return rc;
}
void ListBox::SetAverageCharWidth(int width) {
aveCharWidth = width;
}
void ListBox::SetFont(Font &font) {
Window::SetFont(font);
} }
void ListBox::Clear() { void ListBox::Clear() {
@@ -458,6 +571,13 @@ int ListBox::Length() {
void ListBox::Select(int n) { void ListBox::Select(int n) {
((wxListBox*)id)->SetSelection(n); ((wxListBox*)id)->SetSelection(n);
#ifdef __WXGTK__
if (n > 4)
n = n - 4;
else
n = 1;
((wxListBox*)id)->SetFirstItem(n);
#endif
} }
int ListBox::GetSelection() { int ListBox::GetSelection() {
@@ -465,7 +585,14 @@ int ListBox::GetSelection() {
} }
int ListBox::Find(const char *prefix) { int ListBox::Find(const char *prefix) {
return ((wxListBox*)id)->FindString(prefix); if (prefix) {
for (int x=0; x < ((wxListBox*)id)->Number(); x++) {
wxString text = ((wxListBox*)id)->GetString(x);
if (text.StartsWith(prefix))
return x;
}
}
return -1;
} }
void ListBox::GetValue(int n, char *value, int len) { void ListBox::GetValue(int n, char *value, int len) {

View File

@@ -14,6 +14,8 @@
// Licence: wxWindows license // Licence: wxWindows license
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
#include <ctype.h>
#include "ScintillaWX.h" #include "ScintillaWX.h"
#include "wx/stc/stc.h" #include "wx/stc/stc.h"
@@ -60,6 +62,29 @@ void wxSTCDropTarget::OnLeave() {
} }
class wxSTCCallTip : public wxWindow {
public:
wxSTCCallTip(wxWindow* parent, int ID, CallTip* ct)
: wxWindow(parent, ID)
{
m_ct = ct;
}
void OnPaint(wxPaintEvent& evt) {
wxPaintDC dc(this);
Surface surfaceWindow;
surfaceWindow.Init(&dc);
m_ct->PaintCT(&surfaceWindow);
surfaceWindow.Release();
}
CallTip* m_ct;
DECLARE_EVENT_TABLE()
};
BEGIN_EVENT_TABLE(wxSTCCallTip, wxWindow)
EVT_PAINT(wxSTCCallTip::OnPaint)
END_EVENT_TABLE()
//---------------------------------------------------------------------- //----------------------------------------------------------------------
// Constructor/Destructor // Constructor/Destructor
@@ -193,9 +218,8 @@ void ScintillaWX::NotifyParent(SCNotification scn) {
void ScintillaWX::Copy() { void ScintillaWX::Copy() {
if (currentPos != anchor) { if (currentPos != anchor) {
char* text = CopySelectionRange(); char* text = CopySelectionRange();
textDO.SetText(text);
wxTheClipboard->Open(); wxTheClipboard->Open();
wxTheClipboard->SetData(&textDO); wxTheClipboard->SetData(new wxTextDataObject(text));
wxTheClipboard->Close(); wxTheClipboard->Close();
} }
} }
@@ -236,7 +260,7 @@ bool ScintillaWX::CanPaste() {
} }
void ScintillaWX::CreateCallTipWindow(PRectangle) { void ScintillaWX::CreateCallTipWindow(PRectangle) {
ct.wCallTip = new wxWindow(wDraw.GetID(), -1); ct.wCallTip = new wxSTCCallTip(wDraw.GetID(), -1, &ct);
ct.wDraw = ct.wCallTip; ct.wDraw = ct.wCallTip;
} }
@@ -249,8 +273,6 @@ void ScintillaWX::AddToPopUp(const char *label, int cmd, bool enabled) {
if (!enabled) if (!enabled)
popup.GetID()->Enable(cmd, enabled); popup.GetID()->Enable(cmd, enabled);
// TODO: need to create event handler mappings for the cmd ID
} }
@@ -259,18 +281,18 @@ void ScintillaWX::ClaimSelection() {
} }
LRESULT ScintillaWX::DefWndProc(UINT /*iMessage*/, WPARAM /*wParam*/, LPARAM /*lParam*/) { long ScintillaWX::DefWndProc(unsigned int /*iMessage*/, unsigned long /*wParam*/, long /*lParam*/) {
return 0; return 0;
} }
LRESULT ScintillaWX::WndProc(UINT iMessage, WPARAM wParam, LPARAM lParam) { long ScintillaWX::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
switch (iMessage) { // switch (iMessage) {
case EM_CANPASTE: // case EM_CANPASTE:
return CanPaste(); // return CanPaste();
default: // default:
return ScintillaBase::WndProc(iMessage, wParam, lParam); return ScintillaBase::WndProc(iMessage, wParam, lParam);
} // }
return 0; // return 0;
} }
@@ -293,6 +315,11 @@ void ScintillaWX::DoPaint(wxDC* dc, wxRect rect) {
FullPaint(); FullPaint();
} }
paintState = notPainting; paintState = notPainting;
#ifdef __WXGTK__
// On wxGTK the editor window paints can overwrite the listbox...
if (ac.Active())
((wxWindow*)ac.lb.GetID())->Refresh(TRUE);
#endif
} }
@@ -384,10 +411,36 @@ void ScintillaWX::DoButtonMove(Point pt) {
void ScintillaWX::DoAddChar(char ch) { void ScintillaWX::DoAddChar(char ch) {
//bool acActiveBeforeCharAdded = ac.Active();
AddChar(ch); AddChar(ch);
//if (acActiveBeforeCharAdded)
// AutoCompleteChanged(ch);
} }
int ScintillaWX::DoKeyDown(int key, bool shift, bool ctrl, bool alt) { int ScintillaWX::DoKeyDown(int key, bool shift, bool ctrl, bool alt) {
switch (key) {
case WXK_DOWN: key = SCK_DOWN; break;
case WXK_UP: key = SCK_UP; break;
case WXK_LEFT: key = SCK_LEFT; break;
case WXK_RIGHT: key = SCK_RIGHT; break;
case WXK_HOME: key = SCK_HOME; break;
case WXK_END: key = SCK_END; break;
case WXK_PRIOR: key = SCK_PRIOR; break;
case WXK_NEXT: key = SCK_NEXT; break;
case WXK_DELETE: key = SCK_DELETE; break;
case WXK_INSERT: key = SCK_INSERT; break;
case WXK_ESCAPE: key = SCK_ESCAPE; break;
case WXK_BACK: key = SCK_BACK; break;
case WXK_TAB: key = SCK_TAB; break;
case WXK_RETURN: key = SCK_RETURN; break;
case WXK_ADD: key = SCK_ADD; break;
case WXK_SUBTRACT: key = SCK_SUBTRACT; break;
case WXK_DIVIDE: key = SCK_DIVIDE; break;
case WXK_CONTROL: key = 0; break;
case WXK_ALT: key = 0; break;
case WXK_SHIFT: key = 0; break;
}
return KeyDown(key, shift, ctrl, alt); return KeyDown(key, shift, ctrl, alt);
} }
@@ -401,6 +454,9 @@ void ScintillaWX::DoContextMenu(Point pt) {
ContextMenu(pt); ContextMenu(pt);
} }
void ScintillaWX::DoOnListBox() {
AutoCompleteCompleted();
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
@@ -433,12 +489,13 @@ void ScintillaWX::DoDragLeave() {
// Redraw all of text area. This paint will not be abandoned. // Redraw all of text area. This paint will not be abandoned.
void ScintillaWX::FullPaint() { void ScintillaWX::FullPaint() {
paintState = painting; paintState = painting;
rcPaint = GetTextRectangle(); // rcPaint = GetTextRectangle();
wxClientDC dc(wMain.GetID()); // wxClientDC dc(wMain.GetID());
Surface surfaceWindow; // Surface surfaceWindow;
surfaceWindow.Init(&dc); // surfaceWindow.Init(&dc);
Paint(&surfaceWindow, rcPaint); // Paint(&surfaceWindow, rcPaint);
surfaceWindow.Release(); // surfaceWindow.Release();
wMain.GetID()->Refresh(FALSE);
paintState = notPainting; paintState = notPainting;
} }

View File

@@ -97,8 +97,12 @@ public:
virtual void AddToPopUp(const char *label, int cmd = 0, bool enabled = true); virtual void AddToPopUp(const char *label, int cmd = 0, bool enabled = true);
virtual void ClaimSelection(); virtual void ClaimSelection();
virtual LRESULT DefWndProc(UINT iMessage, WPARAM wParam, LPARAM lParam); virtual long DefWndProc(unsigned int iMessage,
virtual LRESULT WndProc(UINT iMessage, WPARAM wParam, LPARAM lParam); unsigned long wParam,
long lParam);
virtual long WndProc(unsigned int iMessage,
unsigned long wParam,
long lParam);
virtual void NotifyChange(); virtual void NotifyChange();
virtual void NotifyParent(SCNotification scn); virtual void NotifyParent(SCNotification scn);
@@ -126,6 +130,7 @@ public:
void DoCommand(int ID); void DoCommand(int ID);
void DoContextMenu(Point pt); void DoContextMenu(Point pt);
void DoOnListBox();
// helpers // helpers
@@ -139,7 +144,6 @@ private:
bool capturedMouse; bool capturedMouse;
wxStyledTextCtrl* stc; wxStyledTextCtrl* stc;
wxTextDataObject textDO;
wxSTCDropTarget* dropTarget; wxSTCDropTarget* dropTarget;
wxDragResult dragResult; wxDragResult dragResult;
}; };

View File

@@ -1,5 +1,5 @@
# Microsoft Developer Studio Project File - Name="StcVC" - Package Owner=<4> # Microsoft Developer Studio Project File - Name="StcVC" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00 # Microsoft Developer Studio Generated Build File, Format Version 5.00
# ** DO NOT EDIT ** # ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Static Library" 0x0104 # TARGTYPE "Win32 (x86) Static Library" 0x0104
@@ -22,11 +22,9 @@ CFG=StcVC - Win32 Debug
!MESSAGE !MESSAGE
# Begin Project # Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName "" # PROP Scc_ProjName ""
# PROP Scc_LocalPath "" # PROP Scc_LocalPath ""
CPP=cl.exe CPP=cl.exe
RSC=rc.exe
!IF "$(CFG)" == "StcVC - Win32 Release" !IF "$(CFG)" == "StcVC - Win32 Release"
@@ -40,11 +38,12 @@ RSC=rc.exe
# PROP Output_Dir "Release" # PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release" # PROP Intermediate_Dir "Release"
# PROP Target_Dir "" # PROP Target_Dir ""
RSC=rc.exe
# ADD BASE RSC /l 0x809
# ADD RSC /l 0x809
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /MD /W3 /GX /O1 /Ob2 /I "../../../include" /I "../../include" /I "scintilla/include" /I "scintilla/src" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D "__WXMSW__" /D "__WIN95__" /D "__WIN32__" /D WINVER=0x0400 /D "STRICT" /D "__WX__" /D "SCI_LEXER" /FD /c # ADD CPP /nologo /MD /W3 /GX /O1 /Ob2 /I "../../../include" /I "../../include" /I "scintilla/include" /I "scintilla/src" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D "__WXMSW__" /D "__WIN95__" /D "__WIN32__" /D WINVER=0x0400 /D "STRICT" /D "__WX__" /D "SCI_LEXER" /FD /c
# SUBTRACT CPP /YX # SUBTRACT CPP /YX
# ADD BASE RSC /l 0x809
# ADD RSC /l 0x809
BSC32=bscmake.exe BSC32=bscmake.exe
# ADD BASE BSC32 /nologo # ADD BASE BSC32 /nologo
# ADD BSC32 /nologo # ADD BSC32 /nologo
@@ -64,11 +63,12 @@ LIB32=link.exe -lib
# PROP Output_Dir "Debug" # PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug" # PROP Intermediate_Dir "Debug"
# PROP Target_Dir "" # PROP Target_Dir ""
RSC=rc.exe
# ADD BASE RSC /l 0x809
# ADD RSC /l 0x809
# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /MDd /W3 /GX /Z7 /Od /I "../../../include" /I "../../include" /I "scintilla/include" /I "scintilla/src" /D "_DEBUG" /D DEBUG=1 /D "__WXDEBUG__" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D "__WXMSW__" /D "__WIN95__" /D "__WIN32__" /D WINVER=0x0400 /D "STRICT" /D "__WX__" /D "SCI_LEXER" /FD /c # ADD CPP /nologo /MDd /W3 /GX /Z7 /Od /I "../../../include" /I "../../include" /I "scintilla/include" /I "scintilla/src" /D "_DEBUG" /D DEBUG=1 /D "__WXDEBUG__" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D "__WXMSW__" /D "__WIN95__" /D "__WIN32__" /D WINVER=0x0400 /D "STRICT" /D "__WX__" /D "SCI_LEXER" /FD /c
# SUBTRACT CPP /YX # SUBTRACT CPP /YX
# ADD BASE RSC /l 0x809
# ADD RSC /l 0x809
BSC32=bscmake.exe BSC32=bscmake.exe
# ADD BASE BSC32 /nologo # ADD BASE BSC32 /nologo
# ADD BSC32 /nologo # ADD BSC32 /nologo
@@ -179,6 +179,34 @@ SOURCE=.\scintilla\src\KeyWords.cxx
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\scintilla\src\LexCPP.cxx
# End Source File
# Begin Source File
SOURCE=.\scintilla\src\LexHTML.cxx
# End Source File
# Begin Source File
SOURCE=.\scintilla\src\LexOthers.cxx
# End Source File
# Begin Source File
SOURCE=.\scintilla\src\LexPerl.cxx
# End Source File
# Begin Source File
SOURCE=.\scintilla\src\LexPython.cxx
# End Source File
# Begin Source File
SOURCE=.\scintilla\src\LexSQL.cxx
# End Source File
# Begin Source File
SOURCE=.\scintilla\src\LexVB.cxx
# End Source File
# Begin Source File
SOURCE=.\scintilla\src\LineMarker.cxx SOURCE=.\scintilla\src\LineMarker.cxx
# End Source File # End Source File
# Begin Source File # Begin Source File

View File

@@ -0,0 +1,684 @@
#!/bin/env python
#----------------------------------------------------------------------------
# Name: gen_iface.py
# Purpose: Generate stc.h and stc.cpp from the info in Scintilla.iface
#
# Author: Robin Dunn
#
# Created: 5-Sept-2000
# RCS-ID: $Id$
# Copyright: (c) 2000 by Total Control Software
# Licence: wxWindows license
#----------------------------------------------------------------------------
import sys, string, re
from fileinput import FileInput
IFACE = './scintilla/include/Scintilla.iface'
H_TEMPLATE = './stc.h.in'
CPP_TEMPLATE = './stc.cpp.in'
H_DEST = '../../include/wx/stc/stc.h' # './stc_test.h' #
CPP_DEST = './stc.cpp' #'./stc_test.cpp'
# Value prefixes to convert
valPrefixes = [('SCI_', ''),
('SC_', ''),
('SCN_', None), # just toss these...
('SCEN_', None),
('SCE_', ''),
('SCLEX_', 'LEX_'),
('SCK_', 'KEY_'),
('SCFIND_', 'FIND_'),
('SCWS_', 'WS_'),
]
# Message funcion values that should have a CMD_ constant as well
cmdValues = [ (2300, 2350), 2011, 2013, (2176, 2180) ]
# Map some generic typenames to wx types, using return value syntax
retTypeMap = {
'position': 'int',
'string': 'wxString',
'colour': 'wxColour',
}
# Map some generic typenames to wx types, using parameter syntax
paramTypeMap = {
'position': 'int',
'string': 'const wxString&',
'colour': 'const wxColour&',
'keymod': 'int',
}
# Map of method info that needs tweaked. Either the name needs changed, or
# the method definition/implementation. Tuple items are:
#
# 1. New method name. None to skip the method, 0 to leave the
# default name.
# 2. Method definition for the .h file, 0 to leave alone
# 3. Method implementation for the .cpp file, 0 to leave alone.
# 4. tuple of Doc string lines, or 0 to leave alone.
#
methodOverrideMap = {
'AddText' : (0,
'void %s(const wxString& text);',
'''void %s(const wxString& text) {
SendMsg(%s, text.Len(), (long)text.c_str());''',
0),
'AddStyledText' : (0,
'void %s(const wxString& text);',
'''void %s(const wxString& text) {
SendMsg(%s, text.Len(), (long)text.c_str());''',
0),
'GetViewWS' : ( 'GetViewWhiteSpace', 0, 0, 0),
'SetViewWS' : ( 'SetViewWhiteSpace', 0, 0, 0),
'GetStyledText' : (0,
'wxString %s(int startPos, int endPos);',
'''wxString %s(int startPos, int endPos) {
wxString text;
int len = endPos - startPos;
TextRange tr;
tr.lpstrText = text.GetWriteBuf(len*2+1);
tr.chrg.cpMin = startPos;
tr.chrg.cpMax = endPos;
SendMsg(%s, 0, (long)&tr);
text.UngetWriteBuf(len*2);
return text;''',
('Retrieve a buffer of cells.',)),
'PositionFromPoint' : (0,
'int %s(wxPoint pt);',
'''int %s(wxPoint pt) {
return SendMsg(%s, pt.x, pt.y);''',
0),
'GetCurLine' : (0,
'wxString %s(int* OUTPUT=NULL);',
'''wxString %s(int* linePos) {
wxString text;
int len = LineLength(GetCurrentLine());
char* buf = text.GetWriteBuf(len+1);
int pos = SendMsg(%s, len, (long)buf);
text.UngetWriteBuf();
if (linePos) *linePos = pos;
return text;''',
0),
'SetUsePalette' : (None, 0,0,0),
'MarkerSetFore' : ('MarkerSetForeground', 0, 0, 0),
'MarkerSetBack' : ('MarkerSetBackground', 0, 0, 0),
'MarkerDefine' : (0,
'''void %s(int markerNumber, int markerSymbol,
const wxColour& foreground = wxNullColour,
const wxColour& background = wxNullColour);''',
'''void %s(int markerNumber, int markerSymbol,
const wxColour& foreground,
const wxColour& background) {
SendMsg(%s, markerNumber, markerSymbol);
if (foreground.Ok())
MarkerSetForeground(markerNumber, foreground);
if (background.Ok())
MarkerSetBackground(markerNumber, background);''',
('Set the symbol used for a particular marker number,',
'and optionally the for and background colours.')),
'SetMarginTypeN' : ('SetMarginType', 0, 0, 0),
'GetMarginTypeN' : ('GetMarginType', 0, 0, 0),
'SetMarginWidthN' : ('SetMarginWidth', 0, 0, 0),
'GetMarginWidthN' : ('GetMarginWidth', 0, 0, 0),
'SetMarginMaskN' : ('SetMarginMask', 0, 0, 0),
'GetMarginMaskN' : ('GetMarginMask', 0, 0, 0),
'SetMarginSensitiveN' : ('SetMarginSensitive', 0, 0, 0),
'GetMarginSensitiveN' : ('GetMarginSensitive', 0, 0, 0),
'StyleSetFore' : ('StyleSetForeground', 0, 0, 0),
'StyleSetBack' : ('StyleSetBackground', 0, 0, 0),
'SetSelFore' : ('SetSelForeground', 0, 0, 0),
'SetSelBack' : ('SetSelBackground', 0, 0, 0),
'SetCaretFore' : ('SetCaretForeground', 0, 0, 0),
'StyleSetFont' : ('StyleSetFaceName', 0, 0, 0),
# need to fix this to map between wx and scintilla encoding flags, leave it out for now...
'StyleSetCharacterSet' : (None, 0, 0, 0),
'AssignCmdKey' : ('CmdKeyAssign',
'void %s(int key, int modifiers, int cmd);',
'''void %s(int key, int modifiers, int cmd) {
SendMsg(%s, MAKELONG(key, modifiers), cmd);''',
0),
'ClearCmdKey' : ('CmdKeyClear',
'void %s(int key, int modifiers);',
'''void %s(int key, int modifiers) {
SendMsg(%s, MAKELONG(key, modifiers));''',
0),
'ClearAllCmdKeys' : ('CmdKeyClearAll', 0, 0, 0),
'SetStylingEx' : ('SetStyleBytes',
'void %s(int length, char* styleBytes);',
'''void %s(int length, char* styleBytes) {
SendMsg(%s, length, (long)styleBytes);''',
0),
'IndicSetStyle' : ('IndicatorSetStyle', 0, 0, 0),
'IndicGetStyle' : ('IndicatorGetStyle', 0, 0, 0),
'IndicSetFore' : ('IndicatorSetForeground', 0, 0, 0),
'IndicGetFore' : ('IndicatorGetForeground', 0, 0, 0),
'AutoCShow' : ('AutoCompShow', 0, 0, 0),
'AutoCCancel' : ('AutoCompCancel', 0, 0, 0),
'AutoCActive' : ('AutoCompActive', 0, 0, 0),
'AutoCPosStart' : ('AutoCompPosStart', 0, 0, 0),
'AutoCComplete' : ('AutoCompComplete', 0, 0, 0),
'AutoCStops' : ('AutoCompStops', 0, 0, 0),
'AutoCSetSeparator' : ('AutoCompSetSeparator', 0, 0, 0),
'AutoCGetSeparator' : ('AutoCompGetSeparator', 0, 0, 0),
'AutoCSelect' : ('AutoCompSelect', 0, 0, 0),
'AutoCSetCancelAtStart' : ('AutoCompSetCancelAtStart', 0, 0, 0),
'AutoCGetCancelAtStart' : ('AutoCompGetCancelAtStart', 0, 0, 0),
'AutoCSetFillUps' : ('AutoCompSetFillUps', 0, 0, 0),
'AutoCSetChooseSingle' : ('AutoCompSetChooseSingle', 0, 0, 0),
'AutoCGetChooseSingle' : ('AutoCompGetChooseSingle', 0, 0, 0),
'AutoCSetIgnoreCase' : ('AutoCompSetIgnoreCase', 0, 0, 0),
'AutoCGetIgnoreCase' : ('AutoCompGetIgnoreCase', 0, 0, 0),
'SetHScrollBar' : ('SetUseHorizontalScrollBar', 0, 0, 0),
'GetHScrollBar' : ('GetUseHorizontalScrollBar', 0, 0, 0),
'GetCaretFore' : ('GetCaretForeground', 0, 0, 0),
'GetUsePalette' : (None, 0, 0, 0),
'FindText' : (0,
'''int %s(int minPos, int maxPos,
const wxString& text,
bool caseSensitive, bool wholeWord);''',
'''int %s(int minPos, int maxPos,
const wxString& text,
bool caseSensitive, bool wholeWord) {
TextToFind ft;
int flags = 0;
flags |= caseSensitive ? SCFIND_MATCHCASE : 0;
flags |= wholeWord ? SCFIND_WHOLEWORD : 0;
ft.chrg.cpMin = minPos;
ft.chrg.cpMax = maxPos;
ft.lpstrText = (char*)text.c_str();
return SendMsg(%s, flags, (long)&ft);''',
0),
'FormatRange' : (0,
'''int %s(bool doDraw,
int startPos,
int endPos,
wxDC* draw,
wxDC* target, // Why does it use two? Can they be the same?
wxRect renderRect,
wxRect pageRect);''',
''' int %s(bool doDraw,
int startPos,
int endPos,
wxDC* draw,
wxDC* target, // Why does it use two? Can they be the same?
wxRect renderRect,
wxRect pageRect) {
RangeToFormat fr;
fr.hdc = draw;
fr.hdcTarget = target;
fr.rc.top = renderRect.GetTop();
fr.rc.left = renderRect.GetLeft();
fr.rc.right = renderRect.GetRight();
fr.rc.bottom = renderRect.GetBottom();
fr.rcPage.top = pageRect.GetTop();
fr.rcPage.left = pageRect.GetLeft();
fr.rcPage.right = pageRect.GetRight();
fr.rcPage.bottom = pageRect.GetBottom();
fr.chrg.cpMin = startPos;
fr.chrg.cpMax = endPos;
return SendMsg(%s, doDraw, (long)&fr);''',
0),
'GetLine' : (0,
'wxString %s(int line);',
'''wxString %s(int line) {
wxString text;
int len = LineLength(line);
char* buf = text.GetWriteBuf(len+1);
int pos = SendMsg(%s, line, (long)buf);
text.UngetWriteBuf();
return text;''',
('Retrieve the contents of a line.',)),
'SetSel' : ('SetSelection', 0, 0, 0),
'GetSelText' : ('GetSelectedText',
'wxString %s();',
'''wxString %s() {
wxString text;
int start;
int end;
GetSelection(&start, &end);
int len = end - start;
char* buff = text.GetWriteBuf(len+1);
SendMsg(%s, 0, (long)buff);
text.UngetWriteBuf();
return text;''',
('Retrieve the selected text.',)),
'GetTextRange' : (0,
'wxString %s(int startPos, int endPos);',
'''wxString %s(int startPos, int endPos) {
wxString text;
int len = endPos - startPos;
char* buff = text.GetWriteBuf(len+1);
TextRange tr;
tr.lpstrText = buff;
tr.chrg.cpMin = startPos;
tr.chrg.cpMax = endPos;
SendMsg(%s, 0, (long)&tr);
text.UngetWriteBuf();
return text;''',
('Retrieve a range of text.',)),
'PointXFromPosition' : (None, 0, 0, 0),
'PointYFromPosition' : (None, 0, 0, 0),
'ScrollCaret' : ('EnsureCaretVisible', 0, 0, 0),
'ReplaceSel' : ('ReplaceSelection', 0, 0, 0),
'Null' : (None, 0, 0, 0),
'GetText' : (0,
'wxString %s();',
'''wxString %s() {
wxString text;
int len = GetTextLength();
char* buff = text.GetWriteBuf(len+1);
SendMsg(%s, len, (long)buff);
buff[len] = 0;
text.UngetWriteBuf();
return text;''',
('Retrieve all the text in the document.', )),
'GetDirectFunction' : (None, 0, 0, 0),
'GetDirectPointer' : (None, 0, 0, 0),
'CallTipPosStart' : ('CallTipPosAtStart', 0, 0, 0),
'CallTipSetHlt' : ('CallTipSetHighlight', 0, 0, 0),
'CallTipSetBack' : ('CallTipSetBackground', 0, 0, 0),
# Remove all methods that are key commands since they can be
# executed with CmdKeyExecute
'LineDown' : (None, 0, 0, 0),
'LineDownExtend' : (None, 0, 0, 0),
'LineUp' : (None, 0, 0, 0),
'LineUpExtend' : (None, 0, 0, 0),
'CharLeft' : (None, 0, 0, 0),
'CharLeftExtend' : (None, 0, 0, 0),
'CharRight' : (None, 0, 0, 0),
'CharRightExtend' : (None, 0, 0, 0),
'WordLeft' : (None, 0, 0, 0),
'WordLeftExtend' : (None, 0, 0, 0),
'WordRight' : (None, 0, 0, 0),
'WordRightExtend' : (None, 0, 0, 0),
'Home' : (None, 0, 0, 0),
'HomeExtend' : (None, 0, 0, 0),
'LineEnd' : (None, 0, 0, 0),
'LineEndExtend' : (None, 0, 0, 0),
'DocumentStart' : (None, 0, 0, 0),
'DocumentStartExtend' : (None, 0, 0, 0),
'DocumentEnd' : (None, 0, 0, 0),
'DocumentEndExtend' : (None, 0, 0, 0),
'PageUp' : (None, 0, 0, 0),
'PageUpExtend' : (None, 0, 0, 0),
'PageDown' : (None, 0, 0, 0),
'PageDownExtend' : (None, 0, 0, 0),
'EditToggleOvertype' : (None, 0, 0, 0),
'Cancel' : (None, 0, 0, 0),
'DeleteBack' : (None, 0, 0, 0),
'Tab' : (None, 0, 0, 0),
'BackTab' : (None, 0, 0, 0),
'NewLine' : (None, 0, 0, 0),
'FormFeed' : (None, 0, 0, 0),
'VCHome' : (None, 0, 0, 0),
'VCHomeExtend' : (None, 0, 0, 0),
'ZoomIn' : (None, 0, 0, 0),
'ZoomOut' : (None, 0, 0, 0),
'DelWordLeft' : (None, 0, 0, 0),
'DelWordRight' : (None, 0, 0, 0),
'LineCut' : (None, 0, 0, 0),
'LineDelete' : (None, 0, 0, 0),
'LineTranspose' : (None, 0, 0, 0),
'LowerCase' : (None, 0, 0, 0),
'UpperCase' : (None, 0, 0, 0),
'LineScrollDown' : (None, 0, 0, 0),
'LineScrollUp' : (None, 0, 0, 0),
'GetDocPointer' : (0,
'void* %s();',
'''void* %s() {
return (void*)SendMsg(%s);''',
0),
'SetDocPointer' : (0,
'void %s(void* docPointer);',
'''void %s(void* docPointer) {
SendMsg(%s, (long)docPointer);''',
0),
'CreateDocument' : (0,
'void* %s();',
'''void* %s() {
return (void*)SendMsg(%s);''',
0),
'AddRefDocument' : (0,
'void %s(void* docPointer);',
'''void %s(void* docPointer) {
SendMsg(%s, (long)docPointer);''',
0),
'ReleaseDocument' : (0,
'void %s(void* docPointer);',
'''void %s(void* docPointer) {
SendMsg(%s, (long)docPointer);''',
0),
'GrabFocus' : (None, 0, 0, 0),
'' : ('', 0, 0, 0),
}
#----------------------------------------------------------------------------
def processIface(iface, h_tmplt, cpp_tmplt, h_dest, cpp_dest):
curDocStrings = []
values = []
methods = []
# parse iface file
fi = FileInput(iface)
for line in fi:
line = line[:-1]
if line[:2] == '##' or line == '':
#curDocStrings = []
continue
op = line[:4]
if line[:2] == '# ': # a doc string
curDocStrings.append(line[2:])
elif op == 'val ':
parseVal(line[4:], values, curDocStrings)
curDocStrings = []
elif op == 'fun ' or op == 'set ' or op == 'get ':
parseFun(line[4:], methods, curDocStrings, values)
curDocStrings = []
elif op == 'cat ':
if string.strip(line[4:]) == 'Deprecated':
break # skip the rest of the file
elif op == 'evt ':
pass
else:
print '***** Unknown line type: ', line
# process templates
data = {}
data['VALUES'] = processVals(values)
defs, imps = processMethods(methods)
data['METHOD_DEFS'] = defs
data['METHOD_IMPS'] = imps
# get template text
h_text = open(h_tmplt).read()
cpp_text = open(cpp_tmplt).read()
# do the substitutions
h_text = h_text % data
cpp_text = cpp_text % data
# write out destination files
open(h_dest, 'w').write(h_text)
open(cpp_dest, 'w').write(cpp_text)
#----------------------------------------------------------------------------
def processVals(values):
text = []
for name, value, docs in values:
if docs:
text.append('')
for x in docs:
text.append('// ' + x)
text.append('#define %s %s' % (name, value))
return string.join(text, '\n')
#----------------------------------------------------------------------------
def processMethods(methods):
defs = []
imps = []
for retType, name, number, param1, param2, docs in methods:
retType = retTypeMap.get(retType, retType)
params = makeParamString(param1, param2)
name, theDef, theImp, docs = checkMethodOverride(name, number, docs)
if name is None:
continue
# Build the method definition for the .h file
if docs:
defs.append('')
for x in docs:
defs.append(' // ' + x)
if not theDef:
theDef = ' %s %s(%s);' % (retType, name, params)
defs.append(theDef)
# Build the method implementation string
if docs:
imps.append('')
for x in docs:
imps.append('// ' + x)
if not theImp:
theImp = '%s wxStyledTextCtrl::%s(%s) {\n ' % (retType, name, params)
if retType == 'wxColour':
theImp = theImp + 'long c = '
elif retType != 'void':
theImp = theImp + 'return '
theImp = theImp + 'SendMsg(%s, %s, %s)' % (number,
makeArgString(param1),
makeArgString(param2))
if retType == 'bool':
theImp = theImp + ' != 0'
if retType == 'wxColour':
theImp = theImp + ';\n return wxColourFromLong(c)'
theImp = theImp + ';\n}'
imps.append(theImp)
return string.join(defs, '\n'), string.join(imps, '\n')
#----------------------------------------------------------------------------
def checkMethodOverride(name, number, docs):
theDef = theImp = None
if methodOverrideMap.has_key(name):
item = methodOverrideMap[name]
if item[0] != 0:
name = item[0]
if item[1] != 0:
theDef = ' ' + (item[1] % name)
if item[2] != 0:
theImp = item[2] % ('wxStyledTextCtrl::'+name, number) + '\n}'
if item[3] != 0:
docs = item[3]
return name, theDef, theImp, docs
#----------------------------------------------------------------------------
def makeArgString(param):
if not param:
return '0'
typ, name = param
if typ == 'string':
return '(long)%s.c_str()' % name
if typ == 'colour':
return 'wxColourAsLong(%s)' % name
return name
#----------------------------------------------------------------------------
def makeParamString(param1, param2):
def doOne(param):
if param:
aType = paramTypeMap.get(param[0], param[0])
return aType + ' ' + param[1]
else:
return ''
st = doOne(param1)
if st and param2:
st = st + ', '
st = st + doOne(param2)
return st
#----------------------------------------------------------------------------
def parseVal(line, values, docs):
name, val = string.split(line, '=')
# remove prefixes such as SCI, etc.
for old, new in valPrefixes:
lo = len(old)
if name[:lo] == old:
if new is None:
return
name = new + name[lo:]
# add it to the list
values.append( ('wxSTC_' + name, val, docs) )
#----------------------------------------------------------------------------
funregex = re.compile(r'\s*([a-zA-Z0-9_]+)' # <ws>return type
'\s+([a-zA-Z0-9_]+)=' # <ws>name=
'([0-9]+)' # number
'\(([ a-zA-Z0-9_]*),' # (param,
'([ a-zA-Z0-9_]*)\)') # param)
def parseFun(line, methods, docs, values):
def parseParam(param):
param = string.strip(param)
if param == '':
param = None
else:
param = tuple(string.split(param))
return param
mo = funregex.match(line)
if mo is None:
print "***** Line doesn't match! : " + line
retType, name, number, param1, param2 = mo.groups()
param1 = parseParam(param1)
param2 = parseParam(param2)
# Special case. For the key command functionss we want a value defined too
num = string.atoi(number)
for v in cmdValues:
if (type(v) == type(()) and v[0] <= num < v[1]) or v == num:
parseVal('CMD_%s=%s' % (string.upper(name), number), values, ())
#if retType == 'void' and not param1 and not param2:
methods.append( (retType, name, number, param1, param2, tuple(docs)) )
#----------------------------------------------------------------------------
def main(args):
# TODO: parse command line args to replace default input/output files???
# Now just do it
processIface(IFACE, H_TEMPLATE, CPP_TEMPLATE, H_DEST, CPP_DEST)
if __name__ == '__main__':
main(sys.argv)
#----------------------------------------------------------------------------

View File

@@ -21,25 +21,38 @@ STCEXTRACPPFLAGS=-D__WX__ -DSCI_LEXER -I$(SCINTILLA)/include -I$(S)
LIBTARGET=$(WXDIR)\contrib\lib\stc.lib LIBTARGET=$(WXDIR)\contrib\lib\stc.lib
OBJECTS = \ OBJECTS = \
Accessor.obj \ Accessor.obj \
AutoComplete.obj \ AutoComplete.obj \
CallTip.obj \ CallTip.obj \
CellBuffer.obj \ CellBuffer.obj \
ContractionState.obj\ ContractionState.obj \
Document.obj \ Document.obj \
DocumentAccessor.obj \
Editor.obj \ Editor.obj \
Indicator.obj \ Indicator.obj \
KeyMap.obj \ KeyMap.obj \
KeyWords.obj \ KeyWords.obj \
LineMarker.obj \ LexCPP.obj \
PropSet.obj \ LexHTML.obj \
LexLua.obj \
LexOthers.obj \
LexPerl.obj \
LexPython.obj \
LexSQL.obj \
LexVB.obj \
LineMarker.obj \
PropSet.obj \
PosRegExp.obj \
ScintillaBase.obj \ ScintillaBase.obj \
Style.obj \ Style.obj \
ViewStyle.obj \ UniConversion.obj \
ViewStyle.obj \
WindowAccessor.obj \
\ \
PlatWX.obj \ PlatWX.obj \
ScintillaWX.obj \ ScintillaWX.obj \
stc.obj \ stc.obj \
!include $(WXDIR)\src\makelib.b32 !include $(WXDIR)\src\makelib.b32

View File

@@ -25,6 +25,18 @@ OBJECTS = \
$(S)/ScintillaBase.$(OBJSUFF) \ $(S)/ScintillaBase.$(OBJSUFF) \
$(S)/Style.$(OBJSUFF) \ $(S)/Style.$(OBJSUFF) \
$(S)/ViewStyle.$(OBJSUFF) \ $(S)/ViewStyle.$(OBJSUFF) \
$(S)/LexCPP.$(OBJSUFF) \
$(S)/LexHTML.$(OBJSUFF) \
$(S)/LexLua.$(OBJSUFF) \
$(S)/LexOthers.$(OBJSUFF) \
$(S)/LexPerl.$(OBJSUFF) \
$(S)/LexPython.$(OBJSUFF) \
$(S)/LexSQL.$(OBJSUFF) \
$(S)/LexVB.$(OBJSUFF) \
$(S)/DocumentAccessor.$(OBJSUFF)\
$(S)/UniConversion.$(OBJSUFF) \
$(S)/WindowAccessor.$(OBJSUFF) \
$(S)/PosRegExp.$(OBJSUFF) \
PlatWX.$(OBJSUFF) \ PlatWX.$(OBJSUFF) \
ScintillaWX.$(OBJSUFF) \ ScintillaWX.$(OBJSUFF) \
stc.$(OBJSUFF) stc.$(OBJSUFF)

View File

@@ -15,21 +15,32 @@ NOPCH=1
!include $(WXDIR)\src\makevc.env !include $(WXDIR)\src\makevc.env
OBJECTS = \ OBJECTS = \
$(D)\Accessor.obj \
$(D)\AutoComplete.obj \ $(D)\AutoComplete.obj \
$(D)\CallTip.obj \ $(D)\CallTip.obj \
$(D)\CellBuffer.obj \ $(D)\CellBuffer.obj \
$(D)\ContractionState.obj\ $(D)\ContractionState.obj\
$(D)\Document.obj \ $(D)\Document.obj \
$(D)\DocumentAccessor.obj\
$(D)\Editor.obj \ $(D)\Editor.obj \
$(D)\Indicator.obj \ $(D)\Indicator.obj \
$(D)\KeyMap.obj \ $(D)\KeyMap.obj \
$(D)\KeyWords.obj \ $(D)\KeyWords.obj \
$(D)\LexCPP.obj \
$(D)\LexHTML.obj \
$(D)\LexLua.obj \
$(D)\LexOthers.obj \
$(D)\LexPerl.obj \
$(D)\LexPython.obj \
$(D)\LexSQL.obj \
$(D)\LexVB.obj \
$(D)\LineMarker.obj \ $(D)\LineMarker.obj \
$(D)\PosRegExp.obj \
$(D)\PropSet.obj \ $(D)\PropSet.obj \
$(D)\ScintillaBase.obj \ $(D)\ScintillaBase.obj \
$(D)\Style.obj \ $(D)\Style.obj \
$(D)\UniConversion.obj \
$(D)\ViewStyle.obj \ $(D)\ViewStyle.obj \
$(D)\WindowAccessor.obj \
\ \
$(D)\PlatWX.obj \ $(D)\PlatWX.obj \
$(D)\ScintillaWX.obj \ $(D)\ScintillaWX.obj \

View File

@@ -3,5 +3,5 @@ scintilla/include directories from the Scintilla/SCiTE source
distribution. All other code needed to implement Scintilla on top of distribution. All other code needed to implement Scintilla on top of
wxWindows is located in the directory above this one. wxWindows is located in the directory above this one.
The current version of the Scintilla code is somewhere between 1.22 The current version of the Scintilla code is 1.32
and 1.23, (from their CVS.)

View File

@@ -3,26 +3,30 @@
// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org> // Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed. // The License.txt file describes the conditions under which this software may be distributed.
enum { wsSpace = 1, wsTab = 2, wsSpaceTab = 4, wsInconsistent=8};
class Accessor;
typedef bool (*PFNIsCommentLeader)(Accessor &styler, int pos, int len);
// Interface to data in a Scintilla
class Accessor { class Accessor {
protected: protected:
// bufferSize is a trade off between time taken to copy the characters and SendMessage overhead enum {extremePosition=0x7FFFFFFF};
// bufferSize is a trade off between time taken to copy the characters and retrieval overhead
// slopSize positions the buffer before the desired position in case there is some backtracking // slopSize positions the buffer before the desired position in case there is some backtracking
enum {bufferSize=4000, slopSize=bufferSize/8}; enum {bufferSize=4000, slopSize=bufferSize/8};
char buf[bufferSize+1]; char buf[bufferSize+1];
WindowID id;
PropSet &props;
int startPos; int startPos;
int endPos; int endPos;
int lenDoc; int codePage;
int offset; // Optional but including an offset makes GCC generate better code
void Fill(int position); virtual bool InternalIsLeadByte(char ch)=0;
virtual void Fill(int position)=0;
public: public:
Accessor(WindowID id_, PropSet &props_, int offset_=0) : Accessor() : startPos(extremePosition), endPos(0), codePage(0) {}
id(id_), props(props_), startPos(0x7FFFFFFF), endPos(0), virtual ~Accessor() {}
lenDoc(-1), offset(offset_) {
}
char operator[](int position) { char operator[](int position) {
position += offset;
if (position < startPos || position >= endPos) { if (position < startPos || position >= endPos) {
Fill(position); Fill(position);
} }
@@ -30,7 +34,6 @@ public:
} }
char SafeGetCharAt(int position, char chDefault=' ') { char SafeGetCharAt(int position, char chDefault=' ') {
// Safe version of operator[], returning a defined value for invalid position // Safe version of operator[], returning a defined value for invalid position
position += offset;
if (position < startPos || position >= endPos) { if (position < startPos || position >= endPos) {
Fill(position); Fill(position);
if (position < startPos || position >= endPos) { if (position < startPos || position >= endPos) {
@@ -40,37 +43,28 @@ public:
} }
return buf[position - startPos]; return buf[position - startPos];
} }
char StyleAt(int position); bool IsLeadByte(char ch) {
int GetLine(int position); return codePage && InternalIsLeadByte(ch);
int LineStart(int line);
int LevelAt(int line);
int Length();
void Flush() {
startPos = 0x7FFFFFFF;
lenDoc = -1;
} }
int GetLineState(int line); void SetCodePage(int codePage_) { codePage = codePage_; }
int SetLineState(int line, int state);
PropSet &GetPropSet() { return props; } virtual char StyleAt(int position)=0;
}; virtual int GetLine(int position)=0;
virtual int LineStart(int line)=0;
class StylingContext : public Accessor { virtual int LevelAt(int line)=0;
char styleBuf[bufferSize]; virtual int Length()=0;
int validLen; virtual void Flush()=0;
char chFlags; virtual int GetLineState(int line)=0;
char chWhile; virtual int SetLineState(int line, int state)=0;
unsigned int startSeg; virtual int GetPropertyInt(const char *key, int defaultValue=0)=0;
public:
StylingContext(WindowID id_, PropSet &props_, int offset_=0) : // Style setting
Accessor(id_,props_,offset_), validLen(0), chFlags(0) {} virtual void StartAt(unsigned int start, char chMask=31)=0;
void StartAt(unsigned int start, char chMask=31); virtual void SetFlags(char chFlags_, char chWhile_)=0;
void SetFlags(char chFlags_, char chWhile_) {chFlags = chFlags_; chWhile = chWhile_; }; virtual unsigned int GetStartSegment()=0;
void ColourSegment(unsigned int start, unsigned int end, int chAttr); virtual void StartSegment(unsigned int pos)=0;
unsigned int GetStartSegment() { return startSeg; } virtual void ColourTo(unsigned int pos, int chAttr)=0;
void StartSegment(unsigned int pos); virtual void SetLevel(int line, int level)=0;
void ColourTo(unsigned int pos, int chAttr); virtual int IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader = 0)=0;
int GetLine(int position);
void SetLevel(int line, int level);
void Flush();
}; };

View File

@@ -3,6 +3,39 @@
// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org> // Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed. // The License.txt file describes the conditions under which this software may be distributed.
void ColouriseDoc(int codePage, int startPos, int lengthDoc, int initStyle, typedef void (*LexerFunction)(unsigned int startPos, int lengthDoc, int initStyle,
int language, WordList *keywordlists[], StylingContext &styler); WordList *keywordlists[], Accessor &styler);
class LexerModule {
static LexerModule *base;
LexerModule *next;
int language;
LexerFunction fn;
public:
LexerModule(int language_, LexerFunction fn_);
static void Colourise(unsigned int startPos, int lengthDoc, int initStyle,
int language, WordList *keywordlists[], Accessor &styler);
};
inline bool iswordchar(char ch) {
return isalnum(ch) || ch == '.' || ch == '_';
}
inline bool iswordstart(char ch) {
return isalnum(ch) || ch == '_';
}
inline bool isoperator(char ch) {
if (isalnum(ch))
return false;
// '.' left out as it is used to make up numbers
if (ch == '%' || ch == '^' || ch == '&' || ch == '*' ||
ch == '(' || ch == ')' || ch == '-' || ch == '+' ||
ch == '=' || ch == '|' || ch == '{' || ch == '}' ||
ch == '[' || ch == ']' || ch == ':' || ch == ';' ||
ch == '<' || ch == '>' || ch == ',' || ch == '/' ||
ch == '?' || ch == '!' || ch == '.' || ch == '~')
return true;
return false;
}

View File

@@ -45,6 +45,7 @@
#pragma warning(disable: 4800 4244 4309) #pragma warning(disable: 4800 4244 4309)
#endif #endif
#include <windows.h> #include <windows.h>
#include <commctrl.h>
#include <richedit.h> #include <richedit.h>
#endif #endif
@@ -79,12 +80,6 @@ typedef wxWindow* WindowID;
typedef wxMenu* MenuID; typedef wxMenu* MenuID;
#endif #endif
#if PLAT_GTK || PLAT_WX
#define SHIFT_PRESSED 1
#define LEFT_CTRL_PRESSED 2
#define LEFT_ALT_PRESSED 4
#endif
// Point is exactly the same as the Win32 POINT and GTK+ GdkPoint so can be used interchangeably // Point is exactly the same as the Win32 POINT and GTK+ GdkPoint so can be used interchangeably
class Point { class Point {
@@ -198,6 +193,7 @@ public:
}; };
class Font { class Font {
protected:
FontID id; FontID id;
#if PLAT_WX #if PLAT_WX
int ascent; int ascent;
@@ -207,18 +203,21 @@ class Font {
Font &operator=(const Font &) { id=0; return *this; } Font &operator=(const Font &) { id=0; return *this; }
public: public:
Font(); Font();
~Font(); virtual ~Font();
void Create(const char *faceName, int size, bool bold=false, bool italic=false); virtual void Create(const char *faceName, int characterSet, int size, bool bold, bool italic);
void Release(); virtual void Release();
FontID GetID() { return id; } FontID GetID() { return id; }
// Alias another font - caller guarantees not to Release
void SetID(FontID id_) { id = id_; }
friend class Surface; friend class Surface;
}; };
// A surface abstracts a place to draw // A surface abstracts a place to draw
class Surface { class Surface {
private: private:
bool unicodeMode;
#if PLAT_GTK #if PLAT_GTK
GdkDrawable *drawable; GdkDrawable *drawable;
GdkGC *gc; GdkGC *gc;
@@ -266,6 +265,7 @@ public:
bool Initialised(); bool Initialised();
void PenColour(Colour fore); void PenColour(Colour fore);
int LogPixelsY(); int LogPixelsY();
int DeviceHeightFont(int points);
void MoveTo(int x_, int y_); void MoveTo(int x_, int y_);
void LineTo(int x_, int y_); void LineTo(int x_, int y_);
void Polygon(Point *pts, int npts, Colour fore, Colour back); void Polygon(Point *pts, int npts, Colour fore, Colour back);
@@ -290,6 +290,11 @@ public:
int SetPalette(Palette *pal, bool inBackGround); int SetPalette(Palette *pal, bool inBackGround);
void SetClip(PRectangle rc); void SetClip(PRectangle rc);
void FlushCachedState();
void SetUnicodeMode(bool unicodeMode_) {
unicodeMode=unicodeMode_;
}
}; };
// Class to hide the details of window manipulation // Class to hide the details of window manipulation
@@ -300,6 +305,7 @@ protected:
WindowID id; WindowID id;
public: public:
Window() : id(0) {} Window() : id(0) {}
Window(const Window &source) : id(source.id) {}
virtual ~Window(); virtual ~Window();
Window &operator=(WindowID id_) { Window &operator=(WindowID id_) {
id = id_; id = id_;
@@ -316,7 +322,7 @@ public:
void Show(bool show=true); void Show(bool show=true);
void InvalidateAll(); void InvalidateAll();
void InvalidateRectangle(PRectangle rc); void InvalidateRectangle(PRectangle rc);
void SetFont(Font &font); virtual void SetFont(Font &font);
enum Cursor { cursorText, cursorArrow, cursorUp, cursorWait, cursorHoriz, cursorVert, cursorReverseArrow }; enum Cursor { cursorText, cursorArrow, cursorUp, cursorWait, cursorHoriz, cursorVert, cursorReverseArrow };
void SetCursor(Cursor curs); void SetCursor(Cursor curs);
void SetTitle(const char *s); void SetTitle(const char *s);
@@ -333,14 +339,17 @@ class ListBox : public Window {
WindowID scroller; WindowID scroller;
int current; int current;
#endif #endif
int desiredVisibleRows;
unsigned int maxItemCharacters;
unsigned int aveCharWidth;
public: public:
ListBox(); ListBox();
virtual ~ListBox(); virtual ~ListBox();
ListBox &operator=(WindowID id_) {
id = id_;
return *this;
}
void Create(Window &parent, int ctrlID); void Create(Window &parent, int ctrlID);
virtual void SetFont(Font &font);
void SetAverageCharWidth(int width);
void SetVisibleRows(int rows);
PRectangle GetDesiredRect();
void Clear(); void Clear();
void Append(char *s); void Append(char *s);
int Length(); int Length();
@@ -385,6 +394,16 @@ public:
// These are utility functions not really tied to a platform // These are utility functions not really tied to a platform
static int Minimum(int a, int b); static int Minimum(int a, int b);
static int Maximum(int a, int b); static int Maximum(int a, int b);
// Next three assume 16 bit shorts and 32 bit longs
static long LongFromTwoShorts(short a,short b) {
return (a) | ((b) << 16);
}
static short HighShortFromLong(long x) {
return static_cast<short>(x >> 16);
}
static short LowShortFromLong(long x) {
return static_cast<short>(x & 0xffff);
}
static void DebugPrintf(const char *format, ...); static void DebugPrintf(const char *format, ...);
static int Clamp(int val, int minVal, int maxVal); static int Clamp(int val, int minVal, int maxVal);
}; };

View File

@@ -0,0 +1,138 @@
#ifndef POSREGEXP_H
#define POSREGEXP_H
#define MatchesNum 0x10
enum EOps
{
ReBlockOps = 0x1000,
ReMul, // *
RePlus, // +
ReQuest, // ?
ReNGMul, // *?
ReNGPlus, // +?
ReNGQuest, // ??
ReRangeN, // {n,}
ReRangeNM, // {n,m}
ReNGRangeN, // {n,}?
ReNGRangeNM, // {n,m}?
ReOr, // |
ReBehind = 0x1100, // ?#n
ReNBehind = 0x1200, // ?~n
ReAhead = 0x1300, // ?=
ReNAhead = 0x1400, // ?!
ReSymbolOps = 0x2000,
ReEmpty,
ReSymb, // a b \W \s ...
ReEnum, // []
ReNEnum, // [^]
ReBrackets, // (...)
ReBkTrace = 0x2100, // \yN
ReBkBrack = 0x2200 // \N
};
enum ESymbols
{
ReAnyChr = 0x4000, // .
ReSoL, // ^
ReEoL, // $
ReDigit, // \d
ReNDigit, // \D
ReWordSymb, // \w
ReNWordSymb, // \W
ReWSpace, // \s
ReNWSpace, // \S
ReUCase, // \u
ReNUCase , // \l
ReWBound, // \b
ReNWBound, // \B
RePreNW, // \c
ReStart, // \m
ReEnd, // \M
ReChr = 0x0 // Char in Lower Byte
};
enum ETempSymb
{
ReTemp = 0x7000,
ReLBrack, ReRBrack,
ReEnumS, ReEnumE, ReNEnumS,
ReRangeS, ReRangeE, ReNGRangeE, ReFrToEnum
};
#define BackSlash '\\'
typedef union SCharData
{
int IArr[8];
char CArr[32];
void SetBit(unsigned char Bit);
void ClearBit(unsigned char Bit);
bool GetBit(unsigned char Bit);
} *PCharData;
typedef struct SRegInfo
{
SRegInfo();
~SRegInfo();
EOps Op;
union{
SRegInfo *Param;
int Symb;
PCharData ChrClass;
}un;
int s,e;
SRegInfo *Parent;
SRegInfo *Next;
} *PRegInfo;
typedef struct SMatches
{
int s[MatchesNum];
int e[MatchesNum];
int CurMatch;
} *PMatches;
typedef class PosRegExp
{
PRegInfo Info;
PMatches BkTrace;
bool NoCase,Extend,NoMoves;
bool Error;
int *Exprn;
int posParse;
int posEnd,posStart;
int posBkStr;
int FirstChar;
bool SetExprLow(const char *Expr);
bool SetStructs(PRegInfo &Info,int st,int end);
void Optimize();
bool CheckSymb(int Symb,bool Inc);
bool LowParse(PRegInfo Re);
bool LowParseRe(PRegInfo &Next);
bool LowCheckNext(PRegInfo Re);
bool ParseRe(int posStr);
bool QuickCheck();
public:
PMatches Matches;
int Ok, CurMatch;
void *param;
char (*CharAt)(int pos, void *param);
PosRegExp();
~PosRegExp();
bool isok();
bool SetNoMoves(bool Moves);
bool SetBkTrace(int posStr,PMatches Trace);
bool SetExpr(const char *Expr);
bool Parse(int posStr, int posStop, PMatches Mtch);
bool Parse(int posStr,int posSol, int posEol, PMatches Mtch, int Moves = -1);
bool Evaluate(char *Expr, int posStr, PMatches Mtch, char **Res);
} *PPosRegExp;
#endif /* POSREGEXP_H */

View File

@@ -8,44 +8,92 @@
bool EqualCaseInsensitive(const char *a, const char *b); bool EqualCaseInsensitive(const char *a, const char *b);
#if PLAT_WIN
#define strcasecmp stricmp
#define strncasecmp strnicmp
#endif
#ifdef __WXMSW__
#define strcasecmp stricmp
#define strncasecmp strnicmp
#endif
// Define another string class. // Define another string class.
// While it would be 'better' to use std::string, that doubles the executable size. // While it would be 'better' to use std::string, that doubles the executable size.
inline char *StringDup(const char *s) { inline char *StringDup(const char *s, int len=-1) {
if (!s) if (!s)
return 0; return 0;
char *sNew = new char[strlen(s) + 1]; if (len == -1)
if (sNew) len = strlen(s);
strcpy(sNew, s); char *sNew = new char[len + 1];
if (sNew) {
strncpy(sNew, s, len);
sNew[len] = '\0';
}
return sNew; return sNew;
} }
class SString { class SString {
char *s; char *s;
int ssize;
public: public:
typedef const char* const_iterator;
typedef int size_type;
static size_type npos;
const char* begin(void) const {
return s;
}
const char* end(void) const {
return &s[ssize];
}
size_type size(void) const {
if (s)
return ssize;
else
return 0;
}
SString &assign(const char* sother, int size_ = -1) {
char *t = s;
s = StringDup(sother,size_);
ssize = (s) ? strlen(s) : 0;
delete []t;
return *this;
}
SString &assign(const SString& sother, int size_ = -1) {
return assign(sother.s,size_);
}
SString &assign(const_iterator ibeg, const_iterator iend) {
return assign(ibeg,iend - ibeg);
}
SString() { SString() {
s = 0; s = 0;
ssize = 0;
} }
SString(const SString &source) { SString(const SString &source) {
s = StringDup(source.s); s = StringDup(source.s);
ssize = (s) ? strlen(s) : 0;
} }
SString(const char *s_) { SString(const char *s_) {
s = StringDup(s_); s = StringDup(s_);
ssize = (s) ? strlen(s) : 0;
} }
SString(int i) { SString(int i) {
char number[100]; char number[100];
sprintf(number, "%0d", i); sprintf(number, "%0d", i);
//itoa(i, number, 10);
s = StringDup(number); s = StringDup(number);
ssize = (s) ? strlen(s) : 0;
} }
~SString() { ~SString() {
delete []s; delete []s;
s = 0; s = 0;
ssize = 0;
} }
SString &operator=(const SString &source) { SString &operator=(const SString &source) {
if (this != &source) { if (this != &source) {
delete []s; delete []s;
s = StringDup(source.s); s = StringDup(source.s);
ssize = (s) ? strlen(s) : 0;
} }
return *this; return *this;
} }
@@ -56,6 +104,9 @@ public:
return false; return false;
return strcmp(s, other.s) == 0; return strcmp(s, other.s) == 0;
} }
bool operator!=(const SString &other) const {
return !operator==(other);
}
bool operator==(const char *sother) const { bool operator==(const char *sother) const {
if ((s == 0) && (sother == 0)) if ((s == 0) && (sother == 0))
return true; return true;
@@ -63,6 +114,9 @@ public:
return false; return false;
return strcmp(s, sother) == 0; return strcmp(s, sother) == 0;
} }
bool operator!=(const char *sother) const {
return !operator==(sother);
}
const char *c_str() const { const char *c_str() const {
if (s) if (s)
return s; return s;
@@ -75,106 +129,116 @@ public:
else else
return 0; return 0;
} }
char operator[](int i) { char operator[](int i) const {
if (s) if (s)
return s[i]; return s[i];
else else
return '\0'; return '\0';
} }
SString &operator +=(const char *sother) { SString &operator +=(const char *sother) {
return append(sother,-1);
}
SString &operator +=(const SString &sother) {
return append(sother.s,sother.ssize);
}
SString &operator +=(char ch) {
return append(&ch,1);
}
SString &append(const char* sother, int lenOther) {
int len = length(); int len = length();
int lenOther = strlen(sother); if(lenOther < 0)
lenOther = strlen(sother);
char *sNew = new char[len + lenOther + 1]; char *sNew = new char[len + lenOther + 1];
if (sNew) { if (sNew) {
if (s) if (s)
memcpy(sNew, s, len); memcpy(sNew, s, len);
memcpy(sNew + len, sother, lenOther); strncpy(&sNew[len], sother, lenOther);
sNew[len + lenOther] = '\0'; sNew[len + lenOther] = '\0';
delete []s; delete []s;
s = sNew; s = sNew;
ssize = (s) ? strlen(s) : 0;
} }
return *this; return *this;
} }
int value() { int value() const {
if (s) if (s)
return atoi(s); return atoi(s);
else else
return 0; return 0;
} }
void substitute(char find, char replace) {
char *t = s;
while (t) {
t = strchr(t, find);
if (t)
*t = replace;
}
}
// I don't think this really belongs here -- Neil
void correctPath() {
#ifdef unix
substitute('\\', '/');
#else
substitute('/', '\\');
#endif
}
};
struct Property {
unsigned int hash;
char *key;
char *val;
Property *next;
Property() : hash(0), key(0), val(0), next(0) {}
}; };
class PropSet { class PropSet {
private: private:
char **vals; enum { hashRoots=31 };
int size; Property *props[hashRoots];
int used;
public: public:
PropSet *superPS; PropSet *superPS;
PropSet(); PropSet();
~PropSet(); ~PropSet();
void EnsureCanAddEntry();
void Set(const char *key, const char *val); void Set(const char *key, const char *val);
void Set(char *keyval); void Set(char *keyval);
SString Get(const char *key); SString Get(const char *key);
SString GetExpanded(const char *key);
SString Expand(const char *withvars);
int GetInt(const char *key, int defaultValue=0); int GetInt(const char *key, int defaultValue=0);
SString GetWild(const char *keybase, const char *filename); SString GetWild(const char *keybase, const char *filename);
SString GetNewExpand(const char *keybase, const char *filename); SString GetNewExpand(const char *keybase, const char *filename);
void Clear(); void Clear();
void ReadFromMemory(const char *data, int len); void ReadFromMemory(const char *data, int len, const char *directoryForImports=0);
void Read(const char *filename); void Read(const char *filename, const char *directoryForImports);
};
// This is a fixed length list of strings suitable for display in combo boxes
// as a memory of user entries
template<int sz>
class EntryMemory {
SString entries[sz];
public:
void Insert(SString s) {
for (int i=0;i<sz;i++) {
if (entries[i] == s) {
for (int j=i;j>0;j--) {
entries[j] = entries[j-1];
}
entries[0] = s;
return;
}
}
for (int k=sz-1;k>0;k--) {
entries[k] = entries[k-1];
}
entries[0] = s;
}
int Length() const {
int len = 0;
for (int i=0;i<sz;i++)
if (entries[i].length())
len++;
return len;
}
SString At(int n) const {
return entries[n];
}
}; };
class WordList { class WordList {
public: public:
// Each word contains at least one character - a empty word acts as sentinal at the end. // Each word contains at least one character - a empty word acts as sentinal at the end.
char **words; char **words;
char **wordsNoCase;
char *list; char *list;
int len; int len;
bool onlyLineEnds; // Delimited by any white space or only line ends bool onlyLineEnds; // Delimited by any white space or only line ends
bool sorted;
int starts[256]; int starts[256];
WordList(bool onlyLineEnds_ = false) : WordList(bool onlyLineEnds_ = false) :
words(0), list(0), len(0), onlyLineEnds(onlyLineEnds_) {} words(0), wordsNoCase(0), list(0), len(0), onlyLineEnds(onlyLineEnds_), sorted(false) {}
~WordList() { Clear(); } ~WordList() { Clear(); }
operator bool() { return list; } operator bool() { return words ? true : false; }
const char *operator[](int ind) { return words[ind]; } const char *operator[](int ind) { return words[ind]; }
void Clear(); void Clear();
void Set(const char *s); void Set(const char *s);
char *Allocate(int size); char *Allocate(int size);
void SetFromAllocated(); void SetFromAllocated();
bool InList(const char *s); bool InList(const char *s);
const char *GetNearestWord(const char *wordStart, int searchLen = -1, bool ignoreCase = false);
char *GetNearestWords(const char *wordStart, int searchLen = -1, bool ignoreCase = false);
}; };
inline bool nonFuncChar(char ch) {
return strchr("\t\n\r !\"#$%&'()*+,-./:;<=>?@[\\]^`{|}~", ch) != NULL;
}
#endif #endif

View File

@@ -3,11 +3,15 @@
// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org> // Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed. // The License.txt file describes the conditions under which this software may be distributed.
// Most of this file is automatically generated from the Scintilla.iface interface definition
// file which contains any comments about the definitions. HFacer.py does the generation.
#ifndef SCILEXER_H #ifndef SCILEXER_H
#define SCILEXER_H #define SCILEXER_H
// SciLexer features - not in standard Scintilla // SciLexer features - not in standard Scintilla
//++Autogenerated -- start of section automatically generated from Scintilla.iface
#define SCLEX_CONTAINER 0 #define SCLEX_CONTAINER 0
#define SCLEX_NULL 1 #define SCLEX_NULL 1
#define SCLEX_PYTHON 2 #define SCLEX_PYTHON 2
@@ -21,8 +25,10 @@
#define SCLEX_ERRORLIST 10 #define SCLEX_ERRORLIST 10
#define SCLEX_MAKEFILE 11 #define SCLEX_MAKEFILE 11
#define SCLEX_BATCH 12 #define SCLEX_BATCH 12
#define SCLEX_XCODE 13
// Lexical states for SCLEX_PYTHON #define SCLEX_LATEX 14
#define SCLEX_LUA 15
#define SCLEX_DIFF 16
#define SCE_P_DEFAULT 0 #define SCE_P_DEFAULT 0
#define SCE_P_COMMENTLINE 1 #define SCE_P_COMMENTLINE 1
#define SCE_P_NUMBER 2 #define SCE_P_NUMBER 2
@@ -35,8 +41,8 @@
#define SCE_P_DEFNAME 9 #define SCE_P_DEFNAME 9
#define SCE_P_OPERATOR 10 #define SCE_P_OPERATOR 10
#define SCE_P_IDENTIFIER 11 #define SCE_P_IDENTIFIER 11
#define SCE_P_COMMENTBLOCK 12
// Lexical states for SCLEX_CPP, SCLEX_VB #define SCE_P_STRINGEOL 13
#define SCE_C_DEFAULT 0 #define SCE_C_DEFAULT 0
#define SCE_C_COMMENT 1 #define SCE_C_COMMENT 1
#define SCE_C_COMMENTLINE 2 #define SCE_C_COMMENTLINE 2
@@ -45,13 +51,12 @@
#define SCE_C_WORD 5 #define SCE_C_WORD 5
#define SCE_C_STRING 6 #define SCE_C_STRING 6
#define SCE_C_CHARACTER 7 #define SCE_C_CHARACTER 7
#define SCE_C_PUNTUATION 8 #define SCE_C_UUID 8
#define SCE_C_PREPROCESSOR 9 #define SCE_C_PREPROCESSOR 9
#define SCE_C_OPERATOR 10 #define SCE_C_OPERATOR 10
#define SCE_C_IDENTIFIER 11 #define SCE_C_IDENTIFIER 11
#define SCE_C_STRINGEOL 12 #define SCE_C_STRINGEOL 12
#define SCE_C_VERBATIM 13
// Lexical states for SCLEX_HTML, SCLEX_xML
#define SCE_H_DEFAULT 0 #define SCE_H_DEFAULT 0
#define SCE_H_TAG 1 #define SCE_H_TAG 1
#define SCE_H_TAGUNKNOWN 2 #define SCE_H_TAGUNKNOWN 2
@@ -63,51 +68,90 @@
#define SCE_H_OTHER 8 #define SCE_H_OTHER 8
#define SCE_H_COMMENT 9 #define SCE_H_COMMENT 9
#define SCE_H_ENTITY 10 #define SCE_H_ENTITY 10
// Embedded Javascript #define SCE_H_TAGEND 11
#define SCE_HJ_START 11 #define SCE_H_XMLSTART 12
#define SCE_HJ_DEFAULT 12 #define SCE_H_XMLEND 13
#define SCE_HJ_COMMENT 13 #define SCE_H_SCRIPT 14
#define SCE_HJ_COMMENTLINE 14 #define SCE_H_ASP 15
#define SCE_HJ_COMMENTDOC 15 #define SCE_H_ASPAT 16
#define SCE_HJ_NUMBER 16 #define SCE_H_CDATA 17
#define SCE_HJ_WORD 17 #define SCE_H_QUESTION 18
#define SCE_HJ_KEYWORD 18 #define SCE_H_VALUE 19
#define SCE_HJ_DOUBLESTRING 19 #define SCE_HJ_START 40
#define SCE_HJ_SINGLESTRING 20 #define SCE_HJ_DEFAULT 41
#define SCE_HJ_SYMBOLS 21 #define SCE_HJ_COMMENT 42
#define SCE_HJ_STRINGEOL 28 #define SCE_HJ_COMMENTLINE 43
// XML and ASP #define SCE_HJ_COMMENTDOC 44
#define SCE_H_TAGEND 22 #define SCE_HJ_NUMBER 45
#define SCE_H_XMLSTART 23 #define SCE_HJ_WORD 46
#define SCE_H_XMLEND 24 #define SCE_HJ_KEYWORD 47
#define SCE_H_SCRIPT 25 #define SCE_HJ_DOUBLESTRING 48
#define SCE_H_ASP 26 #define SCE_HJ_SINGLESTRING 49
#define SCE_H_ASPAT 27 #define SCE_HJ_SYMBOLS 50
// Embedded VBScript #define SCE_HJ_STRINGEOL 51
#define SCE_HB_START 40 #define SCE_HJA_START 55
#define SCE_HB_DEFAULT 41 #define SCE_HJA_DEFAULT 56
#define SCE_HB_COMMENTLINE 42 #define SCE_HJA_COMMENT 57
#define SCE_HB_NUMBER 43 #define SCE_HJA_COMMENTLINE 58
#define SCE_HB_WORD 44 #define SCE_HJA_COMMENTDOC 59
#define SCE_HB_STRING 45 #define SCE_HJA_NUMBER 60
#define SCE_HB_IDENTIFIER 46 #define SCE_HJA_WORD 61
#define SCE_HB_STRINGEOL 47 #define SCE_HJA_KEYWORD 62
// Embedded Python #define SCE_HJA_DOUBLESTRING 63
#define SCE_HP_START 50 #define SCE_HJA_SINGLESTRING 64
#define SCE_HP_DEFAULT 51 #define SCE_HJA_SYMBOLS 65
#define SCE_HP_COMMENTLINE 52 #define SCE_HJA_STRINGEOL 66
#define SCE_HP_NUMBER 53 #define SCE_HB_START 70
#define SCE_HP_STRING 54 #define SCE_HB_DEFAULT 71
#define SCE_HP_CHARACTER 55 #define SCE_HB_COMMENTLINE 72
#define SCE_HP_WORD 56 #define SCE_HB_NUMBER 73
#define SCE_HP_TRIPLE 57 #define SCE_HB_WORD 74
#define SCE_HP_TRIPLEDOUBLE 58 #define SCE_HB_STRING 75
#define SCE_HP_CLASSNAME 59 #define SCE_HB_IDENTIFIER 76
#define SCE_HP_DEFNAME 60 #define SCE_HB_STRINGEOL 77
#define SCE_HP_OPERATOR 61 #define SCE_HBA_START 80
#define SCE_HP_IDENTIFIER 62 #define SCE_HBA_DEFAULT 81
#define SCE_HBA_COMMENTLINE 82
// Lexical states for SCLEX_PERL #define SCE_HBA_NUMBER 83
#define SCE_HBA_WORD 84
#define SCE_HBA_STRING 85
#define SCE_HBA_IDENTIFIER 86
#define SCE_HBA_STRINGEOL 87
#define SCE_HP_START 90
#define SCE_HP_DEFAULT 91
#define SCE_HP_COMMENTLINE 92
#define SCE_HP_NUMBER 93
#define SCE_HP_STRING 94
#define SCE_HP_CHARACTER 95
#define SCE_HP_WORD 96
#define SCE_HP_TRIPLE 97
#define SCE_HP_TRIPLEDOUBLE 98
#define SCE_HP_CLASSNAME 99
#define SCE_HP_DEFNAME 100
#define SCE_HP_OPERATOR 101
#define SCE_HP_IDENTIFIER 102
#define SCE_HPA_START 105
#define SCE_HPA_DEFAULT 106
#define SCE_HPA_COMMENTLINE 107
#define SCE_HPA_NUMBER 108
#define SCE_HPA_STRING 109
#define SCE_HPA_CHARACTER 110
#define SCE_HPA_WORD 111
#define SCE_HPA_TRIPLE 112
#define SCE_HPA_TRIPLEDOUBLE 113
#define SCE_HPA_CLASSNAME 114
#define SCE_HPA_DEFNAME 115
#define SCE_HPA_OPERATOR 116
#define SCE_HPA_IDENTIFIER 117
#define SCE_HPHP_DEFAULT 118
#define SCE_HPHP_HSTRING 119
#define SCE_HPHP_SIMPLESTRING 120
#define SCE_HPHP_WORD 121
#define SCE_HPHP_NUMBER 122
#define SCE_HPHP_VARIABLE 123
#define SCE_HPHP_COMMENT 124
#define SCE_HPHP_COMMENTLINE 125
#define SCE_HPHP_STRINGEOL 126
#define SCE_PL_DEFAULT 0 #define SCE_PL_DEFAULT 0
#define SCE_PL_HERE 1 #define SCE_PL_HERE 1
#define SCE_PL_COMMENTLINE 2 #define SCE_PL_COMMENTLINE 2
@@ -130,5 +174,31 @@
#define SCE_PL_LONGQUOTE 19 #define SCE_PL_LONGQUOTE 19
#define SCE_PL_BACKTICKS 20 #define SCE_PL_BACKTICKS 20
#define SCE_PL_DATASECTION 21 #define SCE_PL_DATASECTION 21
#define SCE_L_DEFAULT 0
#define SCE_L_COMMAND 1
#define SCE_L_TAG 2
#define SCE_L_MATH 3
#define SCE_L_COMMENT 4
#define SCE_LUA_DEFAULT 0
#define SCE_LUA_COMMENT 1
#define SCE_LUA_COMMENTLINE 2
#define SCE_LUA_COMMENTDOC 3
#define SCE_LUA_NUMBER 4
#define SCE_LUA_WORD 5
#define SCE_LUA_STRING 6
#define SCE_LUA_CHARACTER 7
#define SCE_LUA_LITERALSTRING 8
#define SCE_LUA_PREPROCESSOR 9
#define SCE_LUA_OPERATOR 10
#define SCE_LUA_IDENTIFIER 11
#define SCE_LUA_STRINGEOL 12
#define SCE_ERR_DEFAULT 0
#define SCE_ERR_PYTHON 1
#define SCE_ERR_GCC 2
#define SCE_ERR_MS 3
#define SCE_ERR_CMD 4
#define SCE_ERR_BORLAND 5
#define SCE_ERR_PERL 6
//--Autogenerated -- end of section automatically generated from Scintilla.iface
#endif #endif

View File

@@ -3,117 +3,74 @@
// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org> // Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed. // The License.txt file describes the conditions under which this software may be distributed.
// Most of this file is automatically generated from the Scintilla.iface interface definition
// file which contains any comments about the definitions. HFacer.py does the generation.
#ifndef SCINTILLA_H #ifndef SCINTILLA_H
#define SCINTILLA_H #define SCINTILLA_H
// Compile-time configuration options // Compile-time configuration options
#define MACRO_SUPPORT 1 // Comment out to remove macro hooks #define MACRO_SUPPORT 1 // Comment out to remove macro hooks
#if PLAT_GTK #if PLAT_WIN
#include <gdk/gdk.h> #ifdef STATIC_BUILD
#include <gtk/gtkvbox.h> void Scintilla_RegisterClasses(HINSTANCE hInstance);
#endif
#ifdef __cplusplus
extern "C" {
#endif #endif
#define SCINTILLA(obj) GTK_CHECK_CAST (obj, scintilla_get_type (), ScintillaObject) typedef long (*SciFnDirect)(long ptr, unsigned int iMessage, unsigned long wParam, long lParam);
#define SCINTILLA_CLASS(klass) GTK_CHECK_CLASS_CAS T (klass, scintilla_get_type (), ScintillaClass)
#define IS_SCINTILLA(obj) GTK_CHECK_TYPE (obj, scintilla_get_type ())
typedef struct _ScintillaObject ScintillaObject;
typedef struct _ScintillaClass ScintillaClass;
struct _ScintillaObject
{
GtkFixed vbox;
void *pscin;
};
struct _ScintillaClass
{
GtkFixedClass parent_class;
void (* command) (ScintillaObject *ttt);
void (* notify) (ScintillaObject *ttt);
};
guint scintilla_get_type (void);
GtkWidget* scintilla_new (void);
void scintilla_set_id (ScintillaObject *sci,int id);
long scintilla_send_message (ScintillaObject *sci,int iMessage,int wParam,int lParam);
#include "WinDefs.h"
#ifdef __cplusplus
}
#endif
#endif
#if PLAT_WX
#include "WinDefs.h"
#endif
// Both GTK and Windows
//++Autogenerated -- start of section automatically generated from Scintilla.iface
#define INVALID_POSITION -1 #define INVALID_POSITION -1
// Define start of Scintilla messages to be greater than all edit (EM_*) messages
// as many EM_ messages can be used.
#define SCI_START 2000 #define SCI_START 2000
#define SCI_OPTIONAL_START 3000 #define SCI_OPTIONAL_START 3000
#define SCI_LEXER_START 4000 #define SCI_LEXER_START 4000
#define SCI_ADDTEXT 2001
#define SCI_ADDTEXT SCI_START + 1 #define SCI_ADDSTYLEDTEXT 2002
#define SCI_ADDSTYLEDTEXT SCI_START + 2 #define SCI_INSERTTEXT 2003
#define SCI_INSERTTEXT SCI_START + 3 #define SCI_CLEARALL 2004
#define SCI_CLEARALL SCI_START + 4 #define SCI_CLEARDOCUMENTSTYLE 2005
#define SCI_GETLENGTH SCI_START + 6 #define SCI_GETLENGTH 2006
#define SCI_GETCHARAT SCI_START + 7 #define SCI_GETCHARAT 2007
#define SCI_GETCURRENTPOS SCI_START + 8 #define SCI_GETCURRENTPOS 2008
#define SCI_GETANCHOR SCI_START + 9 #define SCI_GETANCHOR 2009
#define SCI_GETSTYLEAT SCI_START + 10 #define SCI_GETSTYLEAT 2010
#define SCI_REDO 2011
#define SCI_REDO SCI_START + 11 #define SCI_SETUNDOCOLLECTION 2012
#define SCI_SETUNDOCOLLECTION SCI_START + 12 #define SCI_SELECTALL 2013
#define SCI_SELECTALL SCI_START + 13 #define SCI_SETSAVEPOINT 2014
#define SCI_SETSAVEPOINT SCI_START + 14 #define SCI_GETSTYLEDTEXT 2015
#define SCI_GETSTYLEDTEXT SCI_START + 15 #define SCI_CANREDO 2016
#define SCI_CANREDO SCI_START + 16 #define SCI_MARKERLINEFROMHANDLE 2017
#define SCI_MARKERLINEFROMHANDLE SCI_START + 17 #define SCI_MARKERDELETEHANDLE 2018
#define SCI_MARKERDELETEHANDLE SCI_START + 18 #define SCI_GETUNDOCOLLECTION 2019
#define SCWS_INVISIBLE 0
#define SC_UNDOCOLLECT_NONE 0 #define SCWS_VISIBLEALWAYS 1
#define SC_UNDOCOLLECT_AUTOSTART 1 #define SCWS_VISIBLEAFTERINDENT 2
#define SCI_GETVIEWWS 2020
#define SCI_GETVIEWWS SCI_START + 20 #define SCI_SETVIEWWS 2021
#define SCI_SETVIEWWS SCI_START + 21 #define SCI_POSITIONFROMPOINT 2022
#define SCI_CHANGEPOSITION SCI_START + 22 #define SCI_GOTOLINE 2024
#define SCI_GOTOLINE SCI_START + 24 #define SCI_GOTOPOS 2025
#define SCI_GOTOPOS SCI_START + 25 #define SCI_SETANCHOR 2026
#define SCI_SETANCHOR SCI_START + 26 #define SCI_GETCURLINE 2027
#define SCI_GETCURLINE SCI_START + 27 #define SCI_GETENDSTYLED 2028
#define SCI_GETENDSTYLED SCI_START + 28 #define SCI_CONVERTEOLS 2029
#define SCI_CONVERTEOLS SCI_START + 29
#define SCI_GETEOLMODE SCI_START + 30
#define SCI_SETEOLMODE SCI_START + 31
#define SC_EOL_CRLF 0 #define SC_EOL_CRLF 0
#define SC_EOL_CR 1 #define SC_EOL_CR 1
#define SC_EOL_LF 2 #define SC_EOL_LF 2
#define SCI_GETEOLMODE 2030
#define SCI_STARTSTYLING SCI_START + 32 #define SCI_SETEOLMODE 2031
#define SCI_SETSTYLING SCI_START + 33 #define SCI_STARTSTYLING 2032
#define SCI_SETSTYLING 2033
#define SCI_SETBUFFEREDDRAW SCI_START + 35 #define SCI_GETBUFFEREDDRAW 2034
#define SCI_SETTABWIDTH SCI_START + 36 #define SCI_SETBUFFEREDDRAW 2035
#define SCI_SETCODEPAGE SCI_START + 37 #define SCI_SETTABWIDTH 2036
#define SCI_SETUSEPALETTE SCI_START + 39 #define SCI_GETTABWIDTH 2121
#define SC_CP_UTF8 65001
#define SCI_SETCODEPAGE 2037
#define SCI_SETUSEPALETTE 2039
#define MARKER_MAX 31 #define MARKER_MAX 31
#define SC_MARK_CIRCLE 0 #define SC_MARK_CIRCLE 0
#define SC_MARK_ROUNDRECT 1 #define SC_MARK_ROUNDRECT 1
#define SC_MARK_ARROW 2 #define SC_MARK_ARROW 2
@@ -123,217 +80,296 @@ extern "C" {
#define SC_MARK_ARROWDOWN 6 #define SC_MARK_ARROWDOWN 6
#define SC_MARK_MINUS 7 #define SC_MARK_MINUS 7
#define SC_MARK_PLUS 8 #define SC_MARK_PLUS 8
#define SCI_MARKERDEFINE SCI_START + 40
#define SCI_MARKERSETFORE SCI_START + 41
#define SCI_MARKERSETBACK SCI_START + 42
#define SCI_MARKERADD SCI_START + 43
#define SCI_MARKERDELETE SCI_START + 44
#define SCI_MARKERDELETEALL SCI_START + 45
#define SCI_MARKERGET SCI_START + 46
#define SCI_MARKERNEXT SCI_START + 47
#define SCI_MARKERPREVIOUS SCI_START + 48
#define SC_MARKNUM_FOLDER 30 #define SC_MARKNUM_FOLDER 30
#define SC_MARKNUM_FOLDEROPEN 31 #define SC_MARKNUM_FOLDEROPEN 31
#define SCI_MARKERDEFINE 2040
#define SC_MASK_FOLDERS ((1<<SC_MARKNUM_FOLDER) | (1<<SC_MARKNUM_FOLDEROPEN)) #define SCI_MARKERSETFORE 2041
#define SCI_MARKERSETBACK 2042
#define SCI_MARKERADD 2043
#define SCI_MARKERDELETE 2044
#define SCI_MARKERDELETEALL 2045
#define SCI_MARKERGET 2046
#define SCI_MARKERNEXT 2047
#define SCI_MARKERPREVIOUS 2048
#define SC_MARGIN_SYMBOL 0 #define SC_MARGIN_SYMBOL 0
#define SC_MARGIN_NUMBER 1 #define SC_MARGIN_NUMBER 1
#define SCI_SETMARGINTYPEN 2240
#define SCI_SETMARGINTYPEN SCI_START + 240 #define SCI_GETMARGINTYPEN 2241
#define SCI_GETMARGINTYPEN SCI_START + 241 #define SCI_SETMARGINWIDTHN 2242
#define SCI_SETMARGINWIDTHN SCI_START + 242 #define SCI_GETMARGINWIDTHN 2243
#define SCI_GETMARGINWIDTHN SCI_START + 243 #define SCI_SETMARGINMASKN 2244
#define SCI_SETMARGINMASKN SCI_START + 244 #define SCI_GETMARGINMASKN 2245
#define SCI_GETMARGINMASKN SCI_START + 245 #define SCI_SETMARGINSENSITIVEN 2246
#define SCI_SETMARGINSENSITIVEN SCI_START + 246 #define SCI_GETMARGINSENSITIVEN 2247
#define SCI_GETMARGINSENSITIVEN SCI_START + 247
#define STYLE_DEFAULT 32 #define STYLE_DEFAULT 32
#define STYLE_LINENUMBER 33 #define STYLE_LINENUMBER 33
#define STYLE_BRACELIGHT 34 #define STYLE_BRACELIGHT 34
#define STYLE_BRACEBAD 35 #define STYLE_BRACEBAD 35
#define STYLE_CONTROLCHAR 36 #define STYLE_CONTROLCHAR 36
#define STYLE_MAX 63 #define STYLE_INDENTGUIDE 37
#define STYLE_MAX 127
#define SCI_STYLECLEARALL SCI_START + 50 #define SC_CHARSET_ANSI 0
#define SCI_STYLESETFORE SCI_START + 51 #define SC_CHARSET_DEFAULT 1
#define SCI_STYLESETBACK SCI_START + 52 #define SC_CHARSET_BALTIC 186
#define SCI_STYLESETBOLD SCI_START + 53 #define SC_CHARSET_CHINESEBIG5 136
#define SCI_STYLESETITALIC SCI_START + 54 #define SC_CHARSET_EASTEUROPE 238
#define SCI_STYLESETSIZE SCI_START + 55 #define SC_CHARSET_GB2312 134
#define SCI_STYLESETFONT SCI_START + 56 #define SC_CHARSET_GREEK 161
#define SCI_STYLESETEOLFILLED SCI_START + 57 #define SC_CHARSET_HANGUL 129
#define SCI_STYLERESETDEFAULT SCI_START + 58 #define SC_CHARSET_MAC 77
#define SC_CHARSET_OEM 255
#define SCI_SETSELFORE SCI_START + 67 #define SC_CHARSET_RUSSIAN 204
#define SCI_SETSELBACK SCI_START + 68 #define SC_CHARSET_SHIFTJIS 128
#define SCI_SETCARETFORE SCI_START + 69 #define SC_CHARSET_SYMBOL 2
#define SC_CHARSET_TURKISH 162
#define SCI_ASSIGNCMDKEY SCI_START + 70 #define SC_CHARSET_JOHAB 130
#define SCI_CLEARCMDKEY SCI_START + 71 #define SC_CHARSET_HEBREW 177
#define SCI_CLEARALLCMDKEYS SCI_START + 72 #define SC_CHARSET_ARABIC 178
#define SC_CHARSET_VIETNAMESE 163
#define SCI_SETSTYLINGEX SCI_START + 73 #define SC_CHARSET_THAI 222
#define SCI_STYLECLEARALL 2050
#define SCI_GETCARETPERIOD SCI_START + 75 #define SCI_STYLESETFORE 2051
#define SCI_SETCARETPERIOD SCI_START + 76 #define SCI_STYLESETBACK 2052
#define SCI_SETWORDCHARS SCI_START + 77 #define SCI_STYLESETBOLD 2053
#define SCI_STYLESETITALIC 2054
#define SCI_BEGINUNDOACTION SCI_START + 78 #define SCI_STYLESETSIZE 2055
#define SCI_ENDUNDOACTION SCI_START + 79 #define SCI_STYLESETFONT 2056
#define SCI_STYLESETEOLFILLED 2057
#define SCI_STYLERESETDEFAULT 2058
#define SCI_STYLESETUNDERLINE 2059
#define SCI_STYLESETCHARACTERSET 2066
#define SCI_SETSELFORE 2067
#define SCI_SETSELBACK 2068
#define SCI_SETCARETFORE 2069
#define SCI_ASSIGNCMDKEY 2070
#define SCI_CLEARCMDKEY 2071
#define SCI_CLEARALLCMDKEYS 2072
#define SCI_SETSTYLINGEX 2073
#define SCI_STYLESETVISIBLE 2074
#define SCI_GETCARETPERIOD 2075
#define SCI_SETCARETPERIOD 2076
#define SCI_SETWORDCHARS 2077
#define SCI_BEGINUNDOACTION 2078
#define SCI_ENDUNDOACTION 2079
#define INDIC_MAX 7 #define INDIC_MAX 7
#define INDIC_PLAIN 0 #define INDIC_PLAIN 0
#define INDIC_SQUIGGLE 1 #define INDIC_SQUIGGLE 1
#define INDIC_TT 2 #define INDIC_TT 2
#define INDIC_DIAGONAL 3
#define INDIC_STRIKE 4
#define INDIC0_MASK 32 #define INDIC0_MASK 32
#define INDIC1_MASK 64 #define INDIC1_MASK 64
#define INDIC2_MASK 128 #define INDIC2_MASK 128
#define INDICS_MASK (INDIC0_MASK | INDIC1_MASK | INDIC2_MASK) #define INDICS_MASK INDIC0_MASK | INDIC1_MASK | INDIC2_MASK
#define SCI_INDICSETSTYLE 2080
#define SCI_INDICSETSTYLE SCI_START + 80 #define SCI_INDICGETSTYLE 2081
#define SCI_INDICGETSTYLE SCI_START + 81 #define SCI_INDICSETFORE 2082
#define SCI_INDICSETFORE SCI_START + 82 #define SCI_INDICGETFORE 2083
#define SCI_INDICGETFORE SCI_START + 83 #define SCI_SETSTYLEBITS 2090
#define SCI_GETSTYLEBITS 2091
#define SCI_SETSTYLEBITS SCI_START + 90 #define SCI_SETLINESTATE 2092
#define SCI_GETSTYLEBITS SCI_START + 91 #define SCI_GETLINESTATE 2093
#define SCI_SETLINESTATE SCI_START + 92 #define SCI_GETMAXLINESTATE 2094
#define SCI_GETLINESTATE SCI_START + 93 #define SCI_AUTOCSHOW 2100
#define SCI_GETMAXLINESTATE SCI_START + 94 #define SCI_AUTOCCANCEL 2101
#define SCI_AUTOCACTIVE 2102
#define SCI_AUTOCSHOW SCI_START + 100 #define SCI_AUTOCPOSSTART 2103
#define SCI_AUTOCCANCEL SCI_START + 101 #define SCI_AUTOCCOMPLETE 2104
#define SCI_AUTOCACTIVE SCI_START + 102 #define SCI_AUTOCSTOPS 2105
#define SCI_AUTOCPOSSTART SCI_START + 103 #define SCI_AUTOCSETSEPARATOR 2106
#define SCI_AUTOCCOMPLETE SCI_START + 104 #define SCI_AUTOCGETSEPARATOR 2107
#define SCI_AUTOCSTOPS SCI_START + 105 #define SCI_AUTOCSELECT 2108
#define SCI_AUTOCSETCANCELATSTART 2110
#define SCI_CALLTIPSHOW SCI_START + 200 #define SCI_AUTOCGETCANCELATSTART 2111
#define SCI_CALLTIPCANCEL SCI_START + 201 #define SCI_AUTOCSETFILLUPS 2112
#define SCI_CALLTIPACTIVE SCI_START + 202 #define SCI_AUTOCSETCHOOSESINGLE 2113
#define SCI_CALLTIPPOSSTART SCI_START + 203 #define SCI_AUTOCGETCHOOSESINGLE 2114
#define SCI_CALLTIPSETHLT SCI_START + 204 #define SCI_AUTOCSETIGNORECASE 2115
#define SCI_CALLTIPSETBACK SCI_START + 205 #define SCI_AUTOCGETIGNORECASE 2116
#define SCI_SETINDENT 2122
#define SCI_GETINDENT 2123
#define SCI_SETUSETABS 2124
#define SCI_GETUSETABS 2125
#define SCI_SETLINEINDENTATION 2126
#define SCI_GETLINEINDENTATION 2127
#define SCI_GETLINEINDENTPOSITION 2128
#define SCI_GETCOLUMN 2129
#define SCI_SETHSCROLLBAR 2130
#define SCI_GETHSCROLLBAR 2131
#define SCI_SETINDENTATIONGUIDES 2132
#define SCI_GETINDENTATIONGUIDES 2133
#define SCI_SETHIGHLIGHTGUIDE 2134
#define SCI_GETHIGHLIGHTGUIDE 2135
#define SCI_GETLINEENDPOSITION 2136
#define SCI_GETCODEPAGE 2137
#define SCI_GETCARETFORE 2138
#define SCI_GETUSEPALETTE 2139
#define SCI_GETREADONLY 2140
#define SCI_SETCURRENTPOS 2141
#define SCI_SETSELECTIONSTART 2142
#define SCI_GETSELECTIONSTART 2143
#define SCI_SETSELECTIONEND 2144
#define SCI_GETSELECTIONEND 2145
#define SCI_SETPRINTMAGNIFICATION 2146
#define SCI_GETPRINTMAGNIFICATION 2147
#define SC_PRINT_NORMAL 0
#define SC_PRINT_INVERTLIGHT 1
#define SC_PRINT_BLACKONWHITE 2
#define SCI_SETPRINTCOLOURMODE 2148
#define SCI_GETPRINTCOLOURMODE 2149
#define SCFIND_DOWN 1
#define SCFIND_WHOLEWORD 2
#define SCFIND_MATCHCASE 4
#define SCFIND_WORDSTART 0x00100000
#define SCFIND_REGEXP 0x00200000
#define SCI_FINDTEXT 2150
#define SCI_FORMATRANGE 2151
#define SCI_GETFIRSTVISIBLELINE 2152
#define SCI_GETLINE 2153
#define SCI_GETLINECOUNT 2154
#define SCI_SETMARGINLEFT 2155
#define SCI_GETMARGINLEFT 2156
#define SCI_SETMARGINRIGHT 2157
#define SCI_GETMARGINRIGHT 2158
#define SCI_GETMODIFY 2159
#define SCI_SETSEL 2160
#define SCI_GETSELTEXT 2161
#define SCI_GETTEXTRANGE 2162
#define SCI_HIDESELECTION 2163
#define SCI_POINTXFROMPOSITION 2164
#define SCI_POINTYFROMPOSITION 2165
#define SCI_LINEFROMPOSITION 2166
#define SCI_POSITIONFROMLINE 2167
#define SCI_LINESCROLL 2168
#define SCI_SCROLLCARET 2169
#define SCI_REPLACESEL 2170
#define SCI_SETREADONLY 2171
#define SCI_NULL 2172
#define SCI_CANPASTE 2173
#define SCI_CANUNDO 2174
#define SCI_EMPTYUNDOBUFFER 2175
#define SCI_UNDO 2176
#define SCI_CUT 2177
#define SCI_COPY 2178
#define SCI_PASTE 2179
#define SCI_CLEAR 2180
#define SCI_SETTEXT 2181
#define SCI_GETTEXT 2182
#define SCI_GETTEXTLENGTH 2183
#define SCI_GETDIRECTFUNCTION 2184
#define SCI_GETDIRECTPOINTER 2185
#define SCI_SETOVERTYPE 2186
#define SCI_GETOVERTYPE 2187
#define SCI_CALLTIPSHOW 2200
#define SCI_CALLTIPCANCEL 2201
#define SCI_CALLTIPACTIVE 2202
#define SCI_CALLTIPPOSSTART 2203
#define SCI_CALLTIPSETHLT 2204
#define SCI_CALLTIPSETBACK 2205
#define SCI_VISIBLEFROMDOCLINE 2220
#define SCI_DOCLINEFROMVISIBLE 2221
#define SC_FOLDLEVELBASE 0x400 #define SC_FOLDLEVELBASE 0x400
#define SC_FOLDLEVELWHITEFLAG 0x1000 #define SC_FOLDLEVELWHITEFLAG 0x1000
#define SC_FOLDLEVELHEADERFLAG 0x2000 #define SC_FOLDLEVELHEADERFLAG 0x2000
#define SC_FOLDLEVELNUMBERMASK 0x0FFF #define SC_FOLDLEVELNUMBERMASK 0x0FFF
#define SCI_SETFOLDLEVEL 2222
#define SCI_VISIBLEFROMDOCLINE SCI_START + 220 #define SCI_GETFOLDLEVEL 2223
#define SCI_DOCLINEFROMVISIBLE SCI_START + 221 #define SCI_GETLASTCHILD 2224
#define SCI_SETFOLDLEVEL SCI_START + 222 #define SCI_GETFOLDPARENT 2225
#define SCI_GETFOLDLEVEL SCI_START + 223 #define SCI_SHOWLINES 2226
#define SCI_GETLASTCHILD SCI_START + 224 #define SCI_HIDELINES 2227
#define SCI_GETFOLDPARENT SCI_START + 225 #define SCI_GETLINEVISIBLE 2228
#define SCI_SHOWLINES SCI_START + 226 #define SCI_SETFOLDEXPANDED 2229
#define SCI_HIDELINES SCI_START + 227 #define SCI_GETFOLDEXPANDED 2230
#define SCI_GETLINEVISIBLE SCI_START + 228 #define SCI_TOGGLEFOLD 2231
#define SCI_SETFOLDEXPANDED SCI_START + 229 #define SCI_ENSUREVISIBLE 2232
#define SCI_GETFOLDEXPANDED SCI_START + 230 #define SCI_SETFOLDFLAGS 2233
#define SCI_TOGGLEFOLD SCI_START + 231 #define SCI_LINEDOWN 2300
#define SCI_ENSUREVISIBLE SCI_START + 232 #define SCI_LINEDOWNEXTEND 2301
#define SCI_SETFOLDFLAGS SCI_START + 233 #define SCI_LINEUP 2302
#define SCI_LINEUPEXTEND 2303
// Key messages #define SCI_CHARLEFT 2304
#define SCI_LINEDOWN SCI_START + 300 #define SCI_CHARLEFTEXTEND 2305
#define SCI_LINEDOWNEXTEND SCI_START + 301 #define SCI_CHARRIGHT 2306
#define SCI_LINEUP SCI_START + 302 #define SCI_CHARRIGHTEXTEND 2307
#define SCI_LINEUPEXTEND SCI_START + 303 #define SCI_WORDLEFT 2308
#define SCI_CHARLEFT SCI_START + 304 #define SCI_WORDLEFTEXTEND 2309
#define SCI_CHARLEFTEXTEND SCI_START + 305 #define SCI_WORDRIGHT 2310
#define SCI_CHARRIGHT SCI_START + 306 #define SCI_WORDRIGHTEXTEND 2311
#define SCI_CHARRIGHTEXTEND SCI_START + 307 #define SCI_HOME 2312
#define SCI_WORDLEFT SCI_START + 308 #define SCI_HOMEEXTEND 2313
#define SCI_WORDLEFTEXTEND SCI_START + 309 #define SCI_LINEEND 2314
#define SCI_WORDRIGHT SCI_START + 310 #define SCI_LINEENDEXTEND 2315
#define SCI_WORDRIGHTEXTEND SCI_START + 311 #define SCI_DOCUMENTSTART 2316
#define SCI_HOME SCI_START + 312 #define SCI_DOCUMENTSTARTEXTEND 2317
#define SCI_HOMEEXTEND SCI_START + 313 #define SCI_DOCUMENTEND 2318
#define SCI_LINEEND SCI_START + 314 #define SCI_DOCUMENTENDEXTEND 2319
#define SCI_LINEENDEXTEND SCI_START + 315 #define SCI_PAGEUP 2320
#define SCI_DOCUMENTSTART SCI_START + 316 #define SCI_PAGEUPEXTEND 2321
#define SCI_DOCUMENTSTARTEXTEND SCI_START + 317 #define SCI_PAGEDOWN 2322
#define SCI_DOCUMENTEND SCI_START + 318 #define SCI_PAGEDOWNEXTEND 2323
#define SCI_DOCUMENTENDEXTEND SCI_START + 319 #define SCI_EDITTOGGLEOVERTYPE 2324
#define SCI_PAGEUP SCI_START + 320 #define SCI_CANCEL 2325
#define SCI_PAGEUPEXTEND SCI_START + 321 #define SCI_DELETEBACK 2326
#define SCI_PAGEDOWN SCI_START + 322 #define SCI_TAB 2327
#define SCI_PAGEDOWNEXTEND SCI_START + 323 #define SCI_BACKTAB 2328
#define SCI_EDITTOGGLEOVERTYPE SCI_START + 324 #define SCI_NEWLINE 2329
#define SCI_CANCEL SCI_START + 325 #define SCI_FORMFEED 2330
#define SCI_DELETEBACK SCI_START + 326 #define SCI_VCHOME 2331
#define SCI_TAB SCI_START + 327 #define SCI_VCHOMEEXTEND 2332
#define SCI_BACKTAB SCI_START + 328 #define SCI_ZOOMIN 2333
#define SCI_NEWLINE SCI_START + 329 #define SCI_ZOOMOUT 2334
#define SCI_FORMFEED SCI_START + 330 #define SCI_DELWORDLEFT 2335
#define SCI_VCHOME SCI_START + 331 #define SCI_DELWORDRIGHT 2336
#define SCI_VCHOMEEXTEND SCI_START + 332 #define SCI_LINECUT 2337
#define SCI_ZOOMIN SCI_START + 333 #define SCI_LINEDELETE 2338
#define SCI_ZOOMOUT SCI_START + 334 #define SCI_LINETRANSPOSE 2339
#define SCI_DELWORDLEFT SCI_START + 335 #define SCI_LOWERCASE 2340
#define SCI_DELWORDRIGHT SCI_START + 336 #define SCI_UPPERCASE 2341
#define SCI_LINESCROLLDOWN 2342
#define SCI_LINELENGTH SCI_START + 350 #define SCI_LINESCROLLUP 2343
#define SCI_BRACEHIGHLIGHT SCI_START + 351 #define SCI_LINELENGTH 2350
#define SCI_BRACEBADLIGHT SCI_START + 352 #define SCI_BRACEHIGHLIGHT 2351
#define SCI_BRACEMATCH SCI_START + 353 #define SCI_BRACEBADLIGHT 2352
#define SCI_GETVIEWEOL SCI_START + 355 #define SCI_BRACEMATCH 2353
#define SCI_SETVIEWEOL SCI_START + 356 #define SCI_GETVIEWEOL 2355
#define SCI_GETDOCPOINTER SCI_START + 357 #define SCI_SETVIEWEOL 2356
#define SCI_SETDOCPOINTER SCI_START + 358 #define SCI_GETDOCPOINTER 2357
#define SCI_SETMODEVENTMASK SCI_START + 359 #define SCI_SETDOCPOINTER 2358
#define SCI_SETMODEVENTMASK 2359
#define EDGE_NONE 0 #define EDGE_NONE 0
#define EDGE_LINE 1 #define EDGE_LINE 1
#define EDGE_BACKGROUND 2 #define EDGE_BACKGROUND 2
#define SCI_GETEDGECOLUMN 2360
#define SCI_GETEDGECOLUMN SCI_START + 360 #define SCI_SETEDGECOLUMN 2361
#define SCI_SETEDGECOLUMN SCI_START + 361 #define SCI_GETEDGEMODE 2362
#define SCI_GETEDGEMODE SCI_START + 362 #define SCI_SETEDGEMODE 2363
#define SCI_SETEDGEMODE SCI_START + 363 #define SCI_GETEDGECOLOUR 2364
#define SCI_GETEDGECOLOUR SCI_START + 364 #define SCI_SETEDGECOLOUR 2365
#define SCI_SETEDGECOLOUR SCI_START + 365 #define SCI_SEARCHANCHOR 2366
#define SCI_SEARCHNEXT 2367
#define SCI_SEARCHANCHOR SCI_START + 366 #define SCI_SEARCHPREV 2368
#define SCI_SEARCHNEXT SCI_START + 367 #define CARET_SLOP 0x01
#define SCI_SEARCHPREV SCI_START + 368 #define CARET_CENTER 0x02
#define CARET_STRICT 0x04
#define CARET_SLOP 0x01 // Show caret within N lines of edge when it's scrolled to view #define SCI_SETCARETPOLICY 2369
#define CARET_CENTER 0x02 // Center caret on screen when it's scrolled to view #define SCI_LINESONSCREEN 2370
#define CARET_STRICT 0x04 // OR this with CARET_CENTER to reposition even when visible, or #define SCI_USEPOPUP 2371
// OR this with CARET_SLOP to reposition whenever outside slop border #define SCI_SELECTIONISRECTANGLE 2372
#define SCI_SETZOOM 2373
#define SCI_SETCARETPOLICY SCI_START + 369 #define SCI_GETZOOM 2374
#define SCI_CREATEDOCUMENT 2375
// GTK+ Specific #define SCI_ADDREFDOCUMENT 2376
#define SCI_GRABFOCUS SCI_START + 400 #define SCI_RELEASEDOCUMENT 2377
#define SCI_GETMODEVENTMASK 2378
// Optional module for macro recording #define SCI_GRABFOCUS 2400
#ifdef MACRO_SUPPORT #define SCI_STARTRECORD 3001
typedef void (tMacroRecorder)(UINT iMessage, WPARAM wParam, LPARAM lParam, #define SCI_STOPRECORD 3002
void *userData); #define SCI_SETLEXER 4001
#define SCI_STARTRECORD SCI_OPTIONAL_START + 1 #define SCI_GETLEXER 4002
#define SCI_STOPRECORD SCI_OPTIONAL_START + 2 #define SCI_COLOURISE 4003
#endif #define SCI_SETPROPERTY 4004
#define SCI_SETKEYWORDS 4005
#define SCI_SETLEXER SCI_LEXER_START + 1
#define SCI_GETLEXER SCI_LEXER_START + 2
#define SCI_COLOURISE SCI_LEXER_START + 3
#define SCI_SETPROPERTY SCI_LEXER_START + 4
#define SCI_SETKEYWORDS SCI_LEXER_START + 5
// Notifications
// Type of modification and the action which caused the modification
// These are defined as a bit mask to make it easy to specify which notifications are wanted.
// One bit is set from each of SC_MOD_* and SC_PERFORMED_*.
#define SC_MOD_INSERTTEXT 0x1 #define SC_MOD_INSERTTEXT 0x1
#define SC_MOD_DELETETEXT 0x2 #define SC_MOD_DELETETEXT 0x2
#define SC_MOD_CHANGESTYLE 0x4 #define SC_MOD_CHANGESTYLE 0x4
@@ -342,11 +378,101 @@ typedef void (tMacroRecorder)(UINT iMessage, WPARAM wParam, LPARAM lParam,
#define SC_PERFORMED_UNDO 0x20 #define SC_PERFORMED_UNDO 0x20
#define SC_PERFORMED_REDO 0x40 #define SC_PERFORMED_REDO 0x40
#define SC_LASTSTEPINUNDOREDO 0x100 #define SC_LASTSTEPINUNDOREDO 0x100
#define SC_MOD_CHANGEMARKER 0x200
#define SC_MOD_BEFOREINSERT 0x400
#define SC_MOD_BEFOREDELETE 0x800
#define SC_MODEVENTMASKALL 0xF77
#define SCEN_CHANGE 768
#define SCEN_SETFOCUS 512
#define SCEN_KILLFOCUS 256
#define SCK_DOWN 300
#define SCK_UP 301
#define SCK_LEFT 302
#define SCK_RIGHT 303
#define SCK_HOME 304
#define SCK_END 305
#define SCK_PRIOR 306
#define SCK_NEXT 307
#define SCK_DELETE 308
#define SCK_INSERT 309
#define SCK_ESCAPE 7
#define SCK_BACK 8
#define SCK_TAB 9
#define SCK_RETURN 13
#define SCK_ADD 310
#define SCK_SUBTRACT 311
#define SCK_DIVIDE 312
#define SCMOD_SHIFT 1
#define SCMOD_CTRL 2
#define SCMOD_ALT 4
#define SCN_STYLENEEDED 2000
#define SCN_CHARADDED 2001
#define SCN_SAVEPOINTREACHED 2002
#define SCN_SAVEPOINTLEFT 2003
#define SCN_MODIFYATTEMPTRO 2004
#define SCN_KEY 2005
#define SCN_DOUBLECLICK 2006
#define SCN_UPDATEUI 2007
#define SCN_CHECKBRACE 2007
#define SCN_MODIFIED 2008
#define SCN_MACRORECORD 2009
#define SCN_MARGINCLICK 2010
#define SCN_NEEDSHOWN 2011
#define SCN_POSCHANGED 2012
//--Autogenerated -- end of section automatically generated from Scintilla.iface
#define SC_MODEVENTMASKALL 0x377 // Optional module for macro recording
#ifdef MACRO_SUPPORT
typedef void (tMacroRecorder)(unsigned int iMessage, unsigned long wParam,
long lParam, void *userData);
#endif
// These structures are defined to be exactly the same shape as the Win32
// CHARRANGE, TEXTRANGE, FINDTEXTEX, FORMATRANGE, and NMHDR structs.
// So older code that treats Scintilla as a RichEdit will work.
struct CharacterRange {
long cpMin;
long cpMax;
};
struct TextRange {
CharacterRange chrg;
char *lpstrText;
};
struct TextToFind {
CharacterRange chrg;
char *lpstrText;
CharacterRange chrgText;
};
#ifdef PLATFORM_H
// This structure is used in printing and requires some of the graphics types
// from Platform.h. Not needed by most client code.
struct RangeToFormat {
SurfaceID hdc;
SurfaceID hdcTarget;
PRectangle rc;
PRectangle rcPage;
CharacterRange chrg;
};
#endif
struct NotifyHeader {
// hwndFrom is really an environment specifc window handle or pointer
// but most clients of Scintilla.h do not have this type visible.
//WindowID hwndFrom;
void *hwndFrom;
unsigned int idFrom;
unsigned int code;
};
struct SCNotification { struct SCNotification {
NMHDR nmhdr; NotifyHeader nmhdr;
int position; // SCN_STYLENEEDED, SCN_MODIFIED int position; // SCN_STYLENEEDED, SCN_MODIFIED
int ch; // SCN_CHARADDED, SCN_KEY int ch; // SCN_CHARADDED, SCN_KEY
int modifiers; // SCN_KEY int modifiers; // SCN_KEY
@@ -365,28 +491,7 @@ struct SCNotification {
int margin; // SCN_MARGINCLICK int margin; // SCN_MARGINCLICK
}; };
#define SCN_STYLENEEDED 2000 #define SC_MASK_FOLDERS ((1<<SC_MARKNUM_FOLDER) | (1<<SC_MARKNUM_FOLDEROPEN))
#define SCN_CHARADDED 2001
#define SCN_SAVEPOINTREACHED 2002
#define SCN_SAVEPOINTLEFT 2003
#define SCN_MODIFYATTEMPTRO 2004
// GTK+ Specific to work around focus and accelerator problems:
#define SCN_KEY 2005
#define SCN_DOUBLECLICK 2006
#define SCN_UPDATEUI 2007
// The old name for SCN_UPDATEUI:
#define SCN_CHECKBRACE 2007
#define SCN_MODIFIED 2008
// Optional module for macro recording
#ifdef MACRO_SUPPORT
#define SCN_MACRORECORD 2009
#endif
#define SCN_MARGINCLICK 2010
#define SCN_NEEDSHOWN 2011
#ifdef STATIC_BUILD
void Scintilla_RegisterClasses(HINSTANCE hInstance);
#endif
// Deprecation section listing all API features that are deprecated and will // Deprecation section listing all API features that are deprecated and will
// will be removed completely in a future version. // will be removed completely in a future version.
@@ -394,21 +499,9 @@ void Scintilla_RegisterClasses(HINSTANCE hInstance);
#ifdef INCLUDE_DEPRECATED_FEATURES #ifdef INCLUDE_DEPRECATED_FEATURES
// Default style settings. These are deprecated and will be removed in a future version. // Deprecated in 1.27
#define SCI_SETFORE SCI_START + 60 #define SC_UNDOCOLLECT_NONE 0
#define SCI_SETBACK SCI_START + 61 #define SC_UNDOCOLLECT_AUTOSTART 1
#define SCI_SETBOLD SCI_START + 62
#define SCI_SETITALIC SCI_START + 63
#define SCI_SETSIZE SCI_START + 64
#define SCI_SETFONT SCI_START + 65
#define SCI_APPENDUNDOSTARTACTION SCI_START + 74
#define SC_UNDOCOLLECT_MANUALSTART 2
// Deprecated in release 1.22
#define SCI_SETMARGINWIDTH SCI_START + 34
#define SCI_SETLINENUMBERWIDTH SCI_START + 38
#endif #endif

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,46 @@
// Scintilla source code edit control
// ScintillaWidget.h - definition of Scintilla widget for GTK+
// Only needed by GTK+ code but is harmless on other platforms.
// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed.
#ifndef SCINTILLAWIDGET_H
#define SCINTILLAWIDGET_H
#if PLAT_GTK
#ifdef __cplusplus
extern "C" {
#endif
#define SCINTILLA(obj) GTK_CHECK_CAST (obj, scintilla_get_type (), ScintillaObject)
#define SCINTILLA_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, scintilla_get_type (), ScintillaClass)
#define IS_SCINTILLA(obj) GTK_CHECK_TYPE (obj, scintilla_get_type ())
typedef struct _ScintillaObject ScintillaObject;
typedef struct _ScintillaClass ScintillaClass;
struct _ScintillaObject {
GtkFixed vbox;
void *pscin;
};
struct _ScintillaClass {
GtkFixedClass parent_class;
void (* command) (ScintillaObject *ttt);
void (* notify) (ScintillaObject *ttt);
};
guint scintilla_get_type (void);
GtkWidget* scintilla_new (void);
void scintilla_set_id (ScintillaObject *sci,int id);
long scintilla_send_message (ScintillaObject *sci,int iMessage,int wParam,int lParam);
#ifdef __cplusplus
}
#endif
#endif
#endif

View File

@@ -16,93 +16,47 @@
#define LPSTR char * #define LPSTR char *
#define LONG long #define LONG long
//#if 0
/* RTF control */ /* RTF control */
#define EM_CANPASTE (1074) #define EM_CANPASTE (1074)
#define EM_CANUNDO (198) #define EM_CANUNDO (198)
#define EM_CHARFROMPOS (215) #define EM_CHARFROMPOS (215)
#define EM_DISPLAYBAND (1075)
#define EM_EMPTYUNDOBUFFER (205) #define EM_EMPTYUNDOBUFFER (205)
#define EM_EXGETSEL (1076) #define EM_EXGETSEL (1076)
#define EM_EXLIMITTEXT (1077)
#define EM_EXLINEFROMCHAR (1078) #define EM_EXLINEFROMCHAR (1078)
#define EM_EXSETSEL (1079) #define EM_EXSETSEL (1079)
#define EM_FINDTEXT (1080) #define EM_FINDTEXT (1080)
#define EM_FINDTEXTEX (1103) #define EM_FINDTEXTEX (1103)
#define EM_FINDWORDBREAK (1100)
#define EM_FMTLINES (200)
#define EM_FORMATRANGE (1081) #define EM_FORMATRANGE (1081)
#define EM_GETCHARFORMAT (1082)
#define EM_GETEVENTMASK (1083)
#define EM_GETFIRSTVISIBLELINE (206) #define EM_GETFIRSTVISIBLELINE (206)
#define EM_GETHANDLE (189)
#define EM_GETLIMITTEXT (213)
#define EM_GETLINE (196) #define EM_GETLINE (196)
#define EM_GETLINECOUNT (186) #define EM_GETLINECOUNT (186)
#define EM_GETMARGINS (212) #define EM_GETMARGINS (212)
#define EM_GETMODIFY (184) #define EM_GETMODIFY (184)
#define EM_GETIMECOLOR (1129)
#define EM_GETIMEOPTIONS (1131)
#define EM_GETOPTIONS (1102)
#define EM_GETOLEINTERFACE (1084)
#define EM_GETPARAFORMAT (1085)
#define EM_GETPASSWORDCHAR (210)
#define EM_GETPUNCTUATION (1125)
#define EM_GETRECT (178) #define EM_GETRECT (178)
#define EM_GETSEL (176) #define EM_GETSEL (176)
#define EM_GETSELTEXT (1086) #define EM_GETSELTEXT (1086)
#define EM_GETTEXTRANGE (1099) #define EM_GETTEXTRANGE (1099)
#define EM_GETTHUMB (190)
#define EM_GETWORDBREAKPROC (209)
#define EM_GETWORDBREAKPROCEX (1104)
#define EM_GETWORDWRAPMODE (1127)
#define EM_HIDESELECTION (1087) #define EM_HIDESELECTION (1087)
#define EM_LIMITTEXT (197)
#define EM_LINEFROMCHAR (201) #define EM_LINEFROMCHAR (201)
#define EM_LINEINDEX (187) #define EM_LINEINDEX (187)
#define EM_LINELENGTH (193) #define EM_LINELENGTH (193)
#define EM_LINESCROLL (182) #define EM_LINESCROLL (182)
#define EM_PASTESPECIAL (1088)
#define EM_POSFROMCHAR (214) #define EM_POSFROMCHAR (214)
#define EM_REPLACESEL (194) #define EM_REPLACESEL (194)
#define EM_REQUESTRESIZE (1089)
#define EM_SCROLL (181)
#define EM_SCROLLCARET (183) #define EM_SCROLLCARET (183)
#define EM_SELECTIONTYPE (1090) #define EM_SELECTIONTYPE (1090)
#define EM_SETBKGNDCOLOR (1091)
#define EM_SETCHARFORMAT (1092)
#define EM_SETEVENTMASK (1093)
#define EM_SETHANDLE (188)
#define EM_SETIMECOLOR (1128)
#define EM_SETIMEOPTIONS (1130)
#define EM_SETLIMITTEXT (197)
#define EM_SETMARGINS (211) #define EM_SETMARGINS (211)
#define EM_SETMODIFY (185)
#define EM_SETOLECALLBACK (1094)
#define EM_SETOPTIONS (1101)
#define EM_SETPARAFORMAT (1095)
#define EM_SETPASSWORDCHAR (204)
#define EM_SETPUNCTUATION (1124)
#define EM_SETREADONLY (207) #define EM_SETREADONLY (207)
#define EM_SETRECT (179)
#define EM_SETRECTNP (180)
#define EM_SETSEL (177) #define EM_SETSEL (177)
#define EM_SETTABSTOPS (203)
#define EM_SETTARGETDEVICE (1096)
#define EM_SETWORDBREAKPROC (208)
#define EM_SETWORDBREAKPROCEX (1105)
#define EM_SETWORDWRAPMODE (1126)
#define EM_STREAMIN (1097)
#define EM_STREAMOUT (1098)
#define EM_UNDO (199) #define EM_UNDO (199)
#define WM_NULL (0) #define WM_NULL (0)
#define WM_CLEAR (771) #define WM_CLEAR (771)
#define WM_COMMAND (273)
#define WM_COPY (769) #define WM_COPY (769)
#define WM_CUT (768) #define WM_CUT (768)
#define WM_GETTEXT (13) #define WM_GETTEXT (13)
#define WM_GETTEXTLENGTH (14) #define WM_GETTEXTLENGTH (14)
#define WM_NOTIFY (78)
#define WM_PASTE (770) #define WM_PASTE (770)
#define WM_SETTEXT (12) #define WM_SETTEXT (12)
#define WM_UNDO (772) #define WM_UNDO (772)
@@ -115,6 +69,9 @@
#define EC_RIGHTMARGIN 2 #define EC_RIGHTMARGIN 2
#define EC_USEFONTINFO 0xffff #define EC_USEFONTINFO 0xffff
//#endif
#if 0
#if PLAT_GTK #if PLAT_GTK
#define VK_DOWN GDK_Down #define VK_DOWN GDK_Down
#define VK_UP GDK_Up #define VK_UP GDK_Up
@@ -132,6 +89,7 @@
#define VK_RETURN GDK_Return #define VK_RETURN GDK_Return
#define VK_ADD GDK_KP_Add #define VK_ADD GDK_KP_Add
#define VK_SUBTRACT GDK_KP_Subtract #define VK_SUBTRACT GDK_KP_Subtract
#define VK_DIVIDE GDK_KP_Divide
#endif #endif
#if PLAT_WX #if PLAT_WX
@@ -151,12 +109,18 @@
#define VK_RETURN WXK_RETURN #define VK_RETURN WXK_RETURN
#define VK_ADD WXK_ADD #define VK_ADD WXK_ADD
#define VK_SUBTRACT WXK_SUBTRACT #define VK_SUBTRACT WXK_SUBTRACT
//TODO:
#define VK_DIVIDE WXK_DIVIDE
#endif
#define SHIFT_PRESSED 1
#define LEFT_CTRL_PRESSED 2
#define LEFT_ALT_PRESSED 4
// Are these needed any more // Are these needed any more
#define LPSTR char * #define LPSTR char *
#define LONG long #define LONG long
#define LPDWORD (long *) #define LPDWORD (long *)
#endif
/* SELCHANGE structure */ /* SELCHANGE structure */
#define SEL_EMPTY (0) #define SEL_EMPTY (0)
@@ -165,15 +129,6 @@
#define SEL_MULTICHAR (4) #define SEL_MULTICHAR (4)
#define SEL_MULTIOBJECT (8) #define SEL_MULTIOBJECT (8)
/* FINDREPLACE structure */
#define FR_MATCHCASE (0x4)
#define FR_WHOLEWORD (0x2)
#define FR_DOWN (0x1)
#define SHIFT_PRESSED 1
#define LEFT_CTRL_PRESSED 2
#define LEFT_ALT_PRESSED 4
struct RECT { struct RECT {
LONG left; LONG left;
LONG top; LONG top;
@@ -181,6 +136,15 @@ struct RECT {
LONG bottom; LONG bottom;
}; };
/* FINDREPLACE structure */
#define FR_MATCHCASE (0x4)
#define FR_WHOLEWORD (0x2)
#define FR_DOWN (0x1)
#endif
#if 0
struct CHARRANGE { struct CHARRANGE {
LONG cpMin; LONG cpMin;
LONG cpMax; LONG cpMax;
@@ -210,9 +174,10 @@ struct FORMATRANGE {
RECT rcPage; RECT rcPage;
CHARRANGE chrg; CHARRANGE chrg;
}; };
#endif
#define MAKELONG(a, b) ((a) | ((b) << 16)) //#define MAKELONG(a, b) ((a) | ((b) << 16))
#define LOWORD(x) (x & 0xffff) //#define LOWORD(x) (x & 0xffff)
#define HIWORD(x) (x >> 16) //#define HIWORD(x) (x >> 16)
#endif #endif

View File

@@ -0,0 +1,47 @@
// WindowAccessor.h - implementation of BufferAccess and StylingAccess on a Scintilla rapid easy access to contents of a Scintilla
// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed.
class WindowAccessor : public Accessor {
// Private so WindowAccessor objects can not be copied
WindowAccessor(const WindowAccessor &source) : Accessor(), props(source.props) {}
WindowAccessor &operator=(const WindowAccessor &) { return *this; }
protected:
WindowID id;
PropSet &props;
int lenDoc;
char styleBuf[bufferSize];
int validLen;
char chFlags;
char chWhile;
unsigned int startSeg;
bool InternalIsLeadByte(char ch);
void Fill(int position);
public:
WindowAccessor(WindowID id_, PropSet &props_) :
Accessor(), id(id_), props(props_),
lenDoc(-1), validLen(0), chFlags(0), chWhile(0) {
}
~WindowAccessor();
char StyleAt(int position);
int GetLine(int position);
int LineStart(int line);
int LevelAt(int line);
int Length();
void Flush();
int GetLineState(int line);
int SetLineState(int line, int state);
int GetPropertyInt(const char *key, int defaultValue=0) {
return props.GetInt(key, defaultValue);
}
void StartAt(unsigned int start, char chMask=31);
void SetFlags(char chFlags_, char chWhile_) {chFlags = chFlags_; chWhile = chWhile_; };
unsigned int GetStartSegment() { return startSeg; }
void StartSegment(unsigned int pos);
void ColourTo(unsigned int pos, int chAttr);
void SetLevel(int line, int level);
int IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader = 0);
};

View File

@@ -1,112 +0,0 @@
// SciTE - Scintilla based Text Editor
// Accessor.cxx - rapid easy access to contents of a Scintilla
// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed.
#include <stdlib.h>
#include <stdio.h>
#include "Platform.h"
#include "PropSet.h"
#include "Accessor.h"
#include "Scintilla.h"
void Accessor::Fill(int position) {
if (lenDoc == -1)
lenDoc = Platform::SendScintilla(id, WM_GETTEXTLENGTH, 0, 0);
startPos = position - slopSize;
if (startPos + bufferSize > lenDoc)
startPos = lenDoc - bufferSize;
if (startPos < 0)
startPos = 0;
endPos = startPos + bufferSize;
if (endPos > lenDoc)
endPos = lenDoc;
TEXTRANGE tr = {{startPos, endPos}, buf};
Platform::SendScintilla(id, EM_GETTEXTRANGE, 0, reinterpret_cast<LPARAM>(&tr));
}
char Accessor::StyleAt(int position) {
return static_cast<char>(Platform::SendScintilla(
id, SCI_GETSTYLEAT, position, 0));
}
int Accessor::GetLine(int position) {
return Platform::SendScintilla(id, EM_LINEFROMCHAR, position, 0);
}
int Accessor::LineStart(int line) {
return Platform::SendScintilla(id, EM_LINEINDEX, line, 0);
}
int Accessor::LevelAt(int line) {
return Platform::SendScintilla(id, SCI_GETFOLDLEVEL, line, 0);
}
int Accessor::Length() {
if (lenDoc == -1)
lenDoc = Platform::SendScintilla(id, WM_GETTEXTLENGTH, 0, 0);
return lenDoc;
}
int Accessor::GetLineState(int line) {
return Platform::SendScintilla(id, SCI_GETLINESTATE, line);
}
int Accessor::SetLineState(int line, int state) {
return Platform::SendScintilla(id, SCI_SETLINESTATE, line, state);
}
void StylingContext::StartAt(unsigned int start, char chMask) {
Platform::SendScintilla(id, SCI_STARTSTYLING, start, chMask);
}
void StylingContext::ColourSegment(unsigned int start, unsigned int end, int chAttr) {
// Only perform styling if non empty range
if (end != start - 1) {
if (end < start) {
Platform::DebugPrintf("Bad colour positions %d - %d\n", start, end);
}
if (validLen + (end - start + 1) >= bufferSize)
Flush();
if (validLen + (end - start + 1) >= bufferSize) {
// Too big for buffer so send directly
Platform::SendScintilla(id, SCI_SETSTYLING, end - start + 1, chAttr);
} else {
if (chAttr != chWhile)
chFlags = 0;
chAttr |= chFlags;
for (unsigned int i = start; i <= end; i++) {
styleBuf[validLen++] = chAttr;
}
}
}
}
void StylingContext::StartSegment(unsigned int pos) {
startSeg = pos;
}
void StylingContext::ColourTo(unsigned int pos, int chAttr) {
ColourSegment(startSeg, pos, chAttr);
startSeg = pos+1;
}
int StylingContext::GetLine(int position) {
return Platform::SendScintilla(id, EM_LINEFROMCHAR, position, 0);
}
void StylingContext::SetLevel(int line, int level) {
Platform::SendScintilla(id, SCI_SETFOLDLEVEL, line, level);
}
void StylingContext::Flush() {
if (validLen > 0) {
Platform::SendScintilla(id, SCI_SETSTYLINGEX, validLen,
reinterpret_cast<LPARAM>(styleBuf));
validLen = 0;
}
}

View File

@@ -10,11 +10,16 @@
#include "AutoComplete.h" #include "AutoComplete.h"
AutoComplete::AutoComplete() { AutoComplete::AutoComplete() :
lb = 0; active(false),
active = false; separator(' '),
posStart = 0; ignoreCase(false),
strcpy(stopChars, ""); chooseSingle(false),
posStart(0),
startLen(0),
cancelAtStartPos(true) {
stopChars[0] = '\0';
fillUpChars[0] = '\0';
} }
AutoComplete::~AutoComplete() { AutoComplete::~AutoComplete() {
@@ -44,8 +49,24 @@ bool AutoComplete::IsStopChar(char ch) {
return ch && strchr(stopChars, ch); return ch && strchr(stopChars, ch);
} }
int AutoComplete::SetList(const char *list) { void AutoComplete::SetFillUpChars(const char *fillUpChars_) {
int maxStrLen = 12; strncpy(fillUpChars, fillUpChars_, sizeof(fillUpChars));
fillUpChars[sizeof(fillUpChars) - 1] = '\0';
}
bool AutoComplete::IsFillUpChar(char ch) {
return ch && strchr(fillUpChars, ch);
}
void AutoComplete::SetSeparator(char separator_) {
separator = separator_;
}
char AutoComplete::GetSeparator() {
return separator;
}
void AutoComplete::SetList(const char *list) {
lb.Clear(); lb.Clear();
char *words = new char[strlen(list) + 1]; char *words = new char[strlen(list) + 1];
if (words) { if (words) {
@@ -53,21 +74,18 @@ int AutoComplete::SetList(const char *list) {
char *startword = words; char *startword = words;
int i = 0; int i = 0;
for (; words && words[i]; i++) { for (; words && words[i]; i++) {
if (words[i] == ' ') { if (words[i] == separator) {
words[i] = '\0'; words[i] = '\0';
lb.Append(startword); lb.Append(startword);
maxStrLen = Platform::Maximum(maxStrLen, strlen(startword));
startword = words + i + 1; startword = words + i + 1;
} }
} }
if (startword) { if (startword) {
lb.Append(startword); lb.Append(startword);
maxStrLen = Platform::Maximum(maxStrLen, strlen(startword));
} }
delete []words; delete []words;
} }
lb.Sort(); lb.Sort();
return maxStrLen;
} }
void AutoComplete::Show() { void AutoComplete::Show() {
@@ -78,7 +96,6 @@ void AutoComplete::Show() {
void AutoComplete::Cancel() { void AutoComplete::Cancel() {
if (lb.Created()) { if (lb.Created()) {
lb.Destroy(); lb.Destroy();
lb = 0;
active = false; active = false;
} }
} }

View File

@@ -9,10 +9,16 @@
class AutoComplete { class AutoComplete {
bool active; bool active;
char stopChars[256]; char stopChars[256];
char fillUpChars[256];
char separator;
public: public:
bool ignoreCase;
bool chooseSingle;
ListBox lb; ListBox lb;
int posStart; int posStart;
int startLen; int startLen;
// Should autocompletion be canceled if editor's currentPos <= startPos?
bool cancelAtStartPos;
AutoComplete(); AutoComplete();
~AutoComplete(); ~AutoComplete();
@@ -27,8 +33,16 @@ public:
void SetStopChars(const char *stopChars_); void SetStopChars(const char *stopChars_);
bool IsStopChar(char ch); bool IsStopChar(char ch);
// The list string contains a sequence of words separated by spaces // The fillup chars are characters which, when typed, fill up the selected word
int SetList(const char *list); void SetFillUpChars(const char *fillUpChars_);
bool IsFillUpChar(char ch);
// The separator character is used when interpreting the list in SetList
void SetSeparator(char separator_);
char GetSeparator();
// The list string contains a sequence of words separated by the separator character
void SetList(const char *list);
void Show(); void Show();
void Cancel(); void Cancel();

View File

@@ -8,6 +8,7 @@
#include "Platform.h" #include "Platform.h"
#include "Scintilla.h"
#include "CallTip.h" #include "CallTip.h"
CallTip::CallTip() { CallTip::CallTip() {
@@ -117,7 +118,7 @@ PRectangle CallTip::CallTipStart(int pos, Point pt, const char *defn,
Surface surfaceMeasure; Surface surfaceMeasure;
surfaceMeasure.Init(); surfaceMeasure.Init();
int deviceHeight = (size * surfaceMeasure.LogPixelsY()) / 72; int deviceHeight = (size * surfaceMeasure.LogPixelsY()) / 72;
font.Create(faceName, deviceHeight); font.Create(faceName, SC_CHARSET_DEFAULT, deviceHeight, false, false);
if (val) if (val)
delete []val; delete []val;
val = new char[strlen(defn) + 1]; val = new char[strlen(defn) + 1];

View File

@@ -6,13 +6,14 @@
#ifndef CALLTIP_H #ifndef CALLTIP_H
#define CALLTIP_H #define CALLTIP_H
const char callClassName[] = "CallTip";
class CallTip { class CallTip {
int startHighlight; int startHighlight;
int endHighlight; int endHighlight;
char *val; char *val;
Font font; Font font;
// Private so CallTip objects can not be copied
CallTip(const CallTip &) {}
CallTip &operator=(const CallTip &) { return *this; }
public: public:
Window wCallTip; Window wCallTip;
Window wDraw; Window wDraw;

View File

@@ -88,7 +88,7 @@ void MarkerHandleSet::RemoveHandle(int handle) {
if (mhn->handle == handle) { if (mhn->handle == handle) {
*pmhn = mhn->next; *pmhn = mhn->next;
delete mhn; delete mhn;
return; return ;
} }
pmhn = &((*pmhn)->next); pmhn = &((*pmhn)->next);
} }
@@ -101,7 +101,7 @@ void MarkerHandleSet::RemoveNumber(int markerNum) {
if (mhn->number == markerNum) { if (mhn->number == markerNum) {
*pmhn = mhn->next; *pmhn = mhn->next;
delete mhn; delete mhn;
return; return ;
} }
pmhn = &((*pmhn)->next); pmhn = &((*pmhn)->next);
} }
@@ -119,7 +119,11 @@ void MarkerHandleSet::CombineWith(MarkerHandleSet *other) {
LineVector::LineVector() { LineVector::LineVector() {
linesData = 0; linesData = 0;
lines = 0; lines = 0;
size = 0;
levels = 0; levels = 0;
sizeLevels = 0;
handleCurrent = 1;
Init(); Init();
} }
@@ -161,6 +165,7 @@ void LineVector::Expand(int sizeNew) {
Platform::DebugPrintf("No memory available\n"); Platform::DebugPrintf("No memory available\n");
// TODO: Blow up // TODO: Blow up
} }
} }
void LineVector::ExpandLevels(int sizeNew) { void LineVector::ExpandLevels(int sizeNew) {
@@ -180,6 +185,13 @@ void LineVector::ExpandLevels(int sizeNew) {
Platform::DebugPrintf("No memory available\n"); Platform::DebugPrintf("No memory available\n");
// TODO: Blow up // TODO: Blow up
} }
}
void LineVector::ClearLevels() {
delete []levels;
levels = 0;
sizeLevels = 0;
} }
void LineVector::InsertValue(int pos, int value) { void LineVector::InsertValue(int pos, int value) {
@@ -191,11 +203,23 @@ void LineVector::InsertValue(int pos, int value) {
} }
} }
lines++; lines++;
for (int i = lines + 1; i > pos; i--) { for (int i = lines; i > pos; i--) {
linesData[i] = linesData[i - 1]; linesData[i] = linesData[i - 1];
} }
linesData[pos].startPosition = value; linesData[pos].startPosition = value;
linesData[pos].handleSet = 0; linesData[pos].handleSet = 0;
if (levels) {
for (int j = lines; j > pos; j--) {
levels[j] = levels[j - 1];
}
if (pos == 0) {
levels[pos] = SC_FOLDLEVELBASE;
} else if (pos == (lines - 1)) { // Last line will not be a folder
levels[pos] = SC_FOLDLEVELBASE;
} else {
levels[pos] = levels[pos - 1];
}
}
} }
void LineVector::SetValue(int pos, int value) { void LineVector::SetValue(int pos, int value) {
@@ -221,6 +245,15 @@ void LineVector::Remove(int pos) {
for (int i = pos; i < lines; i++) { for (int i = pos; i < lines; i++) {
linesData[i] = linesData[i + 1]; linesData[i] = linesData[i + 1];
} }
if (levels) {
// Level information merges back onto previous line
int posAbove = pos - 1;
if (posAbove < 0)
posAbove = 0;
for (int j = posAbove; j < lines; j++) {
levels[j] = levels[j + 1];
}
}
lines--; lines--;
} }
@@ -233,9 +266,8 @@ int LineVector::LineFromPosition(int pos) {
return lines - 1; return lines - 1;
int lower = 0; int lower = 0;
int upper = lines; int upper = lines;
int middle = 0;
do { do {
middle = (upper + lower + 1) / 2; // Round high int middle = (upper + lower + 1) / 2; // Round high
if (pos < linesData[middle].startPosition) { if (pos < linesData[middle].startPosition) {
upper = middle - 1; upper = middle - 1;
} else { } else {
@@ -260,11 +292,12 @@ int LineVector::AddMark(int line, int markerNum) {
} }
void LineVector::MergeMarkers(int pos) { void LineVector::MergeMarkers(int pos) {
if (linesData[pos].handleSet || linesData[pos + 1].handleSet) { if (linesData[pos + 1].handleSet != NULL) {
if (linesData[pos].handleSet && linesData[pos + 1].handleSet) { if (linesData[pos].handleSet == NULL )
linesData[pos].handleSet->CombineWith(linesData[pos].handleSet); linesData[pos].handleSet = new MarkerHandleSet;
linesData[pos].handleSet = 0; linesData[pos].handleSet->CombineWith(linesData[pos + 1].handleSet);
} delete linesData[pos + 1].handleSet;
linesData[pos + 1].handleSet = NULL;
} }
} }
@@ -316,12 +349,13 @@ Action::~Action() {
Destroy(); Destroy();
} }
void Action::Create(actionType at_, int position_, char *data_, int lenData_) { void Action::Create(actionType at_, int position_, char *data_, int lenData_, bool mayCoalesce_) {
delete []data; delete []data;
position = position_; position = position_;
at = at_; at = at_;
data = data_; data = data_;
lenData = lenData_; lenData = lenData_;
mayCoalesce = mayCoalesce_;
} }
void Action::Destroy() { void Action::Destroy() {
@@ -336,12 +370,207 @@ void Action::Grab(Action *source) {
at = source->at; at = source->at;
data = source->data; data = source->data;
lenData = source->lenData; lenData = source->lenData;
mayCoalesce = source->mayCoalesce;
// Ownership of source data transferred to this // Ownership of source data transferred to this
source->position = 0; source->position = 0;
source->at = startAction; source->at = startAction;
source->data = 0; source->data = 0;
source->lenData = 0; source->lenData = 0;
source->mayCoalesce = true;
}
// The undo history stores a sequence of user operations that represent the user's view of the
// commands executed on the text.
// Each user operation contains a sequence of text insertion and text deletion actions.
// All the user operations are stored in a list of individual actions with 'start' actions used
// as delimiters between user operations.
// Initially there is one start action in the history.
// As each action is performed, it is recorded in the history. The action may either become
// part of the current user operation or may start a new user operation. If it is to be part of the
// current operation, then it overwrites the current last action. If it is to be part of a new
// operation, it is appended after the current last action.
// After writing the new action, a new start action is appended at the end of the history.
// The decision of whether to start a new user operation is based upon two factors. If a
// compound operation has been explicitly started by calling BeginUndoAction and no matching
// EndUndoAction (these calls nest) has been called, then the action is coalesced into the current
// operation. If there is no outstanding BeginUndoAction call then a new operation is started
// unless it looks as if the new action is caused by the user typing or deleting a stream of text.
// Sequences that look like typing or deletion are coalesced into a single user operation.
UndoHistory::UndoHistory() {
lenActions = 100;
actions = new Action[lenActions];
maxAction = 0;
currentAction = 0;
undoSequenceDepth = 0;
savePoint = 0;
actions[currentAction].Create(startAction);
}
UndoHistory::~UndoHistory() {
delete []actions;
actions = 0;
}
void UndoHistory::EnsureUndoRoom() {
//Platform::DebugPrintf("%% %d action %d %d %d\n", at, position, length, currentAction);
if (currentAction >= 2) {
// Have to test that there is room for 2 more actions in the array
// as two actions may be created by this function
if (currentAction >= (lenActions - 2)) {
// Run out of undo nodes so extend the array
int lenActionsNew = lenActions * 2;
Action *actionsNew = new Action[lenActionsNew];
if (!actionsNew)
return ;
for (int act = 0; act <= currentAction; act++)
actionsNew[act].Grab(&actions[act]);
delete []actions;
lenActions = lenActionsNew;
actions = actionsNew;
}
}
}
void UndoHistory::AppendAction(actionType at, int position, char *data, int lengthData) {
EnsureUndoRoom();
//Platform::DebugPrintf("%% %d action %d %d %d\n", at, position, lengthData, currentAction);
//Platform::DebugPrintf("^ %d action %d %d\n", actions[currentAction - 1].at,
// actions[currentAction - 1].position, actions[currentAction - 1].lenData);
if (currentAction >= 1) {
if (0 == undoSequenceDepth) {
// Top level actions may not always be coalesced
Action &actPrevious = actions[currentAction - 1];
// See if current action can be coalesced into previous action
// Will work if both are inserts or deletes and position is same
if (at != actPrevious.at) {
currentAction++;
} else if (currentAction == savePoint) {
currentAction++;
} else if ((at == removeAction) &&
((position + lengthData * 2) != actPrevious.position)) {
// Removals must be at same position to coalesce
currentAction++;
} else if ((at == insertAction) &&
(position != (actPrevious.position + actPrevious.lenData*2))) {
// Insertions must be immediately after to coalesce
currentAction++;
} else {
//Platform::DebugPrintf("action coalesced\n");
}
} else {
// Actions not at top level are always coalesced unless this is after return to top level
if (!actions[currentAction].mayCoalesce)
currentAction++;
}
} else {
currentAction++;
}
actions[currentAction].Create(at, position, data, lengthData);
currentAction++;
actions[currentAction].Create(startAction);
maxAction = currentAction;
}
void UndoHistory::BeginUndoAction() {
EnsureUndoRoom();
if (undoSequenceDepth == 0) {
if (actions[currentAction].at != startAction) {
currentAction++;
actions[currentAction].Create(startAction);
maxAction = currentAction;
}
actions[currentAction].mayCoalesce = false;
}
undoSequenceDepth++;
}
void UndoHistory::EndUndoAction() {
EnsureUndoRoom();
undoSequenceDepth--;
if (0 == undoSequenceDepth) {
if (actions[currentAction].at != startAction) {
currentAction++;
actions[currentAction].Create(startAction);
maxAction = currentAction;
}
actions[currentAction].mayCoalesce = false;
}
}
void UndoHistory::DropUndoSequence() {
undoSequenceDepth = 0;
}
void UndoHistory::DeleteUndoHistory() {
for (int i = 1; i < maxAction; i++)
actions[i].Destroy();
maxAction = 0;
currentAction = 0;
actions[currentAction].Create(startAction);
savePoint = 0;
}
void UndoHistory::SetSavePoint() {
savePoint = currentAction;
}
bool UndoHistory::IsSavePoint() const {
return savePoint == currentAction;
}
bool UndoHistory::CanUndo() const {
return (currentAction > 0) && (maxAction > 0);
}
int UndoHistory::StartUndo() {
// Drop any trailing startAction
if (actions[currentAction].at == startAction && currentAction > 0)
currentAction--;
// Count the steps in this action
int act = currentAction;
while (actions[act].at != startAction && act > 0) {
act--;
}
return currentAction - act;
}
const Action &UndoHistory::GetUndoStep() const {
return actions[currentAction];
}
void UndoHistory::CompletedUndoStep() {
currentAction--;
}
bool UndoHistory::CanRedo() const {
return maxAction > currentAction;
}
int UndoHistory::StartRedo() {
// Drop any leading startAction
if (actions[currentAction].at == startAction && currentAction < maxAction)
currentAction++;
// Count the steps in this action
int act = currentAction;
while (actions[act].at != startAction && act < maxAction) {
act++;
}
return act - currentAction;
}
const Action &UndoHistory::GetRedoStep() const {
return actions[currentAction];
}
void UndoHistory::CompletedRedoStep() {
currentAction++;
} }
CellBuffer::CellBuffer(int initialLength) { CellBuffer::CellBuffer(int initialLength) {
@@ -352,28 +581,17 @@ CellBuffer::CellBuffer(int initialLength) {
gaplen = initialLength; gaplen = initialLength;
part2body = body + gaplen; part2body = body + gaplen;
readOnly = false; readOnly = false;
collectingUndo = true;
lenActions = 100;
actions = new Action[lenActions];
maxAction = 0;
currentAction = 0;
collectingUndo = undoCollectAutoStart;
undoSequenceDepth = 0;
savePoint = 0;
actions[currentAction].Create(startAction);
} }
CellBuffer::~CellBuffer() { CellBuffer::~CellBuffer() {
delete []body; delete []body;
body = 0; body = 0;
delete []actions;
actions = 0;
} }
void CellBuffer::GapTo(int position) { void CellBuffer::GapTo(int position) {
if (position == part1len) if (position == part1len)
return; return ;
if (position < part1len) { if (position < part1len) {
int diff = part1len - position; int diff = part1len - position;
//Platform::DebugPrintf("Move gap backwards to %d diff = %d part1len=%d length=%d \n", position,diff, part1len, length); //Platform::DebugPrintf("Move gap backwards to %d diff = %d part1len=%d length=%d \n", position,diff, part1len, length);
@@ -405,6 +623,7 @@ void CellBuffer::RoomFor(int insertionLength) {
size = newSize; size = newSize;
//Platform::DebugPrintf("end need room %d %d - size=%d length=%d\n", gaplen, insertionLength,size,length); //Platform::DebugPrintf("end need room %d %d - size=%d length=%d\n", gaplen, insertionLength,size,length);
} }
} }
// To make it easier to write code that uses ByteAt, a position outside the range of the buffer // To make it easier to write code that uses ByteAt, a position outside the range of the buffer
@@ -429,16 +648,16 @@ void CellBuffer::SetByteAt(int position, char ch) {
if (position < 0) { if (position < 0) {
//Platform::DebugPrintf("Bad position %d\n",position); //Platform::DebugPrintf("Bad position %d\n",position);
return; return ;
} }
if (position >= length + 11) { if (position >= length + 11) {
Platform::DebugPrintf("Very Bad position %d of %d\n", position, length); Platform::DebugPrintf("Very Bad position %d of %d\n", position, length);
//exit(2); //exit(2);
return; return ;
} }
if (position >= length) { if (position >= length) {
//Platform::DebugPrintf("Bad position %d of %d\n",position,length); //Platform::DebugPrintf("Bad position %d of %d\n",position,length);
return; return ;
} }
if (position < part1len) { if (position < part1len) {
@@ -454,20 +673,20 @@ char CellBuffer::CharAt(int position) {
void CellBuffer::GetCharRange(char *buffer, int position, int lengthRetrieve) { void CellBuffer::GetCharRange(char *buffer, int position, int lengthRetrieve) {
if (lengthRetrieve < 0) if (lengthRetrieve < 0)
return; return ;
if (position < 0) if (position < 0)
return; return ;
int bytePos = position * 2; int bytePos = position * 2;
if ((bytePos + lengthRetrieve * 2) > length) { if ((bytePos + lengthRetrieve * 2) > length) {
Platform::DebugPrintf("Bad GetCharRange %d for %d of %d\n",bytePos, Platform::DebugPrintf("Bad GetCharRange %d for %d of %d\n", bytePos,
lengthRetrieve, length); lengthRetrieve, length);
return; return ;
} }
GapTo(0); // Move the buffer so its easy to subscript into it GapTo(0); // Move the buffer so its easy to subscript into it
char *pb = part2body + bytePos; char *pb = part2body + bytePos;
while (lengthRetrieve--) { while (lengthRetrieve--) {
*buffer++ = *pb; *buffer++ = *pb;
pb +=2; pb += 2;
} }
} }
@@ -486,7 +705,7 @@ const char *CellBuffer::InsertString(int position, char *s, int insertLength) {
for (int i = 0; i < insertLength / 2; i++) { for (int i = 0; i < insertLength / 2; i++) {
data[i] = s[i * 2]; data[i] = s[i * 2];
} }
AppendAction(insertAction, position, data, insertLength / 2); uh.AppendAction(insertAction, position, data, insertLength / 2);
} }
BasicInsertString(position, s, insertLength); BasicInsertString(position, s, insertLength);
@@ -502,9 +721,9 @@ void CellBuffer::InsertCharStyle(int position, char ch, char style) {
} }
bool CellBuffer::SetStyleAt(int position, char style, char mask) { bool CellBuffer::SetStyleAt(int position, char style, char mask) {
char curVal = ByteAt(position*2 + 1); char curVal = ByteAt(position * 2 + 1);
if ((curVal & mask) != style) { if ((curVal & mask) != style) {
SetByteAt(position*2 + 1, (curVal & ~mask) | style); SetByteAt(position*2 + 1, static_cast<char>((curVal & ~mask) | style));
return true; return true;
} else { } else {
return false; return false;
@@ -517,7 +736,7 @@ bool CellBuffer::SetStyleFor(int position, int lengthStyle, char style, char mas
while (lengthStyle--) { while (lengthStyle--) {
char curVal = ByteAt(bytePos); char curVal = ByteAt(bytePos);
if ((curVal & mask) != style) { if ((curVal & mask) != style) {
SetByteAt(bytePos, (curVal & ~mask) | style); SetByteAt(bytePos, static_cast<char>((curVal & ~mask) | style));
changed = true; changed = true;
} }
bytePos += 2; bytePos += 2;
@@ -525,48 +744,6 @@ bool CellBuffer::SetStyleFor(int position, int lengthStyle, char style, char mas
return changed; return changed;
} }
void CellBuffer::EnsureUndoRoom() {
//Platform::DebugPrintf("%% %d action %d %d %d\n", at, position, length, currentAction);
if (currentAction >= 2) {
// Have to test that there is room for 2 more actions in the array
// as two actions may be created by this function
if (currentAction >= (lenActions - 2)) {
// Run out of undo nodes so extend the array
int lenActionsNew = lenActions * 2;
Action *actionsNew = new Action[lenActionsNew];
if (!actionsNew)
return;
for (int act = 0; act <= currentAction; act++)
actionsNew[act].Grab(&actions[act]);
delete []actions;
lenActions = lenActionsNew;
actions = actionsNew;
}
}
}
void CellBuffer::AppendAction(actionType at, int position, char *data, int lengthData) {
EnsureUndoRoom();
//Platform::DebugPrintf("%% %d action %d %d %d\n", at, position, lengthData, currentAction);
if (currentAction >= 2) {
// See if current action can be coalesced into previous action
// Will work if both are inserts or deletes and position is same or two different
if ((at != actions[currentAction - 1].at) || (abs(position - actions[currentAction - 1].position) > 2)) {
currentAction++;
} else if (currentAction == savePoint) {
currentAction++;
}
} else {
currentAction++;
}
actions[currentAction].Create(at, position, data, lengthData);
if ((collectingUndo == undoCollectAutoStart) && (0 == undoSequenceDepth)) {
currentAction++;
actions[currentAction].Create(startAction);
}
maxAction = currentAction;
}
const char *CellBuffer::DeleteChars(int position, int deleteLength) { const char *CellBuffer::DeleteChars(int position, int deleteLength) {
// InsertString and DeleteChars are the bottleneck though which all changes occur // InsertString and DeleteChars are the bottleneck though which all changes occur
char *data = 0; char *data = 0;
@@ -577,7 +754,7 @@ const char *CellBuffer::DeleteChars(int position, int deleteLength) {
for (int i = 0; i < deleteLength / 2; i++) { for (int i = 0; i < deleteLength / 2; i++) {
data[i] = ByteAt(position + i * 2); data[i] = ByteAt(position + i * 2);
} }
AppendAction(removeAction, position, data, deleteLength / 2); uh.AppendAction(removeAction, position, data, deleteLength / 2);
} }
BasicDeleteChars(position, deleteLength); BasicDeleteChars(position, deleteLength);
@@ -616,11 +793,11 @@ void CellBuffer::SetReadOnly(bool set) {
} }
void CellBuffer::SetSavePoint() { void CellBuffer::SetSavePoint() {
savePoint = currentAction; uh.SetSavePoint();
} }
bool CellBuffer::IsSavePoint() { bool CellBuffer::IsSavePoint() {
return savePoint == currentAction; return uh.IsSavePoint();
} }
int CellBuffer::AddMark(int line, int markerNum) { int CellBuffer::AddMark(int line, int markerNum) {
@@ -661,7 +838,7 @@ int CellBuffer::LineFromHandle(int markerHandle) {
void CellBuffer::BasicInsertString(int position, char *s, int insertLength) { void CellBuffer::BasicInsertString(int position, char *s, int insertLength) {
//Platform::DebugPrintf("Inserting at %d for %d\n", position, insertLength); //Platform::DebugPrintf("Inserting at %d for %d\n", position, insertLength);
if (insertLength == 0) if (insertLength == 0)
return; return ;
RoomFor(insertLength); RoomFor(insertLength);
GapTo(position); GapTo(position);
@@ -721,7 +898,7 @@ void CellBuffer::BasicInsertString(int position, char *s, int insertLength) {
void CellBuffer::BasicDeleteChars(int position, int deleteLength) { void CellBuffer::BasicDeleteChars(int position, int deleteLength) {
//Platform::DebugPrintf("Deleting at %d for %d\n", position, deleteLength); //Platform::DebugPrintf("Deleting at %d for %d\n", position, deleteLength);
if (deleteLength == 0) if (deleteLength == 0)
return; return ;
if ((position == 0) && (deleteLength == length)) { if ((position == 0) && (deleteLength == length)) {
// If whole buffer is being deleted, faster to reinitialise lines data // If whole buffer is being deleted, faster to reinitialise lines data
@@ -753,6 +930,7 @@ void CellBuffer::BasicDeleteChars(int position, int deleteLength) {
ignoreNL = true; // First \n is not real deletion ignoreNL = true; // First \n is not real deletion
} }
char ch = chNext; char ch = chNext;
for (int i = 0; i < deleteLength; i += 2) { for (int i = 0; i < deleteLength; i += 2) {
chNext = ' '; chNext = ' ';
@@ -770,6 +948,7 @@ void CellBuffer::BasicDeleteChars(int position, int deleteLength) {
ignoreNL = false; // Further \n are not real deletions ignoreNL = false; // Further \n are not real deletions
} }
ch = chNext; ch = chNext;
} }
// May have to fix up end if last deletion causes cr to be next to lf // May have to fix up end if last deletion causes cr to be next to lf
@@ -790,9 +969,9 @@ void CellBuffer::BasicDeleteChars(int position, int deleteLength) {
part2body = body + gaplen; part2body = body + gaplen;
} }
undoCollectionType CellBuffer::SetUndoCollection(undoCollectionType collectUndo) { bool CellBuffer::SetUndoCollection(bool collectUndo) {
collectingUndo = collectUndo; collectingUndo = collectUndo;
undoSequenceDepth = 0; uh.DropUndoSequence();
return collectingUndo; return collectingUndo;
} }
@@ -800,116 +979,72 @@ bool CellBuffer::IsCollectingUndo() {
return collectingUndo; return collectingUndo;
} }
void CellBuffer::AppendUndoStartAction() {
EnsureUndoRoom();
// Finish any currently active undo sequence
undoSequenceDepth = 0;
if (actions[currentAction].at != startAction) {
undoSequenceDepth++;
currentAction++;
actions[currentAction].Create(startAction);
maxAction = currentAction;
}
}
void CellBuffer::BeginUndoAction() { void CellBuffer::BeginUndoAction() {
EnsureUndoRoom(); uh.BeginUndoAction();
if (undoSequenceDepth == 0) {
if (actions[currentAction].at != startAction) {
currentAction++;
actions[currentAction].Create(startAction);
maxAction = currentAction;
}
}
undoSequenceDepth++;
} }
void CellBuffer::EndUndoAction() { void CellBuffer::EndUndoAction() {
EnsureUndoRoom(); uh.EndUndoAction();
undoSequenceDepth--;
if (0 == undoSequenceDepth) {
if (actions[currentAction].at != startAction) {
currentAction++;
actions[currentAction].Create(startAction);
maxAction = currentAction;
}
}
} }
void CellBuffer::DeleteUndoHistory() { void CellBuffer::DeleteUndoHistory() {
for (int i = 1; i < maxAction; i++) uh.DeleteUndoHistory();
actions[i].Destroy();
maxAction = 0;
currentAction = 0;
savePoint = 0;
} }
bool CellBuffer::CanUndo() { bool CellBuffer::CanUndo() {
return (!readOnly) && ((currentAction > 0) && (maxAction > 0)); return (!readOnly) && (uh.CanUndo());
} }
int CellBuffer::StartUndo() { int CellBuffer::StartUndo() {
// Drop any trailing startAction return uh.StartUndo();
if (actions[currentAction].at == startAction && currentAction > 0)
currentAction--;
// Count the steps in this action
int act = currentAction;
while (actions[act].at != startAction && act > 0) {
act--;
}
return currentAction - act;
} }
const Action &CellBuffer::UndoStep() { const Action &CellBuffer::GetUndoStep() const {
const Action &actionStep = actions[currentAction]; return uh.GetUndoStep();
}
void CellBuffer::PerformUndoStep() {
const Action &actionStep = uh.GetUndoStep();
if (actionStep.at == insertAction) { if (actionStep.at == insertAction) {
BasicDeleteChars(actionStep.position, actionStep.lenData*2); BasicDeleteChars(actionStep.position, actionStep.lenData*2);
} else if (actionStep.at == removeAction) { } else if (actionStep.at == removeAction) {
char *styledData = new char[actionStep.lenData * 2]; char *styledData = new char[actionStep.lenData * 2];
for (int i = 0; i < actionStep.lenData; i++) { for (int i = 0; i < actionStep.lenData; i++) {
styledData[i*2] = actionStep.data[i]; styledData[i*2] = actionStep.data[i];
styledData[i*2+1] = 0; styledData[i*2 + 1] = 0;
} }
BasicInsertString(actionStep.position, styledData, actionStep.lenData*2); BasicInsertString(actionStep.position, styledData, actionStep.lenData*2);
delete []styledData; delete []styledData;
} }
currentAction--; uh.CompletedUndoStep();
return actionStep;
} }
bool CellBuffer::CanRedo() { bool CellBuffer::CanRedo() {
return (!readOnly) && (maxAction > currentAction); return (!readOnly) && (uh.CanRedo());
} }
int CellBuffer::StartRedo() { int CellBuffer::StartRedo() {
// Drop any leading startAction return uh.StartRedo();
if (actions[currentAction].at == startAction && currentAction < maxAction)
currentAction++;
// Count the steps in this action
int act = currentAction;
while (actions[act].at != startAction && act < maxAction) {
act++;
}
return act - currentAction;
} }
const Action &CellBuffer::RedoStep() { const Action &CellBuffer::GetRedoStep() const {
const Action &actionStep = actions[currentAction]; return uh.GetRedoStep();
}
void CellBuffer::PerformRedoStep() {
const Action &actionStep = uh.GetRedoStep();
if (actionStep.at == insertAction) { if (actionStep.at == insertAction) {
char *styledData = new char[actionStep.lenData * 2]; char *styledData = new char[actionStep.lenData * 2];
for (int i = 0; i < actionStep.lenData; i++) { for (int i = 0; i < actionStep.lenData; i++) {
styledData[i*2] = actionStep.data[i]; styledData[i*2] = actionStep.data[i];
styledData[i*2+1] = 0; styledData[i*2 + 1] = 0;
} }
BasicInsertString(actionStep.position, styledData, actionStep.lenData*2); BasicInsertString(actionStep.position, styledData, actionStep.lenData*2);
delete []styledData; delete []styledData;
} else if (actionStep.at == removeAction) { } else if (actionStep.at == removeAction) {
BasicDeleteChars(actionStep.position, actionStep.lenData*2); BasicDeleteChars(actionStep.position, actionStep.lenData*2);
} }
currentAction++; uh.CompletedRedoStep();
return actionStep;
} }
int CellBuffer::SetLineState(int line, int state) { int CellBuffer::SetLineState(int line, int state) {
@@ -948,3 +1083,6 @@ int CellBuffer::GetLevel(int line) {
} }
} }
void CellBuffer::ClearLevels() {
lv.ClearLevels();
}

View File

@@ -58,6 +58,7 @@ public:
void Expand(int sizeNew); void Expand(int sizeNew);
void ExpandLevels(int sizeNew=-1); void ExpandLevels(int sizeNew=-1);
void ClearLevels();
void InsertValue(int pos, int value); void InsertValue(int pos, int value);
void SetValue(int pos, int value); void SetValue(int pos, int value);
void Remove(int pos); void Remove(int pos);
@@ -79,15 +80,52 @@ public:
int position; int position;
char *data; char *data;
int lenData; int lenData;
bool mayCoalesce;
Action(); Action();
~Action(); ~Action();
void Create(actionType at_, int position_=0, char *data_=0, int lenData_=0); void Create(actionType at_, int position_=0, char *data_=0, int lenData_=0, bool mayCoalesce_=true);
void Destroy(); void Destroy();
void Grab(Action *source); void Grab(Action *source);
}; };
enum undoCollectionType { undoCollectNone, undoCollectAutoStart, undoCollectManualStart }; class UndoHistory {
Action *actions;
int lenActions;
int maxAction;
int currentAction;
int undoSequenceDepth;
int savePoint;
void EnsureUndoRoom();
public:
UndoHistory();
~UndoHistory();
void AppendAction(actionType at, int position, char *data, int length);
void BeginUndoAction();
void EndUndoAction();
void DropUndoSequence();
void DeleteUndoHistory();
// The save point is a marker in the undo stack where the container has stated that
// the buffer was saved. Undo and redo can move over the save point.
void SetSavePoint();
bool IsSavePoint() const;
// To perform an undo, StartUndo is called to retrieve the number of steps, then UndoStep is
// called that many times. Similarly for redo.
bool CanUndo() const;
int StartUndo();
const Action &GetUndoStep() const;
void CompletedUndoStep();
bool CanRedo() const;
int StartRedo();
const Action &GetRedoStep() const;
void CompletedRedoStep();
};
// Holder for an expandable array of characters that supports undo and line markers // Holder for an expandable array of characters that supports undo and line markers
// Based on article "Data Structures in a Bit-Mapped Text Editor" // Based on article "Data Structures in a Bit-Mapped Text Editor"
@@ -102,24 +140,16 @@ private:
char *part2body; char *part2body;
bool readOnly; bool readOnly;
Action *actions; bool collectingUndo;
int lenActions; UndoHistory uh;
int maxAction;
int currentAction;
undoCollectionType collectingUndo;
int undoSequenceDepth;
int savePoint;
LineVector lv; LineVector lv;
SVector<int, 4000> lineStates; SVector lineStates;
void GapTo(int position); void GapTo(int position);
void RoomFor(int insertionLength); void RoomFor(int insertionLength);
void EnsureUndoRoom();
void AppendAction(actionType at, int position, char *data, int length);
inline char ByteAt(int position); inline char ByteAt(int position);
void SetByteAt(int position, char ch); void SetByteAt(int position, char ch);
@@ -143,7 +173,7 @@ public:
// Setting styles for positions outside the range of the buffer is safe and has no effect. // Setting styles for positions outside the range of the buffer is safe and has no effect.
// True is returned if the style of a character changed. // True is returned if the style of a character changed.
bool SetStyleAt(int position, char style, char mask=(char)0xff); bool SetStyleAt(int position, char style, char mask='\377');
bool SetStyleFor(int position, int length, char style, char mask); bool SetStyleFor(int position, int length, char style, char mask);
const char *DeleteChars(int position, int deleteLength); const char *DeleteChars(int position, int deleteLength);
@@ -168,21 +198,22 @@ public:
void BasicInsertString(int position, char *s, int insertLength); void BasicInsertString(int position, char *s, int insertLength);
void BasicDeleteChars(int position, int deleteLength); void BasicDeleteChars(int position, int deleteLength);
undoCollectionType SetUndoCollection(undoCollectionType collectUndo); bool SetUndoCollection(bool collectUndo);
bool IsCollectingUndo(); bool IsCollectingUndo();
void AppendUndoStartAction();
void BeginUndoAction(); void BeginUndoAction();
void EndUndoAction(); void EndUndoAction();
void DeleteUndoHistory(); void DeleteUndoHistory();
// To perform an undo, StartUndo is called to retreive the number of steps, then UndoStep is // To perform an undo, StartUndo is called to retrieve the number of steps, then UndoStep is
// called that many times. Similarly for redo. // called that many times. Similarly for redo.
bool CanUndo(); bool CanUndo();
int StartUndo(); int StartUndo();
const Action &UndoStep(); const Action &GetUndoStep() const;
void PerformUndoStep();
bool CanRedo(); bool CanRedo();
int StartRedo(); int StartRedo();
const Action &RedoStep(); const Action &GetRedoStep() const;
void PerformRedoStep();
int SetLineState(int line, int state); int SetLineState(int line, int state);
int GetLineState(int line); int GetLineState(int line);
@@ -190,6 +221,7 @@ public:
int SetLevel(int line, int level); int SetLevel(int line, int level);
int GetLevel(int line); int GetLevel(int line);
void ClearLevels();
}; };
#define CELL_SIZE 2 #define CELL_SIZE 2

View File

@@ -30,7 +30,6 @@ void ContractionState::MakeValid() const {
if (!valid) { if (!valid) {
// Could be cleverer by keeping the index of the last still valid entry // Could be cleverer by keeping the index of the last still valid entry
// rather than invalidating all. // rather than invalidating all.
int linePrev = -1;
int lineDisplay = 0; int lineDisplay = 0;
for (int line=0; line<linesInDoc; line++) { for (int line=0; line<linesInDoc; line++) {
lines[line].displayLine = lineDisplay; lines[line].displayLine = lineDisplay;
@@ -108,12 +107,12 @@ void ContractionState::InsertLines(int lineDoc, int lineCount) {
return; return;
} }
//Platform::DebugPrintf("InsertLine[%d] = %d\n", lineDoc); //Platform::DebugPrintf("InsertLine[%d] = %d\n", lineDoc);
if ((linesInDoc + 2) >= size) { if ((linesInDoc + lineCount + 2) >= size) {
Grow(size + growSize); Grow(linesInDoc + lineCount + growSize);
} }
linesInDoc += lineCount; linesInDoc += lineCount;
linesInDisplay += lineCount; linesInDisplay += lineCount;
for (int i = linesInDoc + 1; i >= lineDoc + lineCount; i--) { for (int i = linesInDoc; i >= lineDoc + lineCount; i--) {
lines[i].visible = lines[i - lineCount].visible; lines[i].visible = lines[i - lineCount].visible;
lines[i].expanded = lines[i - lineCount].expanded; lines[i].expanded = lines[i - lineCount].expanded;
} }
@@ -130,16 +129,18 @@ void ContractionState::DeleteLines(int lineDoc, int lineCount) {
linesInDisplay -= lineCount; linesInDisplay -= lineCount;
return; return;
} }
int delta = 0; int deltaDisplayed = 0;
for (int d=0;d<lineCount;d++) for (int d=0;d<lineCount;d++) {
if (lines[lineDoc+d].visible) if (lines[lineDoc+d].visible)
delta--; deltaDisplayed--;
}
for (int i = lineDoc; i < linesInDoc-lineCount; i++) { for (int i = lineDoc; i < linesInDoc-lineCount; i++) {
lines[i].visible = lines[i + lineCount].visible; if (i != 0) // Line zero is always visible
lines[i].visible = lines[i + lineCount].visible;
lines[i].expanded = lines[i + lineCount].expanded; lines[i].expanded = lines[i + lineCount].expanded;
} }
linesInDoc -= lineCount; linesInDoc -= lineCount;
linesInDisplay += delta; linesInDisplay += deltaDisplayed;
valid = false; valid = false;
} }
@@ -154,8 +155,12 @@ bool ContractionState::GetVisible(int lineDoc) const {
} }
bool ContractionState::SetVisible(int lineDocStart, int lineDocEnd, bool visible) { bool ContractionState::SetVisible(int lineDocStart, int lineDocEnd, bool visible) {
if (lineDocStart == 0)
lineDocStart++;
if (lineDocStart > lineDocEnd)
return false;
if (size == 0) { if (size == 0) {
Grow(lineDocEnd + growSize); Grow(linesInDoc + growSize);
} }
// TODO: modify docLine members to mirror displayLine // TODO: modify docLine members to mirror displayLine
int delta = 0; int delta = 0;
@@ -166,12 +171,6 @@ bool ContractionState::SetVisible(int lineDocStart, int lineDocEnd, bool visible
delta += visible ? 1 : -1; delta += visible ? 1 : -1;
lines[line].visible = visible; lines[line].visible = visible;
} }
lines[line].displayLine += delta;
}
if (delta != 0) {
for (int line=lineDocEnd+1; line <= linesInDoc; line++) {
lines[line].displayLine += delta;
}
} }
} }
linesInDisplay += delta; linesInDisplay += delta;
@@ -191,7 +190,7 @@ bool ContractionState::GetExpanded(int lineDoc) const {
bool ContractionState::SetExpanded(int lineDoc, bool expanded) { bool ContractionState::SetExpanded(int lineDoc, bool expanded) {
if (size == 0) { if (size == 0) {
Grow(lineDoc + growSize); Grow(linesInDoc + growSize);
} }
if ((lineDoc >= 0) && (lineDoc < linesInDoc)) { if ((lineDoc >= 0) && (lineDoc < linesInDoc)) {
if (lines[lineDoc].expanded != expanded) { if (lines[lineDoc].expanded != expanded) {
@@ -201,3 +200,9 @@ bool ContractionState::SetExpanded(int lineDoc, bool expanded) {
} }
return false; return false;
} }
void ContractionState::ShowAll() {
delete []lines;
lines = 0;
size = 0;
}

View File

@@ -45,6 +45,8 @@ public:
bool GetExpanded(int lineDoc) const; bool GetExpanded(int lineDoc) const;
bool SetExpanded(int lineDoc, bool expanded); bool SetExpanded(int lineDoc, bool expanded);
void ShowAll();
}; };
#endif #endif

View File

@@ -32,7 +32,10 @@ Document::Document() {
} }
endStyled = 0; endStyled = 0;
enteredCount = 0; enteredCount = 0;
enteredReadOnlyCount = 0;
tabInChars = 8; tabInChars = 8;
indentInChars = 0;
useTabs = true;
watchers = 0; watchers = 0;
lenWatchers = 0; lenWatchers = 0;
} }
@@ -51,7 +54,7 @@ int Document::AddRef() {
return refCount++; return refCount++;
} }
// Decrease reference count and return its provius value. // Decrease reference count and return its previous value.
// Delete the document if reference count reaches zero. // Delete the document if reference count reaches zero.
int Document::Release() { int Document::Release() {
int curRefCount = --refCount; int curRefCount = --refCount;
@@ -65,26 +68,54 @@ void Document::SetSavePoint() {
NotifySavePoint(true); NotifySavePoint(true);
} }
int Document::AddMark(int line, int markerNum) {
int prev = cb.AddMark(line, markerNum);
DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0);
NotifyModified(mh);
return prev;
}
void Document::DeleteMark(int line, int markerNum) {
cb.DeleteMark(line, markerNum);
DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0);
NotifyModified(mh);
}
void Document::DeleteMarkFromHandle(int markerHandle) {
cb.DeleteMarkFromHandle(markerHandle);
DocModification mh(SC_MOD_CHANGEMARKER, 0, 0, 0, 0);
NotifyModified(mh);
}
void Document::DeleteAllMarks(int markerNum) {
cb.DeleteAllMarks(markerNum);
DocModification mh(SC_MOD_CHANGEMARKER, 0, 0, 0, 0);
NotifyModified(mh);
}
int Document::LineStart(int line) { int Document::LineStart(int line) {
return cb.LineStart(line); return cb.LineStart(line);
} }
int Document::LineEnd(int line) {
if (line == LinesTotal() - 1) {
return LineStart(line + 1);
} else {
int position = LineStart(line + 1) - 1;
// When line terminator is CR+LF, may need to go back one more
if ((position > LineStart(line)) && (cb.CharAt(position - 1) == '\r')) {
position--;
}
return position;
}
}
int Document::LineFromPosition(int pos) { int Document::LineFromPosition(int pos) {
return cb.LineFromPosition(pos); return cb.LineFromPosition(pos);
} }
int Document::LineEndPosition(int position) { int Document::LineEndPosition(int position) {
int line = LineFromPosition(position); return LineEnd(LineFromPosition(position));
if (line == LinesTotal() - 1) {
position = LineStart(line + 1);
} else {
position = LineStart(line + 1) - 1;
// When line terminator is CR+LF, may need to go back one more
if ((position > LineStart(line)) && (cb.CharAt(position - 1) == '\r')) {
position--;
}
}
return position;
} }
int Document::VCHomePosition(int position) { int Document::VCHomePosition(int position) {
@@ -124,7 +155,10 @@ int Document::GetLastChild(int lineParent, int level) {
level = GetLevel(lineParent) & SC_FOLDLEVELNUMBERMASK; level = GetLevel(lineParent) & SC_FOLDLEVELNUMBERMASK;
int maxLine = LinesTotal(); int maxLine = LinesTotal();
int lineMaxSubord = lineParent; int lineMaxSubord = lineParent;
while ((lineMaxSubord < maxLine-1) && IsSubordinate(level, GetLevel(lineMaxSubord+1))) { while (lineMaxSubord < maxLine-1) {
EnsureStyledTo(LineStart(lineMaxSubord+2));
if (!IsSubordinate(level, GetLevel(lineMaxSubord+1)))
break;
lineMaxSubord++; lineMaxSubord++;
} }
if (lineMaxSubord > lineParent) { if (lineMaxSubord > lineParent) {
@@ -167,27 +201,58 @@ bool Document::IsCrLf(int pos) {
return (cb.CharAt(pos) == '\r') && (cb.CharAt(pos + 1) == '\n'); return (cb.CharAt(pos) == '\r') && (cb.CharAt(pos + 1) == '\n');
} }
bool Document::IsDBCS(int pos) {
#if PLAT_WIN #if PLAT_WIN
bool Document::IsDBCS(int pos) {
if (dbcsCodePage) { if (dbcsCodePage) {
// Anchor DBCS calculations at start of line because start of line can if (SC_CP_UTF8 == dbcsCodePage) {
// not be a DBCS trail byte. unsigned char ch = static_cast<unsigned char>(cb.CharAt(pos));
int startLine = pos; return ch >= 0x80;
while (startLine > 0 && cb.CharAt(startLine) != '\r' && cb.CharAt(startLine) != '\n') } else {
startLine--; // Anchor DBCS calculations at start of line because start of line can
while (startLine <= pos) { // not be a DBCS trail byte.
if (IsDBCSLeadByteEx(dbcsCodePage, cb.CharAt(startLine))) { int startLine = pos;
while (startLine > 0 && cb.CharAt(startLine) != '\r' && cb.CharAt(startLine) != '\n')
startLine--;
while (startLine <= pos) {
if (IsDBCSLeadByteEx(dbcsCodePage, cb.CharAt(startLine))) {
startLine++;
if (startLine >= pos)
return true;
}
startLine++; startLine++;
if (startLine >= pos)
return true;
} }
startLine++;
} }
} }
return false; return false;
}
#else #else
// PLAT_GTK or PLAT_WX
// TODO: support DBCS under GTK+ and WX
bool Document::IsDBCS(int) {
return false; return false;
}
#endif #endif
int Document::LenChar(int pos) {
if (IsCrLf(pos)) {
return 2;
} else if (SC_CP_UTF8 == dbcsCodePage) {
unsigned char ch = static_cast<unsigned char>(cb.CharAt(pos));
if (ch < 0x80)
return 1;
int len = 2;
if (ch >= (0x80+0x40+0x20))
len = 3;
int lengthDoc = Length();
if ((pos + len) > lengthDoc)
return lengthDoc-pos;
else
return len;
} else if (IsDBCS(pos)) {
return 2;
} else {
return 1;
}
} }
// Normalise a position so that it is not halfway through a two byte character. // Normalise a position so that it is not halfway through a two byte character.
@@ -221,29 +286,41 @@ int Document::MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd) {
#if PLAT_WIN #if PLAT_WIN
if (dbcsCodePage) { if (dbcsCodePage) {
// Anchor DBCS calculations at start of line because start of line can if (SC_CP_UTF8 == dbcsCodePage) {
// not be a DBCS trail byte. unsigned char ch = static_cast<unsigned char>(cb.CharAt(pos));
int startLine = pos; while ((pos > 0) && (pos < Length()) && (ch >= 0x80) && (ch < (0x80 + 0x40))) {
while (startLine > 0 && cb.CharAt(startLine) != '\r' && cb.CharAt(startLine) != '\n') // ch is a trail byte
startLine--; if (moveDir > 0)
bool atLeadByte = false; pos++;
while (startLine < pos) { else
if (atLeadByte) pos--;
atLeadByte = false; ch = static_cast<unsigned char>(cb.CharAt(pos));
else if (IsDBCSLeadByteEx(dbcsCodePage, cb.CharAt(startLine))) }
atLeadByte = true; } else {
else // Anchor DBCS calculations at start of line because start of line can
atLeadByte = false; // not be a DBCS trail byte.
startLine++; int startLine = pos;
//Platform::DebugPrintf("DBCS %s\n", atlead ? "D" : "-"); while (startLine > 0 && cb.CharAt(startLine) != '\r' && cb.CharAt(startLine) != '\n')
} startLine--;
bool atLeadByte = false;
while (startLine < pos) {
if (atLeadByte)
atLeadByte = false;
else if (IsDBCSLeadByteEx(dbcsCodePage, cb.CharAt(startLine)))
atLeadByte = true;
else
atLeadByte = false;
startLine++;
//Platform::DebugPrintf("DBCS %s\n", atlead ? "D" : "-");
}
if (atLeadByte) { if (atLeadByte) {
// Position is between a lead byte and a trail byte // Position is between a lead byte and a trail byte
if (moveDir > 0) if (moveDir > 0)
return pos + 1; return pos + 1;
else else
return pos - 1; return pos - 1;
}
} }
} }
#endif #endif
@@ -261,41 +338,62 @@ void Document::ModifiedAt(int pos) {
// Unlike Undo, Redo, and InsertStyledString, the pos argument is a cell number not a char number // Unlike Undo, Redo, and InsertStyledString, the pos argument is a cell number not a char number
void Document::DeleteChars(int pos, int len) { void Document::DeleteChars(int pos, int len) {
if ((pos + len) > Length())
return;
if (cb.IsReadOnly() && enteredReadOnlyCount==0) {
enteredReadOnlyCount++;
NotifyModifyAttempt();
enteredReadOnlyCount--;
}
if (enteredCount == 0) { if (enteredCount == 0) {
enteredCount++; enteredCount++;
if (cb.IsReadOnly())
NotifyModifyAttempt();
if (!cb.IsReadOnly()) { if (!cb.IsReadOnly()) {
NotifyModified(
DocModification(
SC_MOD_BEFOREDELETE | SC_PERFORMED_USER,
pos, len,
0, 0));
int prevLinesTotal = LinesTotal(); int prevLinesTotal = LinesTotal();
bool startSavePoint = cb.IsSavePoint(); bool startSavePoint = cb.IsSavePoint();
const char *text = cb.DeleteChars(pos*2, len * 2); const char *text = cb.DeleteChars(pos*2, len * 2);
if (startSavePoint && cb.IsCollectingUndo()) if (startSavePoint && cb.IsCollectingUndo())
NotifySavePoint(!startSavePoint); NotifySavePoint(!startSavePoint);
ModifiedAt(pos); ModifiedAt(pos);
int modFlags = SC_MOD_DELETETEXT | SC_PERFORMED_USER; NotifyModified(
DocModification mh(modFlags, pos, len, LinesTotal() - prevLinesTotal, text); DocModification(
NotifyModified(mh); SC_MOD_DELETETEXT | SC_PERFORMED_USER,
pos, len,
LinesTotal() - prevLinesTotal, text));
} }
enteredCount--; enteredCount--;
} }
} }
void Document::InsertStyledString(int position, char *s, int insertLength) { void Document::InsertStyledString(int position, char *s, int insertLength) {
if (cb.IsReadOnly() && enteredReadOnlyCount==0) {
enteredReadOnlyCount++;
NotifyModifyAttempt();
enteredReadOnlyCount--;
}
if (enteredCount == 0) { if (enteredCount == 0) {
enteredCount++; enteredCount++;
if (cb.IsReadOnly())
NotifyModifyAttempt();
if (!cb.IsReadOnly()) { if (!cb.IsReadOnly()) {
NotifyModified(
DocModification(
SC_MOD_BEFOREINSERT | SC_PERFORMED_USER,
position / 2, insertLength / 2,
0, 0));
int prevLinesTotal = LinesTotal(); int prevLinesTotal = LinesTotal();
bool startSavePoint = cb.IsSavePoint(); bool startSavePoint = cb.IsSavePoint();
const char *text = cb.InsertString(position, s, insertLength); const char *text = cb.InsertString(position, s, insertLength);
if (startSavePoint && cb.IsCollectingUndo()) if (startSavePoint && cb.IsCollectingUndo())
NotifySavePoint(!startSavePoint); NotifySavePoint(!startSavePoint);
ModifiedAt(position / 2); ModifiedAt(position / 2);
NotifyModified(
int modFlags = SC_MOD_INSERTTEXT | SC_PERFORMED_USER; DocModification(
DocModification mh(modFlags, position / 2, insertLength / 2, LinesTotal() - prevLinesTotal, text); SC_MOD_INSERTTEXT | SC_PERFORMED_USER,
NotifyModified(mh); position / 2, insertLength / 2,
LinesTotal() - prevLinesTotal, text));
} }
enteredCount--; enteredCount--;
} }
@@ -307,9 +405,18 @@ int Document::Undo() {
enteredCount++; enteredCount++;
bool startSavePoint = cb.IsSavePoint(); bool startSavePoint = cb.IsSavePoint();
int steps = cb.StartUndo(); int steps = cb.StartUndo();
//Platform::DebugPrintf("Steps=%d\n", steps);
for (int step=0; step<steps; step++) { for (int step=0; step<steps; step++) {
int prevLinesTotal = LinesTotal(); int prevLinesTotal = LinesTotal();
const Action &action = cb.UndoStep(); const Action &action = cb.GetUndoStep();
if (action.at == removeAction) {
NotifyModified(DocModification(
SC_MOD_BEFOREINSERT | SC_PERFORMED_UNDO, action));
} else {
NotifyModified(DocModification(
SC_MOD_BEFOREDELETE | SC_PERFORMED_UNDO, action));
}
cb.PerformUndoStep();
int cellPosition = action.position / 2; int cellPosition = action.position / 2;
ModifiedAt(cellPosition); ModifiedAt(cellPosition);
newPos = cellPosition; newPos = cellPosition;
@@ -344,10 +451,17 @@ int Document::Redo() {
int steps = cb.StartRedo(); int steps = cb.StartRedo();
for (int step=0; step<steps; step++) { for (int step=0; step<steps; step++) {
int prevLinesTotal = LinesTotal(); int prevLinesTotal = LinesTotal();
const Action &action = cb.RedoStep(); const Action &action = cb.GetRedoStep();
int cellPosition = action.position / 2; if (action.at == insertAction) {
ModifiedAt(cellPosition); NotifyModified(DocModification(
newPos = cellPosition; SC_MOD_BEFOREINSERT | SC_PERFORMED_REDO, action));
} else {
NotifyModified(DocModification(
SC_MOD_BEFOREDELETE | SC_PERFORMED_REDO, action));
}
cb.PerformRedoStep();
ModifiedAt(action.position / 2);
newPos = action.position / 2;
int modFlags = SC_PERFORMED_REDO; int modFlags = SC_PERFORMED_REDO;
if (action.at == insertAction) { if (action.at == insertAction) {
@@ -358,7 +472,8 @@ int Document::Redo() {
} }
if (step == steps-1) if (step == steps-1)
modFlags |= SC_LASTSTEPINUNDOREDO; modFlags |= SC_LASTSTEPINUNDOREDO;
NotifyModified(DocModification(modFlags, cellPosition, action.lenData, NotifyModified(
DocModification(modFlags, action.position / 2, action.lenData,
LinesTotal() - prevLinesTotal, action.data)); LinesTotal() - prevLinesTotal, action.data));
} }
@@ -395,14 +510,13 @@ void Document::InsertString(int position, const char *s, int insertLength) {
} }
} }
void Document::ChangeChar(int pos, char ch) {
DeleteChars(pos, 1);
InsertChar(pos, ch);
}
void Document::DelChar(int pos) { void Document::DelChar(int pos) {
if (IsCrLf(pos)) { DeleteChars(pos, LenChar(pos));
DeleteChars(pos, 2);
} else if (IsDBCS(pos)) {
DeleteChars(pos, 2);
} else if (pos < Length()) {
DeleteChars(pos, 1);
}
} }
int Document::DelCharBack(int pos) { int Document::DelCharBack(int pos) {
@@ -411,6 +525,10 @@ int Document::DelCharBack(int pos) {
} else if (IsCrLf(pos - 2)) { } else if (IsCrLf(pos - 2)) {
DeleteChars(pos - 2, 2); DeleteChars(pos - 2, 2);
return pos - 2; return pos - 2;
} else if (SC_CP_UTF8 == dbcsCodePage) {
int startChar = MovePositionOutsideChar(pos-1, -1, false);
DeleteChars(startChar, pos - startChar);
return startChar;
} else if (IsDBCS(pos - 1)) { } else if (IsDBCS(pos - 1)) {
DeleteChars(pos - 2, 2); DeleteChars(pos - 2, 2);
return pos - 2; return pos - 2;
@@ -420,27 +538,101 @@ int Document::DelCharBack(int pos) {
} }
} }
static bool isindentchar(char ch) {
return (ch == ' ') || (ch == '\t');
}
static int NextTab(int pos, int tabSize) {
return ((pos / tabSize) + 1) * tabSize;
}
static void CreateIndentation(char *linebuf, int length, int indent, int tabSize, bool insertSpaces) {
length--; // ensure space for \0
if (!insertSpaces) {
while ((indent >= tabSize) && (length > 0)) {
*linebuf++ = '\t';
indent -= tabSize;
length--;
}
}
while ((indent > 0) && (length > 0)) {
*linebuf++ = ' ';
indent--;
length--;
}
*linebuf = '\0';
}
int Document::GetLineIndentation(int line) {
int indent = 0;
if ((line >= 0) && (line < LinesTotal())) {
int lineStart = LineStart(line);
int length = Length();
for (int i=lineStart;i<length;i++) {
char ch = cb.CharAt(i);
if (ch == ' ')
indent++;
else if (ch == '\t')
indent = NextTab(indent, tabInChars);
else
return indent;
}
}
return indent;
}
void Document::SetLineIndentation(int line, int indent) {
int indentOfLine = GetLineIndentation(line);
if (indent < 0)
indent = 0;
if (indent != indentOfLine) {
char linebuf[1000];
CreateIndentation(linebuf, sizeof(linebuf), indent, tabInChars, !useTabs);
int thisLineStart = LineStart(line);
int indentPos = GetLineIndentPosition(line);
DeleteChars(thisLineStart, indentPos - thisLineStart);
InsertString(thisLineStart, linebuf);
}
}
int Document::GetLineIndentPosition(int line) {
if (line < 0)
return 0;
int pos = LineStart(line);
int length = Length();
while ((pos < length) && isindentchar(cb.CharAt(pos))) {
pos++;
}
return pos;
}
int Document::GetColumn(int pos) {
int column = 0;
int line = LineFromPosition(pos);
if ((line >= 0) && (line < LinesTotal())) {
for (int i=LineStart(line);i<pos;i++) {
char ch = cb.CharAt(i);
if (ch == '\t')
column = NextTab(column, tabInChars);
else if (ch == '\r')
return column;
else if (ch == '\n')
return column;
else
column++;
}
}
return column;
}
void Document::Indent(bool forwards, int lineBottom, int lineTop) { void Document::Indent(bool forwards, int lineBottom, int lineTop) {
if (forwards) { // Dedent - suck white space off the front of the line to dedent by equivalent of a tab
// Indent by a tab for (int line = lineBottom; line >= lineTop; line--) {
for (int line = lineBottom; line >= lineTop; line--) { int indentOfLine = GetLineIndentation(line);
InsertChar(LineStart(line), '\t'); if (forwards)
} SetLineIndentation(line, indentOfLine + IndentSize());
} else { else
// Dedent - suck white space off the front of the line to dedent by equivalent of a tab SetLineIndentation(line, indentOfLine - IndentSize());
for (int line = lineBottom; line >= lineTop; line--) {
int ispc = 0;
while (ispc < tabInChars && cb.CharAt(LineStart(line) + ispc) == ' ')
ispc++;
int posStartLine = LineStart(line);
if (ispc == tabInChars) {
DeleteChars(posStartLine, ispc);
} else if (cb.CharAt(posStartLine + ispc) == '\t') {
DeleteChars(posStartLine, ispc + 1);
} else { // Hit a non-white
DeleteChars(posStartLine, ispc);
}
}
} }
} }
@@ -485,6 +677,8 @@ void Document::ConvertLineEnds(int eolModeSet) {
} }
bool Document::IsWordChar(unsigned char ch) { bool Document::IsWordChar(unsigned char ch) {
if ((SC_CP_UTF8 == dbcsCodePage) && (ch >0x80))
return true;
return wordchars[ch]; return wordchars[ch];
} }
@@ -523,25 +717,29 @@ int Document::NextWordStart(int pos, int delta) {
return pos; return pos;
} }
bool Document::IsWordAt(int start, int end) { bool Document::IsWordStartAt(int pos) {
int lengthDoc = Length(); if (pos > 0) {
if (start > 0) { return !IsWordChar(CharAt(pos - 1));
char ch = CharAt(start - 1);
if (IsWordChar(ch))
return false;
}
if (end < lengthDoc - 1) {
char ch = CharAt(end);
if (IsWordChar(ch))
return false;
} }
return true; return true;
} }
bool Document::IsWordEndAt(int pos) {
if (pos < Length() - 1) {
return !IsWordChar(CharAt(pos));
}
return true;
}
bool Document::IsWordAt(int start, int end) {
return IsWordStartAt(start) && IsWordEndAt(end);
}
// Find text in document, supporting both forward and backward // Find text in document, supporting both forward and backward
// searches (just pass minPos > maxPos to do a backward search) // searches (just pass minPos > maxPos to do a backward search)
// Has not been tested with backwards DBCS searches yet. // Has not been tested with backwards DBCS searches yet.
long Document::FindText(int minPos, int maxPos, const char *s, bool caseSensitive, bool word) { long Document::FindText(int minPos, int maxPos, const char *s,
bool caseSensitive, bool word, bool wordStart) {
bool forward = minPos <= maxPos; bool forward = minPos <= maxPos;
int increment = forward ? 1 : -1; int increment = forward ? 1 : -1;
@@ -551,16 +749,14 @@ long Document::FindText(int minPos, int maxPos, const char *s, bool caseSensitiv
// Compute actual search ranges needed // Compute actual search ranges needed
int lengthFind = strlen(s); int lengthFind = strlen(s);
int endSearch = 0; int endSearch = endPos;
if (startPos <= endPos) { if (startPos <= endPos) {
endSearch = endPos - lengthFind + 1; endSearch = endPos - lengthFind + 1;
} else {
endSearch = endPos;
} }
//Platform::DebugPrintf("Find %d %d %s %d\n", startPos, endPos, ft->lpstrText, lengthFind); //Platform::DebugPrintf("Find %d %d %s %d\n", startPos, endPos, ft->lpstrText, lengthFind);
char firstChar = s[0]; char firstChar = s[0];
if (!caseSensitive) if (!caseSensitive)
firstChar = toupper(firstChar); firstChar = static_cast<char>(toupper(firstChar));
int pos = startPos; int pos = startPos;
while (forward ? (pos < endSearch) : (pos >= endSearch)) { while (forward ? (pos < endSearch) : (pos >= endSearch)) {
char ch = CharAt(pos); char ch = CharAt(pos);
@@ -573,8 +769,10 @@ long Document::FindText(int minPos, int maxPos, const char *s, bool caseSensitiv
found = false; found = false;
} }
if (found) { if (found) {
if ((!word) || IsWordAt(pos, pos + lengthFind)) if ((!word && !wordStart) ||
return pos; word && IsWordAt(pos, pos + lengthFind) ||
wordStart && IsWordStartAt(pos))
return pos;
} }
} }
} else { } else {
@@ -586,8 +784,10 @@ long Document::FindText(int minPos, int maxPos, const char *s, bool caseSensitiv
found = false; found = false;
} }
if (found) { if (found) {
if ((!word) || IsWordAt(pos, pos + lengthFind)) if (!(word && wordStart) ||
return pos; word && IsWordAt(pos, pos + lengthFind) ||
wordStart && IsWordStartAt(pos))
return pos;
} }
} }
} }
@@ -605,6 +805,25 @@ int Document::LinesTotal() {
return cb.Lines(); return cb.Lines();
} }
void Document::ChangeCase(Range r, bool makeUpperCase) {
for (int pos=r.start; pos<r.end; pos++) {
char ch = CharAt(pos);
if (dbcsCodePage && IsDBCS(pos)) {
pos += LenChar(pos);
} else {
if (makeUpperCase) {
if (islower(ch)) {
ChangeChar(pos, static_cast<char>(toupper(ch)));
}
} else {
if (isupper(ch)) {
ChangeChar(pos, static_cast<char>(tolower(ch)));
}
}
}
}
}
void Document::SetWordChars(unsigned char *chars) { void Document::SetWordChars(unsigned char *chars) {
int ch; int ch;
for (ch = 0; ch < 256; ch++) { for (ch = 0; ch < 256; ch++) {
@@ -671,6 +890,13 @@ void Document::SetStyles(int length, char *styles) {
} }
} }
bool Document::EnsureStyledTo(int pos) {
// Ask the watchers to style, and stop as soon as one responds.
for (int i = 0; pos > GetEndStyled() && i < lenWatchers; i++)
watchers[i].watcher->NotifyStyleNeeded(this, watchers[i].userData, pos);
return pos <= GetEndStyled();
}
bool Document::AddWatcher(DocWatcher *watcher, void *userData) { bool Document::AddWatcher(DocWatcher *watcher, void *userData) {
for (int i = 0; i < lenWatchers; i++) { for (int i = 0; i < lenWatchers; i++) {
if ((watchers[i].watcher == watcher) && if ((watchers[i].watcher == watcher) &&

View File

@@ -74,9 +74,10 @@ private:
CellBuffer cb; CellBuffer cb;
bool wordchars[256]; bool wordchars[256];
int stylingPos; int stylingPos;
int stylingMask; char stylingMask;
int endStyled; int endStyled;
int enteredCount; int enteredCount;
int enteredReadOnlyCount;
WatcherWithUserData *watchers; WatcherWithUserData *watchers;
int lenWatchers; int lenWatchers;
@@ -86,8 +87,11 @@ public:
int stylingBitsMask; int stylingBitsMask;
int eolMode; int eolMode;
// dbcsCodePage can also be SC_CP_UTF8 to enable UTF-8 mode
int dbcsCodePage; int dbcsCodePage;
int tabInChars; int tabInChars;
int indentInChars;
bool useTabs;
Document(); Document();
virtual ~Document(); virtual ~Document();
@@ -98,6 +102,7 @@ public:
int LineFromPosition(int pos); int LineFromPosition(int pos);
int ClampPositionIntoDocument(int pos); int ClampPositionIntoDocument(int pos);
bool IsCrLf(int pos); bool IsCrLf(int pos);
int LenChar(int pos);
int MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd=true); int MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd=true);
// Gateways to modifying document // Gateways to modifying document
@@ -108,21 +113,28 @@ public:
bool CanUndo() { return cb.CanUndo(); } bool CanUndo() { return cb.CanUndo(); }
bool CanRedo() { return cb.CanRedo(); } bool CanRedo() { return cb.CanRedo(); }
void DeleteUndoHistory() { cb.DeleteUndoHistory(); } void DeleteUndoHistory() { cb.DeleteUndoHistory(); }
undoCollectionType SetUndoCollection(undoCollectionType collectUndo) { bool SetUndoCollection(bool collectUndo) {
return cb.SetUndoCollection(collectUndo); return cb.SetUndoCollection(collectUndo);
} }
void AppendUndoStartAction() { cb.AppendUndoStartAction(); } bool IsCollectingUndo() { return cb.IsCollectingUndo(); }
void BeginUndoAction() { cb.BeginUndoAction(); } void BeginUndoAction() { cb.BeginUndoAction(); }
void EndUndoAction() { cb.EndUndoAction(); } void EndUndoAction() { cb.EndUndoAction(); }
void SetSavePoint(); void SetSavePoint();
bool IsSavePoint() { return cb.IsSavePoint(); } bool IsSavePoint() { return cb.IsSavePoint(); }
int GetLineIndentation(int line);
void SetLineIndentation(int line, int indent);
int GetLineIndentPosition(int line);
int GetColumn(int position);
void Indent(bool forwards, int lineBottom, int lineTop); void Indent(bool forwards, int lineBottom, int lineTop);
void ConvertLineEnds(int eolModeSet); void ConvertLineEnds(int eolModeSet);
void SetReadOnly(bool set) { cb.SetReadOnly(set); } void SetReadOnly(bool set) { cb.SetReadOnly(set); }
bool IsReadOnly() { return cb.IsReadOnly(); }
void InsertChar(int pos, char ch); void InsertChar(int pos, char ch);
void InsertString(int position, const char *s); void InsertString(int position, const char *s);
void InsertString(int position, const char *s, int insertLength); void InsertString(int position, const char *s, int insertLength);
void ChangeChar(int pos, char ch);
void DelChar(int pos); void DelChar(int pos);
int DelCharBack(int pos); int DelCharBack(int pos);
@@ -132,17 +144,19 @@ public:
} }
char StyleAt(int position) { return cb.StyleAt(position); } char StyleAt(int position) { return cb.StyleAt(position); }
int GetMark(int line) { return cb.GetMark(line); } int GetMark(int line) { return cb.GetMark(line); }
int AddMark(int line, int markerNum) { return cb.AddMark(line, markerNum); } int AddMark(int line, int markerNum);
void DeleteMark(int line, int markerNum) { cb.DeleteMark(line, markerNum); } void DeleteMark(int line, int markerNum);
void DeleteMarkFromHandle(int markerHandle) { cb.DeleteMarkFromHandle(markerHandle); } void DeleteMarkFromHandle(int markerHandle);
void DeleteAllMarks(int markerNum) { cb.DeleteAllMarks(markerNum); } void DeleteAllMarks(int markerNum);
int LineFromHandle(int markerHandle) { return cb.LineFromHandle(markerHandle); } int LineFromHandle(int markerHandle) { return cb.LineFromHandle(markerHandle); }
int LineStart(int line); int LineStart(int line);
int LineEnd(int line);
int LineEndPosition(int position); int LineEndPosition(int position);
int VCHomePosition(int position); int VCHomePosition(int position);
int SetLevel(int line, int level); int SetLevel(int line, int level);
int GetLevel(int line) { return cb.GetLevel(line); } int GetLevel(int line) { return cb.GetLevel(line); }
void ClearLevels() { cb.ClearLevels(); }
int GetLastChild(int lineParent, int level=-1); int GetLastChild(int lineParent, int level=-1);
int GetFoldParent(int line); int GetFoldParent(int line);
@@ -150,16 +164,20 @@ public:
int ExtendWordSelect(int pos, int delta); int ExtendWordSelect(int pos, int delta);
int NextWordStart(int pos, int delta); int NextWordStart(int pos, int delta);
int Length() { return cb.Length(); } int Length() { return cb.Length(); }
long FindText(int minPos, int maxPos, const char *s, bool caseSensitive, bool word); long FindText(int minPos, int maxPos, const char *s,
long FindText(WORD iMessage,WPARAM wParam,LPARAM lParam); bool caseSensitive, bool word, bool wordStart);
long FindText(int iMessage, unsigned long wParam, long lParam);
int LinesTotal(); int LinesTotal();
void ChangeCase(Range r, bool makeUpperCase);
void SetWordChars(unsigned char *chars); void SetWordChars(unsigned char *chars);
void SetStylingBits(int bits); void SetStylingBits(int bits);
void StartStyling(int position, char mask); void StartStyling(int position, char mask);
void SetStyleFor(int length, char style); void SetStyleFor(int length, char style);
void SetStyles(int length, char *styles); void SetStyles(int length, char *styles);
int GetEndStyled() { return endStyled; } int GetEndStyled() { return endStyled; }
bool EnsureStyledTo(int pos);
int SetLineState(int line, int state) { return cb.SetLineState(line, state); } int SetLineState(int line, int state) { return cb.SetLineState(line, state); }
int GetLineState(int line) { return cb.GetLineState(line); } int GetLineState(int line) { return cb.GetLineState(line); }
@@ -173,12 +191,16 @@ public:
private: private:
bool IsDBCS(int pos); bool IsDBCS(int pos);
bool IsWordChar(unsigned char ch); bool IsWordChar(unsigned char ch);
bool IsWordStartAt(int pos);
bool IsWordEndAt(int pos);
bool IsWordAt(int start, int end); bool IsWordAt(int start, int end);
void ModifiedAt(int pos); void ModifiedAt(int pos);
void NotifyModifyAttempt(); void NotifyModifyAttempt();
void NotifySavePoint(bool atSavePoint); void NotifySavePoint(bool atSavePoint);
void NotifyModified(DocModification mh); void NotifyModified(DocModification mh);
int IndentSize() { return indentInChars ? indentInChars : tabInChars; }
}; };
// To optimise processing of document modifications by DocWatchers, a hint is passed indicating the // To optimise processing of document modifications by DocWatchers, a hint is passed indicating the
@@ -205,6 +227,16 @@ public:
line(0), line(0),
foldLevelNow(0), foldLevelNow(0),
foldLevelPrev(0) {} foldLevelPrev(0) {}
DocModification(int modificationType_, const Action &act, int linesAdded_=0) :
modificationType(modificationType_),
position(act.position / 2),
length(act.lenData),
linesAdded(linesAdded_),
text(act.data),
line(0),
foldLevelNow(0),
foldLevelPrev(0) {}
}; };
// A class that wants to receive notifications from a Document must be derived from DocWatcher // A class that wants to receive notifications from a Document must be derived from DocWatcher
@@ -217,6 +249,7 @@ public:
virtual void NotifySavePoint(Document *doc, void *userData, bool atSavePoint) = 0; virtual void NotifySavePoint(Document *doc, void *userData, bool atSavePoint) = 0;
virtual void NotifyModified(Document *doc, DocModification mh, void *userData) = 0; virtual void NotifyModified(Document *doc, DocModification mh, void *userData) = 0;
virtual void NotifyDeleted(Document *doc, void *userData) = 0; virtual void NotifyDeleted(Document *doc, void *userData) = 0;
virtual void NotifyStyleNeeded(Document *doc, void *userData, int endPos) = 0;
}; };
#endif #endif

View File

@@ -0,0 +1,176 @@
// SciTE - Scintilla based Text Editor
// Accessor.cxx - rapid easy access to contents of a Scintilla
// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed.
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include "Platform.h"
#include "PropSet.h"
#include "SVector.h"
#include "Accessor.h"
#include "DocumentAccessor.h"
#include "CellBuffer.h"
#include "Scintilla.h"
#include "Document.h"
DocumentAccessor::~DocumentAccessor() {
}
#if PLAT_WIN
bool DocumentAccessor::InternalIsLeadByte(char ch) {
if (SC_CP_UTF8 == codePage)
// For lexing, all characters >= 0x80 are treated the
// same so none is considered a lead byte.
return false;
else
return IsDBCSLeadByteEx(codePage, ch);
}
#else
// PLAT_GTK or PLAT_WX
// TODO: support DBCS under GTK+ and WX
bool DocumentAccessor::InternalIsLeadByte(char) {
return false;
}
#endif
void DocumentAccessor::Fill(int position) {
if (lenDoc == -1)
lenDoc = pdoc->Length();
startPos = position - slopSize;
if (startPos + bufferSize > lenDoc)
startPos = lenDoc - bufferSize;
if (startPos < 0)
startPos = 0;
endPos = startPos + bufferSize;
if (endPos > lenDoc)
endPos = lenDoc;
pdoc->GetCharRange(buf, startPos, endPos-startPos);
buf[endPos-startPos] = '\0';
}
char DocumentAccessor::StyleAt(int position) {
return pdoc->StyleAt(position);
}
int DocumentAccessor::GetLine(int position) {
return pdoc->LineFromPosition(position);
}
int DocumentAccessor::LineStart(int line) {
return pdoc->LineStart(line);
}
int DocumentAccessor::LevelAt(int line) {
return pdoc->GetLevel(line);
}
int DocumentAccessor::Length() {
if (lenDoc == -1)
lenDoc = pdoc->Length();
return lenDoc;
}
int DocumentAccessor::GetLineState(int line) {
return pdoc->GetLineState(line);
}
int DocumentAccessor::SetLineState(int line, int state) {
return pdoc->SetLineState(line, state);
}
void DocumentAccessor::StartAt(unsigned int start, char chMask) {
pdoc->StartStyling(start, chMask);
}
void DocumentAccessor::StartSegment(unsigned int pos) {
startSeg = pos;
}
void DocumentAccessor::ColourTo(unsigned int pos, int chAttr) {
// Only perform styling if non empty range
if (pos != startSeg - 1) {
if (pos < startSeg) {
Platform::DebugPrintf("Bad colour positions %d - %d\n", startSeg, pos);
}
if (validLen + (pos - startSeg + 1) >= bufferSize)
Flush();
if (validLen + (pos - startSeg + 1) >= bufferSize) {
// Too big for buffer so send directly
pdoc->SetStyleFor(pos - startSeg + 1, static_cast<char>(chAttr));
} else {
if (chAttr != chWhile)
chFlags = 0;
chAttr |= chFlags;
for (unsigned int i = startSeg; i <= pos; i++) {
styleBuf[validLen++] = static_cast<char>(chAttr);
}
}
}
startSeg = pos+1;
}
void DocumentAccessor::SetLevel(int line, int level) {
pdoc->SetLevel(line, level);
}
void DocumentAccessor::Flush() {
startPos = extremePosition;
lenDoc = -1;
if (validLen > 0) {
pdoc->SetStyles(validLen, styleBuf);
validLen = 0;
}
}
int DocumentAccessor::IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader) {
int end = Length();
int spaceFlags = 0;
// Determines the indentation level of the current line and also checks for consistent
// indentation compared to the previous line.
// Indentation is judged consistent when the indentation whitespace of each line lines
// the same or the indentation of one line is a prefix of the other.
int pos = LineStart(line);
char ch = (*this)[pos];
int indent = 0;
bool inPrevPrefix = line > 0;
int posPrev = inPrevPrefix ? LineStart(line-1) : 0;
while ((ch == ' ' || ch == '\t') && (pos < end)) {
if (inPrevPrefix) {
char chPrev = (*this)[posPrev++];
if (chPrev == ' ' || chPrev == '\t') {
if (chPrev != ch)
spaceFlags |= wsInconsistent;
} else {
inPrevPrefix = false;
}
}
if (ch == ' ') {
spaceFlags |= wsSpace;
indent++;
} else { // Tab
spaceFlags |= wsTab;
if (spaceFlags & wsSpace)
spaceFlags |= wsSpaceTab;
indent = (indent / 8 + 1) * 8;
}
ch = (*this)[++pos];
}
*flags = spaceFlags;
indent += SC_FOLDLEVELBASE;
// if completely empty line or the start of a comment...
if (isspace(ch) || (pfnIsCommentLeader && (*pfnIsCommentLeader)(*this, pos, end-pos)) )
return indent | SC_FOLDLEVELWHITEFLAG;
else
return indent;
}

View File

@@ -0,0 +1,49 @@
// DocumentAccessor.h - implementation of BufferAccess and StylingAccess on a Scintilla rapid easy access to contents of a Scintilla
// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed.
class Document;
class DocumentAccessor : public Accessor {
// Private so DocumentAccessor objects can not be copied
DocumentAccessor(const DocumentAccessor &source) : Accessor(), props(source.props) {}
DocumentAccessor &operator=(const DocumentAccessor &) { return *this; }
protected:
Document *pdoc;
PropSet &props;
int lenDoc;
char styleBuf[bufferSize];
int validLen;
char chFlags;
char chWhile;
unsigned int startSeg;
bool InternalIsLeadByte(char ch);
void Fill(int position);
public:
DocumentAccessor(Document *pdoc_, PropSet &props_) :
Accessor(), pdoc(pdoc_), props(props_),
lenDoc(-1), validLen(0), chFlags(0), chWhile(0) {
}
~DocumentAccessor();
char StyleAt(int position);
int GetLine(int position);
int LineStart(int line);
int LevelAt(int line);
int Length();
void Flush();
int GetLineState(int line);
int SetLineState(int line, int state);
int GetPropertyInt(const char *key, int defaultValue=0) {
return props.GetInt(key, defaultValue);
}
void StartAt(unsigned int start, char chMask=31);
void SetFlags(char chFlags_, char chWhile_) {chFlags = chFlags_; chWhile = chWhile_; };
unsigned int GetStartSegment() { return startSeg; }
void StartSegment(unsigned int pos);
void ColourTo(unsigned int pos, int chAttr);
void SetLevel(int line, int level);
int IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader = 0);
};

File diff suppressed because it is too large Load Diff

View File

@@ -31,13 +31,21 @@ public:
// Drawing is only performed for maxLineLength characters on each line. // Drawing is only performed for maxLineLength characters on each line.
enum {maxLineLength = 4000}; enum {maxLineLength = 4000};
int numCharsInLine; int numCharsInLine;
char chars[maxLineLength]; int xHighlightGuide;
char styles[maxLineLength]; bool highlightColumn;
char indicators[maxLineLength]; int selStart;
int positions[maxLineLength]; int selEnd;
int edgeColumn;
char chars[maxLineLength+1];
char styles[maxLineLength+1];
char indicators[maxLineLength+1];
int positions[maxLineLength+1];
}; };
class Editor : public DocWatcher { class Editor : public DocWatcher {
// Private so Editor objects can not be copied
Editor(const Editor &) : DocWatcher() {}
Editor &operator=(const Editor &) { return *this; }
protected: // ScintillaBase subclass needs access to much of Editor protected: // ScintillaBase subclass needs access to much of Editor
// On GTK+, Scintilla is a container widget holding two scroll bars and a drawing area // On GTK+, Scintilla is a container widget holding two scroll bars and a drawing area
@@ -51,6 +59,8 @@ protected: // ScintillaBase subclass needs access to much of Editor
bool stylesValid; bool stylesValid;
ViewStyle vs; ViewStyle vs;
Palette palette; Palette palette;
int printMagnification;
int printColourMode;
bool hideSelection; bool hideSelection;
bool inOverstrike; bool inOverstrike;
@@ -61,13 +71,16 @@ protected: // ScintillaBase subclass needs access to much of Editor
int xOffset; // Horizontal scrolled amount in pixels int xOffset; // Horizontal scrolled amount in pixels
int xCaretMargin; // Ensure this many pixels visible on both sides of caret int xCaretMargin; // Ensure this many pixels visible on both sides of caret
bool horizontalScrollBarVisible;
Surface pixmapLine; Surface pixmapLine;
Surface pixmapSelMargin; Surface pixmapSelMargin;
Surface pixmapSelPattern; Surface pixmapSelPattern;
Surface pixmapIndentGuide;
Surface pixmapIndentGuideHighlight;
// Intellimouse support - currently only implemented for Windows // Intellimouse support - currently only implemented for Windows
unsigned int ucWheelScrollLines; unsigned int ucWheelScrollLines;
short cWheelDelta; //wheel delta from roll int cWheelDelta; //wheel delta from roll
KeyMap kmap; KeyMap kmap;
@@ -94,8 +107,8 @@ protected: // ScintillaBase subclass needs access to much of Editor
bool needUpdateUI; bool needUpdateUI;
Position braces[2]; Position braces[2];
int bracesMatchStyle; int bracesMatchStyle;
int highlightGuideColumn;
int edgeState;
int theEdge; int theEdge;
enum { notPainting, painting, paintAbandoned } paintState; enum { notPainting, painting, paintAbandoned } paintState;
@@ -110,12 +123,15 @@ protected: // ScintillaBase subclass needs access to much of Editor
enum { selStream, selRectangle, selRectangleFixed } selType; enum { selStream, selRectangle, selRectangleFixed } selType;
int xStartSelect; int xStartSelect;
int xEndSelect; int xEndSelect;
bool primarySelection;
int caretPolicy; int caretPolicy;
int caretSlop; int caretSlop;
int searchAnchor; int searchAnchor;
int displayPopupMenu;
#ifdef MACRO_SUPPORT #ifdef MACRO_SUPPORT
int recordingMacro; int recordingMacro;
#endif #endif
@@ -162,6 +178,7 @@ protected: // ScintillaBase subclass needs access to much of Editor
void SetSelection(int currentPos_, int anchor_); void SetSelection(int currentPos_, int anchor_);
void SetSelection(int currentPos_); void SetSelection(int currentPos_);
void SetEmptySelection(int currentPos_); void SetEmptySelection(int currentPos_);
int MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd=true);
int MovePositionTo(int newPos, bool extend = false); int MovePositionTo(int newPos, bool extend = false);
int MovePositionSoVisible(int pos, int moveDir); int MovePositionSoVisible(int pos, int moveDir);
void SetLastXChosen(); void SetLastXChosen();
@@ -169,6 +186,7 @@ protected: // ScintillaBase subclass needs access to much of Editor
void ScrollTo(int line); void ScrollTo(int line);
virtual void ScrollText(int linesToMove); virtual void ScrollText(int linesToMove);
void HorizontalScrollTo(int xPos); void HorizontalScrollTo(int xPos);
void MoveCaretInsideView();
void EnsureCaretVisible(bool useMargin=true); void EnsureCaretVisible(bool useMargin=true);
void ShowCaretAtCurrentPosition(); void ShowCaretAtCurrentPosition();
void DropCaret(); void DropCaret();
@@ -176,20 +194,23 @@ protected: // ScintillaBase subclass needs access to much of Editor
void PaintSelMargin(Surface *surface, PRectangle &rc); void PaintSelMargin(Surface *surface, PRectangle &rc);
void LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayout &ll); void LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayout &ll);
void DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int xStart, void DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVisible, int xStart,
PRectangle rcLine, LineLayout &ll); PRectangle rcLine, LineLayout &ll);
void Paint(Surface *surfaceWindow, PRectangle rcArea); void Paint(Surface *surfaceWindow, PRectangle rcArea);
long FormatRange(bool draw, FORMATRANGE *pfr); long FormatRange(bool draw, RangeToFormat *pfr);
virtual void SetVerticalScrollPos() = 0; virtual void SetVerticalScrollPos() = 0;
virtual void SetHorizontalScrollPos() = 0; virtual void SetHorizontalScrollPos() = 0;
virtual bool ModifyScrollBars(int nMax, int nPage) = 0; virtual bool ModifyScrollBars(int nMax, int nPage) = 0;
virtual void ReconfigureScrollBars();
void SetScrollBarsTo(PRectangle rsClient); void SetScrollBarsTo(PRectangle rsClient);
void SetScrollBars(); void SetScrollBars();
virtual void AddChar(char ch); void AddChar(char ch);
virtual void AddCharUTF(char *s, unsigned int len);
void ClearSelection(); void ClearSelection();
void ClearAll(); void ClearAll();
void ClearDocumentStyle();
void Cut(); void Cut();
void PasteRectangular(int pos, const char *ptr, int len); void PasteRectangular(int pos, const char *ptr, int len);
virtual void Copy() = 0; virtual void Copy() = 0;
@@ -205,8 +226,9 @@ protected: // ScintillaBase subclass needs access to much of Editor
virtual void NotifyChange() = 0; virtual void NotifyChange() = 0;
virtual void NotifyFocus(bool focus); virtual void NotifyFocus(bool focus);
virtual void NotifyParent(SCNotification scn) = 0; virtual void NotifyParent(SCNotification scn) = 0;
virtual void NotifyStyleNeeded(int endStyleNeeded); virtual void NotifyStyleToNeeded(int endStyleNeeded);
void NotifyChar(char ch); void NotifyChar(char ch);
void NotifyMove(int position);
void NotifySavePoint(bool isSavePoint); void NotifySavePoint(bool isSavePoint);
void NotifyModifyAttempt(); void NotifyModifyAttempt();
virtual void NotifyDoubleClick(Point pt, bool shift); virtual void NotifyDoubleClick(Point pt, bool shift);
@@ -218,24 +240,29 @@ protected: // ScintillaBase subclass needs access to much of Editor
void NotifySavePoint(Document *document, void *userData, bool atSavePoint); void NotifySavePoint(Document *document, void *userData, bool atSavePoint);
void NotifyModified(Document *document, DocModification mh, void *userData); void NotifyModified(Document *document, DocModification mh, void *userData);
void NotifyDeleted(Document *document, void *userData); void NotifyDeleted(Document *document, void *userData);
void NotifyStyleNeeded(Document *doc, void *userData, int endPos);
#ifdef MACRO_SUPPORT #ifdef MACRO_SUPPORT
void NotifyMacroRecord(UINT iMessage, WPARAM wParam, LPARAM lParam); void NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long lParam);
#endif #endif
void PageMove(int direction, bool extend=false); void PageMove(int direction, bool extend=false);
virtual int KeyCommand(UINT iMessage); void ChangeCaseOfSelection(bool makeUpperCase);
void LineTranspose();
virtual void CancelModes();
virtual int KeyCommand(unsigned int iMessage);
virtual int KeyDefault(int /* key */, int /*modifiers*/); virtual int KeyDefault(int /* key */, int /*modifiers*/);
int KeyDown(int key, bool shift, bool ctrl, bool alt); int KeyDown(int key, bool shift, bool ctrl, bool alt);
bool GetWhitespaceVisible(); int GetWhitespaceVisible();
void SetWhitespaceVisible(bool view); void SetWhitespaceVisible(int view);
void Indent(bool forwards); void Indent(bool forwards);
long FindText(UINT iMessage,WPARAM wParam,LPARAM lParam); long FindText(unsigned int iMessage, unsigned long wParam, long lParam);
void SearchAnchor(); void SearchAnchor();
long SearchText(UINT iMessage,WPARAM wParam,LPARAM lParam); long SearchText(unsigned int iMessage, unsigned long wParam, long lParam);
void GoToLine(int lineNo); void GoToLine(int lineNo);
char *CopyRange(int start, int end); char *CopyRange(int start, int end);
@@ -269,11 +296,11 @@ protected: // ScintillaBase subclass needs access to much of Editor
void ToggleContraction(int line); void ToggleContraction(int line);
void EnsureLineVisible(int line); void EnsureLineVisible(int line);
virtual LRESULT DefWndProc(UINT iMessage, WPARAM wParam, LPARAM lParam) = 0; virtual long DefWndProc(unsigned int iMessage, unsigned long wParam, long lParam) = 0;
public: public:
// Public so scintilla_send_message can use it // Public so scintilla_send_message can use it
virtual LRESULT WndProc(UINT iMessage, WPARAM wParam, LPARAM lParam); virtual long WndProc(unsigned int iMessage, unsigned long wParam, long lParam);
// Public so scintilla_set_id can use it // Public so scintilla_set_id can use it
int ctrlID; int ctrlID;
}; };

View File

@@ -37,6 +37,22 @@ void Indicator::Draw(Surface *surface, PRectangle &rc) {
surface->MoveTo(x-3, ymid); surface->MoveTo(x-3, ymid);
surface->LineTo(x-3, ymid+2); surface->LineTo(x-3, ymid+2);
} }
} else if (style == INDIC_DIAGONAL) {
int x = rc.left;
while (x < rc.right) {
surface->MoveTo(x, rc.top+2);
int endX = x+3;
int endY = rc.top - 1;
if (endX > rc.right) {
endY += endX - rc.right;
endX = rc.right;
}
surface->LineTo(endX, endY);
x += 4;
}
} else if (style == INDIC_STRIKE) {
surface->MoveTo(rc.left, rc.top - 4);
surface->LineTo(rc.right, rc.top - 4);
} else { // Either INDIC_PLAIN or unknown } else { // Either INDIC_PLAIN or unknown
surface->MoveTo(rc.left, ymid); surface->MoveTo(rc.left, ymid);
surface->LineTo(rc.right, ymid); surface->LineTo(rc.right, ymid);

View File

@@ -28,7 +28,7 @@ void KeyMap::Clear() {
alloc = 0; alloc = 0;
} }
void KeyMap::AssignCmdKey(int key, int modifiers, UINT msg) { void KeyMap::AssignCmdKey(int key, int modifiers, unsigned int msg) {
if ((len+1) >= alloc) { if ((len+1) >= alloc) {
KeyToCommand *ktcNew = new KeyToCommand[alloc + 5]; KeyToCommand *ktcNew = new KeyToCommand[alloc + 5];
if (!ktcNew) if (!ktcNew)
@@ -51,7 +51,7 @@ void KeyMap::AssignCmdKey(int key, int modifiers, UINT msg) {
len++; len++;
} }
UINT KeyMap::Find(int key, int modifiers) { unsigned int KeyMap::Find(int key, int modifiers) {
for (int i=0; i < len; i++) { for (int i=0; i < len; i++) {
if ((key == kmap[i].key) && (modifiers == kmap[i].modifiers)) { if ((key == kmap[i].key) && (modifiers == kmap[i].modifiers)) {
return kmap[i].msg; return kmap[i].msg;
@@ -61,51 +61,61 @@ UINT KeyMap::Find(int key, int modifiers) {
} }
KeyToCommand KeyMap::MapDefault[] = { KeyToCommand KeyMap::MapDefault[] = {
VK_DOWN, SCI_NORM, SCI_LINEDOWN, {SCK_DOWN, SCI_NORM, SCI_LINEDOWN},
VK_DOWN, SCI_SHIFT, SCI_LINEDOWNEXTEND, {SCK_DOWN, SCI_SHIFT, SCI_LINEDOWNEXTEND},
VK_UP, SCI_NORM, SCI_LINEUP, {SCK_DOWN, SCI_CTRL, SCI_LINESCROLLDOWN},
VK_UP, SCI_SHIFT, SCI_LINEUPEXTEND, {SCK_UP, SCI_NORM, SCI_LINEUP},
VK_LEFT, SCI_NORM, SCI_CHARLEFT, {SCK_UP, SCI_SHIFT, SCI_LINEUPEXTEND},
VK_LEFT, SCI_SHIFT, SCI_CHARLEFTEXTEND, {SCK_UP, SCI_CTRL, SCI_LINESCROLLUP},
VK_LEFT, SCI_CTRL, SCI_WORDLEFT, {SCK_LEFT, SCI_NORM, SCI_CHARLEFT},
VK_LEFT, SCI_CSHIFT, SCI_WORDLEFTEXTEND, {SCK_LEFT, SCI_SHIFT, SCI_CHARLEFTEXTEND},
VK_RIGHT, SCI_NORM, SCI_CHARRIGHT, {SCK_LEFT, SCI_CTRL, SCI_WORDLEFT},
VK_RIGHT, SCI_SHIFT, SCI_CHARRIGHTEXTEND, {SCK_LEFT, SCI_CSHIFT, SCI_WORDLEFTEXTEND},
VK_RIGHT, SCI_CTRL, SCI_WORDRIGHT, {SCK_RIGHT, SCI_NORM, SCI_CHARRIGHT},
VK_RIGHT, SCI_CSHIFT, SCI_WORDRIGHTEXTEND, {SCK_RIGHT, SCI_SHIFT, SCI_CHARRIGHTEXTEND},
VK_HOME, SCI_NORM, SCI_VCHOME, {SCK_RIGHT, SCI_CTRL, SCI_WORDRIGHT},
VK_HOME, SCI_SHIFT, SCI_VCHOMEEXTEND, {SCK_RIGHT, SCI_CSHIFT, SCI_WORDRIGHTEXTEND},
VK_HOME, SCI_CTRL, SCI_DOCUMENTSTART, {SCK_HOME, SCI_NORM, SCI_VCHOME},
VK_HOME, SCI_CSHIFT, SCI_DOCUMENTSTARTEXTEND, {SCK_HOME, SCI_SHIFT, SCI_VCHOMEEXTEND},
VK_END, SCI_NORM, SCI_LINEEND, {SCK_HOME, SCI_CTRL, SCI_DOCUMENTSTART},
VK_END, SCI_SHIFT, SCI_LINEENDEXTEND, {SCK_HOME, SCI_CSHIFT, SCI_DOCUMENTSTARTEXTEND},
VK_END, SCI_CTRL, SCI_DOCUMENTEND, {SCK_END, SCI_NORM, SCI_LINEEND},
VK_END, SCI_CSHIFT, SCI_DOCUMENTENDEXTEND, {SCK_END, SCI_SHIFT, SCI_LINEENDEXTEND},
VK_PRIOR, SCI_NORM, SCI_PAGEUP, {SCK_END, SCI_CTRL, SCI_DOCUMENTEND},
VK_PRIOR, SCI_SHIFT, SCI_PAGEUPEXTEND, {SCK_END, SCI_CSHIFT, SCI_DOCUMENTENDEXTEND},
VK_NEXT, SCI_NORM, SCI_PAGEDOWN, {SCK_PRIOR, SCI_NORM, SCI_PAGEUP},
VK_NEXT, SCI_SHIFT, SCI_PAGEDOWNEXTEND, {SCK_PRIOR, SCI_SHIFT, SCI_PAGEUPEXTEND},
VK_DELETE, SCI_NORM, WM_CLEAR, {SCK_NEXT, SCI_NORM, SCI_PAGEDOWN},
VK_DELETE, SCI_SHIFT, WM_CUT, {SCK_NEXT, SCI_SHIFT, SCI_PAGEDOWNEXTEND},
VK_DELETE, SCI_CTRL, SCI_DELWORDRIGHT, {SCK_DELETE, SCI_NORM, SCI_CLEAR},
VK_INSERT, SCI_NORM, SCI_EDITTOGGLEOVERTYPE, {SCK_DELETE, SCI_SHIFT, SCI_CUT},
VK_INSERT, SCI_SHIFT, WM_PASTE, {SCK_DELETE, SCI_CTRL, SCI_DELWORDRIGHT},
VK_INSERT, SCI_CTRL, WM_COPY, {SCK_INSERT, SCI_NORM, SCI_EDITTOGGLEOVERTYPE},
VK_ESCAPE, SCI_NORM, SCI_CANCEL, {SCK_INSERT, SCI_SHIFT, SCI_PASTE},
VK_BACK, SCI_NORM, SCI_DELETEBACK, {SCK_INSERT, SCI_CTRL, SCI_COPY},
VK_BACK, SCI_CTRL, SCI_DELWORDLEFT, {SCK_ESCAPE, SCI_NORM, SCI_CANCEL},
'Z', SCI_CTRL, WM_UNDO, {SCK_BACK, SCI_NORM, SCI_DELETEBACK},
'Y', SCI_CTRL, SCI_REDO, {SCK_BACK, SCI_SHIFT, SCI_DELETEBACK},
'X', SCI_CTRL, WM_CUT, {SCK_BACK, SCI_CTRL, SCI_DELWORDLEFT},
'C', SCI_CTRL, WM_COPY, {SCK_BACK, SCI_ALT, SCI_UNDO},
'V', SCI_CTRL, WM_PASTE, {'Z', SCI_CTRL, SCI_UNDO},
'A', SCI_CTRL, SCI_SELECTALL, {'Y', SCI_CTRL, SCI_REDO},
VK_TAB, SCI_NORM, SCI_TAB, {'X', SCI_CTRL, SCI_CUT},
VK_TAB, SCI_SHIFT, SCI_BACKTAB, {'C', SCI_CTRL, SCI_COPY},
VK_RETURN, SCI_NORM, SCI_NEWLINE, {'V', SCI_CTRL, SCI_PASTE},
'L', SCI_CTRL, SCI_FORMFEED, {'A', SCI_CTRL, SCI_SELECTALL},
VK_ADD, SCI_CTRL, SCI_ZOOMIN, {SCK_TAB, SCI_NORM, SCI_TAB},
VK_SUBTRACT, SCI_CTRL, SCI_ZOOMOUT, {SCK_TAB, SCI_SHIFT, SCI_BACKTAB},
0,0,0, {SCK_RETURN, SCI_NORM, SCI_NEWLINE},
{SCK_ADD, SCI_CTRL, SCI_ZOOMIN},
{SCK_SUBTRACT, SCI_CTRL, SCI_ZOOMOUT},
{SCK_DIVIDE, SCI_CTRL, SCI_SETZOOM},
//'L', SCI_CTRL, SCI_FORMFEED,
{'L', SCI_CTRL, SCI_LINECUT},
{'L', SCI_CSHIFT, SCI_LINEDELETE},
{'T', SCI_CTRL, SCI_LINETRANSPOSE},
{'U', SCI_CTRL, SCI_LOWERCASE},
{'U', SCI_CSHIFT, SCI_UPPERCASE},
{0,0,0},
}; };

View File

@@ -7,16 +7,17 @@
#define KEYTOCOMMAND_H #define KEYTOCOMMAND_H
#define SCI_NORM 0 #define SCI_NORM 0
#define SCI_SHIFT SHIFT_PRESSED #define SCI_SHIFT SCMOD_SHIFT
#define SCI_CTRL LEFT_CTRL_PRESSED #define SCI_CTRL SCMOD_CTRL
#define SCI_ALT LEFT_ALT_PRESSED #define SCI_ALT SCMOD_ALT
#define SCI_CSHIFT (SCI_CTRL | SCI_SHIFT) #define SCI_CSHIFT (SCI_CTRL | SCI_SHIFT)
#define SCI_ASHIFT (SCI_ALT | SCI_SHIFT)
class KeyToCommand { class KeyToCommand {
public: public:
int key; int key;
int modifiers; int modifiers;
UINT msg; unsigned int msg;
}; };
class KeyMap { class KeyMap {
@@ -28,8 +29,8 @@ public:
KeyMap(); KeyMap();
~KeyMap(); ~KeyMap();
void Clear(); void Clear();
void AssignCmdKey(int key, int modifiers, UINT msg); void AssignCmdKey(int key, int modifiers, unsigned int msg);
UINT Find(int key, int modifiers); // 0 returned on failure unsigned int Find(int key, int modifiers); // 0 returned on failure
}; };
#endif #endif

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,262 @@
// SciTE - Scintilla based Text Editor
// LexCPP.cxx - lexer for C++, C, Java, and Javascript
// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed.
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <stdarg.h>
#include "Platform.h"
#include "PropSet.h"
#include "Accessor.h"
#include "KeyWords.h"
#include "Scintilla.h"
#include "SciLexer.h"
static bool classifyWordCpp(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {
char s[100];
for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
s[i] = styler[start + i];
s[i + 1] = '\0';
}
bool wordIsUUID = false;
char chAttr = SCE_C_IDENTIFIER;
if (isdigit(s[0]) || (s[0] == '.'))
chAttr = SCE_C_NUMBER;
else {
if (keywords.InList(s)) {
chAttr = SCE_C_WORD;
wordIsUUID = strcmp(s, "uuid") == 0;
}
}
styler.ColourTo(end, chAttr);
return wordIsUUID;
}
static void ColouriseCppDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
Accessor &styler) {
WordList &keywords = *keywordlists[0];
styler.StartAt(startPos);
bool fold = styler.GetPropertyInt("fold");
bool stylingWithinPreprocessor = styler.GetPropertyInt("styling.within.preprocessor");
int lineCurrent = styler.GetLine(startPos);
int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
int levelCurrent = levelPrev;
int state = initStyle;
if (state == SCE_C_STRINGEOL) // Does not leak onto next line
state = SCE_C_DEFAULT;
char chPrev = ' ';
char chNext = styler[startPos];
unsigned int lengthDoc = startPos + length;
int visibleChars = 0;
styler.StartSegment(startPos);
bool lastWordWasUUID = false;
for (unsigned int i = startPos; i < lengthDoc; i++) {
char ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
if ((ch == '\r' && chNext != '\n') || (ch == '\n')) {
// Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix)
// Avoid triggering two times on Dos/Win
// End of line
if (state == SCE_C_STRINGEOL) {
styler.ColourTo(i, state);
state = SCE_C_DEFAULT;
}
if (fold) {
int lev = levelPrev;
if (visibleChars == 0)
lev |= SC_FOLDLEVELWHITEFLAG;
if ((levelCurrent > levelPrev) && (visibleChars > 0))
lev |= SC_FOLDLEVELHEADERFLAG;
styler.SetLevel(lineCurrent, lev);
lineCurrent++;
levelPrev = levelCurrent;
}
visibleChars = 0;
}
if (!isspace(ch))
visibleChars++;
if (styler.IsLeadByte(ch)) {
chNext = styler.SafeGetCharAt(i + 2);
chPrev = ' ';
i += 1;
continue;
}
if (state == SCE_C_DEFAULT) {
if (ch == '@' && chNext == '\"') {
styler.ColourTo(i-1, state);
state = SCE_C_VERBATIM;
i++;
ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
} else if (iswordstart(ch) || (ch == '@')) {
styler.ColourTo(i-1, state);
if (lastWordWasUUID) {
state = SCE_C_UUID;
lastWordWasUUID = false;
} else {
state = SCE_C_IDENTIFIER;
}
} else if (ch == '/' && chNext == '*') {
styler.ColourTo(i-1, state);
if (styler.SafeGetCharAt(i + 2) == '*')
state = SCE_C_COMMENTDOC;
else
state = SCE_C_COMMENT;
} else if (ch == '/' && chNext == '/') {
styler.ColourTo(i-1, state);
state = SCE_C_COMMENTLINE;
} else if (ch == '\"') {
styler.ColourTo(i-1, state);
state = SCE_C_STRING;
} else if (ch == '\'') {
styler.ColourTo(i-1, state);
state = SCE_C_CHARACTER;
} else if (ch == '#' && visibleChars == 1) {
// Preprocessor commands are alone on their line
styler.ColourTo(i-1, state);
state = SCE_C_PREPROCESSOR;
// Skip whitespace between # and preprocessor word
do {
i++;
ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
} while (isspace(ch) && (i < lengthDoc));
} else if (isoperator(ch)) {
styler.ColourTo(i-1, state);
styler.ColourTo(i, SCE_C_OPERATOR);
if ((ch == '{') || (ch == '}')) {
levelCurrent += (ch == '{') ? 1 : -1;
}
}
} else if (state == SCE_C_IDENTIFIER) {
if (!iswordchar(ch)) {
lastWordWasUUID = classifyWordCpp(styler.GetStartSegment(), i - 1, keywords, styler);
state = SCE_C_DEFAULT;
if (ch == '/' && chNext == '*') {
if (styler.SafeGetCharAt(i + 2) == '*')
state = SCE_C_COMMENTDOC;
else
state = SCE_C_COMMENT;
} else if (ch == '/' && chNext == '/') {
state = SCE_C_COMMENTLINE;
} else if (ch == '\"') {
state = SCE_C_STRING;
} else if (ch == '\'') {
state = SCE_C_CHARACTER;
} else if (isoperator(ch)) {
styler.ColourTo(i, SCE_C_OPERATOR);
if ((ch == '{') || (ch == '}')) {
levelCurrent += (ch == '{') ? 1 : -1;
}
}
}
} else {
if (state == SCE_C_PREPROCESSOR) {
if (stylingWithinPreprocessor) {
if (isspace(ch)) {
styler.ColourTo(i-1, state);
state = SCE_C_DEFAULT;
}
} else {
if ((ch == '\r' || ch == '\n') && !(chPrev == '\\' || chPrev == '\r')) {
styler.ColourTo(i-1, state);
state = SCE_C_DEFAULT;
}
}
} else if (state == SCE_C_COMMENT) {
if (ch == '/' && chPrev == '*') {
if (((i > styler.GetStartSegment() + 2) || (
(initStyle == SCE_C_COMMENT) &&
(styler.GetStartSegment() == static_cast<unsigned int>(startPos))))) {
styler.ColourTo(i, state);
state = SCE_C_DEFAULT;
}
}
} else if (state == SCE_C_COMMENTDOC) {
if (ch == '/' && chPrev == '*') {
if (((i > styler.GetStartSegment() + 2) || (
(initStyle == SCE_C_COMMENTDOC) &&
(styler.GetStartSegment() == static_cast<unsigned int>(startPos))))) {
styler.ColourTo(i, state);
state = SCE_C_DEFAULT;
}
}
} else if (state == SCE_C_COMMENTLINE) {
if (ch == '\r' || ch == '\n') {
styler.ColourTo(i-1, state);
state = SCE_C_DEFAULT;
}
} else if (state == SCE_C_STRING) {
if (ch == '\\') {
if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
i++;
ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
}
} else if (ch == '\"') {
styler.ColourTo(i, state);
state = SCE_C_DEFAULT;
} else if (chNext == '\r' || chNext == '\n') {
styler.ColourTo(i-1, SCE_C_STRINGEOL);
state = SCE_C_STRINGEOL;
}
} else if (state == SCE_C_CHARACTER) {
if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) {
styler.ColourTo(i-1, SCE_C_STRINGEOL);
state = SCE_C_STRINGEOL;
} else if (ch == '\\') {
if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
i++;
ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
}
} else if (ch == '\'') {
styler.ColourTo(i, state);
state = SCE_C_DEFAULT;
}
} else if (state == SCE_C_VERBATIM) {
if (ch == '\"') {
if (chNext == '\"') {
i++;
ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
} else {
styler.ColourTo(i, state);
state = SCE_C_DEFAULT;
}
}
} else if (state == SCE_C_UUID) {
if (ch == '\r' || ch == '\n' || ch == ')') {
styler.ColourTo(i-1, state);
if (ch == ')')
styler.ColourTo(i, SCE_C_OPERATOR);
state = SCE_C_DEFAULT;
}
}
}
chPrev = ch;
}
styler.ColourTo(lengthDoc - 1, state);
// Fill in the real level of the next line, keeping the current flags as they will be filled in later
if (fold) {
int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
//styler.SetLevel(lineCurrent, levelCurrent | flagsNext);
styler.SetLevel(lineCurrent, levelPrev | flagsNext);
}
}
LexerModule lmCPP(SCLEX_CPP, ColouriseCppDoc);

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,298 @@
// LexLua.cxx - lexer for Lua language
// Written by Paul Winwood
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdarg.h>
#include <stdio.h>
#include <fcntl.h>
#include "Platform.h"
#include "PropSet.h"
#include "Accessor.h"
#include "KeyWords.h"
#include "Scintilla.h"
#include "SciLexer.h"
static void classifyWordLua(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler)
{
char s[100];
bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.');
for (unsigned int i = 0; i < end - start + 1 && i < 30; i++)
{
s[i] = styler[start + i];
s[i + 1] = '\0';
}
char chAttr = SCE_LUA_IDENTIFIER;
if (wordIsNumber)
chAttr = SCE_LUA_NUMBER;
else
{
if (keywords.InList(s))
{
chAttr = SCE_LUA_WORD;
}
}
styler.ColourTo(end, chAttr);
}
static void ColouriseLuaDoc(unsigned int startPos,
int length,
int initStyle,
WordList *keywordlists[],
Accessor &styler)
{
WordList &keywords = *keywordlists[0];
styler.StartAt(startPos);
styler.GetLine(startPos);
int state = initStyle;
char chPrev = ' ';
char chNext = styler[startPos];
unsigned int lengthDoc = startPos + length;
bool firstChar = true;
int literalString = 0;
styler.StartSegment(startPos);
for (unsigned int i = startPos; i <= lengthDoc; i++)
{
char ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
if (styler.IsLeadByte(ch))
{
chNext = styler.SafeGetCharAt(i + 2);
chPrev = ' ';
i += 1;
continue;
}
if (state == SCE_LUA_STRINGEOL)
{
if (ch != '\r' && ch != '\n')
{
styler.ColourTo(i-1, state);
state = SCE_LUA_DEFAULT;
}
}
if (state == SCE_LUA_LITERALSTRING && ch == '[' && chNext == '[')
{
literalString++;
}
else
if (state == SCE_LUA_DEFAULT)
{
if (ch == '-' && chNext == '-')
{
styler.ColourTo(i-1, state);
state = SCE_LUA_COMMENTLINE;
}
else
if (ch == '[' && chNext == '[')
{
state = SCE_LUA_LITERALSTRING;
literalString = 1;
}
else
if (iswordstart(ch))
{
styler.ColourTo(i-1, state);
state = SCE_LUA_WORD;
}
else
if (ch == '\"')
{
styler.ColourTo(i-1, state);
state = SCE_LUA_STRING;
}
else
if (ch == '\'')
{
styler.ColourTo(i-1, state);
state = SCE_LUA_CHARACTER;
}
else
if (ch == '$' && firstChar)
{
styler.ColourTo(i-1, state);
state = SCE_LUA_PREPROCESSOR;
}
else
if (isoperator(ch))
{
styler.ColourTo(i-1, state);
styler.ColourTo(i, SCE_LUA_OPERATOR);
}
}
else
if (state == SCE_LUA_WORD)
{
if (!iswordchar(ch))
{
classifyWordLua(styler.GetStartSegment(), i - 1, keywords, styler);
state = SCE_LUA_DEFAULT;
if (ch == '[' && chNext == '[')
{
literalString = 1;
state = SCE_LUA_LITERALSTRING;
}
else
if (ch == '-' && chNext == '-')
{
state = SCE_LUA_COMMENTLINE;
}
else
if (ch == '\"')
{
state = SCE_LUA_STRING;
}
else
if (ch == '\'')
{
state = SCE_LUA_CHARACTER;
}
else
if (ch == '$' && firstChar)
{
state = SCE_LUA_PREPROCESSOR;
}
else
if (isoperator(ch))
{
styler.ColourTo(i, SCE_LUA_OPERATOR);
}
}
}
else
{
if (state == SCE_LUA_LITERALSTRING)
{
if (ch == ']' && (chPrev == ']') && (--literalString == 0))
{
styler.ColourTo(i, state);
state = SCE_LUA_DEFAULT;
}
}
else
if (state == SCE_LUA_PREPROCESSOR)
{
if ((ch == '\r' || ch == '\n') && (chPrev != '\\'))
{
styler.ColourTo(i-1, state);
state = SCE_LUA_DEFAULT;
}
}
else
if (state == SCE_LUA_COMMENTLINE)
{
if (ch == '\r' || ch == '\n')
{
styler.ColourTo(i-1, state);
state = SCE_LUA_DEFAULT;
}
}
else
if (state == SCE_LUA_STRING)
{
if ((ch == '\r' || ch == '\n') && (chPrev != '\\'))
{
styler.ColourTo(i-1, state);
state = SCE_LUA_STRINGEOL;
}
else
if (ch == '\\')
{
if (chNext == '\"' || chNext == '\\')
{
i++;
ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
}
}
else
if (ch == '\"')
{
styler.ColourTo(i, state);
state = SCE_LUA_DEFAULT;
i++;
ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
}
}
else
if (state == SCE_LUA_CHARACTER)
{
if ((ch == '\r' || ch == '\n') && (chPrev != '\\'))
{
styler.ColourTo(i-1, state);
state = SCE_LUA_STRINGEOL;
}
else
if (ch == '\\')
{
if (chNext == '\'' || chNext == '\\')
{
i++;
ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
}
}
else
if (ch == '\'')
{
styler.ColourTo(i, state);
state = SCE_LUA_DEFAULT;
i++;
ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
}
}
if (state == SCE_LUA_DEFAULT)
{
if (ch == '-' && chNext == '-')
{
state = SCE_LUA_COMMENTLINE;
}
else
if (ch == '\"')
{
state = SCE_LUA_STRING;
}
else
if (ch == '\'')
{
state = SCE_LUA_CHARACTER;
}
else
if (ch == '$' && firstChar)
{
state = SCE_LUA_PREPROCESSOR;
}
else
if (iswordstart(ch))
{
state = SCE_LUA_WORD;
}
else
if (isoperator(ch))
{
styler.ColourTo(i, SCE_LUA_OPERATOR);
}
}
}
chPrev = ch;
firstChar = (ch == '\r' || ch == '\n');
}
styler.ColourTo(lengthDoc - 1, state);
}
LexerModule lmLua(SCLEX_LUA, ColouriseLuaDoc);

View File

@@ -0,0 +1,351 @@
// SciTE - Scintilla based Text Editor
// LexOthers.cxx - lexers for properties files, batch files, make files and error lists
// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed.
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <stdarg.h>
#include "Platform.h"
#include "PropSet.h"
#include "Accessor.h"
#include "KeyWords.h"
#include "Scintilla.h"
#include "SciLexer.h"
static void ColouriseBatchLine(char *lineBuffer, int endLine, Accessor &styler) {
if (0 == strncmp(lineBuffer, "REM", 3)) {
styler.ColourTo(endLine, 1);
} else if (0 == strncmp(lineBuffer, "rem", 3)) {
styler.ColourTo(endLine, 1);
} else if (0 == strncmp(lineBuffer, "SET", 3)) {
styler.ColourTo(endLine, 2);
} else if (0 == strncmp(lineBuffer, "set", 3)) {
styler.ColourTo(endLine, 2);
} else if (lineBuffer[0] == ':') {
styler.ColourTo(endLine, 3);
} else {
styler.ColourTo(endLine, 0);
}
}
static void ColouriseBatchDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {
char lineBuffer[1024];
styler.StartAt(startPos);
styler.StartSegment(startPos);
unsigned int linePos = 0;
for (unsigned int i = startPos; i < startPos + length; i++) {
lineBuffer[linePos++] = styler[i];
if (styler[i] == '\r' || styler[i] == '\n' || (linePos >= sizeof(lineBuffer) - 1)) {
ColouriseBatchLine(lineBuffer, i, styler);
linePos = 0;
}
}
if (linePos > 0)
ColouriseBatchLine(lineBuffer, startPos + length, styler);
}
static void ColouriseDiffLine(char *lineBuffer, int endLine, Accessor &styler) {
// It is needed to remember the current state to recognize starting
// comment lines before the first "diff " or "--- ". If a real
// difference starts then each line starting with ' ' is a whitespace
// otherwise it is considered a comment (Only in..., Binary file...)
if (0 == strncmp(lineBuffer, "diff ", 3)) {
styler.ColourTo(endLine, 2);
} else if (0 == strncmp(lineBuffer, "--- ", 3)) {
styler.ColourTo(endLine, 3);
} else if (0 == strncmp(lineBuffer, "+++ ", 3)) {
styler.ColourTo(endLine, 3);
} else if (lineBuffer[0] == '@') {
styler.ColourTo(endLine, 4);
} else if (lineBuffer[0] == '-') {
styler.ColourTo(endLine, 5);
} else if (lineBuffer[0] == '+') {
styler.ColourTo(endLine, 6);
} else if (lineBuffer[0] != ' ') {
styler.ColourTo(endLine, 1);
} else {
styler.ColourTo(endLine, 0);
}
}
static void ColouriseDiffDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {
char lineBuffer[1024];
styler.StartAt(startPos);
styler.StartSegment(startPos);
unsigned int linePos = 0;
for (unsigned int i = startPos; i < startPos + length; i++) {
lineBuffer[linePos++] = styler[i];
if (styler[i] == '\r' || styler[i] == '\n' || (linePos >= sizeof(lineBuffer) - 1)) {
ColouriseDiffLine(lineBuffer, i, styler);
linePos = 0;
}
}
if (linePos > 0)
ColouriseDiffLine(lineBuffer, startPos + length, styler);
}
static void ColourisePropsLine(char *lineBuffer, int lengthLine, int startLine, int endPos, Accessor &styler) {
int i = 0;
while (isspace(lineBuffer[i]) && (i < lengthLine)) // Skip initial spaces
i++;
if (lineBuffer[i] == '#' || lineBuffer[i] == '!' || lineBuffer[i] == ';') {
styler.ColourTo(endPos, 1);
} else if (lineBuffer[i] == '[') {
styler.ColourTo(endPos, 2);
} else if (lineBuffer[i] == '@') {
styler.ColourTo(startLine+i, 4);
if (lineBuffer[++i] == '=')
styler.ColourTo(startLine+i, 3);
styler.ColourTo(endPos, 0);
} else {
while (lineBuffer[i] != '=' && (i < lengthLine)) // Search the '=' character
i++;
if (lineBuffer[i] == '=') {
styler.ColourTo(startLine+i-1, 0);
styler.ColourTo(startLine+i, 3);
styler.ColourTo(endPos, 0);
} else {
styler.ColourTo(endPos, 0);
}
}
}
static void ColourisePropsDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {
char lineBuffer[1024];
styler.StartAt(startPos);
styler.StartSegment(startPos);
unsigned int linePos = 0;
int startLine = startPos;
for (unsigned int i = startPos; i <= startPos + length; i++) {
lineBuffer[linePos++] = styler[i];
if ((styler[i] == '\r' && styler.SafeGetCharAt(i+1) != '\n') ||
styler[i] == '\n' ||
(linePos >= sizeof(lineBuffer) - 1)) {
lineBuffer[linePos] = '\0';
ColourisePropsLine(lineBuffer, linePos, startLine, i, styler);
linePos = 0;
startLine = i+1;
}
}
if (linePos > 0)
ColourisePropsLine(lineBuffer, linePos, startLine, startPos + length, styler);
}
static void ColouriseMakeLine(char *lineBuffer, int lengthLine, int endPos, Accessor &styler) {
int i = 0;
while (isspace(lineBuffer[i]) && (i < lengthLine))
i++;
if (lineBuffer[i] == '#' || lineBuffer[i] == '!') {
styler.ColourTo(endPos, 1);
} else {
styler.ColourTo(endPos, 0);
}
}
static void ColouriseMakeDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {
char lineBuffer[1024];
styler.StartAt(startPos);
styler.StartSegment(startPos);
unsigned int linePos = 0;
for (unsigned int i = startPos; i <= startPos + length; i++) {
lineBuffer[linePos++] = styler[i];
if (styler[i] == '\r' || styler[i] == '\n' || (linePos >= sizeof(lineBuffer) - 1)) {
ColouriseMakeLine(lineBuffer, linePos, i, styler);
linePos = 0;
}
}
if (linePos > 0)
ColouriseMakeLine(lineBuffer, linePos, startPos + length, styler);
}
static void ColouriseErrorListLine(char *lineBuffer, int lengthLine, int endPos, Accessor &styler) {
if (lineBuffer[0] == '>') {
// Command or return status
styler.ColourTo(endPos, SCE_ERR_CMD);
} else if (strstr(lineBuffer, "File \"") && strstr(lineBuffer, ", line ")) {
styler.ColourTo(endPos, SCE_ERR_PYTHON);
} else if (0 == strncmp(lineBuffer, "Error ", strlen("Error "))) {
// Borland error message
styler.ColourTo(endPos, SCE_ERR_BORLAND);
} else if (0 == strncmp(lineBuffer, "Warning ", strlen("Warning "))) {
// Borland warning message
styler.ColourTo(endPos, SCE_ERR_BORLAND);
} else if (strstr(lineBuffer, " at " ) &&
strstr(lineBuffer, " at " ) < lineBuffer+lengthLine &&
strstr(lineBuffer, " line ") &&
strstr(lineBuffer, " line ") < lineBuffer+lengthLine) {
// perl error message
styler.ColourTo(endPos, SCE_ERR_PERL);
} else {
// Look for <filename>:<line>:message
// Look for <filename>(line)message
// Look for <filename>(line,pos)message
int state = 0;
for (int i = 0; i < lengthLine; i++) {
if (state == 0 && lineBuffer[i] == ':' && isdigit(lineBuffer[i + 1])) {
state = 1;
} else if (state == 0 && lineBuffer[i] == '(') {
state = 10;
} else if (state == 1 && isdigit(lineBuffer[i])) {
state = 2;
} else if (state == 2 && lineBuffer[i] == ':') {
state = 3;
break;
} else if (state == 2 && !isdigit(lineBuffer[i])) {
state = 99;
} else if (state == 10 && isdigit(lineBuffer[i])) {
state = 11;
} else if (state == 11 && lineBuffer[i] == ',') {
state = 14;
} else if (state == 11 && lineBuffer[i] == ')') {
state = 12;
} else if (state == 12 && lineBuffer[i] == ':') {
state = 13;
} else if (state == 14 && lineBuffer[i] == ')') {
state = 15;
break;
} else if (((state == 11) || (state == 14)) && !((lineBuffer[i] == ' ') || isdigit(lineBuffer[i]))) {
state = 99;
}
}
if (state == 3) {
styler.ColourTo(endPos, SCE_ERR_GCC);
} else if ((state == 13) || (state == 14) || (state == 15)) {
styler.ColourTo(endPos, SCE_ERR_MS);
} else {
styler.ColourTo(endPos, SCE_ERR_DEFAULT);
}
}
}
static void ColouriseErrorListDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {
char lineBuffer[1024];
styler.StartAt(startPos);
styler.StartSegment(startPos);
unsigned int linePos = 0;
for (unsigned int i = startPos; i <= startPos + length; i++) {
lineBuffer[linePos++] = styler[i];
if (styler[i] == '\r' || styler[i] == '\n' || (linePos >= sizeof(lineBuffer) - 1)) {
ColouriseErrorListLine(lineBuffer, linePos, i, styler);
linePos = 0;
}
}
if (linePos > 0)
ColouriseErrorListLine(lineBuffer, linePos, startPos + length, styler);
}
static int isSpecial(char s) {
return (s == '\\') || (s == ',') || (s == ';') || (s == '\'') || (s == ' ') ||
(s == '\"') || (s == '`') || (s == '^') || (s == '~');
}
static int isTag(int start, Accessor &styler) {
char s[6];
unsigned int i = 0, e=1;
while (i < 5 && e) {
s[i] = styler[start + i];
i++;
e = styler[start + i] != '{';
}
s[i] = '\0';
return (strcmp(s, "begin") == 0) || (strcmp(s, "end") == 0);
}
static void ColouriseLatexDoc(unsigned int startPos, int length, int initStyle,
WordList *[], Accessor &styler) {
styler.StartAt(startPos);
int state = initStyle;
char chNext = styler[startPos];
styler.StartSegment(startPos);
int lengthDoc = startPos + length;
for (int i = startPos; i < lengthDoc; i++) {
char ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
if (styler.IsLeadByte(ch)) {
chNext = styler.SafeGetCharAt(i + 2);
i++;
continue;
}
switch(state) {
case SCE_L_DEFAULT :
switch(ch) {
case '\\' :
styler.ColourTo(i - 1, state);
if (isSpecial(styler[i + 1])) {
styler.ColourTo(i + 1, SCE_L_COMMAND);
i++;
chNext = styler.SafeGetCharAt(i + 1);
}
else {
if (isTag(i+1, styler))
state = SCE_L_TAG;
else
state = SCE_L_COMMAND;
}
break;
case '$' :
styler.ColourTo(i - 1, state);
state = SCE_L_MATH;
if (chNext == '$') {
i++;
chNext = styler.SafeGetCharAt(i + 1);
}
break;
case '%' :
styler.ColourTo(i - 1, state);
state = SCE_L_COMMENT;
break;
}
break;
case SCE_L_COMMAND :
if (chNext == '[' || chNext == '{' || chNext == '}' ||
chNext == ' ' || chNext == '\r' || chNext == '\n') {
styler.ColourTo(i, state);
state = SCE_L_DEFAULT;
i++;
chNext = styler.SafeGetCharAt(i + 1);
}
break;
case SCE_L_TAG :
if (ch == '}') {
styler.ColourTo(i, state);
state = SCE_L_DEFAULT;
}
break;
case SCE_L_MATH :
if (ch == '$') {
if (chNext == '$') {
i++;
chNext = styler.SafeGetCharAt(i + 1);
}
styler.ColourTo(i, state);
state = SCE_L_DEFAULT;
}
break;
case SCE_L_COMMENT :
if (ch == '\r' || ch == '\n') {
styler.ColourTo(i - 1, state);
state = SCE_L_DEFAULT;
}
}
}
styler.ColourTo(lengthDoc, state);
}
LexerModule lmBatch(SCLEX_BATCH, ColouriseBatchDoc);
LexerModule lmDiff(SCLEX_DIFF, ColouriseDiffDoc);
LexerModule lmProps(SCLEX_PROPERTIES, ColourisePropsDoc);
LexerModule lmMake(SCLEX_MAKEFILE, ColouriseMakeDoc);
LexerModule lmErrorList(SCLEX_ERRORLIST, ColouriseErrorListDoc);
LexerModule lmLatex(SCLEX_LATEX, ColouriseLatexDoc);

View File

@@ -0,0 +1,508 @@
// SciTE - Scintilla based Text Editor
// LexPerl.cxx - lexer for subset of Perl
// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed.
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <stdarg.h>
#include "Platform.h"
#include "PropSet.h"
#include "Accessor.h"
#include "KeyWords.h"
#include "Scintilla.h"
#include "SciLexer.h"
inline bool isPerlOperator(char ch) {
if (isalnum(ch))
return false;
// '.' left out as it is used to make up numbers
if (ch == '%' || ch == '^' || ch == '&' || ch == '*' || ch == '\\' ||
ch == '(' || ch == ')' || ch == '-' || ch == '+' ||
ch == '=' || ch == '|' || ch == '{' || ch == '}' ||
ch == '[' || ch == ']' || ch == ':' || ch == ';' ||
ch == '<' || ch == '>' || ch == ',' || ch == '/' ||
ch == '?' || ch == '!' || ch == '.' || ch == '~')
return true;
return false;
}
static int classifyWordPerl(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {
char s[100];
bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.');
for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
s[i] = styler[start + i];
s[i + 1] = '\0';
}
char chAttr = SCE_PL_IDENTIFIER;
if (wordIsNumber)
chAttr = SCE_PL_NUMBER;
else {
if (keywords.InList(s))
chAttr = SCE_PL_WORD;
}
styler.ColourTo(end, chAttr);
return chAttr;
}
static bool isEndVar(char ch) {
return !isalnum(ch) && ch != '#' && ch != '$' &&
ch != '_' && ch != '\'';
}
static bool isMatch(Accessor &styler, int lengthDoc, int pos, const char *val) {
if ((pos + static_cast<int>(strlen(val))) >= lengthDoc) {
return false;
}
while (*val) {
if (*val != styler[pos++]) {
return false;
}
val++;
}
return true;
}
static char opposite(char ch) {
if (ch == '(')
return ')';
if (ch == '[')
return ']';
if (ch == '{')
return '}';
if (ch == '<')
return '>';
return ch;
}
static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
WordList *keywordlists[], Accessor &styler) {
// Lexer for perl often has to backtrack to start of current style to determine
// which characters are being used as quotes, how deeply nested is the
// start position and what the termination string is for here documents
WordList &keywords = *keywordlists[0];
char sooked[100];
int quotes = 0;
char quoteDown = 'd';
char quoteUp = 'd';
int quoteRep = 1;
int sookedpos = 0;
bool preferRE = true;
sooked[sookedpos] = '\0';
int state = initStyle;
int lengthDoc = startPos + length;
// If in a long distance lexical state, seek to the beginning to find quote characters
if (state == SCE_PL_HERE || state == SCE_PL_REGEX ||
state == SCE_PL_REGSUBST || state == SCE_PL_LONGQUOTE) {
while ((startPos > 1) && (styler.StyleAt(startPos - 1) == state)) {
startPos--;
}
state = SCE_PL_DEFAULT;
}
styler.StartAt(startPos);
char chPrev = styler.SafeGetCharAt(startPos - 1);
char chNext = styler[startPos];
styler.StartSegment(startPos);
for (int i = startPos; i < lengthDoc; i++) {
char ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
char chNext2 = styler.SafeGetCharAt(i + 2);
if (styler.IsLeadByte(ch)) {
chNext = styler.SafeGetCharAt(i + 2);
chPrev = ' ';
i += 1;
continue;
}
if (state == SCE_PL_DEFAULT) {
if (iswordstart(ch)) {
styler.ColourTo(i - 1, state);
if (ch == 's' && !isalnum(chNext)) {
state = SCE_PL_REGSUBST;
quotes = 0;
quoteUp = '\0';
quoteDown = '\0';
quoteRep = 2;
} else if (ch == 'm' && !isalnum(chNext)) {
state = SCE_PL_REGEX;
quotes = 0;
quoteUp = '\0';
quoteDown = '\0';
quoteRep = 1;
} else if (ch == 't' && chNext == 'r' && !isalnum(chNext2)) {
state = SCE_PL_REGSUBST;
quotes = 0;
quoteUp = '\0';
quoteDown = '\0';
quoteRep = 2;
i++;
chNext = chNext2;
} else if (ch == 'q' && (chNext == 'q' || chNext == 'r' || chNext == 'w' || chNext == 'x') && !isalnum(chNext2)) {
state = SCE_PL_LONGQUOTE;
i++;
chNext = chNext2;
quotes = 0;
quoteUp = '\0';
quoteDown = '\0';
quoteRep = 1;
} else {
state = SCE_PL_WORD;
preferRE = false;
}
} else if (ch == '#') {
styler.ColourTo(i - 1, state);
state = SCE_PL_COMMENTLINE;
} else if (ch == '\"') {
styler.ColourTo(i - 1, state);
state = SCE_PL_STRING;
} else if (ch == '\'') {
if (chPrev == '&') {
// Archaic call
styler.ColourTo(i, state);
} else {
styler.ColourTo(i - 1, state);
state = SCE_PL_CHARACTER;
}
} else if (ch == '`') {
styler.ColourTo(i - 1, state);
state = SCE_PL_BACKTICKS;
} else if (ch == '$') {
preferRE = false;
styler.ColourTo(i - 1, state);
if (isalnum(chNext) || chNext == '#' || chNext == '$' || chNext == '_') {
state = SCE_PL_SCALAR;
} else if (chNext != '{' && chNext != '[') {
styler.ColourTo(i, SCE_PL_SCALAR);
i++;
ch = ' ';
chNext = ' ';
} else {
styler.ColourTo(i, SCE_PL_SCALAR);
}
} else if (ch == '@') {
preferRE = false;
styler.ColourTo(i - 1, state);
if (isalpha(chNext) || chNext == '#' || chNext == '$' || chNext == '_') {
state = SCE_PL_ARRAY;
} else if (chNext != '{' && chNext != '[') {
styler.ColourTo(i, SCE_PL_ARRAY);
i++;
ch = ' ';
} else {
styler.ColourTo(i, SCE_PL_ARRAY);
}
} else if (ch == '%') {
preferRE = false;
styler.ColourTo(i - 1, state);
if (isalpha(chNext) || chNext == '#' || chNext == '$' || chNext == '_') {
state = SCE_PL_HASH;
} else if (chNext != '{' && chNext != '[') {
styler.ColourTo(i, SCE_PL_HASH);
i++;
ch = ' ';
} else {
styler.ColourTo(i, SCE_PL_HASH);
}
} else if (ch == '*') {
styler.ColourTo(i - 1, state);
state = SCE_PL_SYMBOLTABLE;
} else if (ch == '/' && preferRE) {
styler.ColourTo(i - 1, state);
state = SCE_PL_REGEX;
quoteUp = '/';
quoteDown = '/';
quotes = 1;
quoteRep = 1;
} else if (ch == '<' && chNext == '<') {
styler.ColourTo(i - 1, state);
state = SCE_PL_HERE;
i++;
ch = chNext;
chNext = chNext2;
quotes = 0;
sookedpos = 0;
sooked[sookedpos] = '\0';
} else if (ch == '=' && (chPrev == '\r' || chPrev == '\n') && isalpha(chNext)) {
styler.ColourTo(i - 1, state);
state = SCE_PL_POD;
quotes = 0;
sookedpos = 0;
sooked[sookedpos] = '\0';
} else if (isPerlOperator(ch)) {
if (ch == ')' || ch == ']')
preferRE = false;
else
preferRE = true;
styler.ColourTo(i - 1, state);
styler.ColourTo(i, SCE_PL_OPERATOR);
}
} else if (state == SCE_PL_WORD) {
if (!iswordchar(ch) && ch != '\'') { // Archaic Perl has quotes inside names
if (isMatch(styler, lengthDoc, styler.GetStartSegment(), "__DATA__")) {
styler.ColourTo(i, SCE_PL_DATASECTION);
state = SCE_PL_DATASECTION;
} else if (isMatch(styler, lengthDoc, styler.GetStartSegment(), "__END__")) {
styler.ColourTo(i, SCE_PL_DATASECTION);
state = SCE_PL_DATASECTION;
} else {
if (classifyWordPerl(styler.GetStartSegment(), i - 1, keywords, styler) == SCE_PL_WORD)
preferRE = true;
state = SCE_PL_DEFAULT;
if (ch == '#') {
state = SCE_PL_COMMENTLINE;
} else if (ch == '\"') {
state = SCE_PL_STRING;
} else if (ch == '\'') {
state = SCE_PL_CHARACTER;
} else if (ch == '<' && chNext == '<') {
state = SCE_PL_HERE;
quotes = 0;
sookedpos = 0;
sooked[sookedpos] = '\0';
} else if (isPerlOperator(ch)) {
if (ch == ')' || ch == ']')
preferRE = false;
else
preferRE = true;
styler.ColourTo(i, SCE_PL_OPERATOR);
state = SCE_PL_DEFAULT;
}
}
}
} else {
if (state == SCE_PL_COMMENTLINE) {
if (ch == '\r' || ch == '\n') {
styler.ColourTo(i - 1, state);
state = SCE_PL_DEFAULT;
}
} else if (state == SCE_PL_HERE) {
if ((isalnum(ch) || ch == '_') && quotes < 2) {
sooked[sookedpos++] = ch;
sooked[sookedpos] = '\0';
if (quotes == 0)
quotes = 1;
} else {
quotes++;
}
if ((quotes > 1) &&
(chPrev == '\n' || chPrev == '\r') &&
isMatch(styler, lengthDoc, i, sooked)) {
i += sookedpos;
chNext = styler.SafeGetCharAt(i);
if (chNext == '\n' || chNext == '\r') {
styler.ColourTo(i - 1, SCE_PL_HERE);
state = SCE_PL_DEFAULT;
}
ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
}
} else if (state == SCE_PL_STRING) {
if (ch == '\\') {
if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
i++;
ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
}
} else if (ch == '\"') {
styler.ColourTo(i, state);
state = SCE_PL_DEFAULT;
i++;
ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
}
} else if (state == SCE_PL_CHARACTER) {
if (ch == '\\') {
if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
i++;
ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
}
} else if (ch == '\'') {
styler.ColourTo(i, state);
state = SCE_PL_DEFAULT;
i++;
ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
}
} else if (state == SCE_PL_BACKTICKS) {
if (ch == '`') {
styler.ColourTo(i, state);
state = SCE_PL_DEFAULT;
i++;
ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
}
} else if (state == SCE_PL_POD) {
if (ch == '=' && (chPrev == '\r' || chPrev == '\n')) {
if (isMatch(styler, lengthDoc, i, "=cut")) {
styler.ColourTo(i - 1 + 4, state);
i += 4;
state = SCE_PL_DEFAULT;
ch = styler.SafeGetCharAt(i);
chNext = styler.SafeGetCharAt(i + 1);
}
}
} else if (state == SCE_PL_SCALAR) {
if (isEndVar(ch)) {
styler.ColourTo(i - 1, state);
state = SCE_PL_DEFAULT;
}
} else if (state == SCE_PL_ARRAY) {
if (isEndVar(ch)) {
styler.ColourTo(i - 1, state);
state = SCE_PL_DEFAULT;
}
} else if (state == SCE_PL_HASH) {
if (isEndVar(ch)) {
styler.ColourTo(i - 1, state);
state = SCE_PL_DEFAULT;
}
} else if (state == SCE_PL_SYMBOLTABLE) {
if (isEndVar(ch)) {
styler.ColourTo(i - 1, state);
state = SCE_PL_DEFAULT;
}
} else if (state == SCE_PL_REF) {
if (isEndVar(ch)) {
styler.ColourTo(i - 1, state);
state = SCE_PL_DEFAULT;
}
} else if (state == SCE_PL_REGEX) {
if (!quoteUp && !isspace(ch)) {
quoteUp = ch;
quoteDown = opposite(ch);
quotes++;
} else {
if (ch == quoteDown && chPrev != '\\') {
quotes--;
if (quotes == 0) {
quoteRep--;
if (quoteUp == quoteDown) {
quotes++;
}
}
if (!isalpha(chNext)) {
if (quoteRep <= 0) {
styler.ColourTo(i, state);
state = SCE_PL_DEFAULT;
ch = ' ';
}
}
} else if (ch == quoteUp && chPrev != '\\') {
quotes++;
} else if (!isalpha(chNext)) {
if (quoteRep <= 0) {
styler.ColourTo(i, state);
state = SCE_PL_DEFAULT;
ch = ' ';
}
}
}
} else if (state == SCE_PL_REGSUBST) {
if (!quoteUp && !isspace(ch)) {
quoteUp = ch;
quoteDown = opposite(ch);
quotes++;
} else {
if (quotes == 0 && quoteRep == 1) {
/* We matched something like s(...) or tr{...}
* and are looking for the next matcher characters,
* which could be either bracketed ({...}) or non-bracketed
* (/.../).
*
* Number-signs are problematic. If they occur after
* the close of the first part, treat them like
* a quoteUp char, even if they actually start comments.
*
* If we find an alnum, we end the regsubst, and punt.
*
* Eric Promislow ericp@activestate.com Aug 9,2000
*/
if (isspace(ch)) {
// Keep going
} else if (isalnum(ch)) {
styler.ColourTo(i, state);
state = SCE_PL_DEFAULT;
ch = ' ';
} else {
quoteUp = ch;
quoteDown = opposite(ch);
quotes++;
}
} else if (ch == quoteDown && chPrev != '\\') {
quotes--;
if (quotes == 0) {
quoteRep--;
}
if (!isalpha(chNext)) {
if (quoteRep <= 0) {
styler.ColourTo(i, state);
state = SCE_PL_DEFAULT;
ch = ' ';
}
}
if (quoteUp == quoteDown) {
quotes++;
}
} else if (ch == quoteUp && chPrev != '\\') {
quotes++;
} else if (!isalpha(chNext)) {
if (quoteRep <= 0) {
styler.ColourTo(i, state);
state = SCE_PL_DEFAULT;
ch = ' ';
}
}
}
} else if (state == SCE_PL_LONGQUOTE) {
if (!quoteDown && !isspace(ch)) {
quoteUp = ch;
quoteDown = opposite(quoteUp);
quotes++;
} else if (ch == quoteDown) {
quotes--;
if (quotes == 0) {
quoteRep--;
if (quoteRep <= 0) {
styler.ColourTo(i, state);
state = SCE_PL_DEFAULT;
ch = ' ';
}
if (quoteUp == quoteDown) {
quotes++;
}
}
} else if (ch == quoteUp) {
quotes++;
}
}
if (state == SCE_PL_DEFAULT) { // One of the above succeeded
if (ch == '#') {
state = SCE_PL_COMMENTLINE;
} else if (ch == '\"') {
state = SCE_PL_STRING;
} else if (ch == '\'') {
state = SCE_PL_CHARACTER;
} else if (iswordstart(ch)) {
state = SCE_PL_WORD;
preferRE = false;
} else if (isoperator(ch)) {
styler.ColourTo(i, SCE_PL_OPERATOR);
}
}
}
chPrev = ch;
}
styler.ColourTo(lengthDoc, state);
}
LexerModule lmPerl(SCLEX_PERL, ColourisePerlDoc);

View File

@@ -0,0 +1,281 @@
// SciTE - Scintilla based Text Editor
// LexPython.cxx - lexer for Python
// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed.
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <stdarg.h>
#include "Platform.h"
#include "PropSet.h"
#include "Accessor.h"
#include "KeyWords.h"
#include "Scintilla.h"
#include "SciLexer.h"
static void ClassifyWordPy(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord) {
char s[100];
bool wordIsNumber = isdigit(styler[start]);
for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
s[i] = styler[start + i];
s[i + 1] = '\0';
}
char chAttr = SCE_P_IDENTIFIER;
if (0 == strcmp(prevWord, "class"))
chAttr = SCE_P_CLASSNAME;
else if (0 == strcmp(prevWord, "def"))
chAttr = SCE_P_DEFNAME;
else if (wordIsNumber)
chAttr = SCE_P_NUMBER;
else if (keywords.InList(s))
chAttr = SCE_P_WORD;
// make sure that dot-qualifiers inside the word are lexed correct
else for (unsigned int i = 0; i < end - start + 1; i++) {
if (styler[start + i] == '.') {
styler.ColourTo(start + i - 1, chAttr);
styler.ColourTo(start + i, SCE_P_OPERATOR);
}
}
styler.ColourTo(end, chAttr);
strcpy(prevWord, s);
}
static bool IsPyComment(Accessor &styler, int pos, int len) {
return len>0 && styler[pos]=='#';
}
static void ColourisePyDoc(unsigned int startPos, int length, int initStyle,
WordList *keywordlists[], Accessor &styler) {
int lengthDoc = startPos + length;
// Backtrack to previous line in case need to fix its fold status or tab whinging
int lineCurrent = styler.GetLine(startPos);
if (startPos > 0) {
if (lineCurrent > 0) {
lineCurrent--;
startPos = styler.LineStart(lineCurrent);
if (startPos == 0)
initStyle = SCE_P_DEFAULT;
else
initStyle = styler.StyleAt(startPos-1);
}
}
// Python uses a different mask because bad indentation is marked by oring with 32
styler.StartAt(startPos, 127);
WordList &keywords = *keywordlists[0];
bool fold = styler.GetPropertyInt("fold");
int whingeLevel = styler.GetPropertyInt("tab.timmy.whinge.level");
char prevWord[200];
prevWord[0] = '\0';
if (length == 0)
return ;
int spaceFlags = 0;
int state = initStyle & 31;
int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsPyComment);
if ((state == SCE_P_TRIPLE) || (state == SCE_P_TRIPLEDOUBLE))
indentCurrent |= SC_FOLDLEVELWHITEFLAG;
char chPrev = ' ';
char chPrev2 = ' ';
char chNext = styler[startPos];
styler.StartSegment(startPos);
bool atStartLine = true;
for (int i = startPos; i < lengthDoc; i++) {
if (atStartLine) {
char chBad = static_cast<char>(64);
char chGood = static_cast<char>(0);
char chFlags = chGood;
if (whingeLevel == 1) {
chFlags = (spaceFlags & wsInconsistent) ? chBad : chGood;
} else if (whingeLevel == 2) {
chFlags = (spaceFlags & wsSpaceTab) ? chBad : chGood;
} else if (whingeLevel == 3) {
chFlags = (spaceFlags & wsSpace) ? chBad : chGood;
} else if (whingeLevel == 4) {
chFlags = (spaceFlags & wsTab) ? chBad : chGood;
}
styler.SetFlags(chFlags, static_cast<char>(state));
atStartLine = false;
}
char ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
char chNext2 = styler.SafeGetCharAt(i + 2);
if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc)) {
if ((state == SCE_P_DEFAULT) || (state == SCE_P_TRIPLE) || (state == SCE_P_TRIPLEDOUBLE)) {
// Perform colourisation of white space and triple quoted strings at end of each line to allow
// tab marking to work inside white space and triple quoted strings
styler.ColourTo(i, state);
}
int lev = indentCurrent;
int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsPyComment);
if ((state == SCE_P_TRIPLE) || (state == SCE_P_TRIPLEDOUBLE))
indentNext |= SC_FOLDLEVELWHITEFLAG;
if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) {
// Only non whitespace lines can be headers
if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK)) {
lev |= SC_FOLDLEVELHEADERFLAG;
} else if (indentNext & SC_FOLDLEVELWHITEFLAG) {
// Line after is blank so check the next - maybe should continue further?
int spaceFlags2 = 0;
int indentNext2 = styler.IndentAmount(lineCurrent + 2, &spaceFlags2, IsPyComment);
if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) {
lev |= SC_FOLDLEVELHEADERFLAG;
}
}
}
indentCurrent = indentNext;
if (fold) {
styler.SetLevel(lineCurrent, lev);
}
lineCurrent++;
atStartLine = true;
}
if (styler.IsLeadByte(ch)) {
chNext = styler.SafeGetCharAt(i + 2);
chPrev = ' ';
chPrev2 = ' ';
i += 1;
continue;
}
if (state == SCE_P_STRINGEOL) {
if (ch != '\r' && ch != '\n') {
styler.ColourTo(i - 1, state);
state = SCE_P_DEFAULT;
}
}
if (state == SCE_P_DEFAULT) {
if (iswordstart(ch)) {
styler.ColourTo(i - 1, state);
state = SCE_P_WORD;
} else if (ch == '#') {
styler.ColourTo(i - 1, state);
state = chNext == '#' ? SCE_P_COMMENTBLOCK : SCE_P_COMMENTLINE;
} else if (ch == '\"') {
styler.ColourTo(i - 1, state);
if (chNext == '\"' && chNext2 == '\"') {
i += 2;
state = SCE_P_TRIPLEDOUBLE;
ch = ' ';
chPrev = ' ';
chNext = styler.SafeGetCharAt(i + 1);
} else {
state = SCE_P_STRING;
}
} else if (ch == '\'') {
styler.ColourTo(i - 1, state);
if (chNext == '\'' && chNext2 == '\'') {
i += 2;
state = SCE_P_TRIPLE;
ch = ' ';
chPrev = ' ';
chNext = styler.SafeGetCharAt(i + 1);
} else {
state = SCE_P_CHARACTER;
}
} else if (isoperator(ch)) {
styler.ColourTo(i - 1, state);
styler.ColourTo(i, SCE_P_OPERATOR);
}
} else if (state == SCE_P_WORD) {
if (!iswordchar(ch)) {
ClassifyWordPy(styler.GetStartSegment(), i - 1, keywords, styler, prevWord);
state = SCE_P_DEFAULT;
if (ch == '#') {
state = chNext == '#' ? SCE_P_COMMENTBLOCK : SCE_P_COMMENTLINE;
} else if (ch == '\"') {
if (chNext == '\"' && chNext2 == '\"') {
i += 2;
state = SCE_P_TRIPLEDOUBLE;
ch = ' ';
chPrev = ' ';
chNext = styler.SafeGetCharAt(i + 1);
} else {
state = SCE_P_STRING;
}
} else if (ch == '\'') {
if (chNext == '\'' && chNext2 == '\'') {
i += 2;
state = SCE_P_TRIPLE;
ch = ' ';
chPrev = ' ';
chNext = styler.SafeGetCharAt(i + 1);
} else {
state = SCE_P_CHARACTER;
}
} else if (isoperator(ch)) {
styler.ColourTo(i, SCE_P_OPERATOR);
}
}
} else {
if (state == SCE_P_COMMENTLINE || state == SCE_P_COMMENTBLOCK) {
if (ch == '\r' || ch == '\n') {
styler.ColourTo(i - 1, state);
state = SCE_P_DEFAULT;
}
} else if (state == SCE_P_STRING) {
if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) {
styler.ColourTo(i - 1, state);
state = SCE_P_STRINGEOL;
} else if (ch == '\\') {
if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
i++;
ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
}
} else if (ch == '\"') {
styler.ColourTo(i, state);
state = SCE_P_DEFAULT;
}
} else if (state == SCE_P_CHARACTER) {
if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) {
styler.ColourTo(i - 1, state);
state = SCE_P_STRINGEOL;
} else if (ch == '\\') {
if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
i++;
ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
}
} else if (ch == '\'') {
styler.ColourTo(i, state);
state = SCE_P_DEFAULT;
}
} else if (state == SCE_P_TRIPLE) {
if (ch == '\'' && chPrev == '\'' && chPrev2 == '\'') {
styler.ColourTo(i, state);
state = SCE_P_DEFAULT;
}
} else if (state == SCE_P_TRIPLEDOUBLE) {
if (ch == '\"' && chPrev == '\"' && chPrev2 == '\"') {
styler.ColourTo(i, state);
state = SCE_P_DEFAULT;
}
}
}
chPrev2 = chPrev;
chPrev = ch;
}
if (state == SCE_P_WORD) {
ClassifyWordPy(styler.GetStartSegment(), lengthDoc, keywords, styler, prevWord);
} else {
styler.ColourTo(lengthDoc, state);
}
}
LexerModule lmPython(SCLEX_PYTHON, ColourisePyDoc);

View File

@@ -0,0 +1,156 @@
// SciTE - Scintilla based Text Editor
// LexSQL.cxx - lexer for SQL
// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed.
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <stdarg.h>
#include "Platform.h"
#include "PropSet.h"
#include "Accessor.h"
#include "KeyWords.h"
#include "Scintilla.h"
#include "SciLexer.h"
static void classifyWordSQL(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {
char s[100];
bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.');
for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
s[i] = static_cast<char>(toupper(styler[start + i]));
s[i + 1] = '\0';
}
char chAttr = SCE_C_IDENTIFIER;
if (wordIsNumber)
chAttr = SCE_C_NUMBER;
else {
if (keywords.InList(s))
chAttr = SCE_C_WORD;
}
styler.ColourTo(end, chAttr);
}
static void ColouriseSQLDoc(unsigned int startPos, int length,
int initStyle, WordList *keywordlists[], Accessor &styler) {
WordList &keywords = *keywordlists[0];
styler.StartAt(startPos);
bool fold = styler.GetPropertyInt("fold");
int lineCurrent = styler.GetLine(startPos);
int spaceFlags = 0;
int state = initStyle;
char chPrev = ' ';
char chNext = styler[startPos];
styler.StartSegment(startPos);
unsigned int lengthDoc = startPos + length;
for (unsigned int i = startPos; i < lengthDoc; i++) {
char ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
if ((ch == '\r' && chNext != '\n') || (ch == '\n')) {
int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags);
int lev = indentCurrent;
if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) {
// Only non whitespace lines can be headers
int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags);
if (indentCurrent < (indentNext & ~SC_FOLDLEVELWHITEFLAG)) {
lev |= SC_FOLDLEVELHEADERFLAG;
}
}
if (fold) {
styler.SetLevel(lineCurrent, lev);
}
}
if (styler.IsLeadByte(ch)) {
chNext = styler.SafeGetCharAt(i + 2);
chPrev = ' ';
i += 1;
continue;
}
if (state == SCE_C_DEFAULT) {
if (iswordstart(ch)) {
styler.ColourTo(i - 1, state);
state = SCE_C_WORD;
} else if (ch == '/' && chNext == '*') {
styler.ColourTo(i - 1, state);
state = SCE_C_COMMENT;
} else if (ch == '-' && chNext == '-') {
styler.ColourTo(i - 1, state);
state = SCE_C_COMMENTLINE;
} else if (ch == '\'') {
styler.ColourTo(i - 1, state);
state = SCE_C_STRING;
} else if (isoperator(ch)) {
styler.ColourTo(i - 1, state);
styler.ColourTo(i, SCE_C_OPERATOR);
}
} else if (state == SCE_C_WORD) {
if (!iswordchar(ch)) {
classifyWordSQL(styler.GetStartSegment(), i - 1, keywords, styler);
state = SCE_C_DEFAULT;
if (ch == '/' && chNext == '*') {
state = SCE_C_COMMENT;
} else if (ch == '-' && chNext == '-') {
state = SCE_C_COMMENTLINE;
} else if (ch == '\'') {
state = SCE_C_STRING;
} else if (isoperator(ch)) {
styler.ColourTo(i, SCE_C_OPERATOR);
}
}
} else {
if (state == SCE_C_COMMENT) {
if (ch == '/' && chPrev == '*') {
if (((i > (styler.GetStartSegment() + 2)) || ((initStyle == SCE_C_COMMENT) &&
(styler.GetStartSegment() == startPos)))) {
styler.ColourTo(i, state);
state = SCE_C_DEFAULT;
}
}
} else if (state == SCE_C_COMMENTLINE) {
if (ch == '\r' || ch == '\n') {
styler.ColourTo(i - 1, state);
state = SCE_C_DEFAULT;
}
} else if (state == SCE_C_STRING) {
if (ch == '\'') {
if ( chNext == '\'' ) {
i++;
} else {
styler.ColourTo(i, state);
state = SCE_C_DEFAULT;
i++;
}
ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
}
}
if (state == SCE_C_DEFAULT) { // One of the above succeeded
if (ch == '/' && chNext == '*') {
state = SCE_C_COMMENT;
} else if (ch == '-' && chNext == '-') {
state = SCE_C_COMMENTLINE;
} else if (ch == '\'') {
state = SCE_C_STRING;
} else if (iswordstart(ch)) {
state = SCE_C_WORD;
} else if (isoperator(ch)) {
styler.ColourTo(i, SCE_C_OPERATOR);
}
}
}
chPrev = ch;
}
styler.ColourTo(lengthDoc - 1, state);
}
LexerModule lmSQL(SCLEX_SQL, ColouriseSQLDoc);

View File

@@ -0,0 +1,139 @@
// SciTE - Scintilla based Text Editor
// LexVB.cxx - lexer for Visual Basic and VBScript
// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed.
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <stdarg.h>
#include "Platform.h"
#include "PropSet.h"
#include "Accessor.h"
#include "KeyWords.h"
#include "Scintilla.h"
#include "SciLexer.h"
static int classifyWordVB(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {
char s[100];
bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.') ||
(styler[start] == '&' && tolower(styler[start+1]) == 'h');
unsigned int i;
for (i = 0; i < end - start + 1 && i < 30; i++) {
s[i] = static_cast<char>(tolower(styler[start + i]));
}
s[i] = '\0';
char chAttr = SCE_C_DEFAULT;
if (wordIsNumber)
chAttr = SCE_C_NUMBER;
else {
if (strcmp(s, "rem") == 0)
chAttr = SCE_C_COMMENTLINE;
else if (keywords.InList(s))
chAttr = SCE_C_WORD;
}
styler.ColourTo(end, chAttr);
if (chAttr == SCE_C_COMMENTLINE)
return SCE_C_COMMENTLINE;
else
return SCE_C_DEFAULT;
}
static void ColouriseVBDoc(unsigned int startPos, int length, int initStyle,
WordList *keywordlists[], Accessor &styler) {
WordList &keywords = *keywordlists[0];
styler.StartAt(startPos);
int visibleChars = 0;
int state = initStyle;
char chNext = styler[startPos];
styler.StartSegment(startPos);
int lengthDoc = startPos + length;
for (int i = startPos; i < lengthDoc; i++) {
char ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
if (styler.IsLeadByte(ch)) {
chNext = styler.SafeGetCharAt(i + 2);
i += 1;
continue;
}
if (ch == '\r' || ch == '\n') {
// End of line
if (state == SCE_C_COMMENTLINE || state == SCE_C_PREPROCESSOR) {
styler.ColourTo(i - 1, state);
state = SCE_C_DEFAULT;
}
visibleChars = 0;
}
if (!isspace(ch))
visibleChars++;
if (state == SCE_C_DEFAULT) {
if (iswordstart(ch)) {
styler.ColourTo(i - 1, state);
state = SCE_C_WORD;
} else if (ch == '\'') {
styler.ColourTo(i - 1, state);
state = SCE_C_COMMENTLINE;
} else if (ch == '\"') {
styler.ColourTo(i - 1, state);
state = SCE_C_STRING;
} else if (ch == '#' && visibleChars == 1) {
// Preprocessor commands are alone on their line
styler.ColourTo(i - 1, state);
state = SCE_C_PREPROCESSOR;
} else if (ch == '&' && tolower(chNext) == 'h') {
styler.ColourTo(i - 1, state);
state = SCE_C_WORD;
} else if (isoperator(ch)) {
styler.ColourTo(i - 1, state);
styler.ColourTo(i, SCE_C_OPERATOR);
}
} else if (state == SCE_C_WORD) {
if (!iswordchar(ch)) {
state = classifyWordVB(styler.GetStartSegment(), i - 1, keywords, styler);
if (state == SCE_C_DEFAULT) {
if (ch == '\'') {
state = SCE_C_COMMENTLINE;
} else if (ch == '\"') {
state = SCE_C_STRING;
} else if (isoperator(ch)) {
styler.ColourTo(i - 1, state);
styler.ColourTo(i, SCE_C_OPERATOR);
}
}
}
} else {
if (state == SCE_C_STRING) {
// VB doubles quotes to preserve them
if (ch == '\"') {
styler.ColourTo(i, state);
state = SCE_C_DEFAULT;
i++;
ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
}
}
if (state == SCE_C_DEFAULT) { // One of the above succeeded
if (ch == '\'') {
state = SCE_C_COMMENTLINE;
} else if (ch == '\"') {
state = SCE_C_STRING;
} else if (iswordstart(ch)) {
state = SCE_C_WORD;
}
}
}
}
styler.ColourTo(lengthDoc, state);
}
LexerModule lmVB(SCLEX_VB, ColouriseVBDoc);

View File

@@ -51,20 +51,6 @@ void LineMarker::Draw(Surface *surface, PRectangle &rc) {
} else if (markType == SC_MARK_PLUS) { } else if (markType == SC_MARK_PLUS) {
int armSize = dimOn2-2; int armSize = dimOn2-2;
Point xpts[] = {
Point(centreX - armSize, centreY),
Point(centreX, centreY),
Point(centreX, centreY - armSize),
Point(centreX, centreY - armSize),
Point(centreX, centreY),
Point(centreX + armSize, centreY),
Point(centreX + armSize, centreY),
Point(centreX, centreY),
Point(centreX, centreY + armSize),
Point(centreX, centreY + armSize),
Point(centreX, centreY),
Point(centreX - armSize, centreY),
};
Point pts[] = { Point pts[] = {
Point(centreX - armSize, centreY - 1), Point(centreX - armSize, centreY - 1),
Point(centreX - 1, centreY - 1), Point(centreX - 1, centreY - 1),
@@ -90,12 +76,6 @@ void LineMarker::Draw(Surface *surface, PRectangle &rc) {
Point(centreX + armSize, centreY +1), Point(centreX + armSize, centreY +1),
Point(centreX - armSize, centreY + 1), Point(centreX - armSize, centreY + 1),
}; };
Point xpts[] = {
Point(centreX - armSize, centreY),
Point(centreX + armSize, centreY),
Point(centreX + armSize, centreY),
Point(centreX - armSize, centreY),
};
surface->Polygon(pts, sizeof(pts) / sizeof(pts[0]), surface->Polygon(pts, sizeof(pts) / sizeof(pts[0]),
fore.allocated, back.allocated); fore.allocated, back.allocated);

File diff suppressed because it is too large Load Diff

View File

@@ -24,9 +24,22 @@ bool EqualCaseInsensitive(const char *a, const char *b) {
#endif #endif
} }
SString::size_type SString::npos = -1;
inline unsigned int HashString(const char *s) {
unsigned int ret = 0;
while (*s) {
ret <<= 4;
ret ^= *s;
s++;
}
return ret;
}
// Get a line of input. If end of line escaped with '\\' then continue reading. // Get a line of input. If end of line escaped with '\\' then continue reading.
static bool GetFullLine(const char *&fpc, int &lenData, char *s, int len) { static bool GetFullLine(const char *&fpc, int &lenData, char *s, int len) {
bool continuation = true; bool continuation = true;
s[0] = '\0';
while ((len > 1) && lenData > 0) { while ((len > 1) && lenData > 0) {
char ch = *fpc; char ch = *fpc;
fpc++; fpc++;
@@ -38,7 +51,7 @@ static bool GetFullLine(const char *&fpc, int &lenData, char *s, int len) {
fpc++; fpc++;
lenData--; lenData--;
} }
*s++ = '\0'; *s = '\0';
return true; return true;
} }
} else if ((ch == '\\') && (lenData > 0) && ((*fpc == '\r') || (*fpc == '\n'))) { } else if ((ch == '\\') && (lenData > 0) && ((*fpc == '\r') || (*fpc == '\n'))) {
@@ -46,6 +59,7 @@ static bool GetFullLine(const char *&fpc, int &lenData, char *s, int len) {
} else { } else {
continuation = false; continuation = false;
*s++ = ch; *s++ = ch;
*s = '\0';
len--; len--;
} }
} }
@@ -54,47 +68,39 @@ static bool GetFullLine(const char *&fpc, int &lenData, char *s, int len) {
PropSet::PropSet() { PropSet::PropSet() {
superPS = 0; superPS = 0;
size = 10; for (int root=0; root < hashRoots; root++)
used = 0; props[root] = 0;
vals = new char * [size];
} }
PropSet::~PropSet() { PropSet::~PropSet() {
superPS = 0; superPS = 0;
Clear(); Clear();
delete []vals;
}
void PropSet::EnsureCanAddEntry() {
if (used >= size - 2) {
int newsize = size + 10;
char **newvals = new char * [newsize];
for (int i = 0; i < used; i++) {
newvals[i] = vals[i];
}
delete []vals;
vals = newvals;
size = newsize;
}
} }
void PropSet::Set(const char *key, const char *val) { void PropSet::Set(const char *key, const char *val) {
EnsureCanAddEntry(); unsigned int hash = HashString(key);
for (int i = 0; i < used; i += 2) { for (Property *p=props[hash % hashRoots]; p; p=p->next) {
if (EqualCaseInsensitive(vals[i], key)) { if ((hash == p->hash) && (0 == strcmp(p->key, key))) {
// Replace current value // Replace current value
delete [](vals[i + 1]); delete [](p->val);
vals[i + 1] = StringDup(val); p->val = StringDup(val);
return; return;
} }
} }
// Not found // Not found
vals[used++] = StringDup(key); Property *pNew = new Property;
vals[used++] = StringDup(val); if (pNew) {
pNew->hash = HashString(key);
pNew->key = StringDup(key);
pNew->val = StringDup(val);
pNew->next = props[hash % hashRoots];
props[hash % hashRoots] = pNew;
}
} }
void PropSet::Set(char *keyval) { void PropSet::Set(char *keyval) {
while (isspace(*keyval))
keyval++;
char *eqat = strchr(keyval, '='); char *eqat = strchr(keyval, '=');
if (eqat) { if (eqat) {
*eqat = '\0'; *eqat = '\0';
@@ -104,11 +110,12 @@ void PropSet::Set(char *keyval) {
} }
SString PropSet::Get(const char *key) { SString PropSet::Get(const char *key) {
for (int i = 0; i < used; i += 2) { unsigned int hash = HashString(key);
if (EqualCaseInsensitive(vals[i], key)) { for (Property *p=props[hash % hashRoots]; p; p=p->next) {
return vals[i + 1]; if ((hash == p->hash) && (0 == strcmp(p->key, key))) {
} return p->val;
} }
}
if (superPS) { if (superPS) {
// Failed here, so try in base property set // Failed here, so try in base property set
return superPS->Get(key); return superPS->Get(key);
@@ -117,17 +124,47 @@ SString PropSet::Get(const char *key) {
} }
} }
SString PropSet::GetExpanded(const char *key) {
SString val = Get(key);
return Expand(val.c_str());
}
SString PropSet::Expand(const char *withvars) {
char *base = StringDup(withvars);
char *cpvar = strstr(base, "$(");
while (cpvar) {
char *cpendvar = strchr(cpvar, ')');
if (cpendvar) {
int lenvar = cpendvar - cpvar - 2; // Subtract the $()
char *var = StringDup(cpvar+2, lenvar);
SString val = GetExpanded(var);
int newlenbase = strlen(base) + val.length() - lenvar;
char *newbase = new char[newlenbase];
strncpy(newbase, base, cpvar - base);
strcpy(newbase + (cpvar - base), val.c_str());
strcpy(newbase + (cpvar - base) + val.length(), cpendvar + 1);
delete []var;
delete []base;
base = newbase;
}
cpvar = strstr(base, "$(");
}
SString sret = base;
delete []base;
return sret;
}
int PropSet::GetInt(const char *key, int defaultValue) { int PropSet::GetInt(const char *key, int defaultValue) {
SString val = Get(key); SString val = Get(key);
if (val.length()) if (val.length())
return Get(key).value(); return val.value();
else else
return defaultValue; return defaultValue;
} }
bool isprefix(const char *target, const char *prefix) { inline bool isprefix(const char *target, const char *prefix) {
while (*target && *prefix) { while (*target && *prefix) {
if (toupper(*target) != toupper(*prefix)) if (*target != *prefix)
return false; return false;
target++; target++;
prefix++; prefix++;
@@ -144,64 +181,63 @@ bool issuffix(const char *target, const char *suffix) {
if (lensuffix > lentarget) if (lensuffix > lentarget)
return false; return false;
for (int i = lensuffix - 1; i >= 0; i--) { for (int i = lensuffix - 1; i >= 0; i--) {
if (toupper(target[i + lentarget - lensuffix]) != toupper(suffix[i])) if (target[i + lentarget - lensuffix] != suffix[i])
return false; return false;
} }
return true; return true;
} }
SString PropSet::GetWild(const char *keybase, const char *filename) { SString PropSet::GetWild(const char *keybase, const char *filename) {
for (int i = 0; i < used; i += 2) { for (int root=0; root < hashRoots; root++) {
if (isprefix(vals[i], keybase)) { for (Property *p=props[root]; p; p=p->next) {
char *orgkeyfile = vals[i] + strlen(keybase); if (isprefix(p->key, keybase)) {
char *keyfile = NULL; char *orgkeyfile = p->key + strlen(keybase);
char *keyfile = NULL;
if (strstr(orgkeyfile, "$(") == orgkeyfile) { if (strstr(orgkeyfile, "$(") == orgkeyfile) {
char *cpendvar = strchr(orgkeyfile, ')'); char *cpendvar = strchr(orgkeyfile, ')');
if (cpendvar) { if (cpendvar) {
int lenvar = cpendvar - orgkeyfile - 2; // Subtract the $() *cpendvar = '\0';
char *var = static_cast<char *>(malloc(lenvar + 1)); SString s = Get(orgkeyfile + 2);
strncpy(var, orgkeyfile + 2, lenvar); *cpendvar= ')';
var[lenvar] = '\0'; keyfile = strdup(s.c_str());
SString s = Get(var); }
free(var); }
keyfile = strdup(s.c_str()); char *keyptr = keyfile;
}
}
char *keyptr = keyfile;
if (keyfile == NULL) if (keyfile == NULL)
keyfile = orgkeyfile; keyfile = orgkeyfile;
for (; ; ) { for (; ; ) {
char *del = strchr(keyfile, ';'); char *del = strchr(keyfile, ';');
if (del == NULL) if (del == NULL)
del = keyfile + strlen(keyfile); del = keyfile + strlen(keyfile);
char delchr = *del; char delchr = *del;
*del = '\0'; *del = '\0';
if (*keyfile == '*') { if (*keyfile == '*') {
if (issuffix(filename, keyfile + 1)) { if (issuffix(filename, keyfile + 1)) {
*del = delchr; *del = delchr;
free(keyptr); free(keyptr);
return vals[i + 1]; return p->val;
} }
} else if (EqualCaseInsensitive(keyfile, filename)) { } else if (0 == strcmp(keyfile, filename)) {
*del = delchr; *del = delchr;
free(keyptr); free(keyptr);
return vals[i + 1]; return p->val;
} }
if (delchr == '\0') if (delchr == '\0')
break; break;
*del = delchr; *del = delchr;
keyfile = del + 1; keyfile = del + 1;
} }
free(keyptr); free(keyptr);
if (EqualCaseInsensitive(vals[i], keybase)) { if (0 == strcmp(p->key, keybase)) {
return vals[i + 1]; return p->val;
} }
} }
} }
}
if (superPS) { if (superPS) {
// Failed here, so try in base property set // Failed here, so try in base property set
return superPS->GetWild(keybase, filename); return superPS->GetWild(keybase, filename);
@@ -217,9 +253,7 @@ SString PropSet::GetNewExpand(const char *keybase, const char *filename) {
char *cpendvar = strchr(cpvar, ')'); char *cpendvar = strchr(cpvar, ')');
if (cpendvar) { if (cpendvar) {
int lenvar = cpendvar - cpvar - 2; // Subtract the $() int lenvar = cpendvar - cpvar - 2; // Subtract the $()
char *var = new char[lenvar + 1]; char *var = StringDup(cpvar+2, lenvar);
strncpy(var, cpvar + 2, lenvar);
var[lenvar] = '\0';
SString val = GetWild(var, filename); SString val = GetWild(var, filename);
int newlenbase = strlen(base) + val.length() - lenvar; int newlenbase = strlen(base) + val.length() - lenvar;
char *newbase = new char[newlenbase]; char *newbase = new char[newlenbase];
@@ -238,33 +272,54 @@ SString PropSet::GetNewExpand(const char *keybase, const char *filename) {
} }
void PropSet::Clear() { void PropSet::Clear() {
for (int i = 0; i < used; i++) { for (int root=0; root < hashRoots; root++) {
delete [](vals[i]); Property *p=props[root];
vals[i] = 0; while (p) {
} Property *pNext=p->next;
used = 0; p->hash = 0;
delete p->key;
p->key = 0;
delete p->val;
p->val = 0;
delete p;
p = pNext;
}
props[root] = 0;
}
} }
void PropSet::ReadFromMemory(const char *data, int len) { void PropSet::ReadFromMemory(const char *data, int len, const char *directoryForImports) {
if (len > 0) { const char *pd = data;
const char *pd = data; char linebuf[60000];
char linebuf[60000]; bool ifIsTrue = true;
while (GetFullLine(pd, len, linebuf, sizeof(linebuf))) { while (len > 0) {
if (isalpha(linebuf[0])) GetFullLine(pd, len, linebuf, sizeof(linebuf));
Set(linebuf); if (isalpha(linebuf[0])) // If clause ends with first non-indented line
ifIsTrue = true;
if (isprefix(linebuf, "if ")) {
const char *expr = linebuf + strlen("if") + 1;
ifIsTrue = GetInt(expr);
} else if (isprefix(linebuf, "import ") && directoryForImports) {
char importPath[1024];
strcpy(importPath, directoryForImports);
strcat(importPath, linebuf + strlen("import") + 1);
strcat(importPath, ".properties");
Read(importPath,directoryForImports);
} else if (isalpha(linebuf[0])) {
Set(linebuf);
} else if (isspace(linebuf[0]) && ifIsTrue) {
Set(linebuf);
} }
} }
} }
void PropSet::Read(const char *filename) { void PropSet::Read(const char *filename, const char *directoryForImports) {
//printf("Opening properties <%s>\n", filename);
Clear();
char propsData[60000]; char propsData[60000];
FILE *rcfile = fopen(filename, "rb"); FILE *rcfile = fopen(filename, "rb");
if (rcfile) { if (rcfile) {
int lenFile = fread(propsData, 1, sizeof(propsData), rcfile); int lenFile = fread(propsData, 1, sizeof(propsData), rcfile);
fclose(rcfile); fclose(rcfile);
ReadFromMemory(propsData, lenFile); ReadFromMemory(propsData, lenFile, directoryForImports);
} else { } else {
//printf("Could not open <%s>\n", filename); //printf("Could not open <%s>\n", filename);
} }
@@ -280,7 +335,8 @@ static bool iswordsep(char ch, bool onlyLineEnds) {
// Creates an array that points into each word in the string and puts \0 terminators // Creates an array that points into each word in the string and puts \0 terminators
// after each word. // after each word.
static char **ArrayFromWordList(char *wordlist, bool onlyLineEnds = false) { static char **ArrayFromWordList(char *wordlist, int *len, bool onlyLineEnds = false) {
#if 1
char prev = '\n'; char prev = '\n';
int words = 0; int words = 0;
for (int j = 0; wordlist[j]; j++) { for (int j = 0; wordlist[j]; j++) {
@@ -292,8 +348,8 @@ static char **ArrayFromWordList(char *wordlist, bool onlyLineEnds = false) {
if (keywords) { if (keywords) {
words = 0; words = 0;
prev = '\0'; prev = '\0';
int len = strlen(wordlist); int slen = strlen(wordlist);
for (int k = 0; k < len; k++) { for (int k = 0; k < slen; k++) {
if (!iswordsep(wordlist[k], onlyLineEnds)) { if (!iswordsep(wordlist[k], onlyLineEnds)) {
if (!prev) { if (!prev) {
keywords[words] = &wordlist[k]; keywords[words] = &wordlist[k];
@@ -304,25 +360,69 @@ static char **ArrayFromWordList(char *wordlist, bool onlyLineEnds = false) {
} }
prev = wordlist[k]; prev = wordlist[k];
} }
keywords[words] = &wordlist[len]; keywords[words] = &wordlist[slen];
*len = words;
} else {
*len = 0;
} }
#else
int words = 0; // length of the returned buffer of pointers
#undef APICHUNK // how many pointers will be pre-allocated (to avoid buffer reallocation on each new pointer)
#define APICHUNK 256
int size = APICHUNK; // real size of the returned buffer of pointers
char **keywords; // buffer for the pointers returned
int slen = strlen(wordlist); //length of the buffer with api file
keywords = (char**) malloc((size + 1) * sizeof (*keywords));
words = 0;
for (int k = 0;;) {
while (iswordsep(wordlist[k], onlyLineEnds))
wordlist[k++] = '\0';
if (k >= slen)
break;
if (words >= size) {
do
size += APICHUNK;
while (size <= words);
keywords = (char**) realloc(keywords, (size + 1) * sizeof (*keywords));
}
keywords[words++] = wordlist + k;
do
if (k < slen)
k++;
else
goto out;
while (!iswordsep(wordlist[k], onlyLineEnds));
}
out:
keywords[words] = wordlist + slen;
*len = words;
#endif
return keywords; return keywords;
} }
void WordList::Clear() { void WordList::Clear() {
if (words) { if (words) {
delete []words;
delete []list; delete []list;
#if 1
delete []words;
#else
free(words);
#endif
free(wordsNoCase);
} }
words = 0; words = 0;
wordsNoCase = 0;
list = 0; list = 0;
len = 0; len = 0;
sorted = false;
} }
void WordList::Set(const char *s) { void WordList::Set(const char *s) {
len = 0;
list = StringDup(s); list = StringDup(s);
words = ArrayFromWordList(list, onlyLineEnds); sorted = false;
words = ArrayFromWordList(list, &len, onlyLineEnds);
wordsNoCase = (char**) malloc ((len + 1) * sizeof (*wordsNoCase));
memcpy(wordsNoCase, words, (len + 1) * sizeof (*words));
} }
char *WordList::Allocate(int size) { char *WordList::Allocate(int size) {
@@ -332,46 +432,36 @@ char *WordList::Allocate(int size) {
} }
void WordList::SetFromAllocated() { void WordList::SetFromAllocated() {
len = 0; sorted = false;
words = ArrayFromWordList(list, onlyLineEnds); words = ArrayFromWordList(list, &len, onlyLineEnds);
wordsNoCase = (char**) malloc ((len + 1) * sizeof (*wordsNoCase));
memcpy(wordsNoCase, words, (len + 1) * sizeof (*words));
} }
// Shell sort based upon public domain C implementation by Raymond Gardner 1991 int cmpString(const void *a1, const void *a2) {
// Used here because of problems with mingw qsort. // Can't work out the correct incantation to use modern casts here
static void SortWordList(char **words, unsigned int len) { return strcmp(*(char**)(a1), *(char**)(a2));
unsigned int gap = len / 2; }
while (gap > 0) { int cmpStringNoCase(const void *a1, const void *a2) {
unsigned int i = gap; // Can't work out the correct incantation to use modern casts here
while (i < len) { return strcasecmp(*(char**)(a1), *(char**)(a2));
unsigned int j = i; }
char **a = words + j;
do { static void SortWordList(char **words, char **wordsNoCase, unsigned int len) {
j -= gap; qsort(reinterpret_cast<void*>(words), len, sizeof(*words),
char **b = a; cmpString);
a -= gap; qsort(reinterpret_cast<void*>(wordsNoCase), len, sizeof(*wordsNoCase),
if (strcmp(*a, *b) > 0) { cmpStringNoCase);
char *tmp = *a;
*a = *b;
*b = tmp;
} else {
break;
}
} while (j >= gap);
i++;
}
gap = gap / 2;
}
} }
bool WordList::InList(const char *s) { bool WordList::InList(const char *s) {
if (0 == words) if (0 == words)
return false; return false;
if (len == 0) { if (!sorted) {
for (int i = 0; words[i][0]; i++) sorted = true;
len++; SortWordList(words, wordsNoCase, len);
SortWordList(words, len); for (unsigned int k = 0; k < (sizeof(starts) / sizeof(starts[0])); k++)
for (int k = 0; k < (sizeof(starts) / sizeof(starts[0])); k++)
starts[k] = -1; starts[k] = -1;
for (int l = len - 1; l >= 0; l--) { for (int l = len - 1; l >= 0; l--) {
unsigned char indexChar = words[l][0]; unsigned char indexChar = words[l][0];
@@ -397,3 +487,256 @@ bool WordList::InList(const char *s) {
} }
return false; return false;
} }
/**
* Returns an element (complete) of the wordlist array which has the beginning
* the same as the passed string. The length of the word to compare is passed
* too. Letter case can be ignored or preserved (default).
*/
const char *WordList::GetNearestWord(const char *wordStart, int searchLen /*= -1*/, bool ignoreCase /*= false*/) {
int start = 0; // lower bound of the api array block to search
int end = len - 1; // upper bound of the api array block to search
int pivot; // index of api array element just being compared
int cond; // comparison result (in the sense of strcmp() result)
const char *word; // api array element just being compared
if (0 == words)
return NULL;
if (!sorted) {
sorted = true;
SortWordList(words, wordsNoCase, len);
}
if (ignoreCase)
while (start <= end) { // binary searching loop
pivot = (start + end) >> 1;
word = wordsNoCase[pivot];
cond = strncasecmp(wordStart, word, searchLen);
if (!cond && nonFuncChar(word[searchLen])) // maybe there should be a "non-word character" test here?
return word; // result must not be freed with free()
else if (cond < 0)
end = pivot - 1;
else if (cond > 0)
start = pivot + 1;
}
else // preserve the letter case
while (start <= end) { // binary searching loop
pivot = (start + end) >> 1;
word = words[pivot];
cond = strncmp(wordStart, word, searchLen);
if (!cond && nonFuncChar(word[searchLen])) // maybe there should be a "non-word character" test here?
return word; // result must not be freed with free()
else if (cond >= 0)
start = pivot + 1;
else if (cond < 0)
end = pivot - 1;
}
return NULL;
}
/**
* Returns elements (first words of them) of the wordlist array which have
* the beginning the same as the passed string. The length of the word to
* compare is passed too. Letter case can be ignored or preserved (default).
* If there are more words meeting the condition they are returned all of
* them in the ascending order separated with spaces.
*
* NOTE: returned buffer has to be freed with a free() call.
*/
char *WordList::GetNearestWords(const char *wordStart, int searchLen /*= -1*/, bool ignoreCase /*= false*/) {
int wordlen; // length of the word part (before the '(' brace) of the api array element
int length = 0; // length of the returned buffer of words (string)
int newlength; // length of the new buffer before the reallocating itself
#undef WORDCHUNK // how many characters will be pre-allocated (to avoid buffer reallocation on each new word)
#define WORDCHUNK 100
int size = WORDCHUNK; // real size of the returned buffer of words
char *buffer; // buffer for the words returned
int start = 0; // lower bound of the api array block to search
int end = len - 1; // upper bound of the api array block to search
int pivot; // index of api array element just being compared
int cond; // comparison result (in the sense of strcmp() result)
int oldpivot; // pivot storage to be able to browse the api array upwards and then downwards
const char *word; // api array element just being compared
const char *brace; // position of the opening brace in the api array element just being compared
if (0 == words)
return NULL;
if (!sorted) {
sorted = true;
SortWordList(words, wordsNoCase, len);
}
buffer = (char*) malloc(size);
*buffer = '\0';
if (ignoreCase)
while (start <= end) { // binary searching loop
pivot = (start + end) >> 1;
word = wordsNoCase[pivot];
cond = strncasecmp(wordStart, word, searchLen);
if (!cond) {
oldpivot = pivot;
do { // browse sequentially the rest after the hit
brace = strchr(word, '(');
if (brace)
do
if (--brace < word)
break;
while (isspace(*brace));
else {
brace = word + strlen(word);
do
if (--brace < word)
break;
while (isspace(*brace));
}
wordlen = brace - word + 1;
newlength = length + wordlen; // stretch the buffer
if (length)
newlength++;
if (newlength >= size) {
do
size += WORDCHUNK;
while (size <= newlength);
buffer = (char*) realloc(buffer, size);
}
if (length) // append a new entry
buffer[length++] = ' ';
memcpy(buffer + length, word, wordlen);
length = newlength;
buffer[length] = '\0';
if (++pivot > end)
break;
word = wordsNoCase[pivot];
} while (!strncasecmp(wordStart, word, searchLen));
pivot = oldpivot;
for (;;) { // browse sequentially the rest before the hit
if (--pivot < start)
break;
word = wordsNoCase[pivot];
if (strncasecmp(wordStart, word, searchLen))
break;
brace = strchr(word, '(');
if (brace)
do
if (--brace < word)
break;
while (isspace(*brace));
else {
brace = word + strlen(word);
do
if (--brace < word)
break;
while (isspace(*brace));
}
wordlen = brace - word + 1;
newlength = length + wordlen; // stretch the buffer
if (length)
newlength++;
if (newlength >= size)
{
do
size += WORDCHUNK;
while (size <= newlength);
buffer = (char*) realloc(buffer, size);
}
if (length) // append a new entry
buffer[length++] = ' ';
memcpy(buffer + length, word, wordlen);
length = newlength;
buffer[length] = '\0';
}
return buffer; // result has to be freed with free()
}
else if (cond < 0)
end = pivot - 1;
else if (cond > 0)
start = pivot + 1;
}
else // preserve the letter case
while (start <= end) { // binary searching loop
pivot = (start + end) >> 1;
word = words[pivot];
cond = strncmp(wordStart, word, searchLen);
if (!cond) {
oldpivot = pivot;
do { // browse sequentially the rest after the hit
brace = strchr(word, '(');
if (brace)
do
if (--brace < word)
break;
while (isspace(*brace));
else {
brace = word + strlen(word);
do
if (--brace < word)
break;
while (isspace(*brace));
}
wordlen = brace - word + 1;
newlength = length + wordlen; // stretch the buffer
if (length)
newlength++;
if (newlength >= size)
{
do
size += WORDCHUNK;
while (size <= newlength);
buffer = (char*) realloc(buffer, size);
}
if (length) // append a new entry
buffer[length++] = ' ';
memcpy(buffer + length, word, wordlen);
length = newlength;
buffer[length] = '\0';
if (++pivot > end)
break;
word = words[pivot];
} while (!strncmp(wordStart, word, searchLen));
pivot = oldpivot;
for (;;) { // browse sequentially the rest before the hit
if (--pivot < start)
break;
word = words[pivot];
if (strncmp(wordStart, word, searchLen))
break;
brace = strchr(word, '(');
if (brace)
do
if (--brace < word)
break;
while (isspace(*brace));
else {
brace = word + strlen(word);
do
if (--brace < word)
break;
while (isspace(*brace));
}
wordlen = brace - word + 1;
newlength = length + wordlen; // stretch the buffer
if (length)
newlength++;
if (newlength >= size)
{
do
size += WORDCHUNK;
while (size <= newlength);
buffer = (char*) realloc(buffer, size);
}
if (length) // append a new entry
buffer[length++] = ' ';
memcpy(buffer + length, word, wordlen);
length = newlength;
buffer[length] = '\0';
}
return buffer; // result has to be freed with free()
}
else if (cond < 0)
end = pivot - 1;
else if (cond > 0)
start = pivot + 1;
}
free(buffer);
return NULL;
}

View File

@@ -6,13 +6,12 @@
#ifndef SVECTOR_H #ifndef SVECTOR_H
#define SVECTOR_H #define SVECTOR_H
// A simple expandable vector. // A simple expandable integer vector.
// T must support assignment.
// Storage not allocated for elements until an element is used. // Storage not allocated for elements until an element is used.
// This makes it very lightweight unless used so is a good match for optional features. // This makes it very lightweight unless used so is a good match for optional features.
template<class T, int sizeIncrement>
class SVector { class SVector {
T *v; int *v;
unsigned int size; // Number of elements allocated unsigned int size; // Number of elements allocated
unsigned int len; // Number of elements in vector unsigned int len; // Number of elements in vector
bool allocFailure; // A memory allocation call has failed bool allocFailure; // A memory allocation call has failed
@@ -20,19 +19,23 @@ class SVector {
// Internally allocate more elements than the user wants to avoid // Internally allocate more elements than the user wants to avoid
// thrashng the memory allocator // thrashng the memory allocator
void SizeTo(int newSize) { void SizeTo(int newSize) {
if (newSize < sizeIncrement) if (newSize < 4000)
newSize += sizeIncrement; newSize += 4000;
else else
newSize = (newSize * 3) / 2; newSize = (newSize * 3) / 2;
T* newv = new T[newSize]; int* newv = new int[newSize];
if (!newv) { if (!newv) {
allocFailure = true; allocFailure = true;
return; return;
} }
size = newSize; size = newSize;
for (int i=0; i<len; i++) { unsigned int i=0;
for (; i<len; i++) {
newv[i] = v[i]; newv[i] = v[i];
} }
for (; i<size; i++) {
newv[i] = 0;
}
delete []v; delete []v;
v = newv; v = newv;
} }
@@ -79,7 +82,7 @@ public:
} }
return *this; return *this;
} }
T &operator[](unsigned int i) { int &operator[](unsigned int i) {
if (i >= len) { if (i >= len) {
if (i >= size) { if (i >= size) {
SizeTo(i); SizeTo(i);
@@ -94,13 +97,13 @@ public:
size = 0; size = 0;
len = 0; len = 0;
} }
void SetLength(int newLen) { void SetLength(unsigned int newLength) {
if (newLen > len) { if (newLength > len) {
if (newLen >= size) { if (newLength >= size) {
SizeTo(newLen); SizeTo(newLength);
} }
} }
len = newLen; len = newLength;
} }
int Length() const { int Length() const {
return len; return len;

View File

@@ -11,10 +11,12 @@
#include "Platform.h" #include "Platform.h"
#include "Scintilla.h" #include "Scintilla.h"
#include "PropSet.h"
#ifdef SCI_LEXER #ifdef SCI_LEXER
#include "SciLexer.h" #include "SciLexer.h"
#include "PropSet.h"
#include "Accessor.h" #include "Accessor.h"
#include "WindowAccessor.h"
#include "DocumentAccessor.h"
#include "KeyWords.h" #include "KeyWords.h"
#endif #endif
#include "ContractionState.h" #include "ContractionState.h"
@@ -39,9 +41,15 @@ ScintillaBase::ScintillaBase() {
#endif #endif
} }
ScintillaBase::~ScintillaBase() {} ScintillaBase::~ScintillaBase() {
#ifdef SCI_LEXER
for (int wl=0;wl<numWordLists;wl++)
delete keyWordLists[wl];
#endif
}
void ScintillaBase::Finalise() { void ScintillaBase::Finalise() {
Editor::Finalise();
popup.Destroy(); popup.Destroy();
} }
@@ -50,11 +58,12 @@ void ScintillaBase::RefreshColourPalette(Palette &pal, bool want) {
ct.RefreshColourPalette(pal, want); ct.RefreshColourPalette(pal, want);
} }
void ScintillaBase::AddChar(char ch) { void ScintillaBase::AddCharUTF(char *s, unsigned int len) {
bool acActiveBeforeCharAdded = ac.Active(); bool acActiveBeforeCharAdded = ac.Active();
Editor::AddChar(ch); if (!acActiveBeforeCharAdded || !ac.IsFillUpChar(*s))
Editor::AddCharUTF(s, len);
if (acActiveBeforeCharAdded) if (acActiveBeforeCharAdded)
AutoCompleteChanged(ch); AutoCompleteChanged(s[0]);
} }
void ScintillaBase::Command(int cmdId) { void ScintillaBase::Command(int cmdId) {
@@ -68,7 +77,7 @@ void ScintillaBase::Command(int cmdId) {
break; break;
case idcmdUndo: case idcmdUndo:
WndProc(WM_UNDO, 0, 0); WndProc(SCI_UNDO, 0, 0);
break; break;
case idcmdRedo: case idcmdRedo:
@@ -76,19 +85,19 @@ void ScintillaBase::Command(int cmdId) {
break; break;
case idcmdCut: case idcmdCut:
WndProc(WM_CUT, 0, 0); WndProc(SCI_CUT, 0, 0);
break; break;
case idcmdCopy: case idcmdCopy:
WndProc(WM_COPY, 0, 0); WndProc(SCI_COPY, 0, 0);
break; break;
case idcmdPaste: case idcmdPaste:
WndProc(WM_PASTE, 0, 0); WndProc(SCI_PASTE, 0, 0);
break; break;
case idcmdDelete: case idcmdDelete:
WndProc(WM_CLEAR, 0, 0); WndProc(SCI_CLEAR, 0, 0);
break; break;
case idcmdSelectAll: case idcmdSelectAll:
@@ -97,7 +106,7 @@ void ScintillaBase::Command(int cmdId) {
} }
} }
int ScintillaBase::KeyCommand(UINT iMessage) { int ScintillaBase::KeyCommand(unsigned int iMessage) {
// Most key commands cancel autocompletion mode // Most key commands cancel autocompletion mode
if (ac.Active()) { if (ac.Active()) {
switch (iMessage) { switch (iMessage) {
@@ -128,6 +137,9 @@ int ScintillaBase::KeyCommand(UINT iMessage) {
case SCI_TAB: case SCI_TAB:
AutoCompleteCompleted(); AutoCompleteCompleted();
return 0; return 0;
case SCI_NEWLINE:
AutoCompleteCompleted();
return 0;
default: default:
ac.Cancel(); ac.Cancel();
@@ -155,15 +167,30 @@ int ScintillaBase::KeyCommand(UINT iMessage) {
} }
void ScintillaBase::AutoCompleteStart(int lenEntered, const char *list) { void ScintillaBase::AutoCompleteStart(int lenEntered, const char *list) {
//Platform::DebugPrintf("AutoCOmplete %s\n", list); //Platform::DebugPrintf("AutoComplete %s\n", list);
ct.CallTipCancel(); ct.CallTipCancel();
if (ac.chooseSingle) {
if (list && !strchr(list, ac.GetSeparator())) {
if (ac.ignoreCase) {
SetEmptySelection(currentPos - lenEntered);
pdoc->DeleteChars(currentPos, lenEntered);
SetEmptySelection(currentPos);
pdoc->InsertString(currentPos, list);
SetEmptySelection(currentPos + strlen(list));
} else {
SetEmptySelection(currentPos);
pdoc->InsertString(currentPos, list + lenEntered);
SetEmptySelection(currentPos + strlen(list + lenEntered));
}
return;
}
}
ac.Start(wDraw, idAutoComplete, currentPos, lenEntered); ac.Start(wDraw, idAutoComplete, currentPos, lenEntered);
PRectangle rcClient = GetClientRectangle(); PRectangle rcClient = GetClientRectangle();
Point pt = LocationFromPosition(currentPos-lenEntered); Point pt = LocationFromPosition(currentPos-lenEntered);
//Platform::DebugPrintf("Auto complete %x\n", lbAutoComplete);
int heightLB = 100; int heightLB = 100;
int widthLB = 100; int widthLB = 100;
if (pt.x >= rcClient.right - widthLB) { if (pt.x >= rcClient.right - widthLB) {
@@ -186,16 +213,18 @@ void ScintillaBase::AutoCompleteStart(int lenEntered, const char *list) {
rcac.right = rcac.left + widthLB; rcac.right = rcac.left + widthLB;
rcac.bottom = Platform::Minimum(rcac.top + heightLB, rcClient.bottom); rcac.bottom = Platform::Minimum(rcac.top + heightLB, rcClient.bottom);
ac.lb.SetPositionRelative(rcac, wMain); ac.lb.SetPositionRelative(rcac, wMain);
ac.lb.SetFont(vs.styles[0].font); ac.lb.SetFont(vs.styles[STYLE_DEFAULT].font);
ac.lb.SetAverageCharWidth(vs.styles[STYLE_DEFAULT].aveCharWidth);
int maxStrLen = ac.SetList(list); ac.SetList(list);
// Fiddle the position of the list so it is right next to the target and wide enough for all its strings // Fiddle the position of the list so it is right next to the target and wide enough for all its strings
PRectangle rcList = ac.lb.GetPosition(); PRectangle rcList = ac.lb.GetDesiredRect();
int heightAlloced = rcList.bottom - rcList.top; int heightAlloced = rcList.bottom - rcList.top;
widthLB = Platform::Maximum(widthLB, rcList.right - rcList.left);
// Make an allowance for large strings in list // Make an allowance for large strings in list
rcList.left = pt.x - 5; rcList.left = pt.x - 5;
rcList.right = rcList.left + Platform::Maximum(widthLB, maxStrLen * 8 + 16); rcList.right = rcList.left + widthLB;
if (pt.y >= rcClient.bottom - heightLB && // Wont fit below. if (pt.y >= rcClient.bottom - heightLB && // Wont fit below.
pt.y >= (rcClient.bottom + rcClient.top) / 2) { // and there is more room above. pt.y >= (rcClient.bottom + rcClient.top) / 2) { // and there is more room above.
rcList.top = pt.y - heightAlloced; rcList.top = pt.y - heightAlloced;
@@ -204,8 +233,10 @@ void ScintillaBase::AutoCompleteStart(int lenEntered, const char *list) {
} }
rcList.bottom = rcList.top + heightAlloced; rcList.bottom = rcList.top + heightAlloced;
ac.lb.SetPositionRelative(rcList, wMain); ac.lb.SetPositionRelative(rcList, wMain);
//lbAutoComplete.SetPosition(rcList);
ac.Show(); ac.Show();
if (lenEntered != 0) {
AutoCompleteMoveToCurrentWord();
}
} }
void ScintillaBase::AutoCompleteCancel() { void ScintillaBase::AutoCompleteCancel() {
@@ -216,36 +247,63 @@ void ScintillaBase::AutoCompleteMove(int delta) {
ac.Move(delta); ac.Move(delta);
} }
void ScintillaBase::AutoCompleteMoveToCurrentWord() {
char wordCurrent[1000];
int i;
int startWord = ac.posStart - ac.startLen;
for (i = startWord; i < currentPos; i++)
wordCurrent[i - startWord] = pdoc->CharAt(i);
wordCurrent[i - startWord] = '\0';
ac.Select(wordCurrent);
}
void ScintillaBase::AutoCompleteChanged(char ch) { void ScintillaBase::AutoCompleteChanged(char ch) {
if (currentPos <= ac.posStart) { if (ac.IsFillUpChar(ch)) {
AutoCompleteCompleted(ch);
} else if (currentPos <= ac.posStart - ac.startLen) {
ac.Cancel();
} else if (ac.cancelAtStartPos && currentPos <= ac.posStart) {
ac.Cancel(); ac.Cancel();
} else if (ac.IsStopChar(ch)) { } else if (ac.IsStopChar(ch)) {
ac.Cancel(); ac.Cancel();
} else { } else {
char wordCurrent[1000]; AutoCompleteMoveToCurrentWord();
int i;
int startWord = ac.posStart - ac.startLen;
for (i = startWord; i < currentPos; i++)
wordCurrent[i - startWord] = pdoc->CharAt(i);
wordCurrent[i - startWord] = '\0';
ac.Select(wordCurrent);
} }
} }
void ScintillaBase::AutoCompleteCompleted() { void ScintillaBase::AutoCompleteCompleted(char fillUp/*='\0'*/) {
int item = ac.lb.GetSelection(); int item = ac.lb.GetSelection();
char selected[200]; char selected[1000];
if (item != -1) { if (item != -1) {
ac.lb.GetValue(item, selected, sizeof(selected)); ac.lb.GetValue(item, selected, sizeof(selected));
} }
ac.Cancel(); ac.Cancel();
if (currentPos != ac.posStart) {
pdoc->DeleteChars(ac.posStart, currentPos - ac.posStart); if (ac.ignoreCase) {
} if (currentPos != ac.posStart) {
SetEmptySelection(ac.posStart); pdoc->DeleteChars(ac.posStart, currentPos - ac.posStart);
if (item != -1) { }
pdoc->InsertString(currentPos, selected + ac.startLen); SetEmptySelection(ac.posStart - ac.startLen);
SetEmptySelection(currentPos + strlen(selected + ac.startLen)); pdoc->DeleteChars(ac.posStart - ac.startLen, ac.startLen);
if (item != -1) {
SString piece = selected;
if (fillUp)
piece += fillUp;
pdoc->InsertString(currentPos, piece.c_str());
SetEmptySelection(currentPos + piece.length());
}
} else {
if (currentPos != ac.posStart) {
pdoc->DeleteChars(ac.posStart, currentPos - ac.posStart);
}
SetEmptySelection(ac.posStart);
if (item != -1) {
SString piece = selected + ac.startLen;
if (fillUp)
piece += fillUp;
pdoc->InsertString(currentPos, piece.c_str());
SetEmptySelection(currentPos + piece.length());
}
} }
} }
@@ -256,16 +314,21 @@ void ScintillaBase::ContextMenu(Point pt) {
AddToPopUp(""); AddToPopUp("");
AddToPopUp("Cut", idcmdCut, currentPos != anchor); AddToPopUp("Cut", idcmdCut, currentPos != anchor);
AddToPopUp("Copy", idcmdCopy, currentPos != anchor); AddToPopUp("Copy", idcmdCopy, currentPos != anchor);
AddToPopUp("Paste", idcmdPaste, WndProc(EM_CANPASTE, 0, 0)); AddToPopUp("Paste", idcmdPaste, WndProc(SCI_CANPASTE, 0, 0));
AddToPopUp("Delete", idcmdDelete, currentPos != anchor); AddToPopUp("Delete", idcmdDelete, currentPos != anchor);
AddToPopUp(""); AddToPopUp("");
AddToPopUp("Select All", idcmdSelectAll); AddToPopUp("Select All", idcmdSelectAll);
popup.Show(pt, wMain); popup.Show(pt, wMain);
} }
void ScintillaBase::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt) { void ScintillaBase::CancelModes() {
AutoCompleteCancel(); AutoCompleteCancel();
ct.CallTipCancel(); ct.CallTipCancel();
Editor::CancelModes();
}
void ScintillaBase::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt) {
CancelModes();
Editor::ButtonDown(pt, curTime, shift, ctrl, alt); Editor::ButtonDown(pt, curTime, shift, ctrl, alt);
} }
@@ -276,33 +339,33 @@ void ScintillaBase::Colourise(int start, int end) {
end = lengthDoc; end = lengthDoc;
int len = end - start; int len = end - start;
PropSet props; //WindowAccessor styler(wMain.GetID(), props);
DocumentAccessor styler(pdoc, props);
StylingContext styler(wMain.GetID(), props);
int styleStart = 0; int styleStart = 0;
if (start > 0) if (start > 0)
styleStart = styler.StyleAt(start - 1); styleStart = styler.StyleAt(start - 1);
styler.SetCodePage(pdoc->dbcsCodePage);
ColouriseDoc(pdoc->dbcsCodePage, start, len, styleStart, lexLanguage, keyWordLists, styler); LexerModule::Colourise(start, len, styleStart, lexLanguage, keyWordLists, styler);
styler.Flush(); styler.Flush();
} }
#endif #endif
void ScintillaBase::NotifyStyleNeeded(int endStyleNeeded) { void ScintillaBase::NotifyStyleToNeeded(int endStyleNeeded) {
#ifdef SCI_LEXER #ifdef SCI_LEXER
if (lexLanguage != SCLEX_CONTAINER) { if (lexLanguage != SCLEX_CONTAINER) {
int endStyled = Platform::SendScintilla(wMain.GetID(), SCI_GETENDSTYLED, 0, 0); int endStyled = Platform::SendScintilla(wMain.GetID(), SCI_GETENDSTYLED, 0, 0);
int lineEndStyled = Platform::SendScintilla(wMain.GetID(), EM_LINEFROMCHAR, endStyled, 0); int lineEndStyled = Platform::SendScintilla(wMain.GetID(), SCI_LINEFROMPOSITION, endStyled, 0);
endStyled = Platform::SendScintilla(wMain.GetID(), EM_LINEINDEX, lineEndStyled, 0); endStyled = Platform::SendScintilla(wMain.GetID(), SCI_POSITIONFROMLINE, lineEndStyled, 0);
Colourise(endStyled, endStyleNeeded); Colourise(endStyled, endStyleNeeded);
return; return;
} }
#endif #endif
Editor::NotifyStyleNeeded(endStyleNeeded); Editor::NotifyStyleToNeeded(endStyleNeeded);
} }
LRESULT ScintillaBase::WndProc(UINT iMessage, WPARAM wParam, LPARAM lParam) { long ScintillaBase::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
switch (iMessage) { switch (iMessage) {
case SCI_AUTOCSHOW: case SCI_AUTOCSHOW:
AutoCompleteStart(wParam, reinterpret_cast<const char *>(lParam)); AutoCompleteStart(wParam, reinterpret_cast<const char *>(lParam));
@@ -322,16 +385,52 @@ LRESULT ScintillaBase::WndProc(UINT iMessage, WPARAM wParam, LPARAM lParam) {
AutoCompleteCompleted(); AutoCompleteCompleted();
break; break;
case SCI_AUTOCSETSEPARATOR:
ac.SetSeparator(static_cast<char>(wParam));
break;
case SCI_AUTOCGETSEPARATOR:
return ac.GetSeparator();
case SCI_AUTOCSTOPS: case SCI_AUTOCSTOPS:
ac.SetStopChars(reinterpret_cast<char *>(lParam)); ac.SetStopChars(reinterpret_cast<char *>(lParam));
break; break;
case SCI_AUTOCSELECT:
ac.Select(reinterpret_cast<char *>(lParam));
break;
case SCI_AUTOCSETCANCELATSTART:
ac.cancelAtStartPos = wParam;
break;
case SCI_AUTOCGETCANCELATSTART:
return ac.cancelAtStartPos;
case SCI_AUTOCSETFILLUPS:
ac.SetFillUpChars(reinterpret_cast<char *>(lParam));
break;
case SCI_AUTOCSETCHOOSESINGLE:
ac.chooseSingle = wParam;
break;
case SCI_AUTOCGETCHOOSESINGLE:
return ac.chooseSingle;
case SCI_AUTOCSETIGNORECASE:
ac.ignoreCase = wParam;
break;
case SCI_AUTOCGETIGNORECASE:
return ac.ignoreCase;
case SCI_CALLTIPSHOW: { case SCI_CALLTIPSHOW: {
AutoCompleteCancel(); AutoCompleteCancel();
if (!ct.wCallTip.Created()) { if (!ct.wCallTip.Created()) {
PRectangle rc = ct.CallTipStart(currentPos, LocationFromPosition(wParam), PRectangle rc = ct.CallTipStart(currentPos, LocationFromPosition(wParam),
reinterpret_cast<char *>(lParam), reinterpret_cast<char *>(lParam),
vs.styles[0].fontName, vs.styles[0].size); vs.styles[STYLE_DEFAULT].fontName, vs.styles[STYLE_DEFAULT].size);
// If the call-tip window would be out of the client // If the call-tip window would be out of the client
// space, adjust so it displays above the text. // space, adjust so it displays above the text.
PRectangle rcClient = GetClientRectangle(); PRectangle rcClient = GetClientRectangle();
@@ -377,6 +476,7 @@ LRESULT ScintillaBase::WndProc(UINT iMessage, WPARAM wParam, LPARAM lParam) {
case SCI_COLOURISE: case SCI_COLOURISE:
Colourise(wParam, lParam); Colourise(wParam, lParam);
Redraw();
break; break;
case SCI_SETPROPERTY: case SCI_SETPROPERTY:
@@ -385,7 +485,7 @@ LRESULT ScintillaBase::WndProc(UINT iMessage, WPARAM wParam, LPARAM lParam) {
break; break;
case SCI_SETKEYWORDS: case SCI_SETKEYWORDS:
if ((wParam >= 0) && (wParam < numWordLists)) { if (wParam < numWordLists) {
keyWordLists[wParam]->Clear(); keyWordLists[wParam]->Clear();
keyWordLists[wParam]->Set(reinterpret_cast<const char *>(lParam)); keyWordLists[wParam]->Set(reinterpret_cast<const char *>(lParam));
} }

View File

@@ -7,6 +7,9 @@
#define SCINTILLABASE_H #define SCINTILLABASE_H
class ScintillaBase : public Editor { class ScintillaBase : public Editor {
// Private so ScintillaBase objects can not be copied
ScintillaBase(const ScintillaBase &) : Editor() {}
ScintillaBase &operator=(const ScintillaBase &) { return *this; }
protected: protected:
// Enumeration of commands and child windows // Enumeration of commands and child windows
enum { enum {
@@ -42,15 +45,17 @@ protected:
virtual void RefreshColourPalette(Palette &pal, bool want); virtual void RefreshColourPalette(Palette &pal, bool want);
virtual void AddChar(char ch); virtual void AddCharUTF(char *s, unsigned int len);
void Command(int cmdId); void Command(int cmdId);
virtual int KeyCommand(UINT iMessage); virtual void CancelModes();
virtual int KeyCommand(unsigned int iMessage);
void AutoCompleteStart(int lenEntered, const char *list); void AutoCompleteStart(int lenEntered, const char *list);
void AutoCompleteCancel(); void AutoCompleteCancel();
void AutoCompleteMove(int delta); void AutoCompleteMove(int delta);
void AutoCompleteChanged(char ch=0); void AutoCompleteChanged(char ch=0);
void AutoCompleteCompleted(); void AutoCompleteCompleted(char fillUp='\0');
void AutoCompleteMoveToCurrentWord();
virtual void CreateCallTipWindow(PRectangle rc) = 0; virtual void CreateCallTipWindow(PRectangle rc) = 0;
@@ -59,10 +64,10 @@ protected:
virtual void ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt); virtual void ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt);
virtual void NotifyStyleNeeded(int endStyleNeeded); virtual void NotifyStyleToNeeded(int endStyleNeeded);
public: public:
// Public so scintilla_send_message can use it // Public so scintilla_send_message can use it
virtual LRESULT WndProc(UINT iMessage, WPARAM wParam, LPARAM lParam); virtual long WndProc(unsigned int iMessage, unsigned long wParam, long lParam);
}; };
#endif #endif

View File

@@ -7,49 +7,111 @@
#include "Platform.h" #include "Platform.h"
#include "Scintilla.h"
#include "Style.h" #include "Style.h"
Style::Style() { Style::Style() {
Clear(); aliasOfDefaultFont = true;
Clear(Colour(0,0,0), Colour(0xff,0xff,0xff),
Platform::DefaultFontSize(), 0, SC_CHARSET_DEFAULT,
false, false, false, false, true);
}
Style::Style(const Style &source) {
Clear(Colour(0,0,0), Colour(0xff,0xff,0xff),
0, 0, 0,
false, false, false, false, true);
fore.desired = source.fore.desired;
back.desired = source.back.desired;
characterSet = source.characterSet;
bold = source.bold;
italic = source.italic;
size = source.size;
eolFilled = source.eolFilled;
underline = source.underline;
visible = source.visible;
} }
Style::~Style() { Style::~Style() {
font.Release(); if (aliasOfDefaultFont)
font.SetID(0);
else
font.Release();
aliasOfDefaultFont = false;
} }
Style &Style::operator=(const Style &source) { Style &Style::operator=(const Style &source) {
if (this == &source) if (this == &source)
return *this; return *this;
Clear(); Clear(Colour(0,0,0), Colour(0xff,0xff,0xff),
0, 0, SC_CHARSET_DEFAULT,
false, false, false, false, true);
fore.desired = source.fore.desired; fore.desired = source.fore.desired;
back.desired = source.back.desired; back.desired = source.back.desired;
characterSet = source.characterSet;
bold = source.bold; bold = source.bold;
italic = source.italic; italic = source.italic;
size = source.size; size = source.size;
strcpy(fontName, source.fontName);
eolFilled = source.eolFilled; eolFilled = source.eolFilled;
underline = source.underline;
visible = source.visible;
return *this; return *this;
} }
void Style::Clear(Colour fore_, Colour back_, int size_, const char *fontName_, void Style::Clear(Colour fore_, Colour back_, int size_,
bool bold_, bool italic_, bool eolFilled_) { const char *fontName_, int characterSet_,
bool bold_, bool italic_, bool eolFilled_, bool underline_, bool visible_) {
fore.desired = fore_; fore.desired = fore_;
back.desired = back_; back.desired = back_;
characterSet = characterSet_;
bold = bold_; bold = bold_;
italic = italic_; italic = italic_;
size = size_; size = size_;
strcpy(fontName, fontName_); fontName = fontName_;
eolFilled = eolFilled_; eolFilled = eolFilled_;
font.Release(); underline = underline_;
visible = visible_;
if (aliasOfDefaultFont)
font.SetID(0);
else
font.Release();
aliasOfDefaultFont = false;
} }
void Style::Realise(Surface &surface, int zoomLevel) { bool Style::EquivalentFontTo(const Style *other) const {
if (bold != other->bold ||
italic != other->italic ||
size != other->size ||
characterSet != other->characterSet)
return false;
if (fontName == other->fontName)
return true;
if (!fontName)
return false;
if (!other->fontName)
return false;
return strcmp(fontName, other->fontName) == 0;
}
void Style::Realise(Surface &surface, int zoomLevel, Style *defaultStyle) {
int sizeZoomed = size + zoomLevel; int sizeZoomed = size + zoomLevel;
if (sizeZoomed <= 2) // Hangs if sizeZoomed <= 1 if (sizeZoomed <= 2) // Hangs if sizeZoomed <= 1
sizeZoomed = 2; sizeZoomed = 2;
int deviceHeight = (sizeZoomed * surface.LogPixelsY()) / 72; if (aliasOfDefaultFont)
font.Create(fontName, deviceHeight, bold, italic); font.SetID(0);
else
font.Release();
int deviceHeight = surface.DeviceHeightFont(sizeZoomed);
aliasOfDefaultFont = defaultStyle &&
(EquivalentFontTo(defaultStyle) || !fontName);
if (aliasOfDefaultFont) {
font.SetID(defaultStyle->font.GetID());
} else if (fontName) {
font.Create(fontName, characterSet, deviceHeight, bold, italic);
} else {
font.SetID(0);
}
ascent = surface.Ascent(font); ascent = surface.Ascent(font);
descent = surface.Descent(font); descent = surface.Descent(font);

View File

@@ -10,11 +10,15 @@ class Style {
public: public:
ColourPair fore; ColourPair fore;
ColourPair back; ColourPair back;
bool aliasOfDefaultFont;
bool bold; bool bold;
bool italic; bool italic;
int size; int size;
char fontName[100]; const char *fontName;
int characterSet;
bool eolFilled; bool eolFilled;
bool underline;
bool visible;
Font font; Font font;
unsigned int lineHeight; unsigned int lineHeight;
@@ -25,13 +29,15 @@ public:
unsigned int spaceWidth; unsigned int spaceWidth;
Style(); Style();
Style(const Style &source);
~Style(); ~Style();
Style &operator=(const Style &source); Style &operator=(const Style &source);
void Clear(Colour fore_=Colour(0,0,0), Colour back_=Colour(0xff,0xff,0xff), void Clear(Colour fore_, Colour back_,
int size_=Platform::DefaultFontSize(), int size_,
const char *fontName_=Platform::DefaultFont(), const char *fontName_, int characterSet_,
bool bold_=false, bool italic_=false, bool eolFilled_=false); bool bold_, bool italic_, bool eolFilled_, bool underline_, bool visible_);
void Realise(Surface &surface, int zoomLevel); bool EquivalentFontTo(const Style *other) const;
void Realise(Surface &surface, int zoomLevel, Style *defaultStyle=0);
}; };
#endif #endif

View File

@@ -0,0 +1,77 @@
// UniConversion.h - functions to handle UFT-8 and UCS-2 strings
// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed.
#include <stdlib.h>
#include "UniConversion.h"
unsigned int UTF8Length(const wchar_t *uptr, unsigned int tlen) {
unsigned int len = 0;
for (unsigned int i = 0; i < tlen && uptr[i]; i++) {
unsigned int uch = uptr[i];
if (uch < 0x80)
len++;
else if (uch < 0x800)
len+=2;
else
len +=3;
}
return len;
}
void UTF8FromUCS2(const wchar_t *uptr, unsigned int tlen, char *putf, unsigned int len) {
int k = 0;
for (unsigned int i = 0; i < tlen && uptr[i]; i++) {
unsigned int uch = uptr[i];
if (uch < 0x80) {
putf[k++] = static_cast<char>(uch);
} else if (uch < 0x800) {
putf[k++] = static_cast<char>(0xC0 | (uch >> 6));
putf[k++] = static_cast<char>(0x80 | (uch & 0x3f));
} else {
putf[k++] = static_cast<char>(0xE0 | (uch >> 12));
putf[k++] = static_cast<char>(0x80 | ((uch >> 6) & 0x3f));
putf[k++] = static_cast<char>(0x80 | (uch & 0x3f));
}
}
putf[len] = '\0';
}
unsigned int UCS2Length(const char *s, unsigned int len) {
unsigned int ulen = 0;
for (unsigned int i=0;i<len;i++) {
unsigned char ch = static_cast<unsigned char>(s[i]);
if ((ch < 0x80) || (ch > (0x80 + 0x40)))
ulen++;
}
return ulen;
}
unsigned int UCS2FromUTF8(const char *s, unsigned int len, wchar_t *tbuf, unsigned int tlen) {
#ifdef USE_API
return ::MultiByteToWideChar(CP_UTF8, 0, s, len, tbuf, tlen);
#else
unsigned int ui=0;
const unsigned char *us = reinterpret_cast<const unsigned char *>(s);
unsigned int i=0;
while ((i<len) && (ui<tlen)) {
unsigned char ch = us[i++];
if (ch < 0x80) {
tbuf[ui] = ch;
} else if (ch < 0x80 + 0x40 + 0x20) {
tbuf[ui] = static_cast<wchar_t>((ch & 0x1F) << 6);
ch = us[i++];
tbuf[ui] = static_cast<wchar_t>(tbuf[ui] + (ch & 0x7F));
} else {
tbuf[ui] = static_cast<wchar_t>((ch & 0xF) << 12);
ch = us[i++];
tbuf[ui] = static_cast<wchar_t>(tbuf[ui] + ((ch & 0x7F) << 6));
ch = us[i++];
tbuf[ui] = static_cast<wchar_t>(tbuf[ui] + (ch & 0x7F));
}
ui++;
}
return ui;
#endif
}

View File

@@ -0,0 +1,9 @@
// UniConversion.h - functions to handle UFT-8 and UCS-2 strings
// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed.
unsigned int UTF8Length(const wchar_t *uptr, unsigned int tlen);
void UTF8FromUCS2(const wchar_t *uptr, unsigned int tlen, char *putf, unsigned int len);
unsigned int UCS2Length(const char *s, unsigned int len);
unsigned int UCS2FromUTF8(const char *s, unsigned int len, wchar_t *tbuf, unsigned int tlen);

View File

@@ -17,14 +17,46 @@ MarginStyle::MarginStyle() :
symbol(false), width(16), mask(0xffffffff), sensitive(false) { symbol(false), width(16), mask(0xffffffff), sensitive(false) {
} }
// A list of the fontnames - avoids wasting space in each style
FontNames::FontNames() {
max = 0;
}
FontNames::~FontNames() {
Clear();
}
void FontNames::Clear() {
for (int i=0;i<max;i++) {
delete []names[i];
}
max = 0;
}
const char *FontNames::Save(const char *name) {
if (!name)
return 0;
for (int i=0;i<max;i++) {
if (strcmp(names[i], name) == 0) {
return names[i];
}
}
names[max] = new char[strlen(name) + 1];
strcpy(names[max], name);
max++;
return names[max-1];
}
ViewStyle::ViewStyle() { ViewStyle::ViewStyle() {
Init(); Init();
} }
ViewStyle::ViewStyle(const ViewStyle &source) { ViewStyle::ViewStyle(const ViewStyle &source) {
Init(); Init();
for (int sty=0;sty<=STYLE_MAX;sty++) { for (unsigned int sty=0;sty<(sizeof(styles)/sizeof(styles[0]));sty++) {
styles[sty] = source.styles[sty]; styles[sty] = source.styles[sty];
// Can't just copy fontname as its lifetime is relative to its owning ViewStyle
styles[sty].fontName = fontNames.Save(source.styles[sty].fontName);
} }
for (int mrk=0;mrk<=MARKER_MAX;mrk++) { for (int mrk=0;mrk<=MARKER_MAX;mrk++) {
markers[mrk] = source.markers[mrk]; markers[mrk] = source.markers[mrk];
@@ -37,10 +69,12 @@ ViewStyle::ViewStyle(const ViewStyle &source) {
selforeground.desired = source.selforeground.desired; selforeground.desired = source.selforeground.desired;
selbackset = source.selbackset; selbackset = source.selbackset;
selbackground.desired = source.selbackground.desired; selbackground.desired = source.selbackground.desired;
selbackground2.desired = source.selbackground2.desired;
selbar.desired = source.selbar.desired; selbar.desired = source.selbar.desired;
selbarlight.desired = source.selbarlight.desired; selbarlight.desired = source.selbarlight.desired;
caretcolour.desired = source.caretcolour.desired; caretcolour.desired = source.caretcolour.desired;
edgecolour.desired = source.edgecolour.desired; edgecolour.desired = source.edgecolour.desired;
edgeState = source.edgeState;
leftMarginWidth = source.leftMarginWidth; leftMarginWidth = source.leftMarginWidth;
rightMarginWidth = source.rightMarginWidth; rightMarginWidth = source.rightMarginWidth;
for (int i=0;i < margins; i++) { for (int i=0;i < margins; i++) {
@@ -51,6 +85,7 @@ ViewStyle::ViewStyle(const ViewStyle &source) {
fixedColumnWidth = source.fixedColumnWidth; fixedColumnWidth = source.fixedColumnWidth;
zoomLevel = source.zoomLevel; zoomLevel = source.zoomLevel;
viewWhitespace = source.viewWhitespace; viewWhitespace = source.viewWhitespace;
viewIndentationGuides = source.viewIndentationGuides;
viewEOL = source.viewEOL; viewEOL = source.viewEOL;
showMarkedLines = source.showMarkedLines; showMarkedLines = source.showMarkedLines;
} }
@@ -59,6 +94,9 @@ ViewStyle::~ViewStyle() {
} }
void ViewStyle::Init() { void ViewStyle::Init() {
fontNames.Clear();
ResetDefaultStyle();
indicators[0].style = INDIC_SQUIGGLE; indicators[0].style = INDIC_SQUIGGLE;
indicators[0].fore = Colour(0, 0x7f, 0); indicators[0].fore = Colour(0, 0x7f, 0);
indicators[1].style = INDIC_TT; indicators[1].style = INDIC_TT;
@@ -76,6 +114,7 @@ void ViewStyle::Init() {
selforeground.desired = Colour(0xff, 0, 0); selforeground.desired = Colour(0xff, 0, 0);
selbackset = true; selbackset = true;
selbackground.desired = Colour(0xc0, 0xc0, 0xc0); selbackground.desired = Colour(0xc0, 0xc0, 0xc0);
selbackground2.desired = Colour(0xb0, 0xb0, 0xb0);
selbar.desired = Platform::Chrome(); selbar.desired = Platform::Chrome();
selbarlight.desired = Platform::ChromeHighlight(); selbarlight.desired = Platform::ChromeHighlight();
styles[STYLE_LINENUMBER].fore.desired = Colour(0, 0, 0); styles[STYLE_LINENUMBER].fore.desired = Colour(0, 0, 0);
@@ -83,6 +122,7 @@ void ViewStyle::Init() {
//caretcolour.desired = Colour(0xff, 0, 0); //caretcolour.desired = Colour(0xff, 0, 0);
caretcolour.desired = Colour(0, 0, 0); caretcolour.desired = Colour(0, 0, 0);
edgecolour.desired = Colour(0xc0, 0xc0, 0xc0); edgecolour.desired = Colour(0xc0, 0xc0, 0xc0);
edgeState = EDGE_NONE;
leftMarginWidth = 1; leftMarginWidth = 1;
rightMarginWidth = 1; rightMarginWidth = 1;
@@ -107,7 +147,8 @@ void ViewStyle::Init() {
maskInLine &= ~ms[margin].mask; maskInLine &= ~ms[margin].mask;
} }
zoomLevel = 0; zoomLevel = 0;
viewWhitespace = false; viewWhitespace = wsInvisible;
viewIndentationGuides = false;
viewEOL = false; viewEOL = false;
showMarkedLines = true; showMarkedLines = true;
} }
@@ -127,6 +168,7 @@ void ViewStyle::RefreshColourPalette(Palette &pal, bool want) {
} }
pal.WantFind(selforeground, want); pal.WantFind(selforeground, want);
pal.WantFind(selbackground, want); pal.WantFind(selbackground, want);
pal.WantFind(selbackground2, want);
pal.WantFind(selbar, want); pal.WantFind(selbar, want);
pal.WantFind(selbarlight, want); pal.WantFind(selbarlight, want);
pal.WantFind(caretcolour, want); pal.WantFind(caretcolour, want);
@@ -136,14 +178,17 @@ void ViewStyle::RefreshColourPalette(Palette &pal, bool want) {
void ViewStyle::Refresh(Surface &surface) { void ViewStyle::Refresh(Surface &surface) {
selbar.desired = Platform::Chrome(); selbar.desired = Platform::Chrome();
selbarlight.desired = Platform::ChromeHighlight(); selbarlight.desired = Platform::ChromeHighlight();
maxAscent = 1; styles[STYLE_DEFAULT].Realise(surface, zoomLevel);
maxDescent = 1; maxAscent = styles[STYLE_DEFAULT].ascent;
maxDescent = styles[STYLE_DEFAULT].descent;
for (unsigned int i=0;i<(sizeof(styles)/sizeof(styles[0]));i++) { for (unsigned int i=0;i<(sizeof(styles)/sizeof(styles[0]));i++) {
styles[i].Realise(surface, zoomLevel); if (i != STYLE_DEFAULT) {
if (maxAscent < styles[i].ascent) styles[i].Realise(surface, zoomLevel, &styles[STYLE_DEFAULT]);
maxAscent = styles[i].ascent; if (maxAscent < styles[i].ascent)
if (maxDescent < styles[i].descent) maxAscent = styles[i].ascent;
maxDescent = styles[i].descent; if (maxDescent < styles[i].descent)
maxDescent = styles[i].descent;
}
} }
lineHeight = maxAscent + maxDescent; lineHeight = maxAscent + maxDescent;
@@ -162,22 +207,32 @@ void ViewStyle::Refresh(Surface &surface) {
} }
void ViewStyle::ResetDefaultStyle() { void ViewStyle::ResetDefaultStyle() {
styles[STYLE_DEFAULT].Clear(); styles[STYLE_DEFAULT].Clear(Colour(0,0,0), Colour(0xff,0xff,0xff),
Platform::DefaultFontSize(), fontNames.Save(Platform::DefaultFont()),
SC_CHARSET_DEFAULT,
false, false, false, false, true);
} }
void ViewStyle::ClearStyles() { void ViewStyle::ClearStyles() {
// Reset all styles to be like the default style // Reset all styles to be like the default style
for (int i=0; i<=STYLE_MAX; i++) { for (unsigned int i=0;i<(sizeof(styles)/sizeof(styles[0]));i++) {
if (i != STYLE_DEFAULT) { if (i != STYLE_DEFAULT) {
styles[i].Clear( styles[i].Clear(
styles[STYLE_DEFAULT].fore.desired, styles[STYLE_DEFAULT].fore.desired,
styles[STYLE_DEFAULT].back.desired, styles[STYLE_DEFAULT].back.desired,
styles[STYLE_DEFAULT].size, styles[STYLE_DEFAULT].size,
styles[STYLE_DEFAULT].fontName, styles[STYLE_DEFAULT].fontName,
styles[STYLE_DEFAULT].characterSet,
styles[STYLE_DEFAULT].bold, styles[STYLE_DEFAULT].bold,
styles[STYLE_DEFAULT].italic); styles[STYLE_DEFAULT].italic,
styles[STYLE_DEFAULT].eolFilled,
styles[STYLE_DEFAULT].underline,
styles[STYLE_DEFAULT].visible);
} }
} }
styles[STYLE_LINENUMBER].back.desired = Platform::Chrome(); styles[STYLE_LINENUMBER].back.desired = Platform::Chrome();
} }
void ViewStyle::SetStyleFontName(int styleIndex, const char *name) {
styles[styleIndex].fontName = fontNames.Save(name);
}

View File

@@ -15,8 +15,21 @@ public:
MarginStyle(); MarginStyle();
}; };
class FontNames {
private:
char *names[STYLE_MAX + 1];
int max;
public:
FontNames();
~FontNames();
void Clear();
const char *Save(const char *name);
};
enum WhiteSpaceVisibility {wsInvisible=0, wsVisibleAlways=1, wsVisibleAfterIndent=2};
class ViewStyle { class ViewStyle {
public: public:
FontNames fontNames;
Style styles[STYLE_MAX + 1]; Style styles[STYLE_MAX + 1];
LineMarker markers[MARKER_MAX + 1]; LineMarker markers[MARKER_MAX + 1];
Indicator indicators[INDIC_MAX + 1]; Indicator indicators[INDIC_MAX + 1];
@@ -29,6 +42,7 @@ public:
ColourPair selforeground; ColourPair selforeground;
bool selbackset; bool selbackset;
ColourPair selbackground; ColourPair selbackground;
ColourPair selbackground2;
ColourPair selbar; ColourPair selbar;
ColourPair selbarlight; ColourPair selbarlight;
// Margins are ordered: Line Numbers, Selection Margin, Spacing Margin // Margins are ordered: Line Numbers, Selection Margin, Spacing Margin
@@ -40,11 +54,13 @@ public:
MarginStyle ms[margins]; MarginStyle ms[margins];
int fixedColumnWidth; int fixedColumnWidth;
int zoomLevel; int zoomLevel;
bool viewWhitespace; WhiteSpaceVisibility viewWhitespace;
bool viewIndentationGuides;
bool viewEOL; bool viewEOL;
bool showMarkedLines; bool showMarkedLines;
ColourPair caretcolour; ColourPair caretcolour;
ColourPair edgecolour; ColourPair edgecolour;
int edgeState;
ViewStyle(); ViewStyle();
ViewStyle(const ViewStyle &source); ViewStyle(const ViewStyle &source);
@@ -54,6 +70,7 @@ public:
void Refresh(Surface &surface); void Refresh(Surface &surface);
void ResetDefaultStyle(); void ResetDefaultStyle();
void ClearStyles(); void ClearStyles();
void SetStyleFontName(int styleIndex, const char *name);
}; };
#endif #endif

View File

@@ -0,0 +1,175 @@
// SciTE - Scintilla based Text Editor
// Accessor.cxx - rapid easy access to contents of a Scintilla
// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed.
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include "Platform.h"
#include "PropSet.h"
#include "Accessor.h"
#include "WindowAccessor.h"
#include "Scintilla.h"
WindowAccessor::~WindowAccessor() {
}
#if PLAT_WIN
bool WindowAccessor::InternalIsLeadByte(char ch) {
if (SC_CP_UTF8 == codePage)
// For lexing, all characters >= 0x80 are treated the
// same so none is considered a lead byte.
return false;
else
return IsDBCSLeadByteEx(codePage, ch);
}
#else
// PLAT_GTK or PLAT_WX
// TODO: support DBCS under GTK+ and WX
bool WindowAccessor::InternalIsLeadByte(char) {
return false;
}
#endif
void WindowAccessor::Fill(int position) {
if (lenDoc == -1)
lenDoc = Platform::SendScintilla(id, SCI_GETTEXTLENGTH, 0, 0);
startPos = position - slopSize;
if (startPos + bufferSize > lenDoc)
startPos = lenDoc - bufferSize;
if (startPos < 0)
startPos = 0;
endPos = startPos + bufferSize;
if (endPos > lenDoc)
endPos = lenDoc;
TextRange tr = {{startPos, endPos}, buf};
Platform::SendScintilla(id, SCI_GETTEXTRANGE, 0, reinterpret_cast<long>(&tr));
}
char WindowAccessor::StyleAt(int position) {
return static_cast<char>(Platform::SendScintilla(
id, SCI_GETSTYLEAT, position, 0));
}
int WindowAccessor::GetLine(int position) {
return Platform::SendScintilla(id, SCI_LINEFROMPOSITION, position, 0);
}
int WindowAccessor::LineStart(int line) {
return Platform::SendScintilla(id, SCI_POSITIONFROMLINE, line, 0);
}
int WindowAccessor::LevelAt(int line) {
return Platform::SendScintilla(id, SCI_GETFOLDLEVEL, line, 0);
}
int WindowAccessor::Length() {
if (lenDoc == -1)
lenDoc = Platform::SendScintilla(id, SCI_GETTEXTLENGTH, 0, 0);
return lenDoc;
}
int WindowAccessor::GetLineState(int line) {
return Platform::SendScintilla(id, SCI_GETLINESTATE, line);
}
int WindowAccessor::SetLineState(int line, int state) {
return Platform::SendScintilla(id, SCI_SETLINESTATE, line, state);
}
void WindowAccessor::StartAt(unsigned int start, char chMask) {
Platform::SendScintilla(id, SCI_STARTSTYLING, start, chMask);
}
void WindowAccessor::StartSegment(unsigned int pos) {
startSeg = pos;
}
void WindowAccessor::ColourTo(unsigned int pos, int chAttr) {
// Only perform styling if non empty range
if (pos != startSeg - 1) {
if (pos < startSeg) {
Platform::DebugPrintf("Bad colour positions %d - %d\n", startSeg, pos);
}
if (validLen + (pos - startSeg + 1) >= bufferSize)
Flush();
if (validLen + (pos - startSeg + 1) >= bufferSize) {
// Too big for buffer so send directly
Platform::SendScintilla(id, SCI_SETSTYLING, pos - startSeg + 1, chAttr);
} else {
if (chAttr != chWhile)
chFlags = 0;
chAttr |= chFlags;
for (unsigned int i = startSeg; i <= pos; i++) {
styleBuf[validLen++] = static_cast<char>(chAttr);
}
}
}
startSeg = pos+1;
}
void WindowAccessor::SetLevel(int line, int level) {
Platform::SendScintilla(id, SCI_SETFOLDLEVEL, line, level);
}
void WindowAccessor::Flush() {
startPos = extremePosition;
lenDoc = -1;
if (validLen > 0) {
Platform::SendScintilla(id, SCI_SETSTYLINGEX, validLen,
reinterpret_cast<long>(styleBuf));
validLen = 0;
}
}
int WindowAccessor::IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader) {
int end = Length();
int spaceFlags = 0;
// Determines the indentation level of the current line and also checks for consistent
// indentation compared to the previous line.
// Indentation is judged consistent when the indentation whitespace of each line lines
// the same or the indentation of one line is a prefix of the other.
int pos = LineStart(line);
char ch = (*this)[pos];
int indent = 0;
bool inPrevPrefix = line > 0;
int posPrev = inPrevPrefix ? LineStart(line-1) : 0;
while ((ch == ' ' || ch == '\t') && (pos < end)) {
if (inPrevPrefix) {
char chPrev = (*this)[posPrev++];
if (chPrev == ' ' || chPrev == '\t') {
if (chPrev != ch)
spaceFlags |= wsInconsistent;
} else {
inPrevPrefix = false;
}
}
if (ch == ' ') {
spaceFlags |= wsSpace;
indent++;
} else { // Tab
spaceFlags |= wsTab;
if (spaceFlags & wsSpace)
spaceFlags |= wsSpaceTab;
indent = (indent / 8 + 1) * 8;
}
ch = (*this)[++pos];
}
*flags = spaceFlags;
indent += SC_FOLDLEVELBASE;
// if completely empty line or the start of a comment...
if (isspace(ch) || (pfnIsCommentLeader && (*pfnIsCommentLeader)(*this, pos, end-pos)) )
return indent | SC_FOLDLEVELWHITEFLAG;
else
return indent;
}

File diff suppressed because it is too large Load Diff

523
contrib/src/stc/stc.cpp.in Normal file
View File

@@ -0,0 +1,523 @@
////////////////////////////////////////////////////////////////////////////
// Name: stc.cpp
// Purpose: A wxWindows implementation of Scintilla. This class is the
// one meant to be used directly by wx applications. It does not
// derive directly from the Scintilla classes, but instead
// delegates most things to the real Scintilla class.
// This allows the use of Scintilla without polluting the
// namespace with all the classes and identifiers from Scintilla.
//
// Author: Robin Dunn
//
// Created: 13-Jan-2000
// RCS-ID: $Id$
// Copyright: (c) 2000 by Total Control Software
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
#include <ctype.h>
#include "wx/stc/stc.h"
#include "ScintillaWX.h"
#include <wx/tokenzr.h>
// The following code forces a reference to all of the Scintilla lexers.
// If we don't do something like this, then the linker tends to "optimize"
// them away. (eric@sourcegear.com)
int wxForceScintillaLexers(void)
{
extern LexerModule lmCPP;
extern LexerModule lmHTML;
extern LexerModule lmXML;
extern LexerModule lmProps;
extern LexerModule lmErrorList;
extern LexerModule lmMake;
extern LexerModule lmBatch;
extern LexerModule lmPerl;
extern LexerModule lmPython;
extern LexerModule lmSQL;
extern LexerModule lmVB;
if (
&lmCPP
&& &lmHTML
&& &lmXML
&& &lmProps
&& &lmErrorList
&& &lmMake
&& &lmBatch
&& &lmPerl
&& &lmPython
&& &lmSQL
&& &lmVB
)
{
return 1;
}
else
{
return 0;
}
}
//----------------------------------------------------------------------
const wxChar* wxSTCNameStr = "stcwindow";
BEGIN_EVENT_TABLE(wxStyledTextCtrl, wxControl)
EVT_PAINT (wxStyledTextCtrl::OnPaint)
EVT_SCROLLWIN (wxStyledTextCtrl::OnScrollWin)
EVT_SIZE (wxStyledTextCtrl::OnSize)
EVT_LEFT_DOWN (wxStyledTextCtrl::OnMouseLeftDown)
EVT_MOTION (wxStyledTextCtrl::OnMouseMove)
EVT_LEFT_UP (wxStyledTextCtrl::OnMouseLeftUp)
EVT_RIGHT_UP (wxStyledTextCtrl::OnMouseRightUp)
EVT_CHAR (wxStyledTextCtrl::OnChar)
EVT_KEY_DOWN (wxStyledTextCtrl::OnKeyDown)
EVT_KILL_FOCUS (wxStyledTextCtrl::OnLoseFocus)
EVT_SET_FOCUS (wxStyledTextCtrl::OnGainFocus)
EVT_SYS_COLOUR_CHANGED (wxStyledTextCtrl::OnSysColourChanged)
EVT_ERASE_BACKGROUND (wxStyledTextCtrl::OnEraseBackground)
EVT_MENU_RANGE (-1, -1, wxStyledTextCtrl::OnMenu)
EVT_LISTBOX_DCLICK (-1, wxStyledTextCtrl::OnListBox)
END_EVENT_TABLE()
IMPLEMENT_CLASS(wxStyledTextCtrl, wxControl)
IMPLEMENT_DYNAMIC_CLASS(wxStyledTextEvent, wxCommandEvent)
//----------------------------------------------------------------------
// Constructor and Destructor
wxStyledTextCtrl::wxStyledTextCtrl(wxWindow *parent,
wxWindowID id,
const wxPoint& pos,
const wxSize& size,
long style,
const wxString& name) :
wxControl(parent, id, pos, size,
style | wxVSCROLL | wxHSCROLL | wxWANTS_CHARS | wxCLIP_CHILDREN,
wxDefaultValidator, name)
{
m_swx = new ScintillaWX(this);
m_stopWatch.Start();
}
wxStyledTextCtrl::~wxStyledTextCtrl() {
delete m_swx;
}
//----------------------------------------------------------------------
long wxStyledTextCtrl::SendMsg(int msg, long wp, long lp) {
return m_swx->WndProc(msg, wp, lp);
}
#ifdef MAKELONG
#undef MAKELONG
#endif
#define MAKELONG(a, b) ((a) | ((b) << 16))
static long wxColourAsLong(const wxColour& co) {
return (((long)co.Blue() << 16) |
((long)co.Green() << 8) |
((long)co.Red()));
}
static wxColour wxColourFromLong(long c) {
wxColour clr;
clr.Set(c & 0xff, (c >> 8) & 0xff, (c >> 16) & 0xff);
return clr;
}
static wxColour wxColourFromSpec(const wxString& spec) {
// spec should be #RRGGBB
char* junk;
int red = strtol(spec.Mid(1,2), &junk, 16);
int green = strtol(spec.Mid(3,2), &junk, 16);
int blue = strtol(spec.Mid(5,2), &junk, 16);
return wxColour(red, green, blue);
}
//----------------------------------------------------------------------
// BEGIN generated section. The following code is automatically generated
// by gen_iface.py from the contents of Scintilla.iface. Do not edit
// this file. Edit stc.cpp.in or gen_iface.py instead and regenerate.
%(METHOD_IMPS)s
// END of generated section
//----------------------------------------------------------------------
// Returns the line number of the line with the caret.
int wxStyledTextCtrl::GetCurrentLine() {
int line = LineFromPosition(GetCurrentPos());
return line;
}
// Extract style settings from a spec-string which is composed of one or
// more of the following comma separated elements:
//
// bold turns on bold
// italic turns on italics
// fore:#RRGGBB sets the foreground colour
// back:#RRGGBB sets the background colour
// face:[facename] sets the font face name to use
// size:[num] sets the font size in points
// eol turns on eol filling
// underline turns on underlining
//
void wxStyledTextCtrl::StyleSetSpec(int styleNum, const wxString& spec) {
wxStringTokenizer tkz(spec, ",");
while (tkz.HasMoreTokens()) {
wxString token = tkz.GetNextToken();
wxString option = token.BeforeFirst(':');
wxString val = token.AfterFirst(':');
if (option == "bold")
StyleSetBold(styleNum, true);
else if (option == "italic")
StyleSetItalic(styleNum, true);
else if (option == "underline")
StyleSetUnderline(styleNum, true);
else if (option == "eol")
StyleSetEOLFilled(styleNum, true);
else if (option == "size") {
long points;
if (val.ToLong(&points))
StyleSetSize(styleNum, points);
}
else if (option == "face")
StyleSetFaceName(styleNum, val);
else if (option == "fore")
StyleSetForeground(styleNum, wxColourFromSpec(val));
else if (option == "back")
StyleSetBackground(styleNum, wxColourFromSpec(val));
}
}
// Set style size, face, bold, italic, and underline attributes from
// a wxFont's attributes.
void wxStyledTextCtrl::StyleSetFont(int styleNum, wxFont& font) {
int size = font.GetPointSize();
wxString faceName = font.GetFaceName();
bool bold = font.GetWeight() == wxBOLD;
bool italic = font.GetStyle() != wxNORMAL;
bool under = font.GetUnderlined();
// TODO: add encoding/charset mapping
StyleSetFontAttr(styleNum, size, faceName, bold, italic, under);
}
// Set all font style attributes at once.
void wxStyledTextCtrl::StyleSetFontAttr(int styleNum, int size,
const wxString& faceName,
bool bold, bool italic,
bool underline) {
StyleSetSize(styleNum, size);
StyleSetFaceName(styleNum, faceName);
StyleSetBold(styleNum, bold);
StyleSetItalic(styleNum, italic);
StyleSetUnderline(styleNum, underline);
// TODO: add encoding/charset mapping
}
// Perform one of the operations defined by the wxSTC_CMD_* constants.
void wxStyledTextCtrl::CmdKeyExecute(int cmd) {
SendMsg(cmd);
}
// Set the left and right margin in the edit area, measured in pixels.
void wxStyledTextCtrl::SetMargins(int left, int right) {
SetMarginLeft(left);
SetMarginRight(right);
}
// Retrieve the start and end positions of the current selection.
void wxStyledTextCtrl::GetSelection(int* startPos, int* endPos) {
if (startPos != NULL)
*startPos = SendMsg(SCI_GETSELECTIONSTART);
if (endPos != NULL)
*endPos = SendMsg(SCI_GETSELECTIONEND);
}
// Retrieve the point in the window where a position is displayed.
wxPoint wxStyledTextCtrl::PointFromPosition(int pos) {
int x = SendMsg(SCI_POINTXFROMPOSITION, 0, pos);
int y = SendMsg(SCI_POINTYFROMPOSITION, 0, pos);
return wxPoint(x, y);
}
// Scroll enough to make the given line visible
void wxStyledTextCtrl::ScrollToLine(int line) {
m_swx->DoScrollToLine(line);
}
// Scroll enough to make the given column visible
void wxStyledTextCtrl::ScrollToColumn(int column) {
m_swx->DoScrollToColumn(column);
}
//----------------------------------------------------------------------
// Event handlers
void wxStyledTextCtrl::OnPaint(wxPaintEvent& evt) {
wxPaintDC dc(this);
wxRegion region = GetUpdateRegion();
m_swx->DoPaint(&dc, region.GetBox());
}
void wxStyledTextCtrl::OnScrollWin(wxScrollWinEvent& evt) {
if (evt.GetOrientation() == wxHORIZONTAL)
m_swx->DoHScroll(evt.GetEventType(), evt.GetPosition());
else
m_swx->DoVScroll(evt.GetEventType(), evt.GetPosition());
}
void wxStyledTextCtrl::OnSize(wxSizeEvent& evt) {
wxSize sz = GetClientSize();
m_swx->DoSize(sz.x, sz.y);
}
void wxStyledTextCtrl::OnMouseLeftDown(wxMouseEvent& evt) {
wxPoint pt = evt.GetPosition();
m_swx->DoButtonDown(Point(pt.x, pt.y), m_stopWatch.Time(),
evt.ShiftDown(), evt.ControlDown(), evt.AltDown());
}
void wxStyledTextCtrl::OnMouseMove(wxMouseEvent& evt) {
wxPoint pt = evt.GetPosition();
m_swx->DoButtonMove(Point(pt.x, pt.y));
}
void wxStyledTextCtrl::OnMouseLeftUp(wxMouseEvent& evt) {
wxPoint pt = evt.GetPosition();
m_swx->DoButtonUp(Point(pt.x, pt.y), m_stopWatch.Time(),
evt.ControlDown());
}
void wxStyledTextCtrl::OnMouseRightUp(wxMouseEvent& evt) {
wxPoint pt = evt.GetPosition();
m_swx->DoContextMenu(Point(pt.x, pt.y));
}
void wxStyledTextCtrl::OnChar(wxKeyEvent& evt) {
long key = evt.KeyCode();
if ((key > WXK_ESCAPE) &&
(key != WXK_DELETE) && (key < 255) &&
!evt.ControlDown() && !evt.AltDown()) {
m_swx->DoAddChar(key);
}
else {
evt.Skip();
}
}
void wxStyledTextCtrl::OnKeyDown(wxKeyEvent& evt) {
long key = evt.KeyCode();
key = toupper(key);
int processed = m_swx->DoKeyDown(key, evt.ShiftDown(),
evt.ControlDown(), evt.AltDown());
if (! processed)
evt.Skip();
}
void wxStyledTextCtrl::OnLoseFocus(wxFocusEvent& evt) {
m_swx->DoLoseFocus();
}
void wxStyledTextCtrl::OnGainFocus(wxFocusEvent& evt) {
m_swx->DoGainFocus();
}
void wxStyledTextCtrl::OnSysColourChanged(wxSysColourChangedEvent& evt) {
m_swx->DoSysColourChange();
}
void wxStyledTextCtrl::OnEraseBackground(wxEraseEvent& evt) {
// do nothing to help avoid flashing
}
void wxStyledTextCtrl::OnMenu(wxCommandEvent& evt) {
m_swx->DoCommand(evt.GetId());
}
void wxStyledTextCtrl::OnListBox(wxCommandEvent& evt) {
m_swx->DoOnListBox();
}
//----------------------------------------------------------------------
// Turn notifications from Scintilla into events
void wxStyledTextCtrl::NotifyChange() {
wxStyledTextEvent evt(wxEVT_STC_CHANGE, GetId());
GetEventHandler()->ProcessEvent(evt);
}
void wxStyledTextCtrl::NotifyParent(SCNotification* _scn) {
SCNotification& scn = *_scn;
int eventType = 0;
switch (scn.nmhdr.code) {
case SCN_STYLENEEDED:
eventType = wxEVT_STC_STYLENEEDED;
break;
case SCN_CHARADDED:
eventType = wxEVT_STC_CHARADDED;
break;
case SCN_UPDATEUI:
eventType = wxEVT_STC_UPDATEUI;
break;
case SCN_SAVEPOINTREACHED:
eventType = wxEVT_STC_SAVEPOINTREACHED;
break;
case SCN_SAVEPOINTLEFT:
eventType = wxEVT_STC_SAVEPOINTLEFT;
break;
case SCN_MODIFYATTEMPTRO:
eventType = wxEVT_STC_ROMODIFYATTEMPT;
break;
case SCN_DOUBLECLICK:
eventType = wxEVT_STC_DOUBLECLICK;
break;
case SCN_MODIFIED:
eventType = wxEVT_STC_MODIFIED;
break;
case SCN_KEY:
eventType = wxEVT_STC_KEY;
break;
case SCN_MACRORECORD:
eventType = wxEVT_STC_MACRORECORD;
break;
case SCN_MARGINCLICK:
eventType = wxEVT_STC_MARGINCLICK;
break;
case SCN_NEEDSHOWN:
eventType = wxEVT_STC_NEEDSHOWN;
break;
case SCN_POSCHANGED:
eventType = wxEVT_STC_POSCHANGED;
break;
}
if (eventType) {
wxStyledTextEvent evt(eventType, GetId());
evt.SetPosition(scn.position);
evt.SetKey(scn.ch);
evt.SetModifiers(scn.modifiers);
if (eventType == wxEVT_STC_MODIFIED) {
evt.SetModificationType(scn.modificationType);
if (scn.text)
evt.SetText(wxString(scn.text, scn.length));
evt.SetLength(scn.length);
evt.SetLinesAdded(scn.linesAdded);
evt.SetLine(scn.line);
evt.SetFoldLevelNow(scn.foldLevelNow);
evt.SetFoldLevelPrev(scn.foldLevelPrev);
}
if (eventType == wxEVT_STC_MARGINCLICK)
evt.SetMargin(scn.margin);
if (eventType == wxEVT_STC_MACRORECORD) {
evt.SetMessage(scn.message);
evt.SetWParam(scn.wParam);
evt.SetLParam(scn.lParam);
}
GetEventHandler()->ProcessEvent(evt);
}
}
//----------------------------------------------------------------------
//----------------------------------------------------------------------
//----------------------------------------------------------------------
wxStyledTextEvent::wxStyledTextEvent(wxEventType commandType, int id)
: wxCommandEvent(commandType, id)
{
m_position = 0;
m_key = 0;
m_modifiers = 0;
m_modificationType = 0;
m_length = 0;
m_linesAdded = 0;
m_line = 0;
m_foldLevelNow = 0;
m_foldLevelPrev = 0;
m_margin = 0;
m_message = 0;
m_wParam = 0;
m_lParam = 0;
}
bool wxStyledTextEvent::GetShift() const { return (m_modifiers & SCI_SHIFT) != 0; }
bool wxStyledTextEvent::GetControl() const { return (m_modifiers & SCI_CTRL) != 0; }
bool wxStyledTextEvent::GetAlt() const { return (m_modifiers & SCI_ALT) != 0; }
void wxStyledTextEvent::CopyObject(wxObject& obj) const {
wxCommandEvent::CopyObject(obj);
wxStyledTextEvent* o = (wxStyledTextEvent*)&obj;
o->m_position = m_position;
o->m_key = m_key;
o->m_modifiers = m_modifiers;
o->m_modificationType = m_modificationType;
o->m_text = m_text;
o->m_length = m_length;
o->m_linesAdded = m_linesAdded;
o->m_line = m_line;
o->m_foldLevelNow = m_foldLevelNow;
o->m_foldLevelPrev = m_foldLevelPrev;
o->m_margin = m_margin;
o->m_message = m_message;
o->m_wParam = m_wParam;
o->m_lParam = m_lParam;
}
//----------------------------------------------------------------------
//----------------------------------------------------------------------

297
contrib/src/stc/stc.h.in Normal file
View File

@@ -0,0 +1,297 @@
////////////////////////////////////////////////////////////////////////////
// Name: stc.h
// Purpose: A wxWindows implementation of Scintilla. This class is the
// one meant to be used directly by wx applications. It does not
// derive directly from the Scintilla classes, and in fact there
// is no mention of Scintilla classes at all in this header.
// This class delegates all method calls and events to the
// Scintilla objects and so forth. This allows the use of
// Scintilla without polluting the namespace with all the
// classes and itentifiers from Scintilla.
//
// Author: Robin Dunn
//
// Created: 13-Jan-2000
// RCS-ID: $Id$
// Copyright: (c) 2000 by Total Control Software
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
#ifndef __stc_h__
#define __stc_h__
#include <wx/wx.h>
//----------------------------------------------------------------------
// BEGIN generated section. The following code is automatically generated
// by gen_iface.py. Do not edit this file. Edit stc.h.in instead
// and regenerate
%(VALUES)s
// END of generated section
//----------------------------------------------------------------------
// Others
#define wxSTC_MASK_FOLDERS ((1 << wxSTC_MARKNUM_FOLDER) | (1 << wxSTC_MARKNUM_FOLDEROPEN))
//----------------------------------------------------------------------
class ScintillaWX; // forward declare
class WordList;
struct SCNotification;
extern const wxChar* wxSTCNameStr;
//----------------------------------------------------------------------
class wxStyledTextCtrl : public wxControl {
public:
#ifdef SWIG
wxStyledTextCtrl(wxWindow *parent, wxWindowID id,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize, long style = 0,
const char* name = "styledtext");
#else
wxStyledTextCtrl(wxWindow *parent, wxWindowID id,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize, long style = 0,
const wxString& name = wxSTCNameStr);
#endif
#ifndef SWIG
~wxStyledTextCtrl();
#endif
//----------------------------------------------------------------------
// BEGIN generated section. The following code is automatically generated
// by gen_iface.py. Do not edit this file. Edit stc.h.in instead
// and regenerate
%(METHOD_DEFS)s
// END of generated section
//----------------------------------------------------------------------
// Others...
// Returns the line number of the line with the caret.
int GetCurrentLine();
// Extract style settings from a spec-string which is composed of one or
// more of the following comma separated elements:
//
// bold turns on bold
// italic turns on italics
// fore:#RRGGBB sets the foreground colour
// back:#RRGGBB sets the background colour
// face:[facename] sets the font face name to use
// size:[num] sets the font size in points
// eol turns on eol filling
// underline turns on underlining
//
void StyleSetSpec(int styleNum, const wxString& spec);
// Set style size, face, bold, italic, and underline attributes from
// a wxFont's attributes.
void StyleSetFont(int styleNum, wxFont& font);
// Set all font style attributes at once.
void StyleSetFontAttr(int styleNum, int size,
const wxString& faceName,
bool bold, bool italic,
bool underline);
// Perform one of the operations defined by the wxSTC_CMD_* constants.
void CmdKeyExecute(int cmd);
// Set the left and right margin in the edit area, measured in pixels.
void SetMargins(int left, int right);
// Retrieve the start and end positions of the current selection.
#ifdef SWIG
void GetSelection(int* OUTPUT, int* OUTPUT);
#else
void GetSelection(int* startPos, int* endPos);
#endif
// Retrieve the point in the window where a position is displayed.
wxPoint PointFromPosition(int pos);
// Scroll enough to make the given line visible
void ScrollToLine(int line);
// Scroll enough to make the given column visible
void ScrollToColumn(int column);
//----------------------------------------------------------------------
#ifndef SWIG
private:
// Event handlers
void OnPaint(wxPaintEvent& evt);
void OnScrollWin(wxScrollWinEvent& evt);
void OnSize(wxSizeEvent& evt);
void OnMouseLeftDown(wxMouseEvent& evt);
void OnMouseMove(wxMouseEvent& evt);
void OnMouseLeftUp(wxMouseEvent& evt);
void OnMouseRightUp(wxMouseEvent& evt);
void OnChar(wxKeyEvent& evt);
void OnKeyDown(wxKeyEvent& evt);
void OnLoseFocus(wxFocusEvent& evt);
void OnGainFocus(wxFocusEvent& evt);
void OnSysColourChanged(wxSysColourChangedEvent& evt);
void OnEraseBackground(wxEraseEvent& evt);
void OnMenu(wxCommandEvent& evt);
void OnListBox(wxCommandEvent& evt);
// Turn notifications from Scintilla into events
void NotifyChange();
void NotifyParent(SCNotification* scn);
long SendMsg(int msg, long wp=0, long lp=0);
private:
DECLARE_EVENT_TABLE()
DECLARE_CLASS(wxStyledTextCtrl)
ScintillaWX* m_swx;
wxStopWatch m_stopWatch;
friend class ScintillaWX;
friend class Platform;
#endif
};
//----------------------------------------------------------------------
class wxStyledTextEvent : public wxCommandEvent {
public:
wxStyledTextEvent(wxEventType commandType=0, int id=0);
~wxStyledTextEvent() {}
void SetPosition(int pos) { m_position = pos; }
void SetKey(int k) { m_key = k; }
void SetModifiers(int m) { m_modifiers = m; }
void SetModificationType(int t) { m_modificationType = t; }
void SetText(const char* t) { m_text = t; }
void SetLength(int len) { m_length = len; }
void SetLinesAdded(int num) { m_linesAdded = num; }
void SetLine(int val) { m_line = val; }
void SetFoldLevelNow(int val) { m_foldLevelNow = val; }
void SetFoldLevelPrev(int val) { m_foldLevelPrev = val; }
void SetMargin(int val) { m_margin = val; }
void SetMessage(int val) { m_message = val; }
void SetWParam(int val) { m_wParam = val; }
void SetLParam(int val) { m_lParam = val; }
int GetPosition() const { return m_position; }
int GetKey() const { return m_key; }
int GetModifiers() const { return m_modifiers; }
int GetModificationType() const { return m_modificationType; }
wxString GetText() const { return m_text; }
int GetLength() const { return m_length; }
int GetLinesAdded() const { return m_linesAdded; }
int GetLine() const { return m_line; }
int GetFoldLevelNow() const { return m_foldLevelNow; }
int GetFoldLevelPrev() const { return m_foldLevelPrev; }
int GetMargin() const { return m_margin; }
int GetMessage() const { return m_message; }
int GetWParam() const { return m_wParam; }
int GetLParam() const { return m_lParam; }
bool GetShift() const;
bool GetControl() const;
bool GetAlt() const;
void CopyObject(wxObject& obj) const;
#ifndef SWIG
private:
DECLARE_DYNAMIC_CLASS(wxStyledTextEvent)
int m_position;
int m_key;
int m_modifiers;
int m_modificationType; // wxEVT_STC_MODIFIED
wxString m_text;
int m_length;
int m_linesAdded;
int m_line;
int m_foldLevelNow;
int m_foldLevelPrev;
int m_margin; // wxEVT_STC_MARGINCLICK
int m_message; // wxEVT_STC_MACRORECORD
int m_wParam;
int m_lParam;
#endif
};
// Event types
enum {
wxEVT_STC_CHANGE = 1650,
wxEVT_STC_STYLENEEDED,
wxEVT_STC_CHARADDED,
wxEVT_STC_UPDATEUI,
wxEVT_STC_SAVEPOINTREACHED,
wxEVT_STC_SAVEPOINTLEFT,
wxEVT_STC_ROMODIFYATTEMPT,
wxEVT_STC_DOUBLECLICK,
wxEVT_STC_MODIFIED,
wxEVT_STC_KEY,
wxEVT_STC_MACRORECORD,
wxEVT_STC_MARGINCLICK,
wxEVT_STC_NEEDSHOWN,
wxEVT_STC_POSCHANGED
};
#ifndef SWIG
typedef void (wxEvtHandler::*wxStyledTextEventFunction)(wxStyledTextEvent&);
#define EVT_STC_CHANGE(id, fn) { wxEVT_STC_CHANGE, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
#define EVT_STC_STYLENEEDED(id, fn) { wxEVT_STC_STYLENEEDED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
#define EVT_STC_CHARADDED(id, fn) { wxEVT_STC_CHARADDED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
#define EVT_STC_UPDATEUI(id, fn) { wxEVT_STC_UPDATEUI, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
#define EVT_STC_SAVEPOINTREACHED(id, fn) { wxEVT_STC_SAVEPOINTREACHED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
#define EVT_STC_SAVEPOINTLEFT(id, fn) { wxEVT_STC_SAVEPOINTLEFT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
#define EVT_STC_ROMODIFYATTEMPT(id, fn) { wxEVT_STC_ROMODIFYATTEMPT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
#define EVT_STC_DOUBLECLICK(id, fn) { wxEVT_STC_DOUBLECLICK, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
#define EVT_STC_MODIFIED(id, fn) { wxEVT_STC_MODIFIED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
#define EVT_STC_KEY(id, fn) { wxEVT_STC_KEY, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
#define EVT_STC_MACRORECORD(id, fn) { wxEVT_STC_MACRORECORD, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
#define EVT_STC_MARGINCLICK(id, fn) { wxEVT_STC_MARGINCLICK, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
#define EVT_STC_NEEDSHOWN(id, fn) { wxEVT_STC_NEEDSHOWN, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
#define EVT_STC_POSCHANGED(id, fn) { wxEVT_STC_POSCHANGED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
#endif
//----------------------------------------------------------------------
//----------------------------------------------------------------------
#endif

21
debian/README.Debian vendored
View File

@@ -3,11 +3,26 @@ wxwindows for Debian
The following packages are built from the wxWindows CVS source. The following packages are built from the wxWindows CVS source.
libwxgtk wxGTK shared library libwxbase wxBase runtime shared libraries
libwxgtk-dev Headers and static lib for building wxGTK apps libwxbase-dev extra files and static libs for building wxBase apps
libwxgtk-python Python binding to wxGTK libwxbase-dbg wxBase libraries built with -g and __WXDEBUG__
libwxgtk wxGTK runtime shared libraries
libwxgtk-dev extra files and static libs for building wxGTK apps
libwxgtk-dbg wxGTK libraries built with -g and __WXDEBUG__
libwxgtk-python Python binding to wxGTK (from 2.2.3 onward, this
obsoletes the libwxgtk-python-contrib package as
all python modules are build into a single monolith)
wxwin-contrib wxWin contrib runtime shared libs (built with wxGTK)
wxwin-contrib-dev extra files and static contrib libs for building apps
wxwin-headers common header files for building wxWindows apps
wxwin-doc HTML version of the wxWindows manual wxwin-doc HTML version of the wxWindows manual
wxwin-examples wxWindows and wxPython demos and samples (source) wxwin-examples wxWindows and wxPython demos and samples (source)
wxwin-i18n message catalogs for native language support
-- Ron Lee <ron@debian.org>, Sun, 13 Feb 2000 18:40:00 +1030 -- Ron Lee <ron@debian.org>, Sun, 13 Feb 2000 18:40:00 +1030

40
debian/changelog vendored
View File

@@ -1,6 +1,42 @@
wxwindows2.1 (2.1.14) unstable; urgency=low wxwindows2.2 (2.2.5.1) unstable; urgency=low
* Repackaged to build from cvs. * "This One's for Dirk" Closes: #84696
* 2.2.5 has known issues and will not be released for Debian.
* Fixed parser.y for Alpha builds (#82949)
* changed mesa dependency to the virtual libgl package and
added Conflicts for the old 2.1 packages (which are now
gone from woody anyway) Closes: #80120, #70778, #70779, #70780
* wxPython now builds as a single unit (including contrib)
so removed the libwxgtk-python-contrib package
* updated translations
* new event table macro to enable code being written with 2.2
to be forward compatible with the changes in 2.4
* numerous sundry bugfixes
-- Ron Lee <ron@debian.org> Wed, 24 Jan 2001 18:51:24 -0800
wxwindows2.2 (2.2.2) unstable; urgency=low
* added missing dependancy for contrib-dev package. Closes: #70880
* by popular demand, added a package with the python-contrib libs.
* more tweaks to deb/rules. autodetect the python install location,
and cache the results of configure tests for all packages.
* and of course a whole stack of minor fixes in the main codebase too.
-- Ron Lee <ron@debian.org> Tue, 5 Sep 2000 18:51:24 +0930
wxwindows2.2 (2.2.1) unstable; urgency=low
* wxWin 2.2.1 stable release.
* First upload to deb.org after repackaging to build directly from
upstream cvs.
* still not quite lintian clean yet:
- wxPython lib can't be built with a proper soname yet.
- the -dbg packages need an override for the shlib symlink.
- and a couple of packages have the lib symlink 'before the
lib', but that's ugly to fix right now, they aren't critical
libs, and allegedly this will be handled by dpkg sometime soon.
* moved full licence text into copyright file.
-- Ron Lee <ron@debian.org> Sun, 13 Feb 2000 18:40:00 +1030 -- Ron Lee <ron@debian.org> Sun, 13 Feb 2000 18:40:00 +1030

143
debian/control.in vendored
View File

@@ -1,9 +1,9 @@
Source: wxwindows=V Source: wxwindows=V
Section: libs Section: libs
Priority: optional Priority: optional
Build-Depends: debhelper, libgtk1.2-dev, python-dev (>=1.5), flex, bison Build-Depends: debhelper (>=2.0), flex, bison, libgtk1.2-dev, python-dev (>=1.5.2), python-distutils, zlib1g-dev, libjpeg62-dev, libpng2-dev, libtiff3g-dev, libgl-dev, libesd0-dev
Maintainer: Ron Lee <ron@debian.org> Maintainer: Ron Lee <ron@debian.org>
Standards-Version: 3.1.1 Standards-Version: 3.2.1.2
Package: libwxbase=V Package: libwxbase=V
Architecture: any Architecture: any
@@ -15,8 +15,8 @@ Description: wxBase library (runtime) - non-GUI support classes of wxWindows too
portable wrappers around many OS-specific functions allowing to build the portable wrappers around many OS-specific functions allowing to build the
same program under all supported folders, wxThread class for writing same program under all supported folders, wxThread class for writing
multithreaded programs using either Win32 or POSIX threads and much more. multithreaded programs using either Win32 or POSIX threads and much more.
wxBase currently supports the following platforms: Win32, generic Unix wxBase currently supports the following platforms: Generic Unix (Linux, FreeBSD,
(Linux, FreeBSD, Solaris, HP-UX, ...) and BeOS. Solaris, HP-UX, ...), win32, and BeOS.
. .
This package is only useful for non-gui apps. It offers a subset of the This package is only useful for non-gui apps. It offers a subset of the
classes in libwx_gtk=V for use in console apps and daemons. It is currently classes in libwx_gtk=V for use in console apps and daemons. It is currently
@@ -25,7 +25,7 @@ Description: wxBase library (runtime) - non-GUI support classes of wxWindows too
Package: libwxbase=V-dev Package: libwxbase=V-dev
Architecture: any Architecture: any
Section: devel Section: devel
Depends: libwxbase=V (= ${Source-Version}), libwxgtk=V-dev (= ${Source-Version}), libc6-dev Depends: wxwin=V-headers (= ${Source-Version}), libwxbase=V (= ${Source-Version}), libc6-dev
Suggests: wxwin=V-doc, gettext Suggests: wxwin=V-doc, gettext
Conflicts: libwxbase-dev Conflicts: libwxbase-dev
Replaces: libwxbase-dev Replaces: libwxbase-dev
@@ -36,52 +36,149 @@ Description: wxBase library (development) - non-GUI support classes of wxWindows
portable wrappers around many OS-specific functions allowing to build the portable wrappers around many OS-specific functions allowing to build the
same program under all supported folders, wxThread class for writing same program under all supported folders, wxThread class for writing
multithreaded programs using either Win32 or POSIX threads and much more. multithreaded programs using either Win32 or POSIX threads and much more.
wxBase currently supports the following platforms: Win32, generic Unix wxBase currently supports the following platforms: Generic Unix (Linux, FreeBSD,
(Linux, FreeBSD, Solaris, HP-UX, ...) and BeOS. Solaris, HP-UX, ...), win32, and BeOS.
. .
This package is only useful for non-gui apps. It offers a subset of the This package provides the files needed to compile apps using the wxBase library.
classes in libwx_gtk=V for use in console apps and daemons. It is currently
under development and may not be as stable as the gui version. Package: libwxbase=V-dbg
Architecture: any
Section: devel
Depends: wxwin=V-headers (= ${Source-Version}), libc6-dev
Conflicts: libwxbase-dbg
Replaces: libwxbase-dbg
Provides: libwxbase-dbg
Description: wxBase library (debug) - non-GUI support classes of wxWindows toolkit
wxBase is a collection of C++ classes providing basic data structures
(strings, lists, arrays), powerful wxDateTime class for date manipulations,
portable wrappers around many OS-specific functions allowing to build the
same program under all supported folders, wxThread class for writing
multithreaded programs using either Win32 or POSIX threads and much more.
wxBase currently supports the following platforms: Generic Unix (Linux, FreeBSD,
Solaris, HP-UX, ...) win32, and BeOS.
.
This package provides a debug version of the wxBase library. It is compiled
both with -g for normal debugger tracing and with the __WXDEBUG__ flag which
provides many internal checks by wxWindows itself that are not performed on
apps compiled with the 'release version' libs in the -dev package.
Package: libwxgtk=V Package: libwxgtk=V
Architecture: any Architecture: any
Section: libs Section: libs
Depends: ${shlibs:Depends} Depends: ${shlibs:Depends}
Suggests: libgl1
Replaces: wxgtk2.1
Description: wxWindows Cross-platform C++ GUI toolkit (GTK+ runtime) Description: wxWindows Cross-platform C++ GUI toolkit (GTK+ runtime)
wxWindows is a class library for C++ providing GUI (Graphical User wxWindows is a class library for C++ providing GUI (Graphical User
Interface) and other facilities on more than one platform. Version 2.1 Interface) and other facilities on more than one platform. Version =V
currently supports subsets of GTK+, Motif, and MS Windows. currently supports subsets of GTK+, Motif, and MS Windows.
. .
This package provides the shared libraries needed to run programs linked This package provides the shared libraries needed to run programs linked
against wxWindows. against wxWindows. To use the (optional) glcanvas library you will need
to have Mesa or OpenGL installed.
Package: libwxgtk=V-dev Package: libwxgtk=V-dev
Architecture: any Architecture: any
Section: devel Section: devel
Depends: libwxgtk=V (= ${Source-Version}), libc6-dev Depends: wxwin=V-headers (= ${Source-Version}), libwxgtk=V (= ${Source-Version}), libc6-dev
Suggests: wxwin=V-doc, libstdc++-dev, gettext Suggests: wxwin=V-doc, libstdc++-dev, gettext, libgl-dev
Conflicts: libwxgtk-dev Conflicts: libwxgtk-dev
Replaces: libwxgtk-dev Replaces: libwxgtk-dev, wxgtk2.1-dev
Provides: libwxgtk-dev Provides: libwxgtk-dev
Description: wxWindows Cross-platform C++ GUI toolkit (GTK+ development) Description: wxWindows Cross-platform C++ GUI toolkit (GTK+ development)
wxWindows is a class library for C++ providing GUI (Graphical User wxWindows is a class library for C++ providing GUI (Graphical User
Interface) and other facilities on more than one platform. Version 2.1 Interface) and other facilities on more than one platform. Version =V
currently supports subsets of GTK+, Motif, and MS Windows. currently supports subsets of GTK+, Motif, and MS Windows.
. .
This package provides files needed to compile wxWindows programs. It This package provides files needed to compile wxWindows programs. If you
includes header files and static libraries. want to compile apps using the (optional) glcanvas library you will need
to have Mesa or OpenGL installed too.
Package: libwxgtk=V-dbg
Architecture: any
Section: devel
Depends: wxwin=V-headers (= ${Source-Version}), libc6-dev
Conflicts: libwxgtk-dbg
Replaces: libwxgtk-dbg
Provides: libwxgtk-dbg
Description: wxWindows Cross-platform C++ GUI toolkit (GTK+ development)
wxWindows is a class library for C++ providing GUI (Graphical User
Interface) and other facilities on more than one platform. Version =V
currently supports subsets of GTK+, Motif, and MS Windows.
.
This package provides a debug version of the wxGtk library. It is compiled
both with -g for normal debugger tracing and with the __WXDEBUG__ flag which
provides many internal checks by wxWindows itself that are not performed on
apps compiled with the 'release version' libs in the -dev package.
Package: libwxgtk=V-python Package: libwxgtk=V-python
Architecture: any Architecture: any
Section: interpreters Section: interpreters
Depends: libwxgtk=V (= ${Source-Version}), python-base (>=1.5), ${shlibs:Depends} Depends: libwxgtk=V (= ${Source-Version}), libwxgtk=V-contrib (= ${Source-Version}), python-base (>=1.5.2), ${shlibs:Depends}
Suggests: wxwin=V-doc Suggests: wxwin=V-doc
Conflicts: libwxgtk=V-python-contrib, python-wxwin
Replaces: libwxgtk=V-python-contrib, python-wxwin
Description: wxWindows Cross-platform C++ GUI toolkit (Python binding) Description: wxWindows Cross-platform C++ GUI toolkit (Python binding)
wxWindows is a class library for C++ providing GUI (Graphical User wxWindows is a class library for C++ providing GUI (Graphical User
Interface) and other facilities on more than one platform. Version 2.1 Interface) and other facilities on more than one platform. Version =V
currently supports subsets of GTK+, Motif, and MS Windows. currently supports subsets of GTK+, Motif, and MS Windows.
. .
This package provides a Python binding to the wxGTK library. This package provides a Python binding to the wxGTK library and it's
contrib libs.
Package: libwxgtk=V-contrib
Architecture: any
Section: libs
Depends: libwxgtk=V (= ${Source-Version}), ${shlibs:Depends}
Description: wxWindows Cross-platform C++ GUI toolkit (runtime contrib libs)
wxWindows is a class library for C++ providing GUI (Graphical User
Interface) and other facilities on more than one platform. Version =V
currently supports subsets of GTK+, Motif, and MS Windows.
.
This package provides the contrib libs of the wxWindows source tree
(mmedia, ogl, stc)
Package: libwxgtk=V-contrib-dev
Architecture: any
Section: devel
Depends: wxwin=V-headers (= ${Source-Version}), libwxgtk=V-dev (= ${Source-Version}), libwxgtk=V-contrib (= ${Source-Version}), libc6-dev
Conflicts: libwxgtk-contrib-dev
Replaces: libwxgtk-contrib-dev
Provides: libwxgtk-contrib-dev
Description: wxWindows Cross-platform C++ GUI toolkit (development contrib libs)
wxWindows is a class library for C++ providing GUI (Graphical User
Interface) and other facilities on more than one platform. Version =V
currently supports subsets of GTK+, Motif, and MS Windows.
.
Install this package if you wish to compile applications that use the
contrib libs from the wxWindows source tree (mmedia, ogl, stc)
Package: wxwin=V-headers
Architecture: any
Section: devel
Conflicts: wxwin-headers
Replaces: wxwin-headers, wxgtk2.1-dev
Provides: wxwin-headers
Description: wxWindows Cross-platform C++ GUI toolkit (header files)
wxWindows is a class library for C++ providing GUI (Graphical User
Interface) and other facilities on more than one platform. Version =V
currently supports subsets of GTK+, Motif, and MS Windows.
.
This package provides the common header files required to build applications
using the wxWindows toolkit.
Package: wxwin=V-i18n
Architecture: all
Section: libs
Conflicts: wxwin-i18n
Replaces: wxwin-i18n
Provides: wxwin-i18n
Description: wxWindows Cross-platform C++ GUI toolkit (i18n support)
wxWindows is a class library for C++ providing GUI (Graphical User
Interface) and other facilities on more than one platform. Version =V
currently supports subsets of GTK+, Motif, and MS Windows.
.
This package provides the i18n message catalogs for wxWindows.
Package: wxwin=V-doc Package: wxwin=V-doc
Architecture: all Architecture: all
@@ -89,7 +186,7 @@ Section: doc
Suggests: doc-base, www-browser Suggests: doc-base, www-browser
Description: wxWindows Cross-platform C++ GUI toolkit (documentation) Description: wxWindows Cross-platform C++ GUI toolkit (documentation)
wxWindows is a class library for C++ providing GUI (Graphical User wxWindows is a class library for C++ providing GUI (Graphical User
Interface) and other facilities on more than one platform. Version 2.1 Interface) and other facilities on more than one platform. Version =V
currently supports subsets of GTK+, Motif, and MS Windows. currently supports subsets of GTK+, Motif, and MS Windows.
. .
This package provides a HTML version of the wxWindows reference manual. This package provides a HTML version of the wxWindows reference manual.
@@ -100,7 +197,7 @@ Section: devel
Suggests: libwxgtk=V-dev (= ${Source-Version}), wxwin=V-doc Suggests: libwxgtk=V-dev (= ${Source-Version}), wxwin=V-doc
Description: wxWindows Cross-platform C++ GUI toolkit (examples) Description: wxWindows Cross-platform C++ GUI toolkit (examples)
wxWindows is a class library for C++ providing GUI (Graphical User wxWindows is a class library for C++ providing GUI (Graphical User
Interface) and other facilities on more than one platform. Version 2.1 Interface) and other facilities on more than one platform. Version =V
currently supports subsets of GTK+, Motif, and MS Windows. currently supports subsets of GTK+, Motif, and MS Windows.
. .
This package contains examples of using the wxWindows toolkit. This package contains examples of using the wxWindows toolkit.

197
debian/copyright vendored
View File

@@ -1,18 +1,193 @@
This package was debianized by Ron Lee <ron@debian.org> on This package was debianized by Ron Lee <ron@debian.org> on
Sun, 13 Feb 2000 18:40:00 +1030. Sun, 13 Feb 2000 18:40:00 +1030.
wxWindows main upstream site is www.wxwindows.org more information about wxWindows, as well as the source these debs
are produced from can be found at www.wxwindows.org
wxWindows is licenced under the LGPL with a special exception for Note for Debian users:
binary only apps produced with it. Some parts of the library (as ======================
compiled for Debian) might *not* include this extra exception in
their licence. If you wish to distribute binary object code under Most of the core wxWindows library is licenced under the wxWindows Library
terms other than those allowed by the (L)GPL (but allowed by the Licence (included below), however some additional features of the library
wxWindows Licence), you must first ensure all linked in code is may include source licenced under terms which do not include the exception
subject to this exception. This package is almost certainly built permitting you to licence binary object code versions of works based on the
with code licenced under terms which do not include that exception. Library under terms of your own choice. At any time and without warning,
newer versions of the Debian binary packages may include such code.
In short, if you plan to licence apps built against these debs under terms
compatible with the GPL or LGPL, then you have nothing to worry about. If
you wish to release your code under a licence which does not grant all of
the same rights as the LGPL would assert but would be permitted under the
terms of the exception, then you are strongly advised to either check the
licencing terms of all components that these debs (and all future versions
that you use) are built with, or build your own binaries of wxWindows which
include only such code as is definitely covered by the exception.
You should presume that these debs will fall under the provisions of the
unmodified LGPL unless you can prove otherwise, however this note in no way
alters the actual terms of the authorative licence detailed below, it is
intended to be purely informative of the fact that the Debian binary packages
will be built primarily with features useful to Free Software developers and
may not be suitable "as is" for compiling software for distribution that is
licenced incompatibly with the LGPL.
Modifications and additions to the Library itself are encouraged to be
placed under the wxWindows Library Licence. We hope you find it useful.
-- Ron
-----------------------------------------------------------------------------
Preamble
========
The licensing of the wxWindows library is intended to protect the wxWindows
library, its developers, and its users, so that the considerable investment
it represents is not abused.
Under the terms of the wxWindows Licence, you as a user are not
obliged to distribute wxWindows source code with your products, if you
distribute these products in binary form. However, you are prevented from
restricting use of the library in source code form, or denying others the
rights to use or distribute wxWindows library source code in the way
intended.
The wxWindows Licence establishes the copyright for the code and related
material, and it gives you legal permission to copy, distribute and/or
modify the library. It also asserts that no warranty is given by the authors
for this or derived code.
The core distribution of the wxWindows library contains files
under two different licences:
- Most files are distributed under the GNU Library General Public
Licence, version 2, with the special exception that you may create and
distribute object code versions built from the source code or modified
versions of it (even if these modified versions include code under a
different licence), and distribute such binaries under your own
terms.
- Most core wxWindows manuals are made available under the "wxWindows
Free Documentation Licence", which allows you to distribute modified
versions of the manuals, such as versions documenting any modifications
made by you in your version of the library. However, you may not restrict
any third party from reincorporating your changes into the original
manuals.
See the file licence.txt for authorative details of
the wxWindows licence. wxWindows Library Licence, Version 3
====================================
Copyright (c) 1998 Julian Smart, Robert Roebling et al
Everyone is permitted to copy and distribute verbatim copies
of this licence document, but changing it is not allowed.
WXWINDOWS LIBRARY LICENCE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
This library is free software; you can redistribute it and/or modify it
under the terms of the GNU Library General Public Licence as published by
the Free Software Foundation; either version 2 of the Licence, or (at
your option) any later version.
This library is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library
General Public Licence for more details.
You should have received a copy of the GNU Library General Public Licence
along with this software, usually in a file named COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
Boston, MA 02111-1307 USA.
EXCEPTION NOTICE
1. As a special exception, the copyright holders of this library give
permission for additional uses of the text contained in this release of
the library as licenced under the wxWindows Library Licence, applying
either version 3 of the Licence, or (at your option) any later version of
the Licence as published by the copyright holders of version 3 of the
Licence document.
2. The exception is that you may use, copy, link, modify and distribute
under the user's own terms, binary object code versions of works based
on the Library.
3. If you copy code from files distributed under the terms of the GNU
General Public Licence or the GNU Library General Public Licence into a
copy of this library, as this licence permits, the exception does not
apply to the code that you add in this way. To avoid misleading anyone as
to the status of such modified files, you must delete this exception
notice from such code and/or adjust the licensing conditions notice
accordingly.
4. If you write modifications of your own for this library, it is your
choice whether to permit this exception to apply to your modifications.
If you do not wish that, you must delete the exception notice from such
code and/or adjust the licensing conditions notice accordingly.
wxWindows Free Documentation Licence, Version 3
===============================================
Copyright (c) 1998 Julian Smart, Robert Roebling et al
Everyone is permitted to copy and distribute verbatim copies
of this licence document, but changing it is not allowed.
WXWINDOWS FREE DOCUMENTATION LICENCE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
1. Permission is granted to make and distribute verbatim copies of this
manual or piece of documentation provided any copyright notice and this
permission notice are preserved on all copies.
2. Permission is granted to process this file or document through a
document processing system and, at your option and the option of any third
party, print the results, provided a printed document carries a copying
permission notice identical to this one.
3. Permission is granted to copy and distribute modified versions of this
manual or piece of documentation under the conditions for verbatim
copying, provided also that any sections describing licensing conditions
for this manual, such as, in particular, the GNU General Public Licence,
the GNU Library General Public Licence, and any wxWindows Licence are
included exactly as in the original, and provided that the entire
resulting derived work is distributed under the terms of a permission
notice identical to this one.
4. Permission is granted to copy and distribute translations of this
manual or piece of documentation into another language, under the above
conditions for modified versions, except that sections related to
licensing, including this paragraph, may also be included in translations
approved by the copyright holders of the respective licence documents in
addition to the original English.
WARRANTY DISCLAIMER
5. BECAUSE THIS MANUAL OR PIECE OF DOCUMENTATION IS LICENSED FREE OF CHARGE,
THERE IS NO WARRANTY FOR IT, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER
PARTIES PROVIDE THIS MANUAL OR PIECE OF DOCUMENTATION "AS IS" WITHOUT
WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF
THE MANUAL OR PIECE OF DOCUMENTATION IS WITH YOU. SHOULD THE MANUAL OR
PIECE OF DOCUMENTATION PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
NECESSARY SERVICING, REPAIR OR CORRECTION.
6. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL
ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE MANUAL OR PIECE OF DOCUMENTATION AS PERMITTED ABOVE, BE
LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
MANUAL OR PIECE OF DOCUMENTATION (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF A PROGRAM BASED ON THE MANUAL OR PIECE OF
DOCUMENTATION TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR
OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

5
debian/libwxbase-dbg.dirs vendored Normal file
View File

@@ -0,0 +1,5 @@
usr/bin
usr/lib/wx/include/wx
usr/share/man/man1
usr/share/lintian/overrides

2
debian/libwxbase-dbg.links vendored Normal file
View File

@@ -0,0 +1,2 @@
usr/share/man/man1/wx-config.1.gz usr/share/man/man1/wxbased-config.1.gz

Some files were not shown because too many files have changed in this diff Show More