2023-05-22 16:55:44 +02:00

380 lines
14 KiB
VB.net

Imports System.IO
Imports System.Drawing.Imaging
Imports DevExpress.XtraCharts
Imports DevExpress.XtraPrinting
Imports DevExpress.XtraPrintingLinks
Public Class frmDiagrams
Private toolbars As List(Of ToolStrip)
Private charts As List(Of ChartControl)
Private groupCount As Integer
Private CHART_TITLE_STRING As String
Private Sub frmDiagrams_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim CHART_ENTITY_SQL, CHART_GROUPS_SQL, CHART_TITLE_SQL As String
Dim CHART_ENTITY_DT, CHART_GROUPS_DT As DataTable
CHART_TITLE_SQL = String.Format("SELECT NAME FROM TBPMO_FORM WHERE GUID = {0}", CURRENT_ENTITY_ID)
CHART_ENTITY_SQL = String.Format("SELECT * FROM TBPMO_CHART_ENTITY WHERE ENTITY_ID = {0}", CURRENT_ENTITY_ID)
CHART_GROUPS_SQL = String.Format("SELECT DISTINCT GROUP_ID FROM TBPMO_CHART_ENTITY WHERE ENTITY_ID = {0} ORDER BY GROUP_ID", CURRENT_ENTITY_ID)
CHART_TITLE_STRING = MYDB_ECM.GetScalarValue(CHART_TITLE_SQL)
CHART_ENTITY_DT = MYDB_ECM.GetDatatable(CHART_ENTITY_SQL)
CHART_GROUPS_DT = MYDB_ECM.GetDatatable(CHART_GROUPS_SQL)
Dim Groups As DataRowCollection = CHART_GROUPS_DT.Rows
groupCount = Groups.Count
toolbars = New List(Of ToolStrip) From {ToolStripTopLeft, ToolStripTopRight, ToolStripBottomLeft, ToolStripBottomRight}
charts = New List(Of ChartControl) From {ChartTopLeft, ChartTopRight, ChartBottomLeft, ChartBottomRight}
If groupCount = 0 Then
MsgBox("No Diagrams found")
Me.Close()
End If
Load_Settings()
Configure_Chart_Tool_Bars()
Configure_Split_Containers(groupCount)
If groupCount > 1 Then
For Each gRow As DataRow In Groups
Dim groupIndex As Integer = Groups.IndexOf(gRow)
Dim groupName As String = gRow.Item("GROUP_ID")
Dim groupCharts = CHART_ENTITY_DT.Select(String.Format("GROUP_ID = '{0}'", groupName))
Dim chart As ChartControl
For Each cRow As DataRow In groupCharts
Dim type = cRow.Item("TYPE_CHART")
Dim title = cRow.Item("TITLE")
Dim guid = cRow.Item("GUID")
Dim value = cRow.Item("VALUE")
Dim argument = cRow.Item("ARGUMENT")
Dim sql = cRow.Item("SQL_COMMAND")
Dim DATA_DT As DataTable = MYDB_ECM.GetDatatable(sql)
Dim series As Series = Create_Series(title, type)
' Select Current Chart
chart = Select_Chart(groupIndex)
chart = charts.Item(groupIndex)
' Set DataSource
chart.DataSource = DATA_DT
' Set shown Columns for Chart
series.ArgumentDataMember = argument
series.ValueDataMembers.AddRange(New String() {value})
'set some options
chart.Legend.Visibility = DevExpress.Utils.DefaultBoolean.True
' Show Data
chart.Series.Add(series)
Next ' End Charts
Next 'End Groups
Else
' Create Charts
For Each row As DataRow In CHART_ENTITY_DT.Rows
Dim chart As ChartControl
Dim chartIndex As Integer = CHART_ENTITY_DT.Rows.IndexOf(row)
Dim type = row.Item("TYPE_CHART")
Dim title = row.Item("TITLE")
Dim guid = row.Item("GUID")
Dim value = row.Item("VALUE")
Dim argument = row.Item("ARGUMENT")
Dim sql = row.Item("SQL_COMMAND")
Dim DATA_DT As DataTable = MYDB_ECM.GetDatatable(sql)
' Create Series based on type
Dim series As Series = Create_Series(title, type)
' Select Current Chart
chart = Select_Chart(chartIndex)
' Set DataSource
chart.DataSource = DATA_DT
' Set shown Columns for Chart
series.ArgumentDataMember = argument
series.ValueDataMembers.AddRange(New String() {value})
'set some options
chart.Legend.Visibility = DevExpress.Utils.DefaultBoolean.True
chart.OptionsPrint.SizeMode = Printing.PrintSizeMode.Stretch
' Show Data
chart.Series.Add(series)
Next
End If
End Sub
Private Sub frmDiagrams_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
Dim XMLPath As String = Get_Splitter_Layout_Filename()
Dim layout As New ClassLayout(XMLPath)
Dim settings As New List(Of ClassSetting)
settings = Get_Settings(settings)
layout.Save(settings)
End Sub
Private Function Get_Splitter_Layout_Filename() As String
Dim Filename As String = String.Format("{0}-Diagram-SplitterLayout.xml", CURRENT_ENTITY_ID)
Return System.IO.Path.Combine(Application.UserAppDataPath(), Filename)
End Function
Private Function Get_Settings(settings As List(Of ClassSetting)) As List(Of ClassSetting)
settings.Add(New ClassSetting("SplitterMainDistance", SplitContainerMain.SplitterDistance))
settings.Add(New ClassSetting("SplitterTopDistance", SplitContainerTop.SplitterDistance))
settings.Add(New ClassSetting("SplitterBottomDistance", SplitContainerBottom.SplitterDistance))
Return settings
End Function
Private Sub Load_Settings()
Try
' Load Splitter Settings
Dim XMLPath As String = Get_Splitter_Layout_Filename()
Dim layout As New ClassLayout(XMLPath)
Dim settings As List(Of ClassSetting)
settings = layout.Load()
' No Settings found, save current values
If settings.Count = 0 Then
'Adjust Width and Height of containers
Dim containerW = Me.Width / 2
Dim containerH = Me.Height / 2
SplitContainerTop.SplitterDistance = containerW
SplitContainerBottom.SplitterDistance = containerW
SplitContainerMain.SplitterDistance = containerH
settings = Get_Settings(settings)
layout.Save(settings)
End If
'Apply Settings
For Each setting As ClassSetting In settings
If setting._name = "SplitterMainDistance" Then
SplitContainerMain.SplitterDistance = setting._value
End If
If setting._name = "SplitterTopDistance" Then
SplitContainerTop.SplitterDistance = setting._value
End If
If setting._name = "SplitterBottomDistance" Then
SplitContainerBottom.SplitterDistance = setting._value
End If
Next
Catch ex As Exception
MsgBox("Error while loading Settings for frmDiagrams: " & vbNewLine & ex.Message)
End Try
End Sub
Private Sub Configure_Split_Containers(VisibleContainers As Integer)
Select Case VisibleContainers
Case 1
' Show only ChartTopLeft
SplitContainerTop.Panel2Collapsed = True
' Collapse SplitContainerBottom
SplitContainerMain.Panel2Collapsed = True
Case 2
' Collapse SplitContainerBottom
SplitContainerMain.Panel2Collapsed = True
Case 3
' Collapse ChartBottomRight
SplitContainerBottom.Panel2Collapsed = True
' Show SplitContainerBottom
SplitContainerMain.Panel2Collapsed = False
Case 4
' Show SplitContainerBottom
SplitContainerMain.Panel2Collapsed = False
End Select
End Sub
Private Function Create_Series(title As String, type As String) As Series
Dim series As Series
Select Case type
Case "BAR"
series = New Series(title, ViewType.Bar)
Case "LINE"
series = New Series(title, ViewType.Line)
Case "AREA"
series = New Series(title, ViewType.Area)
Case "PIE"
series = New Series(title, ViewType.Pie)
series.Label.TextPattern = "{A}: {VP:p0}"
Dim view As PieSeriesView = DirectCast(series.View, PieSeriesView)
view.Titles.Add(New SeriesTitle())
view.Titles(0).Text = title
Case Else
series = New Series(title, ViewType.Bar)
End Select
Return series
End Function
Private Function Select_Chart(index As Integer)
Select Case index
Case 0
Return ChartTopLeft
Case 1
Return ChartTopRight
Case 2
Return ChartBottomLeft
Case Else
Return ChartBottomRight
End Select
End Function
Private Sub Configure_Chart_Tool_Bars()
ToolStripTopLeft.Tag = ChartTopLeft
ToolStripTopRight.Tag = ChartTopRight
ToolStripBottomLeft.Tag = ChartBottomLeft
ToolStripBottomRight.Tag = ChartBottomRight
For Each toolbar As ToolStrip In toolbars
toolbar.Items.Add("Export to Excel", My.Resources.xls, AddressOf ExportToExcel_Click)
toolbar.Items.Add("Export to PDF", My.Resources.pdf, AddressOf ExportToPdf_Click)
toolbar.Items.Add("Export to Image", My.Resources.bmp, AddressOf ExportToImage_Click)
Next
End Sub
Private Sub Confirm_Open_File(filepath As String)
Dim filename As String = New FileInfo(filepath).Name
Dim message As String
If USER_LANGUAGE = "de_DE" Then
message = String.Format("Datei {0} erstellt. Jetzt öffnen?", filename)
Else
message = String.Format("File {0} created. Open now?", filename)
End If
Dim successResult As DialogResult = MessageBox.Show(message, "Success", MessageBoxButtons.YesNo)
If successResult = System.Windows.Forms.DialogResult.Yes Then
Process.Start(filepath)
End If
End Sub
Private Sub ExportToPdf_Click(sender As ToolStripItem, e As EventArgs)
Dim item As ToolStripItem = sender
Dim toolbar As ToolStrip = item.GetCurrentParent()
Dim chart As ChartControl = toolbar.Tag
ExportCharts(New List(Of ChartControl) From {chart}, "pdf")
End Sub
Private Sub ExportToExcel_Click(sender As ToolStripItem, e As EventArgs)
Dim item As ToolStripItem = sender
Dim toolbar As ToolStrip = item.GetCurrentParent()
Dim chart As ChartControl = toolbar.Tag
ExportCharts(New List(Of ChartControl) From {chart}, "xls")
End Sub
Private Sub ExportToImage_Click(sender As ToolStripItem, e As EventArgs)
Dim item As ToolStripItem = sender
Dim toolbar As ToolStrip = item.GetCurrentParent()
Dim chart As ChartControl = toolbar.Tag
ExportCharts(New List(Of ChartControl) From {chart}, "img")
End Sub
Private Sub ToolStripButton1_Click(sender As Object, e As EventArgs) Handles ToolStripButton1.Click
ExportCharts(charts, "pdf")
End Sub
Private Sub ExportCharts(_charts As List(Of ChartControl), Optional ext As String = "pdf")
Try
' Setup the 'page'
Dim printingSystem As New PrintingSystem
Dim compositeLink As New CompositeLink(printingSystem)
Dim count = 1 ' chart counter
compositeLink.Landscape = True ' set to landscape
AddHandler compositeLink.CreateMarginalHeaderArea, AddressOf compositeLink_CreateMarginalHeaderArea
' Create Title
Dim titleLink As New Link()
AddHandler titleLink.CreateDetailHeaderArea, AddressOf titleLink_CreateDetailHeaderArea
compositeLink.Links.Add(titleLink)
' Loop through charts
For Each chart As ChartControl In _charts
chart.OptionsPrint.SizeMode = Printing.PrintSizeMode.Zoom
Dim link As New PrintableComponentLink()
link.Component = chart
compositeLink.Links.Add(link)
If groupCount <= count Then
Exit For
Else
count = count + 1
End If
Next
Select Case ext
Case "img"
saveDialog.Filter = "PNG Images|*.png"
Case "xls"
saveDialog.Filter = "Excel Files|*.xlsx"
Case Else
saveDialog.Filter = "PDF Files|*.pdf"
End Select
saveDialog.FileName = String.Format("ADDI_Report_Export_{0}", Date.Now().ToString("dd-MM-yyyy"))
Dim result As DialogResult = saveDialog.ShowDialog()
If result = System.Windows.Forms.DialogResult.OK Then
Dim filename As String = saveDialog.FileName
Select Case ext
Case "img"
compositeLink.ExportToImage(filename)
Case "xls"
compositeLink.ExportToXlsx(filename)
Case Else
compositeLink.ExportToPdf(filename)
End Select
Application.DoEvents()
Confirm_Open_File(filename)
End If
Catch ex As Exception
MsgBox("Error while exporting Charts: " & vbNewLine & ex.Message, MsgBoxStyle.Critical)
End Try
End Sub
Private Sub compositeLink_CreateMarginalHeaderArea(sender As Object, e As CreateAreaEventArgs)
e.Graph.Font = New Font("Segoe UI", 10)
e.Graph.DrawPageInfo(PageInfo.DateTime, "{0:dd.MM.yyyy hhhh:mmmm}", Color.Black, New RectangleF(0, 0, 200, 50), BorderSide.None)
End Sub
Private Sub titleLink_CreateDetailHeaderArea(sender As Object, e As CreateAreaEventArgs)
Dim tbTitle As New TextBrick
Dim title As String
If txtExportTitle.Text.Trim <> String.Empty Then
title = txtExportTitle.Text
Else
title = CHART_TITLE_STRING
End If
tbTitle.Text = title
tbTitle.Font = New Font("Segoe UI", 18)
tbTitle.Rect = New RectangleF(0, 0, 300, 40)
tbTitle.BorderWidth = 0
tbTitle.BackColor = Color.Transparent
tbTitle.HorzAlignment = DevExpress.Utils.HorzAlignment.Near
e.Graph.DrawBrick(tbTitle)
End Sub
End Class