diff --git a/tryton/gui/window/view_form/view/form_gtk/richtextbox.py b/tryton/gui/window/view_form/view/form_gtk/richtextbox.py index 0f06863a78..e260324c71 100644 --- a/tryton/gui/window/view_form/view/form_gtk/richtextbox.py +++ b/tryton/gui/window/view_form/view/form_gtk/richtextbox.py @@ -5,7 +5,6 @@ import gtk import pango import re from gettext import gettext as _ -from functools import wraps from textbox import TextBox from tryton.common import get_toplevel_window @@ -62,21 +61,6 @@ def formalize_text_markup(text): return '\n'.join(lines) -def active_markup(func): - "Decorator to activate markup" - @wraps(func) - def wrapper(self, *args, **kwargs): - active = self.tools['markup'].get_active() - if not active: - self.tools['markup'].set_active(True) - try: - return func(self, *args, **kwargs) - finally: - if not active: - self.tools['markup'].set_active(False) - return wrapper - - class RichTextBox(TextBox): '''Implements a rich text editor as widget to Tryton Client''' @@ -187,7 +171,6 @@ class RichTextBox(TextBox): self.tools['markup'].set_tooltip_text(_('Change the markup text view')) # Packing widgets tool_bar = gtk.Toolbar() - tool_bar.connect('enter-notify-event', self.enter) tool_bar.set_style(gtk.TOOLBAR_ICONS) for tag in tags: @@ -196,19 +179,35 @@ class RichTextBox(TextBox): for local in (3, 6, 11, 14): tool_bar.insert(separator(), local) self.widget.pack_start(tool_bar, False) + self.widget.connect('enter-notify-event', self.enter) + + def get_value_markup(self): + if self.tools['markup'].get_active(): + return self.get_value() + else: + return self.parser_to_text_markup(self.text_buffer) @property - @active_markup def modified(self): - return super(RichTextBox, self).modified + if self.record and self.field: + return (formalize_text_markup(self.field.get_client(self.record) or + '') != self.get_value_markup()) + return False - @active_markup def set_value(self, record, field): - super(RichTextBox, self).set_value(record, field) + if self.modified: + field.set_client(record, self.get_value_markup()) - @active_markup - def display(self, record, field): - super(RichTextBox, self).display(record, field) + def set_buffer(self, value): + if self.tools['markup'].get_active(): + super(RichTextBox, self).set_buffer(value) + else: + text_buffer, deserial = self.parser_from_text_markup(value) + self.text_buffer.deserialize(self.text_buffer, deserial, + self.text_buffer.get_start_iter(), + text_buffer.serialize(text_buffer, + "application/x-gtk-text-buffer-rich-text", + text_buffer.get_start_iter(), text_buffer.get_end_iter())) def _focus_out(self): if not self.focus_out: @@ -228,21 +227,24 @@ class RichTextBox(TextBox): if widget.get_active(): for tag in tags: self.tools[tag].set_sensitive(False) - self.parser_to_text_markup() + text = self.parser_to_text_markup(self.text_buffer) + self.start_tags.clear() + self.end_tags.clear() else: for tag in tags: self.tools[tag].set_sensitive(True) - self.parser_from_text_markup() + text = self.text_buffer.get_text(self.text_buffer.get_start_iter(), + self.text_buffer.get_end_iter()) + self.set_buffer(text) - def parser_to_text_markup(self): + def parser_to_text_markup(self, buffer_): '''Parser from rich text view to text markup''' text_buffer = gtk.TextBuffer(self.table_tag) deserial = text_buffer.register_deserialize_tagset() text_buffer.deserialize(text_buffer, deserial, - text_buffer.get_start_iter(), self.text_buffer.serialize( - self.text_buffer, "application/x-gtk-text-buffer-rich-text", - self.text_buffer.get_start_iter(), - self.text_buffer.get_end_iter())) + text_buffer.get_start_iter(), buffer_.serialize( + buffer_, "application/x-gtk-text-buffer-rich-text", + buffer_.get_start_iter(), buffer_.get_end_iter())) locks = {'bold': False, 'italic': False, 'underline': False, 'left': False, 'right': False, 'center': False, 'fill': False} for prop in self.font_props: @@ -287,15 +289,11 @@ class RichTextBox(TextBox): break text = text_buffer.get_text(text_buffer.get_start_iter(), text_buffer.get_end_iter()) - self.start_tags.clear() - self.end_tags.clear() - self.text_buffer.set_text(formalize_text_markup(text)) + return formalize_text_markup(text) - def parser_from_text_markup(self): + def parser_from_text_markup(self, text): '''Parser from text markup to rich text view''' text_buffer = gtk.TextBuffer(self.table_tag) - text = self.text_buffer.get_text(self.text_buffer.get_start_iter(), - self.text_buffer.get_end_iter()) text_buffer.set_text(text) tags = [] open_re = '<(?P\w{1,4})(?P .+?)?>' @@ -346,11 +344,7 @@ class RichTextBox(TextBox): text_buffer.apply_tag_by_name(value, line, end) self.text_buffer.set_text('') deserial = self.text_buffer.register_deserialize_tagset() - self.text_buffer.deserialize(self.text_buffer, deserial, - self.text_buffer.get_start_iter(), - text_buffer.serialize(text_buffer, - "application/x-gtk-text-buffer-rich-text", - text_buffer.get_start_iter(), text_buffer.get_end_iter())) + return text_buffer, deserial def gen_tag(self, val, tag): ''' diff --git a/tryton/gui/window/view_form/view/form_gtk/textbox.py b/tryton/gui/window/view_form/view/form_gtk/textbox.py index 1efbe6e891..83e5ed9469 100644 --- a/tryton/gui/window/view_form/view/form_gtk/textbox.py +++ b/tryton/gui/window/view_form/view/form_gtk/textbox.py @@ -133,16 +133,18 @@ class TextBox(WidgetInterface, TranslateMixin): def set_value(self, record, field): field.set_client(record, self.get_value()) - def display(self, record, field): - super(TextBox, self).display(record, field) - value = field and field.get(record) - if not value: - value = '' + def set_buffer(self, value): buf = self.textview.get_buffer() buf.delete(buf.get_start_iter(), buf.get_end_iter()) iter_start = buf.get_start_iter() buf.insert(iter_start, value) + def display(self, record, field): + super(TextBox, self).display(record, field) + value = field and field.get(record) + if not value: + value = '' + self.set_buffer(value) if gtkspell: spell = None try: