[Résolu] [Calc] Ouvrir une URL dans le navigateur par défaut

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
Cormic2
NOOuvel adepte
NOOuvel adepte
Messages : 23
Inscription : 18 juil. 2024 23:21

[Résolu] [Calc] Ouvrir une URL dans le navigateur par défaut

Message par Cormic2 »

Bonjour,
Dans un fichier Calc, j'ai besoin d'ouvrir automatiquement une URL quelqconque dans le navigateur par défaut de mes utilisateurs (je n'ai pas de contrôle sur leurs OS ni sur leurs navigateurs).
J'ai échoué à utiliser la commande Shell, sauf sur Linux Ubuntu ( Shell("xdg-open https://....") fonctionne, mais je ne sais pas si elle fonctionne sur toutes les distributions Linux). De plus je n'ai pas réussi l'équivalent Windows (start ... sous cmd.exe). Et je n'ai pas de MacOS à ma disposition.

J'ai alors eu l'idée d'utilier un hyperlink LibreOffice, qui fait cela très bien.
Malheureusement, il faut normalement cliquer explicitement sur la cellule contenant l'hyperlink pour le déclencher, ce qui ne correspond pas à mon besoin d'automaticité.
Comme je n'ai pas trouvé de solution pour le déclencher directement depuis une macro [et que, débutant sous LibreOffice je ne recule devant rien pour approfondir mes connaissances :-)) ], j'ai fait une réalisation en simulant l'envoi d'un clic dans une cellule à l'aide d'un MouseEvent forgé, au prix d'un certain nombre de contorsions pas toujours élégantes, mais qui m'ont permis d'explorer les structures de fenêtres et les conversions d'unité.

Le résultat fonctionne apparemment sans problème sous Windows et Linux chez tous mes utilisateurs, mais j'aimerais mieux avoir un solution moins bricolée. Si quelqu'un a des lumières là-dessus, soit en commande directe, soit pour déclencher simplement un hyperlink, je lui en serais reconnaissant.

A titre d'info - pour les curieux - je joins un fichier de démo (largement commenté) illustrant ma solution actuelle, avec envoi de mouseEvent forgé sur une cellule pour simuler un clic.

Cordialement
Cormic
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par Oukcha le 03 août 2024 20:08, modifié 2 fois.
Raison : Balise en tête de titre
LibreOffice 24.2.5.2 sous Windows 10
Avatar de l’utilisateur
micmac
RespOOnsable forum
RespOOnsable forum
Messages : 10046
Inscription : 28 août 2010 08:45

Re: Ouvrir une URL dans le navigateur par défaut

Message par micmac »

Bonjour et bienvenue,

Cette section a des règles très précises que vous devez obligatoirement suivre pour obtenir de l'aide. C'est indiqué dans le cadre rouge en haut de la page.

Il est demandé aux auteurs de faire précéder le titre de leur question d'une balise adéquate. Ce balisage est extrêmement important car il permet d'avoir une base de connaissance optimum en cas de recherche.
Avez-vous remarqué comment étaient postées les autres questions ?

Lisez ce fil pour savoir quelle balise utiliser : sutra27295.html#27295

Nous l'avons fait pour vous cette fois-ci mais lors de votre prochaine question, nous vous remercions de le faire vous-même au risque de voir votre sujet verrouillé.

Merci de votre collaboration.
Touche Ctrl de Windows = touche cmd⌘ sur Mac
OpenOffice > Outils > Options sur Windows = OpenOffice > Préférences sur macOS
Cormic2
NOOuvel adepte
NOOuvel adepte
Messages : 23
Inscription : 18 juil. 2024 23:21

Re: [Calc] Ouvrir une URL dans le navigateur par défaut

Message par Cormic2 »

Bonjour,
Merci pour ce balisage, et désolé pour cet oubli (c'est mon premier post).
J'y serai attentif pour les suivants.
Cordialement.
LibreOffice 24.2.5.2 sous Windows 10
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 26177
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] Ouvrir une URL dans le navigateur par défaut

Message par Dude »

Salut,

Pas besoin de macro pour faire ça. Le dialogue Insertion > Hyperlien permet de créer le bouton :
capture.png
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Cormic2
NOOuvel adepte
NOOuvel adepte
Messages : 23
Inscription : 18 juil. 2024 23:21

Re: [Calc] Ouvrir une URL dans le navigateur par défaut

Message par Cormic2 »

Bonsoir,
Merci pour cette suggestion, malheureusement cette solution ne me convient pas.
Le bouton ouvrant l'URL dans mon exemple n'est là que pour que l'exemple soit facile à utiliser, sans le compliquer encore par du code supplémentaire.

Dans mon application réelle, les URL ne sont pas ouvertes via des boutons, mais sont construites et ouvertes à la volée dans des macros associées à différents menus "custom" qui font d'autres choses en plus de l'affichage dans le navigateur.
Cordialement
Cormic
LibreOffice 24.2.5.2 sous Windows 10
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 26177
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] Ouvrir une URL dans le navigateur par défaut

