コード例 #1
0
 def format_query (self, style, format, output):
     try:
         file = open (output, 'w')
     except IOError, err:
         Utils.error_dialog_s(_(u"can’t open file “%s” for writing:\n%s")
                              % (output, str(err)))
         return
コード例 #2
0
    def save_document (self, * arg):
        if self.data.key is None:
            self.save_document_as ()
            return

        file = self.data.key.url [2]
        
	if not self.modification_check ():
	    return
	
        Utils.set_cursor (self.w, 'clock')
        try:
            try:
                self.data.update (Sort.Sort([Sort.KeySort()]))
            except (OSError, IOError), error:
                Utils.set_cursor (self.w, 'normal')
                Utils.error_dialog_s(_(u"Unable to save “%s”:\n%s") % (str (self.data.key),
                                                               str (error)))
                return
        except:
            etype, value, tb = sys.exc_info ()
            traceback.print_exception (etype, value, tb)
            
            Utils.set_cursor (self.w, 'normal')
            Utils.error_dialog_s(_(u"An internal error occurred during saving\nTry to Save As…"))
            return

        Utils.set_cursor (self.w, 'normal')

        # get the current modification date
        self.modification_date = os.stat (file) [stat.ST_MTIME]
        
        self.update_status (0)
        return
コード例 #3
0
    def on_documentation (self, *args):
        import gobject

        timestamp = gtk.gdk.CURRENT_TIME
        try:
            gtk.show_uri (None, "help:pybliographer", timestamp)
            
        except gobject.GError, msg:
            Utils.error_dialog_s(_(u"Can’t display documentation:\n%s") % msg)
コード例 #4
0
    def simple_search(self, w, *arg):
        q = w.get_text().strip()
        if q:
            try:
                test = SearchCls.AnyTester(q.encode('latin-1'))
            except UnicodeEncodeError:
                Utils.error_dialog_s(_("your search text must contain\nlatin-1 characters only"))
                return
        else:
            test = None

        self.limit_view(q, test)
コード例 #5
0
ファイル: Editor.py プロジェクト: isabella232/pybliographer
 def update(self, database, entry):
     '''Updates and returns the new entry.'''
     new = None
     text = self.buff.get_text(self.buff.get_start_iter(),
                               self.buff.get_end_iter())
     try:
         text = text.encode('latin-1')
     except UnicodeError:
         Utils.error_dialog_s(self.w.get_toplevel(),
                              _("Your text contains non Latin-1 symbols"))
         return None
     try:
         new = self.database.create_native(text)
     except Exceptions.ParserError, msg:
         Utils.error_dialog(_("Error in native string parsing"), str(msg))
         return None
コード例 #6
0
    def query_database (self, * arg):
        ''' callback corresponding to the "Medline Query..." button '''

        data = MedlineUI (self.w).run ()
        if data is None: return
        
        url = apply (Query.medline_query, data)

        if url is None:
            # no result.
            Utils.error_dialog_s(_("Your query returned no result"))
            return
        elif url is -1:
            # error
            Utils.error_dialog_s(_("An error occurred during Medline Query"))
            return

        self.open_in_new(url, 'medline', no_name=True)
        return
コード例 #7
0
ファイル: Editor.py プロジェクト: GNOME/pybliographer
 def update(self, database, entry):
     '''Updates and returns the new entry.'''
     new  = None
     text = self.buff.get_text(
         self.buff.get_start_iter(),
         self.buff.get_end_iter())
     try:
         text = text.encode('latin-1')
     except UnicodeError:
         Utils.error_dialog_s(
             self.w.get_toplevel(),
             _("Your text contains non Latin-1 symbols"))
         return None
     try:
         new = self.database.create_native(text)
     except Exceptions.ParserError, msg:
         Utils.error_dialog(
             _("Error in native string parsing"), str(msg))
         return None
コード例 #8
0
    def close_document_request (self):
        answer = self.confirm ()
        # remove autosave object with closing
        if answer and self.source_id:
            gobject.source_remove (self.source_id)

        # remove old autosave file
        if answer and self.data.key:
            if self.data.key.url [0] == 'file':
                old_file = self.data.key.url [2]
                old_auto_save = os.path.join (os.path.dirname (old_file),
                                'x-pyblio-save-' + os.path.basename (old_file))

                if os.path.exists (old_auto_save):
                    try:
                        os.remove (old_auto_save)
                    except (OSError, IOError), error:
                        Utils.set_cursor (self.w, 'normal')
                        Utils.error_dialog_s(_(u"Unable to remove autosave file “%s”:\n%s") % (str (old_auto_save), str (error)))
                        return
