new syntax highlighter, abortable sleep function

Joachim Beerwerth from the group of Prof. Roland Böhmer (TU Dortmund) provided a patch with follwing enhancements:

* new syntax highlighter: 
  * improves performance with longer scripts
  * search function (ctrl+f)
  * auto indent
  * undo/redo
* abortable sleep function in experiment scripts
This commit is contained in:
Markus Rosenstihl 2016-11-23 15:19:42 +00:00
parent 9f4a3d6b53
commit dfd5961ba6
4 changed files with 395 additions and 115 deletions

2
debian/control vendored
View File

@ -10,7 +10,7 @@ Package: python-damaris
Architecture: all Architecture: all
XB-Python-Version: ${python:Versions} XB-Python-Version: ${python:Versions}
Provides: ${python:Provides}, damaris-frontend Provides: ${python:Provides}, damaris-frontend
Depends: ${python:Depends}, python-numpy (>=1.0), python-scipy, python-gtk2 (>=2.8.0), python-glade2, python-matplotlib (>=0.90), python-tables (>=1.3.2), lzop, python-xdg Depends: ${python:Depends}, python-numpy (>=1.0), python-scipy, python-gtk2 (>=2.8.0), python-glade2, python-matplotlib (>=0.90), python-tables (>=1.3.2), lzop, python-xdg, python-gtksourceview2
Recommends: damaris-backends, python-numpy-ext Recommends: damaris-backends, python-numpy-ext
Suggests: python-doc, python-tables-doc, python-numpy-doc Suggests: python-doc, python-tables-doc, python-numpy-doc
Description: python frontend for DAMARIS project Description: python frontend for DAMARIS project

View File

