Make Leak into a treeview, double click to have referrers, right click
to obtain referents of selected line svn: r12057
This commit is contained in:
@@ -40,6 +40,8 @@ from bsddb.db import DBError
|
|||||||
#
|
#
|
||||||
#------------------------------------------------------------------------
|
#------------------------------------------------------------------------
|
||||||
from gtk import glade
|
from gtk import glade
|
||||||
|
import gtk
|
||||||
|
import pango
|
||||||
import gc
|
import gc
|
||||||
|
|
||||||
#------------------------------------------------------------------------
|
#------------------------------------------------------------------------
|
||||||
@@ -50,6 +52,7 @@ import gc
|
|||||||
from PluginUtils import Tool
|
from PluginUtils import Tool
|
||||||
from gen.plug import PluginManager
|
from gen.plug import PluginManager
|
||||||
import ManagedWindow
|
import ManagedWindow
|
||||||
|
from QuestionDialog import InfoDialog
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@@ -66,12 +69,35 @@ class Leak(Tool.Tool,ManagedWindow.ManagedWindow):
|
|||||||
glade_file = os.path.dirname(__file__) + os.sep + "leak.glade"
|
glade_file = os.path.dirname(__file__) + os.sep + "leak.glade"
|
||||||
self.glade = glade.XML(glade_file,"top","gramps")
|
self.glade = glade.XML(glade_file,"top","gramps")
|
||||||
|
|
||||||
window = self.glade.get_widget("top")
|
self.window = self.glade.get_widget("top")
|
||||||
self.eval = self.glade.get_widget("eval")
|
self.scroll = self.glade.get_widget("scrolledwindow1")
|
||||||
self.ebuf = self.eval.get_buffer()
|
#add a listview to the scrollable
|
||||||
|
self.list = gtk.TreeView()
|
||||||
|
self.list.set_headers_visible(True)
|
||||||
|
self.list.connect('button-press-event', self._button_press)
|
||||||
|
self.scroll.add(self.list)
|
||||||
|
#make a model
|
||||||
|
self.modeldata = []
|
||||||
|
self.model = gtk.ListStore(int, str)
|
||||||
|
self.list.set_model(self.model)
|
||||||
|
|
||||||
|
#set the colums
|
||||||
|
self.renderer = gtk.CellRendererText()
|
||||||
|
column = gtk.TreeViewColumn(_('Number'), self.renderer, text=0)
|
||||||
|
column.set_resizable(True)
|
||||||
|
column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
|
||||||
|
self.list.append_column(column)
|
||||||
|
column = gtk.TreeViewColumn(_('Uncollected object'), self.renderer,
|
||||||
|
text=1)
|
||||||
|
column.set_resizable(True)
|
||||||
|
column.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE)
|
||||||
|
self.list.append_column(column)
|
||||||
|
self.selection = self.list.get_selection()
|
||||||
|
|
||||||
gc.set_debug(gc.DEBUG_UNCOLLECTABLE|gc.DEBUG_OBJECTS|gc.DEBUG_SAVEALL)
|
gc.set_debug(gc.DEBUG_UNCOLLECTABLE|gc.DEBUG_OBJECTS|gc.DEBUG_SAVEALL)
|
||||||
|
|
||||||
self.set_window(window,self.glade.get_widget('title'),self.title)
|
self.set_window(self.window, self.glade.get_widget('title'),
|
||||||
|
self.title)
|
||||||
|
|
||||||
self.glade.signal_autoconnect({
|
self.glade.signal_autoconnect({
|
||||||
"on_apply_clicked" : self.apply_clicked,
|
"on_apply_clicked" : self.apply_clicked,
|
||||||
@@ -83,23 +109,49 @@ class Leak(Tool.Tool,ManagedWindow.ManagedWindow):
|
|||||||
def build_menu_names(self, obj):
|
def build_menu_names(self, obj):
|
||||||
return (self.title,None)
|
return (self.title,None)
|
||||||
|
|
||||||
|
def _button_press(self, obj, event):
|
||||||
|
if event.type == gtk.gdk._2BUTTON_PRESS and event.button == 1:
|
||||||
|
self.referenced_in()
|
||||||
|
return True
|
||||||
|
elif event.type == gtk.gdk.BUTTON_PRESS and event.button == 3:
|
||||||
|
self.refers_to()
|
||||||
|
return True
|
||||||
|
|
||||||
|
def referenced_in(self):
|
||||||
|
model, iter = self.selection.get_selected()
|
||||||
|
if iter is not None:
|
||||||
|
count = model.get_value(iter, 0)
|
||||||
|
referrers = gc.get_referrers(self.modeldata[count])
|
||||||
|
text = ""
|
||||||
|
for referrer in referrers:
|
||||||
|
text += str(referrer) + '\n'
|
||||||
|
InfoDialog(_('Referrers of %d') % count, text,
|
||||||
|
parent=self.window)
|
||||||
|
|
||||||
|
def refers_to(self):
|
||||||
|
model, iter = self.selection.get_selected()
|
||||||
|
if iter is not None:
|
||||||
|
count = model.get_value(iter, 0)
|
||||||
|
referents = gc.get_referents(self.modeldata[count])
|
||||||
|
text = ""
|
||||||
|
for referent in referents:
|
||||||
|
text += str(referent) + '\n'
|
||||||
|
InfoDialog(_('%d refers to') % count, text,
|
||||||
|
parent=self.window)
|
||||||
|
|
||||||
def display(self):
|
def display(self):
|
||||||
gc.collect()
|
gc.collect()
|
||||||
mylist = []
|
self.model.clear()
|
||||||
|
count = 0
|
||||||
if len(gc.garbage):
|
if len(gc.garbage):
|
||||||
for each in gc.garbage:
|
for each in gc.garbage:
|
||||||
try:
|
try:
|
||||||
mylist.append(str(each))
|
self.modeldata.append(each)
|
||||||
|
self.model.append((count, str(each)))
|
||||||
except DBError:
|
except DBError:
|
||||||
mylist.append('db.DB instance at %s' % id(each))
|
self.modeldata.append(each)
|
||||||
self.ebuf.set_text(_("%d uncollected objects:\n\n" % len(mylist)))
|
self.model.append((count, 'db.DB instance at %s' % id(each)))
|
||||||
count = 1
|
|
||||||
for line in mylist:
|
|
||||||
self.ebuf.insert_at_cursor(" %d) %s\n" % (count, line))
|
|
||||||
count += 1
|
count += 1
|
||||||
else:
|
|
||||||
self.ebuf.set_text(_("No uncollected objects\n")
|
|
||||||
+ str(gc.get_debug()))
|
|
||||||
|
|
||||||
def apply_clicked(self, obj):
|
def apply_clicked(self, obj):
|
||||||
self.display()
|
self.display()
|
||||||
|
@@ -18,6 +18,8 @@
|
|||||||
<property name="skip_pager_hint">False</property>
|
<property name="skip_pager_hint">False</property>
|
||||||
<property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
|
<property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
|
||||||
<property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
|
<property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
|
||||||
|
<property name="focus_on_map">True</property>
|
||||||
|
<property name="urgency_hint">False</property>
|
||||||
<property name="has_separator">False</property>
|
<property name="has_separator">False</property>
|
||||||
<signal name="delete_event" handler="on_delete_event" last_modification_time="Fri, 25 Mar 2005 00:15:07 GMT"/>
|
<signal name="delete_event" handler="on_delete_event" last_modification_time="Fri, 25 Mar 2005 00:15:07 GMT"/>
|
||||||
|
|
||||||
@@ -88,6 +90,10 @@
|
|||||||
<property name="yalign">0.5</property>
|
<property name="yalign">0.5</property>
|
||||||
<property name="xpad">0</property>
|
<property name="xpad">0</property>
|
||||||
<property name="ypad">0</property>
|
<property name="ypad">0</property>
|
||||||
|
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
|
||||||
|
<property name="width_chars">-1</property>
|
||||||
|
<property name="single_line_mode">False</property>
|
||||||
|
<property name="angle">0</property>
|
||||||
</widget>
|
</widget>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="padding">0</property>
|
<property name="padding">0</property>
|
||||||
@@ -101,48 +107,11 @@
|
|||||||
<property name="border_width">6</property>
|
<property name="border_width">6</property>
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="n_rows">2</property>
|
<property name="n_rows">2</property>
|
||||||
<property name="n_columns">2</property>
|
<property name="n_columns">1</property>
|
||||||
<property name="homogeneous">False</property>
|
<property name="homogeneous">False</property>
|
||||||
<property name="row_spacing">6</property>
|
<property name="row_spacing">6</property>
|
||||||
<property name="column_spacing">6</property>
|
<property name="column_spacing">6</property>
|
||||||
|
|
||||||
<child>
|
|
||||||
<widget class="GtkScrolledWindow" id="scrolledwindow1">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">True</property>
|
|
||||||
<property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
|
|
||||||
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
|
|
||||||
<property name="shadow_type">GTK_SHADOW_IN</property>
|
|
||||||
<property name="window_placement">GTK_CORNER_TOP_LEFT</property>
|
|
||||||
|
|
||||||
<child>
|
|
||||||
<widget class="GtkTextView" id="eval">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">True</property>
|
|
||||||
<property name="editable">True</property>
|
|
||||||
<property name="overwrite">False</property>
|
|
||||||
<property name="accepts_tab">True</property>
|
|
||||||
<property name="justification">GTK_JUSTIFY_LEFT</property>
|
|
||||||
<property name="wrap_mode">GTK_WRAP_NONE</property>
|
|
||||||
<property name="cursor_visible">True</property>
|
|
||||||
<property name="pixels_above_lines">0</property>
|
|
||||||
<property name="pixels_below_lines">0</property>
|
|
||||||
<property name="pixels_inside_wrap">0</property>
|
|
||||||
<property name="left_margin">0</property>
|
|
||||||
<property name="right_margin">0</property>
|
|
||||||
<property name="indent">0</property>
|
|
||||||
<property name="text" translatable="yes"></property>
|
|
||||||
</widget>
|
|
||||||
</child>
|
|
||||||
</widget>
|
|
||||||
<packing>
|
|
||||||
<property name="left_attach">1</property>
|
|
||||||
<property name="right_attach">2</property>
|
|
||||||
<property name="top_attach">1</property>
|
|
||||||
<property name="bottom_attach">2</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
|
|
||||||
<child>
|
<child>
|
||||||
<widget class="GtkLabel" id="label2">
|
<widget class="GtkLabel" id="label2">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
@@ -156,16 +125,43 @@
|
|||||||
<property name="yalign">0.5</property>
|
<property name="yalign">0.5</property>
|
||||||
<property name="xpad">0</property>
|
<property name="xpad">0</property>
|
||||||
<property name="ypad">0</property>
|
<property name="ypad">0</property>
|
||||||
|
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
|
||||||
|
<property name="width_chars">-1</property>
|
||||||
|
<property name="single_line_mode">False</property>
|
||||||
|
<property name="angle">0</property>
|
||||||
</widget>
|
</widget>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">0</property>
|
<property name="left_attach">0</property>
|
||||||
<property name="right_attach">2</property>
|
<property name="right_attach">1</property>
|
||||||
<property name="top_attach">0</property>
|
<property name="top_attach">0</property>
|
||||||
<property name="bottom_attach">1</property>
|
<property name="bottom_attach">1</property>
|
||||||
<property name="x_options">fill</property>
|
<property name="x_options">fill</property>
|
||||||
<property name="y_options"></property>
|
<property name="y_options"></property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
|
|
||||||
|
<child>
|
||||||
|
<widget class="GtkScrolledWindow" id="scrolledwindow1">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
|
||||||
|
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
|
||||||
|
<property name="shadow_type">GTK_SHADOW_IN</property>
|
||||||
|
<property name="window_placement">GTK_CORNER_TOP_LEFT</property>
|
||||||
|
|
||||||
|
<child>
|
||||||
|
<placeholder/>
|
||||||
|
</child>
|
||||||
|
</widget>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">0</property>
|
||||||
|
<property name="right_attach">1</property>
|
||||||
|
<property name="top_attach">1</property>
|
||||||
|
<property name="bottom_attach">2</property>
|
||||||
|
<property name="x_options">expand|shrink|fill</property>
|
||||||
|
<property name="y_options">expand|shrink|fill</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
</widget>
|
</widget>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="padding">0</property>
|
<property name="padding">0</property>
|
||||||
|
Reference in New Issue
Block a user