~ubuntu-branches/ubuntu/utopic/dogtail/utopic

« back to all changes in this revision

Viewing changes to sniff/sniff

  • Committer: Bazaar Package Importer
  • Author(s): Daniel Holbach
  • Date: 2006-12-21 13:33:47 UTC
  • mfrom: (1.2.1 upstream)
  • mto: This revision was merged to the branch mainline in revision 5.
  • Revision ID: james.westby@ubuntu.com-20061221133347-xo9jg11afp5plcka
Tags: upstream-0.6.1
ImportĀ upstreamĀ versionĀ 0.6.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
4
4
appName = 'Sniff'
5
5
appAuthors = ['Zack Cerza <zcerza@redhat.com>', 'David Malcolm <dmalcolm@redhat.com']
6
6
 
 
7
from dogtail.utils import checkForA11yInteractively
 
8
checkForA11yInteractively()
 
9
 
7
10
from dogtail import tree
8
11
from dogtail import utils
9
12
import gobject
12
15
program = gnome.program_init(appName, '0.1')
13
16
import gtk.glade
14
17
 
15
 
try:
16
 
        x = gtk.glade.XML('sniff.glade')
17
 
except RuntimeError:
18
 
        x = gtk.glade.XML('/usr/share/dogtail/glade/sniff.glade')
 
18
import os
 
19
if os.path.exists('sniff.glade'):
 
20
    x = gtk.glade.XML('sniff.glade')
 
21
else:
 
22
    import sys
 
23
    exec_root = sys.argv[0].split("/bin/")[0]
 
24
    if exec_root[0] is not '/':
 
25
        exec_root = "/usr"
 
26
    x = gtk.glade.XML(exec_root + '/share/dogtail/glade/sniff.glade')
19
27
 
20
28
sniff = x.get_widget(appName)
21
29
 
22
30
try:
23
 
        sniff.set_icon_from_file('../icons/dogtail-head.svg')
 
31
    sniff.set_icon_from_file('../icons/dogtail-head.svg')
24
32
except:
25
 
        sniff.set_icon_from_file('/usr/share/icons/hicolor/scalable/apps/dogtail-head.svg')
 
33
    sniff.set_icon_from_file('/usr/share/icons/hicolor/scalable/apps/dogtail-head.svg')
26
34
 
27
35
view = x.get_widget('treeTreeView')
28
36
 
41
49
MODEL_FIELD_PIXBUF = 4
42
50
 
43
51
def quit(*args):
44
 
        gtk.main_quit()
 
52
    gtk.main_quit()
45
53
 
46
54
def expandAll(widget, *args):
47
 
        global view
48
 
        if args[0] == True: view.expand_all()
49
 
        elif args[0] == False: view.collapse_all()
 
55
    global view
 
56
    if args[0] == True: view.expand_all()
 
57
    elif args[0] == False: view.collapse_all()
50
58
 
51
59
def showAbout(*args):
52
 
        about = gtk.AboutDialog()
53
 
        about.set_name(appName)
54
 
        about.set_authors(appAuthors)
55
 
        about.set_comments('Explore your desktop with Dogtail')
56
 
        about.set_website('http://people.redhat.com/zcerza/dogtail/')
57
 
        about.show_all()
 
60
    about = gtk.AboutDialog()
 
61
    about.set_name(appName)
 
62
    about.set_authors(appAuthors)
 
63
    about.set_comments('Explore your desktop with Dogtail')
 
64
    about.set_website('http://people.redhat.com/zcerza/dogtail/')
 
65
    about.show_all()
58
66
 
59
67
def connectSignals():
60
 
        sniff.connect('delete_event', quit)
61
 
 
62
 
        quit1 = x.get_widget('quit1')
63
 
        quit1.connect('activate', quit)
64
 
 
65
 
        expand_all1 = x.get_widget('expand_all1')
66
 
        expand_all1.connect('activate', expandAll, True)
67
 
        collapse_all1 = x.get_widget('collapse_all1')
68
 
        collapse_all1.connect('activate', expandAll, False)
69
 
        
70
 
        about1 = x.get_widget('about1')
71
 
        about1.connect('activate', showAbout)
72
 
 
73
 
        refreshMenuItem = x.get_widget('refresh1')
74
 
        refreshMenuItem.connect('activate', refreshAll)
75
 
 
76
 
        view.connect('button-press-event', buttonPress)
77
 
        view.connect('row-expanded', rowExpanded)
78
 
        view.connect('row-collapsed', rowCollapsed)
79
 
        treeSelection = view.get_selection()
80
 
        treeSelection.connect('changed', selectionChanged)
 
68
    sniff.connect('delete_event', quit)
 
69
 
 
70
    quit1 = x.get_widget('quit1')
 
71
    quit1.connect('activate', quit)
 
72
 
 
73
    expand_all1 = x.get_widget('expand_all1')
 
74
    expand_all1.connect('activate', expandAll, True)
 
75
    collapse_all1 = x.get_widget('collapse_all1')
 
76
    collapse_all1.connect('activate', expandAll, False)
 
77
 
 
78
    about1 = x.get_widget('about1')
 
79
    about1.connect('activate', showAbout)
 
80
 
 
81
    refreshMenuItem = x.get_widget('refresh1')
 
82
    refreshMenuItem.connect('activate', refreshAll)
 
83
 
 
84
    view.connect('button-press-event', buttonPress)
 
85
    view.connect('row-expanded', rowExpanded)
 
86
    view.connect('row-collapsed', rowCollapsed)
 
87
    treeSelection = view.get_selection()
 
88
    treeSelection.connect('changed', selectionChanged)
81
89
 
82
90
def buttonPress(widget, event, *userParams):
83
 
        global model
84
 
        try: path, treeViewCol, relX, relY = \
85
 
                        view.get_path_at_pos(int(event.x), int(event.y))
86
 
        except TypeError: return
87
 
        node = model[path][0]
88
 
        setUpTable(node)
 
91
    global model
 
92
    try: path, treeViewCol, relX, relY = \
 
93
                    view.get_path_at_pos(int(event.x), int(event.y))
 
94
    except TypeError: return
 
95
    node = model[path][0]
 
96
    setUpTable(node)
89
97
 
90
 
        if event.button == 3:
91
 
                menu = gtk.Menu()
92
 
                menuItem = None
93
 
                try:
94
 
                        for action in node.actions.values():
95
 
                                menuItem = gtk.MenuItem(action.name.capitalize())
96
 
                                menuItem.connect('activate', menuItemActivate, action.do)
97
 
                                menuItem.show()
98
 
                                menu.append(menuItem)
99
 
                except AttributeError: pass
100
 
                if not menuItem: return
101
 
                menu.show()
102
 
                menu.popup(None, None, None, event.button, event.time)
 
98
    if event.button == 3:
 
99
        menu = gtk.Menu()
 
100
        menuItem = None
 
101
        if node.actions:
 
102
            for action in node.actions.values():
 
103
                menuItem = gtk.MenuItem(action.name.capitalize())
 
104
                menuItem.connect('activate', menuItemActivate, action.do)
 
105
                menuItem.show()
 
106
                menu.append(menuItem)
 
107
        if not menuItem: return
 
108
        menu.show()
 
109
        menu.popup(None, None, None, event.button, event.time)
103
110
 
104
111
# I hate globals too. I think we need one here, though.
105
112
# Make it a non-integer, so we can know if it has been set yet (later).
106
113
textTextViewBufferChangedLastHandlerID = 3.141592654
107
114
 
108
115
def setUpTable(node):
109
 
        """Generic code for setting up the table under the TreeView"""
110
 
        nameTextLabel.set_text(node.name)
111
 
        roleNameTextLabel.set_text(node.roleName)
112
 
        descTextLabel.set_text(node.description)
113
 
        try:
114
 
                str = ''
115
 
                for action in node.actions.values(): str = ' '.join([str, action.name]).strip()
116
 
                actionsTextLabel.set_text(str)
117
 
        except AttributeError: actionsTextLabel.set_text('')
118
 
        
119
 
        global textTextViewBufferChangedLastHandlerID
120
 
        # Have we connected this signal yet? If so, disconnect it before proceeding.
121
 
        if int(textTextViewBufferChangedLastHandlerID) == \
122
 
                textTextViewBufferChangedLastHandlerID: 
123
 
                textTextView.get_buffer().disconnect(textTextViewBufferChangedLastHandlerID)
124
 
        
125
 
        try:
126
 
                textTextView.set_sensitive(True)
127
 
                buffer = textTextView.get_buffer()
128
 
                buffer.set_text(node.text)
129
 
                try:
130
 
                        # Eeew! I'm touching tree's privates.
131
 
                        # This 'assert' will never cause an AssertionError - it
132
 
                        # will be an AttributeError.
133
 
                        assert node._Node__editableText
134
 
                        # Remember the handler ID of this connection.
135
 
                        textTextViewBufferChangedLastHandlerID = \
136
 
                                buffer.connect('changed', changeText, node)
137
 
                except AttributeError:
138
 
                        textTextView.set_sensitive(False)
139
 
        except AttributeError:
140
 
                textTextView.get_buffer().set_text('')
141
 
                textTextView.set_sensitive(False)
 
116
    """Generic code for setting up the table under the TreeView"""
 
117
    nameTextLabel.set_text(node.name)
 
118
    roleNameTextLabel.set_text(node.roleName)
 
119
    descTextLabel.set_text(node.description)
 
120
    if node.actions:
 
121
        str = ''
 
122
        for action in node.actions.values(): str = ' '.join([str, action.name]).strip()
 
123
        actionsTextLabel.set_text(str)
 
124
 
 
125
    global textTextViewBufferChangedLastHandlerID
 
126
    # Have we connected this signal yet? If so, disconnect it before proceeding.
 
127
    if int(textTextViewBufferChangedLastHandlerID) == \
 
128
            textTextViewBufferChangedLastHandlerID:
 
129
        textTextView.get_buffer().disconnect(textTextViewBufferChangedLastHandlerID)
 
130
 
 
131
    if node.text is not None:
 
132
        buffer = textTextView.get_buffer()
 
133
        buffer.set_text(node.text)
 
134
        # Eeew! I'm touching tree's privates.
 
135
        if node._Node__editableText:
 
136
            # Remember the handler ID of this connection.
 
137
            textTextView.set_sensitive(True)
 
138
            textTextViewBufferChangedLastHandlerID = \
 
139
                    buffer.connect('changed', changeText, node)
 
140
        else:
 
141
            textTextView.set_sensitive(False)
 
142
    else:
 
143
        textTextView.get_buffer().set_text('')
 
144
        textTextView.set_sensitive(False)
142
145
 
143
146
def changeText(textBuffer, node):
144
 
        node.text = textBuffer.get_text(textBuffer.get_start_iter(), \
145
 
                        textBuffer.get_end_iter())
 
147
    node.text = textBuffer.get_text(textBuffer.get_start_iter(), \
 
148
                    textBuffer.get_end_iter())
146
149
 
147
150
def rowExpanded(treeview, iter, path, *userParams):
148
 
        global model
149
 
        row = model[path]
150
 
        childRows = row.iterchildren()
151
 
        node = row[0]
152
 
        try: 
153
 
                childNodes = node.children
154
 
                for childNode in childNodes:
155
 
                        childRow = childRows.next()
156
 
                        addChildren(childNode, childRow.iter)
157
 
        except AttributeError: pass
 
151
    global model
 
152
    row = model[path]
 
153
    childRows = row.iterchildren()
 
154
    node = row[0]
 
155
    childNodes = node.children
 
156
    for childNode in childNodes:
 
157
        childRow = childRows.next()
 
158
        addChildren(childNode, childRow.iter)
158
159
 
159
160
def rowCollapsed(treeview, iter, path, *userParams):
160
 
        global model
161
 
        row = model[path]
162
 
        childRows = row.iterchildren()
163
 
        try:
164
 
                while True:
165
 
                        childRow = childRows.next()
166
 
                        grandChildRows = childRow.iterchildren()
167
 
                        try:
168
 
                                while True:
169
 
                                        grandChildRow = grandChildRows.next()
170
 
                                        model.remove(grandChildRow.iter)
171
 
                        except StopIteration: pass
172
 
        except StopIteration: pass
 
161
    global model
 
162
    row = model[path]
 
163
    childRows = row.iterchildren()
 
164
    try:
 
165
        while True:
 
166
            childRow = childRows.next()
 
167
            grandChildRows = childRow.iterchildren()
 
168
            try:
 
169
                while True:
 
170
                    grandChildRow = grandChildRows.next()
 
171
                    model.remove(grandChildRow.iter)
 
172
            except StopIteration: pass
 
173
    except StopIteration: pass
173
174
 
174
175
def selectionChanged(treeSelection):
175
 
        # print "selection changed"
176
 
        node = getSelectedNode()
177
 
        if node: node.blink()
 
176
    # print "selection changed"
 
177
    node = getSelectedNode()
 
178
    if node: node.blink()
178
179
 
179
180
def getSelectedNode():
180
 
        global model
181
 
        global view
182
 
        (store, iter) = view.get_selection().get_selected()
183
 
        if not iter: node = None
184
 
        else: node = model[iter][0]
185
 
        return node     
 
181
    global model
 
182
    global view
 
183
    (store, iter) = view.get_selection().get_selected()
 
184
    if not iter: node = None
 
185
    else: node = model[iter][0]
 
186
    return node
186
187
 
187
188
def menuItemActivate(menuItem, *userParams):
188
 
        method = userParams[0]
189
 
        if method: method()
 
189
    method = userParams[0]
 
190
    if method: method()
190
191
 
191
192
def refreshAll(menuItem, *userParams):
192
 
        global model
193
 
        resetModel()
 
193
    global model
 
194
    resetModel()
194
195
 
195
196
def addNodeToModel(node, parentInTreeView = None):
196
 
        global model
197
 
        iter = model.insert_before(parentInTreeView, None)
198
 
        model.set_value(iter, MODEL_FIELD_NODE, node)
199
 
        return iter
 
197
    global model
 
198
    iter = model.insert_before(parentInTreeView, None)
 
199
    model.set_value(iter, MODEL_FIELD_NODE, node)
 
200
    return iter
200
201
 
201
202
def addChildren(node, parentInTreeView = None):
202
 
        global model
203
 
        try:
204
 
                for child in node.children:
205
 
                        iter = addNodeToModel(child, parentInTreeView)
206
 
        except AttributeError: pass
 
203
    global model
 
204
    for child in node.children:
 
205
        iter = addNodeToModel(child, parentInTreeView)
207
206
 
208
207
def showNode(node, parentInTreeView = None):
209
 
        global model
210
 
        iter = addNodeToModel(node, parentInTreeView)
211
 
        addChildren(node, iter)
 
208
    global model
 
209
    iter = addNodeToModel(node, parentInTreeView)
 
210
    addChildren(node, iter)
212
211
 
213
212
def resetModel():
214
 
        global model
215
 
        model.clear()
216
 
        showNode(tree.root)     
217
 
        rootPath = model.get_path(model.get_iter_root())
218
 
        view.expand_row(rootPath, False)
 
213
    global model
 
214
    model.clear()
 
215
    showNode(tree.root)
 
216
    rootPath = model.get_path(model.get_iter_root())
 
217
    view.expand_row(rootPath, False)
219
218
 
220
219
def loadIcon(iconName):
221
 
        try:
222
 
                pixbuf = gtk.gdk.pixbuf_new_from_file('icons/' + iconName)
223
 
        except gobject.GError:
224
 
                iconName = '/usr/share/dogtail/icons/' + iconName
225
 
                pixbuf = gtk.gdk.pixbuf_new_from_file(iconName)
226
 
        return pixbuf
 
220
    try:
 
221
        pixbuf = gtk.gdk.pixbuf_new_from_file('icons/' + iconName)
 
222
    except gobject.GError:
 
223
        iconName = '/usr/share/dogtail/icons/' + iconName
 
224
        pixbuf = gtk.gdk.pixbuf_new_from_file(iconName)
 
225
    return pixbuf
227
226
 
228
227
button_xpm = loadIcon("button.xpm")
229
228
checkbutton_xpm = loadIcon("checkbutton.xpm")
251
250
window_xpm = loadIcon("window.xpm")
252
251
 
