scyther/gui/Gui/Editor.py

202 lines
5.5 KiB
Python
Raw Normal View History

2007-01-30 11:01:17 +00:00
#!/usr/bin/python
2007-06-11 13:09:24 +01:00
"""
Scyther : An automatic verifier for security protocols.
2020-10-28 07:43:08 +00:00
Copyright (C) 2007-2020 Cas Cremers
2007-06-11 13:09:24 +01:00
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
"""
2007-01-30 11:01:17 +00:00
#---------------------------------------------------------------------------
""" Import externals """
import wx
2007-01-31 15:45:05 +00:00
import string
2007-01-30 11:01:17 +00:00
# Use Scintilla editor?
useStc = True # It looks nicer!
#useStc = False # It is sometimes buggy, claims the internet
# Test Scintilla and if it fails, get rid of it
if useStc:
try:
from wx.stc import *
except:
useStc = False
#---------------------------------------------------------------------------
""" Import scyther-gui components """
#---------------------------------------------------------------------------
""" Some constants """
#---------------------------------------------------------------------------
2007-01-31 15:45:05 +00:00
def justNumbers(txt):
for x in txt:
if not x in string.digits:
return False
return True
def lineInError(txt):
# First option: square braces
x1 = txt.find("[")
if x1 >= 0:
x2 = txt.find("]")
if x2 > x1:
nrstring = txt[(x1+1):x2]
if justNumbers(nrstring):
return int(nrstring)
# Alternative: ...line x
pref = " line "
i = txt.find(pref)
if i >= 0:
i = i + len(pref)
j = i
while txt[j] in string.digits:
j = j+1
if j > i:
return int(txt[i:j])
return None
2007-01-30 11:01:17 +00:00
def selectEditor(parent):
"""
Pick an editor (Scintilla or default) and return the object.
"""
if useStc:
return EditorStc(parent)
else:
return EditorNormal(parent)
#---------------------------------------------------------------------------
class Editor(object):
def __init__(self, parent):
# Empty start
self.SetText("")
self.SetChanged(False)
def SetText(self):
pass
2007-01-30 11:01:17 +00:00
2007-01-31 15:45:05 +00:00
def SetErrors(self,errors):
pass
def GetChanged(self):
"""
Return true if file was changed
"""
return self.savedtext != self.GetText()
def SetChanged(self,nowchanged=False):
"""
Set changed status
"""
if nowchanged:
self.savedtext = ""
else:
self.SetSaved()
def SetSaved(self):
self.savedtext = self.GetText()
def SetOpened(self):
self.SetSaved()
2007-01-30 11:01:17 +00:00
#---------------------------------------------------------------------------
class EditorNormal(Editor):
def __init__(self, parent):
self.control = wx.TextCtrl(parent, style=wx.TE_MULTILINE)
# Call parent
Editor.__init__(self,parent)
def GetText(self):
return self.control.GetValue()
def SetText(self, txt):
self.control.SetValue(txt)
#---------------------------------------------------------------------------
class EditorStc(Editor):
def __init__(self, parent):
# Scintilla layout with line numbers
self.control = StyledTextCtrl(parent)
self.control.SetMarginType(1, STC_MARGIN_NUMBER)
self.control.SetMarginWidth(1, 30)
# Call parent
Editor.__init__(self,parent)
2007-01-31 15:45:05 +00:00
# Set variable for error style
self.errorstyle = 5
self.control.StyleSetSpec(self.errorstyle, "fore:#FFFF0000,back:#FF0000")
2023-11-08 15:35:19 +00:00
try:
if wx.SystemSettings.GetAppearance().IsDark():
self.control.StyleSetSpec(STC_STYLE_LINENUMBER, "fore:#FFFFFF")
except:
pass
2007-01-30 11:01:17 +00:00
def GetText(self):
return self.control.GetText()
def SetText(self, txt):
self.control.SetText(txt)
def GetLineCount(self):
""" Currently rather stupid, can probably be done more
efficiently through some Scintilla function. """
txt = self.GetText().splitlines()
return len(txt)
2007-01-31 15:45:05 +00:00
def SetErrorLine(self,line):
"""
Currently this is BROKEN for include commands, as no file names
are propagated. To minize the damage, we at least don't try to
highlight non-existing names. In the long run of course
propagation is the only way to handle this.
"""
if line <= self.GetLineCount():
if line > 0:
line = line - 1 # Start at 0 in stc, but on screen count is 1
pos = self.control.GetLineIndentPosition(line)
last = self.control.GetLineEndPosition(line)
self.control.StartStyling(pos)
self.control.SetStyling(last-pos,self.errorstyle)
2007-01-31 15:45:05 +00:00
def ClearErrors(self):
self.control.ClearDocumentStyle()
def SetErrors(self,errors):
if errors:
for el in errors:
nr = lineInError(el)
if nr:
self.SetErrorLine(nr)
else:
self.ClearErrors()
2007-01-30 11:01:17 +00:00
#---------------------------------------------------------------------------