123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814 |
- <?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
- '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
- ''' 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
- </script:module>
|