Viser opslag med etiketten tekst. Vis alle opslag
Viser opslag med etiketten tekst. Vis alle opslag

torsdag den 10. november 2016

Undersøge markeret tekst i Writer (med makro)


Vi kan med en makro aflæse hvad der er markeret i et tekstdokument.

Problemet er at vi ikke på forhånd kan vide om der overhovedet er markeret noget, og om markeringen dækker et enkelt eller flere områder. Flere markerede områder er hvis du holder CTRL-tasten nede mens du markerer flere områder.

Vi kommer til at anvende to centrale begreber: Selection og Cursor
Selection er en liste med alle markerede områder:

oSelections = ThisComponent.getCurrentSelection()

Resultatet kan f.eks. vises sådan:

Print oSelections.getCount

For at udlede noget af det markerede, må vi håndtere hver enkelt markeret område et ad gangen. Her aflæser vi helt konkret hvad der står i hver enkelt markering:

Sub Main
oSelections = ThisComponent.getCurrentSelection()
For i = 0 To oSelections.getCount() - 1
oSel = oSelections.getByIndex(i)
Print oSel.String
Next
End Sub

Der findes to typer cursor i LibreOffice makroer:
  • ViewCursor ved, hvordan dataene vises, men ikke noget om data. 
  • TextCursor (non-view cursor), ved en masse om data, men meget lidt om, hvordan de vises. 
For eksempel kender ViewCursor ikke hvilke ord der er markeret, og TextCursor kender intet til linjer, skærme, eller sider.

Vi skal bruge en TextCursor ud fra hver enkelt af vores markeringer:

oCursor = oDoc.Text.CreateTextCursorByRange(oSel)

Nu kan vi kontrollere om noget er markeret, hvilket lyder enkelt, men tro om igen. Hvis antallet er markeringer er 0, så er intet markeret. Men der er altid en markør i dokumentet, så antallet af markeringer er aldrig 0. Principielt kan vi komme ud for at der ingen markering er, hvis LibreOffice afvikles på en server, uden brugergrænsefladen vises.

Hvis længden af markeringen er 0, er intet markeret. Længden skal måles på hver enkelt markering, hvilket er lidt farligt. Det er fordi en tekststreng ikke kan/må være længere end 64k, så brug ikke den metode. Du risikerer at LibreOffice crasher.

Den bedste måde er at skabe en tekstcursor fra den aktuelle markering, og så undersøge om start og slutpunktet er det samme. Kontrol af om der er noget markeret er altså relativt kompliceret men dog muligt. Vi kan lave denne funktion til formålet:

Function IsAnythingSelected(oDoc As Object) As Boolean
Dim oSelections 'Contains all of the selections
Dim oSel 'Contains one specific selection
Dim oCursor 'Text cursor to check for a collapsed range
REM Assume nothing is selected
IsAnythingSelected = False
If IsNull(oDoc) Then Exit Function
' The current selection in the current controller.
'If there is no current controller, it returns NULL.
oSelections = oDoc.getCurrentSelection()
If IsNull(oSelections) Then Exit Function
If oSelections.getCount() = 0 Then Exit Function
If oSelections.getCount() > 1 Then
REM There is more than one selection so return True
IsAnythingSelected = True
Else
REM There is only one selection so obtain the first selection
oSel = oSelections.getByIndex(0)
REM Create a text cursor that covers the range and then see if it is
REM collapsed.
oCursor = oDoc.Text.CreateTextCursorByRange(oSel)
If Not oCursor.IsCollapsed() Then IsAnythingSelected = True

REM You can also compare these to see if the selection starts and ends at
REM the same location.
REM If oDoc.Text.compareRegionStarts(oSel.getStart(),_
REM oSel.getEnd()) <> 0 Then
REM IsAnythingSelected = True
REM End If
End If
End Function

Funktionen IsAnythingSelected er fra bogen OpenOffice.org Macros Explained af Andrew D. Pitonyak.

tirsdag den 18. oktober 2016

Sjældent brugt: Lad tekst følge en streg

Lidt ovre i DTP-afdelingen har jeg eksperimenteret lidt med at lave sjove og dekorative skrifteffekter. Fontwork-galleriet giver en række gode standardløsninger, men du har faktisk mulighed for at skrive tekst, som flyder langs en frihåndstegnet streg eller en bue.

Første trin er at tegne en streg ved hjælp af en af funktionerne Streg, Fihåndslinje, Kurve eller Polygon. Jeg vælger i dette tilfælde at tegne en simpel kurve med Kurveværktøjet.

Nu dobbeltklikker jeg på kurven og tilføjer en tekst: ”LibreOffice nyhedsbrev”. Resultatet er at teksten vises skråt (lidt tilfældigt) inde i kurven.

Marker nu kurven og vælg fra menuen Formater – Tekstboks og figur – Fontwork, hvorefter du ser en flydende dialogboks, med navnet Fontwork. Dialogen er kun synlig, når din figur er markeret.


I dialogens øverste linje kan du vælge hvordan teksten skal følge stregen.
  • Vælg f.eks. ikon nr. 2 fra venstre, som hedder ”Rotèr”.
  • Vælg nu på anden ikonlinje det sidste (længst til højre) ikon ”Automatisk tekststørrelse”.
  • På den nederste ikonlinje, klik på det første ikon ”Kontur” for at fravælge dette. Linje du tegnede er nu skjult.
  • Fortsæt selv med eksperimenter, f.eks. ændre skriftfarve og tilføje tekstkontur eller slagskygge.


Det er også muligt at benytte figurer som udgangspunkt for Fontwork, men det kræver lidt ekstra arbejde. Vi skal f.eks. bruge Draw i stedet for Writer.
Første udfordring for os er at værktøjet Fontwork (Fontwork-dialogen) ikke er aktiv i Draw, hvilket vi kan reparere selv. Vi skal ind i Funktioner - Tilpas og tilføje Fontwork enten til en menu eller en værktøjslinje. Du finder Fontwork i kategorien Formater. Jeg har tilføjet Fontwork til menuen Formater.
  1. Opret nu en figur, f.eks. en cirkel eller lignende.
  2. Højreklik på cirklen og vælg Konverter - Til kurve.
  3. Dobbeltklik og skriv den tekst du ønsker at få vist
  4. Marker objektet og aktiver Fontwork-dialogen (som du placerede i en menu eller på en værktøjslinje tidligere.
  5. Vær kreativ!

Når du er færdig kan du klippe-klistre resultatet til et Writer-dokument, eller du kan tilføje resultatet til Galleriet.