* src/gramps_main.py (on_export_activate): Switch to new Exporter.

* src/WriteXML.py: Change registration. Return 1 on success and
0 when on failure.
* src/Utils.py (get_new_filename): Add function.
* src/DbPrompter.py (get_new_filename): Remove function.
* src/Exporter.py: Add to CVS.
* src/Makefile.am: Ship Exporter.py.
* src/Plugins.py (register_export): Change to the new scheme.


svn: r3254
This commit is contained in:
Alex Roitman 2004-07-09 18:19:47 +00:00
parent c75caa9b05
commit 4491c62a4a
8 changed files with 279 additions and 36 deletions

View File

@ -1,3 +1,13 @@
2004-07-09 Alex Roitman <shura@alex.neuro.umn.edu>
* src/gramps_main.py (on_export_activate): Switch to new Exporter.
* src/WriteXML.py: Change registration. Return 1 on success and
0 when on failure.
* src/Utils.py (get_new_filename): Add function.
* src/DbPrompter.py (get_new_filename): Remove function.
* src/Exporter.py: Add to CVS.
* src/Makefile.am: Ship Exporter.py.
* src/Plugins.py (register_export): Change to the new scheme.
2004-07-08 Don Allingham <dallingham@users.sourceforge.net>
* src/ChooseParents.py: build an exclusion list of those
obviously not the parents

View File

@ -293,7 +293,7 @@ class NewNativeDbPrompter:
filter.add_mime_type('application/x-gramps')
choose.add_filter(filter)
new_filename = get_new_filename('grdb')
new_filename = Utils.get_new_filename('grdb')
choose.set_filename(new_filename)
choose.set_current_name(os.path.split(new_filename)[1])
@ -362,7 +362,7 @@ class SaveAsDbPrompter:
for (exportData,filter,pattern_list) in Plugins._exports:
self.choose.add_filter(filter)
new_filename = get_new_filename('grdb')
new_filename = Utils.get_new_filename('grdb')
self.choose.set_filename(new_filename)
self.choose.set_current_name(os.path.split(new_filename)[1])
@ -414,22 +414,9 @@ class SaveAsDbPrompter:
if the_filter.get_name().find('XML') + 1:
new_filename = 'data.gramps'
elif the_filter.get_name() == _('GRAMPS packages'):
new_filename = get_new_filename('gpkg')
new_filename = Utils.get_new_filename('gpkg')
new_filename = os.path.split(new_filename)[1]
else:
new_filename = get_new_filename('grdb')
new_filename = Utils.get_new_filename('grdb')
new_filename = os.path.split(new_filename)[1]
self.choose.set_current_name()
#-------------------------------------------------------------------------
#
#
#
#-------------------------------------------------------------------------
_NEW_NAME_PATTERN = '~/Untitled_%d.%s'
def get_new_filename(ext):
ix = 1
while os.path.isfile(os.path.expanduser(_NEW_NAME_PATTERN % (ix,ext) )):
ix = ix + 1
return os.path.expanduser(_NEW_NAME_PATTERN % (ix,ext))

227
src/Exporter.py Normal file
View File

