Pulsante nella barra strumenti

Creare una macro - Scrivere uno script - Usare le API
Rispondi
epico
Messaggi: 58
Iscritto il: mercoledì 4 giugno 2014, 11:53

Pulsante nella barra strumenti

Messaggio da epico »

Salve,
In un pulsante inserito nella barra strumenti si riesce ad avere nessun controllo Abilitato/Disabilitato

La macro nel file allegato funziona, serve per spostarsi tra i fogli
La mia richiesta è solo per estetica/didattica, per fare in modo che se mi trovo nel primo foglio si disabiliti il pulsante "Prec" come da immagine
Allegati
nascondiFogli.ods
(39.64 KiB) Scaricato 33 volte
230306-170850.png
230306-170850.png (26.19 KiB) Visto 1663 volte
Ultima modifica di epico il domenica 2 aprile 2023, 23:24, modificato 1 volta in totale.
OpenOffice 4.1 su Win10
epico
Messaggi: 58
Iscritto il: mercoledì 4 giugno 2014, 11:53

Re: Pulsante nella barra strumenti

Messaggio da epico »

Dalle risposte ricevute presumo non ci sia una soluzione :!: :(
Spero di essere più fortunato la prossima :?:
OpenOffice 4.1 su Win10
patel
Volontario attivo
Volontario attivo
Messaggi: 4016
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Pulsante nella barra strumenti

Messaggio da patel »

Magari la soluzione c'è, ma non un utente del forum che la conosce.
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
nickGiard
Messaggi: 65
Iscritto il: lunedì 14 maggio 2012, 22:04

Re: Pulsante nella barra strumenti

Messaggio da nickGiard »

"Magari la soluzione c'è, ma non un utente del forum che la conosce."
Probabilmente la richiesta in forma didattica potrebbe essere interessante.
Cercando nel lungo elenco dei GetProcessServiceManager.getAvailableServiceNames del Process Service Manager mi sono imbattuto nel com.sun.star.frame.ToolbarController.
Andando sulle API:
ToolbarController Service Reference
is an abstract service for a component which offers a more complex user interface to users within a toolbar.
A generic toolbar function is represented as a button which has a state (enabled,disabled and selected, not selected). A toolbar controller can be added to a toolbar and provide information or functions within a more sophisticated user interface.
A typical example for toolbar controller is the font chooser within the toolbar. It provides all available fonts in a dropdown box and shows the current chosen font.
Altra API e' ToolbarControllerFactory, mentre non si trova esposta nelle API com.sun.star.ui.ToolBarFactory.
Probabilmente bisognerebbe trovare il contenitore di tutte le Toolbar, ciclare o getByName per avere la propria toolbar, trovare i pulsanti e quindi applicare il relativo stato.
Spero che qualcuno che ne sa molto più di me possa dare un interessante input.
Un caro saluto a tutti :) :)
Nicola con LibreOffice 7.1 (x64) su Windows 11
epico
Messaggi: 58
Iscritto il: mercoledì 4 giugno 2014, 11:53

Re: Pulsante nella barra strumenti

Messaggio da epico »

Condivido la richiesta
Spero che qualcuno che ne sa molto più di me possa dare un interessante input.
:ucrazy:
OpenOffice 4.1 su Win10
nickGiard
Messaggi: 65
Iscritto il: lunedì 14 maggio 2012, 22:04

Re: Pulsante nella barra strumenti

Messaggio da nickGiard »

Salve
continuando a cercare sull'argomento, poiché sviluppare codice è un po come fare il detective, ho trovato una cosa che mi sembra interessante:
[Solved] Macro to Open a Toolbar I just created?
https://forum.openoffice.org/en/forum/v ... 904aa5249b
da hanya :

Codice: Seleziona tutto

Sub ToolbarTest
  oDoc = ThisComponent
  sResId = FindToolbar(oDoc, "Controls")
  if not isnull(sResId) then
    oManager = oDoc.getCurrentController().getFrame().LayoutManager
    oManager.createElement(sResId)
    oManager.showElement(sResId)
  end if
