2014-11-23

VFP and OPEN OFFICE AUTOMATION

Here are some samples of OO Automation
Author: UNKNOWN

* Library of routines to manipulate OpenOffice.org.
*
*
* http://kosh.datateamsys.com/~danny/OOo/VisualFoxPro-OOo/LibOOo-2003-11-17-01.prg

*############################################################
*    Public API
*    High level routines.
*############################################################


* Return .T. if OpenOffice.org is installed.
* Return .F. if not installed.
FUNCTION OOoIsInstalled()
    LOCAL oServiceManager
    oServiceManager = .NULL.

    LOCAL cOldErrHandler
    cOldErrHandler = ON( "ERROR" )
    ON ERROR = DoNothing__ErrorHandler( ERROR(), MESSAGE(), LINENO(), SYS(16), PROGRAM(), SYS(2018) )
        oServiceManager = OOoGetServiceManager()
    ON ERROR &cOldErrHandler
    
    * If we could create a Service Manager,
    *  then OpenOffice.org must be installed.
    RETURN NOT ISNULL( oServiceManager )
ENDFUNC




* Easy way to create a new Draw document.
FUNCTION OOoCreateNewDrawDocument()
    LOCAL oDrawDoc
    oDrawDoc = OOoOpenURL( "private:factory/sdraw" )
    RETURN oDrawDoc
ENDFUNC


* Easy way to create a new Writer document.
FUNCTION OOoCreateNewWriterDocument()
    LOCAL oWriterDoc
    oWriterDoc = OOoOpenURL( "private:factory/swriter" )
    RETURN oWriterDoc
ENDFUNC


* Easy way to create a new Calc document.
FUNCTION OOoCreateNewCalcDocument()
    LOCAL oCalcDoc
    oCalcDoc = OOoOpenURL( "private:factory/scalc" )
    RETURN oCalcDoc
ENDFUNC


* Easy way to create a new Impress document.
FUNCTION OOoCreateNewImpressDocument()
    LOCAL oImpressDoc
    oImpressDoc = OOoOpenURL( "private:factory/simpress" )
    RETURN oImpressDoc
ENDFUNC



FUNCTION OOoOpenFile( cFilename )
    LOCAL cURL
    cURL = OOoConvertToURL( cFilename )
    
    LOCAL oDoc
    oDoc = OOoOpenURL( cURL )
    RETURN oDoc
ENDFUNC


PROCEDURE OOoTerminateProgram()
    LOCAL oDesktop
    oDesktop = OOoGetDesktop()
    oDesktop.Terminate()
    
    =__OOoReleaseCachedVars()
ENDPROC