コード例 #9
0
    def save_document_as (self, * arg):
        # get a new file name
        (url, how) = FileSelector.URLFileSelection(_(u"Save As…"),
                                                   has_auto=False,
                                                   is_save=True,
                                                   parent=self.w).run ()
        
        if url is None: return

        if os.path.exists (url):
            if not Utils.Callback (
		_(u"The file “%s” already exists.\nOverwrite it?")
		% url, parent = self.w).answer ():
                return

        try:
            file = open (url, 'w')
        except IOError, error:
            Utils.error_dialog_s(_("During opening:\n%s") % error [1])
            return
コード例 #10
0
    def lyx_cite (self, * arg):

        import locale

        try:
            enc = locale.getpreferredencoding ()

        except AttributeError:
            enc = locale.getdefaultlocale()[1]

        
        entries = self.index.selection ()
        if not entries: return
        
        if self.lyx is None:
            from Pyblio import LyX

            try:
                self.lyx = LyX.LyXClient ()
            except IOError, msg:
                Utils.error_dialog_s(_(u"Can’t connect to LyX:\n%s") % msg)
                return
コード例 #11
0
ファイル: Editor.py プロジェクト: GNOME/pybliographer
    def update (self, database, entry):
        modified = False
        
        key = string.strip (self.key.get_text ())
        if key == '':
            self.entry.key = None
            modified = True
        else:
            if not key_re.match (key):
                Utils.error_dialog_s(self.w.get_toplevel(),
                                     _("Invalid key format"))
                return None

            key = Key.Key (database, key)

            if key != self.entry.key:
                if database.has_key (key):
                     Utils.error_dialog_s(
                         self.w.get_toplevel(),
                         _(u"Key “%s” already exists") % str (key.key))
                     return None
                
                self.entry.key = key
                modified = True
                
        modified = self.type != self.entry.type or modified
        
        for item in self.content:
            try:
                result = item.update(self.entry)
                
            except UnicodeError:
                f = Types.get_field(item.field)
                
                Utils.error_dialog_s(
                    self.w.get_toplevel(),
                    _(u"The “%s” field contains a non Latin-1 symbol") %
                    f.name)
                return None
            
            if result == -1: return None
            
            modified = result or modified

        modified |= self.lt_update()

        if not modified:
            fields = self.entry.keys()
            fields.sort()

            if fields != self.fields: modified = 1
        
        if modified:
            return self.entry
        
        return entry
コード例 #12
0
ファイル: Editor.py プロジェクト: isabella232/pybliographer
    def update(self, database, entry):
        modified = False

        key = string.strip(self.key.get_text())
        if key == '':
            self.entry.key = None
            modified = True
        else:
            if not key_re.match(key):
                Utils.error_dialog_s(self.w.get_toplevel(),
                                     _("Invalid key format"))
                return None

            key = Key.Key(database, key)

            if key != self.entry.key:
                if database.has_key(key):
                    Utils.error_dialog_s(
                        self.w.get_toplevel(),
                        _(u"Key “%s” already exists") % str(key.key))
                    return None

                self.entry.key = key
                modified = True

        modified = self.type != self.entry.type or modified

        for item in self.content:
            try:
                result = item.update(self.entry)

            except UnicodeError:
                f = Types.get_field(item.field)

                Utils.error_dialog_s(
                    self.w.get_toplevel(),
                    _(u"The “%s” field contains a non Latin-1 symbol") %
                    f.name)
                return None

            if result == -1: return None

            modified = result or modified

        modified |= self.lt_update()

        if not modified:
            fields = self.entry.keys()
            fields.sort()

            if fields != self.fields: modified = 1

        if modified:
            return self.entry

        return entry
コード例 #13
0
    def autosave (self, url, how):
        ''' autosave file as x-pyblio-save-filename '''

        if self.data.key.url [0] != 'file': return False

        name = self.data.key.url [2]

        # create an autosave file
        save = os.path.join (os.path.dirname (name),
                            'x-pyblio-save-' + os.path.basename (name))

        if self.changed:

            try:
                savefile = open (save, 'w')
            except (IOError, OSError), error:
                Utils.error_dialog_s(_("Error during autosaving:\n%s") % error [1])
                return False

            iterator = Selection.Selection (sort = Sort.Sort([Sort.KeySort()]))
            Open.bibwrite (iterator.iterator (self.data.iterator ()),
                           out = savefile, how = how, database=self.data)

            savefile.close ()