End Sub

Function FindToolbar(oDoc, sName As String)
  oManager = oDoc.getUIConfigurationManager()
  aElements = oManager.getUIElementsInfo(_
       com.sun.star.ui.UIElementType.TOOLBAR)
  itemset = nothing
  for i = 0 to ubound(aElements) step 1
    a = aElements(i)
    if GetPropertyValueByName(a, "UIName") = sName then
      itemset = a
      exit for
    end if
  next
  if not isnull(itemset) then
    FindToolbar = GetPropertyValueByName(itemset, "ResourceURL")
  else
    FindToolbar = nothing
  end if
End Function

Function GetPropertyValueByName(aElements, sName) As Variant
  found = nothing
  for i = 0 to ubound(aElements) step 1
    if aElements(i).Name = sName then
      found = aElements(i).Value
    end if
  next
  GetPropertyValueByName = found
End Function
Ovviamente ora il passo successivo è far girare il codice in modalità debug e vedere gli oggetti che genera per poterli gestire.
Invito chi può a dare ulteriori stimoli alla discussione.

Trovo anche "5.44.1.1. My first toolbar" pag. 132 in Useful Macro Information For OpenOffice.org By Andrew Pitonyak che studiandolo può dare utili informazioni.
Nicola con LibreOffice 7.1 (x64) su Windows 11
Gaetanopr
Volontario
Volontario
Messaggi: 3291
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Pulsante nella barra strumenti

Messaggio da Gaetanopr »

Tramite LayoutManager riesco ad abilitare e disabilitare la barra personalizzata con tutti i comandi che ne fanno parte, ma non dei singoli elementi, anche se si riesce ad accedere alle loro proprietà, sicuramente mi sfugge qualcosa, ad ogni modo ho aggirato l'ostacolo anche se non mi piace l'attuale soluzione , creando due barre personalizzate, una per il comando prec e l'altra per il comando succ.
All'apertura del file i pulsanti sono entrambi abilitati ma poi cliccando su di essi si disabilita quello cliccato e viceversa.
Allegati
nascondiFogli_gaetano.ods
(85.13 KiB) Scaricato 38 volte
prec_succ.PNG
prec_succ.PNG (2.38 KiB) Visto 1546 volte
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
Avatar utente
unlucky83
Volontario
Volontario
Messaggi: 2355
Iscritto il: lunedì 7 gennaio 2013, 1:23
Località: Latina

Re: Pulsante nella barra strumenti

Messaggio da unlucky83 »

Buonasera a tutti. Ho passato alcune ore nei giorni scorsi su questo quesito. Ho provato un pò tutte le proprietà e i metodi che sono riuscito a vedere con la macro xray, ma sono riuscito solo a disabilitare tutto il toolbar. Dei singoli elementi sono solo riuscito a scoprire le proprietà quali nome, dimensione dell'icona etc... senza possibilità di modificare i parametri.
Ottimo stratagemma quello di @Gaetanopr
LibO:Versione: 6.2.8.2
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui
epico
Messaggi: 58
Iscritto il: mercoledì 4 giugno 2014, 11:53

Re: Pulsante nella barra strumenti

Messaggio da epico »

Mi scuso per il ritardo del riscontro, ma il file l'ho completato solo adesso.

Ho inserito 2 file uno per OpenOf e uno per LibreOf, perchè l'effetto visivo abilitato/disabilitato si ha solo con le icone e non sono compatibili tra i due programmi.

Per il momento mi accontento, però non metto RISOLTO, sperando in ulteriori sviluppi.

Grazie a tutto il forum :super:
Allegati
nascondiFogli_2-LibreO.ods
(65.19 KiB) Scaricato 31 volte
nascondiFogli_2-OpenO.ods
(51.58 KiB) Scaricato 26 volte
Ultima modifica di epico il domenica 2 aprile 2023, 22:45, modificato 1 volta in totale.
OpenOffice 4.1 su Win10
geovign
Messaggi: 214
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: Pulsante nella barra strumenti

Messaggio da geovign »