253
252
iconForRole = { \
254
 
        atspi.SPI_ROLE_INVALID : None, \
255
 
        atspi.SPI_ROLE_ACCEL_LABEL : label_xpm, \
256
 
        atspi.SPI_ROLE_ALERT : None, \
257
 
        atspi.SPI_ROLE_ANIMATION : None, \
258
 
        atspi.SPI_ROLE_ARROW : None, \
259
 
        atspi.SPI_ROLE_CALENDAR : None, \
260
 
        atspi.SPI_ROLE_CANVAS : None, \
261
 
        atspi.SPI_ROLE_CHECK_BOX : checkbutton_xpm, \
262
 
        atspi.SPI_ROLE_CHECK_MENU_ITEM : checkmenuitem_xpm, \
263
 
        atspi.SPI_ROLE_COLOR_CHOOSER : colorselection_xpm, \
264
 
        atspi.SPI_ROLE_COLUMN_HEADER : None, \
265
 
        atspi.SPI_ROLE_COMBO_BOX : combo_xpm, \
266
 
        atspi.SPI_ROLE_DATE_EDITOR : None, \
267
 
        atspi.SPI_ROLE_DESKTOP_ICON : None, \
268
 
        atspi.SPI_ROLE_DESKTOP_FRAME : None, \
269
 
        atspi.SPI_ROLE_DIAL : None, \
270
 
        atspi.SPI_ROLE_DIALOG : dialog_xpm, \
271
 
        atspi.SPI_ROLE_DIRECTORY_PANE : None, \
272
 
        atspi.SPI_ROLE_DRAWING_AREA : None, \
273
 
        atspi.SPI_ROLE_FILE_CHOOSER : None, \
274
 
        atspi.SPI_ROLE_FILLER : None, \
275
 
        atspi.SPI_ROLE_FONT_CHOOSER : None, \
276
 
        atspi.SPI_ROLE_FRAME : window_xpm, \
277
 
        atspi.SPI_ROLE_GLASS_PANE : None, \
278
 
        atspi.SPI_ROLE_HTML_CONTAINER : None, \
279
 
        atspi.SPI_ROLE_ICON : image_xpm, \
280
 
        atspi.SPI_ROLE_IMAGE : image_xpm, \
281
 
        atspi.SPI_ROLE_INTERNAL_FRAME : None, \
282
 
        atspi.SPI_ROLE_LABEL : label_xpm, \
283
 
        atspi.SPI_ROLE_LAYERED_PANE : viewport_xpm, \
284
 
        atspi.SPI_ROLE_LIST : None, \
285
 
        atspi.SPI_ROLE_LIST_ITEM : None, \
286
 
        atspi.SPI_ROLE_MENU : menuitem_xpm, \
287
 
        atspi.SPI_ROLE_MENU_BAR : menubar_xpm, \
288
 
        atspi.SPI_ROLE_MENU_ITEM : menuitem_xpm, \
289
 
        atspi.SPI_ROLE_OPTION_PANE : None, \
290
 
        atspi.SPI_ROLE_PAGE_TAB : notebook_xpm, \
291
 
        atspi.SPI_ROLE_PAGE_TAB_LIST : notebook_xpm, \
292
 
        atspi.SPI_ROLE_PANEL : viewport_xpm, \
293
 
        atspi.SPI_ROLE_PASSWORD_TEXT : None, \
294
 
        atspi.SPI_ROLE_POPUP_MENU : None, \
295
 
        atspi.SPI_ROLE_PROGRESS_BAR : None, \
296
 
        atspi.SPI_ROLE_PUSH_BUTTON : button_xpm, \
297
 
        atspi.SPI_ROLE_RADIO_BUTTON : None, \
298
 
        atspi.SPI_ROLE_RADIO_MENU_ITEM : None, \
299
 
        atspi.SPI_ROLE_ROOT_PANE : viewport_xpm, \
300
 
        atspi.SPI_ROLE_ROW_HEADER : None, \
301
 
        atspi.SPI_ROLE_SCROLL_BAR : vscrollbar_xpm, \
302
 
        atspi.SPI_ROLE_SCROLL_PANE : scrolledwindow_xpm, \
303
 
        atspi.SPI_ROLE_SEPARATOR : vseparator_xpm, \
304
 
        atspi.SPI_ROLE_SLIDER : None, \
305
 
        atspi.SPI_ROLE_SPIN_BUTTON : spinbutton_xpm, \
306
 
        atspi.SPI_ROLE_SPLIT_PANE : None, \
307
 
        atspi.SPI_ROLE_STATUS_BAR : statusbar_xpm, \
308
 
        atspi.SPI_ROLE_TABLE : table_xpm, \
309
 
        atspi.SPI_ROLE_TABLE_CELL : treeitem_xpm, \
310
 
        atspi.SPI_ROLE_TABLE_COLUMN_HEADER : None, \
311
 
        atspi.SPI_ROLE_TABLE_ROW_HEADER : None, \
312
 
        atspi.SPI_ROLE_TEAROFF_MENU_ITEM : None, \
313
 
        atspi.SPI_ROLE_TERMINAL : None, \
314
 
        atspi.SPI_ROLE_TEXT : text_xpm, \
315
 
        atspi.SPI_ROLE_TOGGLE_BUTTON : None, \
316
 
        atspi.SPI_ROLE_TOOL_BAR : toolbar_xpm, \
317
 
        atspi.SPI_ROLE_TOOL_TIP : None, \
318
 
        atspi.SPI_ROLE_TREE : tree_xpm, \
319
 
        atspi.SPI_ROLE_TREE_TABLE : tree_xpm, \
320
 
        atspi.SPI_ROLE_UNKNOWN : unknown_xpm, \
321
 
        atspi.SPI_ROLE_VIEWPORT : viewport_xpm, \
322
 
        atspi.SPI_ROLE_WINDOW : window_xpm, \
323
 
        atspi.SPI_ROLE_EXTENDED : None, \
324
 
        atspi.SPI_ROLE_HEADER : None, \
325
 
        atspi.SPI_ROLE_FOOTER : None, \
326
 
        atspi.SPI_ROLE_PARAGRAPH : None, \
327
 
        atspi.SPI_ROLE_RULER : None, \
328
 
        atspi.SPI_ROLE_APPLICATION : None, \
329
 
        atspi.SPI_ROLE_AUTOCOMPLETE : None, \
330
 
        atspi.SPI_ROLE_EDITBAR : None, \
331
 
        atspi.SPI_ROLE_EMBEDDED : None, \
332
 
        atspi.SPI_ROLE_LAST_DEFINED: None }
 