コード例 #14
0
ファイル: Editor.py プロジェクト: isabella232/pybliographer
    def update(self, entry):
        (day, month, year) = (None, None, None)

        text = string.strip(self.day.get_chars(0, -1)).encode('latin-1')
        if text != '':
            try:
                day = int(text)
            except ValueError:
                Utils.error_dialog_s(self.day.get_toplevel(),
                                     ("Invalid day field in date"))
                return -1

        text = string.strip(self.month.get_chars(0, -1)).encode('latin-1')
        if text != '':
            try:
                month = int(text)
            except ValueError:
                Utils.error_dialog_s(self.day.get_toplevel(),
                                     ("Invalid day field in date"))
                return -1

        text = string.strip(self.year.get_chars(0, -1)).encode('latin-1')
        if text != '':
            try:
                year = int(text)
            except ValueError:
                Utils.error_dialog_s(self.day.get_toplevel(),
                                     ("Invalid day field in date"))
                return -1

        if self.initial == (day, month, year): return 0

        if (day, month, year) == (None, None, None):
            del entry[self.field]
            return 1

        try:
            entry[self.field] = Fields.Date((year, month, day))
        except Exceptions.DateError, error:
            Utils.error_dialog_s(self.day.get_toplevel(), str(error))
            return -1
コード例 #15
0
ファイル: Editor.py プロジェクト: GNOME/pybliographer
    def update (self, entry):
        (day, month, year) = (None, None, None)
        
        text = string.strip (self.day.get_chars (0, -1)).encode ('latin-1')
        if text != '':
            try: day = int (text)
            except ValueError:
                Utils.error_dialog_s(self.day.get_toplevel(),
                                    ("Invalid day field in date"))
                return -1
        
        text = string.strip (self.month.get_chars (0, -1)).encode ('latin-1')
        if text != '':
            try: month = int (text)
            except ValueError:
                Utils.error_dialog_s(self.day.get_toplevel(),
                                    ("Invalid day field in date"))
                return -1
        
        text = string.strip (self.year.get_chars (0, -1)).encode ('latin-1')
        if text != '':
            try: year = int (text)
            except ValueError: 
                Utils.error_dialog_s(self.day.get_toplevel(),
                                    ("Invalid day field in date"))
                return -1
        
        if self.initial == (day, month, year): return 0

        if (day, month, year) == (None, None, None):
            del entry [self.field]
            return 1

        try:
            entry [self.field] = Fields.Date ((year, month, day))
        except Exceptions.DateError, error:
            Utils.error_dialog_s(self.day.get_toplevel(),
                                 str(error))
            return -1
コード例 #16
0
        if self.data.key is not None and self.source_id:
            gobject.source_remove (self.source_id)

        # remove old autosave file if exists
        if self.data.key:
            if self.data.key.url [0] == 'file':
                old_file = self.data.key.url [2]
                old_auto_save = os.path.join (os.path.dirname (old_file),
                                'x-pyblio-save-' + os.path.basename (old_file))

                if os.path.exists (old_auto_save):
                    try:
                        os.remove (old_auto_save)
                    except (OSError, IOError), error:
                        Utils.set_cursor (self.w, 'normal')
                        Utils.error_dialog_s(_(u"Unable to remove autosave file “%s”:\n%s") % (str (old_auto_save), str (error)))
                        return


        Utils.set_cursor (self.w, 'normal')

        if no_name: data.key = None
        
        self.data    = data


        if restore:

            # restore the original url internally,
            # and change the document status
            self.data.key = orig_url
