Поиск всех выделенных изображений в Writer'е

Автор proger1983, 20 июня 2022, 15:01

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

proger1983

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

mikekaganski

#1
Из расширения 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
С уважением,
Михаил Каганский

proger1983

Цитата: mikekaganski от 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
    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

Цитата: proger1983 от 20 июня 2022, 15:15Так это для Calc'а, а не Writer'а.

Правда? Ну тогда, значит, я всё делал неправильно все эти годы.
С уважением,
Михаил Каганский

proger1983

Цитата: mikekaganski от 20 июня 2022, 15:16
Цитата: proger1983 от 20 июня 2022, 15:15Так это для Calc'а, а не Writer'а.

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

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

sokol92

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

proger1983

Цитата: mikekaganski от 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
    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


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

Спасибо за расширение. Там нашел подходящий кусок.

sokol92

Цитата: proger1983 от 21 июня 2022, 09:57Спасибо за расширение.
Спасибо Михаилу и Роману!

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