Fixed an issue in the editor related to unicode handling.

Fri, 13 Aug 2010 11:15:18 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Fri, 13 Aug 2010 11:15:18 +0200
changeset 502
7500b9d5b21d
parent 501
5c615a85241a
child 506
6c2ca1e8223a

Fixed an issue in the editor related to unicode handling.

APIs/Python3/eric5.api file | annotate | diff | comparison | revisions
Documentation/Help/source.qch file | annotate | diff | comparison | revisions
Documentation/Help/source.qhp file | annotate | diff | comparison | revisions
Documentation/Source/eric5.QScintilla.QsciScintillaCompat.html file | annotate | diff | comparison | revisions
QScintilla/Editor.py file | annotate | diff | comparison | revisions
QScintilla/QsciScintillaCompat.py file | annotate | diff | comparison | revisions
--- a/APIs/Python3/eric5.api	Thu Aug 12 16:43:33 2010 +0200
+++ b/APIs/Python3/eric5.api	Fri Aug 13 11:15:18 2010 +0200
@@ -5187,6 +5187,7 @@
 eric5.QScintilla.QsciScintillaCompat.QsciScintillaCompat.ArrowFoldStyle?7
 eric5.QScintilla.QsciScintillaCompat.QsciScintillaCompat.ArrowTreeFoldStyle?7
 eric5.QScintilla.QsciScintillaCompat.QsciScintillaCompat.UserSeparator?7
+eric5.QScintilla.QsciScintillaCompat.QsciScintillaCompat._encodeString?5(string)
 eric5.QScintilla.QsciScintillaCompat.QsciScintillaCompat.byteAt?4(pos)
 eric5.QScintilla.QsciScintillaCompat.QsciScintillaCompat.charAt?4(pos)
 eric5.QScintilla.QsciScintillaCompat.QsciScintillaCompat.clearAllIndicators?4(indicator)
Binary file Documentation/Help/source.qch has changed
--- a/Documentation/Help/source.qhp	Thu Aug 12 16:43:33 2010 +0200
+++ b/Documentation/Help/source.qhp	Fri Aug 13 11:15:18 2010 +0200
@@ -5439,6 +5439,7 @@
       <keyword name="QsciScintillaCompat (Constructor)" id="QsciScintillaCompat (Constructor)" ref="eric5.QScintilla.QsciScintillaCompat.html#QsciScintillaCompat.__init__" />
       <keyword name="QsciScintillaCompat.__doSearchTarget" id="QsciScintillaCompat.__doSearchTarget" ref="eric5.QScintilla.QsciScintillaCompat.html#QsciScintillaCompat.__doSearchTarget" />
       <keyword name="QsciScintillaCompat.__setFoldMarker" id="QsciScintillaCompat.__setFoldMarker" ref="eric5.QScintilla.QsciScintillaCompat.html#QsciScintillaCompat.__setFoldMarker" />
+      <keyword name="QsciScintillaCompat._encodeString" id="QsciScintillaCompat._encodeString" ref="eric5.QScintilla.QsciScintillaCompat.html#QsciScintillaCompat._encodeString" />
       <keyword name="QsciScintillaCompat.byteAt" id="QsciScintillaCompat.byteAt" ref="eric5.QScintilla.QsciScintillaCompat.html#QsciScintillaCompat.byteAt" />
       <keyword name="QsciScintillaCompat.charAt" id="QsciScintillaCompat.charAt" ref="eric5.QScintilla.QsciScintillaCompat.html#QsciScintillaCompat.charAt" />
       <keyword name="QsciScintillaCompat.clearAllIndicators" id="QsciScintillaCompat.clearAllIndicators" ref="eric5.QScintilla.QsciScintillaCompat.html#QsciScintillaCompat.clearAllIndicators" />
--- a/Documentation/Source/eric5.QScintilla.QsciScintillaCompat.html	Thu Aug 12 16:43:33 2010 +0200
+++ b/Documentation/Source/eric5.QScintilla.QsciScintillaCompat.html	Fri Aug 13 11:15:18 2010 +0200
@@ -70,6 +70,9 @@
 <td><a href="#QsciScintillaCompat.__setFoldMarker">__setFoldMarker</a></td>
 <td>Private method to define a fold marker.</td>
 </tr><tr>
