Макрос для draw

Автор vitalukalo, 5 мая 2021, 13:15

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

vitalukalo

Добрый день. Появилась нужда по двойному щелчку мыши менять цвет заливки.
Нашел в интернете чудный код. Но он для отпускания клавиши MouseOnClick_mouseReleased
а как узнать, что это был двойной щелчок? Подскажите...
REM Глобальные переменные
Public oMouseClickHandler

REM Начать слушать события от мышки
Sub RegisterMouseClickHandler
  oMouseClickHandler =  createUnoListener("MouseOnClick_", "com.sun.star.awt.XMouseClickHandler")
  ThisComponent.getCurrentController().addMouseClickHandler(oMouseClickHandler)
End Sub

REM Остановить слушание
Sub UnregisterMouseClickHandler
On Error Resume Next
ThisComponent.getCurrentController().removeMouseClickHandler(oMouseClickHandler)
On Error GOTO 0
End Sub

REM Хоть эта процедура ничего не делает, но реализацию метода предоставить обязаны
Sub MouseOnClick_disposing(oEvt)
End Sub

REM Кнопка нажата
Function MouseOnClick_mousePressed(oEvt) As Boolean
REM Можно обрабатывать событие в этот момент
REM Но лучше (так считается) в момент отпускания кнопки
MouseOnClick_mousePressed = False
End Function
REM Кнопка отпущена
Function MouseOnClick_mouseReleased(oEvt as object) As Boolean
MouseOnClick_mouseReleased = False    ' Разрешить офису другие обработки этого события

oComp = StarDesktop.getCurrentComponent().CurrentSelection(0)
On Local Error GoTo NODOCUMENTTYPE
If oComp.FillColor = RGB(255, 0, 0) Then
oComp.FillColor = RGB(0, 255, 0)
else
oComp.FillColor = RGB(255, 0, 0)
endif
NODOCUMENTTYPE:
End Function

vitalukalo

#1
Всем спасибо. Решил. Как бы еще убрать стандартное редактирование текста внутри фигуры при двойном щелчке.

mikekaganski


Function MouseOnClick_mouseReleased(oEvt as object) As Boolean
 MouseOnClick_mouseReleased = False
 if (oEvt.ClickCount > 1) then
   oComp = StarDesktop.getCurrentComponent().CurrentSelection(0)
   On Local Error GoTo NODOCUMENTTYPE
   If oComp.FillColor = RGB(255, 0, 0) Then
     oComp.FillColor = RGB(0, 255, 0)
   else
     oComp.FillColor = RGB(255, 0, 0)
   endif
 endif
NODOCUMENTTYPE:
End Function


Если нужно строго двойной щелчок (скажем, не реагировать на третий), то нужно заменить if (oEvt.ClickCount > 1) на if (oEvt.ClickCount = 2).
С уважением,
Михаил Каганский

mikekaganski

Цитата: vitalukalo от  5 мая 2021, 13:43
Как бы еще убрать стандартное редактирование текста внутри фигуры при двойном щелчке.

Запретите офису другие обработки этого события (см. комментарий в строке присвоения возвращаемого значения функции MouseOnClick_mouseReleased). Нужно делать это только если замена цвета была успешной. Правда, при этом появится другой побочный эффект - если двинуть мышь сразу после двойного щелчка, фигура потянется следом.
С уважением,
Михаил Каганский

vitalukalo

Спасибо
ЦитироватьПравда, при этом появится другой побочный эффект - если двинуть мышь сразу после двойного щелчка, фигура потянется следом.
Я ж об этом.

mikekaganski

Цитата: vitalukalo от  5 мая 2021, 15:45Я ж об этом.

Хе, это довольно трудно - догадаться, что

Цитата: vitalukalo от  5 мая 2021, 13:43
Как бы еще убрать стандартное редактирование текста внутри фигуры при двойном щелчке.

на самом деле значит "Я на самом деле знаю как убрать стандартное редактирование текста, и мой вопрос вовсе не о том, как убрать стандартное редактирование текста, а о том, что есть такой побочный эффект у моего метода (который я не описал), и я хотел бы узнать, как бы его победить" ;)
С уважением,
Михаил Каганский

rami

"Убрать стандартное редактирование текста внутри фигуры" и перемещение мышью можно, если снять выделение с фигуры после нажатия. Для этого нужно снять выделение с выбранного объекта:
Цитировать
REM Кнопка отпущена
Function MouseOnClick_mouseReleased(oEvt as object) As Boolean
   MouseOnClick_mouseReleased = False    ' Разрешить офису другие обработки этого события

'oComp = StarDesktop.getCurrentComponent().CurrentSelection(0)     'это убрать совсем

oDoc = ThisComponent
oComp = oDoc.CurrentSelection(0)     'выбранный объект
oDoc.CurrentController.Select(oDoc.CreateInstance("com.sun.star.drawing.Background")) 'снять выделение с выбранного объекта

On Local Error GoTo NODOCUMENTTYPE
If oComp.FillColor = RGB(255, 0, 0) Then
oComp.FillColor = RGB(0, 255, 0)
else
oComp.FillColor = RGB(255, 0, 0)
endif
NODOCUMENTTYPE:
End Function

sokol92

Коллеги, спасибо за интересные сообщения!
Владимир.

vitalukalo

#8
Цитата: sokol92 от  5 мая 2021, 18:08Убрать стандартное редактирование текста внутри фигуры" и перемещение мышью можно, если снять выделение с фигуры после нажатия. Для этого нужно снять выделение с выбранного объекта:
Спасибо. Это работает если внутри нет текста. Если внутри текст то он все равно выделяется.

sokol92

Цитата из #8 не моя. :)

Давайте вместе проверим (см. вложение). Естественно, двойной щелчок не должен производится в область непосредственно текста.
Владимир.

vitalukalo

Да. Спасибо. Работает.