From 19950c616d983d0e3b00946d147c5baf5a471ecf Mon Sep 17 00:00:00 2001 From: Benny Malengier Date: Tue, 31 Aug 2010 19:33:59 +0000 Subject: [PATCH] undo support for words with unicode symbols of length 2 in the buffer svn: r15843 --- src/gui/widgets/undoablebuffer.py | 6 ++++-- src/gui/widgets/undoableentry.py | 8 ++++++-- src/gui/widgets/undoablestyledbuffer.py | 15 +-------------- 3 files changed, 11 insertions(+), 18 deletions(-) diff --git a/src/gui/widgets/undoablebuffer.py b/src/gui/widgets/undoablebuffer.py index 1e032ff52..78078ae3f 100644 --- a/src/gui/widgets/undoablebuffer.py +++ b/src/gui/widgets/undoablebuffer.py @@ -54,8 +54,10 @@ class UndoableInsert(object): def __init__(self, text_iter, text, length, text_buffer): self.offset = text_iter.get_offset() self.text = str(text) - self.length = length - if self.length > 1 or self.text in ("\r", "\n", " "): + #unicode char can have length > 1 as it points in the buffer + charlength = len(unicode(text)) + self.length = charlength + if charlength > 1 or self.text in ("\r", "\n", " "): self.mergeable = False else: self.mergeable = True diff --git a/src/gui/widgets/undoableentry.py b/src/gui/widgets/undoableentry.py index 176d8d609..0545846aa 100644 --- a/src/gui/widgets/undoableentry.py +++ b/src/gui/widgets/undoableentry.py @@ -54,8 +54,11 @@ class UndoableInsertEntry(object): def __init__(self, text, length, position, editable): self.offset = position self.text = str(text) - self.length = length - if self.length > 1 or self.text in ("\r", "\n", " "): + #unicode char can have length > 1 as it points in the buffer + charlength = len(unicode(text)) + self.length = charlength + print text, length, unicode(text)[0], len(unicode(text)) + if charlength > 1 or self.text in ("\r", "\n", " "): self.mergeable = False else: self.mergeable = True @@ -139,6 +142,7 @@ class UndoableEntry(gtk.Entry): WHITESPACE = (' ', '\t') if not cur.mergeable or not prev.mergeable: return False + # offset is char offset, not byte, so length is the char length! elif cur.offset != (prev.offset + prev.length): return False elif cur.text in WHITESPACE and not prev.text in WHITESPACE: diff --git a/src/gui/widgets/undoablestyledbuffer.py b/src/gui/widgets/undoablestyledbuffer.py index 9488ccdde..ce6f1cb62 100644 --- a/src/gui/widgets/undoablestyledbuffer.py +++ b/src/gui/widgets/undoablestyledbuffer.py @@ -38,20 +38,7 @@ class UndoableInsertStyled(UndoableInsert): """something that has been inserted into our styledtextbuffer""" def __init__(self, text_iter, text, length, text_buffer): #we obtain the buffer before the text has been inserted - if text_iter is None: - #style change - self.mergeable = False - self.offset = text_buffer.get_iter_at_mark(text_buffer.get_insert()).get_offset() - self.text = None - self.length = 0 - else: - self.offset = text_iter.get_offset() - self.text = str(text) - self.length = length - if self.length > 1 or self.text in ("\r", "\n", " "): - self.mergeable = False - else: - self.mergeable = True + UndoableInsert.__init__(self, text_iter, text, length, text_buffer) self.tags = text_buffer.get_text(text_buffer.get_start_iter(), text_buffer.get_end_iter()).get_tags() self.tagsafter = None