#!/usr/bin/env python import sys,os import dialogs import webbrowser try: import gtk except ImportError: print 'No PyGtk Installed' sys.exit (1) try: import scintilla except ImportError: print 'No PyGtkScintilla Installed' sys.exit (1) class LDTPUIManager: ui = ''' ''' sl_ui = ''' ''' def create_actiongroup (self): actiongroup = gtk.ActionGroup('LDTPUIManager') actiongroup.add_toggle_actions([('Script Selection', None, 'Scri_pt Selection', 'p', 'Show Script Selection Window', self.script_selection_cb )]) # Create actions actiongroup.add_actions([('New', gtk.STOCK_NEW, '_New', None, 'Create a new script', self.new_cb), ('Open', gtk.STOCK_OPEN, '_Open', None, 'Open a file', self.open_cb), ('Save', gtk.STOCK_SAVE, '_Save', None, 'Save the current file', self.save_cb), ('Save As', gtk.STOCK_SAVE_AS, 'Save _As', 's', None, self.saveas_cb), ('Quit', gtk.STOCK_QUIT, '_Quit', None, 'Quit the Program', self.quit_cb), ('Undo', gtk.STOCK_UNDO, '_Undo','Z', None, self.undo_cb), ('Redo',gtk.STOCK_REDO, '_Redo','Z', None, self.redo_cb), ('Cut', gtk.STOCK_CUT, 'Cu_t', None, 'Cut the selection',self.on_cut_activate_cb), ('Copy', gtk.STOCK_COPY, '_Copy', None, 'Copy the selection', self.on_copy_activate_cb), ('Paste', gtk.STOCK_PASTE, '_Paste', None, 'Paste the Clipboard', self.on_paste_activate_cb), ('Delete', gtk.STOCK_DELETE, '_Delete',None , None, self.delete_cb), ('Select All',None, 'Select _All', 'A', None, self.selectall_cb), ('Indent Region', None, '_Increase Indent', 'i', None, self.indent_region_cb), ('Dedent Region', None, '_Decrease Indent', 'd', None, self.dedent_region_cb), ('Record', gtk.STOCK_HARDDISK, '_Record', 'r', 'Start recording', self.record_cb), ('Data XML', None, 'Data XML', None, 'Create Data XML file', self.create_xml_data_file_cb), ('Contents', gtk.STOCK_HELP, '_Contents', 'F1', None, None), ('About', gtk.STOCK_ABOUT, '_About', None, None, self.about_cb), ('File', None, '_File'), ('Edit', None, '_Edit'), ('View', None, '_View'), ('Format', None, 'Fo_rmat'), ('Tools', None, '_Tools'), ('Help', None, '_Help')]) return actiongroup def set_style (self, lang='python'): self.notebook.SetWrapMode (scintilla.SC_WRAP_WORD) self.notebook.SetVScrollBar (1) self.notebook.SetTabWidth (4) self.notebook.SetUseTabs (0) if lang == 'python': self.notebook.SetLexer (scintilla.SCLEX_PYTHON) self.notebook.SetLexerLanguage ('python') self.notebook.StyleClearAll () self.notebook.StyleSetFore (scintilla.SCE_P_DEFNAME, 0x0000FF) self.notebook.StyleSetFore (scintilla.SCE_P_COMMENTLINE, 0x00FF00) self.notebook.StyleSetFore (scintilla.SCE_P_COMMENTBLOCK, 0x00FF00) self.notebook.StyleSetFore (scintilla.SCE_P_NUMBER, 0xFF00FF) self.notebook.StyleSetFore (scintilla.SCE_P_CLASSNAME, 0x0000FF) self.notebook.StyleSetItalic (scintilla.SCE_P_COMMENTBLOCK,1) self.notebook.StyleSetItalic (scintilla.SCE_P_STRING,1) self.notebook.StyleSetBold (scintilla.SCE_P_OPERATOR,1) self.notebook.StyleSetBold (scintilla.SCE_P_CLASSNAME,1) self.notebook.StyleSetBold (scintilla.SCE_P_WORD,1) self.notebook.SetKeyWords (0,"and assert break class continue def del elif else except exec finally for from global if import in is lambda not or pass print raise return try while yield") self.notebook.Colourise (0,-1) elif lang == 'xml': self.notebook.SetLexer (scintilla.SCLEX_XML) self.notebook.StyleClearAll () self.notebook.StyleSetFore (scintilla.SCE_H_COMMENT, 0x00FF00) self.notebook.StyleSetBold (scintilla.SCE_H_TAGUNKNOWN,1) def text_changed_cb (self, note, object): self.modified = True #print type (a), type (b) print dir (object) print object.flags, object.name, object.nick, object.owner_type, object.value_type self.notebook.SetModEventMask( scintilla.SC_MOD_INSERTTEXT) print 'over' return True def __init__(self): # Create the toplevel window self.window = gtk.Window() self.window.set_title('LDTP Editor') self.window.set_default_size(650, 500) vbox = gtk.VBox() self.window.add(vbox) # Create a LDTPUIManager instance self.uimanager = gtk.UIManager() # Add the accelerator group to the toplevel self.window accelgroup = self.uimanager.get_accel_group() self.window.add_accel_group(accelgroup) # Create an ActionGroup actiongroup = self.create_actiongroup () self.actiongroup = actiongroup # Add the actiongroup to the self.uimanager self.uimanager.insert_action_group(actiongroup, 0) # Add a UI description self.uimanager.add_ui_from_string(self.ui) # Create a MenuBar menubar = self.uimanager.get_widget('/Menubar') vbox.pack_start(menubar, False) # Create a Toolbar toolbar = self.uimanager.get_widget ('/Toolbar') vbox.pack_start (toolbar, False) # Create an Horizontal Pane self.hpane = gtk.HPaned () vbox.pack_start (self.hpane, True) # FIXME Have to make use of this status bar to show line, col numbers etc.. # Create Statusbar self.statusbar = gtk.Statusbar() vbox.pack_end(self.statusbar, False) self.context_id = self.statusbar.get_context_id('My Editor') # Create Clipboard self.clipboard = gtk.Clipboard(gtk.gdk.display_get_default(), 'CLIPBOARD') #Create the Text Object (Scintilla) self.notebook = scintilla.Scintilla () self.notebook.SetModEventMask( scintilla.SC_MOD_INSERTTEXT) self.hpane.add2 (self.notebook) # editing eye candy :-) self.set_style () self.window.connect('delete_event', self.quit_cb) self.notebook.set_size_request (650,500) self.window.set_default_size(650, 500) self.window.show_all() self.modified = False self.docs = [] self.notebook.connect ("notify", self.text_changed_cb) self.notebook.GrabFocus () return def open_cb (self, action): open_dialog = dialogs.file_dialog ('Open File', self.window, gtk.FILE_CHOOSER_ACTION_OPEN) response = open_dialog.run() if response == gtk.RESPONSE_OK: file = open_dialog.get_filename() infile = open (file, 'r') if infile: file_content = infile.read() infile.close() # Get the file name and set it as the label of page file_name = os.path.basename (file) if file_name [-4:] == '.xml': self.set_style ('xml') elif file_name [-3:] == '.py': self.set_style ('python') self.window.set_title(file_name + ' - LDTP Editor') self.notebook.SetText (file_content) self.notebook.set_label (open_dialog.get_filename()) open_dialog.destroy() else: open_dialog.destroy() return def get_file_to_save (self, save_dialog): file = None replace = False while True: response = save_dialog.run() if response == gtk.RESPONSE_OK: file = save_dialog.get_filename() if os.path.exists(file): prim_text = 'A file named \"' + file + '\" already exists.' sec_text = 'Do you want to replace it with the one you are saving?' buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, 'Replace', gtk.RESPONSE_ACCEPT) message_dialog = dialogs.message_dialog (save_dialog, gtk.MESSAGE_QUESTION, buttons, gtk.RESPONSE_CANCEL, prim_text, sec_text) response = message_dialog.run() if response == gtk.RESPONSE_ACCEPT: message_dialog.destroy() replace = True else: message_dialog.destroy() file = None continue save_dialog.destroy() else: save_dialog.destroy() break return (file, replace) def saveas_cb (self, action): prev_label = self.notebook.get_label() if prev_label == None: prev_label = '' save_dialog = dialogs.file_dialog ('Save As...', self.window, gtk.FILE_CHOOSER_ACTION_SAVE, default_file=prev_label) filename, replace = self.get_file_to_save (save_dialog) if file: fp = open (filename, 'w') contents = self.notebook.GetText()[1] fp.write (contents) fp.close () self.modified = False self.notebook.set_label (filename) # Get the file name and set it as the label of page file_name = os.path.basename (filename) self.window.set_title (file_name + ' - LDTP Editor') def save_cb (self, action): # if self.modified == False: # return filename = self.notebook.get_label() if filename == None: self.saveas_cb (action) pass else: contents = self.notebook.GetText()[1] fp = open (filename, 'w') fp.write (contents) fp.close () self.modified = False return def quit_cb (self, window, event): global no_of_docs no_of_docs -= 1 if no_of_docs == 0: gtk.main_quit () return def new_cb (self, action): global no_of_docs no_of_docs += 1 self.docs.append(LDTPUIManager ()) return def undo_cb (self, action): self.undo_history += 1 self.notebook.Undo () # Fix making menus disabled and enabled return def redo_cb (self, action): self.notebook.Redo () return def on_cut_activate_cb (self, action): self.notebook.Cut () return def on_copy_activate_cb (self, action): self.notebook.Copy () return def on_paste_activate_cb (self, action): self.notebook.Paste () return def delete_cb (self, action): self.notebook.DeleteBack () return def selectall_cb (self, action): self.notebook.SelectAll () return def indent_region_cb (self, action): pass def dedent_region_cb (self, action): pass def record_cb (self, action): pass def create_xml_data_file_cb (self, action): pass def script_selection_cb (self, action): pass def about_cb(self, b): # Create about dialog image_path = '.' about_dialog = gtk.AboutDialog() about_dialog.set_name('LDTP Editor') about_dialog.set_version('0.2.0') about_dialog.set_comments('LDTP Editor is a lightweight text editor for\nLinux Desktop Testing Project') about_dialog.set_copyright('Copyright \xc2\xa9 2005 Linux Desktop Testing Project') gtk.about_dialog_set_url_hook(webbrowser.open ('http://ldtp.freedesktop.org'), None) about_dialog.set_website_label('http://ldtp.freedesktop.org') about_dialog.set_authors(['Prashanth Mohan ','Khasim Shaheed ']) if '/usr/lib/ldtpeditor' in sys.path: image_path = '/usr/lib/ldtpeditor' logo = gtk.gdk.pixbuf_new_from_file(image_path + '/ldtp-logo-small.png') about_dialog.set_logo (logo) about_dialog.show() def main (): gtk.main() no_of_docs = 1 document = LDTPUIManager () main()