Изменение междустрочного интервала в Writer

Автор convas, 7 сентября 2010, 15:35

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

convas

Есть необходимость написать макрос, с помощью которого можно менять только междустрочный интервал в документах Writer.
Желательно, чтобы с помощью ползунка на панели управления (или в отдельном всплывающем окне), примерно так же, как меняется масштаб внизу.
Есть идеи?

N2H4

#1
Если интервал определён в «Базовом» и наследуется всеми остальными, то, возможно,

Sub Main
setParaLineSpacing(113)
End Sub

'Установка междустрочного интервала Percent для стиля sStyleName (или «Базового», если sStyleName не указано)
sub setParaLineSpacing(Percent as Integer, Optional sStyleName)
Dim oDocument, oParagraphStyles, oStyle as Object

oDocument = ThisComponent
oParagraphStyles = oDocument.StyleFamilies.getByName("ParagraphStyles")

if IsMissing(sStyleName) then
oStyle = oParagraphStyles.getByName("Standard")
else
oStyle = oParagraphStyles.getByName(sStyleName)
endif

setStyleLineSpacing(Percent, oStyle)
end sub

'Установка междустрочного интервала Percent для стиля oStyle
sub setStyleLineSpacing(Percent as Integer, oStyle as Object)
Dim oStyleLineSpacing as Object

oStyleLineSpacing = oStyle.ParaLineSpacing
'PROP = 0 — 1/1.5/2/Пропорционально, MINIMUM = 1 — Минимум, LEADING = 2 — Дополнительно, FIX = 3 — Точно.
oStyleLineSpacing.Mode =  com.sun.star.style.LineSpacingMode.PROP
'Интервал
oStyleLineSpacing.Height = Percent
oStyle.ParaLineSpacing = oStyleLineSpacing
end sub

Если у разных стилей разные интервалы, придётся их перебирать все, возможно, так:
'Установка междустрочного интервала Percent для «Базового» и пропорционально для всех остальных
sub setAllLineSpacing(Percent as Integer)
Dim oDocument, oParagraphStyles, oStyle, oParentStyle as Object
Dim StandardPercent as Integer

oDocument = ThisComponent
oParagraphStyles = oDocument.StyleFamilies.getByName("ParagraphStyles")

oStyle = oParagraphStyles.getByIndex(0)
if (oStyle.ParaLineSpacing.Mode <> com.sun.star.style.LineSpacingMode.PROP)  then
exit sub
endif
StandardPercent = oStyle.ParaLineSpacing.Height
setStyleLineSpacing(Percent, oStyle)

dim i as Integer
for i = 1 to oParagraphStyles.Count-1 step 1

oStyle = oParagraphStyles.getByIndex(i)

oParentStyle = oParagraphStyles.getByName(oStyle.ParentStyle)

if not ((oStyle.ParaLineSpacing.Mode = oParentStyle.ParaLineSpacing.Mode) _
and (oStyle.ParaLineSpacing.Height = oParentStyle.ParaLineSpacing.Height))  then
setStyleLineSpacing(Percent*oStyle.ParaLineSpacing.Height/StandardPercent, oStyle)
endif
next i
end sub

Но вот если интервал изначально был установлен не как com.sun.star.style.LineSpacingMode.PROP, этот макрос явно будет глючить.
Да и проверка oStyle.ParaLineSpacing.* = oParentStyle.ParaLineSpacing.* не показывает, унаследован этот параметр или просто совпало значение...