def change_breakpoint_state(self, bp_number, enabled, condition=None):
        """ Change breakpoint status or `condition` expression.
        
        :param bp_number: number of breakpoint to change 
        :return: None or an error message (string)
        """
        if not (0 <= bp_number < len(IKBreakpoint.breakpoints_by_number)):
            return "Found no breakpoint numbered: %s" % bp_number
        bp = IKBreakpoint.breakpoints_by_number[bp_number]
        if not bp:
            return "Found no breakpoint numbered %s" % bp_number
        _logger.b_debug("    change_breakpoint_state(bp_number=%s, enabled=%s, "
                        "condition=%s) found %s", 
                        bp_number,
                        enabled,
                        repr(condition),
                        bp)
        bp.enabled = enabled
        bp.condition = condition  # update condition for conditional breakpoints
        IKBreakpoint.update_active_breakpoint_flag()  # force flag refresh
        if self.pending_stop or IKBreakpoint.any_active_breakpoint:
            self.enable_tracing()
        else:
            self.disable_tracing()
        return None