Un saluto al forum.
se @unlucky83 ci ha passato alcune ore, io sono giorni che, nelle ore libere, ci provo e riprovo...
Alla fine però, sono riuscito a nascondere (rendere non visibile) un pulsante, ma non a disabilitarlo che, ahimè, sarebbe stata la soluzione ottimale.
Il codice è un po' lungo, perchè l'ho scritto come esercizio personale e pertanto sono partito dal nome della toolbar che contiene i pulsanti da nascondere, per poi ottenere il suo indirizzo (URL) ed infine accedere ad ogni singolo elemento della stessa.
Le eventuali modifiche vengono perse al momento della chiusura del documento e non sono permanenti. Per riportare tutto allo stato originario, è necessario chiudere e riaprire il file.
E' ovvio che ognuno poi ne estrapolerà la parte che interessa e la modificherà come crede.
Il codice si trova nel modulo ProprietaBarra della libreria Standard ed ad inizio modulo ho inserito alcuni commenti.
Allego il file e di seguito riporto il solo codice.

Codice: Seleziona tutto

Sub ModificoPropritaElemento
rem Nome TollBar da ricercare
	Dim NomeToolBar As String
	NomeToolBar = "Barra1"	'nome della barra con i pulsantri 'Prec' , 'Home' e 'Suc'
rem Cerco la ToolBar e determino il suo URL
	Dim oDoc As Object
	Dim oManger
	Dim aElements() As Object
	Dim Trovata As Boolean
	Dim iElements As Integer 
	Dim A() As Object
	Dim iA As Integer
	Dim y As Integer 
	Dim URLToolBar As String
	oDoc = ThisComponent
	oManager = oDoc.getUIConfigurationManager()
	aElements = oManager.getUIElementsInfo(com.sun.star.ui.UIElementType.TOOLBAR)
	Trovata = False
	'ciclo all'interno delle barre presenti nel documento
	For iElements = 0 to UBound(aElements)
		A = aElements(iElements)
		'ricerco all'interno dell'oggetto array il nome dell'elemento
		For iA = 0 to UBound(A)
			If A(iA).Name = "UIName" And A(iA).Value = NomeToolBar Then
				y = 0	'azzero indice per ciclo Do/Loop
				Do	'eseguo nuovamente un ciclo per ricavare URL della ToolBar
	 				If A(y).Name = "ResourceURL" Then 	URLToolBar = A(y).Value
					'Print URLToolBar
					Trovata = True
					Exit For
				y = y +1
				Loop While y > UBound(A)
			End If
		Next iA
		If Trovata = True Then Exit For
	Next iElements
rem accedo alla ToolBar ricercata ed analizzo le proprietà degli elementi che la costituiscono
	Dim oController As Object
	Dim oLayoutManager As Object
	Dim ToolBar As Object
	Dim oToolBar As Object
	Dim iElemToolBar As Integer
	Dim oElemToolBar() As Object
	Dim TestoMessaggio As String
	Dim x As Integer
	oController = oDoc.GetCurrentController()
	oLayoutManager = oController.getFrame().LayoutManager
	'XRay oLayoutManager
	ToolBar = oLayoutManager.getElement(URLToolBar)
	'XRay ToolBar
	oToolBar = ToolBar.getSettings(True)
	'XRay oToolBar
	' ciclo all'interno degli elementi presenti nella ToolBar
	For iElemToolBar = 0 To oToolBar.getCount()-1
		oElemToolBar = oToolBar.getByIndex(iElemToolBar)	'oggetto che contiene array delle proprietà dell'elemento
		'ciclo all'interno delle proprietà dell'elemento; vengono esclusi separatori (Type diverso da 0)
		For x = 0 To UBound(oElemToolBar)
			If oElemToolBar(x).Name = "Type" And oElemToolBar(x).Value = 0  Then
				y = 0	'azzero indice per ciclo Do/Loop
				TestoMessaggio = ""
				Do	'eseguo nuovamente un ciclo per riassumere le proprietà
	 				TestoMessaggio = TestoMessaggio & oElemToolBar(y).Name & ":    " & _
	 				oElemToolBar(y).Value & CHR(10)
					y = y +1
				Loop While y <= UBound(oElemToolBar)
			'mostro messaggio con le proprietà dell'elemento
			MsgBox  TestoMessaggio
			End If
		Next x	
	Next iElemToolBar