Message par Dude »

Cormic2 a écrit : 02 août 2024 17:01 Dans mon application réelle, les URL ne sont pas ouvertes via des boutons
Alors pourquoi fournir un document qui ne correspond pas au problème ?
Cormic2 a écrit : 02 août 2024 17:01des macros associées à différents menus "custom" qui font d'autres choses en plus de l'affichage dans le navigateur.
Merci d'exposer clairement l'objectif et éviter ainsi le problème XY.
Parce que je ne vois pas comment Calc pourrait piloter un navigateur qui peut être différent suivant les OS.
Cormic2
NOOuvel adepte
NOOuvel adepte
Messages : 23
Inscription : 18 juil. 2024 23:21

Re: [Calc] Ouvrir une URL dans le navigateur par défaut

Message par Cormic2 »

Bonsoir,
Je suis désolé si ma présentation vous a induit en erreur. Je croyais que mon texte était assez clair, mais il était certainementperfectible.
Mon objectif est bien de pouvoir ouvrir une URL quelconque (dymanique) dans le navigateur par défaut de l'utilisateur, depuis le code d'une macro Basic.

Mon application finale est relativement complexe. Elle utilise une barre de menus dynamique entièrement "custom" qui remplace la barre LibreOffice, avec certaines macros associées qui doivent ouvrir des URL au cours de leur traitement, ces URL étant construites dynamiquement par lesdites macros.

Croyant suivre les conseils prodigués dans les règles d'utilisation du forum, j'ai voulu simplifier le code exemple en ne conservant que la partie pertinente pour ma question, pour montrer comment je forge un MouseEvent pour activer un hyperlink Calc. Et il m'a semblé que le plus simple était de mettre un bouton pour lancer l'opération. Mais il n'y a pas de tel bouton dans l'appli finale.

Ledit exemple, fonctionnel, démontre qu'il est possible, depuis Calc, d'ouvrir le navigateur par défaut, quel qu'il soit, sur Windows ou Linux, et probablement aussi sur MacOs (ce que je ne peux pas tester n'ayant pas de machine Apple). D'ailleurs, c'est bien le rôle d'un hyperlink.
Mais la lecture des commentaires dans le code de cet exemple montre aussi que cette approche repose sur une recherche des coordonnées du point de clic assez tordue, et un bricolage pour sauver et restituer une cellule déjà utilisée du tableur.

