wizards/Package_sfdocuments.mk                   |    1 
 wizards/source/scriptforge/SF_Exception.xba      |   15 
 wizards/source/scriptforge/SF_PythonHelper.xba   |    1 
 wizards/source/scriptforge/SF_Root.xba           |   28 
 wizards/source/scriptforge/SF_String.xba         |    2 
 wizards/source/scriptforge/SF_Utils.xba          |    5 
 wizards/source/scriptforge/po/ScriptForge.pot    |   37 +
 wizards/source/scriptforge/po/en.po              |   37 +
 wizards/source/scriptforge/python/scriptforge.py |   31 
 wizards/source/sfdocuments/SF_Calc.xba           |  175 ++++
 wizards/source/sfdocuments/SF_Chart.xba          |  815 +++++++++++++++++++++++
 wizards/source/sfdocuments/SF_FormControl.xba    |    3 
 wizards/source/sfdocuments/script.xlb            |    1 
 13 files changed, 1145 insertions(+), 6 deletions(-)

New commits:
commit ef08207a290c0dc537c698ec3389779a27085c04
Author:     Jean-Pierre Ledure <j...@ledure.be>
AuthorDate: Sun Aug 1 17:36:03 2021 +0200
Commit:     Jean-Pierre Ledure <j...@ledure.be>
CommitDate: Mon Aug 2 10:45:37 2021 +0200

    ScriptForge - (SF_Chart) new service to manage Calc charts
    
    New methods in the SF_Calc service:
      Charts(), to list charts or to instantiate a chart service
      CreateChart, to create a new chart in a given Calc sheet
    
    The SF_Chart service has next properties to parameter the type
    and the characteristics of the (new or pre-existing) chart
      ChartType, Deep, Dim3d, Exploded, Filled, Legend, Percent, Stacked,
      Title, XTitle, YTitle
    Next methods are available:
      Resize, to move and resize the chart shape
      ExportToFile, to export the chart as a graphical object
        Supported: gif, jpeg, png, svg and tiff
    
    New error messages in SF_Root and SF_Exception.
    Corresponding labels are integrated in the POT file
    
    Full support under Basic and Python
    
    Review of make file of the SFDocuments library
    
    Change-Id: Id8db3098ff24fbf2efcbdd9c6dcd4f02ff5972af
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/119824
    Tested-by: Jean-Pierre Ledure <j...@ledure.be>
    Tested-by: Jenkins
    Reviewed-by: Jean-Pierre Ledure <j...@ledure.be>