rem modifico proprietà del solo elemento denominato "Prec" all'interno della barra
	Dim Proprieta(4) As New com.sun.star.beans.PropertyValue
	Dim IndiceEl As Integer
	Dim Elemento As New com.sun.star.beans.PropertyValue
	Trovata = false
	'ciclo all'interno degli elementi che costituiscono la barra
	For iElemToolBar = 0 To oToolBar.getCount()-1
		oElemToolBar = oToolBar.getByIndex(iElemToolBar)	'oggetto che contiene array delle proprietà dell'elemento
		'ciclo all'interno delle proprietà dell'elemento; vengono esclusi separatori (Type diverso da 0)
		For x = 0 To UBound(oElemToolBar)
			If oElemToolBar(x).Name = "Label" And oElemToolBar(x).Value = "Prec"  Then
				IndiceEl = iElemToolBar		'indice dell'elemento
				y = 0	'indice array proprietà	
				For Each Elemento in oElemToolBar()
					Proprieta(y).Name = Elemento.Name
					Proprieta(y).Handle = Elemento.Handle
					If Elemento.Name = "CommandURL" Then
						'E' possibile modificare la macro associata originariamente all'elemento, commentando la riga seguente
						'e de-commentare la riga successiva
						Proprieta(y).Value = Elemento.Value
						'Proprieta(y).Value = "vnd.sun.star.script:Standard.Module4.NuovaMacro?language=Basic&location=document"
						Proprieta(y).State = Elemento.State
					Elseif Elemento.Name = "Label" Then
						'E' possibile modificare il nome originario dell'elemento, commentando la riga seguente
						'e de-commentare la riga successiva
						Proprieta(y).Value = Elemento.Value
						'Proprieta(y).Value = "Modificato"
						Proprieta(y).State = Elemento.State
					ElseIf Elemento.Name = "IsVisible" Then
						'E' possibile modificare la visibilità dell'elemento, commentando la riga seguente
						'e de-commentare la riga successiva
						Proprieta(y).Value = True	'se non precedentemente nascosto il valore può essere = Elemento.Value
						'Proprieta(y).Value = False
						Proprieta(y).State = Elemento.State
					Else
						Proprieta(y).Value = Elemento.Value
						Proprieta(y).State = Elemento.State
					End If
					y = y + 1
				Next
				oToolBar.replaceByIndex(IndiceEl, Proprieta)	'istruzione per sostituire elemento
				'oToolBar.removeByIndex(Indice)		'istruzione per rimuovere elemento
				'oToolBar.insertByIndex(Indice, Proprieta)		'istruzione per inserire un nuovo elemento
				ToolBar.setSettings(oToolBar)		'applico le modifiche alla toolbar
				ToolBar.updateSettings		'aggiorno la toolbar
				Trovata = true
				Exit For
			End If
		Next x	
		If Trovata = true Then Exit For
	Next iElemToolBar
rem controllo modifiche apportate mostrando nuovamente il messaggio con le proprietà
	For iElemToolBar = 0 To oToolBar.getCount()-1
		oElemToolBar = oToolBar.getByIndex(iElemToolBar)	'oggetto che contiene array delle proprietà dell'elemento
		'ciclo all'interno delle proprietà del solo elemento "Prec" modificato
		For x = 0 To UBound(oElemToolBar)
			If oElemToolBar(x).Name = "Label" And oElemToolBar(x).Value = "Prec"  Then
				y = 0	'azzero indice per ciclo Do/Loop
				TestoMessaggio = ""
				Do	'eseguo nuovamente un ciclo per riassumere le proprietà
	 				TestoMessaggio = TestoMessaggio & oElemToolBar(y).Name & ":    " & _
	 				oElemToolBar(y).Value & CHR(10)
					y = y +1
				Loop While y <= UBound(oElemToolBar)
				'visualizzo proprietà dell'elemento
				MsgBox  TestoMessaggio
			End If
		Next x	
	Next iElemToolBar
