По клику мыши получить текст [РЕШЕНО]

Автор macros, 2 июня 2010, 20:13

0 Пользователи и 1 гость просматривают эту тему.

macros

Как по клику мыши (или Ctrl+клик) на каком-то слове в документе Writer, запустить макрос и получить текст (этого слова или всего предложения) в переменную?

Есть у кого-то решение, или идеи?

dr.Faust

Получить не проблема.
Вот как запустить макрос по клику мыши, без слушателя, я не представляю...
Свобода информации - свобода личности!

macros

А почему без слушателя? Можно и со слушателем.

Ну, например, так
  click = CreateUnoListener("MyText_", "com.sun.star.awt.XMouseClickHandler")
  thisComponent.currentController.addMouseClickHandler(click)

А как получить текст?

dr.Faust

Цитата: macros от  2 июня 2010, 23:19А как получить текст?
Не совсем понял что именно вызывает трудности?
Из события слушателя - никак.
Для всего остального есть видимый и текстовый курсоры.
Свобода информации - свобода личности!

macros

Из события слушателя запускаем макрос, а в нем уже получаем текст с помощью видимого и текстового курсоров. Я правильно понял?

macros

#5
Все получилось, спасибо.

Рыбка Рио

У меня почему-то офис падает на этом макросе:

REM  *****  BASIC  *****
Dim i_x1 As Integer
Dim click_x1 As Object

Sub Main
i_x1=0
click_x1 = CreateUnoListener("MyText_x1_", "com.sun.star.awt.XMouseClickHandler")
thisComponent.currentController.addMouseClickHandler(click_x1)
End Sub

Sub MyText_x1_mousePressed(evt)
VK = thisComponent.CurrentController.ViewCursor
TK = thisComponent.Text.createTextCursorByRange(VK)
TK.gotoNextWord(FALSE)
TK.gotoPreviousWord(TRUE)
msgbox TK.String
End Sub

Sub MyText_x1_mouseReleased(evt)
i_x1=i_x1+1
If i_x1=10 then thisComponent.currentController.removeMouseClickHandler(click_x1)
End Sub
ubuntu 12.04 + LibO3.6.0

miken


Рыбка Рио

#8
Пример из http://pitonyak.org/AndrewMacro.odt (14.3.7. Example 4: com.sun.star.awt.XMouseClickHandler):

Option Explicit

Global oDocView As Object
Global oMouseClickHandler As Object

Sub RegisterMouseClickHandler
 oDocView = ThisComponent.currentController
 oMouseClickHandler = _
 createUnoListener("MyApp_", "com.sun.star.awt.XMouseClickHandler")
'  writedbginfo oMouseClickHandler
 oDocView.addMouseClickHandler(oMouseClickHandler)
End Sub

Sub UnregisterMouseClickHandler
 on error resume next
 oDocView.removeMouseClickHandler(oMouseClickHandler)
 on error goto 0
End Sub

Sub MyApp_disposing(oEvt)
End Sub

Function MyApp_mousePressed(oEvt) As Boolean
 MyApp_mousePressed = False
End Function

Function MyApp_mouseReleased(oEvt) As Boolean
Dim sMsg As String
 With oEvt
   sMsg = sMsg & "Modifiers = " & .Modifiers & Chr(10)
   sMsg = sMsg & "Buttons = " & .Buttons & Chr(10)
   sMsg = sMsg & "X = " & .X & Chr(10)
   sMsg = sMsg & "Y = " & .Y & Chr(10)
   sMsg = sMsg & "ClickCount = " &  .ClickCount & Chr(10)
   sMsg = sMsg & "PopupTrigger = " & .PopupTrigger '& Chr(10)
   'sMsg = sMsg & .Source.dbg_Methods  
 End With
 
 ThisComponent.text.string = sMsg
 
 MyApp_mouseReleased = False
End Function


Работает.
ubuntu 12.04 + LibO3.6.0

Рыбка Рио

Вот решение:

Global oDocView As Object
Global oMouseClickHandler As Object
Global ix12 As Integer

Sub RegisterMouseClickHandler
 oDocView = ThisComponent.currentController
 oMouseClickHandler = _
 createUnoListener("MyApp_", "com.sun.star.awt.XMouseClickHandler")
'  writedbginfo oMouseClickHandler
 oDocView.addMouseClickHandler(oMouseClickHandler)
End Sub

Sub UnregisterMouseClickHandler
 on error resume next
 oDocView.removeMouseClickHandler(oMouseClickHandler)
 on error goto 0
End Sub

Sub MyApp_disposing(oEvt)
End Sub

Function MyApp_mousePressed(oEvt) As Boolean
 MyApp_mousePressed = False
 ix12=0
End Function

Function MyApp_mouseReleased(oEvt) As Boolean
If oEvt.ClickCount=1 and ix12=0 then
   VK = oDocView.ViewCursor
   TK = thisComponent.Text.createTextCursorByRange(VK)
   TK.gotoNextWord(FALSE)
   TK.gotoPreviousWord(TRUE)
   MyApp_mouseReleased = False
   msgbox TK.String
   ix12=1
Endif
End Function


Можно поменять значение ClickCount на 2, 3 ... и тогда действие будет выполняться по двойному, тройному, ... клику .
ubuntu 12.04 + LibO3.6.0

convas


Не показывает последнее слово абзаца.

Рыбка Рио

Цитата: convas от  4 июня 2010, 00:06

Не показывает последнее слово абзаца.

Да, конечно, просто нужно заменить оказывается строчки:

   TK.gotoNextWord(FALSE)
   TK.gotoPreviousWord(TRUE)


на строчки:
   TK.gotoStartOfWord(FALSE)
   TK.gotoEndOfWord(TRUE)

ubuntu 12.04 + LibO3.6.0

convas

#12
Цитата: macros от  2 июня 2010, 20:13
или Ctrl+клик

Можно ли еще добавить проверку на нажатую клавишу (CTRL или ALT)?

Сам себе отвечаю:

Можно, через "com.sun.star.awt.XKeyHandler".