diff --git a/wizards/Package_sfdocuments.mk b/wizards/Package_sfdocuments.mk
index 39211afa88cf..bec0d11f5a9a 100644
--- a/wizards/Package_sfdocuments.mk
+++ b/wizards/Package_sfdocuments.mk
@@ -22,6 +22,7 @@ $(eval $(call 
gb_Package_Package,wizards_basicsrvsfdocuments,$(SRCDIR)/wizards/s
 $(eval $(call 
gb_Package_add_files,wizards_basicsrvsfdocuments,$(LIBO_SHARE_FOLDER)/basic/SFDocuments,\
        SF_Base.xba \
        SF_Calc.xba \
+       SF_Chart.xba \
        SF_Document.xba \
        SF_Form.xba \
        SF_FormControl.xba \
diff --git a/wizards/source/scriptforge/SF_Exception.xba 
b/wizards/source/scriptforge/SF_Exception.xba
index aa654de67463..57ac5090d6a9 100644
--- a/wizards/source/scriptforge/SF_Exception.xba
+++ b/wizards/source/scriptforge/SF_Exception.xba
@@ -106,6 +106,10 @@ Const DBCONNECTERROR                       =       
&quot;DBCONNECTERROR&quot;
 Const CALCADDRESSERROR                 =       &quot;CALCADDRESSERROR&quot;
 Const DUPLICATESHEETERROR              =       &quot;DUPLICATESHEETERROR&quot;
 Const OFFSETADDRESSERROR               =       &quot;OFFSETADDRESSERROR&quot;
+Const DUPLICATECHARTERROR              =       &quot;DUPLICATECHARTERROR&quot;
+
+&apos; SF_Chart
+Const CHARTEXPORTERROR                 =       &quot;CHARTEXPORTERROR&quot;
 
 &apos; SF_Form
 Const FORMDEADERROR                            =       
&quot;FORMDEADERROR&quot;
@@ -950,7 +954,7 @@ Try:
                                        &amp; &quot;\n&quot; &amp; 
&quot;\n&quot; &amp; &quot;\n&quot; &amp; .GetText(&quot;VALIDATEERROR&quot;, 
pvArgs(0)) _
                                        &amp; &quot;\n&quot; &amp; 
&quot;\n&quot; &amp; .GetText(&quot;CALCADDRESS&quot; &amp; Iif(pvArgs(0) = 
&quot;Sheet&quot;, &quot;1&quot;, &quot;2&quot;), pvArgs(0), pvArgs(1), 
pvArgs(2), pvArgs(3))
                        Case DUPLICATESHEETERROR        &apos;  
SF_Calc.InsertSheet(arg, SheetName, Document)
-                               pvArgs(0) = _RightCase(pvArgs(2))       :       
pvArgs(0) = _RightCase(pvArgs(2))
+                               pvArgs(0) = _RightCase(pvArgs(0))
                                sMessage = sLocation _
                                        &amp; &quot;\n&quot; &amp; 
&quot;\n&quot; &amp; &quot;\n&quot; &amp; .GetText(&quot;VALIDATEERROR&quot;, 
pvArgs(0)) _
                                        &amp; &quot;\n&quot; &amp; 
&quot;\n&quot; &amp; .GetText(&quot;DUPLICATESHEET&quot;, pvArgs(0), pvArgs(1), 
pvArgs(2), pvArgs(3))
@@ -960,6 +964,15 @@ Try:
                                sMessage = sLocation _
                                        &amp; &quot;\n&quot; &amp; 
&quot;\n&quot; &amp; .GetText(&quot;OFFSETADDRESS&quot;, pvArgs(0), pvArgs(1), 
pvArgs(2), pvArgs(3), pvArgs(4) _
                                                                        , 
pvArgs(5), pvArgs(6), pvArgs(7), pvArgs(8), pvArgs(9), pvArgs(10), pvArgs(11))
+                       Case DUPLICATECHARTERROR        &apos;  
SF_Calc.CreateChart(chart, ChartName, sheet, SheetName, Document, file)
+                               pvArgs(0) = _RightCase(pvArgs(0))       :       
pvArgs(2) = _RightCase(pvArgs(2))
+                               sMessage = sLocation _
+                                       &amp; &quot;\n&quot; &amp; 
&quot;\n&quot; &amp; &quot;\n&quot; &amp; .GetText(&quot;VALIDATEERROR&quot;, 
pvArgs(0)) _
+                                       &amp; &quot;\n&quot; &amp; 
&quot;\n&quot; &amp; .GetText(&quot;DUPLICATECHART&quot;, pvArgs(0), pvArgs(1), 
pvArgs(2), pvArgs(3), pvArgs(4), pvArgs(5))
+                       Case CHARTEXPORTERROR   &apos;  
SF_Chart.ExportToFile(Arg1Name, FileName, Arg2, Overwrite)
+                               pvArgs(0) = _RightCase(pvArgs(0))       :       
pvArgs(2) = _RightCase(pvArgs(2))
+                               sMessage = sLocation _
+                                       &amp; &quot;\n&quot; &amp; 
&quot;\n&quot; &amp; .GetText(&quot;CHARTEXPORT&quot;, pvArgs(0), pvArgs(1), 
pvArgs(2), pvArgs(3))
                        Case FORMDEADERROR              &apos;  
SF_Form._IsStillAlive(FormName, DocumentName)
                                sMessage = sLocation _
                                        &amp; &quot;\n&quot; &amp; 
&quot;\n&quot; &amp; .GetText(&quot;FORMDEAD&quot;, pvArgs(0), pvArgs(1))
diff --git a/wizards/source/scriptforge/SF_PythonHelper.xba 
b/wizards/source/scriptforge/SF_PythonHelper.xba
index 2addd1eca678..62ce902b2091 100644
--- a/wizards/source/scriptforge/SF_PythonHelper.xba
+++ b/wizards/source/scriptforge/SF_PythonHelper.xba
@@ -773,6 +773,7 @@ Try:
                                                End Select
                                        Case &quot;SFDocuments.Calc&quot;
                                                Select Case Script
+                                                       Case &quot;Charts&quot; 
                :       vReturn = vBasicObject.Charts(vArgs(0), vArgs(1))
                                                        Case &quot;Forms&quot;  
                :       vReturn = vBasicObject.Forms(vArgs(0), vArgs(1))
                                                        Case 
&quot;GetFormula&quot;             :       vReturn = 
vBasicObject.GetFormula(vArgs(0))
                                                        Case 
&quot;GetValue&quot;                       :       vReturn = 
vBasicObject.GetValue(vArgs(0))
diff --git a/wizards/source/scriptforge/SF_Root.xba 
b/wizards/source/scriptforge/SF_Root.xba
index f435bcec6f1f..131f2eb90d56 100644
--- a/wizards/source/scriptforge/SF_Root.xba
+++ b/wizards/source/scriptforge/SF_Root.xba
@@ -73,6 +73,7 @@ Private ConfigurationProvider _
                                                        As Object       &apos; 
com.sun.star.configuration.ConfigurationProvider
 Private MailService                    As Object       &apos; 
com.sun.star.system.SimpleCommandMail or com.sun.star.system.SimpleSystemMail
 Private TreeDataModel          As Object       &apos; 
com.sun.star.awt.tree.MutableTreeDataModel
+Private GraphicExportFilter    As Object       &apos; 
com.sun.star.drawing.GraphicExportFilter
 
 &apos; Specific persistent services objects or properties
 Private FileSystemNaming       As String       &apos; If &quot;SYS&quot;, file 
and folder naming is based on operating system notation
@@ -135,6 +136,7 @@ Private Sub Class_Initialize()
        Set ConfigurationProvider = Nothing
        Set MailService = Nothing
        Set TreeDataModel = Nothing
+       Set GraphicExportFilter = Nothing
        OSName = &quot;&quot;
        SFDialogs = Empty
        SFForms = Empty
@@ -822,6 +824,32 @@ Try:
                                                                        &amp;   
&quot;%11: An identifier\n&quot; _
                                                                        &amp;   
&quot;%12: A file name&quot; _
                                        )
+       &apos;  SF_Calc.CreateChart
+                       .AddText(       Context := &quot;DUPLICATECHART&quot; _
+                                               , MsgId := &quot;A chart with 
the same name exists already in the sheet.\n\n&quot; _
+                                                                       &amp; 
&quot;« %1 » = %2\n&quot; _
+                                                                       &amp; 
&quot;« %3 » = %4\n&quot; _
+                                                                       &amp; 
&quot;« %5 » = %6\n&quot; _
+                                               , Comment :=    &quot;SF_Calc 
CreateChart\n&quot; _
+                                                                       &amp;   
&quot;%1: An identifier\n&quot; _
+                                                                       &amp;   
&quot;%2: A string\n&quot; _
+                                                                       &amp;   
&quot;%3: An identifier\n&quot; _
+                                                                       &amp;   
&quot;%4: A string\n&quot; _
+                                                                       &amp;   
&quot;%5: An identifier\n&quot; _
+                                                                       &amp;   
&quot;%6: A file name&quot; _
+                                       )
+       &apos;  SF_Chart.ExportToFile
+                       .AddText(       Context := &quot;CHARTEXPORT&quot; _
+                                               , MsgId := &quot;The chart 
could not be exported.\n&quot; _
+                                                                       &amp; 
&quot;Either the destination file must not be overwritten, or it has a 
read-only attribute set.\n\n&quot; _
+                                                                       &amp; 
&quot;%1 = &apos;%2&apos;\n&quot; _
+                                                                       &amp; 
&quot;%3 = %4&quot; _
+                                               , Comment :=    
&quot;SF_Chart.ExportToFile error message\n&quot; _
+                                                                       &amp;   
&quot;%1: An identifier\n&quot; _
+                                                                       &amp;   
&quot;%2: A file name\n&quot; _
+                                                                       &amp;   
&quot;%3: An identifier\n&quot; _
+                                                                       &amp;   
&quot;%4: True or False\n&quot; _
+                                       )
        &apos;  SF_Form._IsStillAlive
                        .AddText(       Context := &quot;FORMDEAD&quot; _
                                                , MsgId := &quot;The requested 
action could not be executed because the form is not open or the document was 
closed inadvertently.\n\n&quot; _
diff --git a/wizards/source/scriptforge/SF_String.xba 
b/wizards/source/scriptforge/SF_String.xba
index 6eb78b67ce0c..28145ab42750 100644
--- a/wizards/source/scriptforge/SF_String.xba
+++ b/wizards/source/scriptforge/SF_String.xba
@@ -2712,7 +2712,7 @@ Dim i As Long
                        sChar = Mid(sString, lPos, 1)
                        If Not SF_String.IsPrintable(sChar) Then
                                lAsc = Asc(sChar)
-                               sChar = &quot;\x&quot; &amp; Iif(lAsc &lt; 255, 
Right(&quot;00&quot; &amp; Hex(lAsc, 2)), Right(&quot;0000&quot; &amp; 
Hex(lAsc, 4)))
+                               sChar = &quot;\x&quot; &amp; Iif(lAsc &lt; 255, 
Right(&quot;00&quot; &amp; Hex(lAsc), 2), Right(&quot;0000&quot; &amp; 
Hex(lAsc), 4))
                                If lPos &lt; Len(sString) Then
                                        sString = Left(sString, lPos - 1) &amp; 
sChar &amp; Mid(sString, lPos + 1)
                                Else
diff --git a/wizards/source/scriptforge/SF_Utils.xba 
b/wizards/source/scriptforge/SF_Utils.xba
index 2f2044cafcc8..99ee224cc79f 100644
--- a/wizards/source/scriptforge/SF_Utils.xba
+++ b/wizards/source/scriptforge/SF_Utils.xba
@@ -358,6 +358,11 @@ Dim vNodePath As Variant
                                        Set .FunctionAccess = 
CreateUnoService(&quot;com.sun.star.sheet.FunctionAccess&quot;)
                                End If
                                Set _GetUNOService = .FunctionAccess
+                       Case &quot;GraphicExportFilter&quot;
+                               If IsEmpty(.GraphicExportFilter) Or 
IsNull(.GraphicExportFilter) Then
+                                       Set .GraphicExportFilter = 
CreateUnoService(&quot;com.sun.star.drawing.GraphicExportFilter&quot;)
+                               End If
+                               Set _GetUNOService = .GraphicExportFilter
                        Case &quot;Introspection&quot;
                                If IsEmpty(.Introspection) Or 
IsNull(.Introspection) Then
                                        Set .Introspection = 
CreateUnoService(&quot;com.sun.star.beans.Introspection&quot;)
diff --git a/wizards/source/scriptforge/po/ScriptForge.pot 
b/wizards/source/scriptforge/po/ScriptForge.pot
index 5bb44f2d1d6e..cd5abaf03367 100644
--- a/wizards/source/scriptforge/po/ScriptForge.pot
+++ b/wizards/source/scriptforge/po/ScriptForge.pot
@@ -14,7 +14,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: 
https://bugs.libreoffice.org/enter_bug.cgi?product=LibreOffice&bug_status=UNCONFIRMED&component=UI\n";
-"POT-Creation-Date: 2021-06-19 16:57:15\n"
+"POT-Creation-Date: 2021-07-30 13:10:57\n"
 "PO-Revision-Date: YYYY-MM-DD HH:MM:SS\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <EMAIL@ADDRESS>\n"
@@ -737,6 +737,41 @@ msgid  ""
 "« %11 » = %12"
 msgstr ""
 
+#. SF_Calc CreateChart
+#. %1: An identifier
+#. %2: A string
+#. %3: An identifier
+#. %4: A string
+#. %5: An identifier
+#. %6: A file name
+#, kde-format
+msgctxt "DUPLICATECHART"
+msgid  ""
+"A chart with the same name exists already in the sheet.\n"
+"\n"
+"« %1 » = %2\n"
+"« %3 » = %4\n"
+"« %5 » = %6\n"
+""
+msgstr ""
+
+#. SF_Chart.ExportToFile error message
+#. %1: An identifier
+#. %2: A file name
+#. %3: An identifier
+#. %4: True or False
+#. 
+#, kde-format
+msgctxt "CHARTEXPORT"
+msgid  ""
+"The chart could not be exported.\n"
+"Either the destination file must not be overwritten, or it has a "
+"read-only attribute set.\n"
+"\n"
+"%1 = '%2'\n"
+"%3 = %4"
+msgstr ""
+
 #. SF_Dialog._IsStillAlive error message
 #. %1: An identifier%2: A file name
 #, kde-format
diff --git a/wizards/source/scriptforge/po/en.po 
b/wizards/source/scriptforge/po/en.po
index 5bb44f2d1d6e..cd5abaf03367 100644
--- a/wizards/source/scriptforge/po/en.po
+++ b/wizards/source/scriptforge/po/en.po
@@ -14,7 +14,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: 
https://bugs.libreoffice.org/enter_bug.cgi?product=LibreOffice&bug_status=UNCONFIRMED&component=UI\n";
-"POT-Creation-Date: 2021-06-19 16:57:15\n"
+"POT-Creation-Date: 2021-07-30 13:10:57\n"
 "PO-Revision-Date: YYYY-MM-DD HH:MM:SS\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <EMAIL@ADDRESS>\n"
@@ -737,6 +737,41 @@ msgid  ""
 "« %11 » = %12"
 msgstr ""
 
+#. SF_Calc CreateChart
+#. %1: An identifier
+#. %2: A string
+#. %3: An identifier
+#. %4: A string
+#. %5: An identifier
+#. %6: A file name
+#, kde-format
+msgctxt "DUPLICATECHART"
+msgid  ""
+"A chart with the same name exists already in the sheet.\n"
+"\n"
+"« %1 » = %2\n"
+"« %3 » = %4\n"
+"« %5 » = %6\n"
+""
+msgstr ""
+
+#. SF_Chart.ExportToFile error message
+#. %1: An identifier
+#. %2: A file name
+#. %3: An identifier
+#. %4: True or False
+#. 
+#, kde-format
+msgctxt "CHARTEXPORT"
+msgid  ""
+"The chart could not be exported.\n"
+"Either the destination file must not be overwritten, or it has a "
+"read-only attribute set.\n"
+"\n"
+"%1 = '%2'\n"
+"%3 = %4"
+msgstr ""
+
 #. SF_Dialog._IsStillAlive error message
 #. %1: An identifier%2: A file name
 #, kde-format
diff --git a/wizards/source/scriptforge/python/scriptforge.py 
b/wizards/source/scriptforge/python/scriptforge.py
index fbc98cc1e2b6..23b505a36ef7 100644
--- a/wizards/source/scriptforge/python/scriptforge.py
+++ b/wizards/source/scriptforge/python/scriptforge.py
@@ -1892,6 +1892,9 @@ class SFDocuments:
         def Activate(self, sheetname = ''):
             return self.ExecMethod(self.vbMethod, 'Activate', sheetname)
 
+        def Charts(self, sheetname, chartname = ''):
+            return self.ExecMethod(self.vbMethod + self.flgArrayRet, 'Charts', 
sheetname, chartname)
+
         def ClearAll(self, range):
             return self.ExecMethod(self.vbMethod, 'ClearAll', range)
 
@@ -1920,6 +1923,9 @@ class SFDocuments:
                      else sourcerange)
             return self.ExecMethod(self.vbMethod + self.flgObject, 
'CopyToRange', range, destinationrange)
 
+        def CreateChart(self, chartname, sheetname, range, columnheader = 
False, rowheader = False):
+            return self.ExecMethod(self.vbMethod, 'CreateChart', chartname, 
sheetname, range, columnheader, rowheader)
+
         def DAvg(self, range):
             return self.ExecMethod(self.vbMethod, 'DAvg', range)
 
@@ -2008,6 +2014,31 @@ class SFDocuments:
         servicesynonyms = ()
         serviceproperties = dict()
 
+    # #########################################################################
+    # SF_Chart CLASS
+    # #########################################################################
+    class SF_Chart(SFServices):
+        """
+            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.
+            """
+        # Mandatory class properties for service registration
+        serviceimplementation = 'basic'
+        servicename = 'SFDocuments.Chart'
+        servicesynonyms = ()
+        serviceproperties = dict(ChartType = True, Deep = True, Dim3D = True, 
Exploded = True, Filled = True,
+                                 Legend = True, Percent = True, Stacked = 
True, Title = True,
+                                 XChartObj = False, XDiagram = False, XShape = 
False, XTableChart = False,
+                                 XTitle = True, YTitle = True)
+
+        def Resize(self, xpos = -1, ypos = -1, width = -1, height = -1):
+            return self.ExecMethod(self.vbMethod, 'Resize', xpos, ypos, width, 
height)
+
+        def ExportToFile(self, filename, imagetype = 'png', overwrite = False):
+            return self.ExecMethod(self.vbMethod, 'ExportToFile', filename, 
imagetype, overwrite)
+
     # #########################################################################
     # SF_Form CLASS
     # #########################################################################
diff --git a/wizards/source/sfdocuments/SF_Calc.xba 
b/wizards/source/sfdocuments/SF_Calc.xba
index b5a491915ceb..c7b1e0fd5081 100644
--- a/wizards/source/sfdocuments/SF_Calc.xba
+++ b/wizards/source/sfdocuments/SF_Calc.xba
@@ -84,6 +84,7 @@ Private Const CALCADDRESSERROR                =       
&quot;CALCADDRESSERROR&quot;
 Private Const DUPLICATESHEETERROR      =       &quot;DUPLICATESHEETERROR&quot;
 Private Const OFFSETADDRESSERROR       =       &quot;OFFSETADDRESSERROR&quot;
 Private Const CALCFORMNOTFOUNDERROR    =       
&quot;CALCFORMNOTFOUNDERROR&quot;
+Private Const DUPLICATECHARTERROR      =       &quot;DUPLICATECHARTERROR&quot;
 
 REM ============================================================= PRIVATE 
MEMBERS
 
@@ -307,6 +308,101 @@ Catch:
        GoTo Finally
 End Function    &apos;   SFDocuments.SF_Calc.Activate
 
+REM 
-----------------------------------------------------------------------------
+Public Function Charts(Optional ByVal SheetName As Variant _
+                                                       , Optional ByVal 
ChartName As Variant _
+                                                       ) As Variant
+&apos;&apos;&apos; Return either the list of charts present in the given sheet 
or a chart object
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             SheetName: The name of an existing sheet
+&apos;&apos;&apos;             ChartName: The user-defined name of the 
targeted chart or the zero-length string
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             When ChartName = &quot;&quot;, return the list 
of the charts present in the sheet,
+&apos;&apos;&apos;             otherwise, return a new chart service instance
+&apos;&apos;&apos;     Examples:
+&apos;&apos;&apos;             Dim oChart As Object
+&apos;&apos;&apos;             Set oChart = oDoc.Charts(&quot;SheetX&quot;, 
&quot;myChart&quot;)
+
+Dim vCharts As Variant                         &apos;  Return value when array 
of chart names
+Dim oChart As Object                           &apos;  Return value when new 
chart instance
+Dim oSheet As Object                           &apos;  Alias of SheetName as 
reference
+Dim oDrawPage As Object                                &apos;  
com.sun.star.drawing.XDrawPage
+Dim oNextShape As Object                       &apos;  
com.sun.star.drawing.XShape
+Dim sChartName As String                       &apos;  Some chart name
+Dim lCount As Long                                     &apos;  Counter for 
charts among all drawing objects
+Dim i As Long
+Const cstChartShape = &quot;com.sun.star.drawing.OLE2Shape&quot;
+
+Const cstThisSub = &quot;SFDocuments.Calc.Charts&quot;
+Const cstSubArgs = &quot;SheetName, [ChartName=&quot;&quot;&quot;&quot;]&quot;
+
+       If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+       vCharts = Array()
+
+Check:
+       If IsMissing(ChartName) Or IsEmpty(ChartName) Then ChartName = 
&quot;&quot;
+       If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not _IsStillAlive(True) Then GoTo Finally
+               If Not _ValidateSheet(SheetName, &quot;SheetName&quot;, , True) 
Then GoTo Finally
+               If Not ScriptForge.SF_Utils._Validate(ChartName, 
&quot;ChartName&quot;, V_STRING) Then GoTo Finally
+       End If
+
+Try:
+       &apos;  Because the user can change it constantly, the list of valid 
charts has to be rebuilt at each time
+       &apos;  Explore charts starting from the draw page
+       Set oSheet = _Component.getSheets.getByName(SheetName)
+       Set oDrawPage = oSheet.getDrawPage()
+       vCharts = Array()
+       Set oChart = Nothing
+       lCount = -1
+       For i = 0 To oDrawPage.Count - 1
+               Set oNextShape = oDrawPage.getByIndex(i)
+               if oNextShape.supportsService(cstChartShape) Then               
&apos;  Ignore other shapes
+                       sChartName = oNextShape.Name                            
                                                &apos;  User-defined name
+                       If Len(sChartName) = 0 Then sChartName = 
oNextShape.PersistName         &apos;  Internal name
+                       &apos;  Is chart found ?
+                       If Len(ChartName) &gt; 0 Then
+                               If ChartName = sChartName Then
+                                       Set oChart = New SF_Chart
+                                       With oChart
+                                               Set .[Me] = oChart
+                                               Set .[_Parent] = [Me]
+                                               ._SheetName = SheetName
+                                               ._DrawIndex = i
+                                               ._ChartName = ChartName
+                                               ._PersistentName = 
oNextShape.PersistName
+                                               Set ._Shape = oNextShape
+                                               Set ._Chart = 
oSheet.getCharts().getByName(._PersistentName)
+                                               Set ._ChartObject = 
._Chart.EmbeddedObject
+                                               Set ._Diagram = 
._ChartObject.Diagram
+                                       End With
+                                       Exit For
+                               End If
+                       End If
+                       &apos;  Build stack of chart names
+                       lCount = lCount + 1
+                       If UBound(vCharts) &lt; 0 Then
+                               vCharts = Array(sChartName)
+                       Else
+                               ReDim Preserve vCharts(0 To UBound(vCharts) + 1)
+                               vCharts(lCount) = sChartName
+                       End If
+               End If
+       Next i
+
+       &apos;  Raise error when chart not found
+       If Len(ChartName) &gt; 0 And IsNull(oChart) Then
+               If Not ScriptForge.SF_Utils._Validate(ChartName, 
&quot;ChartName&quot;, V_STRING, vCharts) Then GoTo Finally
+       End If
+       
+Finally:
+       If Len(ChartName) = 0 Then Charts = vCharts Else Set Charts = oChart
+       ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+       Exit Function
+Catch:
+       GoTo Finally
+End Function    &apos;   SFDocuments.SF_Calc.Charts
+
 REM 
-----------------------------------------------------------------------------
 Public Sub ClearAll(Optional ByVal Range As Variant) As String
 &apos;&apos;&apos;     Clear entirely the given range
@@ -772,6 +868,83 @@ Catch:
        GoTo Finally
 End Function    &apos;   SFDocuments.SF_Calc.CopyToRange
 
+REM 
-----------------------------------------------------------------------------
+Public Function CreateChart(Optional ByVal ChartName As Variant _
+                                                       , Optional ByVal 
SheetName As Variant _
+                                                       , Optional ByVal Range 
As Variant _
+                                                       , Optional ColumnHeader 
As Variant _
+                                                       , Optional RowHeader As 
Variant _
+                                                       ) As Variant
+&apos;&apos;&apos; Return a new chart instance initialized with default values
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             ChartName: The user-defined name of the new 
chart
+&apos;&apos;&apos;             SheetName: The name of an existing sheet
+&apos;&apos;&apos;             Range: the cell or the range as a string that 
should be drawn
+&apos;&apos;&apos;             ColumnHeader: when True, the topmost row of the 
range will be used to set labels for the category axis or the legend.
+&apos;&apos;&apos;                     Default = False
+&apos;&apos;&apos;             RowHeader: when True, the leftmost column of 
the range will be used to set labels for the category axis or the legend.
+&apos;&apos;&apos;                     Default = False
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             A new chart service instance
+&apos;&apos;&apos;     Exceptions:
+&apos;&apos;&apos;             DUPLICATECHARTERROR             A chart with 
the same name exists already in the given sheet
+&apos;&apos;&apos;     Examples:
+&apos;&apos;&apos;             Dim oChart As Object
+&apos;&apos;&apos;             Set oChart = 
oDoc.CreateChart(&quot;myChart&quot;, &quot;SheetX&quot;, &quot;A1:C8&quot;, 
ColumnHeader := True)
+
+Dim oChart As Object                           &apos;  Return value
+Dim vCharts As Variant                         &apos;  List of pre-existing 
charts
+Dim oSheet As Object                           &apos;  Alias of SheetName as 
reference
+Dim oRange As Object                           &apos;  Alias of Range
+Dim oRectangle as new com.sun.star.awt.Rectangle       &apos;  Simple shape
+
+Const cstThisSub = &quot;SFDocuments.Calc.CreateChart&quot;
+Const cstSubArgs = &quot;ChartName, SheetName, Range, [ColumnHeader=False], 
[RowHeader=False]&quot;
+
+       If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+       Set oChart = Nothing
+
+Check:
+       If IsMissing(RowHeader) Or IsEmpty(RowHeader) Then Rowheader = False
+       If IsMissing(ColumnHeader) Or IsEmpty(ColumnHeader) Then ColumnHeader = 
False
+       If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not _IsStillAlive(True) Then GoTo Finally
+               If Not ScriptForge.SF_Utils._Validate(ChartName, 
&quot;ChartName&quot;, V_STRING) Then GoTo Finally
+               If Not _ValidateSheet(SheetName, &quot;SheetName&quot;, , True) 
Then GoTo Finally
+               If Not ScriptForge.SF_Utils._Validate(Range, &quot;Range&quot;, 
V_STRING) Then GoTo Finally
+               If Not ScriptForge.SF_Utils._Validate(ColumnHeader, 
&quot;ColumnHeader&quot;, ScriptForge.V_BOOLEAN) Then GoTo Finally
+               If Not ScriptForge.SF_Utils._Validate(RowHeader, 
&quot;RowHeader&quot;, ScriptForge.V_BOOLEAN) Then GoTo Finally
+       End If
+
+       vCharts = Charts(SheetName)
+       If ScriptForge.SF_Array.Contains(vCharts, ChartName, CaseSensitive := 
True) Then GoTo CatchDuplicate
+
+Try:
+       &apos;  The rectangular shape receives arbitrary values. User can 
Resize() it later
+       With oRectangle
+               .X = 0                  :       .Y = 0
+               .Width = 8000   :       .Height = 6000
+       End With
+       &apos;  Initialize sheet and range
+       Set oSheet = _Component.getSheets.getByName(SheetName)
+       Set oRange = _ParseAddress(Range)
+       &apos;  Create the chart and get ihe corresponding chart instance
+       oSheet.getCharts.addNewByName(ChartName, oRectangle, 
Array(oRange.XCellRange.RangeAddress), ColumnHeader, RowHeader)
+       Set oChart = Charts(SheetName, ChartName)
+       oChart._Shape.Name = ChartName          &apos;  Both used-defined and 
internal names match ChartName
+       oChart._Diagram.Wall.FillColor = RGB(255, 255, 255)             &apos;  
Align on background color set by the user interface by default
+       
+Finally:
+       Set CreateChart = oChart
+       ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+       Exit Function
+Catch:
+       GoTo Finally
+CatchDuplicate:
+       ScriptForge.SF_Exception.RaiseFatal(DUPLICATECHARTERROR, 
&quot;ChartName&quot;, ChartName, &quot;SheetName&quot;, SheetName, 
&quot;Document&quot;, [_Super]._FileIdent())
+       GoTo Finally
+End Function    &apos;   SFDocuments.SF_Calc.CreateChart
+
 REM 
-----------------------------------------------------------------------------
 Public Function DAvg(Optional ByVal Range As Variant) As Double
 &apos;&apos;&apos;     Get the average of the numeric values stored in the 
given range
@@ -1671,7 +1844,7 @@ Check:
        End If
 
 Try:
-        _Component.getSheets.RemoveByName(SheetName)
+       _Component.getSheets.RemoveByName(SheetName)
        bRemove = True
 
 Finally:
diff --git a/wizards/source/sfdocuments/SF_Chart.xba 
b/wizards/source/sfdocuments/SF_Chart.xba
new file mode 100644
index 000000000000..7a9d9740cbb8
--- /dev/null
+++ b/wizards/source/sfdocuments/SF_Chart.xba
@@ -0,0 +1,815 @@
+<?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 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 String
+&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 oAddress As Object                         &apos;  Alias of Range
+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 _PropertGet = _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>
\ No newline at end of file
diff --git a/wizards/source/sfdocuments/SF_FormControl.xba 
b/wizards/source/sfdocuments/SF_FormControl.xba
index f08506d36226..ac120772e175 100644
--- a/wizards/source/sfdocuments/SF_FormControl.xba
+++ b/wizards/source/sfdocuments/SF_FormControl.xba
@@ -960,7 +960,7 @@ Const cstSubArgs = &quot;PropertyName, Value&quot;
 
 Check:
        If SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
-               If Not SF_Utils._Validate(PropertyName, 
&quot;PropertyName&quot;, V_STRING, Properties()) Then GoTo Catch
+               If Not ScriptForge.SF_Utils._Validate(PropertyName, 
&quot;PropertyName&quot;, V_STRING, Properties()) Then GoTo Catch
        End If
 
 Try:
@@ -1866,6 +1866,7 @@ Finally:
        ScriptForge.SF_Utils._ExitFunction(cstThisSub)
        Exit Function
 Catch:
+       bSet = False
        GoTo Finally
 CatchType:
        If Len(_ParentForm._FormDocumentName) &gt; 0 Then sFormName = 
_ParentForm._FormDocumentName &amp; &quot;.&quot; Else sFormName = &quot;&quot;
diff --git a/wizards/source/sfdocuments/script.xlb 
b/wizards/source/sfdocuments/script.xlb
index 881ef70e0f6b..0663d7b64e6a 100644
--- a/wizards/source/sfdocuments/script.xlb
+++ b/wizards/source/sfdocuments/script.xlb
@@ -9,4 +9,5 @@
  <library:element library:name="SF_Form"/>
  <library:element library:name="SF_FormControl"/>
  <library:element library:name="SF_Writer"/>
+ <library:element library:name="SF_Chart"/>
 </library:library>
\ No newline at end of file

Reply via email to