Source code for cadbiom_gui.gt_gui.utils.text_page

#
## Filename    : text_page.py
## Author(s)   : Michel Le Borgne
## Created     : 10/2009
## Revision    :
## Source      :
##
## Copyright 2012 - 2020 IRISA/IRSET
##
## This library is free software; you can redistribute it and/or modify it
## under the terms of the GNU General Public License as published
## by the Free Software Foundation; either version 2.1 of the License, or
## any later version.
##
## This library is distributed in the hope that it will be useful, but
## WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF
## MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  The software and
## documentation provided hereunder is on an "as is" basis, and IRISA has
## no obligations to provide maintenance, support, updates, enhancements
## or modifications.
## In no event shall IRISA be liable to any party for direct, indirect,
## special, incidental or consequential damages, including lost profits,
## arising out of the use of this software and its documentation, even if
## IRISA have been advised of the possibility of such damage.  See
## the GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with this library; if not, write to the Free Software Foundation,
## Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
##
## The original code contained here was initially developed by:
##
##     Michel Le Borgne.
##     IRISA
##     Symbiose team
##     IRISA  Campus de Beaulieu
##     35042 RENNES Cedex, FRANCE
##
##
## Contributor(s): Geoffroy Andrieux, Nolwenn Le Meur
##
"""
Collection of widgets for text handling
"""
import gtksourceview2 as gtksourceview
import gtk
import gtk.glade

import pkg_resources


[docs]class TextEditConfig: """ Text editors configuration """ def __init__(self): self.style = "classical" self.show_line_numbers = False self.show_line_marks = True
[docs]class TextArea(gtksourceview.View): """ GtkSourceView with supplementary attributes """ def __init__(self, language=None): gtksourceview.View.__init__(self) # create buffer buffer = gtksourceview.Buffer() mgr = gtksourceview.style_scheme_manager_get_default() style_scheme = mgr.get_scheme("classical") if style_scheme: buffer.set_style_scheme(style_scheme) # set language if language: lma = gtksourceview.LanguageManager() spa = lma.get_search_path() spa.append("utils/language-specs") lma.set_search_path(spa) lang = lma.get_language(language) buffer.set_language(lang) # set buffer self.set_buffer(buffer) self.buffer = buffer
[docs] def refresh_config(self, edit_config): """ As it says """ self.set_show_line_numbers(edit_config.show_line_numbers) self.set_show_line_marks(edit_config.show_line_marks) mgr = gtksourceview.style_scheme_manager_get_default() style_scheme = mgr.get_scheme(edit_config.style) # TODO if style_scheme: self.get_buffer().set_style_scheme(style_scheme) else: pass
[docs]class TextPage(gtk.Frame): """ A simple text editor for pages """ def __init__(self, language, edit_config=None): gtk.Frame.__init__(self) # text view and model self.write = TextArea(language) self.modified = False self.not_set = False # configuration if edit_config: self.write.refresh_config(edit_config) # page num in notebook (if used in notebook) self.page_num = -1 # wrap in a scroll window swin = gtk.ScrolledWindow() swin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) swin.set_shadow_type(gtk.SHADOW_IN) swin.add_with_viewport(self.write) self.add(swin) # connect control self.write.buffer.connect("changed", self.is_modified)
[docs] def refresh_config(self, edit_config): """ Self explained """ self.write.refresh_config(edit_config)
[docs] def set_text(self, text): """ Put text in the buffer """ self.write.get_buffer().set_text(text) self.not_set = False self.modified = False
[docs] def get_text(self): """ Retrieve text from the buffer """ wbuf = self.write.get_buffer() iter_begin = wbuf.get_start_iter() iter_end = wbuf.get_end_iter() text = wbuf.get_text(iter_begin, iter_end) return text
[docs] def insert_at_end(self, text): """ Insert text at the end of the buffer """ wbuf = self.write.get_buffer() iter_end = wbuf.get_end_iter() wbuf.insert(iter_end, text)
[docs] def clear(self): """ RAZ of the buffer """ wbuf = self.write.get_buffer() iter_start = wbuf.get_start_iter() iter_end = wbuf.get_end_iter() wbuf.delete(iter_start, iter_end)
# control
[docs] def is_modified(self, widget): """ Mark as modified """ self.modified = True
# self.modified = self.not_set # self.not_set = True
[docs]class BioSignalEditor: """Biosignal simple editor - can load and save files Used by the Charter to view/edit the constraints of a model. @param on_leave: method to be used when quitting the editor """ def __init__(self, name, master, on_leave): self.master = master self.what_todo = on_leave # gui # Set the Glade file template = pkg_resources.resource_filename( __name__, "../chart_glade/biosiged.glade" ) self.wtree = gtk.glade.XML(template) # Get the Main Window, and connect the "destroy" event self.main_window = self.wtree.get_widget("window1") self.main_window.connect("delete_event", self.on_destroy) self.main_window.set_title(name) self.main_window.set_default_size(800, 300) self.main_window.set_position(gtk.WIN_POS_CENTER) # text_area econf = TextEditConfig() self.page = TextPage("biosignal", econf) vbox = self.wtree.get_widget("vbox1") vbox.pack_start(self.page) # file menu menu_item = self.wtree.get_widget("new_m") menu_item.connect("activate", self.on_new) menu_item = self.wtree.get_widget("open_m") menu_item.connect("activate", self.on_open) menu_item = self.wtree.get_widget("save_m") menu_item.connect("activate", self.on_save) menu_item = self.wtree.get_widget("save_as_m") menu_item.connect("activate", self.on_save_as) menu_item = self.wtree.get_widget("quit_m") menu_item.connect("activate", self.on_destroy) # style menu # TODO # internals self.file = None self.main_window.show_all()
[docs] def on_new(self, widget): """ Clear callback """ self.page.clear() pass
[docs] def choose_file(self): """ As it says """ choice = gtk.FileChooserDialog( "Biosignal Editor", None, gtk.FILE_CHOOSER_ACTION_OPEN, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK), ) choice.set_default_response(gtk.RESPONSE_OK) # add a filter to see only biosig files filter = gtk.FileFilter() filter.set_name("bsi files") filter.add_pattern("*.bsi") choice.add_filter(filter) # add a filter to see all no_filter = gtk.FileFilter() no_filter.set_name("all") no_filter.add_pattern("*") choice.add_filter(no_filter) response = choice.run() if response == gtk.RESPONSE_OK: fname = choice.get_filename() elif response == gtk.RESPONSE_CANCEL: fname = None choice.destroy() return fname
[docs] def on_open(self, widget): """ open a window to search .bsi file """ file_name = self.choose_file() if file_name: file = open(file_name, "r+") self.file = file text = file.read() self.page.set_text(text)
[docs] def on_save(self, widget): """ Save callback """ if not self.file: file_name = self.choose_file() if file_name: self.file = open(file_name, "r+") else: return text = self.page.get_text() self.file.write(text)
[docs] def on_save_as(self, widget): """ Save as callback """ file_name = self.choose_file() if file_name: file = open(file_name, "r+") self.file = file text = self.page.get_text() self.file.write(text)
[docs] def on_destroy(self, widget, xxx=None): """ destroy callback """ self.what_todo(self) self.main_window.destroy()
[docs] def set_text(self, text): """ As it says """ self.page.set_text(text)
[docs] def get_text(self): """ As it says """ return self.page.get_text()