1
0
Fork 0
libreoffice/wizards/source/sfdocuments/SF_Chart.xba
Daniel Baumann 8e63e14cf6
Adding upstream version 4:25.2.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 16:20:04 +02:00

814 lines
No EOL
37 KiB
XML

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