Do makra jsem tedy přidal uno příkaz na zmáčknutí Escapu který odznačí případný výběr. Když nic nebude označeno tak stisk Esc nic nedělá, tudíž to není nijak podmínkováno.
Libre má tendence změnit poněkud velikost vloženého obrázku, takže poslední řádek nastaví původní velikost, byť tedy za cenu překreslení již vloženého obrázku.
Ukázka s jednotlivými polohami obrázku v řádku zde https://uloz.to/file/ipMpW8y0oHvi/libre … o-znak-pdf
Sub vlozObr2 'vloží obrázek na pozici viditelného kurzoru s přednastaveným ukotvením a svislým zarovnáním
dim oDoc, fSoub, sUrl, oVCur, oPos, oImg, oSel, oCur, document, dispatcher
oDoc=thisComponent
document=oDoc.CurrentController.Frame : dispatcher=createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:Escape", "", 0, array()) 'je-li něco označeno tak odznačit
oVCur=oDoc.CurrentController.getViewCursor() 'viditelný kurzor(po odznačení je na konci bývalého výběru)
oPos=oVCur.getStart() 'pozice viditelného kurzoru
rem výběr souboru
fSoub=CreateUnoService("com.sun.star.ui.dialogs.FilePicker") 'služba pro otevírací dialog souboru
if fSoub.execute()=1 then 'je-li vybrán soubor
sUrl=fSoub.files(0) 'cesta k vybranému souboru
else 'nebyl vybrán soubor
msgbox("Nebyl vybrán žádný obrázek",48,"Chybný výběr obrázku")
exit sub
end if
fSoub.dispose() 'uvolnit otevírací službu
rem vložení obrázku
oImg=oDoc.createInstance("com.sun.star.text.TextGraphicObject") 'objekt obrázku
oImg.graphicUrl=sUrl 'url
oImg.AnchorType=1 'UKOTVIT JAKO ZNAK =com.sun.star.text.TextContentAnchorType.AS_CHARACTER
oImg.VertOrient=5 'SVISLE NA STŘED ZNAKU =com.sun.star.text.VertOrientation.CHAR_CENTER
oImg.attach(oPos) 'vložit obrázek na pozici
oImg.Size=oImg.ActualSize 'nastavit původní velikost obrázku (nelakat se když obrázek problikne)
End Sub
Detekce toho je-li před vložením obrázku něco vybráno vůbec není snadná. Když je vybrán text tak objekt výběru je jiný než když je vybrána třeba tabulka nebo křivky nebo obrázek atd. Další makro je na to otipování co že je případně vlastně vybráno, ale musí se u výběru testovat buď rozhraní (hasUnoInterfaces) nebo služba (supportsService).
Třeba v Pitonyakově bibli (a nejen tam) je pro testování označenosti použita primárně vlastnost oSel.Count, jenže ta v případě označeného obrázku neexistuje, což pak hází chyby, tudíž přes ty rozhraní a služby je to lepší, byť jich na testování bude nejspíš mnohem víc.
Je to spíše takový pokus, při vybraném obrázku to nabídne jeho zvětšení, to už bylo v ukázce na En fóru :-) https://ask.libreoffice.org/en/question … selection/
Sub jeNecoVybrano 'zkusí trefit a vypsat co že je vybráno
Rem převážně z https://ask.libreoffice.org/en/question/144907/libreoffice-basic-iterate-through-all-images-in-a-selection/
Dim oDoc, oSel, s$, IsSelectionEmpty As Boolean
oDoc=ThisComponent
oSel=oDoc.currentController.getSelection() 'aktuální výběr
Rem co je vybráno
IsSelectionEmpty = False
If (IsNull(oSel)) Then 'objekt oSel je null
IsSelectionEmpty = True
Rem obsahuje-li výběr rozhraní
ElseIf (HasUnoInterfaces(oSel, "com.sun.star.drawing.XShape")) Then
s="Obrázek, nebo snad něco z Drawu? Nebo něco dalšího?" 'nefachá zrovna moc přesně, zahrne i tabulku Calcu vloženou jako Sešit LibreOffice 6.2
Rem obsahuje-li výběr službu
If oSel.supportsService( "com.sun.star.text.TextGraphicObject" ) Then 'vybrán obrázek
if msgbox("Jde o obrázek, zvětšit ho 2x?",4)=6 then
Rem třeba zvětšit rozměry obrázku
Dim aNewSize As New com.sun.star.awt.Size
aNewSize.Width = oSel.Size.Width * 2
aNewSize.Height = oSel.Size.Height * 2
oSel.setSize( aNewSize)
end if
exit sub
End If
ElseIf (HasUnoInterfaces(oSel, "com.sun.star.sheet.XSheetCellRange")) Then
s="SheetCellRange - nevím na co je"
ElseIf (HasUnoInterfaces(oSel, "com.sun.star.text.XTextTableCursor")) Then
s="Tabulka ve Writeru nebo některé její buňky"
ElseIf (oSel.Count = 0) Then
IsSelectionEmpty = True
Rem obsahuje-li výběr službu
ElseIf ((oSel.Count = 1) AND oSel.supportsService("com.sun.star.text.TextRanges")) Then
With oSel(0)
If (.text.compareRegionStarts(.getStart, .getEnd)=0) Then
IsSelectionEmpty = True
Else
s="Vybrán text"
End If
End With
End If
MsgBox IIf(IsSelectionEmpty = True,"NIC NEVYBRÁNO",IIf(s<>"",s,"Vybráno NĚCO JINÉHO než na co byly podmínky")
End Sub
Editoval kamlan (7. 2. 2020 18:54:44)