End Sub
Ovviamente, provatelo ...
Saluti
Geo

EDIT: il richiamo a @unlucky83 non vuole essere offensivo nei suoi confronti, che Dio me ne guardi, non ne ho motivo.... E' solo per far capire che per trovare una possibile soluzione, mi ha portato a lavorarci sopra tanto tempo. Scusate per la precisazione, ma rileggendo il post, mi sembrava doverosa.
Saluti
Geo
Allegati
nascondiFogli_Geo.ods
(81.4 KiB) Scaricato 26 volte
Ultima modifica di geovign il martedì 28 marzo 2023, 12:45, modificato 1 volta in totale.
LibO 7 su LinuxMint 21
geovign
Messaggi: 214
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: Pulsante nella barra strumenti

Messaggio da geovign »

Ho trovato un errore all'interno del primo ciclo Do/Loop While (rigo da 44 a 49).
Sostituire

Codice: Seleziona tutto

If A(y).Name = "ResourceURL" Then URLToolBar = A(y).Value
'Print URLToolBar
Trovata = True
Exit For
con

Codice: Seleziona tutto

If A(y).Name = "ResourceURL" Then
	URLToolBar = A(y).Value
	'Print URLToolBar
	Trovata = True
	Exit For
End If
Il codice funzionava ugualmente, perchè "ResourceURL" è la prima proprietà che trova, ma concettualmente il codice era sbagliato.
Saluti
Geo
Allegati
nascondiFogli_Geo.ods
(81.4 KiB) Scaricato 28 volte
LibO 7 su LinuxMint 21
epico
Messaggi: 58
Iscritto il: mercoledì 4 giugno 2014, 11:53

Re: Pulsante nella barra strumenti

Messaggio da epico »

@geovign grazie per il tempo dedicato al post.
Ho provato a far girare il codice, ma per le mie limitate conoscenze non ho capito come applicarlo al mio quesito.
In Libre gira correttamente, in Open và in errore (Open è il programma che uso normalmente, Libre lo uso solo per prove).
.
230329-014942_b.png
230329-014942_b.png (27.15 KiB) Visto 1377 volte
.
Nel mio precedente intervento ho allegato un file già funzionante con la soluzione proposta da @Gaetanopr (il file rispecchia circa 80% il reale).
Non ho inserito il codice perchè un pò incasinato e distribuito su più moduli (probabilmente si poteva fare di meglio).
Nel file reale ho ancora alcune criticità che sto provando ...

Rinnovo i ringraziamenti a tutto il forum per il tempo dedicato.
OpenOffice 4.1 su Win10
geovign
Messaggi: 214
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: Pulsante nella barra strumenti

Messaggio da geovign »

Per ogni elemento (pulsante), OpenOffice determina un numero di proprietà maggiore rispetto LibreOffice, quindi il ciclo va in errore. La soluzione da me pensata:
- non dimensionare la variabile "Proprieta()" in sede di dichiarazione: Dim Proprieta() As New com.sun.star.beans.PropertyValue
- Ridimensionare la stessa variabile all'interno del ciclo For Each in funzione della variabile "y" : Redim Preserve Proprieta(y)
- Al termine del ciclo, dopo l'aggiornamento della barra, riportare a zero la dimensione della variabile: Redim Preserve Proprieta()
Così facendo ho risolto il problema di funzionamento tra Open e Libre da te segnalato.

Codice: Seleziona tutto

...
Dim Proprieta() As New com.sun.star.beans.PropertyValue
...
For Each Elemento in oElemToolBar()
	Redim Preserve Proprieta(y)
	Proprieta(y).Name = Elemento.Name
	Proprieta(y).Handle = Elemento.Handle
	If Elemento.Name = "IsVisible" Then
		Proprieta(y).Value = False
		Proprieta(y).State = Elemento.State
	Else
		Proprieta(y).Value = Elemento.Value
		Proprieta(y).State = Elemento.State
	End If
	y = y + 1
	Next
