limodou wrote:
Thanks I'll check the plugin as soon as I can. The good place for saving custom infomation is ulipad.ini.
Updated plugin using ulipad.ini, actually Globals.pref. Werner
# Programmer: limodou # E-mail: [email protected] # # Copyleft 2009 limodou # # Adapted from the original plugin and the wxSpelCheckerDialog # included with Enchant v 1.5+ by Werner F. Bruhin # # Distributed under the terms of the GPL (GNU Public License) # # NewEdit 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # $Id$ import locale import wx import re import enchant from enchant.checker import SpellChecker from modules import Globals from modules import common import modules.meide as ui class SpellCheck(wx.Panel): def __init__(self, parent): self.parent = parent wx.Panel.__init__(self, parent, -1) self._numContext = 60 self.pref = Globals.mainframe.pref self.sizer = sizer = ui.VBox(padding=0, namebinding='widget').create(self).auto_layout() h = sizer.add(ui.HBox) h.add(ui.Label(tr("Unrecognized text") + ':')) ts = sizer.add(ui.HBox) ts.add(ui.MultiTextReadOnly('', size=(500, 150)), name='error_text') bs = ts.add(ui.VBox) bs.add(ui.Button(tr('Start')), name='btnRun').bind('click', self.OnRun) bs.add(ui.Button(tr('Replace')), name='btnReplace').bind('click', self.OnReplace) bs.add(ui.Button(tr('Replace All')), name='btnReplaceAll').bind('click', self.OnReplaceAll) bs.add(ui.Button(tr('Ignore')), name='btnIgnore').bind('click', self.OnIgnore) bs.add(ui.Button(tr('Ignore All')), name='btnIgnoreAll').bind('click', self.OnIgnoreAll) bs.add(ui.Button(tr('Add')), name='btnAdd').bind('click', self.OnAdd) rs = sizer.add(ui.HBox) rs.add(ui.Label(tr("Replace with") + ':')) rs.add(ui.Text('', size=(500, -1)), name='replace_text') h = sizer.add(ui.HBox, proportion=1) h.add(ui.Label(tr("Suggest") + ':')) h.add(ui.ListBox(size=(250, -1)), name='replace_list').binds( (wx.EVT_LISTBOX, self._OnReplSelect), (wx.EVT_LISTBOX_DCLICK, self.OnReplace), ) h.add(ui.Label(tr("Available Dict") + ':')) h.add(ui.ListBox(size=(100, -1), choices=enchant.list_languages()), name='dict_list').bind( wx.EVT_LISTBOX, self.OnDictSelect ) sizer.auto_fit(0) self.init() self._DisableButtons() def init(self): # default to user default local defLoc = locale.getdefaultlocale()[0] # override default to config.ini setting if hasattr(self.pref, 'defaultDict'): defLoc = self.pref.defaultDict else: self.pref.defaultDict = defLoc self.pref.save() index = self.dict_list.FindString(defLoc) if index > -1: self.dict_list.SetSelection(index) else: defLoc = "en_US" self.chkr = SpellChecker(defLoc) self.mainframe = Globals.mainframe self._buttonsEnabled = True self.running = False def OnRun(self, event): if self.running: self.running = False self._DisableButtons() else: self.running = True self.document = self.mainframe.document if self.document.edittype != 'edit': common.showerror(self, tr("This document can't be spell checked")) return self.ignore_list = [] self.chkr.set_text(self.document.GetText()) self._Advance() def _Advance(self): """Advance to the next error. This method advances the SpellChecker to the next error, if any. It then displays the error and some surrounding context, and well as listing the suggested replacements. """ # Disable interaction if no checker if self.chkr is None: self._DisableButtons() return False # Advance to next error, disable if not available try: self.chkr.next() except StopIteration: self._DisableButtons() self.error_text.SetValue("") self.replace_list.Clear() self.replace_text.SetValue("") return False self._EnableButtons() # Display error context with erroneous word in red. # Restoring default style was misbehaving under win32, so # I am forcing the rest of the text to be black. self.error_text.SetValue("") self.error_text.SetDefaultStyle(wx.TextAttr(wx.BLACK)) lContext = self.chkr.leading_context(self._numContext) self.error_text.AppendText(lContext) self.error_text.SetDefaultStyle(wx.TextAttr(wx.RED)) self.error_text.AppendText(self.chkr.word) self.error_text.SetDefaultStyle(wx.TextAttr(wx.BLACK)) tContext = self.chkr.trailing_context(self._numContext) self.error_text.AppendText(tContext) # Display suggestions in the replacements list suggs = self.chkr.suggest() self.replace_list.Set(suggs) self.replace_text.SetValue(suggs and suggs[0] or '') return True def OnIgnore(self, evnt=None): """Callback for the "ignore" button. This simply advances to the next error. """ self._Advance() def OnIgnoreAll(self, evnt=None): """Callback for the "ignore all" button.""" self.chkr.ignore_always() self._Advance() def OnReplace(self, evnt=None): """Callback for the "replace" button.""" repl = self._GetRepl() if repl: self.chkr.replace(repl) # Maybe this should be done at the end, i.e. use a button self.document.SetText(self.chkr.get_text()) self._Advance() def OnReplaceAll(self, evnt=None): """Callback for the "replace all" button.""" repl = self._GetRepl() self.chkr.replace_always(repl) # Maybe this should be done at the end, i.e. use a button self.document.SetText(self.chkr.get_text()) self._Advance() def _OnReplSelect(self,evnt=None): """Callback when a new replacement option is selected.""" sel = self.replace_list.GetSelection() if sel == -1: return opt = self.replace_list.GetString(sel) self.replace_text.SetValue(opt) def OnDictSelect(self, evnt=None): sel = self.dict_list.GetSelection() if sel == -1: return opt = self.dict_list.GetString(sel) self.chkr = SpellChecker(str(opt)) self.pref.defaultDict = opt ## self.pref.save() def _GetRepl(self): """Get the chosen replacement string.""" repl = self.replace_text.GetValue() return repl def _EnableButtons(self): """Enable the checking-related buttons""" if self._buttonsEnabled: return self.btnIgnore.Enable(True) self.btnIgnoreAll.Enable(True) self.btnReplace.Enable(True) self.btnReplaceAll.Enable(True) self.btnAdd.Enable(True) self.replace_list.Enable() self.dict_list.Disable() self.btnRun.SetLabel(tr("Stop")) self._buttonsEnabled = True def _DisableButtons(self): """Disable the checking-related buttons""" if not self._buttonsEnabled: return self.btnIgnore.Disable() self.btnIgnoreAll.Disable() self.btnReplace.Disable() self.btnReplaceAll.Disable() self.btnAdd.Disable() self.replace_list.Disable() self.dict_list.Enable() self.btnRun.SetLabel(tr("Start")) self._buttonsEnabled = False def OnAdd(self, evnt=None): """Callback for the "add" button.""" self.chkr.add() self._Advance()
