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.