#!/usr/bin/python
# -*- coding: utf-8 -*-
import wx
import os
import time
import wx.lib.inspection
from configClass import *
from logClass import *
try:
import enchant
from SpellChecker import *
NO_SPELL_CHECK = False
except:
print "module enhant not found."
NO_SPELL_CHECK = True
class StcTextCtrl(wx.stc.StyledTextCtrl):
def __init__(self, parent, id, src_br, file_path="New Document"):
wx.stc.StyledTextCtrl.__init__(self, parent, id, pos=(0, 0),
size=(1, 1))
self.CharCount = 0
self.SaveTarget = file_path
if file_path != "New Document" and file_path != "":
self.LoadFile(file_path)
else:
self.SaveTarget = ""
if Config.GetOption("DefaultTextAct"):
self.AppendText(Config.GetOption("DefaultText"))
self.SaveRecord = self.GetText()
self.HOMEDIR = os.path.expanduser('~')
self.nb = wx.FindWindowById(900)
self.StatusBar = wx.FindWindowById(999)
self.InitSrcBr = src_br
self.text_id = id
if not NO_SPELL_CHECK:
self.Bind(wx.stc.EVT_STC_CHARADDED, self.OnSpellCheck)
self.Bind(wx.EVT_KEY_DOWN, self.OnCheckSpace)
self.last_word = ""
self.spell_error = False
if Config.GetOption("Autosave") == True:
self.Bind(wx.stc.EVT_STC_CHARADDED, lambda event: self.Autosave(event,
Config.GetOption("Autosave Interval")))
def SaveAs(self, event):
SaveFileAs = wx.FileDialog(None, style=wx.SAVE)
SaveFileAs.SetDirectory(self.HOMEDIR)
if SaveFileAs.ShowModal() == wx.ID_OK:
SaveAsFileName = SaveFileAs.GetFilename()
SaveAsPath = SaveFileAs.GetDirectory() + "/" + \
SaveAsFileName
self.SaveFile(SaveAsPath)
SaveContent = self.GetText()
self.SaveTarget = SaveAsPath
if Config.GetOption("StatusBar"):
self.StatusBar.SetStatusText("Saved as" + SaveAsPath)
self.nb.SetPageText(self.nb.GetSelection(), SaveAsFileName)
self.InitSrcBr.RefreshTree(self.text_id, SaveAsPath)
self.SaveRecord = SaveContent
SaveFileAs.Destroy()
return True
else:
SaveFileAs.Destroy()
return False
def Save(self, event):
if self.SaveTarget == "" or self.SaveTarget == "New Document":
self.SaveAs(0)
return
try:
self.SaveFile(self.SaveTarget)
if Config.GetOption("StatusBar"):
self.StatusBar.SetStatusText("Saved")
SaveContent = self.GetText()
Log.AddLogEntry(time.ctime() + ": Saved file " + self.SaveTarget)
self.InitSrcBr.RefreshTree(self.text_id, self.SaveTarget)
self.SaveRecord = SaveContent
except:
self.SaveAs(0)
def OnSpellCheck(self, event):
if Config.GetOption("SpellCheck"):
st = self.WordStartPosition(self.GetCurrentPos(), False)
end = self.WordEndPosition(self.GetCurrentPos(), False)
word = self.GetTextRange(st, end)
self.last_word = word
spelled_ok = WordSpeller.CheckWord(word)
if not spelled_ok:
self.StartStyling(st, wx.stc.STC_INDIC2_MASK)
self.SetStyling(end - st, wx.stc.STC_INDIC2_MASK)
self.spell_error = True
else:
self.StartStyling(st, wx.stc.STC_INDIC2_MASK)
self.SetStyling(end - st, 0)
self.spell_error = False
return end
def OnCheckSpace(self, event):
key = event.GetKeyCode()
if key == 32:
if self.spell_error:
if Config.GetOption("SpellSuggestions"):
self.CallTipShow(self.GetCurrentPos(), ("\n").join(WordSpeller.GetSuggestion(self.last_word)))
event.Skip()
def Autosave(self, event, interval):
if self.CharCount == interval:
self.Save(0)
self.CharCount = 0
else:
self.CharCount += 1
event.Skip()
def OnDedent(self, event):
self.BackTab()
def OnIndent(self, event):
sel_end = self.LineFromPosition(self.GetSelectionEnd())
sel_start = self.LineFromPosition(self.GetSelectionStart())
for line in xrange(sel_start, sel_end + 1):
self.SetLineIndentation(line, self.GetLineIndentation(line) +
self.GetIndent())
def OnZoomIn(self, event):
self.ZoomIn()
event.Skip()
def OnZoomOut(self, event):
self.ZoomOut()
event.Skip()
def OnResetZoom(self, event):
self.SetZoom(0)
event.Skip()
def OnRedo(self, event):
if self.CanRedo():
self.Redo()
event.Skip()
def OnUndo(self, event):
if self.CanUndo():
self.Undo()
event.Skip()
def OnCut(self, event):
self.Cut()
event.Skip()
def OnCopy(self, event):
self.Copy()
event.Skip()
def OnSelectAll(self, event):
self.SelectAll()
event.Skip()
def OnPaste(self, event):
self.Paste()
event.Skip()
def OnInsertDate(self, event):
self.AddText(str(time.ctime()))
event.Skip()