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:
parent
9f4a3d6b53
commit
dfd5961ba6
2
debian/control
vendored
2
debian/control
vendored
@ -10,7 +10,7 @@ Package: python-damaris
|
||||
Architecture: all
|
||||
XB-Python-Version: ${python:Versions}
|
||||
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
|
||||
Suggests: python-doc, python-tables-doc, python-numpy-doc
|
||||
Description: python frontend for DAMARIS project
|
||||
|
@ -34,6 +34,8 @@ import gtk.gdk
|
||||
gtk.gdk.threads_init( )
|
||||
import gtk.glade
|
||||
|
||||
import gtksourceview2
|
||||
|
||||
import pango
|
||||
import cairo
|
||||
|
||||
@ -72,7 +74,7 @@ if hasattr( gtk, "PrintOperation" ):
|
||||
from damaris.gui import ExperimentWriter, ExperimentHandling
|
||||
from damaris.gui import ResultReader, ResultHandling
|
||||
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 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_doc_menu_activate", self.show_doc_menu )
|
||||
self.xml_gui.signal_connect( "on_toolbar_manual_button_clicked", self.show_manual )
|
||||
|
||||
|
||||
def run( self ):
|
||||
# prolong lifetime of clipboard till the very end (avoid error message)
|
||||
self.main_clipboard = self.sw.main_clipboard
|
||||
@ -243,7 +245,57 @@ class DamarisGUI:
|
||||
if self.state in [ DamarisGUI.Edit_State, DamarisGUI.Quit_State ]:
|
||||
self.state = DamarisGUI.Quit_State
|
||||
# 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.sw = None
|
||||
self.monitor = None
|
||||
@ -252,7 +304,14 @@ class DamarisGUI:
|
||||
gtk.main_quit( )
|
||||
return True
|
||||
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
|
||||
|
||||
# toolbar related events:
|
||||
@ -988,16 +1047,58 @@ class ScriptWidgets:
|
||||
self.res_script_filename = None
|
||||
|
||||
# load syntax description for syntax highlighting (defined in python.xml)
|
||||
sl = SyntaxLoader( "python" )
|
||||
#sl = SyntaxLoader( "python" )
|
||||
# script buffers:
|
||||
self.experiment_script_textview = self.xml_gui.get_widget( "experiment_script_textview" )
|
||||
self.data_handling_textview = self.xml_gui.get_widget( "data_handling_textview" )
|
||||
|
||||
# create and set syntax-highlighting text-buffers as textview backends
|
||||
self.experiment_script_textbuffer = CodeBuffer( lang=sl )
|
||||
self.data_handling_textbuffer = CodeBuffer( lang=sl )
|
||||
self.experiment_script_textbuffer = gtksourceview2.Buffer()
|
||||
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_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_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
|
||||
# clipboard
|
||||
@ -1040,6 +1141,9 @@ class ScriptWidgets:
|
||||
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_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
|
||||
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 )
|
||||
@ -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_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_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
|
||||
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 ):
|
||||
# load buffers and set cursor to front
|
||||
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.place_cursor( self.experiment_script_textbuffer.get_start_iter( ) )
|
||||
self.experiment_script_textbuffer.set_modified( False )
|
||||
self.experiment_script_textbuffer.end_not_undoable_action()
|
||||
self.textviews_moved( self.experiment_script_textview )
|
||||
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.place_cursor( self.data_handling_textbuffer.get_start_iter( ) )
|
||||
self.data_handling_textbuffer.set_modified( False )
|
||||
self.data_handling_textbuffer.end_not_undoable_action()
|
||||
self.textviews_moved( self.data_handling_textview )
|
||||
self.set_toolbuttons_status( )
|
||||
|
||||
@ -1117,14 +1228,23 @@ class ScriptWidgets:
|
||||
exp_modified = self.experiment_script_textbuffer.get_modified( )
|
||||
res_modified = self.data_handling_textbuffer.get_modified( )
|
||||
enable_save = True
|
||||
canundo = False
|
||||
canredo = False
|
||||
if current_page == 0:
|
||||
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:
|
||||
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_as_button.set_sensitive( True )
|
||||
self.toolbar_save_all_button.set_sensitive( exp_modified or res_modified )
|
||||
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:
|
||||
# disable toolbar
|
||||
self.toolbar_new_button.set_sensitive( False )
|
||||
@ -1133,6 +1253,9 @@ class ScriptWidgets:
|
||||
self.toolbar_save_as_button.set_sensitive( False )
|
||||
self.toolbar_save_all_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:
|
||||
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
|
||||
if event.state & gtk.gdk.CONTROL_MASK != 0:
|
||||
if event.keyval == gtk.gdk.keyval_from_name( "c" ):
|
||||
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" ):
|
||||
if event.keyval == gtk.gdk.keyval_from_name( "s" ):
|
||||
# save buffer
|
||||
page = self.main_notebook.get_current_page( )
|
||||
if (self.exp_script_filename, self.res_script_filename)[ page ] is None:
|
||||
@ -1286,88 +1389,13 @@ class ScriptWidgets:
|
||||
return True
|
||||
elif event.keyval == gtk.gdk.keyval_from_name( "S" ):
|
||||
# save both buffers
|
||||
print "ToDo: save both buffers"
|
||||
self.save_all_files( None, None )
|
||||
return True
|
||||
elif event.keyval == gtk.gdk.keyval_from_name("f"):
|
||||
self.search(None, None)
|
||||
return True
|
||||
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)
|
||||
return 0
|
||||
|
||||
@ -1399,7 +1427,22 @@ class ScriptWidgets:
|
||||
return 0
|
||||
|
||||
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 ):
|
||||
if response_id == gtk.RESPONSE_OK:
|
||||
@ -1491,7 +1534,17 @@ class ScriptWidgets:
|
||||
|
||||
absfilename = os.path.abspath( file_name )
|
||||
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( )
|
||||
if current_page == 0:
|
||||
@ -1548,6 +1601,147 @@ class ScriptWidgets:
|
||||
self.save_file( )
|
||||
|
||||
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 ):
|
||||
|
||||
@ -1556,12 +1750,44 @@ class ScriptWidgets:
|
||||
current_page = self.main_notebook.get_current_page( )
|
||||
if current_page == 0:
|
||||
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.exp_script_filename = None
|
||||
elif current_page == 1:
|
||||
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.res_script_filename = None
|
||||
self.set_toolbuttons_status( )
|
||||
@ -2440,7 +2666,17 @@ class MonitorWidgets:
|
||||
|
||||
absfilename = os.path.abspath( file_name )
|
||||
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" )
|
||||
tmpfile.seek( 0 )
|
||||
|
@ -25,6 +25,11 @@ class ExperimentHandling(threading.Thread):
|
||||
self.quit_flag.wait(waitsteps)
|
||||
if self.quit_flag.isSet():
|
||||
raise StopIteration
|
||||
|
||||
def sleep(self, seconds):
|
||||
self.quit_flag.wait(seconds)
|
||||
if self.quit_flag.isSet():
|
||||
raise StopIteration
|
||||
|
||||
def run(self):
|
||||
dataspace={}
|
||||
@ -36,6 +41,7 @@ class ExperimentHandling(threading.Thread):
|
||||
|
||||
dataspace["data"]=self.data
|
||||
dataspace["synchronize"]=self.synchronize
|
||||
dataspace["sleep"]=self.sleep
|
||||
self.raised_exception = None
|
||||
self.location = 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:
|
||||
self.quit_flag.wait(0.05)
|
||||
if self.quit_flag.isSet():
|
||||
data_sapce=None
|
||||
dataspace=None
|
||||
exp_iterator=None
|
||||
break
|
||||
|
||||
|
@ -99,6 +99,44 @@
|
||||
<property name="visible">True</property>
|
||||
</widget>
|
||||
</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>
|
||||
<widget class="GtkToolButton" id="toolbar_print_button">
|
||||
<property name="visible">True</property>
|
||||
@ -259,7 +297,7 @@
|
||||
<property name="can_focus">True</property>
|
||||
<property name="shadow_type">GTK_SHADOW_IN</property>
|
||||
<child>
|
||||
<widget class="GtkTextView" id="experiment_script_textview">
|
||||
<widget class="GtkSourceView" id="experiment_script_textview">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
</widget>
|
||||
@ -361,7 +399,7 @@
|
||||
<property name="can_focus">True</property>
|
||||
<property name="shadow_type">GTK_SHADOW_IN</property>
|
||||
<child>
|
||||
<widget class="GtkTextView" id="data_handling_textview">
|
||||
<widget class="GtkSourceView" id="data_handling_textview">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<signal name="event" handler="on_data_handling_textview_event"/>
|
||||
|
Loading…
Reference in New Issue
Block a user