コード例 #17
0
class Document (Connector.Publisher):
    
    def __init__ (self, database):

        self.uim = gtk.UIManager ()

        self.recents = None
        self.viewables = None
	
        self.actiongroup = gtk.ActionGroup ('Main')
        
        self.actiongroup.add_actions ([
            # id     stock            label         accel   tooltip   callback
            ('File', None,                _('_File')),
            ('EditMenu', None,            _('_Edit')),
	    ('ViewMenu', None,            _('_View')),
            ('CiteMenu', None,            _('_Cite')),
            ('Settings', None,            _('_Settings')),
            ('HelpMenu', None,            _('_Help')),
            ('Recent', None, _('Recent documents')),
            
            ('New',  gtk.STOCK_NEW,   None,         None,   None,     self.new_document),
            ('Open', gtk.STOCK_OPEN,  None,         None,   _('Open a file'), self.ui_open_document),
            ('Open_URL', None, _(u'Open _Location…'), '<control>l',   None, self.ui_open_location),
            ('Save', gtk.STOCK_SAVE,  None,         None,   _('Save the current file'), self.save_document),
            ('Save_As', gtk.STOCK_SAVE_AS,  None,         None,   None,     self.save_document_as),
            ('Close', gtk.STOCK_CLOSE,  None,         None,   None,     self.close_document),
            ('Quit', gtk.STOCK_QUIT,  None,         None,   None,     self.exit_application),

            ('Merge',   None, _(u'Merge With…'),    '<control>g',  None, self.merge_database),
            ('Medline', None, _(u'Medline Query…'), '<control>m',  None, self.query_database),



            ('Cut', gtk.STOCK_CUT,  None,         None,   None,     self.cut_entry),
            ('Copy', gtk.STOCK_COPY,  None,         None,   None,     self.copy_entry),
            ('Paste', gtk.STOCK_PASTE,  None,         None,   None,     self.paste_entry),
            ('Clear', gtk.STOCK_CLEAR,  None,         None,   None,     self.clear_entries),
            ('Add', gtk.STOCK_ADD,  None,   '<shift><control>n',  _('Add a new entry'), self.add_entry),
            ('Edit', gtk.STOCK_EDIT,  None, '<shift><control>o',   None,     self.edit_entry),
            ('Delete', gtk.STOCK_DELETE,  None,         None,   None,     self.delete_entry),
            ('Find', gtk.STOCK_FIND,  None,         None,   None,     self.find_entries),
            
            ('Sort', None, _(u'S_ort…'), None,  None, self.sort_entries),
            ('Cite', gtk.STOCK_JUMP_TO,   _(u'Cite…'), None,  _('Cite key(s)'), self.lyx_cite),
            ('Format', gtk.STOCK_EXECUTE, _(u'Format…'), None,  None, self.format_entries),

            ('Fields', None, _(u'Fields…'), None,  None, self.set_fields),
            ('Preferences', gtk.STOCK_PREFERENCES,  None,         None,   None,     self.set_preferences),
            ('Forget', None, _('Forget all changes'),     None,   None,     self.forget_changes_cb),
            
            ('Contents', gtk.STOCK_HELP, None,   None,   None,     self.on_documentation),
            ('About', gtk.STOCK_ABOUT, None,   None,   None,     self.about),
	    ('ViewResource', None, _('_Resource'), None, None, self.view_entry),
            ])


        prev = self.actiongroup.get_action ('Recent')
        
        prev.set_property ('is-important', True)
        prev.set_property ('hide-if-empty', False)

        view_action = self.actiongroup.get_action ('ViewResource')
	view_action.set_property ('hide-if-empty', False)
        self.uim.insert_action_group (self.actiongroup, 0)
        self.uim.add_ui_from_string (uim_content)

        self.uim.ensure_update ()

        gp = os.path.join(Utils.glade_root, 'pyblio.ui')
        icon_file = os.path.join (version.pixmapsdir, 'pybliographic.png')

        self.xml = gtk.Builder()
        self.xml.set_translation_domain('pybliographer')
        self.xml.add_from_file(gp)
        self.xml.connect_signals(self)

        self.w = self.xml.get_object('main')
        self.w.set_icon_from_file(icon_file)
        self.paned = self.xml.get_object('main_pane')

        box = self.xml.get_object('table')
        menubar = (self.uim.get_widget ('/Menubar'))
        toolbar = (self.uim.get_widget ('/Toolbar'))
        box.attach(menubar, 0, 1, 0, 1, yoptions=0)
        box.attach(toolbar, 0, 1, 1, 2, yoptions=0)

        self.w.add_accel_group (self.uim.get_accel_group ())

        self.w.add_events (gtk.gdk.KEY_PRESS_MASK)
        
        self.w_save_btn = self.xml.get_object('_w_save_btn')
        self.w_save_mnu = self.xml.get_object('_w_save_mnu')

        self.quick_search = gtk.Entry()
        self.quick_search.set_icon_from_stock(gtk.ENTRY_ICON_PRIMARY, gtk.STOCK_FIND)
        self.quick_search.connect('activate', self.simple_search)

        tool_item = gtk.ToolItem()
        tool_item.add(self.quick_search)
        toolbar.insert(tool_item, -1)

        tool_item.show_all()

        # The Index list
        self.index = Index.Index (popup = self.uim.get_widget ('/Popup'))
        self.paned.add1 (self.index.w)
        
        self.index.Subscribe ('new-entry',      self.add_entry)
        self.index.Subscribe ('edit-entry',     self.edit_entry)