@ -34,6 +34,8 @@ import gtk.gdk
gtk.gdk.threads_init( ) gtk.gdk.threads_init( )
import gtk.glade import gtk.glade
import gtksourceview2
import pango import pango
import cairo import cairo
@ -72,7 +74,7 @@ if hasattr( gtk, "PrintOperation" ):
from damaris.gui import ExperimentWriter, ExperimentHandling from damaris.gui import ExperimentWriter, ExperimentHandling
from damaris.gui import ResultReader, ResultHandling from damaris.gui import ResultReader, ResultHandling
from damaris.gui import BackendDriver from damaris.gui import BackendDriver
from damaris.gui.gtkcodebuffer import CodeBuffer, SyntaxLoader #from damaris.gui.gtkcodebuffer import CodeBuffer, SyntaxLoader
#from damaris.data import Drawable # this is a base class, it should be used... #from damaris.data import Drawable # this is a base class, it should be used...
from damaris.data import DataPool, Accumulation, ADC_Result, MeasurementResult from damaris.data import DataPool, Accumulation, ADC_Result, MeasurementResult
@ -219,7 +221,7 @@ class DamarisGUI:
self.xml_gui.signal_connect( "on_toolbar_stop_button_clicked", self.stop_experiment ) self.xml_gui.signal_connect( "on_toolbar_stop_button_clicked", self.stop_experiment )
self.xml_gui.signal_connect( "on_doc_menu_activate", self.show_doc_menu ) self.xml_gui.signal_connect( "on_doc_menu_activate", self.show_doc_menu )
self.xml_gui.signal_connect( "on_toolbar_manual_button_clicked", self.show_manual ) self.xml_gui.signal_connect( "on_toolbar_manual_button_clicked", self.show_manual )
def run( self ): def run( self ):
# prolong lifetime of clipboard till the very end (avoid error message) # prolong lifetime of clipboard till the very end (avoid error message)
self.main_clipboard = self.sw.main_clipboard self.main_clipboard = self.sw.main_clipboard
@ -243,7 +245,57 @@ class DamarisGUI:
if self.state in [ DamarisGUI.Edit_State, DamarisGUI.Quit_State ]: if self.state in [ DamarisGUI.Edit_State, DamarisGUI.Quit_State ]:
self.state = DamarisGUI.Quit_State self.state = DamarisGUI.Quit_State
# do a cleanup... # do a cleanup...
print "ToDo: Cleanup, Save Dialogs ..."
if self.sw.experiment_script_textbuffer.get_modified( ):
question = gtk.MessageDialog(parent=self.xml_gui.get_widget( "main_window"),
type=gtk.MESSAGE_WARNING,
flags=gtk.DIALOG_MODAL,
buttons=gtk.BUTTONS_NONE)
question.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
question.add_button(gtk.STOCK_NO, gtk.RESPONSE_NO)
question.add_button(gtk.STOCK_YES, gtk.RESPONSE_YES)
question.set_markup("The Experiment Script has been changed. Save changes?")
response = question.run()
question.destroy()
if response == gtk.RESPONSE_CANCEL:
return True
elif response == gtk.RESPONSE_YES:
current_page = self.main_notebook.get_current_page( )
self.main_notebook.set_current_page(0)
if self.sw.exp_script_filename is None:
self.sw.save_file_as()
else:
self.sw.save_file()
self.main_notebook.set_current_page(current_page)
if self.sw.data_handling_textbuffer.get_modified( ):
question = gtk.MessageDialog(parent=self.xml_gui.get_widget( "main_window"),
type=gtk.MESSAGE_WARNING,
flags=gtk.DIALOG_MODAL,
buttons=gtk.BUTTONS_NONE)
question.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
question.add_button(gtk.STOCK_NO, gtk.RESPONSE_NO)
question.add_button(gtk.STOCK_YES, gtk.RESPONSE_YES)
question.set_markup("The Result Script has been changed. Save changes?")
response = question.run()
question.destroy()
if response == gtk.RESPONSE_CANCEL:
return True
elif response == gtk.RESPONSE_YES:
current_page = self.main_notebook.get_current_page( )
self.main_notebook.set_current_page(1)
if self.sw.res_script_filename is None:
self.sw.save_file_as()
else:
self.sw.save_file()
self.main_notebook.set_current_page(current_page)
self.config = None self.config = None
self.sw = None self.sw = None
self.monitor = None self.monitor = None
@ -252,7 +304,14 @@ class DamarisGUI:
gtk.main_quit( ) gtk.main_quit( )
return True return True
else: else:
print "Stop Experiment please! (ToDo: Dialog)" question = gtk.MessageDialog(parent=self.xml_gui.get_widget( "main_window"),
type=gtk.MESSAGE_ERROR,
flags=gtk.DIALOG_MODAL,
buttons=gtk.BUTTONS_OK)
question.set_markup("Experiment still running, can not close DAMARIS!")
response = question.run()
question.destroy()
return True return True
# toolbar related events: # toolbar related events:
@ -988,16 +1047,58 @@ class ScriptWidgets:
self.res_script_filename = None self.res_script_filename = None
# load syntax description for syntax highlighting (defined in python.xml) # load syntax description for syntax highlighting (defined in python.xml)
sl = SyntaxLoader( "python" ) #sl = SyntaxLoader( "python" )
# script buffers: # script buffers:
self.experiment_script_textview = self.xml_gui.get_widget( "experiment_script_textview" ) self.experiment_script_textview = self.xml_gui.get_widget( "experiment_script_textview" )
self.data_handling_textview = self.xml_gui.get_widget( "data_handling_textview" ) self.data_handling_textview = self.xml_gui.get_widget( "data_handling_textview" )
# create and set syntax-highlighting text-buffers as textview backends # create and set syntax-highlighting text-buffers as textview backends
self.experiment_script_textbuffer = CodeBuffer( lang=sl ) self.experiment_script_textbuffer = gtksourceview2.Buffer()
self.data_handling_textbuffer = CodeBuffer( lang=sl ) self.data_handling_textbuffer = gtksourceview2.Buffer()
lm = gtksourceview2.LanguageManager()
langpython = lm.get_language("python")
self.experiment_script_textbuffer.set_language(langpython)
self.experiment_script_textbuffer.set_highlight_syntax(True)
self.data_handling_textbuffer.set_language(langpython)
self.data_handling_textbuffer.set_highlight_syntax(True)
self.experiment_script_textview.set_buffer( self.experiment_script_textbuffer ) self.experiment_script_textview.set_buffer( self.experiment_script_textbuffer )
self.experiment_script_textview.set_show_line_numbers(True)
self.experiment_script_textview.set_auto_indent(True)
self.data_handling_textview.set_buffer( self.data_handling_textbuffer ) self.data_handling_textview.set_buffer( self.data_handling_textbuffer )
self.data_handling_textview.set_show_line_numbers(True)
self.data_handling_textview.set_auto_indent(True)
keywords = """for if else elif in print try finally except global lambda not or pass def
class import from as return yield while continue break assert None True False AccumulatedValue
Accumulation MeasurementResult ADC_Result Experiment synchronize sleep result data isinstance
issubclass min max abs pow range xrange log_range lin_range staggered_range int float zip file
combine_ranges interleaved_range get_sampling_rate uses_statistics write_to_csv write_to_hdf
get_job_id get_description set_description get_xdata get_ydata set_xdate set_ydata"""
keywordsbuffer = gtksourceview2.Buffer()
keywordsbuffer.set_text(keywords)
compexp = self.experiment_script_textview.get_completion()
compres = self.data_handling_textview.get_completion()
compwgen = gtksourceview2.CompletionWords('Keywords')
compwgen.register(keywordsbuffer)
compwexp = gtksourceview2.CompletionWords('Experimentscript')
compwexp.register(self.experiment_script_textbuffer)
compwres = gtksourceview2.CompletionWords('Resultscript')
compwres.register(self.data_handling_textbuffer)
compexp.add_provider(compwgen)
compres.add_provider(compwgen)
compexp.add_provider(compwexp)
compres.add_provider(compwres)
# script fonts are atlered by configuration # script fonts are atlered by configuration
# clipboard # clipboard
@ -1040,6 +1141,9 @@ class ScriptWidgets:
self.toolbar_save_as_button = self.xml_gui.get_widget( "toolbar_save_as_button" ) self.toolbar_save_as_button = self.xml_gui.get_widget( "toolbar_save_as_button" )
self.toolbar_save_all_button = self.xml_gui.get_widget( "toolbar_save_all_button" ) self.toolbar_save_all_button = self.xml_gui.get_widget( "toolbar_save_all_button" )
self.toolbar_check_scripts_button = self.xml_gui.get_widget( "toolbar_check_scripts_button" ) self.toolbar_check_scripts_button = self.xml_gui.get_widget( "toolbar_check_scripts_button" )
self.toolbar_undo_button = self.xml_gui.get_widget( "toolbar_undo_button" )
self.toolbar_redo_button = self.xml_gui.get_widget( "toolbar_redo_button" )
self.toolbar_search_button = self.xml_gui.get_widget("toolbar_search_button")
# events # events
self.xml_gui.signal_connect( "on_toolbar_open_file_button_clicked", self.open_file ) self.xml_gui.signal_connect( "on_toolbar_open_file_button_clicked", self.open_file )
self.xml_gui.signal_connect( "on_toolbar_new_button_clicked", self.new_file ) self.xml_gui.signal_connect( "on_toolbar_new_button_clicked", self.new_file )
@ -1047,6 +1151,9 @@ class ScriptWidgets:
self.xml_gui.signal_connect( "on_toolbar_save_file_button_clicked", self.save_file ) self.xml_gui.signal_connect( "on_toolbar_save_file_button_clicked", self.save_file )
self.xml_gui.signal_connect( "on_toolbar_save_all_button_clicked", self.save_all_files ) self.xml_gui.signal_connect( "on_toolbar_save_all_button_clicked", self.save_all_files )
self.xml_gui.signal_connect( "on_toolbar_check_scripts_button_clicked", self.check_script ) self.xml_gui.signal_connect( "on_toolbar_check_scripts_button_clicked", self.check_script )
self.xml_gui.signal_connect( "on_toolbar_undo_button_clicked", self.undo )
self.xml_gui.signal_connect( "on_toolbar_redo_button_clicked", self.redo )
self.xml_gui.signal_connect( "on_toolbar_search_button_clicked", self.search )
# my notebook # my notebook
self.main_notebook = self.xml_gui.get_widget( "main_notebook" ) self.main_notebook = self.xml_gui.get_widget( "main_notebook" )
@ -1062,14 +1169,18 @@ class ScriptWidgets:
def set_scripts( self, exp_script=None, res_script=None ): def set_scripts( self, exp_script=None, res_script=None ):
# load buffers and set cursor to front # load buffers and set cursor to front
if exp_script is not None: if exp_script is not None:
self.experiment_script_textbuffer.begin_not_undoable_action()
self.experiment_script_textbuffer.set_text( unicode( exp_script ) ) self.experiment_script_textbuffer.set_text( unicode( exp_script ) )
self.experiment_script_textbuffer.place_cursor( self.experiment_script_textbuffer.get_start_iter( ) ) self.experiment_script_textbuffer.place_cursor( self.experiment_script_textbuffer.get_start_iter( ) )
self.experiment_script_textbuffer.set_modified( False ) self.experiment_script_textbuffer.set_modified( False )
self.experiment_script_textbuffer.end_not_undoable_action()
self.textviews_moved( self.experiment_script_textview ) self.textviews_moved( self.experiment_script_textview )
if res_script is not None: if res_script is not None:
self.data_handling_textbuffer.begin_not_undoable_action()
self.data_handling_textbuffer.set_text( unicode( res_script ) ) self.data_handling_textbuffer.set_text( unicode( res_script ) )
self.data_handling_textbuffer.place_cursor( self.data_handling_textbuffer.get_start_iter( ) ) self.data_handling_textbuffer.place_cursor( self.data_handling_textbuffer.get_start_iter( ) )
self.data_handling_textbuffer.set_modified( False ) self.data_handling_textbuffer.set_modified( False )
self.data_handling_textbuffer.end_not_undoable_action()
self.textviews_moved( self.data_handling_textview ) self.textviews_moved( self.data_handling_textview )
self.set_toolbuttons_status( ) self.set_toolbuttons_status( )
@ -1117,14 +1228,23 @@ class ScriptWidgets:
exp_modified = self.experiment_script_textbuffer.get_modified( ) exp_modified = self.experiment_script_textbuffer.get_modified( )
res_modified = self.data_handling_textbuffer.get_modified( ) res_modified = self.data_handling_textbuffer.get_modified( )
enable_save = True enable_save = True
canundo = False
canredo = False
if current_page == 0: if current_page == 0:
enable_save = exp_modified and self.exp_script_filename is not None enable_save = exp_modified and self.exp_script_filename is not None
canundo = self.experiment_script_textbuffer.can_undo()
canredo = self.experiment_script_textbuffer.can_redo()
elif current_page == 1: elif current_page == 1:
enable_save = res_modified and self.res_script_filename is not None enable_save = res_modified and self.res_script_filename is not None
canundo = self.data_handling_textbuffer.can_undo()
canredo = self.data_handling_textbuffer.can_redo()
self.toolbar_save_button.set_sensitive( enable_save ) self.toolbar_save_button.set_sensitive( enable_save )
self.toolbar_save_as_button.set_sensitive( True ) self.toolbar_save_as_button.set_sensitive( True )
self.toolbar_save_all_button.set_sensitive( exp_modified or res_modified ) self.toolbar_save_all_button.set_sensitive( exp_modified or res_modified )
self.toolbar_check_scripts_button.set_sensitive( True ) self.toolbar_check_scripts_button.set_sensitive( True )
self.toolbar_undo_button.set_sensitive(canundo)
self.toolbar_redo_button.set_sensitive(canredo)
self.toolbar_search_button.set_sensitive(True)
else: else:
# disable toolbar # disable toolbar
self.toolbar_new_button.set_sensitive( False ) self.toolbar_new_button.set_sensitive( False )
@ -1133,6 +1253,9 @@ class ScriptWidgets:
self.toolbar_save_as_button.set_sensitive( False ) self.toolbar_save_as_button.set_sensitive( False )
self.toolbar_save_all_button.set_sensitive( False ) self.toolbar_save_all_button.set_sensitive( False )
self.toolbar_check_scripts_button.set_sensitive( False ) self.toolbar_check_scripts_button.set_sensitive( False )
self.toolbar_undo_button.set_sensitive(False)
self.toolbar_redo_button.set_sensitive(False)
self.toolbar_search_button.set_sensitive(current_page == 3)
if self.exp_script_filename: if self.exp_script_filename:
exp_titlename = unicode( os.path.splitext( os.path.basename( self.exp_script_filename ) )[ 0 ] ) exp_titlename = unicode( os.path.splitext( os.path.basename( self.exp_script_filename ) )[ 0 ] )
@ -1256,27 +1379,7 @@ class ScriptWidgets:
""" """
#print "keypress", event.state, event.keyval #print "keypress", event.state, event.keyval
if event.state & gtk.gdk.CONTROL_MASK != 0: if event.state & gtk.gdk.CONTROL_MASK != 0:
if event.keyval == gtk.gdk.keyval_from_name( "c" ): if event.keyval == gtk.gdk.keyval_from_name( "s" ):
if self.main_notebook.get_current_page( ) == 0:
self.experiment_script_textbuffer.copy_clipboard( self.main_clipboard )
elif self.main_notebook.get_current_page( ) == 1:
self.data_handling_textbuffer.copy_clipboard( self.main_clipboard )
return True
elif event.keyval == gtk.gdk.keyval_from_name( "x" ):
# cut_clipboard(clipboard, textview editable?)
if self.main_notebook.get_current_page( ) == 0:
self.experiment_script_textbuffer.cut_clipboard( self.main_clipboard, True )
elif self.main_notebook.get_current_page( ) == 1:
self.data_handling_textbuffer.cut_clipboard( self.main_clipboard, True )
return True
elif event.keyval == gtk.gdk.keyval_from_name( "v" ):
# paste_clipboard(clipboard, textpos (None = Cursor), textview editable?)
if self.main_notebook.get_current_page( ) == 0:
self.experiment_script_textbuffer.paste_clipboard( self.main_clipboard, None, True )
elif self.main_notebook.get_current_page( ) == 1:
self.data_handling_textbuffer.paste_clipboard( self.main_clipboard, None, True )
return True
elif event.keyval == gtk.gdk.keyval_from_name( "s" ):
# save buffer # save buffer
page = self.main_notebook.get_current_page( ) page = self.main_notebook.get_current_page( )
if (self.exp_script_filename, self.res_script_filename)[ page ] is None: if (self.exp_script_filename, self.res_script_filename)[ page ] is None:
@ -1286,88 +1389,13 @@ class ScriptWidgets:
return True return True
elif event.keyval == gtk.gdk.keyval_from_name( "S" ): elif event.keyval == gtk.gdk.keyval_from_name( "S" ):
# save both buffers # save both buffers
print "ToDo: save both buffers"
self.save_all_files( None, None ) self.save_all_files( None, None )
return True return True
elif event.keyval == gtk.gdk.keyval_from_name("f"):
self.search(None, None)
return True
return 0 return 0
# indent helpers
# tab keyval 0xff09
# backspace keyval 0xff08
# to do check if modified event is called after all
if (event.keyval == 0xFF09 or event.keyval == 0xFF08):
textbuffer = widget.get_buffer( )
# do not do things during selection
if (textbuffer.get_selection_bounds( )):
return 0
cursor_mark = textbuffer.get_insert( )
cursor_iter = textbuffer.get_iter_at_mark( cursor_mark )
if (cursor_iter.starts_line( )):
# backspace with normal function at line start
if (event.keyval == 0xFF08):
self.textviews_moved( widget )
return 0
# now get iterator at line start
linestart_iter = cursor_iter.copy( )
linestart_iter.set_line_offset( 0 )
linebegin = textbuffer.get_text( linestart_iter, cursor_iter ).expandtabs( )
if (len( linebegin ) != 0 and not linebegin.isspace( )):
# just make the spaces go away
textbuffer.delete( linestart_iter, cursor_iter )
textbuffer.insert( linestart_iter, linebegin )
self.textviews_moved( widget )
return 0
# find all space at the begin
while (not cursor_iter.ends_line( )
and not cursor_iter.is_end( )
and cursor_iter.get_char( ).isspace( )):
cursor_iter.forward_char( )
linebegin = textbuffer.get_text( linestart_iter, cursor_iter )
if (event.keyval == 0xFF08):
# backspace shortens space
linebegin = u' ' * ((len( linebegin ) - 1) / 4) * 4
elif (event.keyval == 0xFF09):
# tab widens space
linebegin = u' ' * ((len( linebegin ) + 4) / 4) * 4
textbuffer.delete( linestart_iter, cursor_iter )
textbuffer.insert( linestart_iter, linebegin )
self.textviews_moved( widget )
return 1
# implement convenience function for enter key
elif (event.keyval == 0xFF0D):
textbuffer = widget.get_buffer( )
# do not do things during selection
if (textbuffer.get_selection_bounds( )):
return 0
cursor_mark = textbuffer.get_insert( )
cursor_iter = textbuffer.get_iter_at_mark( cursor_mark )
# determine this line's indent count
linestart_iter = cursor_iter.copy( )
linestart_iter.set_line_offset( 0 )
spaceend_iter = linestart_iter.copy( )
while (not spaceend_iter.ends_line( )
and not spaceend_iter.is_end( )
and spaceend_iter.get_char( ).isspace( )):
spaceend_iter.forward_char( )
linebegin = textbuffer.get_text( linestart_iter, spaceend_iter ).expandtabs( )
indent_length = len( linebegin )
textbuffer.delete( linestart_iter, spaceend_iter )
textbuffer.insert( linestart_iter, u' ' * indent_length )
# start with the real work
cursor_iter = textbuffer.get_iter_at_mark( cursor_mark )
if (not cursor_iter.starts_line( )):
# find last char before cursor
lastchar_iter = cursor_iter.copy( )
lastchar_iter.backward_char( )
if (lastchar_iter.get_char( ) == u":"):
indent_length += 4
# now find indent of next line...
textbuffer.insert( cursor_iter, u'\n' + (u' ' * indent_length) )
widget.scroll_to_mark( cursor_mark, 0.0, 0 )
self.textviews_moved( widget )
return 1
#self.textviews_moved(widget) #self.textviews_moved(widget)
return 0 return 0
@ -1399,7 +1427,22 @@ class ScriptWidgets:
return 0 return 0
if modified: if modified:
print "ToDo: Save First Dialog" question = gtk.MessageDialog(parent=self.xml_gui.get_widget( "main_window"),
type=gtk.MESSAGE_WARNING,
flags=gtk.DIALOG_MODAL,
buttons=gtk.BUTTONS_NONE)
question.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
question.add_button(gtk.STOCK_NO, gtk.RESPONSE_NO)
question.add_button(gtk.STOCK_YES, gtk.RESPONSE_YES)
question.set_markup("The file has been changed. Save changes?")
response = question.run()
question.destroy()
if response == gtk.RESPONSE_YES:
self.save_file()
elif response == gtk.RESPONSE_CANCEL:
return 0
def response( self, response_id, script_widget ): def response( self, response_id, script_widget ):
if response_id == gtk.RESPONSE_OK: if response_id == gtk.RESPONSE_OK:
@ -1491,7 +1534,17 @@ class ScriptWidgets:
absfilename = os.path.abspath( file_name ) absfilename = os.path.abspath( file_name )
if os.access( file_name, os.F_OK ): if os.access( file_name, os.F_OK ):
print "ToDo: Overwrite file question" question = gtk.MessageDialog(parent=script_widget.xml_gui.get_widget( "main_window"),
type=gtk.MESSAGE_WARNING,
flags=gtk.DIALOG_MODAL,
buttons=(gtk.BUTTONS_YES_NO))
question.set_markup("The file already exists. Do you want to overwrite the existing file and delete its contents?")
response = question.run()
question.destroy()
if response != gtk.RESPONSE_YES:
return True
current_page = script_widget.main_notebook.get_current_page( ) current_page = script_widget.main_notebook.get_current_page( )
if current_page == 0: if current_page == 0:
@ -1548,6 +1601,147 @@ class ScriptWidgets:
self.save_file( ) self.save_file( )
self.main_notebook.set_current_page( current_page ) self.main_notebook.set_current_page( current_page )
def undo(self, widget=None, Data=None ):
if not self.editing_state:
return 0
current_page = self.main_notebook.get_current_page( )
if current_page == 0:
self.experiment_script_textview.do_undo(self.experiment_script_textview)
elif current_page == 1:
self.data_handling_textview.do_undo(self.data_handling_textview)
self.set_toolbuttons_status()
def redo(self, widget=None, Data=None ):
if not self.editing_state:
return 0
current_page = self.main_notebook.get_current_page( )
if current_page == 0:
self.experiment_script_textview.do_redo(self.experiment_script_textview)
elif current_page == 1:
self.data_handling_textview.do_redo(self.data_handling_textview)
self.set_toolbuttons_status()
def search(self, widget=None, Data=None):
def response(script_widget, response_id, damsw, tb ):
if response_id != -1 and response_id != 1:
script_widget.destroy()
return True
current_page = damsw.main_notebook.get_current_page( )
startiter = None
enditer = None
logview = None
logbuffer = None
if current_page == 0:
if damsw.experiment_script_textbuffer.get_has_selection():
startiter, enditer = damsw.experiment_script_textbuffer.get_selection_bounds()
else:
mark = damsw.experiment_script_textbuffer.get_insert()
startiter = damsw.experiment_script_textbuffer.get_iter_at_mark(mark)
enditer = startiter
elif current_page == 1:
if damsw.data_handling_textbuffer.get_has_selection():
startiter, enditer = damsw.data_handling_textbuffer.get_selection_bounds()
else:
mark = damsw.data_handling_textbuffer.get_insert()
startiter = damsw.data_handling_textbuffer.get_iter_at_mark(mark)
enditer = startiter
elif current_page == 3:
logview = damsw.xml_gui.get_widget( "messages_textview" )
logbuffer = logview.get_buffer()
if logbuffer.get_has_selection():
startiter, enditer = logbuffer.get_selection_bounds()
else:
mark = logbuffer.get_insert()
startiter = logbuffer.get_iter_at_mark(mark)
enditer = startiter
else:
script_widget.destroy()
return True
searchstring = tb.get_text()
if len(searchstring) > 0:
match_start = None
match_end = None
try:
if response_id == -1:
match_start, match_end = startiter.backward_search(searchstring, gtk.TEXT_SEARCH_TEXT_ONLY)
elif response_id == 1:
match_start, match_end = enditer.forward_search(searchstring, gtk.TEXT_SEARCH_TEXT_ONLY)
except:
pass
if match_start is not None and match_end is not None:
if current_page == 0:
damsw.experiment_script_textbuffer.select_range(match_start, match_end)
damsw.experiment_script_textview.scroll_to_iter(match_start, 0.2)
damsw.textviews_moved(damsw.experiment_script_textview)
elif current_page == 1:
damsw.data_handling_textbuffer.select_range(match_start, match_end)
damsw.data_handling_textview.scroll_to_iter(match_start, 0.2)
damsw.textviews_moved(damsw.data_handling_textview)
elif current_page == 3:
logbuffer.select_range(match_start, match_end)
logview.scroll_to_iter(match_start, 0.2)
dialog = gtk.Dialog(title="Search", parent=self.xml_gui.get_widget("main_window"), flags=gtk.DIALOG_DESTROY_WITH_PARENT,
buttons=(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE, "Find last", -1, "Find next", 1))
cont = dialog.get_content_area()
markedstring = ""
current_page = self.main_notebook.get_current_page( )
startit = None
endit = None
logbuffer = None
if current_page == 0:
if self.experiment_script_textbuffer.get_has_selection():
startit, endit = self.experiment_script_textbuffer.get_selection_bounds()
markedstring = self.experiment_script_textbuffer.get_text(startit, endit)
elif current_page == 1:
if self.data_handling_textbuffer.get_has_selection():
startit, endit = self.data_handling_textbuffer.get_selection_bounds()
markedstring = self.data_handling_textbuffer.get_text(startit, endit)
elif current_page == 3:
logview = self.xml_gui.get_widget( "messages_textview" )
logbuffer = logview.get_buffer()
if logbuffer.get_has_selection():
startit, endit = logbuffer.get_selection_bounds()
markedstring = logbuffer.get_text(startit, endit)
markedstring = markedstring.strip()
textbox = gtk.Entry()
textbox.set_text(markedstring)
cont.add(textbox)
dialog.set_default_response(1)
dialog.connect("response", response, self, textbox)
dialog.set_resizable(False)
dialog.show_all()
if startit is not None and endit is not None:
if current_page == 0:
self.experiment_script_textbuffer.select_range(startit, endit)
elif current_page == 1:
self.data_handling_textbuffer.select_range(startit, endit)
elif current_page == 3:
logbuffer.select_range(startit, endit)
def new_file( self, widget, Data=None ): def new_file( self, widget, Data=None ):
@ -1556,12 +1750,44 @@ class ScriptWidgets:
current_page = self.main_notebook.get_current_page( ) current_page = self.main_notebook.get_current_page( )
if current_page == 0: if current_page == 0:
if self.experiment_script_textbuffer.get_modified( ): if self.experiment_script_textbuffer.get_modified( ):
print "ToDo: Save before Clear Dialog" question = gtk.MessageDialog(parent=self.xml_gui.get_widget( "main_window"),
type=gtk.MESSAGE_WARNING,
flags=gtk.DIALOG_MODAL,
buttons=gtk.BUTTONS_NONE)
question.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
question.add_button(gtk.STOCK_NO, gtk.RESPONSE_NO)
question.add_button(gtk.STOCK_YES, gtk.RESPONSE_YES)
question.set_markup("The file has been changed. Save changes?")
response = question.run()
question.destroy()
if response == gtk.RESPONSE_YES:
self.save_file()
elif response == gtk.RESPONSE_CANCEL:
return 0
self.set_scripts( "", None ) self.set_scripts( "", None )
self.exp_script_filename = None self.exp_script_filename = None
elif current_page == 1: elif current_page == 1:
if self.data_handling_textbuffer.get_modified( ): if self.data_handling_textbuffer.get_modified( ):
print "ToDo: Save before Clear Dialog" question = gtk.MessageDialog(parent=self.xml_gui.get_widget( "main_window"),
type=gtk.MESSAGE_WARNING,
flags=gtk.DIALOG_MODAL,
buttons=gtk.BUTTONS_NONE)
question.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
question.add_button(gtk.STOCK_NO, gtk.RESPONSE_NO)
question.add_button(gtk.STOCK_YES, gtk.RESPONSE_YES)
question.set_markup("The file has been changed. Save changes?")
response = question.run()
question.destroy()
if response == gtk.RESPONSE_YES:
self.save_file()
elif response == gtk.RESPONSE_CANCEL:
return 0
self.set_scripts( None, "" ) self.set_scripts( None, "" )
self.res_script_filename = None self.res_script_filename = None
self.set_toolbuttons_status( ) self.set_toolbuttons_status( )
@ -2440,7 +2666,17 @@ class MonitorWidgets:
absfilename = os.path.abspath( file_name ) absfilename = os.path.abspath( file_name )
if os.access( file_name, os.F_OK ): if os.access( file_name, os.F_OK ):
log( "ToDo: Overwrite file question" ) question = gtk.MessageDialog(parent=script_widget.xml_gui.get_widget( "main_window"),
type=gtk.MESSAGE_WARNING,
flags=gtk.DIALOG_MODAL,
buttons=(gtk.BUTTONS_YES_NO))
question.set_markup("The file already exists. Do you want to overwrite the existing file and delete its contents?")
response = question.run()
question.destroy()
if response != gtk.RESPONSE_YES:
return True
textfile = file( absfilename, "w" ) textfile = file( absfilename, "w" )
tmpfile.seek( 0 ) tmpfile.seek( 0 )

