Colorare a righe alterne in OpenOffice Writer
Ma si può colorare a righe alternate un testo in OpenOffice Writer? Qui l’utilità è minore, e infatti non ho trovato nessuna pagina che ne parli nel dettaglio. Bisogna scrivere una macro, e quindi è roba per programmatori specializzati. Ho provato a capire se si può ottenere quell’effetto in poche semplici istruzioni.
Praticamente per selezionare un testo abbiamo bisogno di prendere il controllo del cursore. Questo possiamo farlo scrivendo tra le prime righe della macro le seguenti istruzioni:
cursore=thisComponent.currentcontroller.getviewcursor()
cursore.gotostart(false)
In tal modo abbiamo preso il controllo del cursore visibile nella pagina e l’abbiamo portato all’inizio del documento.
Il parametro false significa che mentre si sposta non deve selezionare nulla. True invece significherebbe che deve selezionare. Per spostarsi alla fine della riga esiste una funzione apposita del cursore che si chiama goToEndOfLine (per convenzione si usano le maiuscole per l’inizio delle parole, ma il linguaggio non è case-sensitive quindi scrivendola tutta minuscola funziona lo stesso).
Quindi si può impostare un ciclo con un indice che viene incrementato di uno ad ogni passaggio. Se è un numero pari allora coloriamo le righe in un modo, altrimenti le lasciamo del colore che sono (o le coloriamo in un altro modo).
Per vedere se un numero è pari c’è l’operatore mod, che calcola il resto della divisione di due numeri che vanno disposti uno alla sua destra e uno alla sua sinistra.
Scrivendo
if indice mod 2=1
then
stiamo verificando se l’indice indice diviso per due dà come resto 1 (cioè è dispari).
Come si fa per colorare una selezione? Nessuno lo spiega. Ho registrato una macro in automatico mentre evidenziavo un testo e il risultato è stato più o meno questo:
document =
ThisComponent.CurrentController.Frame
dispatcher =
createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new
com.sun.star.beans.PropertyValue
args1(0).Name =
"BackColor"
args1(0).Value = 16776960
Per cui è stato creato un dispatcher e sono state creati due argomenti da passargli: il nome della proprietà che vogliamo cambiare (il colore di sfondo backcolor) e il suo valore (16776960, che in questo caso è il colore giallo 255,255,0).
Per colorare una selezione di giallo quindi bisogna eseguire il dispaccio con l’apposita istruzione, cioè:
dispatcher.executeDispatch(document,
".uno:BackColor", "", 0, args1())
Questa la vado a inserire all’interno del ciclo.
Ricapitolando:
prima definisco il
cursore e lo sposto all’inizio del documento;
poi definisco il
dispatcher e gli argomenti che gli devo passare;
infine eseguo il
ciclo.
Nel mio caso il ciclo che ho eseguito è questo (per le prime 20 righe del documento):
for i=1 to 100
if i mod 2=1 then
cursore.gotoendofline(false)
else
cursore.gotoendofline(true)
dispatcher.executeDispatch(document,
".uno:BackColor", "", 0, args1())
endif
next i
Tradotto: per le prime 20 righe del documento, se la riga è dispari, allora vai alla fine della riga senza selezionarla (il false che si vede tra parentesi); altrimenti, vai alla fine della riga selezionandola dall’inizio (true), ed evidenzia il testo come come specificato negli args1 definiti in precedenza.
Eseguendo questa macro verranno evidenziate in giallo le righe pari dalla seconda alla ventesima.
Ovviamente questa macro può essere adattata a qualsiasi esigenza. Poniamo che non vogliamo evidenziare il testo, ma cambiare il colore del testo in maniera tale da avere alcune righe scritte in un colore e altre scritte in un altro colore, l’unica cosa che dobbiamo cambiare nell’intero programma è il valore del primo args1 e del parametro che viene passato al dispatcher. Invece che BackColor bisogna scrivere FontColor.
Per quanto riguarda il colore, il numero è dato dal valore del rosso moltiplicato per 256 al quadrato più il valore del verde moltiplicato per 256 più il valore del blu (ogni colore viene misurato da 0 a 255). Non necessariamente bisogna eseguire i calcoli a parte. L’interprete esegue i calcoli per conto proprio, quindi per colorare in blu basta scrivere:
args1(0).Value =
0*256^2 + 0*256 + 250
Che corrisponde da (0,0,250). (Per variare la quantità di rosso e verde basta scrivere gli opportuni valori al posto degli zeri che si vedono nell’esempio).
Il testo che abbiamo evidenziato o colorato non rimane minimamente ancorato alla riga su cui si trova. Nel senso che se aggiungiamo qualche parola all’inizio del documento si sbalza tutto il resto del paragrafo: ogni parola rimane dello stesso colore con cui l’avevamo colorata anche se ora è finita all’inizio della riga successiva.
Commenti
Posta un commento