| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 
 | class Composer(object):
    def __init__(self):
	self.builder = Gtk.Builder()
    	self.builder.add_from_file('/home/christophe/.poppy/ui/Composer.glade')
        self.builder.connect_signals(self)
	self.dialog = self.builder.get_object('dialog1')
 
        self.textview = self.builder.get_object('textview')
	self.textbuffer = self.textview.get_buffer()
 
        # Toggled Buttons
	self.button_bold = self.builder.get_object('button_bold')
	self.button_underline = self.builder.get_object('button_underline')
	self.button_italic = self.builder.get_object('button_italic')
 
	# Normal Buttons
	self.button_color = self.builder.get_object('button_color')
 
        # Tags
	b_tag = self.textbuffer.create_tag( "b", weight=pango.WEIGHT_BOLD)
	i_tag = self.textbuffer.create_tag( "i", style=pango.STYLE_ITALIC)
	u_tag = self.textbuffer.create_tag( "u", underline=pango.UNDERLINE_SINGLE)
 
        # Signals
        self.button_bold.connect("toggled", self.style_changed, b_tag)
        self.button_italic.connect("toggled", self.style_changed, i_tag)
        self.button_underline.connect("toggled", self.style_changed, u_tag)
	self.button_color.connect("color_set", self.color_changed)
 
	# Dict of attibutes in textview
	self.styles = {}
 
    def style_changed(self, widget, tag):
	start, end = self.get_selection()
	if start == end:
		return
 
	if widget.get_active():
		self.textbuffer.apply_tag(tag, start, end)
	else:
		self.textbuffer.remove_tag(tag, start, end)
 
    def color_changed(self, widget):
	start, end = self.get_selection()
	if start == end:
		return
 
	color = widget.get_color()
        tag_name = color.to_string()
 
	# Remove obsolete Tags before applying new Tag.
	tags = [tag for tag in start.get_tags() if tag == v['tag'] for k, v in self.styles.items() if v['type'] == "color"]
        for tag in tags:
            self.textbuffer.remove_tag(tag, start, end)
 
	# Create or load existing Tag	
	if tag_name in self.styles.keys():
	    tag = self.styles[tag_name]['tag']
	else:
	    tag = self.textbuffer.create_tag(tag_name)
            tag.set_property('foreground-gdk', color)
            self.styles[tag_name] = {'tag': tag, 'type': 'color'}
 
	self.textbuffer.apply_tag(tag, start, end)
 
    def get_selection(self):
        bounds = self.textbuffer.get_selection_bounds()
        if len(bounds) != 0:
            start, end = bounds
	else:
 	    start = self.textbuffer.get_iter_at_mark(self.textbuffer.get_insert())
            end = self.textbuffer.get_iter_at_mark(self.textbuffer.get_insert())
	    if not start.inside_word():
		end = start
	    else:	
		if not start.starts_word():
			start.backward_word_start()
		if not end.ends_word():
			end.forward_word_end()	
 
	return start, end | 
Partager