View File

@ -25,6 +25,11 @@ class ExperimentHandling(threading.Thread):
self.quit_flag.wait(waitsteps) self.quit_flag.wait(waitsteps)
if self.quit_flag.isSet(): if self.quit_flag.isSet():
raise StopIteration raise StopIteration
def sleep(self, seconds):
self.quit_flag.wait(seconds)
if self.quit_flag.isSet():
raise StopIteration
def run(self): def run(self):
dataspace={} dataspace={}
@ -36,6 +41,7 @@ class ExperimentHandling(threading.Thread):
dataspace["data"]=self.data dataspace["data"]=self.data
dataspace["synchronize"]=self.synchronize dataspace["synchronize"]=self.synchronize
dataspace["sleep"]=self.sleep
self.raised_exception = None self.raised_exception = None
self.location = None self.location = None
exp_iterator=None exp_iterator=None
@ -84,7 +90,7 @@ class ExperimentHandling(threading.Thread):
if "__resultsinadvance" in self.data and self.data["__resultsinadvance"]+100<job.job_id: if "__resultsinadvance" in self.data and self.data["__resultsinadvance"]+100<job.job_id:
self.quit_flag.wait(0.05) self.quit_flag.wait(0.05)
if self.quit_flag.isSet(): if self.quit_flag.isSet():
data_sapce=None dataspace=None
exp_iterator=None exp_iterator=None
break break

