AddProperty e url dispatcher nei popupmenu

Discussioni sull'applicazione per i fogli di calcolo
Rispondi
ottaviane
Messaggi: 24
Iscritto il: mercoledì 6 luglio 2011, 9:43

AddProperty e url dispatcher nei popupmenu

Messaggio da ottaviane »

Salve a tutti.
sto provando a lavorare con i popupmenu e tutto è ok.
Ho però un problemino che non riesco a risolvere.
Quando assegno ad un item del popupmenu una chiamata a sub è tutto ok.
Quando però voglio passare un argomento non funziona.

Codice: Seleziona tutto

sub creaitems
......
  oPropSet.addProperty("Text", 0, "Item01")
  oPropSet.addProperty("CommandURL",0,"vnd.sun.star.script:StandardModule.Module1.MyFunction(""valore da  passare"")?language=Basic&location=document")
.....
end sub

sub MyFunction(st as String)
  print st
end sub

in pratica l'url non mi viene accettato perchè gli metto l'argomento alla sub.
Vorrei semplicemente passare un valore o una stringa alla sub chiamata in base all'item scelto nel popup menu.
è fattibile? come si fa?

ciao e grazie.
LibreOffice 3.3.2 su Kubuntu 11.04
patel
Volontario attivo
Volontario attivo
Messaggi: 4030
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: AddProperty e url dispatcher nei popupmenu

Messaggio da patel »

sembra che tu giochi agli indovinelli, non sarebbe più semplice allegare il file spiegando come si usa e dove sta il problema ?
-------------------
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
Avatar utente
unlucky83
Volontario
Volontario
Messaggi: 2355
Iscritto il: lunedì 7 gennaio 2013, 1:23
Località: Latina

Re: AddProperty e url dispatcher nei popupmenu

Messaggio da unlucky83 »

Vorrei semplicemente passare un valore o una stringa alla sub chiamata in base all'item scelto nel popup menu.
è fattibile? come si fa?
Se alleghi il file proviamo a seguire la strada che vuoi intraprendere, in alternativa ti consiglio di inserire nella sub chiamata dei select case o degli if che valutino il valore dell'item selezionato. In questo modo non hai bisogno di passare nessun argomento.
Altra alternativa è quella di usare una variabile globale, di cui imposti il valore nella prima sub, così non hai necessità di alcun select case o if nella seconda sub, ma ti basta richiamarla semplicemente.
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
ottaviane
Messaggi: 24
Iscritto il: mercoledì 6 luglio 2011, 9:43

Re: AddProperty e url dispatcher nei popupmenu

Messaggio da ottaviane »

scusate ma pensavo di essere stato chiaro ...
ecco il codice:

Codice: Seleziona tutto

Option Explicit

Global oDocView As Object
Global oContextMenuInterceptor As Object

Global oStore As Object
Global oPropSetRegistry As Object

Const MNU_PREFIX = "pmxMenu_"
Global PysRange as object

'_______________________________________________________________________________
Sub registerContextMenuInterceptor
   
   InitMenuFactory

   oDocView = ThisComponent.CurrentController
   oContextMenuInterceptor = _
   CreateUnoListener("ThisDocument_", "com.sun.star.ui.XContextMenuInterceptor")
   
   oDocView.registerContextMenuInterceptor(oContextMenuInterceptor)
   PysRange = ThisComponent.sheets.getByName("2010").getCellRangeByName("C2:E8")
End Sub


'_______________________________________________________________________________
Sub releaseContextMenuInterceptor

   On Error Resume Next
   oDocView.releaseContextMenuInterceptor(oContextMenuInterceptor)
   
   TerminateMenuFactory
   
End Sub


'_______________________________________________________________________________
Function ThisDocument_notifyContextMenuExecute(ContextMenuExecuteEvent As Object) As Variant
Dim oSrcWin As Object
Dim oExePoint As Object
Dim oATContainer As Object
Dim oSelection As Object

Dim oMenuItem As Object
Dim I As Integer

Dim PysEnCours as object

With ContextMenuExecuteEvent

   'contains the window where the context
   'menu has been requested
   oSrcWin = .SourceWindow

   'contains the position the context menu
   'will be executed at (css.awt.Point)
   oExePoint = .ExecutePosition
   
   'enables the access to the menu content.
   'The implementing object has to support the
   'service ActionTriggerContainer
   oATContainer = .ActionTriggerContainer
   
   'provides the current selection
   'inside the source window
   oSelection = .Selection             
