def _load_editor(self, filename): if filename.endswith(".rws") or filename.endswith(".RWS"): editor = WorksheetEditor(self.notebook) elif filename.endswith(".py") or filename.endswith(".PY"): editor = LibraryEditor(self.notebook) else: gfile = gio.File(filename) context = gtk.gdk.AppLaunchContext() context.set_screen(self.window.get_screen()) context.set_timestamp(gtk.get_current_event_time()) try: handler = gfile.query_default_handler() except gio.Error, e: dialog = gtk.MessageDialog(buttons=gtk.BUTTONS_OK, type=gtk.MESSAGE_ERROR) dialog.set_markup(format_escaped("<big><b>Don't know how to open '%s'</b></big>", os.path.basename(filename))) dialog.format_secondary_text(str(e)) dialog.run() dialog.destroy() return None try: handler.launch([gfile], context) except glib.GError, e: dialog = gtk.MessageDialog(buttons=gtk.BUTTONS_OK, type=gtk.MESSAGE_ERROR) dialog.set_markup(format_escaped("<big><b>Failed to open '%s'</b></big>", os.path.basename(filename))) dialog.format_secondary_text(str(e)) dialog.run() dialog.destroy()
def _load_editor(self, filename): if filename.endswith(".rws") or filename.endswith(".RWS"): editor = WorksheetEditor(self.notebook) elif filename.endswith(".py") or filename.endswith(".PY"): editor = LibraryEditor(self.notebook) else: dialog = gtk.MessageDialog(buttons=gtk.BUTTONS_OK, type=gtk.MESSAGE_ERROR) dialog.set_markup(format_escaped("<big><b>Don't know how to open '%s'</b></big>", os.path.basename(filename))) dialog.format_secondary_text("'%s' does not have a recognized file extension" % filename) dialog.run() dialog.destroy() return None try: try: editor.load(filename, escape=False) except reunicode.ConversionError, e: dialog = gtk.MessageDialog(buttons=gtk.BUTTONS_NONE, type=gtk.MESSAGE_QUESTION) dialog.set_markup(format_escaped("<big><b>Convert conversion errors to escapes?</b></big>")) dialog.format_secondary_text( "Conversion error opening '%s': %s. Do you want to convert to escapes? The file on disk will not be changed until you save." % (os.path.basename(filename), e.message)) dialog.add_buttons("gtk-cancel", gtk.RESPONSE_CANCEL, "Convert", gtk.RESPONSE_OK) response = dialog.run() dialog.destroy() if response != gtk.RESPONSE_OK: return None editor.load(filename, escape=True) except IOError, e: dialog = gtk.MessageDialog(buttons=gtk.BUTTONS_OK, type=gtk.MESSAGE_ERROR) dialog.set_markup(format_escaped("<big><b>Cannot open '%s'</b></big>", os.path.basename(filename))) dialog.format_secondary_text("Error opening '%s': %s" %(filename, e.strerror)) dialog.run() dialog.destroy() return None
def __create_editor_item(self, editor): def on_activate(item): self._make_editor_current(editor) item = gtk.ImageMenuItem("") editor._menu_item_label = item.get_child() editor._menu_item_label.set_markup(format_escaped("<b>%s</b>", editor.title)) item.connect("activate", on_activate) editor._menu_item_status = gtk.Image() editor._menu_item_status.props.icon_size = gtk.ICON_SIZE_MENU editor._menu_item_status.props.stock = NotebookFile.stock_id_for_state(editor.state) item.set_image(editor._menu_item_status) return item
def _load_editor(self, filename): if filename.endswith(".rws") or filename.endswith(".RWS"): editor = WorksheetEditor(self.notebook) elif filename.endswith(".py") or filename.endswith(".PY"): editor = LibraryEditor(self.notebook) else: dialog = gtk.MessageDialog(buttons=gtk.BUTTONS_OK, type=gtk.MESSAGE_ERROR) dialog.set_markup(format_escaped("<big><b>Don't know how to open '%s'</b></big>", os.path.basename(filename))) dialog.format_secondary_text("'%s' does not have a recognized file extension" % filename) dialog.run() dialog.destroy() return None try: editor.load(filename) except IOError, e: dialog = gtk.MessageDialog(buttons=gtk.BUTTONS_OK, type=gtk.MESSAGE_ERROR) dialog.set_markup(format_escaped("<big><b>Cannot open '%s'</b></big>", os.path.basename(filename))) dialog.format_secondary_text("Error opening '%s': %s" %(filename, e.strerror)) dialog.run() dialog.destroy() return None
def __create_editor_item(self, editor): def on_activate(item): self._make_editor_current(editor) item = gtk.ImageMenuItem("") editor._menu_item_label = item.get_child() editor._menu_item_label.set_markup( format_escaped("<b>%s</b>", editor.title)) item.connect('activate', on_activate) editor._menu_item_status = gtk.Image() editor._menu_item_status.props.icon_size = gtk.ICON_SIZE_MENU editor._menu_item_status.props.stock = NotebookFile.stock_id_for_state( editor.state) item.set_image(editor._menu_item_status) return item
def confirm_discard(self, before_quit=False): if not self.modified: return True if before_quit: message_format = self.DISCARD_FORMAT_BEFORE_QUIT continue_button_text = '_Quit without saving' else: message_format = self.DISCARD_FORMAT continue_button_text = '_Discard' if self._get_filename() is None: save_button_text = gtk.STOCK_SAVE_AS else: save_button_text = gtk.STOCK_SAVE message = format_escaped("<big><b>" + message_format + "</b></big>", self._get_display_name()) dialog = gtk.MessageDialog(parent=self.widget.get_toplevel(), buttons=gtk.BUTTONS_NONE, type=gtk.MESSAGE_WARNING) dialog.set_markup(message) dialog.add_buttons(continue_button_text, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, save_button_text, 1) dialog.set_default_response(1) response = dialog.run() dialog.destroy() if response == gtk.RESPONSE_OK: return True elif response == 1: self.save() if self.modified: return False else: return True else: return False
def wait_for_execution(self): if self.state != NotebookFile.EXECUTING: return True message = format_escaped( '<b>Waiting for "%s" to finish executing...</b>"', self._get_display_name()) dialog = gtk.MessageDialog(parent=self.widget.get_toplevel(), buttons=gtk.BUTTONS_NONE, type=gtk.MESSAGE_INFO) dialog.set_markup(message) dialog.add_buttons("_Interrupt", 1, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) dialog.set_default_response(gtk.RESPONSE_CANCEL) loop = glib.MainLoop() def on_response(dialog, response): if response == 1: self.interrupt() else: loop.quit() dialog.connect("response", on_response) def on_state_changed(self, paramspec): if self.state != NotebookFile.EXECUTING: loop.quit() state_changed_id = self.connect("notify::state", on_state_changed) dialog.set_modal(True) dialog.show() loop.run() dialog.destroy() self.disconnect(state_changed_id) return self.state != NotebookFile.EXECUTING
def on_file_list_delete_file(self, file_list, file): dialog = gtk.MessageDialog(parent=self.window, buttons=gtk.BUTTONS_NONE, type=gtk.MESSAGE_WARNING) message = format_escaped("<big><b>Really delete '%s'?</b></big>", file.path) dialog.set_markup(message) dialog.add_buttons(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_DELETE, gtk.RESPONSE_OK) dialog.set_default_response(gtk.RESPONSE_CANCEL) response = dialog.run() dialog.destroy() if response != gtk.RESPONSE_OK: return for editor in self.editors: if editor.file == file: self._close_editor(editor) abspath = os.path.join(self.notebook.folder, file.path) os.remove(abspath) self.notebook.refresh()
def wait_for_execution(self): if self.state != NotebookFile.EXECUTING: return True message = format_escaped('<b>Waiting for "%s" to finish executing...</b>"', self._get_display_name()); dialog = gtk.MessageDialog(parent=self.widget.get_toplevel(), buttons=gtk.BUTTONS_NONE, type=gtk.MESSAGE_INFO) dialog.set_markup(message) dialog.add_buttons("_Interrupt", 1, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) dialog.set_default_response(gtk.RESPONSE_CANCEL) loop = glib.MainLoop() def on_response(dialog, response): if response == 1: self.interrupt() else: loop.quit() dialog.connect("response", on_response) def on_state_changed(self, paramspec): if self.state != NotebookFile.EXECUTING: loop.quit() state_changed_id = self.connect("notify::state", on_state_changed) dialog.set_modal(True) dialog.show() loop.run() dialog.destroy() self.disconnect(state_changed_id) return self.state != NotebookFile.EXECUTING
def _update_editor_title(self, editor): BaseNotebookWindow._update_editor_title(self, editor) if hasattr(editor, '_menu_item_label'): editor._menu_item_label.set_markup( format_escaped("<b>%s</b>", editor.title))
def _update_editor_title(self, editor): BaseNotebookWindow._update_editor_title(self, editor) if hasattr(editor, "_menu_item_label"): editor._menu_item_label.set_markup(format_escaped("<b>%s</b>", editor.title))
except glib.GError, e: dialog = gtk.MessageDialog(buttons=gtk.BUTTONS_OK, type=gtk.MESSAGE_ERROR) dialog.set_markup(format_escaped("<big><b>Failed to open '%s'</b></big>", os.path.basename(filename))) dialog.format_secondary_text(str(e)) dialog.run() dialog.destroy() return None try: try: editor.load(filename, escape=False) except reunicode.ConversionError, e: dialog = gtk.MessageDialog(buttons=gtk.BUTTONS_NONE, type=gtk.MESSAGE_QUESTION) dialog.set_markup(format_escaped("<big><b>Convert conversion errors to escapes?</b></big>")) dialog.format_secondary_text( "Conversion error opening '%s': %s. Do you want to convert to escapes? The file on disk will not be changed until you save." % (os.path.basename(filename), e.message)) dialog.add_buttons("gtk-cancel", gtk.RESPONSE_CANCEL, "Convert", gtk.RESPONSE_OK) response = dialog.run() dialog.destroy() if response != gtk.RESPONSE_OK: return None editor.load(filename, escape=True) except IOError, e: dialog = gtk.MessageDialog(buttons=gtk.BUTTONS_OK, type=gtk.MESSAGE_ERROR) dialog.set_markup(format_escaped("<big><b>Cannot open '%s'</b></big>", os.path.basename(filename)))
def export_to_pdf(self): ### Get the filename to save to ### chooser = gtk.FileChooserDialog("Export to PDF...", self.widget.get_toplevel(), gtk.FILE_CHOOSER_ACTION_SAVE, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK)) chooser.set_default_response(gtk.RESPONSE_OK) # We reuse the last filename that the use exported to in this # run of the application, otherwise we base the exported name # on the worksheet name if self.__pdf_filename is None: basename = os.path.basename(self.filename) if basename.endswith(".rws") or basename.endswith(".RWS"): basename = basename[:-4] elif basename.endswith(".py") or basename.endswith(".PY"): basename = basename[:-3] self.__pdf_filename = basename + ".pdf" chooser.set_current_name(self.__pdf_filename) # The export folder is saved persistantly (relative to the notebook # folder if it's inside it) notebook_state = application.state.get_notebook_state(self.notebook.folder) folder = notebook_state.get_pdf_folder() if folder is None: folder = self.notebook.folder elif not os.path.isabs(folder): folder = os.path.join(self.notebook.folder, folder) chooser.set_current_folder(folder) while True: response = chooser.run() filename = None if response != gtk.RESPONSE_OK: chooser.destroy() return # Overwrite confirmation filename = chooser.get_filename() if os.path.exists(filename): dialog = gtk.MessageDialog(parent=chooser, buttons=gtk.BUTTONS_NONE, type=gtk.MESSAGE_QUESTION) dialog.set_markup(format_escaped("<big><b>Replace '%s'?</b></big>", os.path.basename(filename))) dialog.format_secondary_text("The file already exists in \"%s\". Replacing it will " "overwrite its contents." % os.path.dirname(filename)) dialog.add_buttons(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, "_Replace", gtk.RESPONSE_OK) dialog.set_default_response(gtk.RESPONSE_OK) response = dialog.run() dialog.destroy() if response == gtk.RESPONSE_OK: break else: break filename = filename.decode('UTF-8') ### Save the PDF ### self._export_to_pdf(filename, self._get_page_setup()) ### Now save the selected folder and filename later use ### folder = os.path.dirname(filename) parent = folder while True: if parent == self.notebook.folder: folder = os.path.relpath(folder, self.notebook.folder) break tmp = os.path.dirname(parent) if tmp == parent: break parent = tmp if not isinstance(folder, unicode): folder = folder.decode("UTF-8") notebook_state.set_pdf_folder(folder) self.__pdf_filename = os.path.basename(filename) chooser.destroy()
def export_to_pdf(self): ### Get the filename to save to ### chooser = gtk.FileChooserDialog("Export to PDF...", self.widget.get_toplevel(), gtk.FILE_CHOOSER_ACTION_SAVE, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK)) chooser.set_default_response(gtk.RESPONSE_OK) # We reuse the last filename that the use exported to in this # run of the application, otherwise we base the exported name # on the worksheet name if self.__pdf_filename is None: basename = os.path.basename(self.filename) if basename.endswith(".rws") or basename.endswith(".RWS"): basename = basename[:-4] elif basename.endswith(".py") or basename.endswith(".PY"): basename = basename[:-3] self.__pdf_filename = basename + ".pdf" chooser.set_current_name(self.__pdf_filename) # The export folder is saved persistantly (relative to the notebook # folder if it's inside it) notebook_state = application.state.get_notebook_state( self.notebook.folder) folder = notebook_state.get_pdf_folder() if folder is None: folder = self.notebook.folder elif not os.path.isabs(folder): folder = os.path.join(self.notebook.folder, folder) chooser.set_current_folder(folder) while True: response = chooser.run() filename = None if response != gtk.RESPONSE_OK: chooser.destroy() return # Overwrite confirmation filename = chooser.get_filename() if os.path.exists(filename): dialog = gtk.MessageDialog(parent=chooser, buttons=gtk.BUTTONS_NONE, type=gtk.MESSAGE_QUESTION) dialog.set_markup( format_escaped("<big><b>Replace '%s'?</b></big>", os.path.basename(filename))) dialog.format_secondary_text( "The file already exists in \"%s\". Replacing it will " "overwrite its contents." % os.path.dirname(filename)) dialog.add_buttons(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, "_Replace", gtk.RESPONSE_OK) dialog.set_default_response(gtk.RESPONSE_OK) response = dialog.run() dialog.destroy() if response == gtk.RESPONSE_OK: break else: break filename = filename.decode('UTF-8') ### Save the PDF ### self._export_to_pdf(filename, self._get_page_setup()) ### Now save the selected folder and filename later use ### folder = os.path.dirname(filename) parent = folder while True: if parent == self.notebook.folder: folder = os.path.relpath(folder, self.notebook.folder) break tmp = os.path.dirname(parent) if tmp == parent: break parent = tmp if not isinstance(folder, unicode): folder = folder.decode("UTF-8") notebook_state.set_pdf_folder(folder) self.__pdf_filename = os.path.basename(filename) chooser.destroy()