class AutoCompletionTreeView(object): def __init__(self, model): self.model = model self.completion_win = Window() self.completion_win.set_modal(True) self.completion_win.set_keep_above(True) self.completion_tree_view = BrowserTreeView(self.model) self.completion_tree_view.set_enable_search(False) self.completion_scrolled_win = ScrolledWindow( self.completion_tree_view) self.completion_win.add(self.completion_scrolled_win) self.column = Gtk.TreeViewColumn() self.completion_tree_view.append_column(self.column) self.renderer_text = Gtk.CellRendererText() self.column.pack_start(self.renderer_text, False) self.column.set_attributes(self.renderer_text, text=DATA_COL) # display an undecorated window with a grey border self.completion_scrolled_win.set_size_request(WIN_WIDTH, WIN_HEIGHT) self.completion_scrolled_win.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) self.completion_win.set_decorated(False) self.completion_scrolled_win.set_border_width(2) # self.completion_scrolled_win.modify_bg(Gtk.StateType.NORMAL, Gdk.Color(GREY)) self.column.set_min_width(50) # hide column self.completion_tree_view.set_headers_visible(False)
def __init__(self, attrib, data, ui=None): if data.endswith('\n'): data = data[:-1] # If we have trailing \n it looks like an extra empty line # in the buffer, so we default remove one CustomObjectClass.__init__(self, attrib, data, ui) if self.ui and self.ui.__class__.__name__ == 'GtkInterface': # XXX seperate widget and object from zim.gui.widgets import ScrolledWindow # SourceView scrolled window self.buffer = gtksourceview2.Buffer() self.buffer.set_text(self._data) self.buffer.connect('modified-changed', self.on_modified_changed) self.buffer.set_highlight_matching_brackets(True) self.buffer.set_modified(False) self._data = None self.view = gtksourceview2.View(self.buffer) self.view.modify_font(pango.FontDescription('monospace')) self.view.set_auto_indent(True) self.view.set_smart_home_end(True) self.view.set_highlight_current_line(True) self.view.set_right_margin_position(80) self.view.set_show_right_margin(True) self.view.set_tab_width(4) win = ScrolledWindow(self.view, gtk.POLICY_AUTOMATIC, gtk.POLICY_NEVER) # only horizontal scroll win.set_border_width(5) self._attrib.setdefault('lang', None) self._attrib.setdefault('linenumbers', 'true') # FIXME make boolean self.set_language(self._attrib['lang'], save=False) self.show_line_numbers(self._attrib['linenumbers'], save=False) self.view.connect('populate-popup', self.on_populate_popup) # simple toolbar #~ bar = gtk.HBox() # FIXME: use gtk.Toolbar stuff #~ lang_selector = gtk.combo_box_new_text() #~ lang_selector.append_text('(None)') #~ for l in lang_names: lang_selector.append_text(l) #~ try: #~ lang_selector.set_active(lang_ids.index(self._attrib['lang'])+1) #~ self.set_language(self._attrib['lang'] or None, False) #~ except (ValueError, KeyError): #~ lang_selector.set_active(0) #~ self.set_language(None, False) #~ lang_selector.connect('changed', self.on_lang_changed) #~ bar.pack_start(lang_selector, False, False) #~ #~ line_numbers = gtk.ToggleButton('Line numbers') #~ try: #~ line_numbers.set_active(self._attrib['linenumbers']=='true') #~ self.show_line_numbers(self._attrib['linenumbers'], False) #~ except (ValueError, KeyError): #~ line_numbers.set_active(True) #~ self.show_line_numbers(True, False) #~ line_numbers.connect('toggled', self.on_line_numbers_toggled) #~ bar.pack_start(line_numbers, False, False) # TODO: other toolbar options # TODO: autohide toolbar if textbuffer is not active # Pack everything box = gtk.VBox() #~ box.pack_start(bar, False, False) box.pack_start(win) self._widget = CustomObjectBin() self._widget.set_has_cursor(True) self._widget.add(box) # Hook up integration with pageview cursor movement def on_grab_cursor(bin, position): begin, end = self.buffer.get_bounds() if position == POSITION_BEGIN: self.buffer.place_cursor(begin) else: self.buffer.place_cursor(end) self.view.grab_focus() def on_move_cursor(view, step_size, count, extend_selection): buffer = view.get_buffer() iter = buffer.get_iter_at_mark(buffer.get_insert()) if (iter.is_start() or iter.is_end()) \ and not extend_selection: if iter.is_start() and count < 0: self._widget.release_cursor(POSITION_BEGIN) return None elif iter.is_end() and count > 0: self._widget.release_cursor(POSITION_END) return None return gtksourceview2.View.do_move_cursor(view, step_size, count, extend_selection) self._widget.connect('grab-cursor', on_grab_cursor) self.view.connect('move-cursor', on_move_cursor) # Resize widget if parent TextView has been resized -- XXX self.ui.mainwindow.pageview.view.connect_after('size-allocate', self.on_parent_view_resized) else: self.view = None