self.child_items.append(child_item)
                        self.child_count += 1
 
-# Context-sensitive call graph data model
+# Context-sensitive call graph data model base
 
-class CallGraphModel(TreeModel):
+class CallGraphModelBase(TreeModel):
 
        def __init__(self, glb, parent=None):
-               super(CallGraphModel, self).__init__(glb, parent)
-
-       def GetRoot(self):
-               return CallGraphRootItem(self.glb)
-
-       def columnCount(self, parent=None):
-               return 7
-
-       def columnHeader(self, column):
-               headers = ["Call Path", "Object", "Count ", "Time (ns) ", "Time (%) ", "Branch Count ", "Branch Count (%) "]
-               return headers[column]
-
-       def columnAlignment(self, column):
-               alignment = [ Qt.AlignLeft, Qt.AlignLeft, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight ]
-               return alignment[column]
+               super(CallGraphModelBase, self).__init__(glb, parent)
 
        def FindSelect(self, value, pattern, query):
                if pattern:
                                match = " GLOB '" + str(value) + "'"
                else:
                        match = " = '" + str(value) + "'"
-               QueryExec(query, "SELECT call_path_id, comm_id, thread_id"
-                                               " FROM calls"
-                                               " INNER JOIN call_paths ON calls.call_path_id = call_paths.id"
-                                               " INNER JOIN symbols ON call_paths.symbol_id = symbols.id"
-                                               " WHERE symbols.name" + match +
-                                               " GROUP BY comm_id, thread_id, call_path_id"
-                                               " ORDER BY comm_id, thread_id, call_path_id")
-
-       def FindPath(self, query):
-               # Turn the query result into a list of ids that the tree view can walk
-               # to open the tree at the right place.
-               ids = []
-               parent_id = query.value(0)
-               while parent_id:
-                       ids.insert(0, parent_id)
-                       q2 = QSqlQuery(self.glb.db)
-                       QueryExec(q2, "SELECT parent_id"
-                                       " FROM call_paths"
-                                       " WHERE id = " + str(parent_id))
-                       if not q2.next():
-                               break
-                       parent_id = q2.value(0)
-               # The call path root is not used
-               if ids[0] == 1:
-                       del ids[0]
-               ids.insert(0, query.value(2))
-               ids.insert(0, query.value(1))
-               return ids
+               self.DoFindSelect(query, match)
 
        def Found(self, query, found):
                if found:
        def FindDone(self, thread, callback, ids):
                callback(ids)
 
+# Context-sensitive call graph data model
+
+class CallGraphModel(CallGraphModelBase):
+
+       def __init__(self, glb, parent=None):
+               super(CallGraphModel, self).__init__(glb, parent)
+
+       def GetRoot(self):
+               return CallGraphRootItem(self.glb)
+
+       def columnCount(self, parent=None):
+               return 7
+
+       def columnHeader(self, column):
+               headers = ["Call Path", "Object", "Count ", "Time (ns) ", "Time (%) ", "Branch Count ", "Branch Count (%) "]
+               return headers[column]
+
+       def columnAlignment(self, column):
+               alignment = [ Qt.AlignLeft, Qt.AlignLeft, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight ]
+               return alignment[column]
+
+       def DoFindSelect(self, query, match):
+               QueryExec(query, "SELECT call_path_id, comm_id, thread_id"
+                                               " FROM calls"
+                                               " INNER JOIN call_paths ON calls.call_path_id = call_paths.id"
+                                               " INNER JOIN symbols ON call_paths.symbol_id = symbols.id"
+                                               " WHERE symbols.name" + match +
+                                               " GROUP BY comm_id, thread_id, call_path_id"
+                                               " ORDER BY comm_id, thread_id, call_path_id")
+
+       def FindPath(self, query):
+               # Turn the query result into a list of ids that the tree view can walk
+               # to open the tree at the right place.
+               ids = []
+               parent_id = query.value(0)
+               while parent_id:
+                       ids.insert(0, parent_id)
+                       q2 = QSqlQuery(self.glb.db)
+                       QueryExec(q2, "SELECT parent_id"
+                                       " FROM call_paths"
+                                       " WHERE id = " + str(parent_id))
+                       if not q2.next():
+                               break
+                       parent_id = q2.value(0)
+               # The call path root is not used
+               if ids[0] == 1:
+                       del ids[0]
+               ids.insert(0, query.value(2))
+               ids.insert(0, query.value(1))
+               return ids
+
 # Vertical widget layout
 
 class VBox():