Je suppose donc - d'où ma question - qu'il pourrait y avoir plus simple et plus élégant, soit par une commande Shell (bien qu'il semble également délicat de distinguer correctement tous les OS) ou en exécutant l'hyperlien sans avoir à cliquer dessus. Ou toute autre approche à laquelle je n'ai pas pensé ...

Cordialement
Cormic
LibreOffice 24.2.5.2 sous Windows 10
JPL
Membre lOOyal
Membre lOOyal
Messages : 39
Inscription : 17 mars 2012 10:16

Re: [Calc] Ouvrir une URL dans le navigateur par défaut

Message par JPL »

Le code suivant peut faire l'affaire:

Code : Tout sélectionner

Sub OpenURL(URL As String)
Dim session As Object
     GlobalScope.BasicLibraries.loadLibrary("ScriptForge")
     session = CreateScriptService("Session")
     session.OpenURLInBrowser(URL)
End Sub
Voir à ce sujet https://help.libreoffice.org/latest/en- ... LInBrowser
Kubuntu 22.04 / LibO 25.2
Access2Base (LibO).
BaseDocumenter extension (LibO)
ScriptForge (LibO) - Documentation on https://help.libreoffice.org/latest/en- ... bPAR=BASIC
Cormic2
NOOuvel adepte
NOOuvel adepte
Messages : 23
Inscription : 18 juil. 2024 23:21

Re: [Calc] Ouvrir une URL dans le navigateur par défaut

Message par Cormic2 »

Bonjour,
Merci pour cette solution, qui est évidemment infiniment plus élégante que mon approche initiale.

J'ai cependant une inquiétude, car j'avais renoncé à utiliser la bibliothèque ScriptForge après avoir constaté que son chargement induisait un bug dans l'API UNO, comme le montre le code ci-dessous.
J'ai signalé ce bug sur https://bugs.documentfoundation.org (ID=162094), mais il n'a apparemment pas (encore) été étudié.

Il faudra donc que je teste l'inocuité de la solution dans mon application. Et si elle n'est pas applicable en l'état, que je me mette à Python pour utiliser directement dans un script embarqué le module (https://docs.python.org/3/library/webbrowser.html) qu'utilise ScriptForge. Comme je n'ai jamais fait de script Python, j'espère que l'on peut les exécuter sans installation préalable, car je ne maitrise pas l'installation de mes utilisateurs et ne peut pas leur demander d'installer quoi que ce soit, sinon LibreOffice de base.

Et peut être qu'il y aun équivalent Java, qui ne nécessite pas d'installation particulière ....
Cordialement
Cormic

Code : Tout sélectionner

Sub Test
	doc = ThisComponent
    
	'Si la bibliothèque ScriptForge n'est pas chargée, la variable "properties"
	'ci-dessous est un tableau de 15 objets com.sun.star.beans.Property.
	'C'est le fonctionnement normal attendu de l'appel  propSet.getProperties()
	'
	'Par contre, une fois la bibliothèque ScriptForge chargée, l'appel renvoie
	'dans "properties" un tableau de 5 Strings
	'      "sfCR", "sfCRLF", "srLF", "sfNEWLINE", "sfTAB"
	'et ce bug perdure tant que LibreOffice n'est pas relancé.
	'
	'Pour provoquer le bug, il suffit de décommenter la ligne ci-dessous.
'     OpenURL("https://www.lemonde.fr")

	URL         = "file:///C:/Users/Public"
	ucbBroker   = CreateUnoService("com.sun.star.ucb.UniversalContentBroker")
	fileID      = ucbBroker.createContentIdentifier(URL)
	ucbContent  = ucbBroker.queryContent(fileID)         'com.sun.star.ucb.FileContent
	

	Dim command as new com.sun.star.ucb.Command
	command.Name     = "getPropertySetInfo"
	command.Argument = Nothing
	propSet          = ucbContent.execute(command, 0, Nothing) 'com.sun.star.beans.XPropertySetInfo
	properties       = propSet.getProperties()                 'Array de structures com.sun.star.beans.Property
	
	MsgBox("Number of Properties : " & (UBOUND(properties)+1))
End Sub
Sub OpenURL(URL As String)
Dim session As Object
     GlobalScope.BasicLibraries.loadLibrary("ScriptForge")
     session = CreateScriptService("Session")
     session.OpenURLInBrowser(URL)
End Sub
LibreOffice 24.2.5.2 sous Windows 10
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 26177
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] [Résolu] Ouvrir une URL dans le navigateur par défaut

Message par Dude »

Je ne vois toujours pas l'intérêt de tout le pataquès de code que tu as pondu :

Code : Tout sélectionner