End With

PysEnCours = thiscomponent.currentselection	

' Si la sélection courante est une cellule de la plage concernée
if PysEnCours.supportsService("com.sun.star.sheet.SheetCell") and _
   PysRange.queryIntersection(PysEnCours.getRangeAddress()).getCount >= 1 then
	   'remove all menu entries:
	   For I = oATContainer.Count - 1 To 0 Step -1 
	      oATContainer.removeByIndex(I)
	   Next I
	   
	   'add some context menu entry
	   'vnd.sun.star.script:Standard.Module1.Test?language=Basic&location=document"
	
	   oMenuItem = GetSimpleMenuItem("Entry1", "Présent", "vnd.sun.star.script:Standard.Module1.PysPresent?language=Basic&location=document")
	   oATContainer.insertByIndex(0, oMenuItem)
	   
	   oMenuItem = GetSimpleMenuItem("Entry2", "Absent", "vnd.sun.star.script:Standard.Module1.PysAbsent?language=Basic&location=document")
	   oATContainer.insertByIndex(1, oMenuItem)
	
	   oMenuItem = GetSimpleMenuItem("Entry3", "Excusé", "vnd.sun.star.script:Standard.Module1.PysExcuse?language=Basic&location=document")
	   oATContainer.insertByIndex(2, oMenuItem)
	   
	   oMenuItem = GetSimpleMenuItem("Entry4", "NR", "vnd.sun.star.script:Standard.Module1.PysNR?language=Basic&location=document")
	   oATContainer.insertByIndex(3, oMenuItem)
	
	
	' POSSIBLE RESULTS FOR THIS FUNCTION
	' This function must result one of the following values:
	
	' com.sun.star.ui.ContextMenuInterceptorAction.IGNORED
	'   the XContextMenuInterceptor has ignored the call.
	'   The next registered XContextMenuInterceptor should be notified.
	
	' com.sun.star.ui.ContextMenuInterceptorAction.CANCELLED
	'   the context menu must not be executed.
	'   The next registered XContextMenuInterceptor should not be notified.
	
	' com.sun.star.ui.ContextMenuInterceptorAction.EXECUTE_MODIFIED
	'   the menu has been modified and should be executed
	'   without notifying the next registered XContextMenuInterceptor.
	
	' com.sun.star.ui.ContextMenuInterceptorAction.CONTINUE_MODIFIED
	'   the menu has been modified and the next registered
	'   XContextMenuInterceptor should be notified.
	
	   ThisDocument_notifyContextMenuExecute = _
	      com.sun.star.ui.ContextMenuInterceptorAction.CONTINUE_MODIFIED
else
   ThisDocument_notifyContextMenuExecute = _
	com.sun.star.ui.ContextMenuInterceptorAction.IGNORED
end if

End Function


'_______________________________________________________________________________
'   MENU FACTORY ROUTINES
'_______________________________________________________________________________
Sub InitMenuFactory()

   oStore = CreateUnoService("com.sun.star.ucb.Store")
   oPropSetRegistry = oStore.createPropertySetRegistry("")

End Sub


'_______________________________________________________________________________
Sub TerminateMenuFactory()
Dim mNames()
Dim sName As String
Dim I As Integer

   mNames() = oPropSetRegistry.getElementNames
   
   For I = LBound(mNames()) To UBound(mNames())
      sName = mNames(I)
      
      If Left(sName, Len(MNU_PREFIX)) = MNU_PREFIX Then
         oPropSetRegistry.removePropertySet ( sName )
      End If
   Next I
   
   oPropSetRegistry.dispose
   oStore.dispose
   
End Sub

'_______________________________________________________________________________
' Sorry: menu icon and sub-menues not supported
Function GetSimpleMenuItem( sName As String, sText As String, _
sCommandUrl As String, Optional sHelpUrl As String ) As Object