+<td><a href="#QsciScintillaCompat._encodeString">_encodeString</a></td>
+<td>Protected method to encode a string depending on the current mode.</td>
+</tr><tr>
 <td><a href="#QsciScintillaCompat.byteAt">byteAt</a></td>
 <td>Public method to get the raw character (bytes) at a position in the text.</td>
 </tr><tr>
@@ -335,6 +338,21 @@
 <dd>
 fold mark symbol to be used (integer)
 </dd>
+</dl><a NAME="QsciScintillaCompat._encodeString" ID="QsciScintillaCompat._encodeString"></a>
+<h4>QsciScintillaCompat._encodeString</h4>
+<b>_encodeString</b>(<i>string</i>)
+<p>
+        Protected method to encode a string depending on the current mode.
+</p><dl>
+<dt><i>string</i></dt>
+<dd>
+string to be encoded (str)
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+encoded string (bytes)
+</dd>
 </dl><a NAME="QsciScintillaCompat.byteAt" ID="QsciScintillaCompat.byteAt"></a>
 <h4>QsciScintillaCompat.byteAt</h4>
 <b>byteAt</b>(<i>pos</i>)
@@ -507,7 +525,7 @@
 </p><dl>
 <dt><i>cmd</i></dt>
 <dd>
-the scintilla command to be performed
+the scintilla command to be performed (integer)
 </dd>
 </dl><a NAME="QsciScintillaCompat.extendSelectionLeft" ID="QsciScintillaCompat.extendSelectionLeft"></a>
 <h4>QsciScintillaCompat.extendSelectionLeft</h4>
@@ -1118,7 +1136,12 @@
 <b>setStyleBits</b>(<i>bits</i>)
 <p>
         Public method to set the number of bits to be used for styling.
-</p><a NAME="QsciScintillaCompat.setStyling" ID="QsciScintillaCompat.setStyling"></a>
+</p><dl>
+<dt><i>bits</i></dt>
+<dd>
+number of style bits (integer)
+</dd>
+</dl><a NAME="QsciScintillaCompat.setStyling" ID="QsciScintillaCompat.setStyling"></a>
 <h4>QsciScintillaCompat.setStyling</h4>
 <b>setStyling</b>(<i>length, style</i>)
 <p>
--- a/QScintilla/Editor.py	Thu Aug 12 16:43:33 2010 +0200
+++ b/QScintilla/Editor.py	Fri Aug 13 11:15:18 2010 +0200
@@ -3636,24 +3636,24 @@
         cv = self.callTipsVisible()
         if cv > 0:
             # this is just a safe guard
-            ct = "\n".join(callTips[:cv])
+            ct = self._encodeString("\n".join(callTips[:cv]))
         else:
             # until here and unindent below
-            ct = "\n".join(callTips)
+            ct = self._encodeString("\n".join(callTips))
         
         self.SendScintilla(QsciScintilla.SCI_CALLTIPSHOW, 
                            self.__adjustedCallTipPosition(ctshift, pos), ct)
-        if '\n' in ct:
+        if b'\n' in ct:
             return
         
         # Highlight the current argument
         if commas == 0:
-            astart = ct.find('(')
+            astart = ct.find(b'(')
         else:
-            astart = ct.find(',')
+            astart = ct.find(b',')
             commas -= 1
             while astart != -1 and commas > 0:
-                astart = ct.find(',', astart + 1)
+                astart = ct.find(b',', astart + 1)
                 commas -= 1
         
         if astart == -1:
@@ -3661,20 +3661,20 @@
         
         depth = 0
         for aend in range(astart + 1, len(ct)):
-            ch = ct[aend]
+            ch = ct[aend:aend + 1]
             
-            if ch == ',' and depth == 0:
+            if ch == b',' and depth == 0:
                 break
