Example #1
0
 def on_addr_changed(self, evt):
     cb = evt.GetEventObject()
     try:
         s = cb.GetValue()
         new_addr = util.str2int(s)
         self.grid.Table.set_base(new_addr)
         self.refresh()
         self.last_set_address = s
         if cb.FindString(s) < 0:
             cb.Append(s)
     except:
         cb.SetValue(self.last_set_address)
Example #2
0
 def on_addr_changed(self, evt):
     cb = evt.GetEventObject()
     try:
         s = cb.GetValue()
         new_addr = util.str2int(s)
         self.grid.Table.set_base(new_addr)
         self.refresh()
         self.last_set_address = s
         if cb.FindString(s) < 0:
             cb.Append(s)
     except:
         cb.SetValue(self.last_set_address)
Example #3
0
 def on_enter(self, evt):
     try:
         self.set_value(util.str2int(self.ctrl.GetValue()))
     except:
         pass
     self.unedit()
Example #4
0
 def on_enter(self, evt):
     try:
         self.set_value(util.str2int(self.ctrl.GetValue()))
     except:
         pass
     self.unedit()
Example #5
0
class RuntimeTree(gizmos.TreeListCtrl, ArtListMixin, KeyTree):
    def __init__(self, parent):
        self.parent = parent
        gizmos.TreeListCtrl.__init__(
            self,
            id=-1,
            parent=parent,
            style=wx.TR_DEFAULT_STYLE | wx.TR_FULL_ROW_HIGHLIGHT
            | wx.TR_HIDE_ROOT | wx.TR_HAS_BUTTONS | wx.TR_LINES_AT_ROOT
            | wx.TR_EDIT_LABELS)
        ArtListMixin.__init__(self)
        KeyTree.__init__(self)
        self.SetFont(
            wx.Font(8, wx.FONTFAMILY_MODERN, wx.FONTSTYLE_NORMAL,
                    wx.FONTWEIGHT_NORMAL))
        self.parent = parent
        self.Bind(wx.EVT_TREE_ITEM_EXPANDING, self.on_expanding)
        self.Bind(wx.EVT_TREE_ITEM_GETTOOLTIP, self.on_get_tooltip)
        self.Bind(wx.EVT_TREE_BEGIN_LABEL_EDIT, self.on_begin_label_edit)
        self.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.on_end_label_edit)
        self.Bind(wx.EVT_TREE_SEL_CHANGED, self.on_select_item)
        #self.Bind(wx.EVT_LEFT_DOWN, self.on_left_down)
        self.Bind(wx.EVT_LEFT_DCLICK, self.on_dclick)
        self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.on_dclick)
        self.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.on_item_right_click)
        self.Bind(wx.EVT_LIST_COL_END_DRAG, self.on_col_resize)

        self.model = None
        self.AddColumn('Context')
        self.AddColumn('Value')
        self.SetColumnEditable(1, True)
        self.SetColumnAlignment(1, wx.ALIGN_RIGHT)
        self.lock = threading.RLock()
        self.__var_idx = 0
        self.create_popup_menus()
        self.clear()
        self.load_positions()

    def on_col_resize(self, evt):
        self.save_positions()

    def save_positions(self):
        cols = self.GetColumnCount()
        widths = [self.GetColumnWidth(i) for i in range(cols)]
        settings.session_set('runtime_view_col_widths', widths)

    def load_positions(self):
        try:
            widths = settings.session_get('runtime_view_col_widths')
            cols = self.GetColumnCount()
            if len(widths) != cols:
                raise Exception("Mismatch of stored column widths")
            for i, width in enumerate(widths):
                self.SetColumnWidth(i, width)
        except:
            pass

    def create_popup_menus(self):
        self.menu_manager = menu.MenuManager()
        m = self.menu_manager.menu()
        m.item("Enable",
               func=self.on_enable_breakpoint,
               icon='stop.png',
               show=MNU_ENABLE_BKPT,
               hide=MNU_DISABLE_BKPT)
        m.item("Disable",
               func=self.on_disable_breakpoint,
               icon='stop_disabled.png',
               show=MNU_DISABLE_BKPT,
               hide=MNU_ENABLE_BKPT)
        m.item("Remove", func=self.on_remove_breakpoint, icon='ex.png')
        self.menu_breakpoint_item = m

        m = self.menu_manager.menu()
        m.item("Enable All Breakpoints",
               func=self.on_enable_all_breakpoints,
               icon='stop.png')
        m.item("Disable All Breakpoints",
               func=self.on_disable_all_breakpoints,
               icon='stop_disabled.png')
        m.item("Remove All Breakpoints",
               func=self.on_remove_all_breakpoints,
               icon='ex.png')
        self.menu_breakpoints = m

        m = self.menu_manager.menu()
        m.item("Show this Frame in Source",
               func=self.on_show_frame,
               icon='find.png')
        m.step_out = m.item("Step Out\tShift+F6",
                            func=self.on_step_out,
                            icon='control_play_blue.png')
        self.menu_frame_item = m

        m = self.menu_manager.menu()
        m.item("Add Watch...",
               func=self.on_add_watch,
               icon='magnifier_zoom_in.png')
        self.menu_watches = m

        m = self.menu_manager.menu()
        m.item("Remove Watch", func=self.on_remove_watch, icon='ex.png')
        self.menu_watch_item = m

    def set_model(self, model):
        self.model = model
        self.model.Bind(gdb.EVT_GDB_UPDATE_VARS, self.on_var_update)
        self.model.Bind(gdb.EVT_GDB_UPDATE_STACK, self.on_stack_update)
        self.model.Bind(gdb.EVT_GDB_UPDATE_BREAKPOINTS,
                        self.on_breakpoint_update)
        self.model.Bind(gdb.EVT_GDB_UPDATE_REGISTERS, self.on_register_update)
        self.model.Bind(gdb.EVT_GDB_FINISHED, self.on_gdb_finished)
        self.model.Bind(gdb.EVT_GDB_STOPPED, self.on_gdb_stopped)
        wx.CallAfter(self.build_sfr_tree)

    def get_var_name(self):
        name = "rtv_%d" % self.__var_idx
        self.__var_idx += 1
        return name

    def on_breakpoint_update(self, evt):
        wx.CallAfter(self.update_breakpoints)

    def on_register_update(self, evt):
        wx.CallAfter(self.update_registers, evt.data)
        self.save_positions()

    def on_var_update(self, evt):
        names = evt.data
        for name in names:
            if name in self.pending_var_additions:
                self.lock.acquire()
                parent = self.pending_var_additions.pop(name)
                self.lock.release()
                wx.CallAfter(self.add_var_item, parent, name,
                             self.model.vars[name])
                if parent == self.watch_item:
                    self.expand(self.watch_item)
            elif name in self.pending_var_updates:
                self.lock.acquire()
                var_item = self.pending_var_updates.pop(name)
                old_name = self.get_item_data(var_item)
                if old_name in self.var_registry:
                    self.var_registry.pop(old_name)
                self.lock.release()
                wx.CallAfter(self.update_var_item, var_item, name,
                             self.model.vars[name])
            elif name in self.var_registry and name in self.model.vars:
                var_item = self.var_registry[name]
                wx.CallAfter(self.update_var_item, var_item, name,
                             self.model.vars[name])
            else:
                pass

    def on_stack_update(self, evt):
        #print self.model.stack.pretty()
        if self.model:
            if self.__check_stack():
                wx.CallAfter(self.update_stack)
            else:
                wx.CallAfter(self.rebuild_stack)
        evt.Skip()

    def on_gdb_finished(self, evt):
        self.clear()
        self.model = None

    def on_item_right_click(self, evt):
        item = self.__get_evt_item(evt)
        if item.is_ok():
            self.select_item(item)
            if self.model:
                if item == self.breakpoints_item and self.get_children_count(
                        self.breakpoints_item) > 0:
                    self.PopupMenu(self.menu_breakpoints.build(self),
                                   evt.GetPoint())
                elif self.is_descendent(item, self.breakpoints_item):
                    bkpt = self.get_item_data(item)
                    self.breakpoint = bkpt
                    self.menu_manager.publish(
                        MNU_DISABLE_BKPT
                    ) if bkpt.enabled else self.menu_manager.publish(
                        MNU_ENABLE_BKPT)
                    self.PopupMenu(self.menu_breakpoint_item.build(self),
                                   evt.GetPoint())
                elif self.is_frame_item(item):
                    frame = self.get_item_data(item)
                    self.frame = frame
                    if frame.level == 0 and len(self.frames) > 1:
                        self.menu_frame_item.step_out.show()
                    else:
                        self.menu_frame_item.step_out.hide()

                    self.PopupMenu(self.menu_frame_item.build(self),
                                   evt.GetPoint())
                elif item == self.watch_item:
                    self.PopupMenu(self.menu_watches.build(self),
                                   evt.GetPoint())
                elif self.is_descendent(item, self.watch_item):
                    self.selected_item = item
                    self.PopupMenu(self.menu_watch_item.build(self),
                                   evt.GetPoint())

        evt.Skip()

    def on_dclick(self, evt):
        id = self.__get_evt_item(evt)
        if self.model and self.is_descendent(id, self.breakpoints_item):
            bkpt = self.get_item_data(id)
            if bkpt.enabled:
                self.model.break_disable(bkpt)
            else:
                self.model.break_enable(bkpt)
        elif self.model and self.is_descendent(id, self.sfr_item):
            reg = self.get_item_data(id)
            if reg:
                old_value = reg.value
                try:
                    response = controls.RegisterEditDialog.show(self, reg)
                except Exception, e:
                    print e
                if response == wx.ID_OK:
                    self.model.data_evaluate_expression(
                        "%s=%s" % (reg.expression, reg.value),
                        callback=partial(self.on_sfr_data, id, True))
                else:
                    reg.value = old_value
        elif self.model and self.is_descendent(id, self.registers_item):
            name = self.get_item_data(id)
            target_model = self.parent.controller.project.target
            reg = target_model.find_by_name(name)
            if not reg:
                reg = project.CPURegister(name, name, 4)
                reg.add_field(project.Field(0, 32, name))

            reg.value = str2int(self.register_registry[name])
            response = controls.RegisterEditDialog.show(self, reg)
            if response == wx.ID_OK:
                self.model.data_evaluate_expression(
                    "%s=%s" % (reg.expression, reg.value),
                    callback=self.on_register_data)