Dim oPropSet As Object
Dim sInternalName As String

   sInternalName = MNU_PREFIX & sName
   If oPropSetRegistry.hasByName(sInternalName) Then
      oPropSetRegistry.removePropertySet(sInternalName)
   End If
      
   oPropSet = oPropSetRegistry.openPropertySet(sInternalName, True)

   oPropSet.addProperty("Text", 0, sText)
   oPropSet.addProperty("CommandURL", 0, sCommandUrl)

   If Not IsMissing(sHelpUrl) Then
      oPropSet.addProperty("HelpURL", 0, sHelpUrl)
   End If
      
   GetSimpleMenuItem = oPropSet
   
End Function


'_______________________________________________________________________________
Function GetMenuSeparator( sName As String ) As Object

Dim oPropSet As Object
Dim sInternalName As String
Dim iSeparatorType As Integer

   sInternalName = MNU_PREFIX & sName
   If oPropSetRegistry.hasByName(sInternalName) Then
      oPropSetRegistry.removePropertySet(sInternalName)
   End If
   
   oPropSet = oPropSetRegistry.openPropertySet(sInternalName, True)
   
   'constant group com.sun.star.ui.ActionTriggerSeparatorType not supported?
   'unfortunately, the only separator-type working is the "SPACE"
   'regardless for the iSeparatorType passed...
   iSeparatorType = 1
   oPropSet.addProperty("SeparatorType", 0, iSeparatorType)

   GetMenuSeparator = oPropSet
   
End Function 

sub PysPresent
thiscomponent.currentselection.string="X"
end sub
sub PysAbsent
thiscomponent.currentselection.string="A"
end sub
sub PysExcuse
thiscomponent.currentselection.string="E"
end sub
sub PysNR
thiscomponent.currentselection.string=""
end sub
il problema è che se notate alla fine del codice ci sono le sub PysPresent, PysAbsent, PysExcuse e PysNR che sono chiamate ognuna da un item del popupmenu. Non è un granchè questo metodo perchè se gestire un popupmenu dinamico e cioè che gli item possono variare in quantità e tipo ho la necessità di enumerarli. L'ideale sarebbe se ogni item potesse o modificare una variabile globale oppure inviare un argomento alla funzione chiamata. Sono chiaro?
Il file a cui appartiene il codice sopra è http://ooo-forums.apache.org/fr/forum/v ... 15&t=21943 che mi ha gentilmente suggerito unlucky83.
LibreOffice 3.3.2 su Kubuntu 11.04
patel
Volontario attivo
Volontario attivo
Messaggi: 4030
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: AddProperty e url dispatcher nei popupmenu

Messaggio da patel »

ottaviane ha scritto:scusate ma pensavo di essere stato chiaro ...
ecco il codice:
.................
Il file a cui appartiene il codice sopra è http://ooo-forums.apache.org/fr/forum/v ... 15&t=21943 che mi ha gentilmente suggerito unlucky83.
bastava continuare la vecchia discussione e non ci sarebbero stati fraintendimenti.
-------------------
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
ottaviane
Messaggi: 24
Iscritto il: mercoledì 6 luglio 2011, 9:43

Re: AddProperty e url dispatcher nei popupmenu

Messaggio da ottaviane »

scusami patel, scusa se mi permetto, ma l'argomento è diverso: nel primo caso si trattava di intercettamento di un evento, in questo caso si tratta di dispatch di un url o qualcosa di simile.
In un popup menu si può assegnare ad ogni item la chiamata alla stessa funzione ma passando un argomento variabile tipo un integer ?
LibreOffice 3.3.2 su Kubuntu 11.04
Avatar utente
unlucky83
Volontario
Volontario
Messaggi: 2355
Iscritto il: lunedì 7 gennaio 2013, 1:23
Località: Latina

Re: AddProperty e url dispatcher nei popupmenu

Messaggio da unlucky83 »

Ho cercato in rete, ma non ho trovato ancora nulla.
Potresti creare una serie di mini sub come nell'esempio,una per ogni item, in cui setti una variabile globale e poi chiami la macro che la deve gestire.
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
ottaviane
Messaggi: 24
Iscritto il: mercoledì 6 luglio 2011, 9:43

Re: AddProperty e url dispatcher nei popupmenu

Messaggio da ottaviane »