##      self.index.Subscribe ('view-entry',     self.view_entry)
        self.index.Subscribe ('delete-entry',   self.delete_entry)
        self.index.Subscribe ('select-entry',   self.update_display)
        self.index.Subscribe ('select-entries', self.freeze_display)
        self.index.Subscribe ('drag-received',  self.drag_received)
        self.index.Subscribe ('drag-moved',     self.drag_moved)
        self.index.Subscribe ('click-on-field', self.sort_by_field)

        self.paned.show_all ()

        # The text area
        self.display = Entry.Entry ()
        self.paned.add2 (self.display.w)

        # Status bar
        self.statusbar = self.xml.get_object('statusbar')
        
        # set window size
        ui_width  = Utils.config.get_int ('/apps/pybliographic/ui/width') or -1
        ui_height = Utils.config.get_int ('/apps/pybliographic/ui/height') or -1

        if ui_width != -1 and ui_height != -1:
            self.w.set_default_size (ui_width, ui_height)

        # set paned size
        paned_height = Utils.config.get_int ('/apps/pybliographic/ui/paned') or -1
        self.paned.set_position (paned_height)
        
        self.w.show_all ()
        
        # application variables
        self.data      = database
        self.selection = Selection.Selection ()
        self.search_dg = None
        self.sort_dg   = None
        self.lyx       = None
        self.changed   = 0
        self.directory = None

        self.incremental_start  = None
        self.incremental_search = ''
        
        self.modification_date = None

        # for autosave
        self.source_id = None

        # set the default sort method
        default = Utils.config.get_string ('/apps/pybliographic/sort/default')
        if default is not None: default = pickle.loads (default)

        self.sort_view (default)

        self._title_set ()
        self._set_edit_actions (False)
        return

    def _title_set (self):
        
        if self.data.key is None:
            self.w.set_title (_('Unnamed bibliographic database'))
            return

        name = os.path.basename (self.data.key.url [2])
        
        self.w.set_title (name)
        return
        

    def set_preferences (self, * arg):
        from Pyblio.GnomeUI import Config
        Config.run(self.w)
        return

    def set_fields (self, * arg):
        from Pyblio.GnomeUI import Fields
        Fields.run (self.w)
        return
    
    def forget_changes_cb (self, * arg):
        Config.forget_changes()
        return
    

    def update_history (self, history):
        ''' fill the " Previous Documents " menu with the specified list of documents '''

        if self.recents:
            for mid in self.recents_mid:
                self.uim.remove_ui (mid)
                
            self.uim.remove_action_group (self.recents)

        self.recents_mid = []
        self.recents = gtk.ActionGroup ('Recent')

        self.uim.insert_action_group (self.recents, 1)

        for item in history:
            # Display name in the menu
            quoted   = string.replace (item [0], '_', '__')
        
            mid = self.uim.new_merge_id ()

            self.recents_mid.append (mid)
            
            action = gtk.Action (str (mid), quoted, None, None)
            self.recents.add_action (action)

            action.connect ('activate', self._history_open_cb, item)
        
            self.uim.add_ui (mid, '/Menubar/File/Recent', str (mid),
                             str (mid), gtk.UI_MANAGER_MENUITEM, False)

        return

    def _history_open_cb (self, id, w):

        file, type = w
        
        if not self.confirm (): return

        self.open_document (file, type)
        return
    
    
    def redisplay_index (self, changed = -1):
        ''' redisplays the index. If changed is specified, set the
        self.changed status to the given value '''
        
        if changed != -1:
            self.changed = changed

        self.index.display (self.selection.iterator (self.data.iterator ()))
        
        self.update_status ()
        return


    def format_query (self, style, format, output):
        try:
            file = open (output, 'w')
        except IOError, err:
            Utils.error_dialog_s(_(u"can’t open file “%s” for writing:\n%s")
                                 % (output, str(err)))
            return
        
        entries = map (lambda x: x.key, self.index.selection ())
        
        if not entries:
            iter    = self.selection.iterator (self.data.iterator ())
            entries = []
            
            e = iter.first ()
            while e:
                entries.append (e.key)
                e = iter.next ()

        url = Fields.URL (style)

        try:
            Pyblio.Style.Utils.generate (url, format, self.data, entries, file)
        except RuntimeError, err:
            print err
            Utils.error_dialog_s(_(u"Error while parsing “%s”:\n%s") % (style, err))