'==============================================================================
' Utilisation d'un hyperlink pour ouvrir une URL dans le navigateur par défaut
'
' par Cormic (m_co@orange.fr)
'
' Objectif : ouvrir une URL quelconque par macro
'
' Solution hyper simple sous Linux Ubuntu :
'    Shell("xdg-open https://www.lemonde.fr")
' MAIS
'  - est-ce que ça marche pour toutes les distributions ?
'  - je n'ai pas réussi à faire l'équivalent Windows 
'    (avec C:\Windows\System32\cmd.exe start https://www.lemonde.fr")
'  - je ne connais pas l'équivalent MacOS
'  - l'identification précise de l'OS ne semble pas triviale

' N'ayant pas réussi à le faire via lancement d'une commande externe, j'ai
' utilisé un hyperlink LibreOffice.
' (Les hyperlinks permettent d'ouvrir une page Web dans le navigateur par défaut)
'
' 'Ce module de démo fonctionne sous Windows et sous Linux, au prix d'un horrible
'  bricolage qui n'est pas forcément rassurant.
'
' Utilisation "classique" d'un hyperlink :
'  - Un hyperlink contenu dans une cellule est activé par Ctrl-clic sur la cellule
'  - la variable de configuration de LibreOffice "HyperlinksWithCtrlClick"
'    (dans "/org.openoffice.Office.Common/Security/Scripting")
'    permet (si False) d'autoriser l'activation par un clic simple.
'    Sa valeur par défaut est True, pour éviter les activations intempestives.
'
' Utilisation dans ce module de démo
'	 J'utilise la première cellule visible sur l'écran pour placer un hyperlink
'    (avec sauvegarde préalable et reconstruction ensuite).
'    Malgré des heures de recherche, je n'ai pas trouvé de moyen simple pour
'    activer directement un hyperlink depuis une macro. Je procède donc en simulant 
'    (grace au com.sun.star.awt.Toolkit) l'envoi d'un clic sur la cellule de l'hyperlink.
'
'    Problèmes :
'     - ça ne marche pas avec un Ctrl-clic, seulement avec un clic simple.
'		=> il faut modifier la variable de configuration "HyperlinksWithCtrlClick"
'          et la rétablir ensuite dans son état initial.
'	  - les coordonnées du clic doivent être en pixels dans le repère de la
'       fenêtre concernée, mais les coordonnées des cellules sont en centièmes de mm,
'       et ne sont pas dans le même repère. (la cellule A1 a les coordonnées (0 mm,0 mm) dans
'       sheetCell.Position, mais n'est pas en position (0 pix, 0 pix) dans la fenêtre
'       à cause des entêtes, barres d'outils diverses, etc.)
'       Je n'ai pas trouvé (toujours après des heures de recherche) de fonction
'       de changement de repère, et j'ai donc dû bricoler par analyse de toutes
'       les sous-fenêtres de la "Component Window", avec un peu de divination.
'
' Fonctions publiques :
' - FollowHyperlink       : affiche une page (URL) dans le navigateur par défaut

' Fonctions privées :
' - GetCellOffsetInWindow : calcul de l'offset en pixels de la première cellule de la fenêtre
' - GetCellRectangle      : détermine les coordonnées en pixels d'une cellule
' - SetHyperlinkMode      : modifie la variable de configuration "HyperlinksWithCtrlClick"
'==============================================================================
Option Explicit     'Impose la déclaration des variables
Option Base 0       'L'index des tableaux démarre à 0

PRIVATE CONST THIS_MODULE = "HyperlinkModule"
PRIVATE CONST TEST_URL    = "https://www.lemonde.fr"

'==============================================================================
' Procédure de test
'==============================================================================
Public Sub  main()
	FollowHyperlink (TEST_URL)	
End Sub