Ciao e sempre grazie per le tue risposte e per la tua cordiale disponibilità. :super:
Purtroppo un approccio di questo non mi soddisfa. Infatti in un popupmenu dinamico gli item possono sempre variare e oggi possono essere 5 e domani diventare 20.
Ho pensato a qualche altro escamotage:
esempio 1: in C++ per i popupmenu dinamici di norma si assegna ad ogni item il puntatore ad una unica funzione la quale poi analizza il 'parent' (cioè il puntatore dell'item che l'ha invocata) per capire da quale item è stata invocata.
esempio 2: non esiste alcuna variabile dove viene memorizzato il nome dell'ultimo item selezionato?
Purtroppo anch'io ho cercato ma sul web ci sono troppe informazioni disordinate e incomplete. Anche la documentazione sulle API del basic di oo trovo che siano incomplete e prive di esempi. :oops: e comunque mal fatte. Non parliamo poi del sistema di dispatch dell'url perchè mi sono perso!
Penso che potrei risolvere solamente riuscendo ad intercettare dalla funzione chiamata uguale per tutti gli item chi è l'item chiamante :crazy:
Ciao e grazie.
LibreOffice 3.3.2 su Kubuntu 11.04
Avatar utente
unlucky83
Volontario
Volontario
Messaggi: 2355
Iscritto il: lunedì 7 gennaio 2013, 1:23
Località: Latina

Re: AddProperty e url dispatcher nei popupmenu

Messaggio da unlucky83 »

Al momento l'unica cosa che sembra funzionare è:
Intercettare il menu contestuale e impostarlo

Quindi questo è il mio piano di battaglia:
Intercettare il menu contestuale e svuotarlo di elementi
eseguire un PopupMenu

Ti allego il file, nota che quando clicchi con il tasto destro, in alto a sinistra (sotto la barra degli strumenti) si apre un popop menu

Sui popup menu ci sono molte più informazioni in giro, quindi se ti sta bene, devi solo far in modo che si posizioni in corrispondenza della cella su cui hai cliccato con il tasto destro
Allegati
MenucontestualeNoPopupMenuSI.ods
(15.1 KiB) Scaricato 161 volte
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
ottaviane
Messaggi: 24
Iscritto il: mercoledì 6 luglio 2011, 9:43

Re: AddProperty e url dispatcher nei popupmenu

Messaggio da ottaviane »

ok siamo sulla buona strada. Grazie alla tua dritta ho cambiato il mio orizzonte.
guarda cosa ho trovato:

Codice: Seleziona tutto

>
> Dim oDialog As Object
>
> Dim oPopupMenu As Object
>
>  
>
> Sub Main
>
>    sLibName = "Standard"
>
>    sDialogName = "Dialog1"
>
>    DialogLibraries.LoadLibrary(sLibName)
>
>    ' create new dialog
>
>    oDialog = CreateUnoDialog( _
>
>      DialogLibraries.getByName(sLibName).getByName(sDialogName))
>
>    oDialog.execute()
>
> End Sub
>
>  
>
> Sub PopupButton
>
>    ' get the size of the button
>
>    oButton = oDialog.getControl("CommandButton1")
>
>    aPosSize = oButton.PosSize
>
>    ' set the position of the popup menu
>
>    Dim aRect As New com.sun.star.awt.Rectangle
>
>    With aRect
>
>      .X = aPosSize.X
>
>      .Y = aPosSize.Y + aPosSize.Height
>
>      .Width = 0'100
>
>      .Height = 0'100
>
>    End With
>
>    ' menu listener
>
>    oMenuListener = CreateUnoListener( _
>
>      "PopupMenuListener_", "com.sun.star.awt.XMenuListener")
>
>    ' new popupmenu
>
>    oPopupMenu = CreateUnoService("com.sun.star.awt.PopupMenu")
>
>    ' set listener and insert menu items
>
>    With oPopupMenu
>
>      .addMenuListener(oMenuListener)
>
>      .insertItem(1,"Menu 1",0,0) 'id, label, type, position
>
>      .insertItem(2,"Menu 2",0,2)
>
>      .insertSeparator(1)
>
>      .setCommand(1,"item1")
>
>      .setCommand(2,"item2")
>
>    End With
>
>    ' show popup menu
>
>    oPopupMenu.execute(oDialog.Peer,aRect, _
>
>      com.sun.star.awt.PopupMenuDirection.EXECUTE_DEFAULT)
>
>    oPopupMenu.removeMenuListener(oMenuListener)
>
> End Sub
>
>  
>
> Sub PopupMenuListener_select ( oEv )
>
>    sCmd = oEv.Source.getCommand(oEv.MenuId)
>
>    msgbox sCmd
>
> End Sub
>
> Sub PopupMenuListener_highlight ( oEv )
>
> End Sub
>
> Sub PopupMenuListener_activate ( oEv )
>
> End Sub
>
> Sub PopupMenuListener_deactivate ( oEv )
>
> End Sub
>
> Sub PopupMenuListener_disposing( oEv )
>
> End Sub
> 
come puoi vedere la Sub PopupMenuListener_select ( oEv ) tramite la variabile oEv tira fuori sCmd = oEv.Source.getCommand(oEv.MenuId) che tra l'altro c'è anche oEv.MenuId.
Così credo che abbiamo trovato il modo.
In questo momento sono a lavoro, domani metto in cantiere il tutto e ti faccio sapere. grazie e ciao.
LibreOffice 3.3.2 su Kubuntu 11.04
Avatar utente
unlucky83
Volontario
Volontario
Messaggi: 2355
Iscritto il: lunedì 7 gennaio 2013, 1:23
Località: Latina