253
        atspi.SPI_ROLE_INVALID : None, \
 
254
        atspi.SPI_ROLE_ACCEL_LABEL : label_xpm, \
 
255
        atspi.SPI_ROLE_ALERT : None, \
 
256
        atspi.SPI_ROLE_ANIMATION : None, \
 
257
        atspi.SPI_ROLE_ARROW : None, \
 
258
        atspi.SPI_ROLE_CALENDAR : None, \
 
259
        atspi.SPI_ROLE_CANVAS : None, \
 
260
        atspi.SPI_ROLE_CHECK_BOX : checkbutton_xpm, \
 
261
        atspi.SPI_ROLE_CHECK_MENU_ITEM : checkmenuitem_xpm, \
 
262
        atspi.SPI_ROLE_COLOR_CHOOSER : colorselection_xpm, \
 
263
        atspi.SPI_ROLE_COLUMN_HEADER : None, \
 
264
        atspi.SPI_ROLE_COMBO_BOX : combo_xpm, \
 
265
        atspi.SPI_ROLE_DATE_EDITOR : None, \
 
266
        atspi.SPI_ROLE_DESKTOP_ICON : None, \
 
267
        atspi.SPI_ROLE_DESKTOP_FRAME : None, \
 
268
        atspi.SPI_ROLE_DIAL : None, \
 
269
        atspi.SPI_ROLE_DIALOG : dialog_xpm, \
 
270
        atspi.SPI_ROLE_DIRECTORY_PANE : None, \
 
271
        atspi.SPI_ROLE_DRAWING_AREA : None, \
 
272
        atspi.SPI_ROLE_FILE_CHOOSER : None, \
 
273
        atspi.SPI_ROLE_FILLER : None, \
 
274
        atspi.SPI_ROLE_FONT_CHOOSER : None, \
 
275
        atspi.SPI_ROLE_FRAME : window_xpm, \
 
276
        atspi.SPI_ROLE_GLASS_PANE : None, \
 
277
        atspi.SPI_ROLE_HTML_CONTAINER : None, \
 
278
        atspi.SPI_ROLE_ICON : image_xpm, \
 
279
        atspi.SPI_ROLE_IMAGE : image_xpm, \
 
280
        atspi.SPI_ROLE_INTERNAL_FRAME : None, \
 
281
        atspi.SPI_ROLE_LABEL : label_xpm, \
 
282
        atspi.SPI_ROLE_LAYERED_PANE : viewport_xpm, \
 
283
        atspi.SPI_ROLE_LIST : None, \
 
284
        atspi.SPI_ROLE_LIST_ITEM : None, \
 
285
        atspi.SPI_ROLE_MENU : menuitem_xpm, \
 
286
        atspi.SPI_ROLE_MENU_BAR : menubar_xpm, \
 
287
        atspi.SPI_ROLE_MENU_ITEM : menuitem_xpm, \
 
288
        atspi.SPI_ROLE_OPTION_PANE : None, \
 
289
        atspi.SPI_ROLE_PAGE_TAB : notebook_xpm, \
 
290
        atspi.SPI_ROLE_PAGE_TAB_LIST : notebook_xpm, \
 
291
        atspi.SPI_ROLE_PANEL : viewport_xpm, \
 
292
        atspi.SPI_ROLE_PASSWORD_TEXT : None, \
 
293
        atspi.SPI_ROLE_POPUP_MENU : None, \
 
294
        atspi.SPI_ROLE_PROGRESS_BAR : None, \
 
295
        atspi.SPI_ROLE_PUSH_BUTTON : button_xpm, \
 
296
        atspi.SPI_ROLE_RADIO_BUTTON : None, \
 
297
        atspi.SPI_ROLE_RADIO_MENU_ITEM : None, \
 
298
        atspi.SPI_ROLE_ROOT_PANE : viewport_xpm, \
 
299
        atspi.SPI_ROLE_ROW_HEADER : None, \
 
300
        atspi.SPI_ROLE_SCROLL_BAR : vscrollbar_xpm, \
 
301
        atspi.SPI_ROLE_SCROLL_PANE : scrolledwindow_xpm, \
 
302
        atspi.SPI_ROLE_SEPARATOR : vseparator_xpm, \
 
