def on_evaluate(self, action): buffer = self.__active_page.buffer try: iter1, iter2 = buffer.get_selection_bounds() except ValueError: iter1 = buffer.get_iter_at_mark(buffer.get_insert()) iter1.set_line_offset(0) iter2 = iter1.copy() iter2.forward_to_line_end() # evaluate block, if parenthesis is the only character in line if sced.is_block_beginning(buffer.get_text(iter1, iter2)): iter1, iter2 = buffer.find_block(iter1) buffer.select_range(iter1, iter2) text = buffer.get_text(iter1, iter2) self.__lang.evaluate(text)
def find_block(self, where=None): # if nowhere, select from cursor if where is None: iter1 = self.get_iter_at_mark(self.get_insert()) where = iter1.copy() else: iter1 = where.copy() # find first opening bracket while True: iter1.set_line_offset(0) iter2 = iter1.copy() iter2.forward_to_line_end() if sced.is_block_beginning(self.get_text(iter1, iter2)): break if not iter1.backward_line(): raise RuntimeError, "Block not found!" iter2 = iter1.copy() count = 1 while True: if not iter2.forward_char(): raise RuntimeError, "Block not found!" if iter2.get_char() == "(": count += 1 elif iter2.get_char() == ")": count -= 1 if count == 0: break # include closing bracket and the following character # for proper behaviour of in_range below! iter2.forward_chars(2) if where.in_range(iter1, iter2): return iter1, iter2 else: raise RuntimeError, "Block not found!"
def __on_view_button_press (self, view, event): if event.type == gtk.gdk._2BUTTON_PRESS: x, y = self.view.window_to_buffer_coords(gtk.TEXT_WINDOW_WIDGET, int(event.x), int(event.y)) iter1 = self.view.get_iter_at_location(x,y) iter1.set_line_offset(0) iter2 = iter1.copy() iter2.forward_to_line_end() if sced.is_block_beginning(self.buffer.get_text(iter1, iter2)): try: start, end = self.buffer.find_block(iter1) self.buffer.select_range(start, end) finally: # although block not available, return True anyway return True return False