2020-03-16 12:03:48 +01:00
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd">
2020-05-05 15:33:25 +02:00
<script:module xmlns:script="http://openoffice.org/2000/script" script:name="TOCLinks" script:language="StarBasic" script:moduleType="normal">Sub makeOutlineLinks
2021-06-04 17:05:34 +02:00
Dim oViewCursor As Object
2020-03-21 16:35:38 +01:00
Dim i As Integer
2021-06-04 17:05:34 +02:00
oViewCursor = ThisComponent.CurrentController.getViewCursor()
oViewCursor.jumpToFirstPage()
2020-03-16 12:03:48 +01:00
For i = 1 To 10
makeLinksWithLevel(i)
Next i
2020-06-27 13:21:30 +02:00
MsgBox (getTranslation("OutlineLinksFinished"))
2020-03-16 12:03:48 +01:00
End Sub
Sub makeLinksWithLevel(level)
Dim heading() As Object
Dim outline() As Object
Dim oAnchor1Name As String
Dim oAnchor2Name As String
2021-10-19 23:02:41 +02:00
Dim message As String
2020-03-16 12:03:48 +01:00
Dim i As Integer
heading = getHeadingWithLevel(level)
outline = getOutlineWithLevel(level)
If Ubound(heading) <> -1 AND Ubound(outline) <> -1 Then
If (Ubound(outline) + 1) MOD (Ubound(heading) + 1 ) = 0 Then
For i = 0 To (Ubound(outline))
2020-05-05 14:01:41 +02:00
oAnchor2Name = "Outline " + level + "." + (i Mod (Ubound(heading) + 1))
2020-03-16 12:03:48 +01:00
If i <= Ubound(heading) Then
createAnchor(heading(i Mod (Ubound(heading) + 1)),oAnchor2Name)
EndIf
createLink(outline(i),"",oAnchor2Name)
Next i
Else
2021-10-19 23:02:41 +02:00
message = getTranslation("TOCErrorContentsNotMatchHeadings1") & " " & level & " (" & (Ubound(outline)+1) &") " & _
getTranslation("TOCErrorContentsNotMatchHeadings2") & " " & level & " " & _
getTranslation("TOCErrorContentsNotMatchHeadings3") & " (" & (Ubound(heading)+1) & ")"
showTOCLinksDialog(message, heading(), outline() )
2020-03-16 12:03:48 +01:00
EndIf
ElseIf Ubound(outline) = -1 Then
2020-05-05 15:33:25 +02:00
' MsgBox (getTranslation("TOCErrorNoContents1") & " " & level & " " & getTranslation("TOCErrorNoContents2"))
2020-03-16 12:03:48 +01:00
ElseIf Ubound(heading) = -1 Then
2020-07-06 11:57:10 +02:00
MsgBox getTranslation("TOCErrorNoHeadings1") & " " & level & " " & getTranslation("TOCErrorNoHeadings2")
2020-03-16 12:03:48 +01:00
EndIf
End Sub
Function getHeadingWithLevel(curNum)
Dim enum1Element As Object
Dim enum1 As Object
Dim enum2 As Object
Dim thisPortion As Object
Dim footnoteText As Object
Dim label As String
Dim labelNum As Integer
Dim i As Integer
Dim count As Integer
Dim cell As Object
Dim cellEnum As Object
Dim cellEnum2 As Object
Dim headingPar() As Object
enum1 = ThisComponent.Text.createEnumeration
While enum1.hasMoreElements
enum1Element = enum1.nextElement
If enum1Element.supportsService("com.sun.star.text.Paragraph") Then
If enum1Element.OutlineLevel = curNum Then
addToArray(headingPar(),enum1Element)
EndIf
ElseIf enum1Element.supportsService("com.sun.star.text.TextTable") Then
cellNames = enum1Element.cellNames
For i = LBound(cellNames) To Ubound(cellNames)
cell = enum1Element.getCellByName(cellNames(i))
cellEnum = cell.getText().createEnumeration()
While cellEnum.hasMoreElements
cellEnumElement = cellEnum.nextElement
If cellEnumElement.supportsService("com.sun.star.text.Paragraph") Then
If cellEnumElement.OutlineLevel = curNum Then
addToArray(headingPar(),cellEnumElement)
EndIf
EndIf
Wend
Next i
EndIf
Wend
getHeadingWithLevel = headingPar()
End Function
Function getOutlineWithLevel(curNum)
Dim enum1Element As Object
Dim enum1 As Object
Dim enum2 As Object
Dim thisPortion As Object
Dim footnoteText As Object
Dim label As String
Dim labelNum As Integer
Dim i As Integer
Dim count As Integer
Dim cell As Object
Dim cellEnum As Object
Dim cellEnum2 As Object
Dim par() As Object
Dim parName As String
2020-03-21 16:35:38 +01:00
Dim cellEnumElement As Object
2020-03-16 12:03:48 +01:00
parName = "Contents " + curNum
enum1 = ThisComponent.Text.createEnumeration
While enum1.hasMoreElements
enum1Element = enum1.nextElement
If enum1Element.supportsService("com.sun.star.text.Paragraph") Then
If enum1Element.ParaStyleName = parName Then
addToArray(par(),enum1Element)
EndIf
ElseIf enum1Element.supportsService("com.sun.star.text.TextTable") Then
cellNames = enum1Element.cellNames
For i = LBound(cellNames) To Ubound(cellNames)
cell = enum1Element.getCellByName(cellNames(i))
cellEnum = cell.getText().createEnumeration()
While cellEnum.hasMoreElements
cellEnumElement = cellEnum.nextElement
If cellEnumElement.supportsService("com.sun.star.text.Paragraph") Then
If cellEnumElement.ParaStyleName = parName Then
addToArray(par(),cellEnumElement)
EndIf
EndIf
Wend
Next i
Else
EndIf
Wend
getOutlineWithLevel = par()
End Function
2021-10-19 23:02:41 +02:00
Sub showTOCLinksDialog(message As String, heading() As Object, outline() As Object)
Dim pDialog As Object
Dim grid As Object
Dim headingsColumn As Object
Dim tocColumn As Object
Dim oGridControl As Object
Dim oColumnModel As Object
Dim oDataModel As Object
2021-10-19 23:43:25 +02:00
Dim rect As Object
2021-10-19 23:02:41 +02:00
Dim i As Integer
Dim j As Integer
Dim outlineCell As String
Dim headingCell As String
DialogLibraries.LoadLibrary("ePublishing")
pDialog = CreateUnoDialog( DialogLibraries.ePublishing.toc_links )
'grid = pDialog.getControl("grid")
grid = pDialog.Model.createInstance("com.sun.star.awt.grid.UnoControlGridModel")
grid.Name = "tocGrid"
grid.ShowColumnHeader = True
2021-10-19 23:43:25 +02:00
grid.ShowRowHeader = True
2021-10-19 23:02:41 +02:00
grid.VScroll = true
grid.Sizeable = true
grid.Step = 0
oColumnModel = createUnoService( "com.sun.star.awt.grid.DefaultGridColumnModel")
tocColumn = createUnoService( "com.sun.star.awt.grid.GridColumn")
tocColumn.Title = getTranslation("tocItemText")
tocColumn.ColumnWidth = 100
tocColumn.Resizeable = true
'tocColumn.Flexibility = true
oColumnModel.addColumn( tocColumn )
headingsColumn = createUnoService( "com.sun.star.awt.grid.GridColumn")
headingsColumn.Title = getTranslation("headingItemText")
headingsColumn.ColumnWidth = 100
headingsColumn.Resizeable = true
'headingsColumn.Flexibility = true
oColumnModel.addColumn( headingsColumn )
grid.ColumnModel = oColumnModel
'grid.Sizeable = False
'gridStep = 0
oDataModel = createUnoService( "com.sun.star.awt.grid.DefaultGridDataModel")
If Ubound(outline) > Ubound(heading) Then
For i = 0 To (Ubound(outline))
outlineCell = outline(i).getString()
j = i MOD (Ubound(heading) + 1)
headingCell = heading(j).getString()
oDataModel.addRow ( i+1 , Array(outlineCell, headingCell) )
Next
Else
For i = 0 To (Ubound(heading))
headingCell = heading(i).getString()
If i > Ubound(outline) Then
outlineCell = ""
Else
outlineCell = outline(i).getString()
EndIf
oDataModel.addRow ( i+1 , Array(outlineCell, headingCell) )
Next i
EndIf
grid.GridDataModel = oDataModel
oGridControl = createUnoService("com.sun.star.awt.grid.UnoControlGrid")
oGridControl.setModel(grid)
pDialog.addControl("gridtab", oGridControl)
2021-10-19 23:43:25 +02:00
rect = pDialog.getPosSize()
oGridControl.setPosSize(10,60,rect.Width - 20,rect.Height - 120, com.sun.star.awt.PosSize.POSSIZE)
2021-10-19 23:02:41 +02:00
pDialog.getControl("Ok").Label = getTranslation("buttonOk")
pDialog.getControl("message").SetText(message)
pDialog.Title = getTranslation("tocDialogLabel")
pDialog.Execute()
pDialog.dispose()
End Sub
2020-03-16 12:03:48 +01:00
Sub addToArray(xArray(),vNextElement)
2020-03-21 16:35:38 +01:00
Dim iUB As Integer
Dim iLB As Integer
2020-03-16 12:03:48 +01:00
iLB = lBound(xArray())
iUB = uBound(xArray())
If iLB > iUB then
iUB = iLB
redim xArray(iLB To iUB)
Else
iUB = iUB +1
redim preserve xArray(iLB To iUB)
Endif
xArray(iUB) = vNextElement
End Sub
2021-10-19 23:43:25 +02:00
</script:module>