303
        atspi.SPI_ROLE_SLIDER : None, \
 
304
        atspi.SPI_ROLE_SPIN_BUTTON : spinbutton_xpm, \
 
305
        atspi.SPI_ROLE_SPLIT_PANE : None, \
 
306
        atspi.SPI_ROLE_STATUS_BAR : statusbar_xpm, \
 
307
        atspi.SPI_ROLE_TABLE : table_xpm, \
 
308
        atspi.SPI_ROLE_TABLE_CELL : treeitem_xpm, \
 
309
        atspi.SPI_ROLE_TABLE_COLUMN_HEADER : None, \
 
310
        atspi.SPI_ROLE_TABLE_ROW_HEADER : None, \
 
311
        atspi.SPI_ROLE_TEAROFF_MENU_ITEM : None, \
 
312
        atspi.SPI_ROLE_TERMINAL : None, \
 
313
        atspi.SPI_ROLE_TEXT : text_xpm, \
 
314
        atspi.SPI_ROLE_TOGGLE_BUTTON : None, \
 
315
        atspi.SPI_ROLE_TOOL_BAR : toolbar_xpm, \
 
316
        atspi.SPI_ROLE_TOOL_TIP : None, \
 
317
        atspi.SPI_ROLE_TREE : tree_xpm, \
 
318
        atspi.SPI_ROLE_TREE_TABLE : tree_xpm, \
 
319
        atspi.SPI_ROLE_UNKNOWN : unknown_xpm, \
 
320
        atspi.SPI_ROLE_VIEWPORT : viewport_xpm, \
 
321
        atspi.SPI_ROLE_WINDOW : window_xpm, \
 
322
        atspi.SPI_ROLE_EXTENDED : None, \
 
323
        atspi.SPI_ROLE_HEADER : None, \
 
324
        atspi.SPI_ROLE_FOOTER : None, \
 
325
        atspi.SPI_ROLE_PARAGRAPH : None, \
 
326
        atspi.SPI_ROLE_RULER : None, \
 
327
        atspi.SPI_ROLE_APPLICATION : None, \
 
328
        atspi.SPI_ROLE_AUTOCOMPLETE : None, \
 
329
        atspi.SPI_ROLE_EDITBAR : None, \
 
330
        atspi.SPI_ROLE_EMBEDDED : None, \
 
331
        atspi.SPI_ROLE_LAST_DEFINED: None }
333
332
 
334
333
def getPixbufForNode(node):
335
 
        theme = gtk.icon_theme_get_default()
336
 
        if node.role==atspi.SPI_ROLE_APPLICATION:
337
 
                # FIXME: Use the pixbuf from libwcnk (if available):
338
 
                # wnckApp = Application(node).getWnckApplication()
339
 
                # if wnckApp
340
 
                try: return theme.load_icon(node.name, 24, gtk.ICON_LOOKUP_USE_BUILTIN)
341
 
                except gobject.GError: 
342
 
                        try: return theme.load_icon(node.name.lower(), 24, gtk.ICON_LOOKUP_USE_BUILTIN)
343
 
                        except gobject.GError: return None
344
 
        elif node.parent:
345
 
                return iconForRole[node.role]
346
 
        else:
347
 
                return theme.load_icon("gnome-fs-desktop", 24, gtk.ICON_LOOKUP_USE_BUILTIN)
 
334
    theme = gtk.icon_theme_get_default()
 
335
    try:
 
336
        if node.role==atspi.SPI_ROLE_APPLICATION:
 
337
            # FIXME: Use the pixbuf from libwcnk (if available):
 
338
            # wnckApp = Application(node).getWnckApplication()
 
339
            # if wnckApp
 
340
            try: return theme.load_icon(node.name, 24, gtk.ICON_LOOKUP_USE_BUILTIN)
 
341
            except gobject.GError:
 
342
                try: return theme.load_icon(node.name.lower(), 24, gtk.ICON_LOOKUP_USE_BUILTIN)
 
343
                except gobject.GError: return None
 
344
        elif node.parent:
 
345
            return iconForRole[node.role]
 
346
        else:
 
347
            return theme.load_icon("gnome-fs-desktop", 24, gtk.ICON_LOOKUP_USE_BUILTIN)
 
348
    except atspi.SpiException:
 
349
        return theme.load_icon("gtk-dialog-error", 24, gtk.ICON_LOOKUP_USE_BUILTIN)
348
350
 
349
351
def getNodeAttr(column, cell, model, iter, attr):
350
 
        node = model.get_value(iter, MODEL_FIELD_NODE)
351
 
        cell.set_property('text', getattr(node, attr))
 
