Added wxEditor from Dirc Holtwic

Some tweaks and fixes
Some distrib updates


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5161 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn 1999-12-31 08:29:02 +00:00
parent a5e3f3e9fa
commit 1b55cabf50
18 changed files with 1304 additions and 26 deletions

View File

@ -37,7 +37,7 @@ below.)
You can use whatever flags you want, but these work for me.
For Win32 systems I use Visual C++ 6.0, but 5.0 should work. The
build utility currently does not support any other win32
wxPython build utility currently does not support any other win32
compilers. Be sure to copy include/wx/msw/setup0.h to
include/wx/msw/setup.h and edit it for the options you want.
@ -46,13 +46,14 @@ below.)
variable named WXWIN to be the path to the top of the wxWindows
tree.
3. If you are working from a copy of the code retrieved from CVS, then
you will find wxPython in $WXWIN/utils/wxPython. If you are
working from the tar.gz or .zip files then you will probably want
to unpack wxPython in the $WXWIN/utils directory and rename the new
directory to wxPython (or use a symlink.) If you want to keep it
in a separate directory then you can change where the build.py tool
expects to find it by creating a file named build.local (see step 6
expects to find it by creating a file named build.local (see step 7
for more examples about build.local,) containing something like
this:
@ -60,7 +61,7 @@ below.)
4. At this point you may want to make an alias or symlink, script,
batch file, whatever on the PATH that invokes
batch file, or whatever on the PATH that invokes
$WXWIN/utils/wxPython/distrib/build.py to help simplify matters
somewhat. For example, on my win32 system I have a file named
build.bat in a directory on the PATH that contains:
@ -71,16 +72,25 @@ below.)
5. Change into the $(WXWIN)/utils/wxPython/src directory.
6. Type "build -b" to build wxPython and "build -i" to install it.
6. If you don't use SWIG, or have a new enough version installed, you
may have to update the timestamps of the files it generates so the
make utility won't think they are out of date and try to run SWIG
to update them. The standard touch utility can do this for you:
touch gtk/*.cpp gtk/*.py
7. Type "build -b" to build wxPython and "build -i" to install it.
The build.py script actually generates a Makefile based on what it
finds on your system and information found in the build.cfg file.
If you have troubles building or you want it built or installed in
a different way, take a look at the docstring in build.py. You may
be able to override configuration options in a file named
build.local. For example, you can set a new TARGETDIR just by
creating a file named build.local in your wxPython source directory
and assign a value to it, like this:
build.local. For example, you can set a new TARGETDIR (the
installation directory) just by creating a file named build.local
in your wxPython source directory and assign a value to it, like
this:
TARGETDIR = "/usr/local/lib/python1.5/site-packages/wxPython"
@ -88,20 +98,23 @@ below.)
creative things there if you need to.
7. To build and install the add-on modules, change to the appropriate
8. To build and install the add-on modules, change to the appropriate
directory under $WXWIN/utils/wxPython/modules and run the build
utility again.
8. Change to the $WXWIN/utils/wxPython/demo directory.
9. Change to the $WXWIN/utils/wxPython/demo directory.
9. Try executing the demo program. For example:
10. Try executing the demo program. For example:
python demo.py
To run it without requiring a console on win32, you can use the
pythonw.exe version of Python either from the command line or from a
shortcut.
To run it without requiring a console on win32, you can use the
pythonw.exe version of Python either from the command line or from
a shortcut.

View File

@ -72,6 +72,9 @@ http://starship.python.net:9673/crew/da/Code/PyOpenGL.
Added some missing EVT_ functions.
Added Dirk Holtwic's editor classes to the wxPython.lib.editor
package.

View File

@ -23,7 +23,7 @@ _useNestedSplitter = true
_treeList = [
('New since last release', ['wxMVCTree', 'wxVTKRenderWindow',
'FileBrowseButton', 'GenericButtons',
'wxMask']),
'wxMask', 'wxEditor']),
('Managed Windows', ['wxFrame', 'wxDialog', 'wxMiniFrame']),
@ -53,7 +53,7 @@ _treeList = [
('wxPython Library', ['Layoutf', 'wxScrolledMessageDialog',
'wxMultipleChoiceDialog', 'wxPlotCanvas', 'wxFloatBar',
'PyShell', 'wxCalendar', 'wxMVCTree', 'wxVTKRenderWindow',
'FileBrowseButton', 'GenericButtons']),
'FileBrowseButton', 'GenericButtons', 'wxEditor']),
('Cool Contribs', ['pyTree', 'hangman', 'SlashDot', 'XMLtreeview']),

View File

@ -0,0 +1,42 @@
from wxPython.wx import *
from wxPython.lib.editor import wxEditor, wxPyEditor
#----------------------------------------------------------------------
def runTest(frame, nb, log):
win = wxPanel(nb, -1)
ed = wxEditor(win)
pyed = wxPyEditor(win)
box = wxBoxSizer(wxVERTICAL)
box.Add(ed, 1, wxALL|wxGROW, 5)
box.Add(pyed, 1, wxALL|wxGROW, 5)
win.SetSizer(box)
win.SetAutoLayout(true)
ed.SetText(["",
"This is a simple text editor, the class name is",
"wxEditor. Type a few lines and try it out."])
pyed.SetText(["# This one is a derived class named wxPyEditor.",
"# It adds syntax highlighting, folding (press",
"# F12 on the \"def\" line below) and other stuff.",
"import sys",
"def hello():",
" print 'hello'",
" for x in sys.path:",
" print x",
""])
return win
#----------------------------------------------------------------------
overview = """\
"""

View File

@ -17,24 +17,24 @@ class TestFloatBar(wxFrame):
tb.SetFloatable(1)
tb.SetTitle("Floating!")
self.CreateStatusBar()
tb.AddTool(10, wxBitmap('bitmaps/new.bmp', wxBITMAP_TYPE_BMP),
wxNullBitmap, false, -1, -1, "New", "Long help for 'New'")
tb.AddSimpleTool(10, wxBitmap('bitmaps/new.bmp', wxBITMAP_TYPE_BMP),
"New", "Long help for 'New'")
EVT_TOOL(self, 10, self.OnToolClick)
EVT_TOOL_RCLICKED(self, 10, self.OnToolRClick)
tb.AddTool(20, wxBitmap('bitmaps/open.bmp', wxBITMAP_TYPE_BMP),
wxNullBitmap, false, -1, -1, "Open")
tb.AddSimpleTool(20, wxBitmap('bitmaps/open.bmp', wxBITMAP_TYPE_BMP),
"Open")
EVT_TOOL(self, 20, self.OnToolClick)
EVT_TOOL_RCLICKED(self, 20, self.OnToolRClick)
tb.AddSeparator()
tb.AddTool(30, wxBitmap('bitmaps/copy.bmp', wxBITMAP_TYPE_BMP),
wxNullBitmap, false, -1, -1, "Copy")
tb.AddSimpleTool(30, wxBitmap('bitmaps/copy.bmp', wxBITMAP_TYPE_BMP),
"Copy")
EVT_TOOL(self, 30, self.OnToolClick)
EVT_TOOL_RCLICKED(self, 30, self.OnToolRClick)
tb.AddTool(40, wxBitmap('bitmaps/paste.bmp', wxBITMAP_TYPE_BMP),
wxNullBitmap, false, -1, -1, "Paste")
tb.AddSimpleTool(40, wxBitmap('bitmaps/paste.bmp', wxBITMAP_TYPE_BMP),
"Paste")
EVT_TOOL(self, 40, self.OnToolClick)
EVT_TOOL_RCLICKED(self, 40, self.OnToolRClick)
@ -42,8 +42,8 @@ class TestFloatBar(wxFrame):
tb.AddTool(60, wxBitmap('bitmaps/tog1.bmp', wxBITMAP_TYPE_BMP),
wxBitmap('bitmaps/tog2.bmp', wxBITMAP_TYPE_BMP),
true, -1, -1, "Toggle with 2 bitmaps")
wxBitmap('bitmaps/tog2.bmp', wxBITMAP_TYPE_BMP),
shortHelpString="Toggle with 2 bitmaps", toggle=true)
EVT_TOOL(self, 60, self.OnToolClick)
EVT_TOOL_RCLICKED(self, 60, self.OnToolRClick)
tb.Realize()

View File

@ -0,0 +1,164 @@
import sys, os, string, time
from ftplib import FTP
logfile = 'e:\\temp\\autobuild.log'
WXDIR = os.environ['WXWIN']
dllVer = '21_11'
wxpVer = '2.1.11'
dateSt = time.strftime("%Y%m%d", time.localtime(time.time()))
#----------------------------------------------------------------------
def do(cmd):
st = " " + cmd + " >> " + logfile
print st
f = open(logfile, "at")
f.write(st + '\n')
f.close()
os.system(cmd + " >>& " + logfile)
#----------------------------------------------------------------------
def logTruncate():
f = open(logfile, "wt")
f.close()
def logSeparator(msg=None, f=None, recurse=1):
if not f:
f = open(logfile, "at")
f.write('\n')
f.write('--' * 35)
f.write('\n')
if msg:
f.write(msg)
f.write('\n')
f.write('--' * 35)
f.write('\n')
if recurse:
logSeparator(msg, sys.stdout, 0)
#----------------------------------------------------------------------
def validateFile(file):
if not os.path.exists(file):
logSeparator("***** %s does not exist, exiting! *****" % file)
raise SystemExit
else:
logSeparator("%s found, continuing..." % file, recurse=0)
#----------------------------------------------------------------------
def main():
logTruncate()
try:
logSeparator("Cleanup")
os.chdir(WXDIR + '/src/msw')
do('make cleandll FINAL=1')
os.chdir(WXDIR + '/utils/ogl/src')
do('wxm clean FINAL=1')
os.chdir(WXDIR + '/utils/glcanvas/win')
do('wxm clean FINAL=1')
logSeparator("Building Documentation...")
os.chdir(WXDIR + '/src/msw')
do('make touchmanual htmlhelp')
validateFile(WXDIR + '/docs/html/wx/wx.chm')
logSeparator("Building wxWindows and libraries...")
os.chdir(WXDIR + '/src/msw')
do('make dll pch FINAL=1')
validateFile(WXDIR + '/lib/wx'+dllVer+'.dll')
os.chdir(WXDIR + '/utils/ogl/src')
do('wxm FINAL=1')
os.chdir(WXDIR + '/utils/glcanvas/win')
do('wxm FINAL=1')
validateFile(WXDIR + '/lib/ogl.lib')
validateFile(WXDIR + '/lib/glcanvas.lib')
logSeparator("Copying wxPython workspace to build directory...")
do("copy /s %s %s" % ('e:\\projects\\wxPython\*.*', WXDIR+'\\utils\\wxPython'))
os.chdir(WXDIR + '/utils/wxPython')
f = open("build.local", "w")
f.write("""
TARGETDIR = 'e:\\projects\\wx\\utils\\wxPython'
WXPSRCDIR = 'e:\\projects\\wx\\utils\\wxPython\\src'
CRTFLAG='/MD'
FINAL=1
""")
f.close()
logSeparator("Cleaning wxPython...")
os.chdir(WXDIR+'\\utils\\wxPython')
do("buildall -cu")
do("ll")
logSeparator("Building core wxPython...")
os.chdir(WXDIR+'\\utils\\wxPython\\src')
do("build -bi")
validateFile(WXDIR+'\\utils\\wxPython\\wxc.pyd')
logSeparator("Building wxPython addon modules...")
os.chdir(WXDIR+'\\utils\\wxPython\\modules')
do("buildall -bi")
validateFile(WXDIR+'\\utils\\wxPython\\utilsc.pyd')
validateFile(WXDIR+'\\utils\\wxPython\\htmlc.pyd')
validateFile(WXDIR+'\\utils\\wxPython\\glcanvasc.pyd')
validateFile(WXDIR+'\\utils\\wxPython\\oglc.pyd')
logSeparator("Building installer executable...")
os.chdir(WXDIR+'\\utils\\wxPython\\distrib')
do("autoit2 wise.aut")
srcName = WXDIR+'\\utils\\wxPython\\distrib\\wxPython-'+wxpVer+'.EXE'
destName = WXDIR+'\\utils\\wxPython\\distrib\\wxPython-'+wxpVer+'-'+dateSt+'.EXE'
validateFile(srcName)
try:
os.rename(srcName, destName)
except:
pass
logSeparator("Building source zip file...")
os.chdir(WXDIR+'\\utils')
do("wxPython\\distrib\\zipit.bat %s" % wxpVer)
srcZName = WXDIR+'\\utils\\wxPython\\distrib\\wxPython-src-'+wxpVer+'.zip'
destZName = WXDIR+'\\utils\\wxPython\\distrib\\wxPython-src-'+wxpVer+'-'+dateSt+'.zip'
validateFile(srcZName)
try:
os.rename(srcZName, destZName)
except:
pass
logSeparator("Uploading to website...")
do('python d:\util32\sendwxp.py %s' % destName)
do('python d:\util32\sendwxp.py %s' % destZName)
os.unlink(destName)
os.unlink(destZName)
logSeparator("Finished!!!")
finally:
os.system("list " + logfile)
pass
if __name__ == '__main__':
main()

View File

@ -0,0 +1,7 @@
run, e:\\Tools\\Wise\\WISE32.EXE wxPython.wse
winwaitactive, wxPython.wse - Wise Installation System
send, !ic
sleep, 1000
winwaitactive, wxPython.wse - Wise Installation System
send, !fx

View File

@ -18,6 +18,8 @@ wxPython/lib/*.py
wxPython/lib/*.txt
wxPython/lib/sizers/*.py
wxPython/lib/sizers/*.txt
wxPython/lib/editor/*.py
wxPython/lib/editor/*.txt
wxPython/src/build.cfg

View File

@ -849,6 +849,12 @@ item: Install File
Description=wxPython Standard Library
Flags=0000000010000010
end
item: Install File
Source=e:\Projects\wx\utils\wxPython\lib\editor\*.py
Destination=%MAINDIR%\wxPython\lib\editor
Description=wxPython Standard Library
Flags=0000000010000010
end
item: Install File
Source=e:\Projects\wx\utils\wxPython\demo\*.py
Destination=%MAINDIR%\wxPython\demo
@ -1133,6 +1139,20 @@ item: Create Shortcut
Key Type=1536
Flags=00000001
end
item: Create Shortcut
Source=%MAINDIR%\wxPython\README.txt
Destination=%CGROUPDIR%\%CGROUP_SAVE%\ReadMe.lnk
Icon Number=0
Key Type=1536
Flags=00000001
end
item: Create Shortcut
Source=%MAINDIR%\wxPython\CHANGES.txt
Destination=%CGROUPDIR%\%CGROUP_SAVE%\Changes.lnk
Icon Number=0
Key Type=1536
Flags=00000001
end
item: Create Shortcut
Source=%UNINSTALL_PATH%
Destination=%CGROUPDIR%\%CGROUP_SAVE%\Uninstall %APPTITLE%.lnk

Binary file not shown.

View File

@ -0,0 +1,4 @@
__init__.pyc
editor.pyc
py_editor.pyc
tokenizer.pyc

View File

@ -0,0 +1,18 @@
#----------------------------------------------------------------------
# Name: wxPython.lib.editor
# Purpose: A package containing a colourizable text editror
#
# Author: Robin Dunn
#
# Created: 30-Dec-1999
# RCS-ID: $Id$
# Copyright: (c) 1999 by Total Control Software
# Licence: wxWindows license
#----------------------------------------------------------------------
# This file makes this directory into a Python package
# import the main classes into the package namespace.
from editor import wxEditor
from py_editor import wxPyEditor

View File

@ -0,0 +1,619 @@
#----------------------------------------------------------------------
# Name: wxPython.lib.editor.wxEditor
# Purpose: An intelligent text editor with colorization capabilities.
#
# Author: Dirk Holtwic, Robin Dunn
#
# Created: 15-Dec-1999
# RCS-ID: $Id$
# Copyright: (c) 1999 by Dirk Holtwick, 1999
# Licence: wxWindows license
#----------------------------------------------------------------------
from wxPython.wx import *
from string import *
from keyword import *
from regsub import *
from tokenizer import *
#---------------------------------------------------------------------------
#EDITOR_STD_LINE = ("", [], (0,0,0))
#---------
class Line:
def __init__(self, text=""):
self.text = text # the string itself
self.syntax = [] # the colors of the line
self.editable = true # edit?
self.visible = 0 # will be incremented if not
self.indent = 0 # not used yet
#----------------------------------------------------------------------
class wxEditor(wxScrolledWindow):
def __init__(self, parent, id=-1):
###############################################################
"""
Alles hat einen Anfang
"""
wxScrolledWindow.__init__(self, parent, id,
wxDefaultPosition, wxSize(500,400),
wxSUNKEN_BORDER|wxWANTS_CHARS)
# the syntax informations, if they don't exist,
# all syntax stuff will be ignored
# cursor pos
self.cx = 0
self.cy = 0
# the lines that are visible
self.lines = []
self.line = 0
self.len = 0
self.ocy = 0
# border pos
#self.bx = 0
#self.by = 0
# screen
self.sx = 0
self.sy = 0
self.sw = 0
self.sh = 0
# font
dc = wxClientDC(self)
#if wxPlatform == "__WXMSW__":
self.font = wxFont(12, wxMODERN, wxNORMAL, wxNORMAL)
#else:
# self.font = wxFont(12, wxMODERN, wxNORMAL, wxNORMAL, false)
dc.SetFont(self.font)
# font weight, height
self.fw = dc.GetCharWidth()
self.fh = dc.GetCharHeight()
# back, for colour
self.bcol = wxNamedColour('white')
self.fcol = wxNamedColour('black')
self.cfcol = wxNamedColour('black')
self.cbcol = wxNamedColour('red')
# nicht edierbare zeile (hintergrund)
self.nedcol = wxNamedColour('grey')
self.SetBackgroundColour(self.bcol)
#dc.SetForegroundColour(self.fcol)
# events
EVT_LEFT_DOWN(self, self.OnMouseClick)
EVT_RIGHT_DOWN(self, self.OnMouseClick)
EVT_SCROLLWIN(self, self.OnScroll)
self.o_cx = self.cx
self.o_cy = self.cy
self.o_sx = self.sx
self.o_sy = self.sy
self.o_line = self.line
self.sco_x = 0
self.sco_y = 0
self.tabsize = 4
self.update = true
self.in_scroll =FALSE
bw,bh = self.GetSizeTuple()
# double buffering
self.mdc = wxMemoryDC()
self.mdc.SelectObject(wxEmptyBitmap(bw,bh))
# disable physical scrolling because invisible parts are not drawn
self.EnableScrolling(FALSE, FALSE)
# the ordinary text as it is
self.SetText()
self.SetFocus()
#---------------------------------------------------------------------------
def CalcLines(self):
###############################################################
self.lines = []
x =maxlen =0
for line in self.text:
if line.visible==0:
self.lines.append(x)
else:
if len(line.text) >maxlen:
maxlen =len(line.text)
x = x + 1
self.len = len(self.lines)
self.max_linelength =maxlen
def SetFontTab(self, fonttab):
###############################################################
""" Fonttabelle zum schnellen Zugriff """
self.ftab = fonttab
def SetText(self, text = [""]):
###############################################################
""" Text mittels Liste setzen """
self.cx = 0
self.cy = 0
self.text = []
for t in text:
self.text.append(Line(t))
for l in range(0,len(text)-1):
#self.UpdateSyntax(l)
self.OnUpdateHighlight(l)
self.OnInit()
self.update = true
self.UpdateView(None, true)
# show new text
def GetText(self):
###############################################################
""" Der gesamte Text als Liste """
text = []
for line in self.text:
text.append(line.text)
return text
def IsEmpty(self):
###############################################################
"""see if at least one text line is not empty"""
for line in self.text:
if line.text: return 0
return 1
def IsLine(self, line):
###############################################################
""" Schauen, ob alles im grünen Bereich ist """
return (line>=0) and (line<self.len)
def IsEditable(self, line):
###############################################################
return self.text[self.GetLine(line)].editable
def GetLine(self, line):
###############################################################
return self.lines[line]
def GetTextLine(self, line):
###############################################################
""" Text holen """
if self.IsLine(line):
return self.text[self.GetLine(line)].text
return ""
def SetTextLine(self, line, text):
###############################################################
""" Nur den Text ändern """
if self.IsLine(line):
l = self.GetLine(line)
self.text[l].text = text
#self.UpdateSyntax(l)
self.OnUpdateHighlight(l)
self.update = true
#---------------------------------------------------------------------------
def OnMouseClick(self, event):
###############################################################
"""
Wenn es Click gemacht hat => Cursor setzen
"""
self.SetFocus()
self.cy = self.sy + (event.GetY() / self.fh)
if self.cy >= self.len: self.cy =max(self.len -1, 0)
linelen =len(self.text[self.GetLine(self.cy)].text)
self.cx = self.sx + (event.GetX() / self.fw)
# allow positioning right behind the last character
if self.cx > linelen: self.cx =linelen
if event.GetEventType() ==wxEVT_RIGHT_DOWN:
self.update = true
self.OnFold()
self.UpdateView()
def DrawCursor(self, dc = None):
###############################################################
"""
Auch der Cursor muß ja irgendwie gezeichnet werden
"""
if not dc:
dc = wxClientDC(self)
if (self.len)<self.cy: #-1 ?
self.cy = self.len-1
s = self.text[self.GetLine(self.cy)].text
x = self.cx - self.sx
y = self.cy - self.sy
self.DrawSimpleCursor(x, y, dc)
def DrawSimpleCursor(self, xp, yp, dc = None, old=false):
###############################################################
"""
Auch der Cursor muß ja irgendwie gezeichnet werden
"""
if not dc:
dc = wxClientDC(self)
if old:
xp = self.sco_x
yp = self.sco_y
szx = self.fw
szy = self.fh
x = xp * szx
y = yp * szy
dc.Blit(x,y,szx,szy,dc,x,y,wxSRC_INVERT)
self.sco_x = xp
self.sco_y = yp
def OnScroll(self, event):
dir =event.GetOrientation()
evt =event.GetEventType()
if dir ==wxHORIZONTAL:
if evt ==wxEVT_SCROLLWIN_LINEUP: self.sx =self.sx -1
elif evt ==wxEVT_SCROLLWIN_LINEDOWN: self.sx =self.sx +1
elif evt ==wxEVT_SCROLLWIN_PAGEUP: self.sx =self.sx -self.sw
elif evt ==wxEVT_SCROLLWIN_PAGEDOWN: self.sx =self.sx +self.sw
elif evt ==wxEVT_SCROLLWIN_TOP: self.sx =self.cx =0
elif evt ==wxEVT_SCROLLWIN_BOTTOM:
self.sx =self.max_linelength -self.sw
self.cx =self.max_linelength
else: self.sx =event.GetPosition()
if self.sx >(self.max_linelength -self.sw +1):
self.sx =self.max_linelength -self.sw +1
if self.sx <0: self.sx =0
if self.cx >(self.sx +self.sw -1): self.cx =self.sx +self.sw -1
if self.cx <self.sx: self.cx =self.sx
else:
if evt ==wxEVT_SCROLLWIN_LINEUP: self.sy =self.sy -1
elif evt ==wxEVT_SCROLLWIN_LINEDOWN: self.sy =self.sy +1
elif evt ==wxEVT_SCROLLWIN_PAGEUP: self.sy =self.sy -self.sh
elif evt ==wxEVT_SCROLLWIN_PAGEDOWN: self.sy =self.sy +self.sh
elif evt ==wxEVT_SCROLLWIN_TOP: self.sy =self.cy =0
elif evt ==wxEVT_SCROLLWIN_BOTTOM:
self.sy =self.len -self.sh
self.cy =self.len
else: self.sy =event.GetPosition()
if self.sy >(self.len -self.sh +1):
self.sy =self.len -self.sh +1
if self.sy <0: self.sy =0
if self.cy >(self.sy +self.sh -1): self.cy =self.sy +self.sh -1
if self.cy <self.sy: self.cy =self.sy
self.UpdateView()
def AdjustScrollbars(self):
# there appears to be endless recursion:
# SetScrollbars issue EvtPaint which calls UpdateView
# which calls AdjustScrollbars
if not self.in_scroll:
self.in_scroll =TRUE
self.SetScrollbars(self.fw, self.fh, self.max_linelength +1,
# it seem to be a bug in scrollbars:
# the scrollbar is hidden
# even if current position >0
max(self.len +1, self.sy +self.sh),
self.sx, self.sy)
self.in_scroll =FALSE
# adapts the output to what it should be
def UpdateView(self, dc = None, doup=false):
###############################################################
"""
Diese Routine wird immer dann aufgerufen, wenn
sich etwas verändert hat
"""
self.CalcLines()
if not dc:
dc = wxClientDC(self)
self.bw,self.bh = self.GetSizeTuple()
self.sw = self.bw / self.fw
self.sh = self.bh / self.fh
if self.cy<self.sy:
self.sy = self.cy
elif self.cy>(self.sy+self.sh-1):
self.sy = self.cy-self.sh+1
if self.cx<self.sx:
self.sx = self.cx
elif self.cx>(self.sx+self.sw-1):
self.sx = self.cx-self.sw+1
# left line? change syntax!
if self.ocy!=self.cy:
self.OnUpdateSyntax(self.ocy)
self.ocy = self.cy
# alles beim alten
self.AdjustScrollbars()
self.DrawSimpleCursor(0,0,dc, true)
# [als] i don't really understand how the following condition works
if self.update or doup:
self.Draw(dc)
self.update = false
else:
self.DrawCursor(dc)
self.o_cx = self.cx
self.o_cy = self.cy
self.o_sx = self.sx
self.o_sy = self.sy
self.o_line = self.line
def DrawEditText(self, t, x, y, dc = None):
###############################################################
""" Einfache Hilfsroutine um Text zu schreiben
"""
if not dc:
dc = wxClientDC(self)
dc.SetFont(self.font)
dc.DrawText(t, x * self.fw, y * self.fh)
def DrawLine(self, line, dc=None):
###############################################################
"""
Hier wird einfach die Ansicht der ganzen Seite
wiederhergestellt.
!!! Kann modifiziert werden !!!
"""
if not dc:
dc = wxClientDC(self)
dc.SetBackgroundMode(wxSOLID)
dc.SetTextBackground(self.bcol)
dc.SetTextForeground(self.fcol)
#dc.Clear()
# delimiter
ll = self.sx
lr = self.sx + self.sw
y = line - self.sy
# text + syntax
if self.IsLine(line):
l = self.GetLine(line)
t = self.text[l].text
syn = self.text[l].syntax
if not self.text[l].editable:
dc.SetTextBackground(self.nedcol)
else:
dc.SetTextBackground(self.bcol)
dc.SetTextForeground(self.fcol)
pos = ll
for h in syn:
xp, col = h
if xp>=ll:
self.DrawEditText(t[pos:xp], (pos-ll), y, dc)
pos = xp
dc.SetTextForeground(self.ftab[col])
self.DrawEditText(t[pos:], (pos-ll), y, dc)
def Draw(self, odc=None):
###############################################################
"""
Hier wird einfach die Ansicht der ganzen Seite
wiederhergestellt.
!!! Kann modifiziert werden !!!
"""
if not odc:
odc = wxClientDC(self)
dc = self.mdc
dc.SelectObject(wxEmptyBitmap(self.bw,self.bh))
dc.SetBackgroundMode(wxSOLID)
dc.SetTextBackground(self.bcol)
dc.SetTextForeground(self.fcol)
dc.Clear()
for line in range(self.sy, self.sy + self.sh): self.DrawLine(line, dc)
odc.Blit(0,0,self.bw,self.bh,dc,0,0,wxCOPY)
self.DrawCursor(odc)
def cVert(self, num):
###############################################################
""" Vertikale Cursorverschiebung
"""
cy = self.cy + num
if cy <0: cy =0
elif cy >(self.len -1): cy =self.len -1
# scroll when edge hit
if cy >(self.sy +self.sh -1): self.sy =cy -self.sh +1
elif cy <self.sy: self.sy =cy
self.cy =cy
# disallow positioning behind the end of the line
linelen =len(self.text[self.GetLine(cy)].text)
if self.cx >linelen: self.cx =linelen
def cHoriz(self, num):
###############################################################
""" Horizontale Cursorverschiebung
"""
cx = self.cx + num
linelen =len(self.text[self.GetLine(self.cy)].text)
if cx <0: cx =0
elif cx >linelen: cx =linelen
# scroll when edge hit
if cx >(self.sx +self.sw -2): self.sx =cx -self.sw +2
elif cx <self.sx: self.sx =cx
self.cx =cx
def InsertText(self, text):
###############################################################
"""
Simple Routine um Text - auch über mehrere
Zeilen - einzufügen
"""
if self.IsEditable(self.cy):
tis = split(text, "\n")
t = self.GetTextLine(self.cy)
if len(tis)==1:
t = t[:self.cx] + text + t[self.cx:]
self.SetTextLine(self.cy, t)
self.cHoriz(len(text))
else:
rest = t[self.cx:]
t = t[:self.cx] + tis[0]
self.SetTextLine(self.cy, t)
for i in range(1,len(tis)):
self.text.insert(self.GetLine(self.cy)+1, Line())
self.lines.insert(self.cy+1,self.GetLine(self.cy)+1)
self.cVert(+1)
self.SetTextLine(self.cy, tis[i])
t = self.GetTextLine(self.cy)
self.cx = len(t)
t = t + rest
self.SetTextLine(self.cy, t)
self.update = true
#self.UpdateView()
#-----------------------------------------------------------------------------------------
def RemoveLine(self, line):
pass
def OnChar(self, event):
###############################################################
"""
Wenn eine Taste gedrückt wird,
kann an dieser Stelle die Auswertung stattfinden
"""
# get code
key = event.KeyCode()
# if event.ControlDown:
# if chr(key)=="k":
# print "weg"
# movements
if key==WXK_DOWN:
self.cVert(+1)
elif key==WXK_UP:
self.cVert(-1)
elif key==WXK_LEFT:
self.cHoriz(-1)
elif key==WXK_RIGHT:
self.cHoriz(+1)
elif key==WXK_NEXT:
self.cVert(self.sh)
elif key==WXK_PRIOR:
self.cVert(-self.sh)
elif key==WXK_HOME:
self.cx = 0
elif key==WXK_END:
self.cx = len(self.GetTextLine(self.cy))
elif key==WXK_BACK:
t = self.GetTextLine(self.cy)
if self.cx>0:
t = t[:self.cx-1] + t[self.cx:]
self.SetTextLine(self.cy, t)
self.cHoriz(-1)
elif key==WXK_DELETE:
t = self.GetTextLine(self.cy)
if self.cx<len(t):
t = t[:self.cx] + t[self.cx+1:]
self.SetTextLine(self.cy, t)
elif key==WXK_RETURN:
self.InsertText("\n")
elif key==WXK_TAB:
self.OnTabulator(event)
# clipboard (buggy)
elif key==WXK_F10:
if wxTheClipboard.Open():
data = wxTheClipboard.GetData()
wxTheClipboard.Close()
print data
# folding (buggy)
elif key==WXK_F12:
self.update = true
self.OnFold()
# regular ascii
elif (key>31) and (key<256):
self.InsertText(chr(key))
self.UpdateView()
return 0
def OnPaint(self, event):
dc = wxPaintDC(self)
self.bw,self.bh = self.GetSizeTuple()
self.UpdateView(dc, true)
#-----------------------------------------------------------------------------------------
def GetIndent(self, line):
p = 0
for c in line:
if c==" ": p = p + 1
elif c=="\t": p =(p /self.tabsize +1) *self.tabsize
else: break
return p
def Goto(self, pos):
self.cVert(pos-self.cy-1)
self.UpdateView()
# --------------------------------------------------------
# to be overloaded
def OnUpdateHighlight(self, line = -1):
pass
def OnUpdateSyntax(self, line = -1):
pass
def OnTabulator(self, event):
pass
def OnInit(self):
pass
def OnFold(self):
pass

View File

@ -0,0 +1,210 @@
# (C)opyright by Dirk Holtwick, 1999
# ----------------------------------
# holtwick@spirito.de
# http://www.spirito.de/pyde
from editor import *
from string import *
from keyword import *
from tokenizer import *
"""
This module will be loaded by the main
window. It implements some methods that
are typical for Python sources.
"""
class wxPyEditor(wxEditor):
# ------------------------------------------------------------------
def __init__(self, parent, id=-1):
wxEditor.__init__(self, parent, id)
self.SetFontTab([
wxNamedColour('black'),
wxNamedColour('blue'),
wxNamedColour('red'),
wxNamedColour('darkgreen'),
wxNamedColour('brown')
])
# ------------------------------------------------------------------
def OnUpdateHighlight(self, line = -1):
if line>=0:
t = self.text[line].text
syn = []
toks = Tokenizer(t).tokens()
for type, string, begin, end in toks:
if type == "KEY":
syn.append((begin, 1))
syn.append((end, 0))
elif type == "COMMENT":
syn.append((begin, 2))
elif type == "STRING":
syn.append((begin, 3))
syn.append((end, 0))
elif type == "NUMBER":
syn.append((begin, 4))
syn.append((end, 0))
elif type == "NAME":
if string=="self":
syn.append((begin, 4))
syn.append((end, 0))
else:
pass
self.text[line].syntax = syn
# ------------------------------------------------------------------
def OnUpdateSyntax(self, line = -1):
if line>=0:
"""
tx, syn, m = self.text[line]
pre = 0
for i in range(0,len(tx)):
if tx[i] != " ":
pre = i
break
t = tx[pre:]
t = Tokenizer(t).line()
t = tx[:pre] + t
self.text[line] = t, syn, m
"""
self.OnUpdateHighlight(line)
# ------------------------------------------------------------------
def OnTabulator(self, event):
add = +1
if event.ShiftDown():
add = -1
t = self.GetTextLine(self.cy)
if strip(t):
indent = self.GetIndent(t)
# print indent
t = t[indent:]
tabs = indent / self.tabsize
# for i in range(0,tabs+add):
t = (" " * 4 * (tabs+add)) + t
self.SetTextLine(self.cy, t)
elif add>0:
self.InsertText(" ")
# ------------------------------------------------------------------
def FindQuote(self, lineno, quote_type='"""', direction=1):
"""find line containing the matching quote"""
l =lineno +direction
while (l < len(self.text)-1) and (l >= 0):
if find(self.text[l].text, quote_type) >=0: return l
l =l +direction
return None
def FindNextLine(self, lineno, direction=1):
"""get the next line of code (skipping comment lines and empty lines)"""
l =lineno +direction
while (l < len(self.text)-1) and (l >= 0):
str =lstrip(self.text[l].text)
if (len(str) >0) and (str[0] !="#"): return l
l =l +direction
return None
def Fold(self):
l = self.GetLine(self.cy)
line = self.text[l]
t = line.text
# fold ...
if line.editable:
# 3*quotes
qpos =find(t, '"""')
if qpos >=0: qtype ='"""'
else:
qpos =find(t, "'''")
if qpos >=0: qtype ="'''"
if (qpos >=0) and (find(t[qpos+3:], qtype) <0):
closing_quote =self.FindQuote(l, qtype)
if closing_quote !=None:
line.editable = not line.editable
l =l +1
while l <= closing_quote:
self.text[l].visible =self.text[l].visible +1
l =l +1
else: # try normal fold on leading whitespace
lim = self.GetIndent(t)
lnext =self.FindNextLine(l)
if (lnext !=None) \
and (self.GetIndent(self.text[lnext].text) >lim):
line.editable =FALSE
lstart =l +1
l =self.FindNextLine(l)
while (l !=None) \
and (self.GetIndent(self.text[l].text) >lim):
l =self.FindNextLine(l)
if l ==None:
# fold till the end
l =len(self.text)
for line in self.text[lstart:l]:
line.visible =line.visible +1
# ... or unfold
else:
lim = line.visible + 1
line.editable = not line.editable
l = l + 1
line = self.text[l]
while (l < (len(self.text) -1)) and (line.visible>=lim):
line.visible = line.visible - 1
l = l + 1
line = self.text[l]
def FoldAll(self):
self.CalcLines()
self.cx = 0
self.cy = len(self.lines) - 1
prev_indent =0
# following loop is exited in two cases:
# when self.cy becomes 0 (topmost level is not folded by FoldAll)
# or when FindNextLine() returns None (all remaining lines till
# the beginning of the text are empty or comments)
while self.cy:
t = self.GetTextLine(self.cy)
# indent-based folding
indent =self.GetIndent(t)
if indent <prev_indent:
self.Fold()
prev_indent =indent
# triple-quote folding
qpos =find(t, '"""')
if qpos >=0: qtype ='"""'
else:
qpos =find(t, "'''")
if qpos >=0: qtype ="'''"
if (qpos >=0) and (find(t[qpos+3:], qtype) <0):
closing_quote =self.FindQuote(self.cy, qtype, -1)
if closing_quote !=None:
# XXX potential bug: unmatched triple quotes
self.cy =closing_quote
self.Fold()
self.cy =self.FindNextLine(self.cy, -1)
if self.cy ==None: self.cy =0
# ------------------------------------------------------------------
def OnFold(self):
self.Fold()
# ------------------------------------------------------------------
def OnInit(self):
#self.FoldAll()
pass

View File

@ -0,0 +1,60 @@
from tokenize import *
from keyword import *
from string import *
class Tokenizer:
"""
Simple class to create a list of token-tuples like:
(type, string, first, last)
Example:
t = Tokenizer('def hallo(du): # juchee')
print t.tokens()
"""
def __init__(self, text):
self.text = text
self.toks = []
try:
tokenize(self.readline, self.get)
except TokenError:
pass
def tokens(self):
return self.toks
def get(self, type, string, begin, end, l):
#print begin,end
h1, b = begin
h2, e = end
tname = tok_name[type]
if iskeyword(string):
tname = "KEY"
self.toks.append(tname, string, b, e)
def readline(self):
t = self.text
self.text = ""
return t
def line(self):
pre = ""
out = ""
for type, string, begin, end in self.toks:
if (pre in ["NAME","KEY"]) and (not string in [".",",","("]):
out = out + " "
if type in ["NAME","KEY"]:
out = out + string
elif type=="OP":
if string in [",",":"]:
out = out + string + " "
else:
out = out + string
else:
out = out + string
pre = type
return out

View File

@ -1700,7 +1700,7 @@ static PyObject *_wrap_wxWindow_GetGrandParent(PyObject *self, PyObject *args, P
}
static long wxWindow_GetHandle(wxWindow *self) {
return (long)self->GetHandle();
return wxPyGetWinHandle(self); //(long)self->GetHandle();
}
static PyObject *_wrap_wxWindow_GetHandle(PyObject *self, PyObject *args, PyObject *kwargs) {
PyObject * _resultobj;
@ -2476,6 +2476,107 @@ static PyObject *_wrap_wxWindow_IsEnabled(PyObject *self, PyObject *args, PyObje
return _resultobj;
}
#define wxWindow_IsExposed(_swigobj,_swigarg0,_swigarg1,_swigarg2,_swigarg3) (_swigobj->IsExposed(_swigarg0,_swigarg1,_swigarg2,_swigarg3))
static PyObject *_wrap_wxWindow_IsExposed(PyObject *self, PyObject *args, PyObject *kwargs) {
PyObject * _resultobj;
bool _result;
wxWindow * _arg0;
int _arg1;
int _arg2;
int _arg3 = (int ) 0;
int _arg4 = (int ) 0;
PyObject * _argo0 = 0;
char *_kwnames[] = { "self","x","y","w","h", NULL };
self = self;
if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oii|ii:wxWindow_IsExposed",_kwnames,&_argo0,&_arg1,&_arg2,&_arg3,&_arg4))
return NULL;
if (_argo0) {
if (_argo0 == Py_None) { _arg0 = NULL; }
else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxWindow_p")) {
PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxWindow_IsExposed. Expected _wxWindow_p.");
return NULL;
}
}
{
wxPy_BEGIN_ALLOW_THREADS;
_result = (bool )wxWindow_IsExposed(_arg0,_arg1,_arg2,_arg3,_arg4);
wxPy_END_ALLOW_THREADS;
} _resultobj = Py_BuildValue("i",_result);
return _resultobj;
}
#define wxWindow_IsExposedPoint(_swigobj,_swigarg0) (_swigobj->IsExposed(_swigarg0))
static PyObject *_wrap_wxWindow_IsExposedPoint(PyObject *self, PyObject *args, PyObject *kwargs) {
PyObject * _resultobj;
bool _result;
wxWindow * _arg0;
wxPoint * _arg1;
PyObject * _argo0 = 0;
wxPoint temp;
PyObject * _obj1 = 0;
char *_kwnames[] = { "self","pt", NULL };
self = self;
if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxWindow_IsExposedPoint",_kwnames,&_argo0,&_obj1))
return NULL;
if (_argo0) {
if (_argo0 == Py_None) { _arg0 = NULL; }
else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxWindow_p")) {
PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxWindow_IsExposedPoint. Expected _wxWindow_p.");
return NULL;
}
}
{
_arg1 = &temp;
if (! wxPoint_helper(_obj1, &_arg1))
return NULL;
}
{
wxPy_BEGIN_ALLOW_THREADS;
_result = (bool )wxWindow_IsExposedPoint(_arg0,*_arg1);
wxPy_END_ALLOW_THREADS;
} _resultobj = Py_BuildValue("i",_result);
return _resultobj;
}
#define wxWindow_IsExposedRect(_swigobj,_swigarg0) (_swigobj->IsExposed(_swigarg0))
static PyObject *_wrap_wxWindow_IsExposedRect(PyObject *self, PyObject *args, PyObject *kwargs) {
PyObject * _resultobj;
bool _result;
wxWindow * _arg0;
wxRect * _arg1;
PyObject * _argo0 = 0;
wxRect temp;
PyObject * _obj1 = 0;
char *_kwnames[] = { "self","rect", NULL };
self = self;
if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxWindow_IsExposedRect",_kwnames,&_argo0,&_obj1))
return NULL;
if (_argo0) {
if (_argo0 == Py_None) { _arg0 = NULL; }
else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxWindow_p")) {
PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxWindow_IsExposedRect. Expected _wxWindow_p.");
return NULL;
}
}
{
_arg1 = &temp;
if (! wxRect_helper(_obj1, &_arg1))
return NULL;
}
{
wxPy_BEGIN_ALLOW_THREADS;
_result = (bool )wxWindow_IsExposedRect(_arg0,*_arg1);
wxPy_END_ALLOW_THREADS;
} _resultobj = Py_BuildValue("i",_result);
return _resultobj;
}
#define wxWindow_IsRetained(_swigobj) (_swigobj->IsRetained())
static PyObject *_wrap_wxWindow_IsRetained(PyObject *self, PyObject *args, PyObject *kwargs) {
PyObject * _resultobj;
@ -8629,6 +8730,9 @@ static PyMethodDef windowscMethods[] = {
{ "wxWindow_IsTopLevel", (PyCFunction) _wrap_wxWindow_IsTopLevel, METH_VARARGS | METH_KEYWORDS },
{ "wxWindow_IsShown", (PyCFunction) _wrap_wxWindow_IsShown, METH_VARARGS | METH_KEYWORDS },
{ "wxWindow_IsRetained", (PyCFunction) _wrap_wxWindow_IsRetained, METH_VARARGS | METH_KEYWORDS },
{ "wxWindow_IsExposedRect", (PyCFunction) _wrap_wxWindow_IsExposedRect, METH_VARARGS | METH_KEYWORDS },
{ "wxWindow_IsExposedPoint", (PyCFunction) _wrap_wxWindow_IsExposedPoint, METH_VARARGS | METH_KEYWORDS },
{ "wxWindow_IsExposed", (PyCFunction) _wrap_wxWindow_IsExposed, METH_VARARGS | METH_KEYWORDS },
{ "wxWindow_IsEnabled", (PyCFunction) _wrap_wxWindow_IsEnabled, METH_VARARGS | METH_KEYWORDS },
{ "wxWindow_InitDialog", (PyCFunction) _wrap_wxWindow_InitDialog, METH_VARARGS | METH_KEYWORDS },
{ "wxWindow_Hide", (PyCFunction) _wrap_wxWindow_Hide, METH_VARARGS | METH_KEYWORDS },

View File

@ -271,6 +271,15 @@ class wxWindowPtr(wxEvtHandlerPtr):
def IsEnabled(self, *_args, **_kwargs):
val = apply(windowsc.wxWindow_IsEnabled,(self,) + _args, _kwargs)
return val
def IsExposed(self, *_args, **_kwargs):
val = apply(windowsc.wxWindow_IsExposed,(self,) + _args, _kwargs)
return val
def IsExposedPoint(self, *_args, **_kwargs):
val = apply(windowsc.wxWindow_IsExposedPoint,(self,) + _args, _kwargs)
return val
def IsExposedRect(self, *_args, **_kwargs):
val = apply(windowsc.wxWindow_IsExposedRect,(self,) + _args, _kwargs)
return val
def IsRetained(self, *_args, **_kwargs):
val = apply(windowsc.wxWindow_IsRetained,(self,) + _args, _kwargs)
return val

View File

@ -233,6 +233,9 @@ public:
bool Hide();
void InitDialog();
bool IsEnabled();
bool IsExposed( int x, int y, int w=0, int h=0 );
%name(IsExposedPoint) bool IsExposed( const wxPoint& pt );
%name(IsExposedRect) bool IsExposed( const wxRect& rect );
bool IsRetained();
bool IsShown();
bool IsTopLevel();