'==============================================================================
' Ouvre une URL dans le navigateur par défaut
' On utilise la première cellule visible pour placer temporairement un hyperlink
' que l'on active en simulant un clic.
'==============================================================================
Public Sub FollowHyperlink (url as String)
	On Local Error GoTo ERR	
	Dim controller as Object, window as Object, spreadsheet as Object
	
	controller  = thisComponent.getCurrentController()   'com.sun.star.sheet.SpreadsheetView
	window      = controller.getFrame().getComponentWindow()
	spreadsheet = controller.getActiveSheet()            'com.sun.star.sheet.Spreadsheet
	
	'On utilise la première cellule visible pour placer l'hyperlien
	'--------------------------------------------------------------
	Dim firstCol as Long, firstRow as Long, cell as Object
	firstCol = controller.getFirstVisibleColumn()
	firstRow = controller.getFirstVisibleRow()
	cell     = spreadsheet.getCellByPosition(firstCol, firstRow)  'com.sun.star.sheet.SheetCell
	
	'Sauvegarde du contenu de la cellule
	'-----------------------------------
	Dim CT as Object, cellType as Long, cellContent as Variant
	CT       = com.sun.star.table.CellContentType
	cellType = cell.CellContentType
	Select case cell.CellContentType
		case CT.VALUE
			cellContent = cell.getValue()
		case CT.TEXT
			cellContent = cell.getString()
		case CT.FORMULA
			cellContent = cell.FormulaLocal
		case ELSE ' CT.EMPTY
	End Select

	'Sauvegarde du format de la cellule
	'La couleur du texte est forcée à celle du fond
	'=> le texte associé à l'hyperlink sera invisible
	'Le clic sera envoyé dans le coin en haut/gauche de la cellule
	'=> L'alignement du texte est modifié pour être sous le clic
	'----------------------------------------------------------
	Dim HJ as Object, VJ as Object
	Dim horiJustify as Long, vertJustify as Long
	Dim backColor as Long, charColor as Long
	HJ = com.sun.star.table.CellHoriJustify
	VJ = com.sun.star.table.CellVertJustify
	
	horiJustify = cell.HoriJustify : cell.HoriJustify = HJ.LEFT
	vertJustify = cell.VertJustify : cell.VertJustify = VJ.TOP
	backColor   = cell.CellBackColor
	charColor   = cell.CharColor
	If backColor = -1 Then : cell.CharColor = &H00FFFFFF
	Else                   : cell.CharColor = backColor
	End If
	
	'Ecriture de l'hyperlink dans la cellule
	'---------------------------------------
	cell.FormulaLocal="=LIEN.HYPERTEXTE(""" & Url & """;""XXXXXXXXXXXX"")"	
	
	'Envoi du clic dans la cellule
	'-----------------------------
	Dim toolkit as Object, rectangle as Object, offset as Object
	Dim event As New com.sun.star.awt.MouseEvent
	
	toolkit     = window.getToolkit()
	offset      = GetCellOffsetInWindow(window)
	rectangle   = GetCellRectangle(cell, window)
	 
	event.Source       = window
	event.ClickCount   = 1
	event.PopupTrigger = False
	event.Modifiers	   = 0       'com.sun.star.awt.KeyModifier.
	event.Buttons	   = 1       'bouton gauche
	event.X     	   = offset.X + 10
	event.Y            = offset.Y + 10

	'Si un EnhancedClickHandler est installé, il met le bazar
	'Il doit recevoir un XEnhancedClickHandler => LibreOffice modifie mon event
	'en ajoutant un event.Target qui est la SheetCell visée. Les traitements
	'internes à LibreOffice font que la fenêtre reste en attente de sélection
	'd'un Range que l'on ne parvient à arrêter qu'en cliquant réellement sur 
	'la cellule visée.
	'=> le comportement de LibreOffice étant une boîte noire complexe,
	'   la seule solution que j'ai trouvée est de désactiver temporairement le
	'   Handler pour avoir une exécution correcte
	'--------------------------------------------------------------------------
	Dim hyperlinkMode as Boolean
'    controller.removeEnhancedMouseClickHandler(gEnhancedClickHandler)	
    hyperlinkMode = SetHyperlinkMode(False)
    
	toolkit.mousePress(event)      'envoi du click dans la cellule
	toolkit.mouseRelease(event)

    Wait 1000               'millisecondes (bricolage pifométrique)
    SetHyperlinkMode(hyperlinkMode)
'    controller.addEnhancedMouseClickHandler(gEnhancedClickHandler)
    
    'Reconstruction de la cellule
    '----------------------------
	Select case cellType
		case CT.VALUE
			cell.setValue(cellContent)
		case CT.TEXT
			cell.setString(cellContent)
		case CT.FORMULA
			 cell.FormulaLocal = cellContent
		case ELSE ' CT.EMPTY
			cell.FormulaLocal=""
	End Select
	cell.HoriJustify   = horiJustify
	cell.VertJustify   = vertJustify
	cell.CellBackColor = backColor
	cell.CharColor     = charColor
Exit Sub
ERR: ErrorHandler(THIS_MODULE)
End Sub

'==============================================================================
' Calcul de l'offset de la pemière cellule visible dans la "Component Window"
'
' paramètre :
'  - componentWindow : DOIT être la "Component Window" de la Frame active
' retour :
'  - un com.sun.star.awt.Point contenant les coordonnées du coin haut/gauche de
'    la première cellule visible dans la "Component Window"
'    Les coordonnées sont en pixels
'
' On procède en deux étapes :
' 1/ on cherche la plus grande sous-fenêtre de la "Component Window"
' 2/ Dans cette sous-fenêtre, on cherche la plus grande sous-sous fenêtre
'    qui est celle contenant les cellules
'
' Le principe de la recherche étant un bricolage divinatoire, une exception
' est générée si l'algorithme échoue, ce qui interrompt l'éxécution de la macro en cours.
'==============================================================================
Private Function GetCellOffsetInWindow(componentWindow as Object) as Object
	On Local Error GoTo ERR	
	Dim silent as Boolean
	silent = False
	
	Dim window as Object, windows() as Object, window_size as Object
	Dim J as Long, Wmin as Long, Hmin as Long, mainIndex as Long
	Dim offsetPoint as new com.sun.star.awt.Point

    'coordonnées en Pixels de la "Component Window" dans la "Container Window"
    '-------------------------------------------------------------------------
    window_size = componentWindow.getPosSize()	'com.sun.star.awt.Rectangle
	
	'La "Component Window" contient des sous-fenêtres (barres d'outils, ...)
	'On cherche la sous-fenêtre principale (celle dont la taille est > à 1/4 de la fenêtre)
	'--------------------------------------------------------------------------------------
   	Wmin      = CLng(window_size.Width  / 2)
   	Hmin      = CLng(window_size.Height / 2)
    windows   = componentWindow.getWindows()   'com.sun.star.XVclContainer Interface
   	mainIndex = -1
	for J = 0 To UBound(windows)
   		window      = windows(J)
   		window_size = window.getPosSize()
	    If (window_size.Width > Wmin) AND ( window_size.Height > Hmin) Then
	    	If (mainIndex = -1) Then
	            mainIndex = J
	        Else
	        	MsgBox("Echec du calcul de l'offset des cellules dans la fenêtre." & CHR(10) & _
	        	       "Plusieurs sous-fenêtres plausibles sont trouvées dans la ""Component Window""")
	        	silent = True : Log(0) 'Exception : arrêt de l'éxécution
	        End If
	    End If
	Next J
	If (mainIndex = -1) Then
		MsgBox("Echec du calcul de l'offset des cellules dans la fenêtre." & CHR(10) & _
	       	   "Aucune sous-fenêtre plausible n'est trouvée dans la ""Component Window""")
		silent = True : Log(0) 'Exception : arrêt de l'éxécution
	End If
	window        = windows(mainIndex)
	window_size   = window.getPosSize()	'coordonnées en Pixels dans la "Component Window"
	offsetPoint.X = window_size.X
	offsetPoint.Y = window_size.Y
	
	'La sous fenêtre trouvée contient des sous-sous fenêtres (ascenseurs, barre de formule, ...)
	'On cherche la plus grande, qui contient les cellules.
	'--------------------------------------------------------------------------------------
   	Wmin      = CLng(window_size.Width  / 2)
   	Hmin      = CLng(window_size.Height / 2)
   	windows   = window.getWindows()
   	mainIndex = -1
	for J = 0 To UBound(windows)
   		window      = windows(J)
   		window_size = window.getPosSize()
	    If (window_size.Width > Wmin) AND ( window_size.Height > Hmin) Then
	    	If (mainIndex = -1) Then
	            mainIndex = J
	        Else
	        	MsgBox("Echec du calcul de l'offset des cellules dans la fenêtre." & CHR(10) & _
	        	       "Plusieurs emplacements plausibles pour les cellules sont trouvés dans la ""Component Window""")
	        	silent = True : Log(0) 'Exception : arrêt de l'éxécution
	        End If
	    End If
	Next J
	If (mainIndex = -1) Then
		MsgBox("Echec du calcul de l'offset des cellules dans la fenêtre." & CHR(10) & _
	       	   "Aucun emplacement plausible n'est trouvé pour les cellules dans la ""Component Window""")
		silent = True : Log(0) 'Exception : arrêt de l'éxécution
	End If
	window        = windows(mainIndex)
	window_size   = window.getPosSize()	'coordonnées en Pixels dans la sous-fenêtre
	offsetPoint.X = offsetPoint.X + window_size.X
	offsetPoint.Y = offsetPoint.Y + window_size.Y
		
	GetCellOffsetInWindow() = offsetPoint
