| 105 | | # This function initialize an empty result tree |
| 106 | | def __treeInit__(self): |
| 107 | | def callback_click(widget, event) : |
| 108 | | #middle click, open in background |
| 109 | | if event.button == 2 : |
| 110 | | print "TODO : open bug in background" |
| 111 | | #right click menu |
| 112 | | elif event.button == 3 : |
| 113 | | zetuple = widget.get_selection().get_selected() |
| 114 | | itera = zetuple[1] |
| 115 | | store = zetuple[0] |
| 116 | | def browser_callback(menuitem) : |
| 117 | | #if we have not yet left clicked in the results |
| 118 | | # itera will be None |
| 119 | | # Fixme ! |
| 120 | | if itera != None : |
| 121 | | bugnbr = store.get_value(itera,0) |
| 122 | | gnome.url_show(self.bts.getBugUrl(bugnbr)) |
| 123 | | browser = gtk.MenuItem("Open in a web browser") |
| 124 | | browser.connect("activate", browser_callback) |
| 125 | | browser.show() |
| 126 | | menu = gtk.Menu() |
| 127 | | menu.append(browser) |
| 128 | | menu.popup(None, None, None, event.button, event.time) |
| 129 | | #We add an empty tree result first |
| 130 | | listing = gtk.ListStore(gobject.TYPE_INT,gobject.TYPE_STRING) |
| 131 | | tree = gtk.TreeView(listing) |
| 132 | | tree.connect("button-press-event",callback_click) |
| 133 | | renderer = gtk.CellRendererText() |
| 134 | | column = gtk.TreeViewColumn("Bug #", renderer, text=0) |
| 135 | | column.set_resizable(1) |
| 136 | | column.set_sort_column_id(0) |
| 137 | | column2 = gtk.TreeViewColumn("Product", renderer, text=1) |
| 138 | | column2.set_resizable(1) |
| 139 | | column2.set_sort_column_id(1) |
| 140 | | column3 = gtk.TreeViewColumn("Titre", renderer, text=2) |
| 141 | | column3.set_resizable(1) |
| 142 | | column3.set_sort_column_id(2) |
| 143 | | column4 = gtk.TreeViewColumn("Importance", renderer, text=3) |
| 144 | | column4.set_resizable(1) |
| 145 | | column4.set_sort_column_id(3) |
| 146 | | column5 = gtk.TreeViewColumn("Status", renderer, text=4) |
| 147 | | column5.set_resizable(1) |
| 148 | | column5.set_sort_column_id(4) |
| 149 | | tree.append_column(column) |
| 150 | | tree.append_column(column2) |
| 151 | | tree.append_column(column3) |
| 152 | | tree.append_column(column4) |
| 153 | | tree.append_column(column5) |
| 154 | | tree.show() |
| 155 | | return tree |
| | 107 | |
| 256 | | self.__searchDisplay(self.bts.genericSearch(searchString),dic) |
| 257 | | |
| 258 | | #We did a simple search |
| 259 | | def __searchDisplay(self, store,args): |
| 260 | | #First, we ask for the result as it can takes some times |
| 261 | | if len(store) == 0 : |
| 262 | | tab = gtk.Label("No result matching your search") |
| 263 | | tab.show() |
| 264 | | else : |
| 265 | | tree=self.__treeInit__() |
| 266 | | tree.connect("row-activated", self.__row_clicked, tree.get_selection()) |
| 267 | | tree.set_headers_clickable(1) |
| 268 | | tree.set_rules_hint(1) |
| 269 | | tree.set_model(store) |
| 270 | | tab = gtk.ScrolledWindow() |
| 271 | | tab.show() |
| 272 | | tab.add(tree) |
| 273 | | zepage = page(tab, args) |
| 274 | | self.insertTab(zepage) |
| 275 | | |
| 276 | | #Callback for the row_activated in a search view |
| 277 | | def __row_clicked(widget, path, view_column, user_param1,data) : |
| 278 | | zetuple = data.get_selected() |
| 279 | | bug_nbr = zetuple[0].get_value(zetuple[1],0) |
| 280 | | dic = makedict() |
| 281 | | dic["method"] = 1 |
| 282 | | dic["bug"] = str(bug_nbr) |
| 283 | | widget.__bugDisplay(widget.bts.retrieveBug(bug_nbr),dic) |
| 284 | | |
| 285 | | |
| 286 | | # This function takes a bug Object and then display it nicely |
| 287 | | # (it will be nice one day, I swear...) |
| 288 | | def __bugDisplay(self, zebug, descr) : |
| 289 | | nbr = zebug.getNbr() |
| 290 | | def callback_click(widget, event) : |
| 291 | | #middle click, open in background |
| 292 | | if event.button == 2 : |
| 293 | | print "What do you want to do with middle click ?" |
| 294 | | #right click menu |
| 295 | | elif event.button == 3 : |
| 296 | | def browser_callback(menuitem) : |
| 297 | | gnome.url_show(self.bts.getBugUrl(nbr)) |
| 298 | | browser = gtk.MenuItem("Open in a web browser") |
| 299 | | browser.connect("activate", browser_callback) |
| 300 | | browser.show() |
| 301 | | menu = gtk.Menu() |
| 302 | | menu.append(browser) |
| 303 | | menu.popup(None, None, None, event.button, event.time) |
| 304 | | |
| 305 | | def callback_postcom(widget,buff,nbr) : |
| 306 | | itera = buff.get_bounds() |
| 307 | | content = buff.get_text(itera[0],itera[1]) |
| 308 | | if content.strip() != '' : |
| 309 | | #FIXME : support title in comments |
| 310 | | title="Dummy title" |
| 311 | | self.bts.postComment(nbr,title,content) |
| 312 | | |
| 313 | | if nbr < 0 : |
| 314 | | main_widget = gtk.Label("This specific bug doesnt exist") |
| 315 | | main_widget.show() |
| 316 | | else : |
| 317 | | bugnbr=str(nbr) |
| 318 | | bugtemplate = "bug_template.glade" |
| 319 | | bugwidget = gtk.glade.XML(bugtemplate) |
| 320 | | widget_comments_nbr = bugwidget.get_widget("comments_nbr") |
| 321 | | textcom = bugwidget.get_widget("text_comment") |
| 322 | | postbutton = bugwidget.get_widget("post_button") |
| 323 | | postbutton.connect("clicked",callback_postcom, textcom.get_buffer(),bugnbr) |
| 324 | | # handle nicely plurals |
| 325 | | bugtotal = zebug.comNbr() |
| 326 | | if bugtotal > 1 : |
| 327 | | com_text = "%d comments : "%bugtotal |
| 328 | | else : |
| 329 | | com_text = "%d comment : "%bugtotal |
| 330 | | widget_comments_nbr.set_text(com_text) |
| 331 | | widget_comments = bugwidget.get_widget("com_frame") |
| 332 | | widget_nbr = bugwidget.get_widget("number") |
| 333 | | title_bugnbr = "Bug #%s :" %bugnbr |
| 334 | | widget_nbr.set_text(title_bugnbr) |
| 335 | | widget_title = bugwidget.get_widget("title") |
| 336 | | title_title = "%s" %zebug.getTitle() |
| 337 | | widget_title.set_text(title_title) |
| 338 | | widget_description = bugwidget.get_widget("description") |
| 339 | | widget_description.set_text(zebug.getDescription()) |
| 340 | | widget_status= bugwidget.get_widget("status") |
| 341 | | widget_status.set_text(zebug.getStatus()) |
| 342 | | widget_importance= bugwidget.get_widget("importance") |
| 343 | | widget_importance.set_text(zebug.getImportance()) |
| 344 | | widget_assignee= bugwidget.get_widget("assigned") |
| 345 | | widget_assignee.set_text(zebug.getAssignee()) |
| 346 | | widget_package= bugwidget.get_widget("package") |
| 347 | | widget_package.set_text(zebug.getPackage()) |
| 348 | | #inserting comments |
| 349 | | hbox = gtk.VBox(spacing=2) |
| 350 | | hbox.show() |
| 351 | | for i in zebug.getAllComments(): |
| 352 | | comwidget = gtk.glade.XML("comment.glade") |
| 353 | | comwidget.get_widget("poster").set_text(i.getAuthor()) |
| 354 | | comwidget.get_widget("title").set_text(i.getTitle()) |
| 355 | | comwidget.get_widget("date").set_text(i.getDate()) |
| 356 | | comwidget.get_widget("comment_body").set_text(i.getContent()) |
| 357 | | hbox.add(comwidget.get_widget("comment")) |
| 358 | | |
| 359 | | to_remove = bugwidget.get_widget("dummy_label") |
| 360 | | widget_comments.remove(to_remove) |
| 361 | | widget_comments.add(hbox) |
| 362 | | #We take the vbox to insert it |
| 363 | | main_widget = bugwidget.get_widget("bug_main") |
| 364 | | main_widget.connect("button-press-event",callback_click) |
| | 207 | self.retriever.display(dic) |
| | 208 | |
| 366 | | zepage = page(main_widget, descr) |
| 367 | | self.insertTab(zepage) |
| 368 | | |
| 369 | | |
| 370 | | # Adding a tab |
| 371 | | # we receive as arguments an objet page |
| 372 | | def insertTab(self, tab_page) : |
| 373 | | #close tab button callback |
| 374 | | tab = tab_page.get_widget() |
| 375 | | name = tab_page.get_title() |
| 376 | | def closeTab(widget, data): |
| 377 | | page = self.bugs_tabs.page_num(data) |
| 378 | | self.bugs_tabs.remove_page(page) |
| 379 | | #this is ugly ! I don't want to use glade for this |
| 380 | | label_widget=gtk.glade.XML("tab_label.glade") |
| 381 | | dic = {"on_close_tab_clicked" : lambda close: closeTab(close, tab) } |
| 382 | | label_widget.signal_autoconnect(dic) |
| 383 | | label=label_widget.get_widget("label1") |
| 384 | | label.set_text(name) |
| 385 | | top=label_widget.get_widget("hbox1") |
| 386 | | tabid = self.bugs_tabs.insert_page(tab, top) |
| 387 | | |
| 388 | | |
| 389 | | #make a search dictionnary |
| 390 | | #Those dict are passed as argument to __searchDisplay |
| 391 | | def makedict() : |
| 392 | | return dict([["method",None],["search",None],["product",None],["bug",None]]) |
| 393 | | |