00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 """helper tools for using pyUNO"""
00021 
00022 import sys
00023 try:
00024         import uno, unohelper
00025         from com.sun.star.connection import NoConnectException
00026         from com.sun.star.beans import PropertyValue
00027 
00028         
00029         localoContext = uno.getComponentContext()
00030         
00031         resolver = localoContext.ServiceManager.createInstanceWithContext(
00032                                     "com.sun.star.bridge.UnoUrlResolver",
00033                                     localoContext )
00034         isOpenOfficeAvailable = True
00035 except:
00036         isOpenOfficeAvailable = False
00037 
00038 class OpenOffice:
00039     """helper tools for using pyUNO"""
00040     def __init__(self, host=None, port=None):
00041         self.host = host or 'localhost'
00042         self.port = port or 2002
00043         self.ctx, self.desktop = self.connect()
00044         self.oCoreReflection = None
00045 
00046     @staticmethod
00047     def start(host=None, port=None):
00048         import subprocess
00049         host = host or 'localhost'
00050         port = port or 2002
00051         subprocess.call(["soffice", "-accept=socket,host=%s,port=%d;urp;" % (host, port), "-nodefault"], shell=False)
00052 
00053     def connect(self):
00054         """Connection to OOo instance using pyUNO"""
00055  
00056         
00057         try:
00058             oContext = resolver.resolve(
00059             "uno:socket,host=%s,port=%i;urp;StarOffice.ComponentContext" % 
00060                                                       (self.host, self.port))
00061         except NoConnectException:
00062             oContext = None
00063         
00064         
00065         if oContext is not None:
00066             smgr = oContext.ServiceManager
00067             desktop = smgr.createInstanceWithContext(
00068                                 "com.sun.star.frame.Desktop",
00069                                 oContext)
00070         else:
00071             desktop = None
00072                                     
00073         return oContext, desktop
00074     
00075     def closeAll(self, close_desktop = False):
00076         """ close all components and terminates desktop if requested"""
00077         enum = self.desktop.Components.createEnumeration()
00078         while enum.hasMoreElements():
00079             elem = enum.nextElement()
00080             try:
00081                 elem.close(False)
00082             except AttributeError:
00083                 if not elem.supportsService("com.sun.star.frame.StartModule"):
00084                     elem.terminate()
00085         if close_desktop:    
00086             self.desktop.terminate()
00087         return
00088         
00089     
00090     
00091     
00092     
00093 
00094     def getServiceManager( self ):
00095         """Get the ServiceManager from the running OpenOffice.org.
00096         """
00097         return self.ctx.ServiceManager
00098    
00099     def createUnoService( self, cClass ):
00100         """A handy way to create a global objects within the running OOo.
00101         """
00102         oServiceManager = self.getServiceManager()
00103         oObj = oServiceManager.createInstance( cClass )
00104         return oObj
00105    
00106     def getDesktop( self ):
00107         """An easy way to obtain the Desktop object from a running OOo.
00108         """
00109         if self.desktop == None:
00110             self.desktop = self.createUnoService("com.sun.star.frame.Desktop")
00111         return self.desktop
00112 
00113     def getCoreReflection( self ):
00114         if self.oCoreReflection == None:
00115             self.oCoreReflection = self.createUnoService(
00116                                     "com.sun.star.reflection.CoreReflection" )
00117         return self.oCoreReflection 
00118         
00119     def createUnoStruct( self, cTypeName ):
00120         """Create a UNO struct and return it.
00121         """
00122         oCoreReflection = self.getCoreReflection()
00123 
00124         
00125         oXIdlClass = oCoreReflection.forName( cTypeName )
00126 
00127         
00128         oReturnValue, oStruct = oXIdlClass.createObject( None )
00129 
00130         return oStruct
00131 
00132     def makePropertyValue( self, cName=None, uValue=None,
00133                                  nHandle=None, nState=None ):
00134         """Create a com.sun.star.beans.PropertyValue struct and return it.
00135         """
00136         oPropertyValue = self.createUnoStruct(
00137                                     "com.sun.star.beans.PropertyValue" )
00138 
00139         if cName != None:
00140             oPropertyValue.Name = cName
00141         if uValue != None:
00142             oPropertyValue.Value = uValue
00143         if nHandle != None:
00144             oPropertyValue.Handle = nHandle
00145         if nState != None:
00146             oPropertyValue.State = nState
00147 
00148         return oPropertyValue