Hi Thibault,

On Tuesday 08 June 2010, Thibault Vataire wrote:
> It seems that the embedded object have to be edited before to access
> its controller.  But the only way I've found to do this, is to
> temporarily sets it visible, then hidden again.
> 
> Here is what I found :

thank you.  I already played around with changeState() but came across
the same limitation.  With this trick using containerWindow.setVisible()
it is at least possible to open the file hidden for most of the time.

Although its still too much "window-flickering" when batch processing
several files in the background...


Regards,
Denis


> 
> 
> REM  *****  BASIC  *****
> 
> option explicit
> 
> sub main()
> 
>       dim component as object
>       
> '     '== when the document is visisble ==
> '     'if the embedded object is edited : thisComponent = embedded object => 
> gets the top component
> '     component = getTopParent(thisComponent)
> '     _proccessEmbeddedObject(component)
> 
>       '== when the document isn't visisble ==
>       dim currentController as object
>       dim containerWindow as object
>       dim args(0) as new com.sun.star.beans.PropertyValue
> 
>       args(0).name = "Hidden"
>       args(0).value = true
>       component = 
> starDesktop.loadComponentFromUrl("file:///home/tvataire/Bureau/testEmbed.odt",
>  "_blank", _
>                                                                               
>                  com.sun.star.frame.FrameSearchFlag.CREATE, args)
>       on local error goto finally
>       'do something ...
>       'the document must be displayed to allow to change the active sheet of 
> the embedded object
>       currentController = component.currentController
>       if (not isNull(currentController)) then
>               containerWindow = currentController.frame.containerWindow
>               containerWindow.setVisible(true)
>               _proccessEmbeddedObject(component)
>               containerWindow.setVisible(false)
>       end if
>       'do something else...
>       component.store()
>       finally:
>               component.dispose()
> 
> end sub
> 
> 'returns the top parent if it exists (i.e. when "aChild" is an embedded 
> object currently edited). otherwise, returns "aChild"
> function getTopParent(aChild as object) as object
> 
>       dim result as object
>       dim parent as object
> 
>       if (hasUnoInterfaces(aChild, "com.sun.star.container.XChild")) then
>               parent = aChild.parent
>               if (isNull(parent)) then
>                       result = aChild
>               else
>                       result = getTopParent(parent)
>               end if
>       end if
> 
>       getTopParent = result
> 
> end function
> 
> sub _proccessEmbeddedObject(component as object)
> 
>       dim success as boolean
>       dim anEmbeddedObject as object
>       dim xModel as object
>       dim embeddedObjController as object
> 
>       'looks for the requested embedded object
>       anEmbeddedObject = getEmbeddedObjectByName(component, "Objet1")
>       'and changes its state if needed
>       success = editEmbeddedObject(anEmbeddedObject, true)
>       if (success) then
>               xModel = anEmbeddedObject.getEmbeddedObject()
>               if (hasUnoInterfaces(xModel, "com.sun.star.frame.XModel")) then
>                       embeddedObjController = xModel.currentController
>                       if (hasUnoInterfaces(embeddedObjController, 
> "com.sun.star.sheet.XSpreadsheetView")) then
>                               
> embeddedObjController.setActiveSheet(embeddedObjController.model.sheets.getByIndex(0))
>                       end if
>               end if
>               editEmbeddedObject(anEmbeddedObject, false)
>       end if
> 
> end sub
> 
> 'returns the embedded object named "anObjectName" if it exits, null otherwise
> function getEmbeddedObjectByName(XTextEmbeddedObjectsSupplier as object, 
> anObjectName as string)
> 
>       dim result as object
>       dim embeddedObjects as object
>       
>       if (hasUnoInterfaces(XTextEmbeddedObjectsSupplier, 
> "com.sun.star.text.XTextEmbeddedObjectsSupplier")) then
>               embeddedObjects = 
> XTextEmbeddedObjectsSupplier.getEmbeddedObjects()
>               if (embeddedObjects.hasByName(anObjectName)) then
>                       result = embeddedObjects.getByName(anObjectName)
>               end if
>       end if
>       
>       getEmbeddedObjectByName = result
> 
> end function
> 
> 'edits an embedded object if "bEdit" is true; otherwise quits this state
> 'returns true if succeed, false otherwise
> function editEmbeddedObject(xEmbeddedObjectSupplier2 as object, bEdit as 
> boolean) as boolean
> 
>       dim requestedState as long
>       dim success as boolean
>       dim xEmbeddedObject as object
> 
>       requestedState = com.sun.star.embed.EmbedStates.RUNNING
>       if (bEdit) then
>               requestedState = com.sun.star.embed.EmbedStates.UI_ACTIVE
>       end if
>       success = hasUnoInterfaces(xEmbeddedObjectSupplier2, 
> "com.sun.star.document.XEmbeddedObjectSupplier2")
>       if (success) then
>               xEmbeddedObject = 
> xEmbeddedObjectSupplier2.getExtendedControlOverEmbeddedObject()
>               success = (xEmbeddedObject.getCurrentState() = requestedState)
>               if (not success) then
>                       success = changeEmbeddedObjectState(xEmbeddedObject, 
> requestedState)
>               end if
>       end if
> 
>       editEmbeddedObject = success
> 
> end function
> 
> 'modifies the current state of an embedded object
> 'returns true if succeed, false otherwise
> function changeEmbeddedObjectState(xEmbeddedObject as object, expectedState 
> as long) as boolean
> 
>       dim success as boolean
> 
>       success = supportsEmbedState(xEmbeddedObject, expectedState)
>       if (success) then
>               on local error goto errChangeState
>               xEmbeddedObject.changeState(expectedState)
>               goto noErr
>               errChangeState:
>                       success = false
>               noErr:
>       end if
> 
>       changeEmbeddedObjectState = success
> 
> end function
> 
> 'returns true if the embedded object supports the state "expectedState", 
> false otherwise
> function supportsEmbedState(xEmbeddedObject as object, expectedState as long) 
> as boolean
> 
>       dim continue as boolean
>       dim reachableStates() as long
>       dim stateIndex as long
> 
>       continue = hasUnoInterfaces(xEmbeddedObject, 
> "com.sun.star.embed.XEmbeddedObject")
>       if (continue) then
>               reachableStates = xEmbeddedObject.reachableStates
>               stateIndex = lbound(reachableStates)
>               while ((stateIndex <= ubound(reachableStates)) and continue)
>                       continue = (reachableStates(stateIndex) <> 
> expectedState)
>                       stateIndex = stateIndex + 1
>               wend
>       end if
> 
>       supportsEmbedState = (not continue)
> 
> end function
> 
> Regards,
> Thibault Vataire
> 
> ----- Mail Original -----
> De: "denis" <des...@gmail.com>
> À: dev@api.openoffice.org
> Envoyé: Lundi 7 Juin 2010 15:24:39
> Objet: [api-dev] SpreadsheetView of embedded spreadsheet document
> 
> Hi,
> 
> I have a writer document with an embedded spreadsheet document inside.
> 
> Now I would like to set the active (i.e. visible) sheet of that
> spreadsheet document.
> 
> The question is, how do I get the SpreadsheetView when there's no
> controller available?
> 
>     ThisComponent.getEmbeddedObjects().getByName ("Objekt1") _
>     .getEmbeddedObject().getCurrentController()
> 
>     ' ==> NULL
> 
> 
> Is this possible at all if the writer document was opened hidden?
> 
> Thanks,
> Denis
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@api.openoffice.org
> For additional commands, e-mail: dev-h...@api.openoffice.org
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@api.openoffice.org
> For additional commands, e-mail: dev-h...@api.openoffice.org
> 
> 





---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@api.openoffice.org
For additional commands, e-mail: dev-h...@api.openoffice.org

Reply via email to