@ -0,0 +1,227 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2004 Donald N. Allingham
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# $Id$
#
# Written by Alex Roitman, 2004
#
#-------------------------------------------------------------------------
#
# Python modules
#
#-------------------------------------------------------------------------
import os
import shutil
from gettext import gettext as _
#-------------------------------------------------------------------------
#
# Gnome modules
#
#-------------------------------------------------------------------------
import gtk
import gtk.glade
import gnome
#-------------------------------------------------------------------------
#
# gramps modules
#
#-------------------------------------------------------------------------
import const
import Utils
import Plugins
import QuestionDialog
#-------------------------------------------------------------------------
#
# Exporter
#
#-------------------------------------------------------------------------
class Exporter:
"""
This class creates Gnome Druid to guide the user through the various
Save as/Export options. The overall goal is to keep things simple by
presenting few choice options on each druid page.
The export formats and options are obtained from the plugins, with the
exception of a native save. Native save as just copies file to another
name.
"""
def __init__(self,parent,parent_window):
self.parent = parent
self.parent_window = parent_window
self.build_exports()
self.w = gtk.Window()
self.fg_color = gtk.gdk.color_parse('#7d684a')
self.bg_color = gtk.gdk.color_parse('#e1dbc5')
self.logo = gtk.gdk.pixbuf_new_from_file("%s/gramps.png" % const.rootDir)
self.splash = gtk.gdk.pixbuf_new_from_file("%s/splash.jpg" % const.rootDir)
d = gnome.ui.Druid()
self.w.add(d)
d.add(self.build_info_page())
d.add(self.build_format_page())
d.add(self.build_file_sel_page())
self.last_page = self.build_last_page()
d.add(self.last_page)
d.connect('cancel',self.close)
self.w.connect("destroy_event",self.close)
self.w.set_transient_for(self.parent_window)
self.w.show_all()
def close(self,obj,obj2=None):
self.w.destroy()
def help(self,obj):
#FIXME: point to the correct section when it exists
gnome.help_display('gramps-manual','index')
def build_info_page(self):
p = gnome.ui.DruidPageEdge(0)
p.set_title(_('Saving your data'))
p.set_title_color(self.fg_color)
p.set_bg_color(self.bg_color)
p.set_logo(self.logo)
p.set_watermark(self.splash)
p.set_text(_('Under normal circumstances, GRAMPS does not require you '
'to directly save your changes. All changes you make are '
'immediately saved to the database.\n\n'
'This process will help you save a copy of your data '
'in any of the several formats supported by GRAMPS. '
'This can be used to make a copy of your data, backup '
'your data, or convert it to a format that will allow '
'you to trasnfer it to a different program.\n\n'
'If you change your mind during this process, you '
'can safely press Cancel button at any time and your '
'present database will still be intact.'))
return p
def build_last_page(self):
p = gnome.ui.DruidPageEdge(1)
p.set_title_color(self.fg_color)
p.set_bg_color(self.bg_color)
p.set_logo(self.logo)
p.set_watermark(self.splash)
p.connect('prepare',self.save)
p.connect('finish',self.close)
return p
def save(self,obj,obj2):
filename = self.chooser.get_filename()
success = self.exports[self.ix][0](self.parent.db,filename)
if success:
self.last_page.set_title(_('Your data has been saved'))
self.last_page.set_text(_('You may press Apply button '
'now to continue.'))
else:
self.last_page.set_title(_('Saving failed'))
self.last_page.set_text(_('There was an error '
'while saving your data. Please go back and try again.'))
def build_format_page(self):
self.format_buttons = []
p = gnome.ui.DruidPageStandard()
p.set_title(_('Choosing the format to save'))
p.set_title_foreground(self.fg_color)
p.set_background(self.bg_color)
p.set_logo(self.logo)
box = gtk.VBox()
box.set_spacing(12)
p.append_item("",box,"")
table = gtk.Table(2*len(self.exports),2)
table.set_row_spacings(6)
table.set_col_spacings(6)
group = None
for ix in range(len(self.exports)):
title = self.exports[ix][1]
description= self.exports[ix][2]
button = gtk.RadioButton(group,title)
if not group:
group = button
button.connect('toggled',self.on_format_toggled)
self.format_buttons.append(button)
table.attach(button,0,2,2*ix,2*ix+1)
label = gtk.Label(description)
label.set_line_wrap(gtk.TRUE)
table.attach(label,1,2,2*ix+1,2*ix+2)
box.add(table)
box.show_all()
return p
def build_file_sel_page(self):
p = gnome.ui.DruidPageStandard()
p.set_title(_('Selecting the file name'))
p.set_title_foreground(self.fg_color)
p.set_background(self.bg_color)
p.set_logo(self.logo)
self.chooser = gtk.FileChooserWidget(gtk.FILE_CHOOSER_ACTION_SAVE)
self.on_format_toggled(self.format_buttons[0])
p.append_item("",self.chooser,"")
return p
def native_export(self,database,filename):
try:
shutil.copyfile(database.get_save_path(),filename)
return 1
except IOError, msg:
QuestionDialog.ErrorDialog( _("Could not write file: %s") % filename,
_('System message was: %s') % msg )
return 0
def on_format_toggled(self,obj):
if not obj.get_active():
return
self.ix = self.format_buttons.index(obj)
ext = self.exports[self.ix][4]
new_filename = Utils.get_new_filename(ext)
self.chooser.set_filename(new_filename)
self.chooser.set_current_name(os.path.split(new_filename)[1])
def build_exports(self):
native_title = _('GRAMPS _GRDB database')
native_description =_('The GRAMPS GRDB database is a format '
'that GRAMPS uses to store information. '
'Selecting this option will allow you to '
'make a copy of the current database.')
native_config = None
native_ext = 'grdb'
native_export = self.native_export
self.exports = [ (native_export,native_title,native_description,
native_config,native_ext) ]
self.exports = self.exports + [ item for item in Plugins._exports ]

View File

@ -90,7 +90,8 @@ gdir_PYTHON = \
Witness.py\
WriteXML.py\
SelectPerson.py\
ArgHandler.py
ArgHandler.py\
Exporter.py
# Could use GNU make's ':=' syntax for nice wildcard use.
# If not using GNU make, then list all files individually