Re: AddProperty e url dispatcher nei popupmenu

Messaggio da unlucky83 »

Quella macro l'avevo vista, per questo avevo detto che c'era in giro molto più materiale sui popup menu. ;)
Lavora su questo codice che è meglio:

Codice: Seleziona tutto

REM  *****  BASIC  *****

Option Explicit

Global oDocView As Object
Global oContextMenuInterceptor As Object

Global oStore As Object
Global oPropSetRegistry As Object

Const MNU_PREFIX = "pmxMenu_"
Global PysRange as object

const area as string ="C2:E8"

'_______________________________________________________________________________
Sub registerContextMenuInterceptor
   'eseguire per registrare il menu contestuale
   InitMenuFactory

   oDocView = ThisComponent.CurrentController
   oContextMenuInterceptor = _
   CreateUnoListener("ThisDocument_", "com.sun.star.ui.XContextMenuInterceptor")
   
   oDocView.registerContextMenuInterceptor(oContextMenuInterceptor)
   PysRange = ThisComponent.sheets.getByName("2010").getCellRangeByName(area)
End Sub


'_______________________________________________________________________________
Sub releaseContextMenuInterceptor
   'eseguire per rimuovere il menu contestuale
   On Error Resume Next
   oDocView.releaseContextMenuInterceptor(oContextMenuInterceptor)
   
   TerminateMenuFactory
   
End Sub


'_______________________________________________________________________________
Function ThisDocument_notifyContextMenuExecute(ContextMenuExecuteEvent As Object) As Variant
'viene eseguito da Sub registerContextMenuInterceptor
Dim oSrcWin As Object
Dim oExePoint As Object
Dim oATContainer As Object
Dim oSelection As Object
Dim oMenuItem As Object
Dim I As Integer
dim oMSP,oScript
Dim PysEnCours as object
With ContextMenuExecuteEvent

   'contains the window where the context
   'menu has been requested
   oSrcWin = .SourceWindow

   'contains the position the context menu
   'will be executed at (css.awt.Point)
   oExePoint = .ExecutePosition
   
   'enables the access to the menu content.
   'The implementing object has to support the
   'service ActionTriggerContainer
   oATContainer = .ActionTriggerContainer
   
   'provides the current selection
   'inside the source window
   oSelection = .Selection             
End With
PysEnCours = thiscomponent.currentselection	

' Si la sélection courante est une cellule de la plage concernée
if PysEnCours.supportsService("com.sun.star.sheet.SheetCell") and _
   PysRange.queryIntersection(PysEnCours.getRangeAddress()).getCount >= 1 then
	   'remove all menu entries:
	   For I = oATContainer.Count - 1 To 0 Step -1 
	      oATContainer.removeByIndex(I)
	   Next I
	   
	   'add some context menu entry