View File

@ -99,6 +99,44 @@
<property name="visible">True</property> <property name="visible">True</property>
</widget> </widget>
</child> </child>
<child>
<widget class="GtkToolButton" id="toolbar_undo_button">
<property name="visible">True</property>
<property name="tooltip" translatable="yes">Undo</property>
<property name="stock_id">gtk-undo</property>
<signal name="clicked" handler="on_toolbar_undo_button_clicked"/>
</widget>
<packing>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<widget class="GtkToolButton" id="toolbar_redo_button">
<property name="visible">True</property>
<property name="tooltip" translatable="yes">Redo</property>
<property name="stock_id">gtk-redo</property>
<signal name="clicked" handler="on_toolbar_redo_button_clicked"/>
</widget>
<packing>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<widget class="GtkToolButton" id="toolbar_search_button">
<property name="visible">True</property>
<property name="tooltip" translatable="yes">Search</property>
<property name="stock_id">gtk-find</property>
<signal name="clicked" handler="on_toolbar_search_button_clicked"/>
</widget>
<packing>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<widget class="GtkSeparatorToolItem" id="separatortoolitem3">
<property name="visible">True</property>
</widget>
</child>
<child> <child>
<widget class="GtkToolButton" id="toolbar_print_button"> <widget class="GtkToolButton" id="toolbar_print_button">
<property name="visible">True</property> <property name="visible">True</property>
@ -259,7 +297,7 @@
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="shadow_type">GTK_SHADOW_IN</property> <property name="shadow_type">GTK_SHADOW_IN</property>
<child> <child>
<widget class="GtkTextView" id="experiment_script_textview"> <widget class="GtkSourceView" id="experiment_script_textview">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
</widget> </widget>
@ -361,7 +399,7 @@
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="shadow_type">GTK_SHADOW_IN</property> <property name="shadow_type">GTK_SHADOW_IN</property>
<child> <child>
<widget class="GtkTextView" id="data_handling_textview"> <widget class="GtkSourceView" id="data_handling_textview">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<signal name="event" handler="on_data_handling_textview_event"/> <signal name="event" handler="on_data_handling_textview_event"/>