View File

@ -460,13 +460,13 @@ def reload_plugins(obj):
# Plugin registering
#
#-------------------------------------------------------------------------
def register_export(task, ffilter, pattern_list=None):
def register_export(exportData,_title,_description='',_config=None,_filename=''):
"""
Register an export filter, taking the task, file filter,
and the list of patterns for the filename matching.
"""
if pattern_list:
_exports.append((task, ffilter, pattern_list))
if _description and _filename:
_exports.append((exportData,_title,_description,_config,_filename))
def register_import(task, ffilter, mime=None):
"""Register an import filter, taking the task and file filter"""

View File

@ -545,3 +545,16 @@ def create_id():
s += chr(val%57+65)
val = int(val/57)
return s
#-------------------------------------------------------------------------
#
#
#
#-------------------------------------------------------------------------
_NEW_NAME_PATTERN = '~/Untitled_%d.%s'
def get_new_filename(ext):
ix = 1
while os.path.isfile(os.path.expanduser(_NEW_NAME_PATTERN % (ix,ext) )):
ix = ix + 1
return os.path.expanduser(_NEW_NAME_PATTERN % (ix,ext))

View File

@ -74,6 +74,7 @@ except:
#
#-------------------------------------------------------------------------
def exportData(database, filename, callback=None):
ret = 0
if os.path.isfile(filename):
try:
shutil.copyfile(filename, filename + ".bak")
@ -85,7 +86,7 @@ def exportData(database, filename, callback=None):
try:
g = XmlWriter(database,callback,0,compress)
g.write(filename)
ret = g.write(filename)
except:
import DisplayTrace
@ -97,6 +98,8 @@ def exportData(database, filename, callback=None):
shutil.copystat(filename + ".bak", filename)
except:
pass
return ret
#-------------------------------------------------------------------------
#
@ -144,7 +147,7 @@ class XmlWriter:
"have permission to write to the directory. "
"Please make sure you have write access to the "
"directory and try again."))
return
return 0
if os.path.exists(filename):
if not os.access(filename,os.W_OK):
@ -153,7 +156,7 @@ class XmlWriter:
"have permission to write to the file. "
"Please make sure you have write access to the "
"file and try again."))
return
return 0
self.fileroot = os.path.dirname(filename)
try:
@ -166,12 +169,13 @@ class XmlWriter:
g = open(filename,"w")
except IOError,msg:
ErrorDialog(_('Failure writing %s') % filename,msg)
return
return 0
self.g = codecs.getwriter("utf8")(g)
self.write_xml_data()
g.close()
return 1
def write_handle(self,handle):
"""
@ -189,7 +193,7 @@ class XmlWriter:
self.g = codecs.getwriter("utf8")(g)
self.write_xml_data()
g.close()
g.close()
def write_xml_data(self):
@ -421,7 +425,7 @@ class XmlWriter:
self.g.write('<%s>' % val)
self.g.write(self.fix(string.rstrip(text)))
self.g.write("</%s>\n" % val)
def write_text(self,val,text,indent=0):
if not text:
return
@ -431,7 +435,7 @@ class XmlWriter:
self.g.write('<%s>' % val)
self.g.write(self.fix(string.rstrip(text)))
self.g.write("</%s>\n" % val)
def dump_event(self,event,index=1):
if event:
self.dump_my_event(event.get_name(),event,index)
@ -811,11 +815,12 @@ def conf_priv(obj):
#
#
#-------------------------------------------------------------------------
_mime_type = 'data.gramps'
_filter = gtk.FileFilter()
_filter.set_name(_('GRAMPS XML databases'))
_filter.add_pattern(_mime_type)
_ext_list = ('.gramps',)
_title = _('GRAMPS _XML database')
_description = _('The GRAMPS XML database is a format used by older '
'versions of GRAMPS. It is read-write compatible with '
'the present GRAMPS database format.')
_config = None
_filename = 'gramps'
from Plugins import register_export
register_export(exportData,_filter,_ext_list)
register_export(exportData,_title,_description,_config,_filename)

View File

@ -71,6 +71,7 @@ import Find
import DbPrompter
import TipOfDay
import ArgHandler
import Exporter
from QuestionDialog import *
@ -1367,8 +1368,7 @@ class Gramps:
prompter.chooser()
def on_export_activate(self,obj):
prompter = DbPrompter.SaveAsDbPrompter(self,self.topWindow)
prompter.chooser()
Exporter.Exporter(self,self.topWindow)
def on_revert_activate(self,obj):
pass