'	   oMenuItem = GetSimpleMenuItem("Entry1", "Présent", "vnd.sun.star.script:Standard.Module1.Test?language=Basic&location=document")
'	   oATContainer.insertByIndex(0, oMenuItem)

	
	' POSSIBLE RESULTS FOR THIS FUNCTION
	' This function must result one of the following values:
	
	' com.sun.star.ui.ContextMenuInterceptorAction.IGNORED
	'   the XContextMenuInterceptor has ignored the call.
	'   The next registered XContextMenuInterceptor should be notified.
	
	' com.sun.star.ui.ContextMenuInterceptorAction.CANCELLED
	'   the context menu must not be executed.
	'   The next registered XContextMenuInterceptor should not be notified.
	
	' com.sun.star.ui.ContextMenuInterceptorAction.EXECUTE_MODIFIED
	'   the menu has been modified and should be executed
	'   without notifying the next registered XContextMenuInterceptor.
	
	' com.sun.star.ui.ContextMenuInterceptorAction.CONTINUE_MODIFIED
	'   the menu has been modified and the next registered
	'   XContextMenuInterceptor should be notified.
	
	   ThisDocument_notifyContextMenuExecute = _
	      com.sun.star.ui.ContextMenuInterceptorAction.EXECUTE_MODIFIED
	     call ShowPopup(oExePoint)
else
   ThisDocument_notifyContextMenuExecute = _
	com.sun.star.ui.ContextMenuInterceptorAction.IGNORED
end if
End Function


'_______________________________________________________________________________
'   MENU FACTORY ROUTINES
'_______________________________________________________________________________
Sub InitMenuFactory()
'viene eseguito da Sub registerContextMenuInterceptor
   oStore = CreateUnoService("com.sun.star.ucb.Store")
   oPropSetRegistry = oStore.createPropertySetRegistry("")

End Sub


'_______________________________________________________________________________
Sub TerminateMenuFactory()
'viene eseguito da Sub releaseContextMenuInterceptor
Dim mNames()
Dim sName As String
Dim I As Integer

   mNames() = oPropSetRegistry.getElementNames
   
   For I = LBound(mNames()) To UBound(mNames())
      sName = mNames(I)
      
      If Left(sName, Len(MNU_PREFIX)) = MNU_PREFIX Then
         oPropSetRegistry.removePropertySet ( sName )
      End If
   Next I
   
   oPropSetRegistry.dispose
   oStore.dispose
   
End Sub

'_______________________________________________________________________________
' Sorry: menu icon and sub-menues not supported
Function GetSimpleMenuItem( sName As String, sText As String, _
sCommandUrl As String, Optional sHelpUrl As String ) As Object

Dim oPropSet As Object
Dim sInternalName As String

   sInternalName = MNU_PREFIX & sName
   If oPropSetRegistry.hasByName(sInternalName) Then
      oPropSetRegistry.removePropertySet(sInternalName)
   End If
      
   oPropSet = oPropSetRegistry.openPropertySet(sInternalName, True)

   oPropSet.addProperty("Text", 0, sText)
   oPropSet.addProperty("CommandURL", 0, sCommandUrl)

   If Not IsMissing(sHelpUrl) Then
      oPropSet.addProperty("HelpURL", 0, sHelpUrl)
   End If
      
   GetSimpleMenuItem = oPropSet
End Function

sub Test 
msgbox "ciao"
end sub
    
Sub ShowPopup(oExePoint as object)
dim oPopup,oCompWin
Dim aRect 
aRect=CreateUnoStruct("com.sun.star.awt.Rectangle")
    With aRect
      .X = oExePoint.X
      .Y = oExePoint.Y
      .Width = 0
      .Height = 0

    End With
    dim oMenuListener
oMenuListener = CreateUnoListener( _
      "PopupMenuListener_", "com.sun.star.awt.XMenuListener")

    ' new popupmenu
    oPopup = CreateUnoService("com.sun.star.awt.PopupMenu")

    ' set listener and insert menu items

    With oPopup
      .addMenuListener(oMenuListener)
      .insertItem(1,"Menu 1",0,0) 'id, label, type, position
      .insertItem(2,"Menu 2",0,2)
      .insertSeparator(1)
      .setCommand(1,"item1")
      .setCommand(2,"item2")
    End With
oCompWin = ThisComponent.getCurrentController()._
      getFrame().getComponentWindow()
    ' show popup menu
    oPopup.execute(oCompWin,aRect, 0)
    oPopup.removeMenuListener(oMenuListener)
