~ubuntu-branches/ubuntu/saucy/pida/saucy

« back to all changes in this revision

Viewing changes to pida/utils/culebra/replacebar.py

  • Committer: Bazaar Package Importer
  • Author(s): Barry deFreese
  • Date: 2006-08-01 13:08:56 UTC
  • mfrom: (0.1.2 etch) (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20060801130856-v92ktopgdxc8rv7q
Tags: 0.3.1-2ubuntu1
* Re-sync with Debian
* Remove bashisms from debian/rules

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding: utf-8 -*-
 
2
__license__ = "MIT License <http://www.opensource.org/licenses/mit-license.php>"
 
3
__copyright__ = "2005, Tiago Cogumbreiro"
 
4
__author__ = "Tiago Cogumbreiro <cogumbreiro@users.sf.net>"
 
5
 
 
6
import gtk
 
7
import weakref
 
8
 
 
9
from common import ACTION_FIND_TOGGLE, ACTION_REPLACE_FORWARD, ACTION_REPLACE_ALL
 
10
from common import escape_text, unescape_text
 
11
from common import get_action, ACTION_REPLACE_TOGGLE
 
12
 
 
13
from bar import Bar
 
14
 
 
15
class ReplaceBar(Bar):
 
16
    """
 
17
    This component implements an event that validates when the selection is
 
18
    synchronized with the selected text.
 
19
    """
 
20
    def __init__(self, parent, search_bar, action_group):
 
21
        self._search_bar = weakref.ref(search_bar)
 
22
        super(ReplaceBar, self).__init__(parent, action_group)
 
23
    
 
24
    def _create_toggle_action(self, action_group):
 
25
        action = lambda name: get_action(action_group.get_action, name)
 
26
        self.toggle_find = action(ACTION_FIND_TOGGLE)
 
27
        self.replace_forward = action(ACTION_REPLACE_FORWARD)
 
28
        self.replace_all = action(ACTION_REPLACE_ALL)
 
29
        return action(ACTION_REPLACE_TOGGLE)
 
30
    
 
31
    ##############
 
32
    # Properties
 
33
    
 
34
    #############
 
35
    # search_bar
 
36
    def get_search_bar(self):
 
37
        return self._search_bar()
 
38
    
 
39
    search_bar = property(get_search_bar)
 
40
    
 
41
    ###################
 
42
    # replace_entry
 
43
    _replace_entry = None
 
44
    
 
45
    def create_replace_entry(self):
 
46
        entry = gtk.Entry()
 
47
        self.replace_completion = gtk.EntryCompletion()
 
48
        entry.set_completion(self.replace_completion)
 
49
        self.replace_model = gtk.ListStore(str)
 
50
        self.replace_completion.set_model(self.replace_model)
 
51
        self.replace_completion.set_text_column(0)
 
52
        entry.show()
 
53
        entry.connect("changed", self.on_entry_changed)
 
54
        return entry
 
55
    
 
56
    def get_replace_entry(self):
 
57
        if self._replace_entry is None:
 
58
            self._replace_entry = self.create_replace_entry()
 
59
        return self._replace_entry
 
60
 
 
61
    replace_entry = property(get_replace_entry)
 
62
    ###############
 
63
    # replace_text
 
64
    def get_replace_text(self):
 
65
        return self.replace_entry.get_text()
 
66
    
 
67
    replace_text = property(get_replace_text)
 
68
    
 
69
    ##############
 
70
    # widget
 
71
    def create_widget(self):
 
72
        hig_add = lambda container, widget: \
 
73
                  container.pack_start(widget, expand = False, fill = False)
 
74
        
 
75
        hbox = gtk.HBox(spacing=6)
 
76
        hbox.connect("show", self.on_show)
 
77
        hbox.connect("hide", self.on_hide)
 
78
        
 
79
        lbl = gtk.Label("Replace")
 
80
        lbl.show()
 
81
        hig_add(hbox, lbl)
 
82
        
 
83
        self.replace_entry.show()
 
84
        hig_add(hbox, self.replace_entry)
 
85
        
 
86
        btn = gtk.Button(stock=gtk.STOCK_FIND_AND_REPLACE)
 
87
        self.replace_forward.connect_proxy(btn)
 
88
        btn.show()
 
89
        hig_add(hbox, btn)
 
90
        
 
91
        btn = gtk.Button(stock=gtk.STOCK_FIND_AND_REPLACE)
 
92
        btn.set_label("Replace All")
 
93
        self.replace_all.connect_proxy(btn)
 
94
        btn.show()
 
95
        hig_add(hbox, btn)
 
96
 
 
97
        self.replace_forward.connect("activate", self.on_replace_curr)
 
98
        self.replace_all.connect("activate", self.on_replace_all)
 
99
 
 
100
        self.search_bar.widget.connect("key-release-event", self._on_key_pressed)
 
101
        
 
102
        return hbox
 
103
    
 
104
    ##################
 
105
    # Template methods
 
106
 
 
107
    def _bind_buffer(self, buff):
 
108
        buff.replace_component.events.register("changed", self.on_replace_changed)
 
109
        buff.replace_text = self.replace_entry.get_text()
 
110
    
 
111
    def _unbind_buffer(self, buff):
 
112
        buff.replace_component.events.unregister("changed", self.on_replace_changed)
 
113
 
 
114
    def on_show(self, dialog):
 
115
        self.toggle_find.set_active(True)
 
116
        self.toggle_find.set_sensitive(False)
 
117
    
 
118
    def on_hide(self, dialog):
 
119
        self.toggle_find.set_active(False)
 
120
        self.toggle_find.set_sensitive(True)
 
121
    
 
122
    def can_update_history(self):
 
123
        return self.replace_entry.get_text() in [x[0] for x in self.replace_model]
 
124
    
 
125
    def update_history(self):
 
126
        self.replace_model.append((self.replace_entry.get_text(),))
 
127
    
 
128
    def on_replace_curr(self, btn):
 
129
        if self.buffer.replace() and self.can_update_history():
 
130
            self.update_history()
 
131
 
 
132
        self.buffer.search()
 
133
        
 
134
    
 
135
    def on_replace_all(self, btn):
 
136
        if self.buffer.replace_all() and self.can_update_history():
 
137
            self.update_history()
 
138
        
 
139
    def on_entry_changed(self, entry):
 
140
        self.buffer.replace_text = unescape_text(entry.get_text())
 
141
    
 
142
    def on_replace_changed(self, text):
 
143
        self.replace_entry.set_text(escape_text(text))