Page 1 of 1

Getting embedded objects in selection in OOo Basic

PostPosted: 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   Expand viewCollapse view
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   Expand viewCollapse view
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

PostPosted: 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   Expand viewCollapse view
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

PostPosted: 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   Expand viewCollapse view
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

PostPosted: 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   Expand viewCollapse view
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

PostPosted: 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

PostPosted: 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

PostPosted: 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   Expand viewCollapse view
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