End Sub

 Sub PopupMenuListener_select ( oEv )
 dim sCmd
    sCmd = oEv.Source.getCommand(oEv.MenuId)
    msgbox sCmd
 End Sub

 Sub PopupMenuListener_highlight ( oEv )
 End Sub

 Sub PopupMenuListener_activate ( oEv )
 End Sub

 Sub PopupMenuListener_deactivate ( oEv )
 End Sub

 Sub PopupMenuListener_disposing( oEv )
 End Sub
Di significativo ora c'è:
com.sun.star.ui.ContextMenuInterceptorAction.EXECUTE_MODIFIED
Ultima modifica di unlucky83 il martedì 9 dicembre 2014, 15:04, modificato 1 volta in totale.
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
ottaviane
Messaggi: 24
Iscritto il: mercoledì 6 luglio 2011, 9:43

Re: AddProperty e url dispatcher nei popupmenu

Messaggio da ottaviane »

ok 6 :super:
a domani. ciao
unlucky83 ha scritto:Quella macro l'avevo vista, per questo avevo detto che c'era in giro molto più materiale sui popup menu. ;)
Lavora su questo codice che è meglio:

Codice: Seleziona tutto

REM  *****  BASIC  *****

Option Explicit

Global oDocView As Object
Global oContextMenuInterceptor As Object

Global oStore As Object
Global oPropSetRegistry As Object

Const MNU_PREFIX = "pmxMenu_"
Global PysRange as object

const area as string ="C2:E8"

'_______________________________________________________________________________
Sub registerContextMenuInterceptor
   'eseguire per registrare il menu contestuale
   InitMenuFactory

   oDocView = ThisComponent.CurrentController
   oContextMenuInterceptor = _
   CreateUnoListener("ThisDocument_", "com.sun.star.ui.XContextMenuInterceptor")
   
   oDocView.registerContextMenuInterceptor(oContextMenuInterceptor)
   PysRange = ThisComponent.sheets.getByName("2010").getCellRangeByName(area)
End Sub


'_______________________________________________________________________________
Sub releaseContextMenuInterceptor
   'eseguire per rimuovere il menu contestuale
   On Error Resume Next
   oDocView.releaseContextMenuInterceptor(oContextMenuInterceptor)
   
   TerminateMenuFactory
   
End Sub


'_______________________________________________________________________________
Function ThisDocument_notifyContextMenuExecute(ContextMenuExecuteEvent As Object) As Variant
'viene eseguito da Sub registerContextMenuInterceptor
Dim oSrcWin As Object
Dim oExePoint As Object
Dim oATContainer As Object
Dim oSelection As Object
Dim oMenuItem As Object
Dim I As Integer
dim oMSP,oScript
Dim PysEnCours as object
With ContextMenuExecuteEvent

   'contains the window where the context
   'menu has been requested
   oSrcWin = .SourceWindow

   'contains the position the context menu
   'will be executed at (css.awt.Point)
   oExePoint = .ExecutePosition
   
   'enables the access to the menu content.
   'The implementing object has to support the
   'service ActionTriggerContainer
   oATContainer = .ActionTriggerContainer
   
   'provides the current selection
   'inside the source window
   oSelection = .Selection             
End With
PysEnCours = thiscomponent.currentselection	

' Si la sélection courante est une cellule de la plage concernée
if PysEnCours.supportsService("com.sun.star.sheet.SheetCell") and _
   PysRange.queryIntersection(PysEnCours.getRangeAddress()).getCount >= 1 then
	   'remove all menu entries:
	   For I = oATContainer.Count - 1 To 0 Step -1 
	      oATContainer.removeByIndex(I)
	   Next I
	   
	   'add some context menu entry
'	   oMenuItem = GetSimpleMenuItem("Entry1", "Présent", "vnd.sun.star.script:Standard.Module1.Test?language=Basic&location=document")
'	   oATContainer.insertByIndex(0, oMenuItem)

	
	' POSSIBLE RESULTS FOR THIS FUNCTION
	' This function must result one of the following values:
	
	' com.sun.star.ui.ContextMenuInterceptorAction.IGNORED
	'   the XContextMenuInterceptor has ignored the call.
	'   The next registered XContextMenuInterceptor should be notified.
	
	' com.sun.star.ui.ContextMenuInterceptorAction.CANCELLED
	'   the context menu must not be executed.
	'   The next registered XContextMenuInterceptor should not be notified.
	
	' com.sun.star.ui.ContextMenuInterceptorAction.EXECUTE_MODIFIED
	'   the menu has been modified and should be executed
	'   without notifying the next registered XContextMenuInterceptor.
	
	' com.sun.star.ui.ContextMenuInterceptorAction.CONTINUE_MODIFIED
	'   the menu has been modified and the next registered
	'   XContextMenuInterceptor should be notified.
	
	   ThisDocument_notifyContextMenuExecute = _
	      com.sun.star.ui.ContextMenuInterceptorAction.EXECUTE_MODIFIED
	     call ShowPopup(oExePoint)
