Hyperlink-Name auslesen

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Lenu
*******
Beiträge: 1085
Registriert: Sa, 30.10.2004 09:24

Hyperlink-Name auslesen

Beitrag von Lenu »

Hallo
kann man ein Makro schreiben, welches beim Anklicken eines Hyperlinks ausgelöst wird und das dann den Namen (oder alternativ den Text) eben dieses Hyperlinks in eine Variable liest?
Schonmal danke!
gruss, Lenu
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Nach der Frage geht es um einen Text-Hyperlink (und nicht z.B. einen mit einem Bild verknüpften).
Ein Makro was nur startet wenn Du auf den Hyperlink klickst kenne ich nicht.
Da Du jedoch wenn Du auf den Hyperlink klickst auch die aktuelle Selektion änderst, könntest Du dafür einen Listener verwenden.
Mit einem SelectionChangeListener kannst Du ermitteln das sich die Selection geändert hat und dann ein Makro starten welches das Wort unter der aktuellen Selektion darauf prüft ob es einen Hyperlink "beinhaltet". Hierzu müßtest Du wohl zunächst einen virtuellen Text-Cursor erzeugen, den auf den sichtbaren Cursor positionieren, dann mittels virtuellen Cursor vor-zürück-interieren um den gesamten Hyperlink markieren und dann auslesen.
Der Listener ansich ist kein Problem, aber den Rest müßtest Du mal sehen. Es kann nämlich sein das der Weg den ich beschreibe unnötig kompliziert ist, weil es völlig ausreichend sein könnte wenn der Cursor innerhalb des Hyperlinks steht.
Der einzige Schönheitsfehler wäre wohl das Du nicht mehrmals hintereinander auf den Hyperlink klicken darfst in der Weise das Du exakt auf den selben Buchstaben klickst, weil sich ja dann die Selektion nicht ändert.

Wenn das Ereignis nun wirklich nur durch den Hyperlink ausgelöst werden soll, würde ich dafür plädieren ein Makro zu schreiben welches automatisch den Hyperlink als Feldbefehl "Makro ausführen" einfügt und so formatiert das die Schrift so ist wie bei einem Hyperlink. Der Hyperlink müßte dann über den Weg gestartet werden das Makro was dem Feldbefehl zugeordnet ist eine Funktion mit Parameter startet die zum Hyperlinkziel verzweigt. Der Parameter müßte dazu im Dokument geeignet verankert werden (habe ich noch keine konkrete Idee).
Nachteil wäre das Du die Feldhinterlegung beim Hyperlink hast und diese nur für alle oder keinen Feldbefehl abschalten kannst.


Gruß
Stephan
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

ISt es das, wofür man diese Listener braucht?

Ja, genau. Ein Listener wäre jetzt nötig um dieses Makro zu starten. Allerdings müßte der Listener zuerst prüfen, ob da wirklich ein Link ist, weil sonst jedesmal der Text markiert würde egal was da steht. Außerdem müßte ganz zu Anfang geprüft werden ob es überhaupt Text und nicht ein Bild ist. Für diese Prüfung reicht es aber aus z.B. den Fehler abzufangen, der entsteht wenn Du z.B. Zeiger.gotoStartofWord ausführst, was ja bei einer Grafik nicht geht.
Ein Listener wäre im Prinzip so (aus Pitoyak):

Code: Alles auswählen

Global vSelChangeListener
Global vSelChangeBroadCast

Sub StartListeningToSelChangeEvents
  Dim sPrefix$
  Dim sService$
  sPrefix = "sel_change_"
  sService = "com.sun.star.view.XSelectionChangeListener"
  
  REM to register for a selection change, you must register with the
  REM current controller
  vSelChangeBroadCast = ThisComponent.getCurrentController
    
  'create a listener to intercept the selection change events
  vSelChangeListener = CreateUnoListener(sPrefix, sService)
    
  ' register the listener to the document controller
  vSelChangeBroadCast.addSelectionChangeListener(vSelChangeListener)
End Sub

Sub StopListeningToSelChangeEvents
  ' removes the listener
  vSelChangeBroadCast.removeSelectionChangeListener(vSelChangeListener)
End Sub

Sub sel_change_selectionChanged(vEvent)
  Dim vCurrentSelection As Object
   Print "Number of selected areas = " &_
         vCurrentSelection.getSelection().getCount()
End Sub
Zuerst das Dokument laden und dann Sub StartListeningToSelChangeEvents starten. Danach kannst Du klicken in den Text oder auf andere Objekte. Immer wenn sich die Selection ändert kommt hier im Beispiel eine "Meldungsbox" (Print), an dieser Stelle muß nun der Code der den Link auswertet ergänzt werden.
Wenn Du die Auswertung beenden willst, starte StopListeningToSelChangeEvents und alles ist wieder "normal".
Und nun frage ich mich, wie ich einen TextCursor hinkriege, der an der Stelle Text selektiert, an der ich auf den Link klicke.
Indem Du für den virtuellen Cursor:

Code: Alles auswählen

Zeiger = Dok.Text.createTextCursor() 
den sichtbaren verwendest:

Code: Alles auswählen

Zeiger = Dok.CurrentController.getviewCursor()


Übrigens: ich bin nicht Thomas.


Gruß
Stephan
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Ich habe jetzt etwas probiert und es ist so wie ich vermutete, markieren ist überflüssig. Ändere den Code in dem einen Sub so ab:

Code: Alles auswählen

Sub sel_change_selectionChanged(vEvent)
StopListeningToSelChangeEvents
Dim vCurrentSelection As Object
vCurrentSelection =  vEvent.source
Cursor = vCurrentSelection.viewCursor
If Cursor.HyperLinkURL = "" Then
msgbox "kein Link"
Else
msgbox Cursor.HyperLinkURL 
End if
StartListeningToSelChangeEvents
End Sub
Und bei Klick auf einen Hyperlink wird dieser in Msgbox angezeigt.


Gruß
Stephan
Antworten