QScintilla/MiniEditor.py

changeset 0
de9c2efb9d02
child 7
c679fb30c8f3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QScintilla/MiniEditor.py	Mon Dec 28 16:03:33 2009 +0000
@@ -0,0 +1,2317 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2007 - 2009 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a minimalistic editor for simple editing tasks.
+"""
+
+import sys
+import os
+import re
+
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+from PyQt4.Qsci import QsciScintilla
+
+from E4Gui.E4Application import e4App
+from E4Gui.E4Action import E4Action, createActionGroup
+
+import Lexers
+from QsciScintillaCompat import QsciScintillaCompat, QSCINTILLA_VERSION
+from SearchReplaceWidget import SearchReplaceWidget
+
+import UI.PixmapCache
+import UI.Config
+
+from Printer import Printer
+
+import Preferences
+
+class MiniScintilla(QsciScintillaCompat):
+    """
+    Class implementing a QsciScintillaCompat subclass for handling focus events.
+    """
+    def __init__(self, parent = None):
+        """
+        Constructor
+        
+        @param parent parent widget (QWidget)
+        @param name name of this instance (string)
+        @param flags window flags
+        """
+        QsciScintillaCompat.__init__(self, parent)
+        
+        self.mw = parent
+    
+    def focusInEvent(self, event):
+        """
+        Protected method called when the editor receives focus.
+        
+        This method checks for modifications of the current file and
+        rereads it upon request. The cursor is placed at the current position
+        assuming, that it is in the vicinity of the old position after the reread.
+        
+        @param event the event object (QFocusEvent)
+        """
+        self.mw.editorActGrp.setEnabled(True)
+        try:
+            self.setCaretWidth(self.mw.caretWidth)
+        except AttributeError:
+            pass
+        
+        QsciScintillaCompat.focusInEvent(self, event)
+    
+    def focusOutEvent(self, event):
+        """
+        Public method called when the editor loses focus.
+        
+        @param event the event object (QFocusEvent)
+        """
+        self.mw.editorActGrp.setEnabled(False)
+        self.setCaretWidth(0)
+        
+        QsciScintillaCompat.focusOutEvent(self, event)
+
+class MiniEditor(QMainWindow):
+    """
+    Class implementing a minimalistic editor for simple editing tasks.
+    
+    @signal editorSaved emitted after the file has been saved
+    """
+    def __init__(self, filename = "", filetype = "", parent = None, name = None):
+        """
+        Constructor
+        
+        @param filename name of the file to open (string)
+        @param filetype type of the source file (string)
+        @param parent reference to the parent widget (QWidget)
+        @param name object name of the window (string)
+        """
+        QMainWindow.__init__(self, parent)
+        if name is not None:
+            self.setObjectName(name)
+        self.setAttribute(Qt.WA_DeleteOnClose)
+        self.setWindowIcon(UI.PixmapCache.getIcon("editor.png"))
+        
+        self.__textEdit = MiniScintilla(self)
+        self.__textEdit.clearSearchIndicators = self.clearSearchIndicators
+        self.__textEdit.setSearchIndicator = self.setSearchIndicator
+        
+        self.srHistory = {
+            "search" : [], 
+            "replace" : []
+        }
+        self.searchDlg = SearchReplaceWidget(False, self, self)
+        self.replaceDlg = SearchReplaceWidget(True, self, self)
+        
+        centralWidget = QWidget()
+        layout = QVBoxLayout()
+        layout.setContentsMargins(1, 1, 1, 1)
+        layout.addWidget(self.__textEdit)
+        layout.addWidget(self.searchDlg)
+        layout.addWidget(self.replaceDlg)
+        centralWidget.setLayout(layout)
+        self.setCentralWidget(centralWidget)
+        self.searchDlg.hide()
+        self.replaceDlg.hide()
+        
+        self.lexer_ = None
+        self.apiLanguage = ""
+        self.filetype = ""
+        
+        self.__createActions()
+        self.__createMenus()
+        self.__createToolBars()
+        self.__createStatusBar()
+        
+        self.__setTextDisplay()
+        self.__setMargins()
+        self.__setEolMode()
+        
+        self.__readSettings()
+        
+        # clear QScintilla defined keyboard commands
+        # we do our own handling through the view manager
+        self.__textEdit.clearAlternateKeys()
+        self.__textEdit.clearKeys()
+        
+        # initialise the mark occurrences timer
+        self.__markOccurrencesTimer = QTimer(self)
+        self.__markOccurrencesTimer.setSingleShot(True)
+        self.__markOccurrencesTimer.setInterval(
+            Preferences.getEditor("MarkOccurrencesTimeout"))
+        self.connect(self.__markOccurrencesTimer, SIGNAL("timeout()"), 
+                     self.__markOccurrences)
+        self.__markedText = ""
+        
+        self.connect(self.__textEdit, SIGNAL("textChanged()"), self.__documentWasModified)
+        self.connect(self.__textEdit, SIGNAL('modificationChanged(bool)'), 
+                     self.__modificationChanged)
+        self.connect(self.__textEdit, SIGNAL('cursorPositionChanged(int, int)'),
+                     self.__cursorPositionChanged)
+        
+        self.__textEdit.setContextMenuPolicy(Qt.CustomContextMenu)
+        self.connect(self.__textEdit, 
+                     SIGNAL("customContextMenuRequested(const QPoint &)"),
+                     self.__contextMenuRequested)
+        
+        self.connect(self.__textEdit, 
+                     SIGNAL("selectionChanged()"), 
+                     self.searchDlg.selectionChanged)
+        self.connect(self.__textEdit, 
+                     SIGNAL("selectionChanged()"), 
+                     self.replaceDlg.selectionChanged)
+        
+        self.__setCurrentFile("")
+        if filename:
+            self.__loadFile(filename, filetype)
+        
+        self.__checkActions()
+
+    def closeEvent(self, event):
+        """
+        Public method to handle the close event.
+        
+        @param event close event (QCloseEvent)
+        """
+        if self.__maybeSave():
+            self.__writeSettings()
+            event.accept()
+        else:
+            event.ignore()
+    
+    def __newFile(self):
+        """
+        Private slot to create a new file.
+        """
+        if self.__maybeSave():
+            self.__textEdit.clear()
+            self.__setCurrentFile("")
+        
+        self.__checkActions()
+    
+    def __open(self):
+        """
+        Private slot to open a file.
+        """
+        if self.__maybeSave():
+            fileName = QFileDialog.getOpenFileName(self)
+            if fileName:
+                self.__loadFile(fileName)
+        self.__checkActions()
+    
+    def __save(self):
+        """
+        Private slot to save a file.
+        """
+        if not self.__curFile:
+            return self.__saveAs()
+        else:
+            return self.__saveFile(self.__curFile)
+    
+    def __saveAs(self):
+        """
+        Private slot to save a file with a new name.
+        """
+        fileName = QFileDialog.getSaveFileName(self)
+        if not fileName:
+            return False
+        
+        return self.__saveFile(fileName)
+    
+    def __about(self):
+        """
+        Private slot to show a little About message.
+        """
+        QMessageBox.about(self, self.trUtf8("About eric4 Mini Editor"),
+            self.trUtf8("The eric4 Mini Editor is an editor component"
+                " based on QScintilla. It may be used for simple"
+                " editing tasks, that don't need the power of"
+                " a full blown editor."))
+    
+    def __aboutQt(self):
+        """
+        Private slot to handle the About Qt dialog.
+        """
+        QMessageBox.aboutQt(self, "eric4 Mini Editor")
+    
+    def __whatsThis(self):
+        """
+        Private slot called in to enter Whats This mode.
+        """
+        QWhatsThis.enterWhatsThisMode()
+    
+    def __documentWasModified(self):
+        """
+        Private slot to handle a change in the documents modification status.
+        """
+        self.setWindowModified(self.__textEdit.isModified())
+    
+    def __checkActions(self, setSb = True):
+        """
+        Private slot to check some actions for their enable/disable status
+        and set the statusbar info.
+        
+        @param setSb flag indicating an update of the status bar is wanted (boolean)
+        """
+        self.saveAct.setEnabled(self.__textEdit.isModified())
+        
+        self.undoAct.setEnabled(self.__textEdit.isUndoAvailable())
+        self.redoAct.setEnabled(self.__textEdit.isRedoAvailable())
+        
+        if setSb:
+            line, pos = self.__textEdit.getCursorPosition()
+            self.__setSbFile(line + 1, pos)
+    
+    def __setSbFile(self, line = None, pos = None):
+        """
+        Private method to set the file info in the status bar.
+        
+        @param line line number to display (int)
+        @param pos character position to display (int)
+        """
+        if not self.__curFile:
+            writ = '   '
+        else:
+            if QFileInfo(self.__curFile).isWritable():
+                writ = ' rw'
+            else:
+                writ = ' ro'
+        
+        self.sbWritable.setText(writ)
+        
+        if line is None:
+            line = ''
+        self.sbLine.setText(self.trUtf8('Line: {0:5}').format(line))
+        
+        if pos is None:
+            pos = ''
+        self.sbPos.setText(self.trUtf8('Pos: {0:5}').format(pos))
+    
+    def __readShortcut(self, act, category):
+        """
+        Private function to read a single keyboard shortcut from the settings.
+        
+        @param act reference to the action object (E4Action)
+        @param category category the action belongs to (string)
+        @param prefClass preferences class used as the storage area
+        """
+        if act.objectName():
+            accel = Preferences.Prefs.settings.value(\
+                "Shortcuts/{0}/{1}/Accel".format(category, act.objectName()))
+            if accel.isValid():
+                act.setShortcut(QKeySequence(accel.toString()))
+            accel = Preferences.Prefs.settings.value(\
+                "Shortcuts/{0}/{1}/AltAccel".format(category, act.objectName()))
+            if accel.isValid():
+                act.setAlternateShortcut(QKeySequence(accel.toString()))
+    
+    def __createActions(self):
+        """
+        Private method to create the actions.
+        """
+        self.fileActions = []
+        self.editActions = []
+        self.helpActions = []
+        self.searchActions = []
+        
+        self.__createFileActions()
+        self.__createEditActions()
+        self.__createHelpActions()
+        self.__createSearchActions()
+        
+        # read the keyboard shortcuts and make them identical to the main
+        # eric4 shortcuts
+        for act in self.helpActions:
+            self.__readShortcut(act, "General")
+        for act in self.editActions:
+            self.__readShortcut(act, "Edit")
+        for act in self.fileActions:
+            self.__readShortcut(act, "File")
+        for act in self.searchActions:
+            self.__readShortcut(act, "Search")
+    
+    def __createFileActions(self):
+        """
+        Private method to create the File actions.
+        """
+        self.newAct = E4Action(self.trUtf8('New'),
+                UI.PixmapCache.getIcon("new.png"),
+                self.trUtf8('&New'),
+                QKeySequence(self.trUtf8("Ctrl+N", "File|New")),
+                0, self, 'vm_file_new')
+        self.newAct.setStatusTip(self.trUtf8('Open an empty editor window'))
+        self.newAct.setWhatsThis(self.trUtf8(\
+            """<b>New</b>"""
+            """<p>An empty editor window will be created.</p>"""
+        ))
+        self.connect(self.newAct, SIGNAL('triggered()'), self.__newFile)
+        self.fileActions.append(self.newAct)
+        
+        self.openAct = E4Action(self.trUtf8('Open'),
+                UI.PixmapCache.getIcon("open.png"),
+                self.trUtf8('&Open...'),
+                QKeySequence(self.trUtf8("Ctrl+O", "File|Open")), 
+                0, self, 'vm_file_open')
+        self.openAct.setStatusTip(self.trUtf8('Open a file'))
+        self.openAct.setWhatsThis(self.trUtf8(\
+            """<b>Open a file</b>"""
+            """<p>You will be asked for the name of a file to be opened.</p>"""
+        ))
+        self.connect(self.openAct, SIGNAL('triggered()'), self.__open)
+        self.fileActions.append(self.openAct)
+        
+        self.saveAct = E4Action(self.trUtf8('Save'),
+                UI.PixmapCache.getIcon("fileSave.png"),
+                self.trUtf8('&Save'),
+                QKeySequence(self.trUtf8("Ctrl+S", "File|Save")), 
+                0, self, 'vm_file_save')
+        self.saveAct.setStatusTip(self.trUtf8('Save the current file'))
+        self.saveAct.setWhatsThis(self.trUtf8(\
+            """<b>Save File</b>"""
+            """<p>Save the contents of current editor window.</p>"""
+        ))
+        self.connect(self.saveAct, SIGNAL('triggered()'), self.__save)
+        self.fileActions.append(self.saveAct)
+        
+        self.saveAsAct = E4Action(self.trUtf8('Save as'),
+                UI.PixmapCache.getIcon("fileSaveAs.png"),
+                self.trUtf8('Save &as...'),
+                QKeySequence(self.trUtf8("Shift+Ctrl+S", "File|Save As")), 
+                0, self, 'vm_file_save_as')
+        self.saveAsAct.setStatusTip(self.trUtf8('Save the current file to a new one'))
+        self.saveAsAct.setWhatsThis(self.trUtf8(\
+            """<b>Save File as</b>"""
+            """<p>Save the contents of current editor window to a new file."""
+            """ The file can be entered in a file selection dialog.</p>"""
+        ))
+        self.connect(self.saveAsAct, SIGNAL('triggered()'), self.__saveAs)
+        self.fileActions.append(self.saveAsAct)
+        
+        self.closeAct = E4Action(self.trUtf8('Close'),
+                UI.PixmapCache.getIcon("close.png"),
+                self.trUtf8('&Close'),
+                QKeySequence(self.trUtf8("Ctrl+W", "File|Close")), 
+                0, self, 'vm_file_close')
+        self.closeAct.setStatusTip(self.trUtf8('Close the editor window'))
+        self.closeAct.setWhatsThis(self.trUtf8(\
+            """<b>Close Window</b>"""
+            """<p>Close the current window.</p>"""
+        ))
+        self.connect(self.closeAct, SIGNAL('triggered()'), self.close)
+        self.fileActions.append(self.closeAct)
+        
+        self.printAct = E4Action(self.trUtf8('Print'),
+                UI.PixmapCache.getIcon("print.png"),
+                self.trUtf8('&Print'),
+                QKeySequence(self.trUtf8("Ctrl+P", "File|Print")), 
+                0, self, 'vm_file_print')
+        self.printAct.setStatusTip(self.trUtf8('Print the current file'))
+        self.printAct.setWhatsThis(self.trUtf8( 
+            """<b>Print File</b>"""
+            """<p>Print the contents of the current file.</p>"""
+        ))
+        self.connect(self.printAct, SIGNAL('triggered()'), self.__printFile)
+        self.fileActions.append(self.printAct)
+        
+        self.printPreviewAct = \
+            E4Action(self.trUtf8('Print Preview'),
+                UI.PixmapCache.getIcon("printPreview.png"),
+                QApplication.translate('ViewManager', 'Print Preview'),
+                0, 0, self, 'vm_file_print_preview')
+        self.printPreviewAct.setStatusTip(self.trUtf8(
+            'Print preview of the current file'))
+        self.printPreviewAct.setWhatsThis(self.trUtf8(
+            """<b>Print Preview</b>"""
+            """<p>Print preview of the current file.</p>"""
+        ))
+        self.connect(self.printPreviewAct, SIGNAL('triggered()'), 
+            self.__printPreviewFile)
+        self.fileActions.append(self.printPreviewAct)
+    
+    def __createEditActions(self):
+        """
+        Private method to create the Edit actions.
+        """
+        self.undoAct = E4Action(self.trUtf8('Undo'),
+                UI.PixmapCache.getIcon("editUndo.png"),
+                self.trUtf8('&Undo'),
+                QKeySequence(self.trUtf8("Ctrl+Z", "Edit|Undo")), 
+                QKeySequence(self.trUtf8("Alt+Backspace", "Edit|Undo")), 
+                self, 'vm_edit_undo')
+        self.undoAct.setStatusTip(self.trUtf8('Undo the last change'))
+        self.undoAct.setWhatsThis(self.trUtf8(\
+            """<b>Undo</b>"""
+            """<p>Undo the last change done in the current editor.</p>"""
+        ))
+        self.connect(self.undoAct, SIGNAL('triggered()'), self.__undo)
+        self.editActions.append(self.undoAct)
+        
+        self.redoAct = E4Action(self.trUtf8('Redo'),
+                UI.PixmapCache.getIcon("editRedo.png"),
+                self.trUtf8('&Redo'),
+                QKeySequence(self.trUtf8("Ctrl+Shift+Z", "Edit|Redo")), 
+                0, self, 'vm_edit_redo')
+        self.redoAct.setStatusTip(self.trUtf8('Redo the last change'))
+        self.redoAct.setWhatsThis(self.trUtf8(\
+            """<b>Redo</b>"""
+            """<p>Redo the last change done in the current editor.</p>"""
+        ))
+        self.connect(self.redoAct, SIGNAL('triggered()'), self.__redo)
+        self.editActions.append(self.redoAct)
+        
+        self.cutAct = E4Action(self.trUtf8('Cut'),
+                UI.PixmapCache.getIcon("editCut.png"),
+                self.trUtf8('Cu&t'),
+                QKeySequence(self.trUtf8("Ctrl+X", "Edit|Cut")),
+                QKeySequence(self.trUtf8("Shift+Del", "Edit|Cut")),
+                self, 'vm_edit_cut')
+        self.cutAct.setStatusTip(self.trUtf8('Cut the selection'))
+        self.cutAct.setWhatsThis(self.trUtf8(\
+            """<b>Cut</b>"""
+            """<p>Cut the selected text of the current editor to the clipboard.</p>"""
+        ))
+        self.connect(self.cutAct, SIGNAL('triggered()'), self.__textEdit.cut)
+        self.editActions.append(self.cutAct)
+        
+        self.copyAct = E4Action(self.trUtf8('Copy'),
+                UI.PixmapCache.getIcon("editCopy.png"),
+                self.trUtf8('&Copy'),
+                QKeySequence(self.trUtf8("Ctrl+C", "Edit|Copy")), 
+                QKeySequence(self.trUtf8("Ctrl+Ins", "Edit|Copy")), 
+                self, 'vm_edit_copy')
+        self.copyAct.setStatusTip(self.trUtf8('Copy the selection'))
+        self.copyAct.setWhatsThis(self.trUtf8(\
+            """<b>Copy</b>"""
+            """<p>Copy the selected text of the current editor to the clipboard.</p>"""
+        ))
+        self.connect(self.copyAct, SIGNAL('triggered()'), self.__textEdit.copy)
+        self.editActions.append(self.copyAct)
+        
+        self.pasteAct = E4Action(self.trUtf8('Paste'),
+                UI.PixmapCache.getIcon("editPaste.png"),
+                self.trUtf8('&Paste'),
+                QKeySequence(self.trUtf8("Ctrl+V", "Edit|Paste")), 
+                QKeySequence(self.trUtf8("Shift+Ins", "Edit|Paste")), 
+                self, 'vm_edit_paste')
+        self.pasteAct.setStatusTip(self.trUtf8('Paste the last cut/copied text'))
+        self.pasteAct.setWhatsThis(self.trUtf8(\
+            """<b>Paste</b>"""
+            """<p>Paste the last cut/copied text from the clipboard to"""
+            """ the current editor.</p>"""
+        ))
+        self.connect(self.pasteAct, SIGNAL('triggered()'), self.__textEdit.paste)
+        self.editActions.append(self.pasteAct)
+        
+        self.deleteAct = E4Action(self.trUtf8('Clear'),
+                UI.PixmapCache.getIcon("editDelete.png"),
+                self.trUtf8('Cl&ear'),
+                QKeySequence(self.trUtf8("Alt+Shift+C", "Edit|Clear")), 
+                0,
+                self, 'vm_edit_clear')
+        self.deleteAct.setStatusTip(self.trUtf8('Clear all text'))
+        self.deleteAct.setWhatsThis(self.trUtf8(\
+            """<b>Clear</b>"""
+            """<p>Delete all text of the current editor.</p>"""
+        ))
+        self.connect(self.deleteAct, SIGNAL('triggered()'), self.__textEdit.clear)
+        self.editActions.append(self.deleteAct)
+        
+        self.cutAct.setEnabled(False);
+        self.copyAct.setEnabled(False);
+        self.connect(self.__textEdit, SIGNAL("copyAvailable(bool)"),
+                self.cutAct, SLOT("setEnabled(bool)"))
+        self.connect(self.__textEdit, SIGNAL("copyAvailable(bool)"),
+                self.copyAct, SLOT("setEnabled(bool)"))
+        
+        ####################################################################
+        ## Below follow the actions for qscintilla standard commands.
+        ####################################################################
+        
+        self.esm = QSignalMapper(self)
+        self.connect(self.esm, SIGNAL('mapped(int)'), self.__textEdit.editorCommand)
+        
+        self.editorActGrp = createActionGroup(self)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Move left one character'), 
+                      QApplication.translate('ViewManager', 'Move left one character'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Left')), 0,
+                      self.editorActGrp, 'vm_edit_move_left_char')
+        self.esm.setMapping(act, QsciScintilla.SCI_CHARLEFT)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Move right one character'), 
+                      QApplication.translate('ViewManager', 'Move right one character'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Right')), 0,
+                      self.editorActGrp, 'vm_edit_move_right_char')
+        self.esm.setMapping(act, QsciScintilla.SCI_CHARRIGHT)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Move up one line'), 
+                      QApplication.translate('ViewManager', 'Move up one line'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Up')), 0,
+                      self.editorActGrp, 'vm_edit_move_up_line')
+        self.esm.setMapping(act, QsciScintilla.SCI_LINEUP)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Move down one line'), 
+                      QApplication.translate('ViewManager', 'Move down one line'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Down')), 0,
+                      self.editorActGrp, 'vm_edit_move_down_line')
+        self.esm.setMapping(act, QsciScintilla.SCI_LINEDOWN)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Move left one word part'), 
+                      QApplication.translate('ViewManager', 'Move left one word part'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Alt+Left')), 0,
+                      self.editorActGrp, 'vm_edit_move_left_word_part')
+        self.esm.setMapping(act, QsciScintilla.SCI_WORDPARTLEFT)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Move right one word part'), 
+                      QApplication.translate('ViewManager', 'Move right one word part'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Alt+Right')), 0,
+                      self.editorActGrp, 'vm_edit_move_right_word_part')
+        self.esm.setMapping(act, QsciScintilla.SCI_WORDPARTRIGHT)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Move left one word'), 
+                      QApplication.translate('ViewManager', 'Move left one word'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Ctrl+Left')), 0,
+                      self.editorActGrp, 'vm_edit_move_left_word')
+        self.esm.setMapping(act, QsciScintilla.SCI_WORDLEFT)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Move right one word'), 
+                      QApplication.translate('ViewManager', 'Move right one word'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Ctrl+Right')), 
+                      0,
+                      self.editorActGrp, 'vm_edit_move_right_word')
+        self.esm.setMapping(act, QsciScintilla.SCI_WORDRIGHT)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Move to first visible character in line'), 
+                      QApplication.translate('ViewManager', 
+                        'Move to first visible character in line'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Home')), 0,
+                      self.editorActGrp, 'vm_edit_move_first_visible_char')
+        self.esm.setMapping(act, QsciScintilla.SCI_VCHOME)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Move to start of displayed line'), 
+                      QApplication.translate('ViewManager', 
+                        'Move to start of displayed line'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Alt+Home')), 0,
+                      self.editorActGrp, 'vm_edit_move_start_line')
+        self.esm.setMapping(act, QsciScintilla.SCI_HOMEDISPLAY)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Move to end of line'), 
+                      QApplication.translate('ViewManager', 'Move to end of line'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'End')), 0,
+                      self.editorActGrp, 'vm_edit_move_end_line')
+        self.esm.setMapping(act, QsciScintilla.SCI_LINEEND)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Scroll view down one line'),
+                      QApplication.translate('ViewManager', 'Scroll view down one line'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Ctrl+Down')), 0,
+                      self.editorActGrp, 'vm_edit_scroll_down_line')
+        self.esm.setMapping(act, QsciScintilla.SCI_LINESCROLLDOWN)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Scroll view up one line'), 
+                      QApplication.translate('ViewManager', 'Scroll view up one line'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Ctrl+Up')), 0,
+                      self.editorActGrp, 'vm_edit_scroll_up_line')
+        self.esm.setMapping(act, QsciScintilla.SCI_LINESCROLLUP)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Move up one paragraph'), 
+                      QApplication.translate('ViewManager', 'Move up one paragraph'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Alt+Up')), 0,
+                      self.editorActGrp, 'vm_edit_move_up_para')
+        self.esm.setMapping(act, QsciScintilla.SCI_PARAUP)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Move down one paragraph'), 
+                      QApplication.translate('ViewManager', 'Move down one paragraph'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Alt+Down')), 0,
+                      self.editorActGrp, 'vm_edit_move_down_para')
+        self.esm.setMapping(act, QsciScintilla.SCI_PARADOWN)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Move up one page'), 
+                      QApplication.translate('ViewManager', 'Move up one page'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'PgUp')), 0,
+                      self.editorActGrp, 'vm_edit_move_up_page')
+        self.esm.setMapping(act, QsciScintilla.SCI_PAGEUP)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Move down one page'), 
+                      QApplication.translate('ViewManager', 'Move down one page'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'PgDown')), 0,
+                      self.editorActGrp, 'vm_edit_move_down_page')
+        self.esm.setMapping(act, QsciScintilla.SCI_PAGEDOWN)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Move to start of text'), 
+                      QApplication.translate('ViewManager', 'Move to start of text'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Ctrl+Home')), 0,
+                      self.editorActGrp, 'vm_edit_move_start_text')
+        self.esm.setMapping(act, QsciScintilla.SCI_DOCUMENTSTART)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Move to end of text'), 
+                      QApplication.translate('ViewManager', 'Move to end of text'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Ctrl+End')), 0,
+                      self.editorActGrp, 'vm_edit_move_end_text')
+        self.esm.setMapping(act, QsciScintilla.SCI_DOCUMENTEND)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Indent one level'), 
+                      QApplication.translate('ViewManager', 'Indent one level'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Tab')), 0,
+                      self.editorActGrp, 'vm_edit_indent_one_level')
+        self.esm.setMapping(act, QsciScintilla.SCI_TAB)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Unindent one level'), 
+                      QApplication.translate('ViewManager', 'Unindent one level'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Shift+Tab')), 0,
+                      self.editorActGrp, 'vm_edit_unindent_one_level')
+        self.esm.setMapping(act, QsciScintilla.SCI_BACKTAB)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Extend selection left one character'), 
+                      QApplication.translate('ViewManager', 
+                        'Extend selection left one character'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Shift+Left')), 
+                      0,
+                      self.editorActGrp, 'vm_edit_extend_selection_left_char')
+        self.esm.setMapping(act, QsciScintilla.SCI_CHARLEFTEXTEND)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Extend selection right one character'), 
+                      QApplication.translate('ViewManager', 
+                        'Extend selection right one character'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Shift+Right')), 
+                      0,
+                      self.editorActGrp, 'vm_edit_extend_selection_right_char')
+        self.esm.setMapping(act, QsciScintilla.SCI_CHARRIGHTEXTEND)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Extend selection up one line'), 
+                      QApplication.translate('ViewManager', 
+                        'Extend selection up one line'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Shift+Up')), 0,
+                      self.editorActGrp, 'vm_edit_extend_selection_up_line')
+        self.esm.setMapping(act, QsciScintilla.SCI_LINEUPEXTEND)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Extend selection down one line'), 
+                      QApplication.translate('ViewManager', 
+                        'Extend selection down one line'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Shift+Down')), 
+                      0,
+                      self.editorActGrp, 'vm_edit_extend_selection_down_line')
+        self.esm.setMapping(act, QsciScintilla.SCI_LINEDOWNEXTEND)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Extend selection left one word part'), 
+                      QApplication.translate('ViewManager', 
+                        'Extend selection left one word part'), 
+                      QKeySequence(QApplication.translate('ViewManager', 
+                        'Alt+Shift+Left')), 
+                      0,
+                      self.editorActGrp, 'vm_edit_extend_selection_left_word_part')
+        self.esm.setMapping(act, QsciScintilla.SCI_WORDPARTLEFTEXTEND)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Extend selection right one word part'), 
+                      QApplication.translate('ViewManager', 
+                        'Extend selection right one word part'), 
+                      QKeySequence(QApplication.translate('ViewManager', 
+                        'Alt+Shift+Right')), 
+                      0,
+                      self.editorActGrp, 'vm_edit_extend_selection_right_word_part')
+        self.esm.setMapping(act, QsciScintilla.SCI_WORDPARTRIGHTEXTEND)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Extend selection left one word'), 
+                      QApplication.translate('ViewManager', 
+                        'Extend selection left one word'), 
+                      QKeySequence(QApplication.translate('ViewManager', 
+                        'Ctrl+Shift+Left')), 
+                      0,
+                      self.editorActGrp, 'vm_edit_extend_selection_left_word')
+        self.esm.setMapping(act, QsciScintilla.SCI_WORDLEFTEXTEND)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Extend selection right one word'), 
+                      QApplication.translate('ViewManager', 
+                        'Extend selection right one word'), 
+                      QKeySequence(QApplication.translate('ViewManager', 
+                        'Ctrl+Shift+Right')), 
+                      0,
+                      self.editorActGrp, 'vm_edit_extend_selection_right_word')
+        self.esm.setMapping(act, QsciScintilla.SCI_WORDRIGHTEXTEND)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Extend selection to first visible character in line'),
+                      QApplication.translate('ViewManager', 
+                        'Extend selection to first visible character in line'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Shift+Home')), 
+                      0,
+                      self.editorActGrp, 'vm_edit_extend_selection_first_visible_char')
+        self.esm.setMapping(act, QsciScintilla.SCI_VCHOMEEXTEND)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Extend selection to start of line'), 
+                      QApplication.translate('ViewManager', 
+                        'Extend selection to start of line'), 
+                      QKeySequence(QApplication.translate('ViewManager', 
+                        'Alt+Shift+Home')), 
+                      0,
+                      self.editorActGrp, 'vm_edit_extend_selection_start_line')
+        self.esm.setMapping(act, QsciScintilla.SCI_HOMEDISPLAYEXTEND)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Extend selection to end of line'), 
+                      QApplication.translate('ViewManager', 
+                        'Extend selection to end of line'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Shift+End')), 0,
+                      self.editorActGrp, 'vm_edit_extend_selection_end_line')
+        self.esm.setMapping(act, QsciScintilla.SCI_LINEENDEXTEND)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Extend selection up one paragraph'), 
+                      QApplication.translate('ViewManager', 
+                        'Extend selection up one paragraph'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Alt+Shift+Up')),
+                      0,
+                      self.editorActGrp, 'vm_edit_extend_selection_up_para')
+        self.esm.setMapping(act, QsciScintilla.SCI_PARAUPEXTEND)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Extend selection down one paragraph'), 
+                      QApplication.translate('ViewManager', 
+                        'Extend selection down one paragraph'), 
+                      QKeySequence(QApplication.translate('ViewManager', 
+                        'Alt+Shift+Down')), 
+                      0,
+                      self.editorActGrp, 'vm_edit_extend_selection_down_para')
+        self.esm.setMapping(act, QsciScintilla.SCI_PARADOWNEXTEND)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Extend selection up one page'), 
+                      QApplication.translate('ViewManager', 
+                        'Extend selection up one page'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Shift+PgUp')), 
+                      0,
+                      self.editorActGrp, 'vm_edit_extend_selection_up_page')
+        self.esm.setMapping(act, QsciScintilla.SCI_PAGEUPEXTEND)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Extend selection down one page'), 
+                      QApplication.translate('ViewManager', 
+                        'Extend selection down one page'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Shift+PgDown')),
+                      0,
+                      self.editorActGrp, 'vm_edit_extend_selection_down_page')
+        self.esm.setMapping(act, QsciScintilla.SCI_PAGEDOWNEXTEND)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Extend selection to start of text'), 
+                      QApplication.translate('ViewManager', 
+                        'Extend selection to start of text'), 
+                      QKeySequence(QApplication.translate('ViewManager', 
+                        'Ctrl+Shift+Home')),
+                      0,
+                      self.editorActGrp, 'vm_edit_extend_selection_start_text')
+        self.esm.setMapping(act, QsciScintilla.SCI_DOCUMENTSTARTEXTEND)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Extend selection to end of text'), 
+                      QApplication.translate('ViewManager', 
+                        'Extend selection to end of text'), 
+                      QKeySequence(QApplication.translate('ViewManager', 
+                        'Ctrl+Shift+End')), 
+                      0,
+                      self.editorActGrp, 'vm_edit_extend_selection_end_text')
+        self.esm.setMapping(act, QsciScintilla.SCI_DOCUMENTENDEXTEND)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Delete previous character'), 
+                      QApplication.translate('ViewManager', 'Delete previous character'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Backspace')), 
+                      QKeySequence(QApplication.translate('ViewManager', 
+                        'Shift+Backspace')), 
+                      self.editorActGrp, 'vm_edit_delete_previous_char')
+        self.esm.setMapping(act, QsciScintilla.SCI_DELETEBACK)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Delete previous character if not at line start'), 
+                      QApplication.translate('ViewManager', 
+                        'Delete previous character if not at line start'), 
+                      0, 0,
+                      self.editorActGrp, 'vm_edit_delet_previous_char_not_line_start')
+        self.esm.setMapping(act, QsciScintilla.SCI_DELETEBACKNOTLINE)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Delete current character'), 
+                      QApplication.translate('ViewManager', 'Delete current character'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Del')), 0,
+                      self.editorActGrp, 'vm_edit_delete_current_char')
+        self.esm.setMapping(act, QsciScintilla.SCI_CLEAR)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Delete word to left'), 
+                      QApplication.translate('ViewManager', 'Delete word to left'), 
+                      QKeySequence(QApplication.translate('ViewManager', 
+                        'Ctrl+Backspace')), 
+                      0,
+                      self.editorActGrp, 'vm_edit_delete_word_left')
+        self.esm.setMapping(act, QsciScintilla.SCI_DELWORDLEFT)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Delete word to right'), 
+                      QApplication.translate('ViewManager', 'Delete word to right'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Ctrl+Del')), 0,
+                      self.editorActGrp, 'vm_edit_delete_word_right')
+        self.esm.setMapping(act, QsciScintilla.SCI_DELWORDRIGHT)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Delete line to left'), 
+                      QApplication.translate('ViewManager', 'Delete line to left'), 
+                      QKeySequence(QApplication.translate('ViewManager', 
+                        'Ctrl+Shift+Backspace')), 
+                      0,
+                      self.editorActGrp, 'vm_edit_delete_line_left')
+        self.esm.setMapping(act, QsciScintilla.SCI_DELLINELEFT)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Delete line to right'), 
+                      QApplication.translate('ViewManager', 'Delete line to right'), 
+                      QKeySequence(QApplication.translate('ViewManager', 
+                        'Ctrl+Shift+Del')), 
+                      0,
+                      self.editorActGrp, 'vm_edit_delete_line_right')
+        self.esm.setMapping(act, QsciScintilla.SCI_DELLINERIGHT)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Insert new line'), 
+                      QApplication.translate('ViewManager', 'Insert new line'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Return')), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Enter')), 
+                      self.editorActGrp, 'vm_edit_insert_line')
+        self.esm.setMapping(act, QsciScintilla.SCI_NEWLINE)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                                              'Insert new line below current line'), 
+                      QApplication.translate('ViewManager', 
+                                             'Insert new line below current line'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Shift+Return')),
+                      QKeySequence(QApplication.translate('ViewManager', 'Shift+Enter')), 
+                      self.editorActGrp, 'vm_edit_insert_line_below')
+        self.connect(act, SIGNAL('triggered()'), self.__textEdit.newLineBelow)
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Delete current line'), 
+                      QApplication.translate('ViewManager', 'Delete current line'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Ctrl+U')), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Ctrl+Shift+L')),
+                      self.editorActGrp, 'vm_edit_delete_current_line')
+        self.esm.setMapping(act, QsciScintilla.SCI_LINEDELETE)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Duplicate current line'), 
+                      QApplication.translate('ViewManager', 'Duplicate current line'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Ctrl+D')), 0,
+                      self.editorActGrp, 'vm_edit_duplicate_current_line')
+        self.esm.setMapping(act, QsciScintilla.SCI_LINEDUPLICATE)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Swap current and previous lines'), 
+                      QApplication.translate('ViewManager', 
+                        'Swap current and previous lines'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Ctrl+T')), 0,
+                      self.editorActGrp, 'vm_edit_swap_current_previous_line')
+        self.esm.setMapping(act, QsciScintilla.SCI_LINETRANSPOSE)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Cut current line'), 
+                      QApplication.translate('ViewManager', 'Cut current line'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Alt+Shift+L')),
+                      0,
+                      self.editorActGrp, 'vm_edit_cut_current_line')
+        self.esm.setMapping(act, QsciScintilla.SCI_LINECUT)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Copy current line'), 
+                      QApplication.translate('ViewManager', 'Copy current line'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Ctrl+Shift+T')),
+                      0,
+                      self.editorActGrp, 'vm_edit_copy_current_line')
+        self.esm.setMapping(act, QsciScintilla.SCI_LINECOPY)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Toggle insert/overtype'), 
+                      QApplication.translate('ViewManager', 'Toggle insert/overtype'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Ins')), 0,
+                      self.editorActGrp, 'vm_edit_toggle_insert_overtype')
+        self.esm.setMapping(act, QsciScintilla.SCI_EDITTOGGLEOVERTYPE)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Convert selection to lower case'), 
+                      QApplication.translate('ViewManager', 
+                        'Convert selection to lower case'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Alt+Shift+U')),
+                      0,
+                      self.editorActGrp, 'vm_edit_convert_selection_lower')
+        self.esm.setMapping(act, QsciScintilla.SCI_LOWERCASE)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Convert selection to upper case'), 
+                      QApplication.translate('ViewManager', 
+                        'Convert selection to upper case'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Ctrl+Shift+U')),
+                      0,
+                      self.editorActGrp, 'vm_edit_convert_selection_upper')
+        self.esm.setMapping(act, QsciScintilla.SCI_UPPERCASE)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Move to end of displayed line'), 
+                      QApplication.translate('ViewManager', 
+                        'Move to end of displayed line'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Alt+End')), 0,
+                      self.editorActGrp, 'vm_edit_move_end_displayed_line')
+        self.esm.setMapping(act, QsciScintilla.SCI_LINEENDDISPLAY)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Extend selection to end of displayed line'), 
+                      QApplication.translate('ViewManager', 
+                        'Extend selection to end of displayed line'), 
+                      0, 0,
+                      self.editorActGrp, 'vm_edit_extend_selection_end_displayed_line')
+        self.esm.setMapping(act, QsciScintilla.SCI_LINEENDDISPLAYEXTEND)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Formfeed'), 
+                      QApplication.translate('ViewManager', 'Formfeed'), 
+                      0, 0,
+                      self.editorActGrp, 'vm_edit_formfeed')
+        self.esm.setMapping(act, QsciScintilla.SCI_FORMFEED)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 'Escape'), 
+                      QApplication.translate('ViewManager', 'Escape'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Esc')), 0,
+                      self.editorActGrp, 'vm_edit_escape')
+        self.esm.setMapping(act, QsciScintilla.SCI_CANCEL)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Extend rectangular selection down one line'), 
+                      QApplication.translate('ViewManager', 
+                        'Extend rectangular selection down one line'), 
+                      QKeySequence(QApplication.translate('ViewManager', 
+                        'Alt+Ctrl+Down')), 
+                      0,
+                      self.editorActGrp, 'vm_edit_extend_rect_selection_down_line')
+        self.esm.setMapping(act, QsciScintilla.SCI_LINEDOWNRECTEXTEND)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Extend rectangular selection up one line'), 
+                      QApplication.translate('ViewManager', 
+                        'Extend rectangular selection up one line'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Alt+Ctrl+Up')),
+                      0,
+                      self.editorActGrp, 'vm_edit_extend_rect_selection_up_line')
+        self.esm.setMapping(act, QsciScintilla.SCI_LINEUPRECTEXTEND)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Extend rectangular selection left one character'), 
+                      QApplication.translate('ViewManager', 
+                        'Extend rectangular selection left one character'), 
+                      QKeySequence(QApplication.translate('ViewManager', 
+                        'Alt+Ctrl+Left')), 
+                      0,
+                      self.editorActGrp, 'vm_edit_extend_rect_selection_left_char')
+        self.esm.setMapping(act, QsciScintilla.SCI_CHARLEFTRECTEXTEND)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Extend rectangular selection right one character'), 
+                      QApplication.translate('ViewManager', 
+                        'Extend rectangular selection right one character'), 
+                      QKeySequence(QApplication.translate('ViewManager', 
+                        'Alt+Ctrl+Right')), 
+                      0,
+                      self.editorActGrp, 'vm_edit_extend_rect_selection_right_char')
+        self.esm.setMapping(act, QsciScintilla.SCI_CHARRIGHTRECTEXTEND)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Extend rectangular selection to first'
+                        ' visible character in line'), 
+                      QApplication.translate('ViewManager', 
+                        'Extend rectangular selection to first'
+                        ' visible character in line'), 
+                      QKeySequence(QApplication.translate('ViewManager', 
+                        'Alt+Ctrl+Home')), 
+                      0,
+                      self.editorActGrp, 
+                      'vm_edit_extend_rect_selection_first_visible_char')
+        self.esm.setMapping(act, QsciScintilla.SCI_VCHOMERECTEXTEND)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Extend rectangular selection to end of line'), 
+                      QApplication.translate('ViewManager', 
+                        'Extend rectangular selection to end of line'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Alt+Ctrl+End')),
+                      0,
+                      self.editorActGrp, 'vm_edit_extend_rect_selection_end_line')
+        self.esm.setMapping(act, QsciScintilla.SCI_LINEENDRECTEXTEND)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Extend rectangular selection up one page'), 
+                      QApplication.translate('ViewManager', 
+                        'Extend rectangular selection up one page'), 
+                      QKeySequence(QApplication.translate('ViewManager', 
+                        'Alt+Ctrl+PgUp')), 
+                      0,
+                      self.editorActGrp, 'vm_edit_extend_rect_selection_up_page')
+        self.esm.setMapping(act, QsciScintilla.SCI_PAGEUPRECTEXTEND)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Extend rectangular selection down one page'), 
+                      QApplication.translate('ViewManager', 
+                        'Extend rectangular selection down one page'), 
+                      QKeySequence(QApplication.translate('ViewManager', 
+                        'Alt+Ctrl+PgDown')), 
+                      0,
+                      self.editorActGrp, 'vm_edit_extend_rect_selection_down_page')
+        self.esm.setMapping(act, QsciScintilla.SCI_PAGEDOWNRECTEXTEND)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        act = E4Action(QApplication.translate('ViewManager', 
+                        'Duplicate current selection'), 
+                      QApplication.translate('ViewManager', 
+                        'Duplicate current selection'), 
+                      QKeySequence(QApplication.translate('ViewManager', 'Ctrl+Shift+D')),
+                      0,
+                      self.editorActGrp, 'vm_edit_duplicate_current_selection')
+        self.esm.setMapping(act, QsciScintilla.SCI_SELECTIONDUPLICATE)
+        self.connect(act, SIGNAL('triggered()'), self.esm, SLOT('map()'))
+        self.editActions.append(act)
+        
+        self.__textEdit.addActions(self.editorActGrp.actions())
+    
+    def __createSearchActions(self):
+        """
+        Private method defining the user interface actions for the search commands.
+        """
+        self.searchAct = E4Action(QApplication.translate('ViewManager', 'Search'),
+                UI.PixmapCache.getIcon("find.png"),
+                QApplication.translate('ViewManager', '&Search...'),
+                QKeySequence(QApplication.translate('ViewManager', 
+                    "Ctrl+F", "Search|Search")), 
+                0,
+                self, 'vm_search')
+        self.searchAct.setStatusTip(QApplication.translate('ViewManager', 
+            'Search for a text'))
+        self.searchAct.setWhatsThis(QApplication.translate('ViewManager', 
+            """<b>Search</b>"""
+            """<p>Search for some text in the current editor. A"""
+            """ dialog is shown to enter the searchtext and options"""
+            """ for the search.</p>"""
+        ))
+        self.connect(self.searchAct, SIGNAL('triggered()'), self.__search)
+        self.searchActions.append(self.searchAct)
+        
+        self.searchNextAct = E4Action(QApplication.translate('ViewManager', 
+                    'Search next'),
+                UI.PixmapCache.getIcon("findNext.png"),
+                QApplication.translate('ViewManager', 'Search &next'),
+                QKeySequence(QApplication.translate('ViewManager', 
+                    "F3", "Search|Search next")), 
+                0,
+                self, 'vm_search_next')
+        self.searchNextAct.setStatusTip(QApplication.translate('ViewManager', 
+            'Search next occurrence of text'))
+        self.searchNextAct.setWhatsThis(QApplication.translate('ViewManager', 
+            """<b>Search next</b>"""
+            """<p>Search the next occurrence of some text in the current editor."""
+            """ The previously entered searchtext and options are reused.</p>"""
+        ))
+        self.connect(self.searchNextAct, SIGNAL('triggered()'), self.searchDlg.findNext)
+        self.searchActions.append(self.searchNextAct)
+        
+        self.searchPrevAct = E4Action(QApplication.translate('ViewManager', 
+                    'Search previous'),
+                UI.PixmapCache.getIcon("findPrev.png"),
+                QApplication.translate('ViewManager', 'Search &previous'),
+                QKeySequence(QApplication.translate('ViewManager', 
+                    "Shift+F3", "Search|Search previous")), 
+                0,
+                self, 'vm_search_previous')
+        self.searchPrevAct.setStatusTip(QApplication.translate('ViewManager', 
+            'Search previous occurrence of text'))
+        self.searchPrevAct.setWhatsThis(QApplication.translate('ViewManager', 
+            """<b>Search previous</b>"""
+            """<p>Search the previous occurrence of some text in the current editor."""
+            """ The previously entered searchtext and options are reused.</p>"""
+        ))
+        self.connect(self.searchPrevAct, SIGNAL('triggered()'), self.searchDlg.findPrev)
+        self.searchActions.append(self.searchPrevAct)
+        
+        self.searchClearMarkersAct = E4Action(QApplication.translate('ViewManager', 
+                    'Clear search markers'),
+                UI.PixmapCache.getIcon("findClear.png"),
+                QApplication.translate('ViewManager', 'Clear search markers'),
+                QKeySequence(QApplication.translate('ViewManager', 
+                    "Ctrl+3", "Search|Clear search markers")), 
+                0,
+                self, 'vm_clear_search_markers')
+        self.searchClearMarkersAct.setStatusTip(QApplication.translate('ViewManager', 
+            'Clear all displayed search markers'))
+        self.searchClearMarkersAct.setWhatsThis(QApplication.translate('ViewManager', 
+            """<b>Clear search markers</b>"""
+            """<p>Clear all displayed search markers.</p>"""
+        ))
+        self.connect(self.searchClearMarkersAct, SIGNAL('triggered()'), 
+            self.__searchClearMarkers)
+        self.searchActions.append(self.searchClearMarkersAct)
+        
+        self.replaceAct = E4Action(QApplication.translate('ViewManager', 'Replace'),
+                QApplication.translate('ViewManager', '&Replace...'),
+                QKeySequence(QApplication.translate('ViewManager', 
+                    "Ctrl+R", "Search|Replace")), 
+                0,
+                self, 'vm_search_replace')
+        self.replaceAct.setStatusTip(QApplication.translate('ViewManager', 
+            'Replace some text'))
+        self.replaceAct.setWhatsThis(QApplication.translate('ViewManager', 
+            """<b>Replace</b>"""
+            """<p>Search for some text in the current editor and replace it. A"""
+            """ dialog is shown to enter the searchtext, the replacement text"""
+            """ and options for the search and replace.</p>"""
+        ))
+        self.connect(self.replaceAct, SIGNAL('triggered()'), self.__replace)
+        self.searchActions.append(self.replaceAct)
+    
+    def __createHelpActions(self):
+        """
+        Private method to create the Help actions.
+        """
+        self.aboutAct = E4Action(self.trUtf8('About'),
+                self.trUtf8('&About'),
+                0, 0, self, 'about_eric')
+        self.aboutAct.setStatusTip(self.trUtf8('Display information about this software'))
+        self.aboutAct.setWhatsThis(self.trUtf8(
+            """<b>About</b>"""
+            """<p>Display some information about this software.</p>"""))
+        self.connect(self.aboutAct, SIGNAL('triggered()'), self.__about)
+        self.helpActions.append(self.aboutAct)
+        
+        self.aboutQtAct = E4Action(self.trUtf8('About Qt'),
+                self.trUtf8('About &Qt'), 0, 0, self, 'about_qt')
+        self.aboutQtAct.setStatusTip(\
+            self.trUtf8('Display information about the Qt toolkit'))
+        self.aboutQtAct.setWhatsThis(self.trUtf8(
+            """<b>About Qt</b>"""
+            """<p>Display some information about the Qt toolkit.</p>"""
+        ))
+        self.connect(self.aboutQtAct, SIGNAL('triggered()'), self.__aboutQt)
+        self.helpActions.append(self.aboutQtAct)
+        
+        self.whatsThisAct = E4Action(self.trUtf8('What\'s This?'), 
+            UI.PixmapCache.getIcon("whatsThis.png"),
+            self.trUtf8('&What\'s This?'), 
+            QKeySequence(self.trUtf8("Shift+F1","Help|What's This?'")), 
+            0, self, 'help_help_whats_this')
+        self.whatsThisAct.setStatusTip(self.trUtf8('Context sensitive help'))
+        self.whatsThisAct.setWhatsThis(self.trUtf8(
+                """<b>Display context sensitive help</b>"""
+                """<p>In What's This? mode, the mouse cursor shows an arrow with a"""
+                """ question mark, and you can click on the interface elements to get"""
+                """ a short description of what they do and how to use them. In"""
+                """ dialogs, this feature can be accessed using the context help button"""
+                """ in the titlebar.</p>"""
+        ))
+        self.connect(self.whatsThisAct, SIGNAL('triggered()'), self.__whatsThis)
+        self.helpActions.append(self.whatsThisAct)
+    
+    def __createMenus(self):
+        """
+        Private method to create the menus of the menu bar.
+        """
+        self.fileMenu = self.menuBar().addMenu(self.trUtf8("&File"))
+        self.fileMenu.addAction(self.newAct)
+        self.fileMenu.addAction(self.openAct)
+        self.fileMenu.addAction(self.saveAct)
+        self.fileMenu.addAction(self.saveAsAct)
+        self.fileMenu.addSeparator()
+        self.fileMenu.addAction(self.printPreviewAct)
+        self.fileMenu.addAction(self.printAct)
+        self.fileMenu.addSeparator()
+        self.fileMenu.addAction(self.closeAct)
+        
+        self.editMenu = self.menuBar().addMenu(self.trUtf8("&Edit"));
+        self.editMenu.addAction(self.undoAct)
+        self.editMenu.addAction(self.redoAct)
+        self.editMenu.addSeparator()
+        self.editMenu.addAction(self.cutAct)
+        self.editMenu.addAction(self.copyAct)
+        self.editMenu.addAction(self.pasteAct)
+        self.editMenu.addAction(self.deleteAct)
+        self.editMenu.addSeparator()
+        self.editMenu.addAction(self.searchAct)
+        self.editMenu.addAction(self.searchNextAct)
+        self.editMenu.addAction(self.searchPrevAct)
+        self.editMenu.addAction(self.searchClearMarkersAct)
+        self.editMenu.addAction(self.replaceAct)
+        
+        self.menuBar().addSeparator()
+        
+        self.helpMenu = self.menuBar().addMenu(self.trUtf8("&Help"))
+        self.helpMenu.addAction(self.aboutAct)
+        self.helpMenu.addAction(self.aboutQtAct)
+        self.helpMenu.addSeparator()
+        self.helpMenu.addAction(self.whatsThisAct)
+        
+        self.__initContextMenu()
+    
+    def __createToolBars(self):
+        """
+        Private method to create the various toolbars.
+        """
+        filetb = self.addToolBar(self.trUtf8("File"))
+        filetb.setIconSize(UI.Config.ToolBarIconSize)
+        filetb.addAction(self.newAct)
+        filetb.addAction(self.openAct)
+        filetb.addAction(self.saveAct)
+        filetb.addAction(self.saveAsAct)
+        filetb.addSeparator()
+        filetb.addAction(self.printPreviewAct)
+        filetb.addAction(self.printAct)
+        filetb.addSeparator()
+        filetb.addAction(self.closeAct)
+        
+        edittb = self.addToolBar(self.trUtf8("Edit"))
+        edittb.setIconSize(UI.Config.ToolBarIconSize)
+        edittb.addAction(self.undoAct)
+        edittb.addAction(self.redoAct)
+        edittb.addSeparator()
+        edittb.addAction(self.cutAct)
+        edittb.addAction(self.copyAct)
+        edittb.addAction(self.pasteAct)
+        edittb.addAction(self.deleteAct)
+        
+        findtb = self.addToolBar(self.trUtf8("Find"))
+        findtb.setIconSize(UI.Config.ToolBarIconSize)
+        findtb.addAction(self.searchAct)
+        findtb.addAction(self.searchNextAct)
+        findtb.addAction(self.searchPrevAct)
+        findtb.addAction(self.searchClearMarkersAct)
+        
+        helptb = self.addToolBar(self.trUtf8("Help"))
+        helptb.setIconSize(UI.Config.ToolBarIconSize)
+        helptb.addAction(self.whatsThisAct)
+    
+    def __createStatusBar(self):
+        """
+        Private method to initialize the status bar.
+        """
+        self.__statusBar = self.statusBar()
+        self.__statusBar.setSizeGripEnabled(True)
+
+        self.sbWritable = QLabel(self.__statusBar)
+        self.__statusBar.addPermanentWidget(self.sbWritable)
+        self.sbWritable.setWhatsThis(self.trUtf8(
+            """<p>This part of the status bar displays an indication of the"""
+            """ editors files writability.</p>"""
+        ))
+
+        self.sbLine = QLabel(self.__statusBar)
+        self.__statusBar.addPermanentWidget(self.sbLine)
+        self.sbLine.setWhatsThis(self.trUtf8(
+            """<p>This part of the status bar displays the line number of the"""
+            """ editor.</p>"""
+        ))
+
+        self.sbPos = QLabel(self.__statusBar)
+        self.__statusBar.addPermanentWidget(self.sbPos)
+        self.sbPos.setWhatsThis(self.trUtf8(
+            """<p>This part of the status bar displays the cursor position of"""
+            """ the editor.</p>"""
+        ))
+        
+        self.__statusBar.showMessage(self.trUtf8("Ready"))
+    
+    def __readSettings(self):
+        """
+        Private method to read the settings remembered last time.
+        """
+        settings = Preferences.Prefs.settings
+        pos = settings.value("MiniEditor/Position", QVariant(QPoint(0, 0))).toPoint()
+        size = settings.value("MiniEditor/Size", QVariant(QSize(800, 600))).toSize()
+        self.resize(size)
+        self.move(pos)
+    
+    def __writeSettings(self):
+        """
+        Private method to write the settings for reuse.
+        """
+        settings = Preferences.Prefs.settings
+        settings.setValue("MiniEditor/Position", QVariant(self.pos()))
+        settings.setValue("MiniEditor/Size", QVariant(self.size()))
+    
+    def __maybeSave(self):
+        """
+        Private method to ask the user to save the file, if it was modified.
+        
+        @return flag indicating, if it is ok to continue (boolean)
+        """
+        if self.__textEdit.isModified():
+            ret = QMessageBox.warning(self, 
+                    self.trUtf8("eric4 Mini Editor"),
+                    self.trUtf8("The document has been modified.\n"
+                            "Do you want to save your changes?"),
+                    QMessageBox.StandardButtons(\
+                        QMessageBox.Cancel | \
+                        QMessageBox.No | \
+                        QMessageBox.Yes),
+                    QMessageBox.Cancel)
+            if ret == QMessageBox.Yes:
+                return self.__save()
+            elif ret == QMessageBox.Cancel:
+                return False
+        return True
+    
+    def __loadFile(self, fileName, filetype = None):
+        """
+        Private method to load the given file.
+        
+        @param fileName name of the file to load (string)
+        @param filetype type of the source file (string)
+        """
+        file= QFile(fileName)
+        if not file.open(QFile.ReadOnly):
+            QMessageBox.warning(self, self.trUtf8("eric4 Mini Editor"),
+                                 self.trUtf8("Cannot read file {0}:\n{1}.")\
+                                    .format(fileName, file.errorString()))
+            return
+        
+        input = QTextStream(file)
+        QApplication.setOverrideCursor(Qt.WaitCursor)
+        txt = input.readAll()
+        self.__textEdit.setText(txt)
+        QApplication.restoreOverrideCursor()
+        
+        if filetype is None:
+            self.filetype = ""
+        else:
+            self.filetype = filetype
+        self.__setCurrentFile(fileName)
+        
+        fileEol = self.__textEdit.detectEolString(txt)
+        self.__textEdit.setEolModeByEolString(fileEol)
+        
+        self.__statusBar.showMessage(self.trUtf8("File loaded"), 2000)
+
+    def __saveFile(self, fileName):
+        """
+        Private method to save to the given file.
+        
+        @param fileName name of the file to save to (string)
+        @return flag indicating success (boolean)
+        """
+        file = QFile(fileName)
+        if not file.open(QFile.WriteOnly):
+            QMessageBox.warning(self, self.trUtf8("eric4 Mini Editor"),
+                                 self.trUtf8("Cannot write file {0}:\n{1}.")\
+                                 .format(fileName, file.errorString()))
+        
+            self.__checkActions()
+            
+            return False
+        
+        out = QTextStream(file)
+        QApplication.setOverrideCursor(Qt.WaitCursor)
+        out << self.__textEdit.text()
+        QApplication.restoreOverrideCursor()
+        self.emit(SIGNAL("editorSaved"))
+        
+        self.__setCurrentFile(fileName)
+        self.__statusBar.showMessage(self.trUtf8("File saved"), 2000)
+        
+        self.__checkActions()
+        
+        return True
+
+    def __setCurrentFile(self, fileName):
+        """
+        Private method to register the file name of the current file.
+        
+        @param fileName name of the file to register (string)
+        """
+        self.__curFile = fileName
+        
+        if not self.__curFile:
+            shownName = self.trUtf8("Untitled")
+        else:
+            shownName = self.__strippedName(self.__curFile)
+        
+        self.setWindowTitle(self.trUtf8("{0}[*] - {1}")\
+                            .format(shownName, self.trUtf8("Mini Editor")))
+        
+        self.__textEdit.setModified(False)
+        self.setWindowModified(False)
+        
+        try:
+            line0 = self.readLine0(self.__curFile)
+        except IOError:
+            line0 = ""
+        self.setLanguage(self.__bindName(line0))
+
+    def getFileName(self):
+        """
+        Public method to return the name of the file being displayed.
+        
+        @return filename of the displayed file (string)
+        """
+        return self.__curFile
+    
+    def __strippedName(self, fullFileName):
+        """
+        Private method to return the filename part of the given path.
+        
+        @param fullFileName full pathname of the given file (string)
+        @return filename part (string)
+        """
+        return QFileInfo(fullFileName).fileName()
+
+    def __modificationChanged(self, m):
+        """
+        Private slot to handle the modificationChanged signal. 
+        
+        @param m modification status
+        """
+        self.setWindowModified(m)
+        self.__checkActions()
+    
+    def __cursorPositionChanged(self, line, pos):
+        """
+        Private slot to handle the cursorPositionChanged signal. 
+        
+        @param line line number of the cursor
+        @param pos position in line of the cursor
+        """
+        self.__setSbFile(line + 1, pos)
+        
+        if Preferences.getEditor("MarkOccurrencesEnabled"):
+            self.__markOccurrencesTimer.stop()
+            self.__markOccurrencesTimer.start()
+    
+    def __undo(self):
+        """
+        Public method to undo the last recorded change.
+        """
+        self.__textEdit.undo()
+        self.__checkActions()
+    
+    def __redo(self):
+        """
+        Public method to redo the last recorded change.
+        """
+        self.__textEdit.redo()
+        self.__checkActions()
+    
+    def __selectAll(self):
+        """
+        Private slot handling the select all context menu action.
+        """
+        self.__textEdit.selectAll(True)
+    
+    def __deselectAll(self):
+        """
+        Private slot handling the deselect all context menu action.
+        """
+        self.__textEdit.selectAll(False)
+    
+    def __setMargins(self):
+        """
+        Private method to configure the margins.
+        """
+        # set the settings for all margins
+        self.__textEdit.setMarginsFont(Preferences.getEditorOtherFonts("MarginsFont"))
+        self.__textEdit.setMarginsForegroundColor(
+            Preferences.getEditorColour("MarginsForeground"))
+        self.__textEdit.setMarginsBackgroundColor(
+            Preferences.getEditorColour("MarginsBackground"))
+        
+        # set margin 0 settings
+        linenoMargin = Preferences.getEditor("LinenoMargin")
+        self.__textEdit.setMarginLineNumbers(0, linenoMargin)
+        if linenoMargin:
+            self.__textEdit.setMarginWidth(0, 
+                ' ' + '8' * Preferences.getEditor("LinenoWidth"))
+        else:
+            self.__textEdit.setMarginWidth(0, 16)
+        
+        # set margin 1 settings
+        self.__textEdit.setMarginWidth(1, 0)
+        
+        # set margin 2 settings
+        self.__textEdit.setMarginWidth(2, 16)
+        if Preferences.getEditor("FoldingMargin"):
+            folding = Preferences.getEditor("FoldingStyle")
+            try:
+                folding = QsciScintilla.FoldStyle(folding)
+            except AttributeError:
+                pass
+            self.__textEdit.setFolding(folding)
+            self.__textEdit.setFoldMarginColors(
+                Preferences.getEditorColour("FoldmarginBackground"), 
+                Preferences.getEditorColour("FoldmarginBackground"))
+        else:
+            self.__textEdit.setFolding(QsciScintilla.NoFoldStyle)
+    
+    def __setTextDisplay(self):
+        """
+        Private method to configure the text display.
+        """
+        self.__textEdit.setTabWidth(Preferences.getEditor("TabWidth"))
+        self.__textEdit.setIndentationWidth(Preferences.getEditor("IndentWidth"))
+        if self.lexer_ and self.lexer_.alwaysKeepTabs():
+            self.__textEdit.setIndentationsUseTabs(True)
+        else:
+            self.__textEdit.setIndentationsUseTabs(\
+                Preferences.getEditor("TabForIndentation"))
+        self.__textEdit.setTabIndents(Preferences.getEditor("TabIndents"))
+        self.__textEdit.setBackspaceUnindents(Preferences.getEditor("TabIndents"))
+        self.__textEdit.setIndentationGuides(Preferences.getEditor("IndentationGuides"))
+        if Preferences.getEditor("ShowWhitespace"):
+            self.__textEdit.setWhitespaceVisibility(QsciScintilla.WsVisible)
+        else:
+            self.__textEdit.setWhitespaceVisibility(QsciScintilla.WsInvisible)
+        self.__textEdit.setEolVisibility(Preferences.getEditor("ShowEOL"))
+        self.__textEdit.setAutoIndent(Preferences.getEditor("AutoIndentation"))
+        if Preferences.getEditor("BraceHighlighting"):
+            self.__textEdit.setBraceMatching(QsciScintilla.SloppyBraceMatch)
+        else:
+            self.__textEdit.setBraceMatching(QsciScintilla.NoBraceMatch)
+        self.__textEdit.setMatchedBraceForegroundColor(
+            Preferences.getEditorColour("MatchingBrace"))
+        self.__textEdit.setMatchedBraceBackgroundColor(
+            Preferences.getEditorColour("MatchingBraceBack"))
+        self.__textEdit.setUnmatchedBraceForegroundColor(
+            Preferences.getEditorColour("NonmatchingBrace"))
+        self.__textEdit.setUnmatchedBraceBackgroundColor(
+            Preferences.getEditorColour("NonmatchingBraceBack"))
+        if Preferences.getEditor("CustomSelectionColours"):
+            self.__textEdit.setSelectionBackgroundColor(\
+                Preferences.getEditorColour("SelectionBackground"))
+        else:
+            self.__textEdit.setSelectionBackgroundColor(\
+                QApplication.palette().color(QPalette.Highlight))
+        if Preferences.getEditor("ColourizeSelText"):
+            self.__textEdit.resetSelectionForegroundColor()
+        elif Preferences.getEditor("CustomSelectionColours"):
+            self.__textEdit.setSelectionForegroundColor(\
+                Preferences.getEditorColour("SelectionForeground"))
+        else:
+            self.__textEdit.setSelectionForegroundColor(\
+                QApplication.palette().color(QPalette.HighlightedText))
+        self.__textEdit.setSelectionToEol(Preferences.getEditor("ExtendSelectionToEol"))
+        self.__textEdit.setCaretForegroundColor(
+            Preferences.getEditorColour("CaretForeground"))
+        self.__textEdit.setCaretLineBackgroundColor(
+            Preferences.getEditorColour("CaretLineBackground"))
+        self.__textEdit.setCaretLineVisible(Preferences.getEditor("CaretLineVisible"))
+        self.caretWidth = Preferences.getEditor("CaretWidth")
+        self.__textEdit.setCaretWidth(self.caretWidth)
+        self.useMonospaced = Preferences.getEditor("UseMonospacedFont")
+        self.__setMonospaced(self.useMonospaced)
+        edgeMode = Preferences.getEditor("EdgeMode")
+        edge = QsciScintilla.EdgeMode(edgeMode)
+        self.__textEdit.setEdgeMode(edge)
+        if edgeMode:
+            self.__textEdit.setEdgeColumn(Preferences.getEditor("EdgeColumn"))
+            self.__textEdit.setEdgeColor(Preferences.getEditorColour("Edge"))
+        
+        if Preferences.getEditor("WrapLongLines"):
+            self.__textEdit.setWrapMode(QsciScintilla.WrapWord)
+            self.__textEdit.setWrapVisualFlags(\
+                QsciScintilla.WrapFlagByBorder, QsciScintilla.WrapFlagByBorder)
+        else:
+            self.__textEdit.setWrapMode(QsciScintilla.WrapNone)
+            self.__textEdit.setWrapVisualFlags(\
+                QsciScintilla.WrapFlagNone, QsciScintilla.WrapFlagNone)
+        
+        self.searchIndicator = QsciScintilla.INDIC_CONTAINER
+        self.__textEdit.indicatorDefine(self.searchIndicator, QsciScintilla.INDIC_BOX, 
+            Preferences.getEditorColour("SearchMarkers"))
+    
+    def __setEolMode(self):
+        """
+        Private method to configure the eol mode of the editor.
+        """
+        eolMode = Preferences.getEditor("EOLMode")
+        eolMode = QsciScintilla.EolMode(eolMode)
+        self.__textEdit.setEolMode(eolMode)
+        
+    def __setMonospaced(self, on):
+        """
+        Private method to set/reset a monospaced font.
+        
+        @param on flag to indicate usage of a monospace font (boolean)
+        """
+        if on:
+            f = Preferences.getEditorOtherFonts("MonospacedFont")
+            self.__textEdit.monospacedStyles(f)
+        else:
+            if not self.lexer_:
+                self.__textEdit.clearStyles()
+                self.__setMargins()
+            self.__textEdit.setFont(Preferences.getEditorOtherFonts("DefaultFont"))
+        
+        self.useMonospaced = on
+    
+    def __printFile(self):
+        """
+        Private slot to print the text.
+        """
+        printer = Printer(mode = QPrinter.HighResolution)
+        sb = self.statusBar()
+        printDialog = QPrintDialog(printer, self)
+        if self.__textEdit.hasSelectedText():
+            printDialog.addEnabledOption(QAbstractPrintDialog.PrintSelection)
+        if printDialog.exec_() == QDialog.Accepted:
+            sb.showMessage(self.trUtf8('Printing...'))
+            QApplication.processEvents()
+            if self.__curFile:
+                printer.setDocName(QFileInfo(self.__curFile).fileName())
+            else:
+                printer.setDocName(self.trUtf8("Untitled"))
+            if printDialog.printRange() == QAbstractPrintDialog.Selection:
+                # get the selection
+                fromLine, fromIndex, toLine, toIndex = self.__textEdit.getSelection()
+                if toIndex == 0:
+                    toLine -= 1
+                # Qscintilla seems to print one line more than told
+                res = printer.printRange(self.__textEdit, fromLine, toLine-1)
+            else:
+                res = printer.printRange(self.__textEdit)
+            if res:
+                sb.showMessage(self.trUtf8('Printing completed'), 2000)
+            else:
+                sb.showMessage(self.trUtf8('Error while printing'), 2000)
+            QApplication.processEvents()
+        else:
+            sb.showMessage(self.trUtf8('Printing aborted'), 2000)
+            QApplication.processEvents()
+    
+    def __printPreviewFile(self):
+        """
+        Private slot to show a print preview of the text.
+        """
+        from PyQt4.QtGui import QPrintPreviewDialog
+        
+        printer = Printer(mode = QPrinter.HighResolution)
+        if self.__curFile:
+            printer.setDocName(QFileInfo(self.__curFile).fileName())
+        else:
+            printer.setDocName(self.trUtf8("Untitled"))
+        preview = QPrintPreviewDialog(printer, self)
+        self.connect(preview, SIGNAL("paintRequested(QPrinter*)"), self.__printPreview)
+        preview.exec_()
+    
+    def __printPreview(self, printer):
+        """
+        Private slot to generate a print preview.
+        
+        @param printer reference to the printer object (QScintilla.Printer.Printer)
+        """
+        printer.printRange(self.__textEdit)
+    
+    #########################################################
+    ## Methods needed by the context menu
+    #########################################################
+    
+    def __contextMenuRequested(self, coord):
+        """
+        Private slot to show the context menu.
+        
+        @param coord the position of the mouse pointer (QPoint)
+        """
+        self.contextMenu.popup(self.mapToGlobal(coord))
+    
+    def __initContextMenu(self):
+        """
+        Private method used to setup the context menu
+        """
+        self.contextMenu = QMenu()
+        
+        self.languagesMenu = self.__initContextMenuLanguages()
+        
+        self.contextMenu.addAction(self.undoAct)
+        self.contextMenu.addAction(self.redoAct)
+        self.contextMenu.addSeparator()
+        self.contextMenu.addAction(self.cutAct)
+        self.contextMenu.addAction(self.copyAct)
+        self.contextMenu.addAction(self.pasteAct)
+        self.contextMenu.addSeparator()
+        self.contextMenu.addAction(self.trUtf8('Select all'), self.__selectAll)
+        self.contextMenu.addAction(self.trUtf8('Deselect all'), self.__deselectAll)
+        self.contextMenu.addSeparator()
+        self.languagesMenuAct = self.contextMenu.addMenu(self.languagesMenu)
+        self.contextMenu.addSeparator()
+        self.contextMenu.addAction(self.printPreviewAct)
+        self.contextMenu.addAction(self.printAct)
+    
+    def __initContextMenuLanguages(self):
+        """
+        Private method used to setup the Languages context sub menu.
+        """
+        menu = QMenu(self.trUtf8("Languages"))
+        
+        self.languagesActGrp = QActionGroup(self)
+        self.noLanguageAct = menu.addAction(self.trUtf8("No Language"))
+        self.noLanguageAct.setCheckable(True)
+        self.noLanguageAct.setData(QVariant("None"))
+        self.languagesActGrp.addAction(self.noLanguageAct)
+        menu.addSeparator()
+        
+        self.supportedLanguages = {}
+        supportedLanguages = Lexers.getSupportedLanguages()
+        languages = supportedLanguages.keys()
+        languages.sort()
+        for language in languages:
+            if language != "Guessed":
+                self.supportedLanguages[language] = supportedLanguages[language][:]
+                act = menu.addAction(self.supportedLanguages[language][0])
+                act.setCheckable(True)
+                act.setData(QVariant(language))
+                self.supportedLanguages[language].append(act)
+                self.languagesActGrp.addAction(act)
+        
+        menu.addSeparator()
+        self.pygmentsAct = menu.addAction(self.trUtf8("Guessed"))
+        self.pygmentsAct.setCheckable(True)
+        self.pygmentsAct.setData(QVariant("Guessed"))
+        self.languagesActGrp.addAction(self.pygmentsAct)
+        self.pygmentsSelAct = menu.addAction(self.trUtf8("Alternatives"))
+        self.pygmentsSelAct.setData(QVariant("Alternatives"))
+        
+        self.connect(menu, SIGNAL('triggered(QAction *)'), self.__languageMenuTriggered)
+        self.connect(menu, SIGNAL('aboutToShow()'), self.__showContextMenuLanguages)
+        
+        return menu
+    
+    def __showContextMenuLanguages(self):
+        """
+        Private slot handling the aboutToShow signal of the languages context menu.
+        """
+        if self.apiLanguage.startswith("Pygments|"):
+            self.pygmentsSelAct.setText(
+                self.trUtf8("Alternatives ({0})").format(self.getLanguage()))
+        else:
+            self.pygmentsSelAct.setText(self.trUtf8("Alternatives"))
+    
+    def __selectPygmentsLexer(self):
+        """
+        Private method to select a specific pygments lexer.
+        
+        @return name of the selected pygments lexer (string)
+        """
+        from pygments.lexers import get_all_lexers
+        lexerList = sorted([l[0] for l in get_all_lexers()])
+        try:
+            lexerSel = lexerList.index(self.getLanguage())
+        except ValueError:
+            lexerSel = 0
+        lexerName, ok = QInputDialog.getItem(\
+            self,
+            self.trUtf8("Pygments Lexer"),
+            self.trUtf8("Select the Pygments lexer to apply."),
+            lexerList,
+            lexerSel, 
+            False)
+        if ok and lexerName:
+            return lexerName
+        else:
+            return ""
+    
+    def __languageMenuTriggered(self, act):
+        """
+        Private method to handle the selection of a lexer language.
+        
+        @param act reference to the action that was triggered (QAction)
+        """
+        if act == self.noLanguageAct:
+            self.__resetLanguage()
+        elif act == self.pygmentsAct:
+            self.setLanguage("dummy.pygments")
+        elif act == self.pygmentsSelAct:
+            language = self.__selectPygmentsLexer()
+            if language:
+                self.setLanguage("dummy.pygments", pyname = language)
+        else:
+            language = act.data().toString()
+            if language:
+                self.setLanguage(self.supportedLanguages[language][1])
+        
+    def __resetLanguage(self):
+        """
+        Private method used to reset the language selection.
+        """
+        if self.lexer_ is not None and \
+           (self.lexer_.lexer() == "container" or self.lexer_.lexer() is None):
+            self.disconnect(self.__textEdit, SIGNAL("SCN_STYLENEEDED(int)"), 
+                            self.__styleNeeded)
+        
+        self.apiLanguage = ""
+        self.lexer_ = None
+        self.__textEdit.setLexer()
+        self.__setMonospaced(self.useMonospaced)
+        
+    def setLanguage(self, filename, initTextDisplay = True, pyname = ""):
+        """
+        Public method to set a lexer language.
+        
+        @param filename filename used to determine the associated lexer language (string)
+        @param initTextDisplay flag indicating an initialization of the text display
+            is required as well (boolean)
+        @keyparam pyname name of the pygments lexer to use (string)
+        """
+        self.__bindLexer(filename, pyname = pyname)
+        self.__textEdit.recolor()
+        self.__checkLanguage()
+        
+        # set the text display
+        if initTextDisplay:
+            self.__setTextDisplay()
+            self.__setMargins()
+
+    def getLanguage(self):
+        """
+        Public method to retrieve the language of the editor.
+        
+        @return language of the editor (string)
+        """
+        if self.apiLanguage == "Guessed" or self.apiLanguage.startswith("Pygments|"):
+            return self.lexer_.name()
+        else:
+            return self.apiLanguage
+    
+    def __checkLanguage(self):
+        """
+        Private method to check the selected language of the language submenu.
+        """
+        if self.apiLanguage == "":
+            self.noLanguageAct.setChecked(True)
+        elif self.apiLanguage == "Guessed":
+            self.pygmentsAct.setChecked(True)
+        elif self.apiLanguage.startswith("Pygments|"):
+            act = self.languagesActGrp.checkedAction()
+            if act:
+                act.setChecked(False)
+        else:
+            self.supportedLanguages[self.apiLanguage][2].setChecked(True)
+    
+    def __bindLexer(self, filename, pyname = ""):
+        """
+        Private slot to set the correct lexer depending on language.
+        
+        @param filename filename used to determine the associated lexer language (string)
+        @keyparam pyname name of the pygments lexer to use (string)
+        """
+        if self.lexer_ is not None and \
+           (self.lexer_.lexer() == "container" or self.lexer_.lexer() is None):
+            self.disconnect(self.__textEdit, SIGNAL("SCN_STYLENEEDED(int)"), 
+                            self.__styleNeeded)
+        
+        filename = os.path.basename(filename)
+        language = Preferences.getEditorLexerAssoc(filename)
+        if language.startswith("Pygments|"):
+            pyname = language.split("|", 1)[1]
+            language = ""
+        
+        self.lexer_ = Lexers.getLexer(language, self.__textEdit, pyname = pyname)
+        if self.lexer_ is None:
+            self.__textEdit.setLexer()
+            self.apiLanguage = ""
+            return
+        
+        if pyname:
+            self.apiLanguage = "Pygments|%s" % pyname
+        else:
+            self.apiLanguage = self.lexer_.language()
+        self.__textEdit.setLexer(self.lexer_)
+        if self.lexer_.lexer() == "container" or self.lexer_.lexer() is None:
+            self.__textEdit.setStyleBits(self.lexer_.styleBitsNeeded())
+            self.connect(self.__textEdit, SIGNAL("SCN_STYLENEEDED(int)"), 
+                         self.__styleNeeded)
+        
+        # get the font for style 0 and set it as the default font
+        key = 'Scintilla/%s/style0/font' % self.lexer_.language()
+        fontVariant = Preferences.Prefs.settings.value(key)
+        if fontVariant.isValid():
+            fdesc = fontVariant.toStringList()
+            font = QFont(fdesc[0], int(str(fdesc[1])))
+            self.lexer_.setDefaultFont(font)
+        self.lexer_.readSettings(Preferences.Prefs.settings, "Scintilla")
+        
+        # now set the lexer properties
+        self.lexer_.initProperties()
+        
+        # initialize the auto indent style of the lexer
+        ais = self.lexer_.autoIndentStyle()
+        
+    def __styleNeeded(self, position):
+        """
+        Private slot to handle the need for more styling.
+        
+        @param position end position, that needs styling (integer)
+        """
+        self.lexer_.styleText(self.__textEdit.getEndStyled(), position)
+    
+    def __bindName(self, line0):
+        """
+        Private method to generate a dummy filename for binding a lexer.
+        
+        @param line0 first line of text to use in the generation process (string)
+        """
+        bindName = self.__curFile
+        
+        if line0.startswith("<?xml"):
+            # override extension for XML files
+            bindName = "dummy.xml"
+        
+        # check filetype
+        if self.filetype == "Python":
+            bindName = "dummy.py"
+        elif self.filetype == "Ruby":
+            bindName = "dummy.rb"
+        elif self.filetype == "D":
+            bindName = "dummy.d"
+        elif self.filetype == "Properties":
+            bindName = "dummy.ini"
+        
+        # #! marker detection
+        if line0.startswith("#!"):
+            if "python3" in line0:
+                bindName = "dummy.py"
+                self.filetype = "Python3"
+            elif "python2" in line0:
+                bindName = "dummy.py"
+                self.filetype = "Python"
+            elif "python" in line0:
+                bindName = "dummy.py"
+                self.filetype = "Python"
+            elif ("/bash" in line0 or "/sh" in line0):
+                bindName = "dummy.sh"
+            elif "ruby" in line0:
+                bindName = "dummy.rb"
+                self.filetype = "Ruby"
+            elif "perl" in line0:
+                bindName = "dummy.pl"
+            elif "lua" in line0:
+                bindName = "dummy.lua"
+            elif "dmd" in line0:
+                bindName = "dummy.d"
+                self.filetype = "D"
+        return bindName
+    
+    def readLine0(self, fn, createIt = False):
+        """
+        Public slot to read the first line from a file.
+        
+        @param fn filename to read from (string)
+        @param createIt flag indicating the creation of a new file, if the given
+            one doesn't exist (boolean)
+        @return first line of the file (string)
+        """
+        if not fn:
+            return ""
+        
+        try:
+            if createIt and not os.path.exists(fn):
+                f = open(fn, "wb")
+                f.close()
+            f = open(fn, 'rb')
+        except IOError:
+            QMessageBox.critical(self, self.trUtf8('Open File'),
+                self.trUtf8('<p>The file <b>{0}</b> could not be opened.</p>')
+                    .format(fn))
+            raise
+        
+        txt = f.readline()
+        f.close()
+        return txt
+    
+    ##########################################################
+    ## Methods needed for the search functionality
+    ##########################################################
+    
+    def getSRHistory(self, key):
+        """
+        Public method to get the search or replace history list.
+        
+        @param key list to return (must be 'search' or 'replace')
+        @return the requested history list (list of strings)
+        """
+        return self.srHistory[key][:]
+    
+    def textForFind(self):
+        """
+        Public method to determine the selection or the current word for the next 
+        find operation.
+        
+        @return selection or current word (string)
+        """
+        if self.__textEdit.hasSelectedText():
+            text = self.__textEdit.selectedText()
+            if '\r' in text or '\n' in text:
+                # the selection contains at least a newline, it is
+                # unlikely to be the expression to search for
+                return ''
+            
+            return text
+        
+        # no selected text, determine the word at the current position
+        return self.__getCurrentWord()
+    
+    def __getWord(self, line, index):
+        """
+        Private method to get the word at a position.
+        
+        @param line number of line to look at (int)
+        @param index position to look at (int)
+        @return the word at that position (string)
+        """
+        text = self.__textEdit.text(line)
+        if self.__textEdit.caseSensitive():
+            cs = Qt.CaseSensitive
+        else:
+            cs = Qt.CaseInsensitive
+        wc = self.__textEdit.wordCharacters()
+        if wc is None:
+            regExp = QRegExp('[^\w_]', cs)
+        else:
+            regExp = QRegExp('[^%s]' % re.escape(wc), cs)
+        start = regExp.lastIndexIn(text, index) + 1
+        end = regExp.indexIn(text, index)
+        if start == end + 1 and index > 0:
+            # we are on a word boundary, try again
+            start = regExp.lastIndexIn(text, index - 1) + 1
+        if start == -1:
+            start = 0
+        if end == -1:
+            end = len(text)
+        if end > start:
+            word = text[start:end]
+        else:
+            word = ''
+        return word
+    
+    def __getCurrentWord(self):
+        """
+        Private method to get the word at the current position.
+        
+        @return the word at that current position
+        """
+        line, index = self.__textEdit.getCursorPosition()
+        return self.__getWord(line, index)
+    
+    def __search(self):
+        """
+        Private method to handle the search action.
+        """
+        self.replaceDlg.close()
+        self.searchDlg.show(self.textForFind())
+    
+    def __searchClearMarkers(self):
+        """
+        Private method to clear the search markers of the active window.
+        """
+        self.clearSearchIndicators()
+    
+    def __replace(self):
+        """
+        Private method to handle the replace action.
+        """
+        self.searchDlg.close()
+        self.replaceDlg.show(self.textForFind())
+    
+    def activeWindow(self):
+        """
+        Public method to fulfill the ViewManager interface.
+        
+        @return reference to the text edit component (QsciScintillaCompat)
+        """
+        return self.__textEdit
+    
+    def setSearchIndicator(self, startPos, indicLength):
+        """
+        Public method to set a search indicator for the given range.
+        
+        @param startPos start position of the indicator (integer)
+        @param indicLength length of the indicator (integer)
+        """
+        self.__textEdit.setIndicatorRange(self.searchIndicator, startPos, indicLength)
+    
+    def clearSearchIndicators(self):
+        """
+        Public method to clear all search indicators.
+        """
+        self.__textEdit.clearAllIndicators(self.searchIndicator)
+        self.__markedText = ""
+    
+    def __markOccurrences(self):
+        """
+        Private method to mark all occurrences of the current word.
+        """
+        word = self.__getCurrentWord()
+        if not word:
+            self.clearSearchIndicators()
+            return
+        
+        if self.__markedText == word:
+            return
+        
+        self.clearSearchIndicators()
+        ok = self.__textEdit.findFirstTarget(word, 
+            False, self.__textEdit.caseSensitive(), True, 
+            0, 0)
+        while ok:
+            tgtPos, tgtLen = self.__textEdit.getFoundTarget()
+            self.setSearchIndicator(tgtPos, tgtLen)
+            ok = self.__textEdit.findNextTarget()
+        self.__markedText = word
+    
+    ##########################################################
+    ## Methods exhibiting some QScintilla API methods
+    ##########################################################
+    
+    def setText(self, txt, filetype = None):
+        """
+        Public method to set the text programatically.
+        
+        @param txt text to be set (string)
+        @param filetype type of the source file (string)
+        """
+        self.__textEdit.setText(txt)
+        
+        if filetype is None:
+            self.filetype = ""
+        else:
+            self.filetype = filetype
+        
+        fileEol = self.__textEdit.detectEolString(txt)
+        self.__textEdit.setEolModeByEolString(fileEol)
+        
+        self.__textEdit.setModified(False)

eric ide

mercurial