Option Explicit
Public Event MaxYReached(ByVal CurrentY As Double, ByRef oPrinter As Object, ByRef bRePrintHeader As Boolean)
Public Event Progress(ByVal oNextListItem As ListItem, ByRef oPrinter As Object, ByRef bRePrintHeader As Boolean, ByVal lTotalLines As Long, ByRef bCancel As Boolean)
Private mlFromX As Long
Public Sub PrintListview(lvListview As ListView, Optional ByVal oPrinter As Object, Optional ByVal bLines As Boolean = False, Optional ByVal bBlackAndWhite As Boolean = True, Optional ByVal MaxY As Double, Optional ByVal lFromX As Long)
Dim oListItem As ListItem
Dim oSubItem As ListSubItem
Dim oColumnHeader As ColumnHeader
Dim iCounter As Integer
Dim lPrevY As Long
Dim sCorrectPrintText As String
Dim bRePrintHeader As Boolean
Dim bCancel As Boolean
mlFromX = lFromX
If oPrinter Is Nothing Then
Set oPrinter = Printer
End If
With oPrinter
.Font = lvListview.Font
Call PrintHeader(lvListview, oPrinter)
.CurrentY = .CurrentY + .TextHeight(" ") + (.TextHeight(" ") / 2)
For Each oListItem In lvListview.ListItems
bRePrintHeader = False
RaiseEvent Progress(oListItem, oPrinter, bRePrintHeader, lvListview.ListItems.Count, bCancel)
If bCancel Then
Exit For
End If
If bRePrintHeader Then
Call PrintHeader(lvListview, oPrinter)
End If
Set oColumnHeader = lvListview.ColumnHeaders(1)
lPrevY = .CurrentY
'oPrinter.Line (.CurrentX, .CurrentY)-(.CurrentX + oListItem.Width, .CurrentY)
.CurrentY = lPrevY
.CurrentX = .CurrentX - oListItem.Width
Select Case oColumnHeader.Alignment
Case lvwColumnLeft
.CurrentX = mlFromX + oListItem.Left + 60
Case lvwColumnRight
.CurrentX = mlFromX + oListItem.Left + oListItem.Width - .TextWidth(oColumnHeader.Text) - 120
Case lvwColumnCenter
.CurrentX = mlFromX + oListItem.Left + ((oListItem.Width - .TextWidth(oListItem.Text)) / 2)
End Select
.ForeColor = IIf(bBlackAndWhite, vbBlack, oListItem.ForeColor)
If oListItem.Width > 15 Then
sCorrectPrintText = Trim$(oListItem.Text)
If .TextWidth(sCorrectPrintText) > oColumnHeader.Width - 60 Then
Do Until Not .TextWidth(sCorrectPrintText & "...") > (oColumnHeader.Width - 120)
sCorrectPrintText = Mid$(sCorrectPrintText, 1, Len(sCorrectPrintText) - 1)
Loop
sCorrectPrintText = sCorrectPrintText & "..."
End If
Debug.Assert sCorrectPrintText = Trim$(oListItem.Text)
oPrinter.Print sCorrectPrintText; 'Because of some weird bug there has to be oPrinter before this
' If i dont add the oPrinter i get a syntax error
End If
.CurrentY = lPrevY
For Each oSubItem In oListItem.ListSubItems
Set oColumnHeader = lvListview.ColumnHeaders(oSubItem.Index + 1)
Select Case oColumnHeader.Alignment
Case lvwColumnLeft
.CurrentX = mlFromX + oColumnHeader.Left + 60
Case lvwColumnRight
.CurrentX = mlFromX + oColumnHeader.Left + oColumnHeader.Width - .TextWidth(oSubItem.Text) - 120
Case lvwColumnCenter
.CurrentX = mlFromX + oColumnHeader.Left + ((oColumnHeader.Width - .TextWidth(oSubItem.Text)) / 2)
End Select
.ForeColor = IIf(bBlackAndWhite, vbBlack, oSubItem.ForeColor)
If oColumnHeader.Width > 15 Then
sCorrectPrintText = Trim$(oSubItem.Text)
If .TextWidth(sCorrectPrintText) > oColumnHeader.Width - 120 Then
Do Until Not .TextWidth(sCorrectPrintText & "...") > (oColumnHeader.Width - 120) Or (sCorrectPrintText = "")
sCorrectPrintText = Mid$(sCorrectPrintText, 1, Len(sCorrectPrintText) - 1)
Loop
sCorrectPrintText = sCorrectPrintText & "..."
End If
oPrinter.Print sCorrectPrintText;
End If
.CurrentY = lPrevY
Next
.CurrentY = .CurrentY + oListItem.Height
If .CurrentY > MaxY Then
RaiseEvent MaxYReached(.CurrentY, oPrinter, bRePrintHeader)
If bRePrintHeader Then
Call PrintHeader(lvListview, oPrinter)
.CurrentY = .CurrentY + .TextHeight(" ") + (.TextHeight(" ") / 2)
End If
End If
Next
End With
End Sub
Public Sub PrintHeader(lvListview As ListView, oPrinter As Object)
Dim lPrevY As Long
Dim oColumnHeader As ColumnHeader
Dim sCorrectPrintText As String
With oPrinter
For Each oColumnHeader In lvListview.ColumnHeaders
If oColumnHeader.Width > 60 Then
lPrevY = .CurrentY
Select Case oColumnHeader.Alignment
Case lvwColumnLeft
.CurrentX = mlFromX + oColumnHeader.Left + 60
Case lvwColumnRight
.CurrentX = mlFromX + oColumnHeader.Left + oColumnHeader.Width - .TextWidth(oColumnHeader.Text) - 120
Case lvwColumnCenter
.CurrentX = mlFromX + oColumnHeader.Left + ((oColumnHeader.Width - .TextWidth(oColumnHeader.Text)) / 2)
End Select
.FontUnderline = True
If oColumnHeader.Width > 15 Then
sCorrectPrintText = Trim$(oColumnHeader.Text)
If sCorrectPrintText <> "" Then
If .TextWidth(sCorrectPrintText) > oColumnHeader.Width - 120 Then
Do Until Not .TextWidth(sCorrectPrintText & "...") > (oColumnHeader.Width - 120) Or (sCorrectPrintText = "")
sCorrectPrintText = Mid$(sCorrectPrintText, 1, Len(sCorrectPrintText) - 1)
Loop
sCorrectPrintText = sCorrectPrintText & "..."
End If
oPrinter.Print sCorrectPrintText;
End If
End If
.FontUnderline = False
.CurrentY = lPrevY
End If
Next
End With
End Sub