352
    node = model.get_value(iter, MODEL_FIELD_NODE)
 
353
    try:
 
354
        text = getattr(node, attr)
 
355
    except atspi.SpiException:
 
356
        text = "(broken node)"
 
357
    cell.set_property('text', text)
352
358
 
353
359
def getCellPixbufForNode(column, cell, model, iter):
354
 
        node = model.get_value(iter, MODEL_FIELD_NODE)  
355
 
        pixbuf = getPixbufForNode(node)
356
 
        cell.set_property('pixbuf', pixbuf)
 
360
    node = model.get_value(iter, MODEL_FIELD_NODE)
 
361
    pixbuf = getPixbufForNode(node)
 
362
    cell.set_property('pixbuf', pixbuf)
357
363
 
358
364
def main():
359
 
        connectSignals()
360
 
 
361
 
        nameTextLabel.set_text('')
362
 
        roleNameTextLabel.set_text('')
363
 
        descTextLabel.set_text('')
364
 
        actionsTextLabel.set_text('')
365
 
        textTextView.set_sensitive(False)
366
 
        textTextView.get_buffer().set_text('')
367
 
 
368
 
        global sniff, view, model
369
 
 
370
 
        col = gtk.TreeViewColumn()
371
 
        cellRenderer = gtk.CellRendererPixbuf()
372
 
        col.pack_start(cellRenderer, expand = False)
373
 
        col.set_cell_data_func(cellRenderer, getCellPixbufForNode)
374
 
 
375
 
        cellRenderer = gtk.CellRendererText()
376
 
        col.pack_end(cellRenderer, expand = False)
377
 
        col.set_cell_data_func(cellRenderer, getNodeAttr, 'name')
378
 
 
379
 
        col.set_title('Name')
380
 
 
381
 
        view.insert_column(col, -1)
382
 
        #view.insert_column_with_data_func(-1, "Role Name", \
383
 
        #               gtk.CellRendererText(), getNodeAttr, 'roleName')
384
 
        #view.insert_column_with_data_func(-1, "Description", \
385
 
        #               gtk.CellRendererText(), getNodeAttr, 'description')
386
 
        for column in view.get_columns():
387
 
                column.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE)
388
 
                column.set_resizable(True)
389
 
        view.show()
390
 
        sniff.show_all ()
391
 
        
392
 
        model = gtk.TreeStore(gobject.TYPE_PYOBJECT, gobject.TYPE_STRING, \
393
 
                        gobject.TYPE_STRING, gobject.TYPE_STRING)
394
 
        view.set_model(model)
395
 
 
396
 
        resetModel()
397
 
        
398
 
        gtk.main()
 
365
    connectSignals()
 
366
 
 
367
    nameTextLabel.set_text('')
 
368
    roleNameTextLabel.set_text('')
 
369
    descTextLabel.set_text('')
 
370
    actionsTextLabel.set_text('')
 
371
    textTextView.set_sensitive(False)
 
372
    textTextView.get_buffer().set_text('')
 
373
 
 
374
    global sniff, view, model
 
375
 
 
376
    col = gtk.TreeViewColumn()
 
377
    cellRenderer = gtk.CellRendererPixbuf()
 
378
    col.pack_start(cellRenderer, expand = False)
 
379
    col.set_cell_data_func(cellRenderer, getCellPixbufForNode)
 
380
 
 
381
    cellRenderer = gtk.CellRendererText()
 
382
    col.pack_end(cellRenderer, expand = False)
 
383
    col.set_cell_data_func(cellRenderer, getNodeAttr, 'name')
 
384
 
 
385
    col.set_title('Name')
 
386
 
 
387
    view.insert_column(col, -1)
 
388
    #view.insert_column_with_data_func(-1, "Role Name", \
 
389
    #               gtk.CellRendererText(), getNodeAttr, 'roleName')
 
390
    #view.insert_column_with_data_func(-1, "Description", \
 
391
    #               gtk.CellRendererText(), getNodeAttr, 'description')
 
392
    for column in view.get_columns():
 
393
        column.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE)
 
394
        column.set_resizable(True)
 
395
    view.show()
 
396
    sniff.show_all ()
 
397
 
 
398
    model = gtk.TreeStore(gobject.TYPE_PYOBJECT, gobject.TYPE_STRING, \
 
399
                    gobject.TYPE_STRING, gobject.TYPE_STRING)
 
400
    view.set_model(model)
 
401
 
 
402
    resetModel()
 
403
 
 
404
    gtk.main()
399
405
 
400
406
if __name__ == '__main__': main()
401