REM ======================================================================================================================= REM === The ScriptForge library and its associated libraries are part of the LibreOffice project. === REM === The SFDocuments library is one of the associated libraries. === REM === Full documentation is available on https://help.libreoffice.org/ === REM ======================================================================================================================= Option Compatible Option ClassModule Option Explicit ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ''' SF_Chart ''' ======== ''' ''' The SF_Chart module is focused on the description of chart documents ''' stored in Calc sheets. ''' With this service, many chart types and chart characteristics available ''' in the user interface can be read or modified. ''' ''' Definitions ''' Charts have 2 distinct names: ''' - an internal name, given by the LibreOffice application ''' - an optional user-defined name ''' In the scope of the ScriptForge libraries, the chart name is the name given by the user. ''' Only when there is no user name, the internal name may be used instead. ''' ''' Service invocation from the "Calc" service ''' Either make a new chart ''' calc.CreateChart(ChartName, SheetName, "SheetX.A1:C8") ''' or select an existing one ''' calc.Charts(SheetName, ChartName) ''' ''' Detailed user documentation: ''' https://help.libreoffice.org/latest/en-US/text/sbasic/shared/03/sf_chart.html?DbPAR=BASIC ''' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' REM ================================================================== EXCEPTIONS Private Const CHARTEXPORTERROR = "CHARTEXPORTERROR" REM ============================================================= PRIVATE MEMBERS Private [Me] As Object Private [_Parent] As Object ' Parent Calc document Private ObjectType As String ' Must be CHART Private ServiceName As String ' Chart description Private _SheetName As String ' Name of the Calc sheet containing the chart Private _DrawIndex As Long ' Index of the chart in the sheet's draw page Private _ChartName As String ' User name Private _PersistentName As String ' Internal name Private _Shape As Object ' com.sun.star.drawing.XShape Private _Chart As Object ' com.sun.star.table.XTableChart Private _ChartObject As Object ' com.sun.star.lang.XComponent - ScChartObj Private _Diagram As Object ' com.sun.star.chart.XDiagram REM ============================================================ MODULE CONSTANTS REM ====================================================== CONSTRUCTOR/DESTRUCTOR REM ----------------------------------------------------------------------------- Private Sub Class_Initialize() Set [Me] = Nothing Set [_Parent] = Nothing ObjectType = "CHART" ServiceName = "SFDocuments.Chart" _SheetName = "" _DrawIndex = -1 _ChartName = "" _PersistentName = "" Set _Shape = Nothing Set _Chart = Nothing Set _ChartObject = Nothing Set _Diagram = Nothing End Sub ' SFDocuments.SF_Chart Constructor REM ----------------------------------------------------------------------------- Private Sub Class_Terminate() Call Class_Initialize() End Sub ' SFDocuments.SF_Chart Destructor REM ----------------------------------------------------------------------------- Public Function Dispose() As Variant Call Class_Terminate() Set Dispose = Nothing End Function ' SFDocuments.SF_Chart Explicit Destructor REM ================================================================== PROPERTIES REM ----------------------------------------------------------------------------- Property Get ChartType() As Variant ''' The ChartType property specifies the type of chart as a string among next values: ''' Pie, Bar, Donut, Column, Area, Line, XY, Bubble, Net ChartType = _PropertyGet("ChartType") End Property ' SFDocuments.SF_Chart.ChartType (get) REM ----------------------------------------------------------------------------- Property Let ChartType(Optional ByVal pvChartType As Variant) ''' Set the updatable property ChartType _PropertySet("ChartType", pvChartType) End Property ' SFDocuments.SF_Chart.ChartType (let) REM ----------------------------------------------------------------------------- Property Get Deep() As Variant ''' If True, determines that in a three-dimensional bar chart the bars of each series are arranged behind each other in the z-direction. ''' If False the arrangement of bars is like in two-dimensional bar charts. ''' Bar and Column chart types only Deep = _PropertyGet("Deep") End Property ' SFDocuments.SF_Chart.Deep (get) REM ----------------------------------------------------------------------------- Property Let Deep(Optional ByVal pvDeep As Variant) ''' Set the updatable property Deep _PropertySet("Deep", pvDeep) End Property ' SFDocuments.SF_Chart.Deep (let) REM ----------------------------------------------------------------------------- Property Get Dim3D() As Variant ''' The Dim3D property specifies if the chart is displayed with 3D elements ''' String or Boolean ''' When String, must be 1 of next values: Bar, Cylinder, Cone or Pyramid ''' When Boolean True, Bar is assumed; when False, no 3D to be applied Dim3D = _PropertyGet("Dim3D") End Property ' SFDocuments.SF_Chart.Dim3D (get) REM ----------------------------------------------------------------------------- Property Let Dim3D(Optional ByVal pvDim3D As Variant) ''' Set the updatable property Dim3D _PropertySet("Dim3D", pvDim3D) End Property ' SFDocuments.SF_Chart.Dim3D (let) REM ----------------------------------------------------------------------------- Property Get Exploded() As Variant ''' the offset by which pie segments in a PieDiagram (pie or donut) are dragged outside from the center. ''' This value is given in percent of the radius. Exploded = _PropertyGet("Exploded") End Property ' SFDocuments.SF_Chart.Exploded (get)_ChartObject REM ----------------------------------------------------------------------------- Property Let Exploded(Optional ByVal pvExploded As Variant) ''' Set the updatable property Exploded _PropertySet("Exploded", pvExploded) End Property ' SFDocuments.SF_Chart.Exploded (let) REM ----------------------------------------------------------------------------- Property Get Filled() As Variant ''' When True, the Net diagram is said of FilledNet type ''' Net chart type only Filled = _PropertyGet("Filled") End Property ' SFDocuments.SF_Chart.Filled (get) REM ----------------------------------------------------------------------------- Property Let Filled(Optional ByVal pvFilled As Variant) ''' Set the updatable property Filled _PropertySet("Filled", pvFilled) End Property ' SFDocuments.SF_Chart.Filled (let) REM ----------------------------------------------------------------------------- Property Get Legend() As Variant ''' Specifies if the chart has a legend Legend = _PropertyGet("Legend") End Property ' SFDocuments.SF_Chart.Legend (get) REM ----------------------------------------------------------------------------- Property Let Legend(Optional ByVal pvLegend As Variant) ''' Set the updatable property Legend _PropertySet("Legend", pvLegend) End Property ' SFDocuments.SF_Chart.Legend (let) REM ----------------------------------------------------------------------------- Property Get Percent() As Variant ''' When True, the series of the diagram are stacked and each category sums up to 100%. ''' Area, Bar, Bubble, Column and Net chart types only_ChartObject Percent = _PropertyGet("Percent") End Property ' SFDocuments.SF_Chart.Percent (get) REM ----------------------------------------------------------------------------- Property Let Percent(Optional ByVal pvPercent As Variant) ''' Set the updatable property Percent _PropertySet("Percent", pvPercent) End Property ' SFDocuments.SF_Chart.Percent (let) REM ----------------------------------------------------------------------------- Property Get Stacked() As Variant ''' When True, the series of the diagram are stacked. ''' Area, Bar, Bubble, Column and Net chart types only Stacked = _PropertyGet("Stacked") End Property ' SFDocuments.SF_Chart.Stacked (get) REM ----------------------------------------------------------------------------- Property Let Stacked(Optional ByVal pvStacked As Variant) ''' Set the updatable property Stacked _PropertySet("Stacked", pvStacked) End Property ' SFDocuments.SF_Chart.Stacked (let) REM ----------------------------------------------------------------------------- Property Get Title() As Variant ''' Specifies the main title of the chart Title = _PropertyGet("Title") End Property ' SFDocuments.SF_Chart.Title (get) REM ----------------------------------------------------------------------------- Property Let Title(Optional ByVal pvTitle As Variant) ''' Set the updatable property Title _PropertySet("Title", pvTitle) End Property ' SFDocuments.SF_Chart.Title (let) REM ----------------------------------------------------------------------------- Property Get XTitle() As Variant ''' Specifies the main XTitle of the chart XTitle = _PropertyGet("XTitle") End Property ' SFDocuments.SF_Chart.XTitle (get) REM ----------------------------------------------------------------------------- Property Let XTitle(Optional ByVal pvXTitle As Variant) ''' Set the updatable property XTitle _PropertySet("XTitle", pvXTitle) End Property ' SFDocuments.SF_Chart.XTitle (let) REM ----------------------------------------------------------------------------- Property Get YTitle() As Variant ''' Specifies the main YTitle of the chart YTitle = _PropertyGet("YTitle") End Property ' SFDocuments.SF_Chart.YTitle (get) REM ----------------------------------------------------------------------------- Property Let YTitle(Optional ByVal pvYTitle As Variant) ''' Set the updatable property YTitle _PropertySet("YTitle", pvYTitle) End Property ' SFDocuments.SF_Chart.YTitle (let) REM ----------------------------------------------------------------------------- Property Get XChartObj() As Variant ''' com.sun.star.lang.XComponent - ScChartObj ChartType = _PropertyGet("XChartObj") End Property ' SFDocuments.SF_Chart.XChartObj (get) REM ----------------------------------------------------------------------------- Property Get XDiagram() As Variant ''' com.sun.star.chart.XDiagram ChartType = _PropertyGet("XDiagram") End Property ' SFDocuments.SF_Chart.XDiagram (get) REM ----------------------------------------------------------------------------- Property Get XShape() As Variant ''' com.sun.star.drawing.XShape ChartType = _PropertyGet("XShape") End Property ' SFDocuments.SF_Chart.XShape (get) REM ----------------------------------------------------------------------------- Property Get XTableChart() As Variant ''' com.sun.star.table.XTableChart ChartType = _PropertyGet("XTableChart") End Property ' SFDocuments.SF_Chart.XTableChart (get) REM ===================================================================== METHODS REM ----------------------------------------------------------------------------- Public Function ExportToFile(Optional ByVal FileName As Variant _ , Optional ByVal ImageType As Variant _ , Optional ByVal Overwrite As Variant _ ) As Boolean ''' Store the chart as an image to the given file location ''' Args: ''' FileName: Identifies the file where to save. It must follow the SF_FileSystem.FileNaming notation ''' ImageType: the name of the targeted image type ''' Allowed values: gif, jpeg, png (default), svg and tiff ''' Overwrite: True if the destination file may be overwritten (default = False) ''' Returns: ''' False if the document could not be saved ''' Exceptions: ''' CHARTEXPORTERROR The destination has its readonly attribute set or overwriting rejected ''' Examples: ''' oChart.ExportToFile("C:\Me\Chart2.gif", ImageType := "gif", Overwrite := True) Dim bSaved As Boolean ' return value Dim oSfa As Object ' com.sun.star.ucb.SimpleFileAccess Dim sFile As String ' Alias of FileName Dim vStoreArguments As Variant ' Array of com.sun.star.beans.PropertyValue Dim FSO As Object ' SF_FileSystem Dim oExport As Object ' com.sun.star.drawing.GraphicExportFilter Dim vImageTypes As Variant ' Array of permitted image types Dim vMimeTypes As Variant ' Array of corresponding mime types in the same order as vImageTypes Const cstImageTypes = "gif,jpeg,png,svg,tiff" Const cstMimeTypes = "image/gif,image/jpeg,image/png,image/svg+xml,image/tiff" Const cstThisSub = "SFDocuments.Chart.ExportToFile" Const cstSubArgs = "FileName, [ImageType=""png""|""gif""|""jpeg""|""svg""|""tiff""], [Overwrite=False]" If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo CatchError bSaved = False Check: If IsMissing(ImageType) Or IsEmpty(ImageType) Then ImageType = "png" If IsMissing(Overwrite) Or IsEmpty(Overwrite) Then Overwrite = False vImageTypes = Split(cstImageTypes, ",") If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then If Not [_Parent]._IsStillAlive() Then GoTo Finally If Not ScriptForge.SF_Utils._ValidateFile(FileName, "FileName") Then GoTo Finally If Not ScriptForge.SF_Utils._Validate(ImageType, "ImageType", V_STRING, vImageTypes) Then GoTo Finally If Not ScriptForge.SF_Utils._Validate(Overwrite, "Overwrite", ScriptForge.V_BOOLEAN) Then GoTo Finally End If ' Check destination file overwriting Set FSO = CreateScriptService("FileSystem") sFile = FSO._ConvertToUrl(FileName) If FSO.FileExists(FileName) Then If Overwrite = False Then GoTo CatchError Set oSfa = ScriptForge.SF_Utils._GetUNOService("FileAccess") If oSfa.isReadonly(sFile) Then GoTo CatchError End If Try: ' Setup arguments vMimeTypes = Split(cstMimeTypes, ",") vStoreArguments = Array( _ ScriptForge.SF_Utils._MakePropertyValue("URL", sFile) _ , ScriptForge.SF_Utils._MakePropertyValue("MediaType" _ , vMimeTypes(ScriptForge.SF_Array.IndexOf(vImageTypes, ImageType, CaseSensitive := False))) _ ) ' Export with the com.sun.star.drawing.GraphicExportFilter UNO service Set oExport = ScriptForge.SF_Utils._GetUNOService("GraphicExportFilter") With oExport .setSourceDocument(_Shape) .filter(vStoreArguments) End With bSaved = True Finally: ExportToFile = bSaved ScriptForge.SF_Utils._ExitFunction(cstThisSub) Exit Function Catch: GoTo Finally CatchError: ScriptForge.SF_Exception.RaiseFatal(CHARTEXPORTERROR, "FileName", FileName, "Overwrite", Overwrite) GoTo Finally End Function ' SFDocuments.SF_Chart.ExportToFile REM ----------------------------------------------------------------------------- Public Function GetProperty(Optional ByVal PropertyName As Variant) As Variant ''' Return the actual value of the given property ''' Args: ''' PropertyName: the name of the property as a string ''' Returns: ''' The actual value of the property ''' If the property does not exist, returns Null ''' Exceptions: ''' ARGUMENTERROR The property does not exist Const cstThisSub = "SFDocuments.Chart.GetProperty" Const cstSubArgs = "" If SF_Utils._ErrorHandling() Then On Local Error GoTo Catch GetProperty = Null Check: If SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then If Not SF_Utils._Validate(PropertyName, "PropertyName", V_STRING, Properties()) Then GoTo Catch End If Try: GetProperty = _PropertyGet(PropertyName) Finally: SF_Utils._ExitFunction(cstThisSub) Exit Function Catch: GoTo Finally End Function ' SFDocuments.SF_Chart.GetProperty REM ----------------------------------------------------------------------------- Public Function Methods() As Variant ''' Return the list of public methods of the Chart service as an array Methods = Array( _ "ExportToFile" _ , "Resize" _ ) End Function ' SFDocuments.SF_Chart.Methods REM ----------------------------------------------------------------------------- Public Function Properties() As Variant ''' Return the list or properties of the Chart class as an array Properties = Array( _ "ChartType" _ , "Deep" _ , "Dim3D" _ , "Exploded" _ , "Filled" _ , "Legend" _ , "Percent" _ , "Stacked" _ , "Title" _ , "XChartObj" _ , "XDiagram" _ , "XShape" _ , "XTableChart" _ , "XTitle" _ , "YTitle" _ ) End Function ' SFDocuments.SF_Chart.Properties REM ----------------------------------------------------------------------------- Public Function Resize(Optional ByVal XPos As Variant _ , Optional ByVal YPos As Variant _ , Optional ByVal Width As Variant _ , Optional ByVal Height As Variant _ ) As Boolean ''' Move the topleft corner of a chart to new coordinates and/or modify its dimensions ''' All distances are expressed in 1/100th mm ''' Args: ''' XPos : the vertical distance from the topleft corner ''' YPos : the horizontal distance from the topleft corner ''' Width : the horizontal width of the shape containing the chart ''' Height : the vertical height of the shape containing the chart ''' Negative or missing arguments are left unchanged ''' Returns: ''' True when successful ''' Examples: ''' oChart.Resize(1000, 2000, Height := 6000) ' Width is not changed Dim bResize As Boolean ' Return value Dim oPosition As Object ' com.sun.star.awt.Point Dim oSize As Object ' com.sun.star.awt.Size Const cstThisSub = "SFDocuments.Chart.Resize" Const cstSubArgs = "[XPos], [YPos], [Width], [Height]" If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch bResize = False Check: If IsMissing(XPos) Or IsEmpty(XPos) Then XPos = -1 If IsMissing(YPos) Or IsEmpty(YPos) Then YPos = -1 If IsMissing(Height) Or IsEmpty(Height) Then Height = -1 If IsMissing(Width) Or IsEmpty(Width) Then Width = -1 If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then If Not [_Parent]._IsStillAlive() Then GoTo Finally If Not ScriptForge.SF_Utils._Validate(XPos, "XPos", ScriptForge.V_NUMERIC) Then GoTo Finally If Not ScriptForge.SF_Utils._Validate(YPos, "YPos", ScriptForge.V_NUMERIC) Then GoTo Finally If Not ScriptForge.SF_Utils._Validate(Width, "Width", ScriptForge.V_NUMERIC) Then GoTo Finally If Not ScriptForge.SF_Utils._Validate(Height, "Height", ScriptForge.V_NUMERIC) Then GoTo Finally End If Try: With _Shape ' Get the current values Set oPosition = .Position Set oSize = .Size ' Modify relevant elements If XPos >= 0 Then oPosition.X = CLng(XPos) If YPos >= 0 Then oPosition.Y = CLng(YPos) If Width > 0 Then oSize.Width = CLng(Width) If Height > 0 Then oSize.Height = CLng(Height) ' Rewrite .setPosition(oPosition) .setSize(oSize) End With bResize = True Finally: Resize = bResize ScriptForge.SF_Utils._ExitFunction(cstThisSub) Exit Function Catch: GoTo Finally End Function ' SF_Documents.SF_Chart.Resize REM ----------------------------------------------------------------------------- Public Function SetProperty(Optional ByVal PropertyName As Variant _ , Optional ByRef Value As Variant _ ) As Boolean ''' Set a new value to the given property ''' Args: ''' PropertyName: the name of the property as a string ''' Value: its new value ''' Exceptions ''' ARGUMENTERROR The property does not exist Const cstThisSub = "SFDocuments.Chart.SetProperty" Const cstSubArgs = "PropertyName, Value" If SF_Utils._ErrorHandling() Then On Local Error GoTo Catch SetProperty = False Check: If SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then If Not ScriptForge.SF_Utils._Validate(PropertyName, "PropertyName", V_STRING, Properties()) Then GoTo Catch End If Try: SetProperty = _PropertySet(PropertyName, Value) Finally: SF_Utils._ExitFunction(cstThisSub) Exit Function Catch: GoTo Finally End Function ' SFDocuments.SF_Chart.SetProperty REM =========================================================== PRIVATE FUNCTIONS REM ----------------------------------------------------------------------------- Private Function _PropertyGet(Optional ByVal psProperty As String) As Variant ''' Return the value of the named property ''' Args: ''' psProperty: the name of the property Static oSession As Object ' Alias of SF_Session Dim vData As Variant ' Data points array of values Dim cstThisSub As String Const cstSubArgs = "" cstThisSub = "SFDocuments.Chart.get" & psProperty SF_Utils._EnterFunction(cstThisSub, cstSubArgs) If Not [_Parent]._IsStillAlive() Then GoTo Finally If IsNull(oSession) Then Set oSession = ScriptForge.SF_Services.CreateScriptService("Session") Select Case UCase(psProperty) Case UCase("ChartType") With _Diagram Select Case .DiagramType Case "com.sun.star.chart.BarDiagram" If .Vertical Then _PropertyGet = "Bar" Else _PropertyGet = "Column" Case "com.sun.star.chart.PieDiagram" _PropertyGet = "Pie" Case "com.sun.star.chart.DonutDiagram" _PropertyGet = "Donut" Case "com.sun.star.chart.AreaDiagram" _PropertyGet = "Area" Case "com.sun.star.chart.LineDiagram" _PropertyGet = "Line" Case "com.sun.star.chart.XYDiagram" _PropertyGet = "XY" Case "com.sun.star.chart.BubbleDiagram" _PropertyGet = "Bubble" Case "com.sun.star.chart.NetDiagram", "com.sun.star.chart.FilledNetDiagram" _PropertyGet = "Net" Case Else _PropertyGet = "" End Select End With Case UCase("Deep") If oSession.HasUnoProperty(_Diagram, "Deep") Then _PropertyGet = _Diagram.Deep Else _PropertyGet = False Case UCase("Dim3D") If oSession.HasUnoProperty(_Diagram, "Dim3D") Then If _Diagram.Dim3D Then If oSession.HasUnoProperty(_Diagram, "SolidType") Then Select Case _Diagram.SolidType Case com.sun.star.chart.ChartSolidType.RECTANGULAR_SOLID : _PropertyGet = "Bar" Case com.sun.star.chart.ChartSolidType.CYLINDER : _PropertyGet = "Cylinder" Case com.sun.star.chart.ChartSolidType.CONE : _PropertyGet = "Cone" Case com.sun.star.chart.ChartSolidType.PYRAMID : _PropertyGet = "Pyramid" End Select Else _PropertyGet = _Diagram.Dim3D End If Else _PropertyGet = False End If Else _PropertyGet = False End If Case UCase("Exploded") If oSession.HasUnoProperty(_ChartObject, "Data") Then ' All data points are presumed exploded with the same coefficient. Determine the (0, 0)th With _ChartObject vData = .Data.Data _PropertyGet = 0 If IsArray(vData) Then If UBound(vData) >= 0 Then If IsArray(vData(0)) Then If UBound(vData(0)) >= 0 Then _PropertyGet = _Diagram.getDataPointProperties(0, 0).SegmentOffset End If End If End If End With End If Case UCase("Filled") _PropertyGet = ( _Diagram.DiagramType = "com.sun.star.chart.FilledNetDiagram" ) Case UCase("Legend") If oSession.HasUnoProperty(_ChartObject, "HasLegend") Then _PropertyGet = _ChartObject.HasLegend Else _PropertyGet = False Case UCase("Percent") If oSession.HasUnoProperty(_Diagram, "Percent") Then _PropertyGet = _Diagram.Percent Else _PropertyGet = False Case UCase("Stacked") If oSession.HasUnoProperty(_Diagram, "Stacked") Then _PropertyGet = _Diagram.Stacked Else _PropertyGet = False Case UCase("Title") If oSession.HasUnoProperty(_ChartObject, "HasMainTitle") Then If _ChartObject.HasMainTitle Then _PropertyGet = _ChartObject.Title.String Else _PropertyGet = "" End If Case UCase("XTitle") If oSession.HasUnoProperty(_Diagram, "HasXAxisTitle") Then If _Diagram.HasXAxisTitle Then _PropertyGet = _Diagram.XAxisTitle.String Else _PropertyGet = "" End If Case UCase("YTitle") If oSession.HasUnoProperty(_Diagram, "HasYAxisTitle") Then If _Diagram.HasYAxisTitle Then _PropertyGet = _Diagram.YAxisTitle.String Else _PropertyGet = "" End If Case UCase("XChartObj") Set _PropertyGet = _ChartObject Case UCase("XDiagram") Set _PropertyGet = _Diagram Case UCase("XShape") Set _PropertyGet = _Shape Case UCase("XTableChart") Set _PropertyGet = _Chart Case Else _PropertyGet = Null End Select Finally: SF_Utils._ExitFunction(cstThisSub) Exit Function End Function ' SFDocuments.SF_Chart._PropertyGet REM ----------------------------------------------------------------------------- Private Function _PropertySet(Optional ByVal psProperty As String _ , Optional ByVal pvValue As Variant _ ) As Boolean ''' Set the new value of the named property ''' Args: ''' psProperty: the name of the property ''' pvValue: the new value of the given property Dim bSet As Boolean ' Return value Static oSession As Object ' Alias of SF_Session Dim sChartType As String ' Diagram type Dim bDim3D As Boolean ' Alias of Dim3D property of diagram Dim bVertical As Boolean ' When True, chart type is a bar, not a column Dim vData As Variant ' Data points array of values Dim i As Long, j As Long Const cstChart = "com.sun.star.chart." Dim cstThisSub As String Const cstSubArgs = "Value" If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch bSet = False cstThisSub = "SFDocuments.Chart.set" & psProperty ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) If Not [_Parent]._IsStillAlive() Then GoTo Catch bSet = True If IsNull(oSession) Then Set oSession = ScriptForge.SF_Services.CreateScriptService("Session") Select Case UCase(psProperty) Case UCase("ChartType") If Not ScriptForge.SF_Utils._Validate(pvValue, "ChartType", V_STRING _ , Array("Bar", "Column", "Pie", "Donut", "Area", "Line", "XY", "Bubble", "Net") _ ) Then GoTo Finally With _Diagram ' Specify the targeted chart type Select Case UCase(pvValue) Case "BAR", "COLUMN" : sChartType = cstChart & "BarDiagram" Case "PIE" : sChartType = cstChart & "PieDiagram" Case "DONUT" : sChartType = cstChart & "DonutDiagram" Case "AREA" : sChartType = cstChart & "AreaDiagram" Case "LINE" : sChartType = cstChart & "LineDiagram" Case "XY" : sChartType = cstChart & "XYDiagram" Case "BUBBLE" : sChartType = cstChart & "BubbleDiagram" Case "NET" : sChartType = cstChart & "NetDiagram" End Select ' If there is no change, do nothing If sChartType <> .DiagramType Then ' Some combinations old type => new type require the cancellation of 3D graphs bDim3D = .Dim3D .Dim3D = False _ChartObject.createInstance(sChartType) Set _Diagram = _ChartObject.Diagram .Dim3D = bDim3D End If If UCase(pvValue) = "BAR" Or UCase(pvValue) = "COLUMN" Then .Vertical = ( UCase(pvValue) = "BAR" ) End With Case UCase("Deep") If Not ScriptForge.SF_Utils._Validate(pvValue, "Deep", ScriptForge.V_BOOLEAN) Then GoTo Finally If oSession.HasUnoProperty(_Diagram, "Deep") Then _Diagram.Deep = pvValue Case UCase("Dim3D") If Not ScriptForge.SF_Utils._Validate(pvValue, "Dim3D", Array(ScriptForge.V_Boolean, V_STRING) _ , Array(False, True, "Bar", "Cylinder", "Cone", "Pyramid") _ ) Then GoTo Finally With _Diagram If oSession.HasUnoProperty(_Diagram, "Dim3D") Then If _Diagram.DiagramType = "com.sun.star.chart.BubbleDiagram" Then .Dim3D = False ' Force False value to avoid empty graph ElseIf VarType(pvValue) = V_STRING Then bVertical = .Vertical .Dim3D = True .Vertical = bVertical If oSession.HasUnoProperty(_Diagram, "SolidType") Then If .DiagramType = cstChart & "BarDiagram" Then Select Case UCase(pvValue) Case "BAR" : .SolidType = com.sun.star.chart.ChartSolidType.RECTANGULAR_SOLID Case "CYLINDER" : .SolidType = com.sun.star.chart.ChartSolidType.CYLINDER Case "CONE" : .SolidType = com.sun.star.chart.ChartSolidType.CONE Case "PYRAMID" : .SolidType = com.sun.star.chart.ChartSolidType.PYRAMID End Select Else .SolidType = 0 End If End If Else ' Boolean If oSession.HasUnoProperty(_Diagram, "SolidType") Then .SolidType = 0 .Dim3D = pvValue End If End If End With Case UCase("Exploded") If oSession.HasUnoProperty(_ChartObject, "Data") And _Diagram.DiagramType <> "com.sun.star.chart.BubbleDiagram" Then ' All data points are presumed exploded with the same coefficient If Not ScriptForge.SF_Utils._Validate(pvValue, "Exploded", ScriptForge.V_NUMERIC) Then GoTo Finally With _ChartObject vData = .Data.Data If IsArray(vData) Then For i = 0 To UBound(vData) If IsArray(vData(i)) Then For j = 0 To UBound(vData(i)) _Diagram.getDataPointProperties(i, j).SegmentOffset = CLng(pvValue) Next j End If Next i End If End With End If Case UCase("Filled") ' Flipflop between NetDiagram and FilledNetDiagram If Not ScriptForge.SF_Utils._Validate(pvValue, "Filled", ScriptForge.V_BOOLEAN) Then GoTo Finally With _Diagram ' Specify the targeted chart type sChartType = cstChart & Iif(pvValue, "Filled", "") & "NetDiagram" ' If there is no change, do nothing If sChartType <> .DiagramType then ' Do not apply if the chart type not = "Net" If (pvValue And .DiagramType = cstChart & "NetDiagram") _ Or (Not pvValue And .DiagramType = cstChart & "FilledNetDiagram") Then ' Some combinations old type => new type require the cancellation of 3D graphs bDim3D = .Dim3D .Dim3D = False _ChartObject.createInstance(sChartType) Set _Diagram = _ChartObject.Diagram .Dim3D = bDim3D End If End If End With Case UCase("Legend") If Not ScriptForge.SF_Utils._Validate(pvValue, "Legend", ScriptForge.V_BOOLEAN) Then GoTo Finally If oSession.HasUnoProperty(_ChartObject, "HasLegend") Then _ChartObject.HasLegend = pvValue Case UCase("Percent") If Not ScriptForge.SF_Utils._Validate(pvValue, "Percent", ScriptForge.V_BOOLEAN) Then GoTo Finally If oSession.HasUnoProperty(_Diagram, "Percent") Then _Diagram.Stacked = pvValue _Diagram.Percent = pvValue End If Case UCase("Stacked") If Not ScriptForge.SF_Utils._Validate(pvValue, "Stacked", ScriptForge.V_BOOLEAN) Then GoTo Finally If oSession.HasUnoProperty(_Diagram, "Stacked") Then _Diagram.Stacked = pvValue If Not pvValue Then _Diagram.Percent = False End If Case UCase("Title") If Not ScriptForge.SF_Utils._Validate(pvValue, "Title", V_STRING) Then GoTo Finally If oSession.HasUnoProperty(_ChartObject, "HasMainTitle") Then _ChartObject.HasMainTitle = ( Len(pvValue) > 0 ) If Len(pvValue) > 0 Then _ChartObject.Title.String = pvValue End If Case UCase("XTitle") If Not ScriptForge.SF_Utils._Validate(pvValue, "XTitle", V_STRING) Then GoTo Finally If oSession.HasUnoProperty(_Diagram, "HasXAxisTitle") Then _Diagram.HasXAxisTitle = ( Len(pvValue) > 0 ) If Len(pvValue) > 0 Then _Diagram.XAxisTitle.String = pvValue End If Case UCase("YTitle") If Not ScriptForge.SF_Utils._Validate(pvValue, "YTitle", V_STRING) Then GoTo Finally If oSession.HasUnoProperty(_Diagram, "HasYAxisTitle") Then _Diagram.HasYAxisTitle = ( Len(pvValue) > 0 ) If Len(pvValue) > 0 Then _Diagram.YAxisTitle.String = pvValue End If Case Else bSet = False End Select Finally: _PropertySet = bSet ScriptForge.SF_Utils._ExitFunction(cstThisSub) Exit Function Catch: bSet = False GoTo Finally End Function ' SFDocuments.SF_FormControl._PropertySet REM ----------------------------------------------------------------------------- Private Function _Repr() As String ''' Convert the Chart instance to a readable string, typically for debugging purposes (DebugPrint ...) ''' Args: ''' Return: ''' "[Chart]: Name - Type _Repr = "[Chart]: " & ChartName & " - " & ChartType End Function ' SFDocuments.SF_Chart._Repr REM ============================================ END OF SFDOCUMENTS.SF_CHART