Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

30 Июнь 2022, 19:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Доступно и просто о работе в офисных пакетах
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Поиск всех выделенных изображений в Writer'е  (Прочитано 549 раз)
0 Пользователей и 1 Гость смотрят эту тему.
proger1983
Участник
**
Offline Offline

Сообщений: 17


« Стартовое сообщение: 20 Июнь 2022, 15:01 »

Здравствуйте, форумчане. Стоит задача поиска всех выделенных изображений в Writer'е. Задача осложняется тем, что изображения могут находиться и в ячейках таблиц (не одной). Знаю, что у документа есть DrawPage со всеми изображениями. А как определить, что оно попало в выделение? Или из CurrentSelection'a их можно как-то выцепить?
Записан
mikekaganski
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 774


« Ответ #1: 20 Июнь 2022, 15:10 »

Из расширения Formatting of All Math Formulas:

Код:
' Checks if Range1 is inside Range2
Function IsTextRangeInsideRange(ByRef oRange1, ByRef oRange2) As Boolean
  IsTextRangeInsideRange = (oRange2.text.compareRegionStarts(oRange1, oRange2)<=0)_
                       And (oRange2.text.compareRegionEnds(oRange1, oRange2)>=0)
End Function

Function IsCellRangeInsideRange(ByRef oRange1, ByRef oRange2) As Boolean
  IsCellRangeInsideRange = _
            (oRange1.RangeAddress.Sheet        = oRange2.RangeAddress.Sheet      )_
        And (oRange1.RangeAddress.StartColumn >= oRange2.RangeAddress.StartColumn)_
        And (oRange1.RangeAddress.EndColumn   <= oRange2.RangeAddress.EndColumn  )_
        And (oRange1.RangeAddress.StartRow    >= oRange2.RangeAddress.StartRow   )_
        And (oRange1.RangeAddress.EndRow      <= oRange2.RangeAddress.EndRow     )
End Function

Function IsInSelection(ByRef oObj, ByRef oSel) As Boolean
  Dim i As Long
  If (IsNull(oSel)) Then
    IsInSelection = True
  ElseIf (HasUnoInterfaces(oSel, "com.sun.star.drawing.XShape")) Then
    IsInSelection = EqualUnoObjects(oObj, oSel)
  ElseIf (HasUnoInterfaces(oSel, "com.sun.star.drawing.XShapes")) Then
    IsInSelection = False
    For i = 0 To oSel.Count - 1
      If (EqualUnoObjects(oObj, oSel(i))) Then
        IsInSelection = True
        Exit For
      End If
    Next i
  ElseIf (HasUnoInterfaces(oSel, "com.sun.star.sheet.XSheetCellRange")) Then
    IsInSelection = IsCellRangeInsideRange(oObj.Anchor, oSel)
  ElseIf (HasUnoInterfaces(oSel, "com.sun.star.sheet.XSheetCellRangeContainer")) Then
    IsInSelection = False
    For i = 0 To oSel.Count - 1
      If (IsCellRangeInsideRange(oObj.Anchor, oSel(i))) Then
        IsInSelection = True
        Exit For
      End If
    Next i
  Else
    IsInSelection = False
    For i = 0 To oSel.Count - 1
      If (IsTextRangeInsideRange(oObj.Anchor, oSel(i))) Then
        IsInSelection = True
        Exit For
      End If
    Next i
  End If
End Function
« Последнее редактирование: 21 Июнь 2022, 15:26 от mikekaganski » Записан

С уважением,
Михаил Каганский
proger1983
Участник
**
Offline Offline

Сообщений: 17


« Ответ #2: 20 Июнь 2022, 15:15 »

Из расширения Formatting of All Math Formulas:

Код:
' Checks if Range1 is inside Range2
Function IsTextRangeInsideRange(ByRef oRange1, ByRef oRange2) As Boolean
  IsTextRangeInsideRange = (oRange2.text.compareRegionStarts(oRange1, oRange2)<=0)_
                       And (oRange2.text.compareRegionEnds(oRange1, oRange2)>=0)
End Function

Function IsCellRangeInsideRange(ByRef oRange1, ByRef oRange2) As Boolean
  IsCellRangeInsideRange = _
            (oRange1.RangeAddress.Sheet        = oRange2.RangeAddress.Sheet      )_
        And (oRange1.RangeAddress.StartColumn >= oRange2.RangeAddress.StartColumn)_
        And (oRange1.RangeAddress.EndColumn   <= oRange2.RangeAddress.EndColumn  )_
        And (oRange1.RangeAddress.StartRow    >= oRange2.RangeAddress.StartRow   )_
        And (oRange1.RangeAddress.EndRow      <= oRange2.RangeAddress.EndRow     )
End Function

