Page 1 of 1
Getting embedded objects in selection in OOo Basic
Posted: Mon Mar 03, 2008 1:47 pm
by lmari
Hello.
I am trying to write an OOo Basic macro enabling the automatic resize of the Math formulas embedded as objects in a Writer document. The behavior I would like to implement is:
1. if there is no selection, then operate on the whole document;
2. else operate only on the objects in the selection.
The logic to solve the problem 1 is:
Code: Select all
for i = 0 to ThisComponent.getEmbeddedObjects().count - 1
obj = objs(i).getEmbeddedObject()
if (not IsNull(obj)) and obj.supportsService("com.sun.star.formula.FormulaProperties") then
obj.BaseFontHeight = newFontSize ' set somehow
end if
next i
but I am not able to obtain the collection of the objects in the current selection, given the fact that, for example:
Code: Select all
objs_in_sel = doc.getCurrentSelection().getByIndex(0).getEmbeddedObjects()
does not work.
I would really appreciate an help.
Luca
Re: Getting embedded objects in selection in OOo Basic
Posted: Mon Mar 03, 2008 11:19 pm
by ms777
Hi,
try something along the following code ... note that only formulas anchored 'As Character' are detected
Good luck,
ms777
Code: Select all
Sub Main
oDoc = ThisComponent
oSel = oDoc.CurrentController.Selection
if oSel.supportsService("com.sun.star.text.TextEmbeddedObject") then
if oSel.EmbeddedObject.supportsService("com.sun.star.formula.FormulaProperties") then
msgbox "Formula"
exit sub
endif
endif
if oSel.supportsService("com.sun.star.text.TextRanges") then
oTR = oSel.getByIndex(0)
oEnum = oTR.createEnumeration( )
while oEnum.hasMoreElements()
oTR1 = oEnum.nextElement()
oEnum1 = oTR1.createEnumeration( )
while oEnum1.hasMoreElements()
oTR2 = oEnum1.nextElement()
if oTR2.TextPortionType = "Frame" then
oEnum2 = oTR2.createContentEnumeration("com.sun.star.text.TextEmbeddedObject")
while oEnum2.hasMoreElements()
oTR3 = oEnum2.nextElement()
if oTR3.EmbeddedObject.supportsService("com.sun.star.formula.FormulaProperties") then
msgbox "Formula"
endif
wend
endif
wend
wend
endif
End Sub
Re: Getting embedded objects in selection in OOo Basic
Posted: Fri Mar 07, 2008 4:15 pm
by lmari
Thank you so much.
Your solution is nice and it does work.
Now a further problem, then.
After having changed the formula size, I would like to redraw the formula itself.
I found on this forum the following solution:
Code: Select all
temp = oFormula.Formula ' some tricks to force OO.o redraw formulas
oFormula.Formula = ""
oFormula.Formula = temp
which is not really elegant but if it works...
The point is that this code generates an odd behavior (at least on my OO 2.3.1 on Linux): only formulas that have been pre-selected (i.e., a double click on them before running the macro) automatically redraw. For the others, the formula size is actually changed, but the redraw actually happens only as the result of a double click on them.
Any idea?
Luca
Re: Getting embedded objects in selection in OOo Basic
Posted: Fri Mar 07, 2008 10:14 pm
by ms777
lmari wrote:...but the redraw actually happens only as the result of a double click on them.
Any idea?
Luca
Hi,
try the following. It only works, if the formula is
not selected. Tested on OO 2.1 on XP
ms777
Code: Select all
Sub Main
oFormula = ThisComponent.EmbeddedObjects.getByIndex(0)
oFormula.EmbeddedObject.BaseFontHeight = oFormula.EmbeddedObject.BaseFontHeight *2
oClientSite = oFormula.ExtendedControlOverEmbeddedObject.ClientSite
oClientSite.activatingInplace()
oClientSite.deactivatedInplace()
End Sub
Re: Getting embedded objects in selection in OOo Basic
Posted: Sat Mar 08, 2008 2:42 am
by lmari
Thank you once more, but I need to redraw all the formulas whose size has been changed, and I am not able to merge the last solution you have proposed inside the code you suggested in your first post.
May you be so kind to show how to do it?
Luca
Re: Getting embedded objects in selection in OOo Basic
Posted: Fri Nov 22, 2013 11:18 pm
by 72julien350
I search to do the same thing (modify the height of formulas in selections)
After several hours, i don't succeed.
Imari, can you put your macro in this forum please.
Thank you very very very much.
Re: Getting embedded objects in selection in OOo Basic
Posted: Fri Jan 10, 2014 6:34 pm
by 72julien350
Hello,
Finaly i succeed with help of C. Develland with his macro Cmath
http://cdeval.free.fr/
Code: Select all
Sub FormatFormuleNormal
oDoc = ThisComponent
oSel = oDoc.CurrentController.Selection
'taille = InputBox("taille ?","Taille",11)
'a=oSel.supportsService("com.sun.star.text.TextEmbeddedObject")
'Print(a)
if oSel.supportsService("com.sun.star.text.TextEmbeddedObject") then
' embeddedObjects =ThisComponent.getEmbeddedObjects()
' elementNames = embeddedObjects.getElementNames()
'
' for i=0 to UBOUND(elementNames) ' pour tous les objets du document
' element = embeddedObjects.getByName(elementNames(i)).Model
'
' if element.supportsService("com.sun.star.formula.FormulaProperties") then
' element.BaseFontHeight = taille ' Taille de base
'
' endif ' fin si formule
' next i ' fin boucle pour tous les objets
' ThisComponent.reformat()
Else ' jusque la ca marche
oLaFormule=oSel.getbyIndex(0)
sMonEnum=oLaFormule.getAvailableServiceNames
oLesObjets=oLaFormule.createContentEnumeration(sMonEnum(0))
while oLesObjets.HasMoreElements
oLaFormule=oLesObjets.NextElement
if oLaFormule.supportsService("com.sun.star.text.TextEmbeddedObject") then
' oLaFormule.model.BaseFontHeight = taille
oLaFormule.model.BaseFontHeight = 13 ' Taille de base
oLaFormule.model.FontNameVariables= "Linux Libertine G" ' Police des variables
oLaFormule.model.FontNameFunctions = "Linux Libertine G" ' Police des fonctions
oLaFormule.model.FontNameNumbers= "Linux Libertine G" ' Police des nombres
oLaFormule.model.FontNameText= "Linux Libertine G" ' Police du texte
oLaFormule.model.CustomFontNameSerif= "Linux Libertine G" ' Police serif
oLaFormule.model.CustomFontNameSans= "Linux Libertine G" ' Police sans
oLaFormule.model.CustomFontNameFixed= "Linux Libertine G" ' Police fixe
endif
oLaFormule.ExtendedControlOverEmbeddedObject.update()
wend
endif
ThisComponent.reformat()
End Sub