else
   ThisDocument_notifyContextMenuExecute = _
	com.sun.star.ui.ContextMenuInterceptorAction.IGNORED
end if
End Function


'_______________________________________________________________________________
'   MENU FACTORY ROUTINES
'_______________________________________________________________________________
Sub InitMenuFactory()
'viene eseguito da Sub registerContextMenuInterceptor
   oStore = CreateUnoService("com.sun.star.ucb.Store")
   oPropSetRegistry = oStore.createPropertySetRegistry("")

End Sub


'_______________________________________________________________________________
Sub TerminateMenuFactory()
'viene eseguito da Sub releaseContextMenuInterceptor
Dim mNames()
Dim sName As String
Dim I As Integer

   mNames() = oPropSetRegistry.getElementNames
   
   For I = LBound(mNames()) To UBound(mNames())
      sName = mNames(I)
      
      If Left(sName, Len(MNU_PREFIX)) = MNU_PREFIX Then
         oPropSetRegistry.removePropertySet ( sName )
      End If
   Next I
   
   oPropSetRegistry.dispose
   oStore.dispose
   
End Sub

'_______________________________________________________________________________
' Sorry: menu icon and sub-menues not supported
Function GetSimpleMenuItem( sName As String, sText As String, _
sCommandUrl As String, Optional sHelpUrl As String ) As Object

Dim oPropSet As Object
Dim sInternalName As String

   sInternalName = MNU_PREFIX & sName
   If oPropSetRegistry.hasByName(sInternalName) Then
      oPropSetRegistry.removePropertySet(sInternalName)
   End If
      
   oPropSet = oPropSetRegistry.openPropertySet(sInternalName, True)

   oPropSet.addProperty("Text", 0, sText)
   oPropSet.addProperty("CommandURL", 0, sCommandUrl)

   If Not IsMissing(sHelpUrl) Then
      oPropSet.addProperty("HelpURL", 0, sHelpUrl)
   End If
      
   GetSimpleMenuItem = oPropSet
End Function

sub Test 
msgbox "ciao"
end sub
    
Sub ShowPopup(oExePoint as object)
dim oPopup,oCompWin
Dim aRect 
aRect=CreateUnoStruct("com.sun.star.awt.Rectangle")
    With aRect
      .X = oExePoint.X
      .Y = oExePoint.Y
      .Width = 0
      .Height = 0

    End With
    dim oMenuListener
oMenuListener = CreateUnoListener( _
      "PopupMenuListener_", "com.sun.star.awt.XMenuListener")

    ' new popupmenu
    oPopup = CreateUnoService("com.sun.star.awt.PopupMenu")

    ' set listener and insert menu items

    With oPopup
      .addMenuListener(oMenuListener)
      .insertItem(1,"Menu 1",0,0) 'id, label, type, position
      .insertItem(2,"Menu 2",0,2)
      .insertSeparator(1)
      .setCommand(1,"item1")
      .setCommand(2,"item2")
    End With
oCompWin = ThisComponent.getCurrentController()._
      getFrame().getComponentWindow()
    ' show popup menu
    oPopup.execute(oCompWin,aRect, 0)
    oPopup.removeMenuListener(oMenuListener)
End Sub

 Sub PopupMenuListener_select ( oEv )
 dim sCmd
    sCmd = oEv.Source.getCommand(oEv.MenuId)
    msgbox sCmd
 End Sub

 Sub PopupMenuListener_highlight ( oEv )
 End Sub

 Sub PopupMenuListener_activate ( oEv )
 End Sub

 Sub PopupMenuListener_deactivate ( oEv )
 End Sub

 Sub PopupMenuListener_disposing( oEv )
 End Sub
LibreOffice 3.3.2 su Kubuntu 11.04
Rispondi