diff --git a/gramps2/ChangeLog b/gramps2/ChangeLog index 334d4d791..5c122729d 100644 --- a/gramps2/ChangeLog +++ b/gramps2/ChangeLog @@ -1,3 +1,9 @@ +2006-06-18 Brian Matherly + * src/Mime/__init__.py: Add WinMime + * src/Mime/_WinMime.py: Added + * src/Utils.py: make launch work in Windows + * src/docgen/*: use Utils.launch to start external viewers + 2006-06-17 Don Allingham * src/Editors/_EditPerson.py: select given name field if the surname field is already defined diff --git a/gramps2/src/Mime/_WinMime.py b/gramps2/src/Mime/_WinMime.py new file mode 100644 index 000000000..475ecbfdf --- /dev/null +++ b/gramps2/src/Mime/_WinMime.py @@ -0,0 +1,153 @@ +# +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2006 Brian Matherly +# +# 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: + +#------------------------------------------------------------------------- +# +# Standard python modules +# +#------------------------------------------------------------------------- +import os +from _winreg import * +from gettext import gettext as _ + +#------------------------------------------------------------------------- +# +# GNOME/GTK +# +#------------------------------------------------------------------------- +import gtk + +#------------------------------------------------------------------------- +# +# Gramps modules +# +#------------------------------------------------------------------------- +import const +import _PythonMime + + +def get_application(type): + """Returns the application command and application name of the + specified mime type""" + extension = _get_extension(type) + progId = _get_prog_id(extension) + + if progId: + # Find the application associated with this program ID + aReg = ConnectRegistry(None,HKEY_CLASSES_ROOT) + subkey = OpenKey(aReg, "%s\shell\open\command" % progId) + n,command,type = EnumValue(subkey, 0) + if type == REG_EXPAND_SZ: + command = command.replace( '%SystemRoot%', + os.getenv('SystemRoot') ) + + # TODO: figure out how to get a description of the application + # use that instead of progId + return (command,progId) + + return None + +def get_description(mime_type): + """Returns the description of the specfied mime type""" + desc = None + extension = _get_extension(mime_type) + progId = _get_prog_id(extension) + + if progId: + aReg = ConnectRegistry(None,HKEY_CLASSES_ROOT) + desc = QueryValue(aReg, progId) + CloseKey(aReg) + + if not desc: + desc = _("unknown") + + return desc + +def get_type(file): + """Returns the mime type of the specified file""" + return _PythonMime.get_type(file) + +def mime_type_is_defined(mime_type): + """ + Return True if a description for a mime type exists. + """ + extension = _get_extension(mime_type) + if extension: + return True + else: + return _PythonMime.mime_type_is_defined(mime_type) + +_icon_theme = gtk.icon_theme_get_default() + +def find_mime_type_pixbuf(mime_type): + return _PythonMime.find_mime_type_pixbuf(mime_type) + +#------------------------------------------------------------------------- +# +# private functions +# +#------------------------------------------------------------------------- +def _get_extension(mime_type): + """ + Return the extension associated with this mime type + Return None if no association exists + """ + extension = None + try: + aReg = ConnectRegistry(None,HKEY_CLASSES_ROOT) + subkey = OpenKey(aReg, "MIME\DataBase\Content Type") + mimekey = OpenKey(subkey, mime_type) + extension,type = QueryValueEx(mimekey, "Extension") + CloseKey(mimekey) + CloseKey(subkey) + CloseKey(aReg) + except: + extension = None + + if not extension: + # Work around for Windows mime problems + extmap = { + 'application/abiword' : '.abw', + 'application/rtf' : '.rtf', + } + if extmap.has_key(mime_type): + extension = extmap[mime_type] + + return extension + + +def _get_prog_id(extension): + """ + Return the program ID associated with this extension + Return None if no association exists + """ + if not extension: + return None + + try: + aReg = ConnectRegistry(None,HKEY_CLASSES_ROOT) + progId = QueryValue(aReg, extension) + CloseKey(aReg) + return progId + except: + return None + diff --git a/gramps2/src/Mime/__init__.py b/gramps2/src/Mime/__init__.py index 95de6d281..93ba56b8b 100644 --- a/gramps2/src/Mime/__init__.py +++ b/gramps2/src/Mime/__init__.py @@ -21,7 +21,10 @@ try: from _GnomeMime import * except: - from _PythonMime import * + try: + from _WinMime import * + except: + from _PythonMime import * def base_type(val): return val.split('/')[0] diff --git a/gramps2/src/Utils.py b/gramps2/src/Utils.py index e0b01cf2f..656cf7531 100644 --- a/gramps2/src/Utils.py +++ b/gramps2/src/Utils.py @@ -459,7 +459,10 @@ def gformat(val): return return_val.replace(decimal_point,'.') def search_for(name): - name = name.split()[0] + if name.startswith( '"' ): + name = name.split('"')[1] + else: + name = name.split()[0] for i in os.environ['PATH'].split(':'): fname = os.path.join(i,name) if os.access(fname,os.X_OK) and not os.path.isdir(fname): @@ -991,32 +994,44 @@ class ProgressMeter: self.ptop.destroy() def launch(prog_str,path): - - subval = { - '%F' : path, - '%f' : path, - '%u' : path, - '%U' : path, - '%n' : path, - '%N' : path, - } - prog_data = prog_str.split() - prog = prog_data[0] - prog_list = [] - need_path = True + if sys.platform == "win32": + + import subprocess + if prog_str.find("%1") != -1: + prog_str = prog_str.replace("%1",path) + else: + prog_str = '%s "%s"' %(prog_str,path) + subprocess.Popen(prog_str) - if len(prog_data) > 1: - for item in prog_data: - if subval.has_key(item): - need_path = False - value = subval[item] - else: - value = item - prog_list.append(value) else: - prog_list = [prog_data[0]] + subval = { + '%F' : path, + '%f' : path, + '%u' : path, + '%U' : path, + '%n' : path, + '%N' : path, + } + + prog_data = prog_str.split() + prog = prog_data[0] + prog_list = [] + need_path = True + + if len(prog_data) > 1: + for item in prog_data: + if subval.has_key(item): + need_path = False + value = subval[item] + else: + value = item + prog_list.append(value) + else: + prog_list = [prog_data[0]] + + if need_path: + prog_list.append(path) + + os.spawnvpe(os.P_NOWAIT, prog, prog_list, os.environ) - if need_path: - prog_list.append(path) - os.spawnvpe(os.P_NOWAIT, prog, prog_list, os.environ) diff --git a/gramps2/src/docgen/AbiWord2Doc.py b/gramps2/src/docgen/AbiWord2Doc.py index 05447540a..5e89dad45 100644 --- a/gramps2/src/docgen/AbiWord2Doc.py +++ b/gramps2/src/docgen/AbiWord2Doc.py @@ -45,6 +45,7 @@ import ImgManip import Mime import Utils +mime_type = "" #------------------------------------------------------------------------- # # Class Definitions @@ -181,11 +182,9 @@ class AbiWordDoc(BaseDoc.BaseDoc): self.f.close() if self.print_req: - apptype = 'application/x-abiword' try: - app = Mime.get_application(apptype)[0] - os.environ["FILE"] = self.filename - os.system ('%s "$FILE" &' % app) + app = Mime.get_application(mime_type)[0] + Utils.launch(app,self.filename) except: pass @@ -330,8 +329,13 @@ class AbiWordDoc(BaseDoc.BaseDoc): #-------------------------------------------------------------------------- try: - prog = Mime.get_application("application/x-abiword") - mtype = Mime.get_description('application/x-abiword') + if Mime.mime_type_is_defined("application/x-abiword"): + mime_type = "application/x-abiword" + elif Mime.mime_type_is_defined("application/abiword"): + mime_type = "application/abiword" + + prog = Mime.get_application(mime_type) + mtype = Mime.get_description(mime_type) if Utils.search_for(prog[0]): print_label=_("Open in %s") % prog[1] diff --git a/gramps2/src/docgen/AsciiDoc.py b/gramps2/src/docgen/AsciiDoc.py index 5dfed8659..9b57d37f4 100644 --- a/gramps2/src/docgen/AsciiDoc.py +++ b/gramps2/src/docgen/AsciiDoc.py @@ -37,6 +37,8 @@ import BaseDoc from PluginUtils import register_text_doc import Errors import Mime +import Utils + #------------------------------------------------------------------------ # @@ -154,8 +156,7 @@ class AsciiDoc(BaseDoc.BaseDoc): if self.print_req: apptype = 'text/plain' prog = Mime.get_application(apptype) - os.environ["FILE"] = self.filename - os.system ('%s "$FILE" &' % prog[0]) + Utils.launch(prog[0],self.filename) def get_usable_width(self): return _WIDTH_IN_CHARS @@ -381,8 +382,6 @@ class AsciiDoc(BaseDoc.BaseDoc): #------------------------------------------------------------------------ print_label = None try: - import Utils - mprog = Mime.get_application("text/plain") mtype = Mime.get_description('text/plain') diff --git a/gramps2/src/docgen/HtmlDoc.py b/gramps2/src/docgen/HtmlDoc.py index a3d874689..797e47172 100644 --- a/gramps2/src/docgen/HtmlDoc.py +++ b/gramps2/src/docgen/HtmlDoc.py @@ -43,6 +43,8 @@ import Errors import BaseDoc import QuestionDialog import Mime +import Utils + #------------------------------------------------------------------------ # @@ -357,8 +359,7 @@ class HtmlDoc(BaseDoc.BaseDoc): if self.print_req: apptype = 'text/html' app = Mime.get_application(apptype) - os.environ["FILE"] = self.filename - os.system ('%s "$FILE" &' % app[0]) + Utils.launch(app[0],self.filename) def write_support_files(self): if self.map: @@ -496,9 +497,8 @@ class HtmlDoc(BaseDoc.BaseDoc): # Register the document generator with the GRAMPS plugin system # #------------------------------------------------------------------------ +print_label = None try: - import Utils - prog = Mime.get_application("text/html") mtype = Mime.get_description("text/html") @@ -506,6 +506,10 @@ try: print_label=_("Open in %s") % prog[1] else: print_label=None + + if mtype == _("unknown"): + mtype = _('HTML') + register_text_doc(mtype,HtmlDoc,1,0,1,".html", print_label) except: register_text_doc(_('HTML'),HtmlDoc,1,0,1,".html", None) diff --git a/gramps2/src/docgen/KwordDoc.py b/gramps2/src/docgen/KwordDoc.py index 44b2eedd5..9f94768d5 100644 --- a/gramps2/src/docgen/KwordDoc.py +++ b/gramps2/src/docgen/KwordDoc.py @@ -519,6 +519,10 @@ try: print_label=_("Open in %s") % prog[1] else: print_label=None + + if mtype == _("unknown"): + mtype = _('KWord') + register_text_doc(mtype, KwordDoc, 1, 1, 1, ".kwd", print_label) except: register_text_doc(_('KWord'), KwordDoc, 1, 1, 1, ".kwd", print_label) diff --git a/gramps2/src/docgen/ODFDoc.py b/gramps2/src/docgen/ODFDoc.py index 8951eba9c..e7aa30b32 100644 --- a/gramps2/src/docgen/ODFDoc.py +++ b/gramps2/src/docgen/ODFDoc.py @@ -45,6 +45,7 @@ from ReportBase import ReportUtils import ImgManip import FontScale import Mime +import Utils #------------------------------------------------------------------------- # @@ -414,8 +415,7 @@ class ODFDoc(BaseDoc.BaseDoc): self._write_zip() if self.print_req: app = Mime.get_application(_apptype) - os.environ["FILE"] = self.filename - os.system ('%s "$FILE" &' % app[0]) + Utils.launch(app[0],self.filename) def add_media_object(self,name,pos,x_cm,y_cm): @@ -1138,8 +1138,6 @@ class ODFDoc(BaseDoc.BaseDoc): #-------------------------------------------------------------------------- print_label = None try: - import Utils - mprog = Mime.get_application(_apptype) mtype = Mime.get_description(_apptype) diff --git a/gramps2/src/docgen/OpenOfficeDoc.py b/gramps2/src/docgen/OpenOfficeDoc.py index 9380b5fdf..419f1cf1e 100644 --- a/gramps2/src/docgen/OpenOfficeDoc.py +++ b/gramps2/src/docgen/OpenOfficeDoc.py @@ -382,8 +382,7 @@ class OpenOfficeDoc(BaseDoc.BaseDoc): self._write_zip() if self.print_req: app = Mime.get_application(_apptype) - os.environ["FILE"] = self.filename - os.system ('%s "$FILE" &' % app[0]) + Utils.launch(app[0],self.filename) def add_media_object(self,name,pos,x_cm,y_cm): diff --git a/gramps2/src/docgen/RTFDoc.py b/gramps2/src/docgen/RTFDoc.py index e16028c88..933ea8d2e 100644 --- a/gramps2/src/docgen/RTFDoc.py +++ b/gramps2/src/docgen/RTFDoc.py @@ -38,6 +38,9 @@ from PluginUtils import register_text_doc import ImgManip import Errors import Mime +import Utils + +mime_type = "application/rtf" #------------------------------------------------------------------------ # @@ -125,11 +128,9 @@ class RTFDoc(BaseDoc.BaseDoc): self.f.close() if self.print_req: - apptype = 'application/rtf' try: - app = Mime.get_application(apptype)[0] - os.environ["FILE"] = self.filename - os.system ('%s "$FILE" &' % app) + app = Mime.get_application(mime_type)[0] + Utils.launch(app,self.filename) except: pass @@ -422,12 +423,9 @@ class RTFDoc(BaseDoc.BaseDoc): # Register the document generator with the GRAMPS plugin system # #------------------------------------------------------------------------ - try: - import Utils - - mprog = Mime.get_application("application/rtf") - mtype = Mime.get_description("application/rtf") + mprog = Mime.get_application(mime_type) + mtype = Mime.get_description(mime_type) if Utils.search_for(mprog[0]): print_label=_("Open in %s") % mprog[1]