* Convert a local filename to an OOo URL.
FUNCTION OOoConvertToURL( cFilename )
    * Ensure leading slash.
    IF LEFT( cFilename, 1 ) != "/"
        cFileName = "/" + cFileName
    ENDIF
    
    LOCAL cURL
    cURL = CHRTRAN( cFilename, "\", "/" )    && change backslashes to forward slashes.
    cURL = "file://" + cURL
    RETURN cURL
ENDFUNC




*############################################################
*    Draw specific tools
*############################################################


* Page zero is the first page.
* Once you have a drawing document, obtain one of its pages.
FUNCTION OOoGetDrawPage( oDrawDoc, nPageNum )
    LOCAL oPages
    oPages = oDrawDoc.GetDrawPages()
    LOCAL oPage
    oPage = oPages.GetByIndex( nPageNum )
    RETURN oPage
ENDFUNC


* Given a draw document, create a shape.
* The shape must be added to the draw page, by calling
*  the draw page's Add() method.
* The oPosition and oSize arguments are optional, but you may
*  pass a Point and Size struct for these arguments.

FUNCTION OOoMakeRectangleShape( oDrawDoc, oPosition, oSize )
    LOCAL oShape
    oShape = OOoMakeShape( oDrawDoc, "com.sun.star.drawing.RectangleShape", oPosition, oSize )
    RETURN oShape
ENDFUNC

FUNCTION OOoMakeEllipseShape( oDrawDoc, oPosition, oSize )
    LOCAL oShape
    oShape = OOoMakeShape( oDrawDoc, "com.sun.star.drawing.EllipseShape", oPosition, oSize )
    RETURN oShape
ENDFUNC

FUNCTION OOoMakeLineShape( oDrawDoc, oPosition, oSize )
    LOCAL oShape
    oShape = OOoMakeShape( oDrawDoc, "com.sun.star.drawing.LineShape", oPosition, oSize )
    RETURN oShape
ENDFUNC

FUNCTION OOoMakeTextShape( oDrawDoc, oPosition, oSize )
    LOCAL oShape
    oShape = OOoMakeShape( oDrawDoc, "com.sun.star.drawing.TextShape", oPosition, oSize )
    RETURN oShape
ENDFUNC


* Create and return a Point struct.
FUNCTION OOoPosition( nX, nY )
    LOCAL oPoint
    oPoint = OOoCreateStruct( "com.sun.star.awt.Point" )
    oPoint.X = nX
    oPoint.Y = nY
    RETURN oPoint
ENDFUNC

* Create and return a Size struct.
FUNCTION OOoSize( nWidth, nHeight )
    LOCAL oSize
    oSize = OOoCreateStruct( "com.sun.star.awt.Size" )
    oSize.Width = nWidth
    oSize.Height = nHeight
    RETURN oSize
ENDFUNC


* Given a shape, alter its position.
PROCEDURE OOoSetPosition( oShape, nX, nY )
    LOCAL oPosition
    oPosition = oShape.Position
    oPosition.X = nX
    oPosition.Y = nY
    oShape.Position = oPosition
ENDPROC

* Given a shape, alter its size.
PROCEDURE OOoSetSize( oShape, nWidth, nHeight )
    LOCAL oSize
    oSize = oShape.Size
    oSize.Width = nWidth
    oSize.Height = nHeight
    oShape.Size = oSize
ENDPROC


* Given a draw document, create a shape.
* Optional:  oPosition, oSize can receive a Point or Size struct.
FUNCTION OOoMakeShape( oDrawDoc, cShapeClassName, oPosition, oSize )
    LOCAL oShape
    oShape = oDrawDoc.CreateInstance( cShapeClassName )
    
    IF (TYPE([oPosition])="O")  AND  (NOT ISNULL( oPosition ))
        oShape.Position = oPosition
    ENDIF
    IF (TYPE([oSize])="O")  AND  (NOT ISNULL( oSize ))
        oShape.Size = oSize
    ENDIF
    
    RETURN oShape
ENDFUNC



*############################################################
*    Color conversion utilities
*    --------------------------
*    Visual FoxPro and OpenOffice.org do not represent
*     color values the same way.
*    Conversion routines in both directions are provided
*     to keep things easy.
*    In addition, extremely convenient HSV routines are provided.
*    See LibGraphics for discussion of HSV color model.
*############################################################


* Similar to VFP's built in RGB() function.
* Pass in R,G,B values and out comes an OpenOffice.org color value.
* Note that this is DIFFERENT from how VFP constructs color values.
FUNCTION OOoRGB( nRed, nGreen, nBlue )
    RETURN BITOR( BITOR( BITLSHIFT( nRed, 16 ), BITLSHIFT( nGreen, 8 ) ), nBlue )
ENDFUNC

* Translate between a Visual FoxPro color and an OpenOffice.org color
*  by using a simple formula.
* Pass in a VFP color, out comes an OOo color.  And vice versa.
FUNCTION OOoColor( nColor )
    LOCAL nTranslatedColor
    nTranslatedColor = (INT( nColor / 65536 )) + (INT( INT( nColor / 256 ) % 256 ) * 256) + (INT( nColor % 256 ) * 65536)
    RETURN nTranslatedColor
ENDFUNC

* Extract the Red component from an OpenOffice.org color.
* SImilar to the RGBRed() function in LibGraphics.
FUNCTION OOoRed( nOOoColor )
*    RETURN INT( nOOoColor / 65536 )
    RETURN BITRSHIFT( BITAND( nOOoColor, 0x00FF0000 ), 16 )
ENDFUNC

* Extract the Green component from an OpenOffice.org color.
* SImilar to the RGBGreen() function in LibGraphics.
FUNCTION OOoGreen( nOOoColor )
*    RETURN INT( INT( nOOoColor / 256 ) % 256 )
    RETURN BITRSHIFT( BITAND( nOOoColor, 0x0000FF00 ), 8 )
ENDFUNC

* Extract the Blue component from an OpenOffice.org color.
* SImilar to the RGBBlue() function in LibGraphics.
FUNCTION OOoBlue( nOOoColor )
*    RETURN INT( nOOoColor % 256 )
    RETURN BITAND( nOOoColor, 0x000000FF )
ENDFUNC

* Convenient way to construct an OOo color from HSV components.
* See LibGraphics for information about HSV.
* Note nHue is a number from 0.0 to 1.0.
FUNCTION OOoHSV( nHue, nSaturation, nBrightness )
    LOCAL nColor
    nColor = MakeHSVColor( nHue * 6.0, nSaturation, nBrightness )
    nColor = OOoColor( nColor )
    RETURN nColor
ENDFUNC

* Convenient way to extract the Hue component from an OOo color.
* See LibGraphics for information about HSV.
* Note nHue is a number from 0.0 to 1.0.
FUNCTION OOoHue( nOOoColor )
    RETURN HSVHue( OOoColor( nOOoColor ) ) / 6.0
ENDFUNC

* Convenient way to extract the Saturation component from an OOo color.
* See LibGraphics for information about HSV.
FUNCTION OOoSaturation( nOOoColor )
    RETURN HSVSaturation( OOoColor( nOOoColor ) )
ENDFUNC

* Convenient way to extract the Brightness component from an OOo color.
* See LibGraphics for information about HSV.
FUNCTION OOoBrightness( nOOoColor )
    RETURN HSVValue( OOoColor( nOOoColor ) )
ENDFUNC



*############################################################



PROCEDURE DoNothing__ErrorHandler( pnError, pcErrMessage, pnLineNo, pcProgramFileSys16, pcProgram, pcErrorParamSys2018 )
ENDPROC


* Return the OpenOffice.org service manager object.
* Cache it in a global variable.
* Create it if not already cached.
FUNCTION OOoGetServiceManager()
    IF (TYPE([goOOoServiceManager])!="O")  OR  ISNULL( goOOoServiceManager )
        PUBLIC goOOoServiceManager
        goOOoServiceManager = CREATEOBJECT( "com.sun.star.ServiceManager" )
    ENDIF
    RETURN goOOoServiceManager
ENDFUNC


* Sugar coated routine to ask the service manager to
*  create you an instance of some other OpenOffice.org UNO object.
FUNCTION OOoServiceManager_CreateInstance( cServiceName )
    LOCAL oServiceManager
    oServiceManager = OOoGetServiceManager()
    
    LOCAL oInstance
    oInstance = .NULL.

    LOCAL cOldErrHandler
    cOldErrHandler = ON( "ERROR" )
    ON ERROR = DoNothing__ErrorHandler( ERROR(), MESSAGE(), LINENO(), SYS(16), PROGRAM(), SYS(2018) )
        oInstance = oServiceManager.createInstance( cServiceName )
    ON ERROR &cOldErrHandler
    
    IF ISNULL( oInstance )
        =__OOoReleaseCachedVars()
        oServiceManager = OOoGetServiceManager()
        oInstance = oServiceManager.createInstance( cServiceName )
    ENDIF

    RETURN oInstance
ENDFUNC


* Sugar coated routine to create any UNO struct.
* Use the Bridge_GetStruct() feature of the OLE-UNO bridge.
FUNCTION OOoCreateStruct( cTypeName )
    LOCAL oServiceManager
    oServiceManager = OOoGetServiceManager()
    
    LOCAL oStruct
    oStruct = .NULL.

    LOCAL cOldErrHandler
    cOldErrHandler = ON( "ERROR" )
    ON ERROR = DoNothing__ErrorHandler( ERROR(), MESSAGE(), LINENO(), SYS(16), PROGRAM(), SYS(2018) )
        oStruct = oServiceManager.Bridge_GetStruct( cTypeName )
    ON ERROR &cOldErrHandler
    
    IF ISNULL( oStruct )
        =__OOoReleaseCachedVars()
        oServiceManager = OOoGetServiceManager()
        oStruct = oServiceManager.Bridge_GetStruct( cTypeName )
    ENDIF

    RETURN oStruct
ENDFUNC


* Return the OpenOffice.org desktop object.
* Cache it in a global variable.
* Create it if not already cached.
FUNCTION OOoGetDesktop()
    IF (TYPE([goOOoDesktop])!="O")  OR  ISNULL( goOOoDesktop )
        PUBLIC goOOoDesktop
        goOOoDesktop = OOoServiceManager_CreateInstance( "com.sun.star.frame.Desktop" )
        COMARRAY( goOOoDesktop, 10 )
    ENDIF
    RETURN goOOoDesktop
ENDFUNC


*!*    * Return an instance of com.sun.star.reflection.CoreReflection.
*!*    * Cache it in a global variable.
*!*    * Create it if not already cached.
*!*    FUNCTION OOoGetCoreReflection()
*!*        IF (TYPE([goOOoCoreReflection])!="O")  OR  ISNULL( goOOoCoreReflection )
*!*            PUBLIC goOOoCoreReflection
*!*            goOOoCoreReflection = OOoServiceManager_CreateInstance( "com.sun.star.reflection.CoreReflection" )
*!*            COMARRAY( goOOoCoreReflection, 10 )
*!*        ENDIF
*!*        RETURN goOOoCoreReflection
*!*    ENDFUNC


*!*    * Create a UNO struct object and return it.
*!*    * This routine is now obsolete.
*!*    * See a superior implementation of this routine elsewhere
*!*    *  which uses the Bridge_GetStruct() feature of the OLE-UNO bridge.
*!*    FUNCTION OOoCreateStruct( cTypeName )
*!*        * Ask service manager for a CoreReflection object.
*!*        LOCAL oCoreReflection
*!*        oCoreReflection = OOoGetCoreReflection()
*!*        
*!*        * Get the IDL Class for the type name.
*!*        LOCAL oXIdlClass
*!*        oXIdlClass = .NULL.

*!*        LOCAL cOldErrHandler
*!*        cOldErrHandler = ON( "ERROR" )
*!*        ON ERROR = DoNothing__ErrorHandler( ERROR(), MESSAGE(), LINENO(), SYS(16), PROGRAM(), SYS(2018) )
*!*            oXIdlClass = oCoreReflection.forName( cTypeName )
*!*        ON ERROR &cOldErrHandler
*!*        
*!*        IF ISNULL( oXIdlClass )
*!*            =__OOoReleaseCachedVars()
*!*            oCoreReflection = OOoGetCoreReflection()
*!*            oXIdlClass = oCoreReflection.forName( cTypeName )
*!*        ENDIF
*!*        
*!*        * Create a variable to hold the created Struct.
*!*        * Assign it some initial value.
*!*        LOCAL oStruct
*!*        oStruct = CREATEOBJECT( "relation" ) && assign some kind of object initially

*!*        * Ask the class definition to create an instance.
*!*        oXIdlClass.CreateObject( @oStruct )
*!*        
*!*        RETURN oStruct
*!*    ENDFUNC


* Create a com.sun.star.beans.PropertyValue struct and return it.
FUNCTION OOoPropertyValue( cName, uValue, nHandle, nState )
    LOCAL oPropertyValue
    oPropertyValue = OOoCreateStruct( "com.sun.star.beans.PropertyValue" )
    
    oPropertyValue.Name = cName
    oPropertyValue.Value = uValue
    
    IF TYPE([nHandle])="N"
        oPropertyValue.Handle = nHandle
    ENDIF
    IF TYPE([nState])="N"
        oPropertyValue.State = nState
    ENDIF
    
    RETURN oPropertyValue
ENDFUNC



* Open or Create a document from it's URL.
* New documents are created by URL's such as:
*    private:factory/sdraw
*    private:factory/swriter
*    private:factory/scalc
*    private:factory/simpress
FUNCTION OOoOpenURL( cURL )
*    LOCAL oPropertyValue
*    oPropertyValue = OOoCreateStruct( "com.sun.star.beans.PropertyValue" )

*    LOCAL ARRAY aNoArgs[1]
*    aNoArgs[1] = oPropertyValue
*    aNoArgs[1].Name = "ReadOnly"
*    aNoArgs[1].Value = .F.

    * These two lines replace the alternate version above,
    *  which are left commented for the insight they provide.
    LOCAL ARRAY aNoArgs[1]
    aNoArgs[1] = OOoPropertyValue( "Hidden", .F. )
    
    LOCAL oDesktop
    oDesktop = OOoGetDesktop()

    LOCAL oDoc
    oDoc = oDesktop.LoadComponentFromUrl( cURL, "_blank", 0, @ aNoargs )
    
    * Make sure that arrays passed to this document are passed zero based.
    COMARRAY( oDoc, 10 )
    
    RETURN oDoc
ENDFUNC


PROCEDURE __OOoReleaseCachedVars()
    RELEASE goOOoServiceManager, goOOoDesktop, goOOoCoreReflection
ENDPROC



*############################################################


* Experimental stuff



*SET PROCEDURE TO LibOOo ADDITIVE
*oDoc = OOoOpenFile( GetDesktopFolderPathname() + "test.sxw" )


* This is an attempt to print a document.
PROCEDURE PrintExperiment( oDoc )
    LOCAL ARRAY aArgs[1]
    aArgs[1] = OOoPropertyValue( "CopyCount", 1, -1, 0 )
*    aArgs[1] = OOoPropertyValue( "Collate", .F. )
    
    oDoc.Print( @ aArgs )
ENDPROC


*############################################################


PROCEDURE TestOOoDraw()
    * Create a drawing.
    LOCAL oDoc
    oDoc = OOoCreateNewDrawDocument()
    
    * Get the first page of the drawing.
    LOCAL oPage
    oPage = OOoGetDrawPage( oDoc, 0 )
    
    LOCAL nHue, nSaturation, nBrightness
    LOCAL nRow, nCol
    LOCAL oShape

    * Now let's draw some rectangles.

    *-----
    *    Notes about HSV color notation.
    * Imagine hue is a "rainbow" of colors, from 0.0 to 1.0.
    * 0.0 is red, then you progress to orange, yellow, green, blue, purple, and
    *  then back to red again.  (Not like a real rainbow.)  1.0 is red also.
    * HSV colors are easy for HUMANS, while RGB colors are easy for COMPUTERS.
    * Quick, what is the RGB for Pink?  Brown?
    * In HSV, you would think Pink is a low-saturation red at full brightness,
    *  thus you could say H=0.0, S=0.5, B=1.0; and that's off the top of my head.
    * Brown is a low brightness Orange, so H=0.0888, S=1.0, B=0.6; right out of thin air.
    * Need a highly contrasting color?  Easy in HSV coordinates.
    * Just pick the opposite hue, maybe maximize saturation (opposite of other color),
    *  and maybe also a min or max brightness.  Can't easily come up with highly
    *  contrasting colors in RGB coordinates in RGB space.
    * Need to "soften" colors?  Take each HSV coordinate, and lower the saturation
    *  by 10 %.
    * Need to "darken" colors?  Lower the brightness of each pixel by 10 %.
    *-----
    
    * Let's vary the hue and saturation, while keeping the brightness constant.
    * But you could vary any two parameters, while keeping the third constant.
    
    nBrightness = 1.0 && full brightness
    FOR nRow = 0 TO 9
        FOR nCol = 0 TO 9
            * Create a shape
            oShape = OOoMakeRectangleShape( oDoc )
            * Calculate color
            nHue = nCol / 9 && hue varies *across* by column
            nSaturation = nRow / 9 && saturation varies *down* by row
            * set color of shape
            * oShape.FillColor = OOoRGB( 255, 255, 255 )
            oShape.FillColor = OOoHSV( nHue, nSaturation, nBrightness )
            * Position and size the shape
            OOoSetSize( oShape, 500, 500 ) && 1/2 cm by 1/2 cm
            OOoSetPosition( oShape, 1000 + nCol * 600, 1000 + nRow * 600 )
            * Add shape to page
            oPage.Add( oShape )
        ENDFOR
    ENDFOR


    * Let's vary the hue and saturation, while keeping the brightness constant.
    * This time, we'll use less-brightness
    * But you could vary any two parameters, while keeping the third constant.
    
    nBrightness = 0.7 && less brightness
    FOR nRow = 0 TO 9
        FOR nCol = 0 TO 9
            * Create a shape
            oShape = OOoMakeRectangleShape( oDoc )
            * Calculate color
            nHue = nCol / 9 && hue varies *across* by column
            nSaturation = nRow / 9 && saturation varies *down* by row
            * set color of shape
            oShape.FillColor = OOoHSV( nHue, nSaturation, nBrightness )
            * Position and size the shape
            OOoSetSize( oShape, 500, 500 ) && 1/2 cm by 1/2 cm
            OOoSetPosition( oShape, 9000 + nCol * 600, 1000 + nRow * 600 )
            * Add shape to page
            oPage.Add( oShape )
        ENDFOR
    ENDFOR


    * Let's vary the hue and brightness, while keeping the saturation constant.
    * But you could vary any two parameters, while keeping the third constant.
    
    nSaturation = 1.0 && full saturation
    FOR nRow = 0 TO 9
        FOR nCol = 0 TO 9
            * Create a shape
            oShape = OOoMakeRectangleShape( oDoc )
            * Calculate color
            nHue = nRow / 9 && hue varies *down* by row
            nBrightness = nCol / 9 && brightness varies *across* by column
            * set color of shape
            oShape.FillColor = OOoHSV( nHue, nSaturation, nBrightness )
            * Position and size the shape
            OOoSetSize( oShape, 500, 500 ) && 1/2 cm by 1/2 cm
            OOoSetPosition( oShape, 1000 + nCol * 600, 9000 + nRow * 600 )
            * Add shape to page
            oPage.Add( oShape )
        ENDFOR
    ENDFOR


    * Let's vary the saturation and brightness, while keeping the hue constant.
    * The hue will be yellow.
    * But you could vary any two parameters, while keeping the third constant.

    nHue = 0.1666 && yellow
    FOR nRow = 0 TO 9
        FOR nCol = 0 TO 9
            * Create a shape
            oShape = OOoMakeRectangleShape( oDoc )
            * Calculate color
            nSaturation = nRow / 9 && saturation varies *down* by row
            nBrightness = nCol / 9 && brightness varies *across* by column
            * set color of shape
            oShape.FillColor = OOoHSV( nHue, nSaturation, nBrightness )
            * Position and size the shape
            OOoSetSize( oShape, 500, 500 ) && 1/2 cm by 1/2 cm
            OOoSetPosition( oShape, 9000 + nCol * 600, 9000 + nRow * 600 )
            * Add shape to page
            oPage.Add( oShape )
        ENDFOR
    ENDFOR
    
    
    * Gee, you don't suppose someone out there could take the knowledge represented
    *  by this code and figure out how to make OpenOffice.org draw bar charts?
    
ENDPROC


PROCEDURE TestOOoCalc()
    * Create a spreadsheet.
    LOCAL oDoc
    oDoc = OOoCreateNewCalcDocument()
    
    * Get first sheet
    LOCAL oSheet
    oSheet = oDoc.getSheets().getByIndex( 0 )
    
    * Plug in some stuff...
    oSheet.getCellByPosition( 0, 0 ).setFormula( "Month" )
    oSheet.getCellByPosition( 1, 0 ).setFormula( "Sales" )
    oSheet.getCellByPosition( 0, 1 ).setFormula( "Jan" )
    oSheet.getCellByPosition( 0, 2 ).setFormula( "Feb" )
    oSheet.getCellByPosition( 0, 3 ).setFormula( "Mar" )
    oSheet.getCellByPosition( 0, 4 ).setFormula( "Apr" )
    oSheet.getCellByPosition( 0, 5 ).setFormula( "May" )
    oSheet.getCellByPosition( 0, 6 ).setFormula( "Jun" )
    oSheet.getCellByPosition( 1, 1 ).setValue( 3826 )
    oSheet.getCellByPosition( 1, 2 ).setValue( 3504 )
    oSheet.getCellByPosition( 1, 3 ).setValue( 2961 )
    oSheet.getCellByPosition( 1, 4 ).setValue( 2504 )
    oSheet.getCellByPosition( 1, 5 ).setValue( 2102 )
    oSheet.getCellByPosition( 1, 6 ).setValue( 1756 )
    
    LOCAL ARRAY aOneArg[1]
    LOCAL cFile, cURL
    
*    cFile = GetDesktopFolderPathname()+"example"
    cFile = "c:\example"

    * Now save the spreadsheet.
    cURL = OOoConvertToURL( cFile + ".sxw" )
    aOneArg[1] = OOoPropertyValue( "Overwrite", .T. )
    oDoc.storeToUrl( cURL, @ aOneArg )
    
    * Now save it as Excel
    cURL = OOoConvertToURL( cFile + ".xls" )
    aOneArg[1] = OOoPropertyValue( "FilterName", "MS Excel 97" )
    oDoc.storeToUrl( cURL, @ aOneArg )
ENDPROC




PROCEDURE CreateHueRainbow()
    * Create a drawing.
    LOCAL oDoc
    oDoc = OOoCreateNewDrawDocument()
    
    * Get the first page of the drawing.
    LOCAL oPage
    oPage = OOoGetDrawPage( oDoc, 0 )
    
    LOCAL nHue, nSaturation, nBrightness
    LOCAL nCol
    LOCAL oShape

    * Now let's draw some rectangles.

    * Let's vary the hue and saturation, while keeping the brightness constant.
    * But you could vary any two parameters, while keeping the third constant.
    
    nBrightness = 1.0 && full brightness
    nSaturation = 1.0 && full saturation
    FOR nCol = 0 TO 200
        * Create a shape
        oShape = OOoMakeRectangleShape( oDoc )
        * Calculate color
        nHue = nCol / 200 && hue varies *across* by column
        * set color of shape
        * oShape.FillColor = OOoRGB( 255, 255, 255 )
        oShape.FillColor = OOoHSV( nHue, nSaturation, nBrightness )
        * Position and size the shape
        OOoSetSize( oShape, 52, 2000 ) && 0.05 cm by 2 cm
        OOoSetPosition( oShape, 1000 + nCol * 50, 1000 )
        oShape.LineStyle = 0
        * Add shape to page
        oPage.Add( oShape )
    ENDFOR
    
    LOCAL cFile, cURL
*    cFile = GetDesktopFolderPathname()+"hue rainbow"
    cFile = "c:\hue rainbow"
    cURL = OOoConvertToURL( cFile + ".sxd" )
    LOCAL ARRAY aOneArg[1]
    aOneArg[1] = OOoPropertyValue( "Overwrite", .T. )
    oDoc.storeAsUrl( cURL, @ aOneArg )
*    oDoc.dispose()
ENDPROC





***    Here is a very similar Visual FoxPro - Open Office example that..... 
***    1. Creates an OOo Calc spreadsheet 
***    2. Puts some strings into it. 
***    3. Puts some numbers into it. 
***    4. Puts some dates into it (as formulas) 
***    5. Saves it in Calc format (as C:\Example.sxw) 
***    6. Saves it in Excel format (as C:\Example.xls) 
***    7. Closes the document -- but this line is commented to leave the spreadsheet open in OOo 

***    Code: 
VfpOOoCalcExample() 

PROCEDURE VfpOOoCalcExample() 
   * Create a spreadsheet. 
   LOCAL oDoc 
   
   oDoc = OOoOpenURL( "private:factory/scalc" ) 
    
   * Get first sheet 
   LOCAL oSheet 
   oSheet = oDoc.getSheets().getByIndex( 0 ) 
    
   *----- 
   * Put some sales figures onto the sheet. 
   oSheet.getCellByPosition( 0, 0 ).setString( "Month" ) 
   oSheet.getCellByPosition( 1, 0 ).setString( "Sales" ) 
   oSheet.getCellByPosition( 2, 0 ).setString( "End Date" ) 
    
   oSheet.getCellByPosition( 0, 1 ).setString( "Jan" ) 
   oSheet.getCellByPosition( 0, 2 ).setString( "Feb" ) 
   oSheet.getCellByPosition( 0, 3 ).setString( "Mar" ) 
   oSheet.getCellByPosition( 0, 4 ).setString( "Apr" ) 
   oSheet.getCellByPosition( 0, 5 ).setString( "May" ) 
   oSheet.getCellByPosition( 0, 6 ).setString( "Jun" ) 
   oSheet.getCellByPosition( 0, 7 ).setString( "Jul" ) 
   oSheet.getCellByPosition( 0, 8 ).setString( "Aug" ) 
   oSheet.getCellByPosition( 0, 9 ).setString( "Sep" ) 
   oSheet.getCellByPosition( 0, 10 ).setString( "Oct" ) 
   oSheet.getCellByPosition( 0, 11 ).setString( "Nov" ) 
   oSheet.getCellByPosition( 0, 12 ).setString( "Dec" ) 
    
   oSheet.getCellByPosition( 1, 1 ).setValue( 3826.37 ) 
   oSheet.getCellByPosition( 1, 2 ).setValue( 3504.21 ) 
   oSheet.getCellByPosition( 1, 3 ).setValue( 2961.45 ) 
   oSheet.getCellByPosition( 1, 4 ).setValue( 2504.12 ) 
   oSheet.getCellByPosition( 1, 5 ).setValue( 2713.98 ) 
   oSheet.getCellByPosition( 1, 6 ).setValue( 2448.17 ) 
   oSheet.getCellByPosition( 1, 7 ).setValue( 1802.13 ) 
   oSheet.getCellByPosition( 1, 8 ).setValue( 2203.22 ) 
   oSheet.getCellByPosition( 1, 9 ).setValue( 1502.54 ) 
   oSheet.getCellByPosition( 1, 10 ).setValue( 1207.68 ) 
   oSheet.getCellByPosition( 1, 11 ).setValue( 1819.71 ) 
   oSheet.getCellByPosition( 1, 12 ).setValue( 986.03 ) 
    
   oSheet.getCellByPosition( 2, 1 ).setFormula( "=DATE(2004;01;31)" ) 
   oSheet.getCellByPosition( 2, 2 ).setFormula( "=DATE(2004;02;29)" ) 
   oSheet.getCellByPosition( 2, 3 ).setFormula( "=DATE(2004;03;31)" ) 
   oSheet.getCellByPosition( 2, 4 ).setFormula( "=DATE(2004;04;30)" ) 
   oSheet.getCellByPosition( 2, 5 ).setFormula( "=DATE(2004;05;31)" ) 
   oSheet.getCellByPosition( 2, 6 ).setFormula( "=DATE(2004;06;30)" ) 
   oSheet.getCellByPosition( 2, 7 ).setFormula( "=DATE(2004;07;31)" ) 
   oSheet.getCellByPosition( 2, 8 ).setFormula( "=DATE(2004;08;31)" ) 
   oSheet.getCellByPosition( 2, 9 ).setFormula( "=DATE(2004;09;30)" ) 
   * Note that these last three dates are not set as DATE() function calls. 
   oSheet.getCellByPosition( 2, 10 ).setFormula( "10/31/2004" ) 
   oSheet.getCellByPosition( 2, 11 ).setFormula( "11/30/2004" ) 
   oSheet.getCellRangeByName( "C13" ).setFormula( "12/31/2004" ) 
   *----- 
    
   * Format the date cells as dates.    
   oFormats = oDoc.getNumberFormats() 
   oLocale = OOoCreateStruct( "com.sun.star.lang.Locale" ) 
   * com.sun.star.util.NumberFormat.DATE = 2 
   nDateKey = oFormats.getStandardFormat( 2, oLocale ) 
   oCell = oSheet.getCellRangeByName( "C2:C13" ) 
   oCell.NumberFormat = nDateKey 
    
   LOCAL ARRAY aOneArg[1] 
   LOCAL cFile, cURL 
    
*   cFile = GetDesktopFolderPathname()+"example" 
   cFile = "c:\example" 

   * Now save the spreadsheet. 
   cURL = OOoConvertToURL( cFile + ".sxw" ) 
   aOneArg[1] = OOoMakePropertyValue( "Overwrite", .T. ) 
   oDoc.storeToUrl( cURL, @ aOneArg ) 
    
   * Now save it as Excel 
   cURL = OOoConvertToURL( cFile + ".xls" ) 
   aOneArg[1] = OOoMakePropertyValue( "FilterName", "MS Excel 97" ) 
   oDoc.storeToUrl( cURL, @ aOneArg ) 
    
   * Close the document. 
*   oDoc.close( 1 ) && TRUE 
ENDPROC 





* Open or Create a document from it's URL. 
* New documents are created by URL's such as: 
*   private:factory/sdraw 
*   private:factory/swriter 
*   private:factory/scalc 
*   private:factory/simpress 
FUNCTION OOoOpenURL( cURL ) 
*   LOCAL oPropertyValue 
*   oPropertyValue = OOoCreateStruct( "com.sun.star.beans.PropertyValue" ) 

*   LOCAL ARRAY aNoArgs[1] 
*   aNoArgs[1] = oPropertyValue 
*   aNoArgs[1].Name = "ReadOnly" 
*   aNoArgs[1].Value = .F. 

   * These two lines replace the alternate version above, 
   *  which are left commented for the insight they provide. 
   LOCAL ARRAY aNoArgs[1] 
   aNoArgs[1] = OOoMakePropertyValue( "Hidden", .F. ) 
    
   LOCAL oDesktop 
   oDesktop = OOoGetDesktop() 

   LOCAL oDoc 
   oDoc = oDesktop.LoadComponentFromUrl( cURL, "_blank", 0, @ aNoargs ) 
    
   * Make sure that arrays passed to this document are passed zero based. 
   COMARRAY( oDoc, 10 ) 
    
   RETURN oDoc 
ENDFUNC 

* Create a com.sun.star.beans.PropertyValue struct and return it. 
FUNCTION OOoMakePropertyValue( cName, uValue, nHandle, nState ) 
   LOCAL oPropertyValue 
   oPropertyValue = OOoCreateStruct( "com.sun.star.beans.PropertyValue" ) 
    
   oPropertyValue.Name = cName 
   oPropertyValue.Value = uValue 
    
   IF TYPE([nHandle])="N" 
      oPropertyValue.Handle = nHandle 
   ENDIF 
   IF TYPE([nState])="N" 
      oPropertyValue.State = nState 
   ENDIF 
    
   RETURN oPropertyValue 
ENDFUNC 



* Sugar coated routine to create any UNO struct. 
* Use the Bridge_GetStruct() feature of the OLE-UNO bridge. 
FUNCTION OOoCreateStruct( cTypeName ) 
   LOCAL oServiceManager 
   oServiceManager = OOoGetServiceManager() 
    
   LOCAL oStruct 
   oStruct = .NULL. 

   LOCAL cOldErrHandler 
   cOldErrHandler = ON( "ERROR" ) 
   ON ERROR = DoNothing__ErrorHandler( ERROR(), MESSAGE(), LINENO(), SYS(16), PROGRAM(), SYS(2018) ) 
      oStruct = oServiceManager.Bridge_GetStruct( cTypeName ) 
   ON ERROR &cOldErrHandler 
    
   IF ISNULL( oStruct ) 
      =__OOoReleaseCachedVars() 
      oServiceManager = OOoGetServiceManager() 
      oStruct = oServiceManager.Bridge_GetStruct( cTypeName ) 
   ENDIF 

   RETURN oStruct 
ENDFUNC 


* Return the OpenOffice.org desktop object. 
* Cache it in a global variable. 
* Create it if not already cached. 
FUNCTION OOoGetDesktop() 
   IF (TYPE([goOOoDesktop])!="O")  OR  ISNULL( goOOoDesktop ) 
      PUBLIC goOOoDesktop 
      goOOoDesktop = OOoServiceManager_CreateInstance( "com.sun.star.frame.Desktop" ) 
      COMARRAY( goOOoDesktop, 10 ) 
   ENDIF 
   RETURN goOOoDesktop 
ENDFUNC 



* Return the OpenOffice.org service manager object. 
* Cache it in a global variable. 
* Create it if not already cached. 
FUNCTION OOoGetServiceManager() 
   IF (TYPE([goOOoServiceManager])!="O")  OR  ISNULL( goOOoServiceManager ) 
      PUBLIC goOOoServiceManager 
      goOOoServiceManager = CREATEOBJECT( "com.sun.star.ServiceManager" ) 
   ENDIF 
   RETURN goOOoServiceManager 
ENDFUNC 


* Sugar coated routine to ask the service manager to 
*  create you an instance of some other OpenOffice.org UNO object. 
FUNCTION OOoServiceManager_CreateInstance( cServiceName ) 
   LOCAL oServiceManager 
   oServiceManager = OOoGetServiceManager() 
    
   LOCAL oInstance 
   oInstance = .NULL. 

   LOCAL cOldErrHandler 
   cOldErrHandler = ON( "ERROR" ) 
   ON ERROR = DoNothing__ErrorHandler( ERROR(), MESSAGE(), LINENO(), SYS(16), PROGRAM(), SYS(2018) ) 
      oInstance = oServiceManager.createInstance( cServiceName ) 
   ON ERROR &cOldErrHandler 
    
   IF ISNULL( oInstance ) 
      =__OOoReleaseCachedVars() 
      oServiceManager = OOoGetServiceManager() 
      oInstance = oServiceManager.createInstance( cServiceName ) 
   ENDIF 

   RETURN oInstance 
ENDFUNC 


PROCEDURE DoNothing__ErrorHandler( pnError, pcErrMessage, pnLineNo, pcProgramFileSys16, pcProgram, pcErrorParamSys2018 ) 
ENDPROC 


PROCEDURE __OOoReleaseCachedVars() 
   RELEASE goOOoServiceManager, goOOoDesktop, goOOoCoreReflection 
ENDPROC 


* Convert a local filename to an OOo URL. 
FUNCTION OOoConvertToURL( cFilename ) 
   * Ensure leading slash. 
   IF LEFT( cFilename, 1 ) != "/" 
      cFileName = "/" + cFileName 
   ENDIF 
    
   LOCAL cURL 
   cURL = CHRTRAN( cFilename, "\", "/" )   && change backslashes to forward slashes. 
   cURL = "file://" + cURL 
   RETURN cURL 
ENDFUNC 





LOCAL loOfcMgr, loDesktop, loDocument, args(1), loCoreReflection,;
loPropertyValue,loText,loCursor, oDisp, oct1, oSourceframe
* Create the Service Manger and Desktop
loOfcMgr = CreateObject("com.sun.star.ServiceManager")
loDesktop = loOfcMgr.createInstance("com.sun.star.frame.Desktop")

** The args array is an array of "PropertyValue - objects - create by invoking OO.o reflection
loCoreReflection = loOfcMgr.createInstance("com.sun.star.reflection.CoreReflection" )
loPropertyValue = CREATEOBJECT("Empty")
loCoreReflection.forName("com.sun.star.beans.PropertyValue"). createobject(@loPropertyValue)
args[1] = loPropertyValue
args[1].name = "ReadOnly"
args[1].value = .F.
* Tell VFP to pass arrays to the loDesktop object as zero-based, by reference
COMARRAY(loDesktop,10)
* Open a new empty writer document
loDocument = loDesktop.loadComponentFromURL("private:factory/swriter","_blank", 0, @args)

** Insert sample Text
loText=loDocument.getText() && Create text object
* Create a cursor object (position pointer)
loCursor= loText.createTextCursor()
**
loCursor.CharHeight = 16
loCursor.CharWeight = 100
loText.insertString(loCursor, "my text", .F.) 




Document: OpenOffice Automation by Andreas Ahammer
Document: Programming OpenOffice with Visual Basic
Document: StarOffice Programmer's Tutorial

No comments:

Post a Comment