oToolBar.replaceByIndex(IndiceEl, Proprieta)	'istruzione per sostituire elemento
ToolBar.setSettings(oToolBar)		'applico le modifiche alla toolbar
ToolBar.updateSettings		'aggiorno la toolbar
Trovata = true
Redim Preserve Proprieta()
Exit For
... 
Per quanto, riguarda l'implementazione del codice all'interno del tuo progetto, per ora, ho provato ad inserirlo nel primo file da te allegato al post iniziale e che allego.
Prova a vedere se gira nel modo corretto e da te voluto.
Saluti
Geo
Allegati
nascondiFogli_Geo2.ods
(83.24 KiB) Scaricato 25 volte
LibO 7 su LinuxMint 21
epico
Messaggi: 58
Iscritto il: mercoledì 4 giugno 2014, 11:53

Re: Pulsante nella barra strumenti

Messaggio da epico »

Interessante soluzione pure questa.

Nelle prove effettuate funziona, ma ho trovato 2 cose strane (vedi file allegato).
1 -
geovign ha scritto: martedì 28 marzo 2023, 11:00
Le eventuali modifiche vengono perse al momento della chiusura del documento e non sono permanenti. Per riportare tutto allo stato originario, è necessario chiudere e riaprire il file.
A me capita il contrario, sì vengono perse, ma si ripresentano tutti i pulsanti nascosti.

Io ho forzato alla chiusura del file il passaggio al foglio Totale (simulando il pulsante Home), che è la condizione di funzionamento del file (tutti i pulsanti nascosti).
Module6.showElements
...
call Main42 'vai al foglio Totale - Module4
'commentare per verificare

2 -
Io nella barra degli strumenti ho un pulsante (Interrompi esecuzione macro) che dopo il primo spostamento ad un'altro foglio si abilita e rimane così (per disabilitarlo bisogna salvare il file) vedi immagine.
.
230402-090637.png
230402-090637.png (22.5 KiB) Visto 1328 volte
.
La base del file è "nascondiFogli_2-OpenO.ods" precedentemente allegato (e in quello non capita) ho solo aggiornato la parte relativa al controllo dei pulsanti.
Il file funziona senza problemi, ma non ho capito il motivo di questo comportamento (nell' Editor delle macro il pulsante Interrompi esecuzione macro è disabilitato).
.
.
Gaetanopr ha scritto: domenica 19 marzo 2023, 1:45 ho aggirato l'ostacolo anche se non mi piace l'attuale soluzione
geovign ha scritto: martedì 28 marzo 2023, 11:00 sono riuscito a nascondere (rendere non visibile) un pulsante, ma non a disabilitarlo che, ahimè, sarebbe stata la soluzione ottimale.
Resto fiducioso nella soluzione "REGINA" di disabilitare i singoli pulsanti. :super:
Allegati
nascondiFogli_3.ods
(52.53 KiB) Scaricato 29 volte
Ultima modifica di epico il domenica 2 aprile 2023, 22:40, modificato 1 volta in totale.
OpenOffice 4.1 su Win10
geovign
Messaggi: 214
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: Pulsante nella barra strumenti

Messaggio da geovign »

1 - Non sono in grado di darti una spiegazione.
2 - A me non capita.
Saluti
Geo
LibO 7 su LinuxMint 21
epico
Messaggi: 58
Iscritto il: mercoledì 4 giugno 2014, 11:53

Re: Pulsante nella barra strumenti

Messaggio da epico »

Ho un problema nel file reale che non riesco a risolvere con la soluzione di @Gaetanopr:
I pulsanti si disabilitano/abilitano correttamente, però una volta disabilitati se salvo il file si ripristinano.
Succede anche selezionando un range e esportandolo in PDF.

Volendo fare delle verifiche si può utilizzare il file allegato il "venerdì 24 marzo 2023, 1:37"
Anche con il file allegato da @Gaetanopr si evidenzia.

Grazie
OpenOffice 4.1 su Win10
Rispondi