Function IsInSelection(ByRef oObj, ByRef oSel) As Boolean
  Dim i As Long
  If (IsNull(oSel)) Then
    IsInSelection = True
  ElseIf (HasUnoInterfaces(oSel, "com.sun.star.drawing.XShape")) Then
    IsInSelection = EqualUnoObjects(oObj, oSel)
  ElseIf (HasUnoInterfaces(oSel, "com.sun.star.drawing.XShapes")) Then
    IsInSelection = False
    For i = 0 To oSel.Count - 1
      If (EqualUnoObjects(oObj, oSel(i))) Then
        IsInSelection = True
        Exit For
      End If
    Next i
  ElseIf (HasUnoInterfaces(oSel, "com.sun.star.sheet.XSheetCellRange")) Then
    IsCellRangeInsideRange(oObj.Anchor, oSel)
  ElseIf (HasUnoInterfaces(oSel, "com.sun.star.sheet.XSheetCellRangeContainer")) Then
    IsInSelection = False
    For i = 0 To oSel.Count - 1
      If (IsCellRangeInsideRange(oObj.Anchor, oSel(i))) Then
        IsInSelection = True
        Exit For
      End If
    Next i
  Else
    IsInSelection = False
    For i = 0 To oSel.Count - 1
      If (IsTextRangeInsideRange(oObj.Anchor, oSel(i))) Then
        IsInSelection = True
        Exit For
      End If
    Next i
  End If
End Function

Так это для Calc'а, а не Writer'а.
Записан
mikekaganski
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 774


« Ответ #3: 20 Июнь 2022, 15:16 »

Так это для Calc'а, а не Writer'а.

Правда? Ну тогда, значит, я всё делал неправильно все эти годы.
Записан

С уважением,
Михаил Каганский
proger1983
Участник
**
Offline Offline

Сообщений: 17


« Ответ #4: 20 Июнь 2022, 15:28 »

Так это для Calc'а, а не Writer'а.

Правда? Ну тогда, значит, я всё делал неправильно все эти годы.

Calc - электронные таблицы. Writer - текстовые документы (в которых могут быть таблицы, и в их ячейках могут быть тоже таблицы). У последнего нет листов, например (RangeAddress.Sheet). Вопрос именно для Writer'а.
Записан
sokol92
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 939


WWW
« Ответ #5: 20 Июнь 2022, 15:58 »

В описании расширения указано: "Works in Writer, Calc, Draw and Impress". Если есть конкретные трудности, то выложите документ Writer и будем вместе разбираться.
Записан

Владимир.
proger1983
Участник
**
Offline Offline

Сообщений: 17


« Ответ #6: 21 Июнь 2022, 09:57 »

Из расширения Formatting of All Math Formulas:

Код:
' Checks if Range1 is inside Range2
Function IsTextRangeInsideRange(ByRef oRange1, ByRef oRange2) As Boolean
  IsTextRangeInsideRange = (oRange2.text.compareRegionStarts(oRange1, oRange2)<=0)_
                       And (oRange2.text.compareRegionEnds(oRange1, oRange2)>=0)
End Function

Function IsCellRangeInsideRange(ByRef oRange1, ByRef oRange2) As Boolean
  IsCellRangeInsideRange = _
            (oRange1.RangeAddress.Sheet        = oRange2.RangeAddress.Sheet      )_
        And (oRange1.RangeAddress.StartColumn >= oRange2.RangeAddress.StartColumn)_
        And (oRange1.RangeAddress.EndColumn   <= oRange2.RangeAddress.EndColumn  )_
        And (oRange1.RangeAddress.StartRow    >= oRange2.RangeAddress.StartRow   )_
        And (oRange1.RangeAddress.EndRow      <= oRange2.RangeAddress.EndRow     )
End Function

Function IsInSelection(ByRef oObj, ByRef oSel) As Boolean
  Dim i As Long
  If (IsNull(oSel)) Then
    IsInSelection = True
  ElseIf (HasUnoInterfaces(oSel, "com.sun.star.drawing.XShape")) Then
    IsInSelection = EqualUnoObjects(oObj, oSel)
  ElseIf (HasUnoInterfaces(oSel, "com.sun.star.drawing.XShapes")) Then
    IsInSelection = False
    For i = 0 To oSel.Count - 1
      If (EqualUnoObjects(oObj, oSel(i))) Then
        IsInSelection = True
        Exit For
      End If
    Next i
  ElseIf (HasUnoInterfaces(oSel, "com.sun.star.sheet.XSheetCellRange")) Then
    IsCellRangeInsideRange(oObj.Anchor, oSel)
  ElseIf (HasUnoInterfaces(oSel, "com.sun.star.sheet.XSheetCellRangeContainer")) Then
    IsInSelection = False
    For i = 0 To oSel.Count - 1
      If (IsCellRangeInsideRange(oObj.Anchor, oSel(i))) Then
        IsInSelection = True
        Exit For
      End If
    Next i
  Else
    IsInSelection = False
    For i = 0 To oSel.Count - 1
      If (IsTextRangeInsideRange(oObj.Anchor, oSel(i))) Then
        IsInSelection = True
        Exit For
      End If
    Next i
  End If
End Function

В описании расширения указано: "Works in Writer, Calc, Draw and Impress". Если есть конкретные трудности, то выложите документ Writer и будем вместе разбираться.

Спасибо за расширение. Там нашел подходящий кусок.
Записан
sokol92
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 939


WWW
« Ответ #7: 21 Июнь 2022, 15:14 »

Спасибо за расширение.
Спасибо Михаилу и Роману!

Мне кажается, код из #1 имеет самостоятельное значение для практических задач (вне связи с расширением).
Рискну предложить добавить "поимку" форм, привязанных к листу Calc, а не к конкретной ячейке.
Записан

Владимир.
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!