API et presse papier

Bonjour à tous,

La macro ci-dessous tirée de l'enregistreur :
/Sub ClipboardPasteSpecial( oDocumentFrame )//
// dim args1(0) as new com.sun.star.beans.PropertyValue//
// args1(0).Name = "SelectedFormat"//
// args1(0).Value = 3//
// DocumentDispatch( oDocumentFrame,".uno:ClipboardFormatItems", "", 0, args1() )//
//End Sub//
/permet de coller par "collage spécial" le meta fichier GDI d'une formule math, en clair je récupère une image.
Le problème c'est que l'image collée est ancrée au paragraphe et je n'arrive pas à trouver comment faire pour que l'image soit directement collée à un Text Range particulier et ancrée au caractère.
J'ai une solution de contournement mais peu élégante.

Avec l'API on peut coller :

/sub pasteClipboardContent()
  dim controller as object
  controller = thisComponent.currentController
  if (not isNull(controller)) then
    controller.insertTransferable(createUnoService("com.sun.star.datatransfer.clipboard.SystemClipboard").contents)
  end if
end sub/

Mais là encore je ne vois pas comment paramétrer pour coller le meta fichier GDI.

Si vous avez une idée ...

Merci d'avance.

Bonjour

Une première proposition, un peu bricolage, mais bon... elle pourra
éventuellement inspirer des idées meilleures.

Je ne suis d'ailleurs pas sûr d'avoir bien compris le contexte.
Ce que fait la macro ci-dessous :

1. on suppose que le presse-papiers contient un objet formule
2. la macro insère au point d'insertion un cadre
- ancré comme caractère
- taille automatique (mais réduite au départ)
- sans bordures
3. Positionnement dans le cadre
4. Collage spécial GDI

sub PysFormuleGDI

dim document as object
dim dispatcher as object
dim args1(4) as new com.sun.star.beans.PropertyValue
dim args2(0) as new com.sun.star.beans.PropertyValue
dim LibONoLine as new com.sun.star.table.BorderLine2

with LibONoLine
        .Color = 0
        .InnerLineWidth = 0
        .LineDistance = 0
        .LineStyle = 0
        .LineWidth = 0
        .OuterLineWidth = 0
end with

document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

args1(0).Name = "AnchorType"
args1(0).Value = 1
args1(1).Name = "Pos.X"
args1(1).Value = 0
args1(2).Name = "Pos.Y"
args1(2).Value = 0
args1(3).Name = "Size.Width"
args1(3).Value = 340
args1(4).Name = "Size.Height"
args1(4).Value = 340

dispatcher.executeDispatch(document, ".uno:InsertFrame", "", 0, args1())

with thiscomponent.currentselection
  .FrameIsAutomaticHeight = true
  .WidthType = com.sun.star.text.SizeType.MIN ' 2
  .VertOrient = com.sun.star.text.VertOrientation.CHAR_CENTER '5
  .string = " "
    .LeftBorder = LibONoLine
    .LeftBorderDistance = 0
    .RightBorder = LibONoLine
    .RightBorderDistance = 0
    .TopBorder = LibONoLine
    .TopBorderDistance = 0
    .BottomBorder = LibONoLine
    .BottomBorderDistance = 0
end with

LibOText = thiscomponent.currentselection.Text
LibOCursor = LibOText.createTextCursor
LibOCursor.gotoEnd(true)

' Ci-dessous pour désactiver la sélection et entrer dans le cadre
dispatcher.executeDispatch(document, ".uno:Undo", "", 0, Array())

args2(0).Name = "SelectedFormat"
args2(0).Value = 3

dispatcher.executeDispatch(document, ".uno:ClipboardFormatItems", "", 0,
args2())

end sub

Cordialement
Pierre-Yves

Bonjour,

Merci à Laurent et à Pierre-Yves pour leur réponse.

1) J'ai lu attentivement les pages du lien de Laurent. Je dois avouer que je n'ai pas compris grand chose ... :cry:

2) La solution proposée par Pierre-Yves a l'inconvénient d'insérer une frame : cela donne un résultat peu esthétique. :-[

3) Je suis arrivé à une solution pas très satisfaisante d'un point de vue intellectuel mais qui fonctionne.

Le scénario :

a) J'ouvre un document draw invisible,
b) Pour chaque formule du document Writer en utilisant en grande partie le dispatcher :
- je la copie,
- je la supprime
- je colle le metafichier GDI dans le document Draw,
- je crée une image vide dans le document Writer,
- j'insère cette image à l'emplacement de la formule avec l'instruction insertTextContent
- je copie dans cette image l'objet Graphic de l'image provisoire (collée dans le Draw document),
- je supprime l'image provisoire du Draw document.
c) Je ferme le fichier Draw.

Je peux fournir mon code source si demande ...

Bonne journée.