-            elif ch == '(':
+            elif ch == b'(':
                 depth += 1
-            elif ch == ')':
+            elif ch == b')':
                 if depth == 0:
                     break
                 
                 depth -= 1
         
         if astart != aend:
-            self.SendScintilla(QsciScintilla.SCI_CALLTIPSETHLT, astart, aend)
+            self.SendScintilla(QsciScintilla.SCI_CALLTIPSETHLT, astart + 1, aend)
     
     def __adjustedCallTipPosition(self, ctshift, pos):
         """
--- a/QScintilla/QsciScintillaCompat.py	Thu Aug 12 16:43:33 2010 +0200
+++ b/QScintilla/QsciScintillaCompat.py	Fri Aug 13 11:15:18 2010 +0200
@@ -188,6 +188,8 @@
     def setStyleBits(self, bits):
         """
         Public method to set the number of bits to be used for styling.
+        
+        @param bits number of style bits (integer)
         """
         self.SendScintilla(QsciScintilla.SCI_SETSTYLEBITS, bits)
     
@@ -331,7 +333,7 @@
         """
         Public method to perform a simple editor command.
         
-        @param cmd the scintilla command to be performed
+        @param cmd the scintilla command to be performed (integer)
         """
         self.SendScintilla(cmd)
     
@@ -639,9 +641,10 @@
         self.SendScintilla(QsciScintilla.SCI_SETTARGETSTART, self.__targetSearchStart)
         self.SendScintilla(QsciScintilla.SCI_SETTARGETEND, self.__targetSearchEnd)
         self.SendScintilla(QsciScintilla.SCI_SETSEARCHFLAGS, self.__targetSearchFlags)
-        pos = self.SendScintilla(QsciScintilla.SCI_SEARCHINTARGET, 
-                                 len(self.__targetSearchExpr), 
-                                 self.__targetSearchExpr)
+        targetSearchExpr = self._encodeString(self.__targetSearchExpr)
+        pos = self.SendScintilla(QsciScintilla.SCI_SEARCHINTARGET,
+                                 len(targetSearchExpr), 
+                                 targetSearchExpr)
         
         if pos == -1:
             self.__targetSearchActive = False
@@ -739,16 +742,15 @@
         
         if self.__targetSearchFlags & QsciScintilla.SCFIND_REGEXP:
             cmd = QsciScintilla.SCI_REPLACETARGETRE
+            r = replaceStr
         else:
             cmd = QsciScintilla.SCI_REPLACETARGET
+            r = self._encodeString(replaceStr)
         
         start = self.SendScintilla(QsciScintilla.SCI_GETTARGETSTART)
-        
-        r = replaceStr
-        
         self.SendScintilla(cmd, len(r), r)
         
-        self.__targetSearchStart = start + len(replaceStr)
+        self.__targetSearchStart = start + len(r)
     
     #####################################################################################
     # indicator handling methods
@@ -1038,11 +1040,27 @@
         
         self.SendScintilla(QsciScintilla.SCI_AUTOCSETSEPARATOR, 
                            ord(self.UserSeparator))
-        if self.isUtf8():
-            lst = self.UserSeparator.join(lst).encode("utf-8")
+        self.SendScintilla(QsciScintilla.SCI_USERLISTSHOW, id, 
+            self._encodeString(self.UserSeparator.join(lst)))
+    
+    #####################################################################################
+    # utility methods
+    #####################################################################################
+    
+    def _encodeString(self, string):
+        """
+        Protected method to encode a string depending on the current mode.
+        
+        @param string string to be encoded (str)
+        @return encoded string (bytes)
+        """
+        if isinstance(string, bytes):
+            return string
         else:
-            lst = self.UserSeparator.join(lst).encode("latin-1")
-        self.SendScintilla(QsciScintilla.SCI_USERLISTSHOW, id, lst)
+            if self.isUtf8():
+                return string.encode("utf-8")
+            else:
+                return string.encode("latin-1")
     
 ##    #####################################################################################
 ##    # methods below have been added to QScintilla starting with version after 2.x

eric ide

mercurial