Exit Function
ERR: ErrorHandler(THIS_MODULE, silent)
End Function

'==============================================================================
' Coordonnées d'une cellule
' - cell   : la cellule dont on veut les coordonnées
' - window : une fenêtre contenant la cellule
' 
' Renvoie un com.sun.star.awt.Rectangle correspodant à la cellule
'         Les unités sont des Pixels
'==============================================================================
Private Function GetCellRectangle(cell as Object, window as Object) as Object
	On Local Error GoTo ERR	
	Dim cellPoint as Object, cellSize as Object, pixPoint as Object
	Dim pixSize   as new com.sun.star.awt.Point
	Dim rectangle as new com.sun.star.awt.Rectangle
	
	cellPoint = cell.Position   'en 1/100 mm
	cellSize  = cell.Size       'en 1/100 mm
	pixSize.X = cellSize.Width  'conversion Size -> Point
	pixSize.Y = cellSize.Height
	
	'Conversions d'unités
	'--------------------
	pixPoint  = window.convertPointToPixel(cellPoint, com.sun.star.util.MeasureUnit.MM_100TH)		
	pixSize   = window.convertPointToPixel(pixSize,   com.sun.star.util.MeasureUnit.MM_100TH)		

	With rectangle
		.X      = pixPoint.X
		.Y      = pixPoint.Y
		.width  = pixSize.X
		.height = pixSize.Y
	End With

	getCellRectangle() = rectangle
