QScintilla/Editor.py

changeset 2164
d67b14a3f884
parent 2163
2b02339f52bf
child 2165
f89fc1162ffe
--- a/QScintilla/Editor.py	Sun Oct 28 17:41:29 2012 +0100
+++ b/QScintilla/Editor.py	Sun Oct 28 20:19:15 2012 +0100
@@ -249,8 +249,11 @@
         
         # define the margins markers
         changePixmap = QPixmap(16, 16)
-        changePixmap.fill(Preferences.getEditorColour("OnlineChangeTraceMarker"))
-        self.__changeMarker = self.markerDefine(changePixmap)
+        changePixmap.fill(Preferences.getEditorColour("OnlineChangeTraceMarkerSaved"))
+        self.__changeMarkerSaved = self.markerDefine(changePixmap)
+        changePixmap = QPixmap(16, 16)
+        changePixmap.fill(Preferences.getEditorColour("OnlineChangeTraceMarkerUnsaved"))
+        self.__changeMarkerUnsaved = self.markerDefine(changePixmap)
         self.breakpoint = \
             self.markerDefine(UI.PixmapCache.getPixmap("break.png"))
         self.cbreakpoint = \
@@ -283,6 +286,9 @@
                               (1 << self.tcbreakpoint) | \
                               (1 << self.dbreakpoint)
         
+        self.changeMarkersMask = (1 << self.__changeMarkerSaved) | \
+                                 (1 << self.__changeMarkerUnsaved)
+        
         # configure the margins
         self.__setMarginsDisplay()
         
@@ -2397,6 +2403,7 @@
         """
         self.__hasChangeMarkers = False
         self.__oldText = self.text()
+        self.__lastSavedText = self.text()
         self.__onlineChangeTraceTimer = QTimer(self)
         self.__onlineChangeTraceTimer.setSingleShot(True)
         self.__onlineChangeTraceTimer.setInterval(
@@ -2419,14 +2426,26 @@
         """
         self.__deleteAllChangeMarkers()
         
+        # step 1: mark saved changes
         oldL = self.__oldText.splitlines()
+        newL = self.__lastSavedText.splitlines()
+        matcher = difflib.SequenceMatcher(None, oldL, newL)
+        
+        for token, i1, i2, j1, j2 in matcher.get_opcodes():
+            if token in ["insert", "replace"]:
+                for lineNo in range(j1, j2):
+                    self.markerAdd(lineNo, self.__changeMarkerSaved)
+                    self.__hasChangeMarkers = True
+        
+        # step 2: mark unsaved changes
+        oldL = self.__lastSavedText.splitlines()
         newL = self.text().splitlines()
         matcher = difflib.SequenceMatcher(None, oldL, newL)
         
         for token, i1, i2, j1, j2 in matcher.get_opcodes():
             if token in ["insert", "replace"]:
                 for lineNo in range(j1, j2):
-                    self.markerAdd(lineNo, self.__changeMarker)
+                    self.markerAdd(lineNo, self.__changeMarkerUnsaved)
                     self.__hasChangeMarkers = True
         
         if self.__hasChangeMarkers:
@@ -2436,14 +2455,26 @@
         """
         Private slot to reset the online change trace info.
         """
-        self.__oldText = self.text()
+        self.__lastSavedText = self.text()
         self.__deleteAllChangeMarkers()
         
+        # mark saved changes
+        oldL = self.__oldText.splitlines()
+        newL = self.__lastSavedText.splitlines()
+        matcher = difflib.SequenceMatcher(None, oldL, newL)
+        
+        for token, i1, i2, j1, j2 in matcher.get_opcodes():
+            if token in ["insert", "replace"]:
+                for lineNo in range(j1, j2):
+                    self.markerAdd(lineNo, self.__changeMarkerSaved)
+                    self.__hasChangeMarkers = True
+        
     def __deleteAllChangeMarkers(self):
         """
         Private slot to delete all change markers.
         """
-        self.markerDeleteAll(self.__changeMarker)
+        self.markerDeleteAll(self.__changeMarkerUnsaved)
+        self.markerDeleteAll(self.__changeMarkerSaved)
         self.__hasChangeMarkers = False
         self.changeMarkersUpdated.emit(self)
         
@@ -2464,10 +2495,10 @@
             line = 0
         else:
             line += 1
-        changeline = self.markerFindNext(line, 1 << self.__changeMarker)
+        changeline = self.markerFindNext(line, self.changeMarkersMask)
         if changeline < 0:
             # wrap around
-            changeline = self.markerFindNext(0, 1 << self.__changeMarker)
+            changeline = self.markerFindNext(0, self.changeMarkersMask)
         if changeline >= 0:
             self.setCursorPosition(changeline, 0)
             self.ensureLineVisible(changeline)
@@ -2481,11 +2512,10 @@
             line = self.lines() - 1
         else:
             line -= 1
-        changeline = self.markerFindPrevious(line, 1 << self.__changeMarker)
+        changeline = self.markerFindPrevious(line, self.changeMarkersMask)
         if changeline < 0:
             # wrap around
-            changeline = self.markerFindPrevious(
-                self.lines() - 1, 1 << self.__changeMarker)
+            changeline = self.markerFindPrevious(self.lines() - 1, self.changeMarkersMask)
         if changeline >= 0:
             self.setCursorPosition(changeline, 0)
             self.ensureLineVisible(changeline)
@@ -3658,8 +3688,11 @@
             self.__onlineChangeTraceTimer.stop()
             self.__deleteAllChangeMarkers()
         changePixmap = QPixmap(16, 16)
-        changePixmap.fill(Preferences.getEditorColour("OnlineChangeTraceMarker"))
-        self.markerDefine(changePixmap, self.__changeMarker)
+        changePixmap.fill(Preferences.getEditorColour("OnlineChangeTraceMarkerUnsaved"))
+        self.markerDefine(changePixmap, self.__changeMarkerUnsaved)
+        changePixmap = QPixmap(16, 16)
+        changePixmap.fill(Preferences.getEditorColour("OnlineChangeTraceMarkerSaved"))
+        self.markerDefine(changePixmap, self.__changeMarkerSaved)
         
         # refresh the annotations display
         self.__refreshAnnotations()
@@ -3707,7 +3740,8 @@
                           (1 << self.notcovered) | \
                           (1 << self.taskmarker) | \
                           (1 << self.warning) | \
-                          (1 << self.__changeMarker)
+                          (1 << self.__changeMarkerUnsaved) | \
+                          (1 << self.__changeMarkerSaved)
             self.setMarginWidth(1, 16)
             self.setMarginSensitivity(1, True)
             self.setMarginMarkerMask(1, margin1Mask)
@@ -3742,7 +3776,8 @@
                               (1 << self.notcovered) | \
                               (1 << self.taskmarker) | \
                               (1 << self.warning) | \
-                              (1 << self.__changeMarker)
+                              (1 << self.__changeMarkerUnsaved) | \
+                              (1 << self.__changeMarkerSaved)
             self.setMarginWidth(self.__indicMargin, 16)
             self.setMarginSensitivity(self.__indicMargin, True)
             self.setMarginMarkerMask(self.__indicMargin, marginIndicMask)

eric ide

mercurial