Exit Function
ERR: ErrorHandler(THIS_MODULE)
End Function

'==============================================================================
' Contrôle de la configuration des hyperlinks
'  - withCtrlClick : valeur souhaitée de la variable de configuration
'                    /org.openoffice.Office.Common/Security/Scripting[HyperlinksWithCtrlClick]
'                   True  => l'hyperlink s'active par Ctrl-Clic
'                   False => l'hyperlink s'active par Clic simple
'  - renvoie la valeur précédente de la variable
'==============================================================================
Private Function SetHyperlinkMode(withCtrlClick as Boolean) as Boolean
	On Local Error GoTo ERR	
	Dim context as Object, configProvider as Object, configAccess as Object
	Dim formerValue as Boolean
	
	'Accès au "DefaultContext" :
	'    Named Container qui regroupe tous les services singletons de LibreOffice
	'Peut aussi s'obtenir par :
	'  context = GetProcessServiceManager().getPropertyValue("DefaultContext")
	'-----------------------------------------------------------------------------
	context = GetDefaultContext()
	
	'Accès au singleton theDefaultProvider qui donne accès à la configuration de LibreOffice
	'Implémente les services : com.sun.star.configuration.ConfigurationAccess
	'                       et com.sun.star.configuration.ConfigurationUpdateAccess
	'--------------------------------------------------------------------------------------------
	configProvider = context.getByName("/singletons/com.sun.star.configuration.theDefaultProvider")
	
    'Accès en "update" sur le répertoire de la variable "HyperlinksWithCtrlClick"
	'----------------------------------------------------------------------------
	Dim args(0) as new com.sun.star.beans.PropertyValue
	args(0).Name  = "nodepath"
	args(0).Value = "/org.openoffice.Office.Common/Security/Scripting"
	
	configAccess = configProvider.createInstanceWithArguments("com.sun.star.configuration.ConfigurationUpdateAccess", args)
	
	'Update de la variable
	'---------------------
	formerValue = configAccess.getPropertyValue("HyperlinksWithCtrlClick")
	configAccess.setPropertyValue("HyperlinksWithCtrlClick", withCtrlClick)
	configAccess.commitChanges()
	
	SetHyperlinkMode() = formerValue
Exit Function
ERR: ErrorHandler(THIS_MODULE)
End Function
'==============================================================================
' Handler de gestion des erreurs
' Appelé dans les gestionnaires d'erreur des fonctions
' Affiche l'emplacement et la nature de l'exception rencontrée.

' Paramètre : 
'    - module : le nom du module de la fonction qui appelle ce handler 
'    - silent : paramètre optionnel. S'il est présent et TRUE, aucun message n'est affiché
' Pas de retour : la macro en cours d'éxécution est interrompue
'
' Le paramètre "silent" permet d'interrompre la macro en cours sans afficher
' les informations sur l'exception rencontrée.
' Utilisé dans certaines fonctions pour interrompre l'éxécution en cas d'erreur fatale.
' Ces fonctions affichent un message d'erreur (via MsgBox), puis provoquent une exception
' en mode "silent" par appel de Log(0)
'==============================================================================
Public Sub ErrorHandler (module as String, Optional silent as Boolean)
    Dim errCode as Long, message as String, ligne as Long, display as Boolean
    display = True
    If (Not IsMissing(silent)) Then
        If silent Then : display = false : End If
    End If
    If display Then
	    errCode = Err
	    message = Error
	    ligne   = Erl
	    MsgBox "Erreur dans le module " & module & CHR(10) &_
	           "Erreur : " & message & CHR(10) &_
	           "ErrCode : " & errCode & " line : " & ligne
    End If
    thisComponent.unlockControllers()
    Stop   'Arrêt de l'éxécution
End Sub
L'exécution d'un hyperlien peut se faire simplement avec le service c.s.s.system.SystemShellExecute

Code : Tout sélectionner

Sub Main
	sURL = "https://forum.openoffice.org/fr"
	oShell = createUNOService("com.sun.star.system.SystemShellExecute")
	oShell.execute(sURL, "", 1)
End Sub
NB : [Résolu] se place au début du titre pour des raisons évidentes de lisibilité.
Cormic2
NOOuvel adepte
NOOuvel adepte
Messages : 23
Inscription : 18 juil. 2024 23:21

Re: [Calc] [Résolu] Ouvrir une URL dans le navigateur par défaut

Message par Cormic2 »

Bonjour,
L'intérêt : bien sûr aucun, si l'objectif est d'écrire un code efficace et élégant. C'est bien pour cela que j'ai demandé de l'aide.
J'avais bien indiqué que l'exemple de code était "pour les curieux", en précisant dans les commentaires qu'il s'agit d'un "horrible bricolage".

Mais comme je l'ai aussi indiqué dans ma question, je débute sous LibreOffice et cela m'a permis de me familiariser avec l'environnement et l''API UNO. Bien que je ne sois pas un perdreau de l'année en programmation, j'ai trouvé la courbe d'apprentissage plutôt raide, et ce "pataquès" m'a permis de fureter à des tas d'endroits et de commencer à me sentir un peu plus à l'aise. J'avais d'ailleurs repéré le service SystemShelExecute, mais j'avais lu un peu vite la doc, et je m'étais bêtement obstiné à passer un chemin d'éxécutable en paramètre. Merci de m'avoir indiqué qu'il suffit de passer une URL.

Cordialement
Cormic

PS : je n'ai pas compris la remarque "[Résolu] se place au début du titre pour des raisons évidentes de lisibilité". Je croyais que c'était ce que j'avais fait. Ou est-ce qu'il aurait fallu écrire [Résolu] [Calc] ?
LibreOffice 24.2.5.2 sous Windows 10