Rebased ref, commits from common ancestor:
commit 8ab457543b0e3444029bb46c29111aa11f2c04ba
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Fri Jun 17 16:38:54 2022 +0200
Commit:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
CommitDate: Fri Jun 17 17:52:17 2022 +0200

    chart2: remove unneeded class prefix in ObjectHierarchy.cxx
    
    Change-Id: Iee007f7ff4d9665ee089712e7ba98090a8090609

diff --git a/chart2/source/controller/main/ObjectHierarchy.cxx 
b/chart2/source/controller/main/ObjectHierarchy.cxx
index ab1fa891377e..c696a94d8fcd 100644
--- a/chart2/source/controller/main/ObjectHierarchy.cxx
+++ b/chart2/source/controller/main/ObjectHierarchy.cxx
@@ -115,7 +115,7 @@ void ObjectHierarchy::createTree( const 
rtl::Reference<::chart::ChartModel>& xCh
     ObjectIdentifier aDiaOID;
     if( xDiagram.is() )
         aDiaOID = ObjectIdentifier( 
ObjectIdentifier::createClassifiedIdentifierForObject( 
static_cast<cppu::OWeakObject*>(xDiagram.get()), xChartDocument ) );
-    ObjectHierarchy::tChildContainer aTopLevelContainer;
+    tChildContainer aTopLevelContainer;
 
     // First Level
 
@@ -158,7 +158,7 @@ void ObjectHierarchy::createTree( const 
rtl::Reference<::chart::ChartModel>& xCh
             createDiagramTree( aTopLevelContainer, xChartDocument, xDiagram );
         else
         {
-            ObjectHierarchy::tChildContainer aSubContainer;
+            tChildContainer aSubContainer;
             createDiagramTree( aSubContainer, xChartDocument, xDiagram );
             if( !aSubContainer.empty() )
                 m_aChildMap[ aDiaOID ] = aSubContainer;
@@ -179,11 +179,11 @@ void ObjectHierarchy::createTree( const 
rtl::Reference<::chart::ChartModel>& xCh
         aTopLevelContainer.emplace_back( 
ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_PAGE, u"" ) );
 
     if( ! aTopLevelContainer.empty())
-        m_aChildMap[ ObjectHierarchy::getRootNodeOID() ] = aTopLevelContainer;
+        m_aChildMap[ObjectHierarchy::getRootNodeOID()] = aTopLevelContainer;
 }
 
 void ObjectHierarchy::createLegendTree(
-    ObjectHierarchy::tChildContainer & rContainer,
+    tChildContainer & rContainer,
     const rtl::Reference<::chart::ChartModel> & xChartDoc,
     const rtl::Reference< Diagram > & xDiagram  )
 {
@@ -199,7 +199,7 @@ void ObjectHierarchy::createLegendTree(
         rtl::Reference< SvxShapeGroupAnyD > xLegendShapeContainer =
             dynamic_cast<SvxShapeGroupAnyD*>(
                 m_pExplicitValueProvider->getShapeForCID( 
aLegendOID.getObjectCID() ).get() );
-        ObjectHierarchy::tChildContainer aLegendEntryOIDs;
+        tChildContainer aLegendEntryOIDs;
         lcl_getChildOIDs( aLegendEntryOIDs, xLegendShapeContainer );
 
         m_aChildMap[ aLegendOID ] = aLegendEntryOIDs;
@@ -207,7 +207,7 @@ void ObjectHierarchy::createLegendTree(
 }
 
 void ObjectHierarchy::createAxesTree(
-    ObjectHierarchy::tChildContainer & rContainer,
+    tChildContainer & rContainer,
     const rtl::Reference<::chart::ChartModel> & xChartDoc,
     const rtl::Reference< Diagram > & xDiagram  )
 {
@@ -271,7 +271,7 @@ void ObjectHierarchy::createAxesTree(
 }
 
 void ObjectHierarchy::createWallAndFloor(
-    ObjectHierarchy::tChildContainer & rContainer,
+    tChildContainer & rContainer,
     const rtl::Reference< Diagram > & xDiagram )
 {
     sal_Int32 nDimensionCount = DiagramHelper::getDimension( xDiagram );
@@ -289,7 +289,7 @@ void ObjectHierarchy::createWallAndFloor(
 }
 
 void ObjectHierarchy::createDiagramTree(
-    ObjectHierarchy::tChildContainer & rContainer,
+    tChildContainer & rContainer,
     const rtl::Reference<::chart::ChartModel> & xChartDoc,
     const rtl::Reference< Diagram > & xDiagram )
 {
@@ -307,7 +307,7 @@ void ObjectHierarchy::createDiagramTree(
 }
 
 void ObjectHierarchy::createDataSeriesTree(
-    ObjectHierarchy::tChildContainer & rOutDiagramSubContainer,
+    tChildContainer & rOutDiagramSubContainer,
     const rtl::Reference< Diagram > & xDiagram )
 {
     try
@@ -334,7 +334,7 @@ void ObjectHierarchy::createDataSeriesTree(
                         ObjectIdentifier( 
ObjectIdentifier::createClassifiedIdentifierForParticle( aSeriesParticle ) ) );
                     rOutDiagramSubContainer.push_back( aSeriesOID );
 
-                    ObjectHierarchy::tChildContainer aSeriesSubContainer;
+                    tChildContainer aSeriesSubContainer;
 
                     rtl::Reference< DataSeries > const & xSeries = 
aSeriesSeq[nSeriesIdx];
 
@@ -406,7 +406,7 @@ void ObjectHierarchy::createDataSeriesTree(
     }
 }
 
-void ObjectHierarchy::createAdditionalShapesTree( 
ObjectHierarchy::tChildContainer& rContainer )
+void ObjectHierarchy::createAdditionalShapesTree(tChildContainer& rContainer)
 {
     try
     {
@@ -453,7 +453,7 @@ const ObjectHierarchy::tChildContainer & 
ObjectHierarchy::getChildren( const Obj
         if( aIt != m_aChildMap.end())
             return aIt->second;
     }
-    static const ObjectHierarchy::tChildContainer EMPTY;
+    static const tChildContainer EMPTY;
     return EMPTY;
 }
 
@@ -463,13 +463,13 @@ const ObjectHierarchy::tChildContainer & 
ObjectHierarchy::getSiblings( const Obj
     {
         for (auto const& child : m_aChildMap)
         {
-            ObjectHierarchy::tChildContainer::const_iterator aElemIt(
+            tChildContainer::const_iterator aElemIt(
                 std::find( child.second.begin(), child.second.end(), rNode ));
             if( aElemIt != child.second.end())
                 return child.second;
         }
     }
-    static const ObjectHierarchy::tChildContainer EMPTY;
+    static const tChildContainer EMPTY;
     return EMPTY;
 }
 
@@ -478,8 +478,8 @@ ObjectIdentifier ObjectHierarchy::getParentImpl(
     const ObjectIdentifier & rOID ) const
 {
     // search children
-    ObjectHierarchy::tChildContainer aChildren( getChildren( rParentOID ));
-    ObjectHierarchy::tChildContainer::const_iterator aIt(
+    tChildContainer aChildren( getChildren( rParentOID ));
+    tChildContainer::const_iterator aIt(
         std::find( aChildren.begin(), aChildren.end(), rOID ));
     // recursion end
     if( aIt != aChildren.end())
commit fd626e3db456a171d1d4864157fea7aef6dd57d9
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Fri Jun 17 16:29:23 2022 +0200
Commit:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
CommitDate: Fri Jun 17 17:52:17 2022 +0200

    chart2: call clear instead of creating a new empty map
    
    Change-Id: I8b21909e92b558240e84cffd9432e0d9e270284e

diff --git a/chart2/source/controller/main/ObjectHierarchy.cxx 
b/chart2/source/controller/main/ObjectHierarchy.cxx
index e1f3697e6250..ab1fa891377e 100644
--- a/chart2/source/controller/main/ObjectHierarchy.cxx
+++ b/chart2/source/controller/main/ObjectHierarchy.cxx
@@ -105,7 +105,7 @@ namespace chart
 
 void ObjectHierarchy::createTree( const rtl::Reference<::chart::ChartModel>& 
xChartDocument )
 {
-    m_aChildMap = tChildMap();//clear tree
+    m_aChildMap.clear();
 
     if( !xChartDocument.is() )
         return;
commit 75cfc6a50b0fb50c670a9fe37155b3b639afcc53
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Fri Jun 17 16:28:38 2022 +0200
Commit:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
CommitDate: Fri Jun 17 17:52:17 2022 +0200

    chart2: remove unneeded class prefix in ObjectHierarchy.hxx
    
    Change-Id: I1c851933e9b25dcd9a0dc29758baad8f3be7cb2e

diff --git a/chart2/source/controller/inc/ObjectHierarchy.hxx 
b/chart2/source/controller/inc/ObjectHierarchy.hxx
index 1255b7ac9910..1531866aaf2b 100644
--- a/chart2/source/controller/inc/ObjectHierarchy.hxx
+++ b/chart2/source/controller/inc/ObjectHierarchy.hxx
@@ -52,11 +52,10 @@ public:
     static bool      isRootNode( const ObjectIdentifier& rOID );
 
     /// equal to getChildren( getRootNodeOID())
-    const tChildContainer &  getTopLevelChildren() const;
-    bool             hasChildren( const ObjectIdentifier& rParent ) const;
-    const tChildContainer &  getChildren( const ObjectIdentifier& rParent ) 
const;
-
-    const tChildContainer &  getSiblings( const ObjectIdentifier& rNode ) 
const;
+    const tChildContainer& getTopLevelChildren() const;
+    bool hasChildren(const ObjectIdentifier& rParent) const;
+    const tChildContainer& getChildren(const ObjectIdentifier& rParent) const;
+    const tChildContainer& getSiblings(const ObjectIdentifier& rNode) const;
 
     /// The result is empty, if the node cannot be found in the tree
     ObjectIdentifier             getParent( const ObjectIdentifier& rNode ) 
const;
@@ -66,30 +65,29 @@ public:
 private:
     void createTree( const rtl::Reference<::chart::ChartModel> & 
xChartDocument );
     void createAxesTree(
-        ObjectHierarchy::tChildContainer & rContainer,
+        tChildContainer & rContainer,
         const rtl::Reference<::chart::ChartModel> & xChartDoc,
         const rtl::Reference< ::chart::Diagram > & xDiagram  );
     void createDiagramTree(
-        ObjectHierarchy::tChildContainer& rContainer,
+        tChildContainer& rContainer,
         const rtl::Reference<::chart::ChartModel>& xChartDoc,
         const rtl::Reference< ::chart::Diagram >& xDiagram );
     void createDataSeriesTree(
-        ObjectHierarchy::tChildContainer & rOutDiagramSubContainer,
+        tChildContainer & rOutDiagramSubContainer,
         const rtl::Reference< ::chart::Diagram > & xDiagram );
     static void createWallAndFloor(
-        ObjectHierarchy::tChildContainer & rContainer,
+        tChildContainer & rContainer,
         const rtl::Reference< ::chart::Diagram > & xDiagram );
     void createLegendTree(
-        ObjectHierarchy::tChildContainer & rContainer,
+        tChildContainer & rContainer,
         const rtl::Reference<::chart::ChartModel> & xChartDoc,
         const rtl::Reference< ::chart::Diagram > & xDiagram  );
-    void createAdditionalShapesTree( ObjectHierarchy::tChildContainer& 
rContainer );
+    void createAdditionalShapesTree(tChildContainer& rContainer);
     ObjectIdentifier getParentImpl(
         const ObjectIdentifier& rParentOID,
         const ObjectIdentifier& rOID ) const;
 
-    typedef std::map< ObjectIdentifier, ObjectHierarchy::tChildContainer >
-        tChildMap;
+    typedef std::map<ObjectIdentifier, tChildContainer> tChildMap;
     tChildMap m_aChildMap;
     ExplicitValueProvider* m_pExplicitValueProvider;
     bool m_bFlattenDiagram;
commit 0787eeec35ddf44de9189683addf1b2c5bbae3a6
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Mon May 23 15:50:59 2022 +0900
Commit:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
CommitDate: Fri Jun 17 17:52:16 2022 +0200

    oox export: export line/fill and text props. of a data table
    
    Change-Id: I02a4c35693b599578e073d52a2d22ad59bc31786

diff --git a/oox/source/export/chartexport.cxx 
b/oox/source/export/chartexport.cxx
index 988fe4413529..458f72112907 100644
--- a/oox/source/export/chartexport.cxx
+++ b/oox/source/export/chartexport.cxx
@@ -2066,6 +2066,9 @@ void ChartExport::exportDataTable( )
     if (bShowKeys)
         pFS->singleElement(FSNS(XML_c, XML_showKeys), XML_val, "1");
 
+    exportShapeProps(aPropSet);
+    exportTextProps(aPropSet);
+
     pFS->endElement(FSNS(XML_c, XML_dTable));
 }
 
commit 8a9973b2c37b989aad94e41ed4b504930412ea81
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Sat May 21 10:52:51 2022 +0900
Commit:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
CommitDate: Fri Jun 17 17:52:16 2022 +0200

    chart2: set the char props. to the cells of a data table from model
    
    This copies the char. properties from the model to the cells of
    a data table, so the correct char width, font is used for text
    when the table is rendered. Also add margin to the text, so it
    looks better.
    
    Change-Id: Ib74a8136459a31d64a86dec36a6ba14d2c313cf2

diff --git a/chart2/source/view/main/DataTableView.cxx 
b/chart2/source/view/main/DataTableView.cxx
index 3992ea84d012..c8e2adae6fbe 100644
--- a/chart2/source/view/main/DataTableView.cxx
+++ b/chart2/source/view/main/DataTableView.cxx
@@ -5,7 +5,6 @@
  * This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
  */
 
 #include <DataTableView.hxx>
@@ -59,11 +58,70 @@ void setTopCell(uno::Reference<beans::XPropertySet>& 
xPropertySet)
     xPropertySet->setPropertyValue("TopBorder", uno::Any(aBorderLine));
     xPropertySet->setPropertyValue("LeftBorder", uno::Any(aBorderLine));
 }
+
+void copyProperty(uno::Reference<beans::XPropertySet>& xOut,
+                  uno::Reference<beans::XPropertySet>& xIn, OUString const& 
sPropertyName)
+{
+    xOut->setPropertyValue(sPropertyName, 
xIn->getPropertyValue(sPropertyName));
+}
 }
 
 void DataTableView::setCellDefaults(uno::Reference<beans::XPropertySet>& 
xPropertySet, bool bLeft,
                                     bool bTop, bool bRight, bool bBottom)
 {
+    uno::Reference<beans::XPropertySet> xDataTableProperties = 
m_xDataTableModel.get();
+
+    copyProperty(xPropertySet, xDataTableProperties, "CharColor");
+    copyProperty(xPropertySet, xDataTableProperties, "CharFontFamily");
+    copyProperty(xPropertySet, xDataTableProperties, "CharFontFamilyAsian");
+    copyProperty(xPropertySet, xDataTableProperties, "CharFontFamilyComplex");
+    copyProperty(xPropertySet, xDataTableProperties, "CharFontCharSet");
+    copyProperty(xPropertySet, xDataTableProperties, "CharFontCharSetAsian");
+    copyProperty(xPropertySet, xDataTableProperties, "CharFontCharSetComplex");
+    copyProperty(xPropertySet, xDataTableProperties, "CharFontName");
+    copyProperty(xPropertySet, xDataTableProperties, "CharFontNameAsian");
+    copyProperty(xPropertySet, xDataTableProperties, "CharFontNameComplex");
+    copyProperty(xPropertySet, xDataTableProperties, "CharFontPitch");
+    copyProperty(xPropertySet, xDataTableProperties, "CharFontPitchAsian");
+    copyProperty(xPropertySet, xDataTableProperties, "CharFontPitchComplex");
+    copyProperty(xPropertySet, xDataTableProperties, "CharFontStyleName");
+    copyProperty(xPropertySet, xDataTableProperties, "CharFontStyleNameAsian");
+    copyProperty(xPropertySet, xDataTableProperties, 
"CharFontStyleNameComplex");
+
+    copyProperty(xPropertySet, xDataTableProperties, "CharHeight");
+    copyProperty(xPropertySet, xDataTableProperties, "CharHeightAsian");
+    copyProperty(xPropertySet, xDataTableProperties, "CharHeightComplex");
+    copyProperty(xPropertySet, xDataTableProperties, "CharKerning");
+    copyProperty(xPropertySet, xDataTableProperties, "CharLocale");
+    copyProperty(xPropertySet, xDataTableProperties, "CharLocaleAsian");
+    copyProperty(xPropertySet, xDataTableProperties, "CharLocaleComplex");
+    copyProperty(xPropertySet, xDataTableProperties, "CharPosture");
+    copyProperty(xPropertySet, xDataTableProperties, "CharPostureAsian");
+    copyProperty(xPropertySet, xDataTableProperties, "CharPostureComplex");
+    copyProperty(xPropertySet, xDataTableProperties, "CharRelief");
+    copyProperty(xPropertySet, xDataTableProperties, "CharShadowed");
+    copyProperty(xPropertySet, xDataTableProperties, "CharStrikeout");
+    copyProperty(xPropertySet, xDataTableProperties, "CharUnderline");
+    copyProperty(xPropertySet, xDataTableProperties, "CharUnderlineColor");
+    copyProperty(xPropertySet, xDataTableProperties, "CharUnderlineHasColor");
+    copyProperty(xPropertySet, xDataTableProperties, "CharOverline");
+    copyProperty(xPropertySet, xDataTableProperties, "CharOverlineColor");
+    copyProperty(xPropertySet, xDataTableProperties, "CharOverlineHasColor");
+    copyProperty(xPropertySet, xDataTableProperties, "CharWeight");
+    copyProperty(xPropertySet, xDataTableProperties, "CharWeightAsian");
+    copyProperty(xPropertySet, xDataTableProperties, "CharWeightComplex");
+    copyProperty(xPropertySet, xDataTableProperties, "CharWordMode");
+
+    float fFontHeight = 0.0;
+    xDataTableProperties->getPropertyValue("CharHeight") >>= fFontHeight;
+    fFontHeight = o3tl::convert(fFontHeight, o3tl::Length::pt, 
o3tl::Length::mm100);
+    uno::Any aXDistanceAny(sal_Int32(std::round(fFontHeight * 0.18f)));
+    uno::Any aYDistanceAny(sal_Int32(std::round(fFontHeight * 0.30f)));
+    xPropertySet->setPropertyValue("TextLeftDistance", aXDistanceAny);
+    xPropertySet->setPropertyValue("TextRightDistance", aXDistanceAny);
+    xPropertySet->setPropertyValue("TextUpperDistance", aYDistanceAny);
+    xPropertySet->setPropertyValue("TextLowerDistance", aYDistanceAny);
+
     xPropertySet->setPropertyValue("FillColor", uno::Any(Color(0xFFFFFF)));
     xPropertySet->setPropertyValue("TextVerticalAdjust", 
uno::Any(drawing::TextVerticalAdjust_TOP));
     xPropertySet->setPropertyValue("ParaAdjust", 
uno::Any(style::ParagraphAdjust_CENTER));
commit bd65f5f39fc76b5e466f74537d04e42749d2a4d5
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Sat May 21 10:51:55 2022 +0900
Commit:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
CommitDate: Fri Jun 17 17:52:16 2022 +0200

    chart2: add char properties to the DataTable model
    
    Change-Id: Ie4b49f36def7d20f89695157c3b95e6ee5d16d83

diff --git a/chart2/source/model/main/DataTable.cxx 
b/chart2/source/model/main/DataTable.cxx
index 0b7fba3176e2..b57566005e83 100644
--- a/chart2/source/model/main/DataTable.cxx
+++ b/chart2/source/model/main/DataTable.cxx
@@ -95,8 +95,9 @@ private:
     {
         std::vector<beans::Property> aProperties;
         lcl_AddPropertiesToVector(aProperties);
-        chart::LinePropertiesHelper::AddPropertiesToVector(aProperties);
-        chart::FillProperties::AddPropertiesToVector(aProperties);
+        ::chart::LinePropertiesHelper::AddPropertiesToVector(aProperties);
+        ::chart::FillProperties::AddPropertiesToVector(aProperties);
+        ::chart::CharacterProperties::AddPropertiesToVector(aProperties);
         std::sort(aProperties.begin(), aProperties.end(), 
chart::PropertyNameLess());
 
         return comphelper::containerToSequence(aProperties);
@@ -214,7 +215,8 @@ sal_Bool SAL_CALL DataTable::supportsService(const 
OUString& rServiceName)
 uno::Sequence<OUString> SAL_CALL DataTable::getSupportedServiceNames()
 {
     return { "com.sun.star.chart2.DataTable", "com.sun.star.beans.PropertySet",
-             "com.sun.star.drawing.FillProperties", 
"com.sun.star.drawing.LineProperties" };
+             "com.sun.star.drawing.FillProperties", 
"com.sun.star.drawing.LineProperties",
+             "com.sun.star.style.CharacterProperties" };
 }
 
 IMPLEMENT_FORWARD_XINTERFACE2(DataTable, DataTable_Base, 
::property::OPropertySet)
commit 1e1d3dfd87e50e324b66cef9ae517b4882fafc27
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Sat May 21 00:00:30 2022 +0900
Commit:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
CommitDate: Fri Jun 17 17:52:16 2022 +0200

    oox export: add export of basic properties of a data table
    
    Change-Id: I2c8b76125fc788a9e4df164171d6cbd351bc1c4a

diff --git a/oox/source/export/chartexport.cxx 
b/oox/source/export/chartexport.cxx
index 8a6d5fa7d298..988fe4413529 100644
--- a/oox/source/export/chartexport.cxx
+++ b/oox/source/export/chartexport.cxx
@@ -1732,6 +1732,7 @@ void ChartExport::exportPlotArea(const Reference< 
css::chart::XChartDocument >&
     }
     //Axis Data
     exportAxes( );
+
     // Data Table
     exportDataTable();
 
@@ -2033,35 +2034,41 @@ void ChartExport::exportGradientFill( const Reference< 
XPropertySet >& xPropSet
 
 void ChartExport::exportDataTable( )
 {
+    auto xDataTable = mxNewDiagram->getDataTable();
+    if (!xDataTable.is())
+        return;
+
     FSHelperPtr pFS = GetFS();
-    Reference< beans::XPropertySet > aPropSet( mxDiagram, uno::UNO_QUERY );
+    uno::Reference<beans::XPropertySet> aPropSet(xDataTable, uno::UNO_QUERY);
 
     bool bShowVBorder = false;
     bool bShowHBorder = false;
     bool bShowOutline = false;
+    bool bShowKeys = false;
 
-    if (GetProperty( aPropSet, "DataTableHBorder"))
+    if (GetProperty(aPropSet, "HBorder"))
         mAny >>= bShowHBorder;
-    if (GetProperty( aPropSet, "DataTableVBorder"))
+    if (GetProperty(aPropSet, "VBorder"))
         mAny >>= bShowVBorder;
-    if (GetProperty( aPropSet, "DataTableOutline"))
+    if (GetProperty(aPropSet, "Outline"))
+        mAny >>= bShowOutline;
+    if (GetProperty(aPropSet, "Keys"))
         mAny >>= bShowOutline;
-
-    if (!(bShowVBorder || bShowHBorder || bShowOutline))
-        return;
 
     pFS->startElement(FSNS(XML_c, XML_dTable));
+
     if (bShowHBorder)
-        pFS->singleElement( FSNS( XML_c, XML_showHorzBorder ),
-                        XML_val, "1" );
+        pFS->singleElement(FSNS(XML_c, XML_showHorzBorder), XML_val, "1" );
     if (bShowVBorder)
         pFS->singleElement(FSNS(XML_c, XML_showVertBorder), XML_val, "1");
     if (bShowOutline)
         pFS->singleElement(FSNS(XML_c, XML_showOutline), XML_val, "1");
+    if (bShowKeys)
+        pFS->singleElement(FSNS(XML_c, XML_showKeys), XML_val, "1");
 
-    pFS->endElement(  FSNS( XML_c, XML_dTable));
-
+    pFS->endElement(FSNS(XML_c, XML_dTable));
 }
+
 void ChartExport::exportAreaChart( const Reference< chart2::XChartType >& 
xChartType )
 {
     FSHelperPtr pFS = GetFS();
commit 905fce909f1ce0df4caad36d48afeb14b9dfd05b
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Fri May 20 23:55:45 2022 +0900
Commit:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
CommitDate: Fri Jun 17 17:52:16 2022 +0200

    chart2: apply line props. to borders when rendering a data table
    
    This sets the color, line width, line style to the borders of
    the table when rendering the data table. We also need the
    ChartModel inside DataTableView, so we can access the needed
    line dashes.
    
    Change-Id: Id3bef23b75e88517d6569ad87a716f178ed64343

diff --git a/chart2/source/view/axes/VAxisBase.cxx 
b/chart2/source/view/axes/VAxisBase.cxx
index 96ddc893643f..cb61145178c0 100644
--- a/chart2/source/view/axes/VAxisBase.cxx
+++ b/chart2/source/view/axes/VAxisBase.cxx
@@ -244,7 +244,8 @@ void VAxisBase::updateUnscaledValuesAtTicks( TickIter& 
rIter )
 }
 
 void 
VAxisBase::createDataTableView(std::vector<std::unique_ptr<VSeriesPlotter>>& 
/*rSeriesPlotterList*/,
-                                    
uno::Reference<util::XNumberFormatsSupplier> const& /*xNumberFormatsSupplier*/)
+                                    
uno::Reference<util::XNumberFormatsSupplier> const& /*xNumberFormatsSupplier*/,
+                                    rtl::Reference<::chart::ChartModel> const& 
/*xChartDoc*/)
 {
 }
 
diff --git a/chart2/source/view/axes/VAxisBase.hxx 
b/chart2/source/view/axes/VAxisBase.hxx
index ac18257b4d4c..1934c604650f 100644
--- a/chart2/source/view/axes/VAxisBase.hxx
+++ b/chart2/source/view/axes/VAxisBase.hxx
@@ -29,6 +29,7 @@ namespace chart
 
 class VSeriesPlotter;
 class DataTableView;
+class ChartModel;
 
 class VAxisBase : public VAxisOrGridBase
 {
@@ -63,7 +64,8 @@ public:
     void setExtraLinePositionAtOtherAxis( double fCrossingAt );
 
     virtual void 
createDataTableView(std::vector<std::unique_ptr<VSeriesPlotter>>& 
rSeriesPlotterList,
-                                     
css::uno::Reference<css::util::XNumberFormatsSupplier> const& 
xNumberFormatsSupplier);
+                                     
css::uno::Reference<css::util::XNumberFormatsSupplier> const& 
xNumberFormatsSupplier,
+                                     rtl::Reference<::chart::ChartModel> 
const& xChartDoc);
 
     std::shared_ptr<DataTableView> getDataTableView() { return 
m_pDataTableView; }
 
diff --git a/chart2/source/view/axes/VCartesianAxis.cxx 
b/chart2/source/view/axes/VCartesianAxis.cxx
index 096586279454..d7e78d5d2e85 100644
--- a/chart2/source/view/axes/VCartesianAxis.cxx
+++ b/chart2/source/view/axes/VCartesianAxis.cxx
@@ -37,6 +37,7 @@
 #include <svx/unoshtxt.hxx>
 #include <VSeriesPlotter.hxx>
 #include <DataTableView.hxx>
+#include <ChartModel.hxx>
 
 #include <comphelper/scopeguard.hxx>
 
@@ -1993,11 +1994,12 @@ void VCartesianAxis::createShapes()
 }
 
 void 
VCartesianAxis::createDataTableView(std::vector<std::unique_ptr<VSeriesPlotter>>&
 rSeriesPlotterList,
-                                         
Reference<util::XNumberFormatsSupplier> const& xNumberFormatsSupplier)
+                                         
Reference<util::XNumberFormatsSupplier> const& xNumberFormatsSupplier,
+                                         rtl::Reference<::chart::ChartModel> 
const& xChartDoc)
 {
     if (m_aAxisProperties.m_bDisplayDataTable)
     {
-        m_pDataTableView.reset(new 
DataTableView(m_aAxisProperties.m_xDataTableModel));
+        m_pDataTableView.reset(new DataTableView(xChartDoc, 
m_aAxisProperties.m_xDataTableModel));
         m_pDataTableView->initializeValues(rSeriesPlotterList);
         m_xNumberFormatsSupplier = xNumberFormatsSupplier;
     }
diff --git a/chart2/source/view/axes/VCartesianAxis.hxx 
b/chart2/source/view/axes/VCartesianAxis.hxx
index 9f396fef43b8..a9baca907bdd 100644
--- a/chart2/source/view/axes/VCartesianAxis.hxx
+++ b/chart2/source/view/axes/VCartesianAxis.hxx
@@ -100,7 +100,8 @@ public:
     };
 
     void createDataTableView(std::vector<std::unique_ptr<VSeriesPlotter>>& 
rSeriesPlotterList,
-                             
css::uno::Reference<css::util::XNumberFormatsSupplier> const& 
xNumberFormatsSupplier) override;
+                             
css::uno::Reference<css::util::XNumberFormatsSupplier> const& 
xNumberFormatsSupplier,
+                             rtl::Reference<::chart::ChartModel> const& 
xChartDoc) override;
 private: //methods
     /**
      * Go through all tick label positions and decide which labels to display
diff --git a/chart2/source/view/axes/VCartesianCoordinateSystem.cxx 
b/chart2/source/view/axes/VCartesianCoordinateSystem.cxx
index cd0d49188a1c..3ea42cb087a0 100644
--- a/chart2/source/view/axes/VCartesianCoordinateSystem.cxx
+++ b/chart2/source/view/axes/VCartesianCoordinateSystem.cxx
@@ -166,7 +166,7 @@ void VCartesianCoordinateSystem::createVAxisList(
             apVAxis->set3DWallPositions( m_eLeftWallPos, m_eBackWallPos, 
m_eBottomPos );
 
             
apVAxis->initAxisLabelProperties(rFontReferenceSize,rMaximumSpaceForLabels);
-            apVAxis->createDataTableView(rSeriesPlotterList, 
xNumberFormatsSupplier);
+            apVAxis->createDataTableView(rSeriesPlotterList, 
xNumberFormatsSupplier, xChartDoc);
         }
     }
 }
diff --git a/chart2/source/view/inc/DataTableView.hxx 
b/chart2/source/view/inc/DataTableView.hxx
index 3f4d97629035..0967768af93e 100644
--- a/chart2/source/view/inc/DataTableView.hxx
+++ b/chart2/source/view/inc/DataTableView.hxx
@@ -13,23 +13,32 @@
 #include <svx/unodraw/SvxTableShape.hxx>
 #include <com/sun/star/awt/Rectangle.hpp>
 #include <DataTable.hxx>
+#include <VLineProperties.hxx>
 
 namespace chart
 {
 class VSeriesPlotter;
+class ChartModel;
 
 class DataTableView final
 {
+private:
+    rtl::Reference<::chart::ChartModel> const& m_xChartModel;
     rtl::Reference<SvxShapeGroupAnyD> m_xTarget;
     rtl::Reference<SvxTableShape> m_xTableShape;
     rtl::Reference<DataTable> m_xDataTableModel;
+    VLineProperties m_aLineProperties;
 
     std::vector<OUString> m_aDataSeriesNames;
     std::vector<OUString> m_aXValues;
     std::vector<std::vector<OUString>> m_pDataSeriesValues;
 
+    void setCellDefaults(css::uno::Reference<css::beans::XPropertySet>& 
xPropertySet, bool bLeft,
+                         bool bTop, bool bRight, bool bBottom);
+
 public:
-    DataTableView(rtl::Reference<DataTable> const& rDataTableModel);
+    DataTableView(rtl::Reference<::chart::ChartModel> const& xChartDoc,
+                  rtl::Reference<DataTable> const& rDataTableModel);
     void initializeShapes(const rtl::Reference<SvxShapeGroupAnyD>& xTarget);
     void initializeValues(std::vector<std::unique_ptr<VSeriesPlotter>>& 
rSeriesPlotterList);
     void createShapes(basegfx::B2DVector const& rStart, basegfx::B2DVector 
const& rEnd,
diff --git a/chart2/source/view/main/DataTableView.cxx 
b/chart2/source/view/main/DataTableView.cxx
index 92714a8a85ba..3992ea84d012 100644
--- a/chart2/source/view/main/DataTableView.cxx
+++ b/chart2/source/view/main/DataTableView.cxx
@@ -12,6 +12,7 @@
 #include <VSeriesPlotter.hxx>
 #include <ShapeFactory.hxx>
 #include <ExplicitCategoriesProvider.hxx>
+#include <ChartModel.hxx>
 
 #include <svx/svdotable.hxx>
 
@@ -19,10 +20,14 @@
 #include <com/sun/star/table/BorderLine.hpp>
 #include <com/sun/star/table/BorderLine2.hpp>
 #include <com/sun/star/table/TableBorder.hpp>
+#include <com/sun/star/table/BorderLineStyle.hpp>
 #include <com/sun/star/style/ParagraphAdjust.hpp>
 #include <com/sun/star/drawing/TextHorizontalAdjust.hpp>
 #include <com/sun/star/drawing/TextVerticalAdjust.hpp>
+#include <com/sun/star/drawing/LineDash.hpp>
+#include <com/sun/star/drawing/LineStyle.hpp>
 #include <com/sun/star/util/XBroadcaster.hpp>
+#include <com/sun/star/container/XNameContainer.hpp>
 
 #include <o3tl/unit_conversion.hxx>
 
@@ -30,48 +35,97 @@ using namespace css;
 
 namespace chart
 {
-DataTableView::DataTableView(rtl::Reference<DataTable> const& rDataTableModel)
-    : m_xDataTableModel(rDataTableModel)
+DataTableView::DataTableView(rtl::Reference<::chart::ChartModel> const& 
xChartModel,
+                             rtl::Reference<DataTable> const& rDataTableModel)
+    : m_xChartModel(xChartModel)
+    , m_xDataTableModel(rDataTableModel)
 {
+    uno::Reference<beans::XPropertySet> xProp = m_xDataTableModel.get();
+    m_aLineProperties.initFromPropertySet(xProp);
 }
 
 namespace
 {
-void setCellDefaults(uno::Reference<beans::XPropertySet>& xPropertySet, bool 
bLeft, bool bTop,
-                     bool bRight, bool bBottom)
+void setTopCell(uno::Reference<beans::XPropertySet>& xPropertySet)
 {
     xPropertySet->setPropertyValue("FillColor", uno::Any(Color(0xFFFFFF)));
     xPropertySet->setPropertyValue("TextVerticalAdjust", 
uno::Any(drawing::TextVerticalAdjust_TOP));
     xPropertySet->setPropertyValue("ParaAdjust", 
uno::Any(style::ParagraphAdjust_CENTER));
 
     table::BorderLine2 aBorderLine;
-    aBorderLine.LineWidth = o3tl::convert(0.5, o3tl::Length::pt, 
o3tl::Length::mm100);
+    aBorderLine.LineWidth = 0;
     aBorderLine.Color = 0x000000;
 
-    if (bLeft)
-        xPropertySet->setPropertyValue("LeftBorder", uno::Any(aBorderLine));
-    if (bTop)
-        xPropertySet->setPropertyValue("TopBorder", uno::Any(aBorderLine));
-    if (bRight)
-        xPropertySet->setPropertyValue("RightBorder", uno::Any(aBorderLine));
-    if (bBottom)
-        xPropertySet->setPropertyValue("BottomBorder", uno::Any(aBorderLine));
+    xPropertySet->setPropertyValue("TopBorder", uno::Any(aBorderLine));
+    xPropertySet->setPropertyValue("LeftBorder", uno::Any(aBorderLine));
+}
 }
 
-void setTopCell(uno::Reference<beans::XPropertySet>& xPropertySet)
+void DataTableView::setCellDefaults(uno::Reference<beans::XPropertySet>& 
xPropertySet, bool bLeft,
+                                    bool bTop, bool bRight, bool bBottom)
 {
     xPropertySet->setPropertyValue("FillColor", uno::Any(Color(0xFFFFFF)));
     xPropertySet->setPropertyValue("TextVerticalAdjust", 
uno::Any(drawing::TextVerticalAdjust_TOP));
     xPropertySet->setPropertyValue("ParaAdjust", 
uno::Any(style::ParagraphAdjust_CENTER));
 
-    table::BorderLine2 aBorderLine;
-    aBorderLine.LineWidth = 0;
-    aBorderLine.Color = 0x000000;
+    drawing::LineStyle eStyle = drawing::LineStyle_NONE;
+    m_aLineProperties.LineStyle >>= eStyle;
 
-    xPropertySet->setPropertyValue("TopBorder", uno::Any(aBorderLine));
-    xPropertySet->setPropertyValue("LeftBorder", uno::Any(aBorderLine));
-}
+    if (eStyle != drawing::LineStyle_NONE)
+    {
+        table::BorderLine2 aBorderLine;
+
+        sal_Int32 nWidth = 0;
+        m_aLineProperties.Width >>= nWidth;
+        aBorderLine.LineWidth = o3tl::convert(nWidth, o3tl::Length::mm100, 
o3tl::Length::twip);
+
+        sal_Int32 nColor = 0;
+        m_aLineProperties.Color >>= nColor;
+        aBorderLine.Color = nColor;
+
+        aBorderLine.LineStyle = table::BorderLineStyle::SOLID;
+
+        if (eStyle == drawing::LineStyle_DASH)
+        {
+            OUString aDashName;
+            m_aLineProperties.DashName >>= aDashName;
+            if (!aDashName.isEmpty())
+            {
+                uno::Reference<container::XNameContainer> xDashTable(
+                    
m_xChartModel->createInstance("com.sun.star.drawing.DashTable"),
+                    uno::UNO_QUERY);
+                if (xDashTable.is() && xDashTable->hasByName(aDashName))
+                {
+                    drawing::LineDash aLineDash;
+                    xDashTable->getByName(aDashName) >>= aLineDash;
+
+                    if (aLineDash.Dots == 0 && aLineDash.Dashes == 0)
+                        aBorderLine.LineStyle = table::BorderLineStyle::SOLID;
+                    else if (aLineDash.Dots == 1 && aLineDash.Dashes == 0)
+                        aBorderLine.LineStyle = table::BorderLineStyle::DOTTED;
+                    else if (aLineDash.Dots == 0 && aLineDash.Dashes == 1)
+                        aBorderLine.LineStyle = table::BorderLineStyle::DASHED;
+                    else if (aLineDash.Dots == 1 && aLineDash.Dashes == 1)
+                        aBorderLine.LineStyle = 
table::BorderLineStyle::DASH_DOT;
+                    else if (aLineDash.Dots == 2 && aLineDash.Dashes == 1)
+                        aBorderLine.LineStyle = 
table::BorderLineStyle::DASH_DOT_DOT;
+                    else
+                        aBorderLine.LineStyle = table::BorderLineStyle::DASHED;
+                }
+            }
+        }
+
+        if (bLeft)
+            xPropertySet->setPropertyValue("LeftBorder", 
uno::Any(aBorderLine));
+        if (bTop)
+            xPropertySet->setPropertyValue("TopBorder", uno::Any(aBorderLine));
+        if (bRight)
+            xPropertySet->setPropertyValue("RightBorder", 
uno::Any(aBorderLine));
+        if (bBottom)
+            xPropertySet->setPropertyValue("BottomBorder", 
uno::Any(aBorderLine));
+    }
 }
+
 void DataTableView::createShapes(basegfx::B2DVector const& rStart, 
basegfx::B2DVector const& rEnd,
                                  sal_Int32 nColumnWidth)
 {
commit 488f8543537ac5e1570f9a6f594891c2289dbb0d
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Fri May 20 18:39:34 2022 +0900
Commit:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
CommitDate: Fri Jun 17 17:52:16 2022 +0200

    chart2: better readable DataTable properties definition
    
    Change-Id: Ib9cadee39f58b73782e6a3268d86b688183de1fb

diff --git a/chart2/source/model/main/DataTable.cxx 
b/chart2/source/model/main/DataTable.cxx
index 12e08e28b3e4..0b7fba3176e2 100644
--- a/chart2/source/model/main/DataTable.cxx
+++ b/chart2/source/model/main/DataTable.cxx
@@ -34,23 +34,21 @@ enum
     DataTableProperty_Keys,
 };
 
-void lcl_AddPropertiesToVector(std::vector<beans::Property>& rOutProperties)
-{
-    rOutProperties.emplace_back("Show", DataTableProperty_Show, 
cppu::UnoType<bool>::get(),
-                                beans::PropertyAttribute::BOUND
-                                    | beans::PropertyAttribute::MAYBEDEFAULT);
-    rOutProperties.emplace_back(
-        "HBorder", DataTableProperty_HorizontalBorder, 
cppu::UnoType<bool>::get(),
-        beans::PropertyAttribute::BOUND | 
beans::PropertyAttribute::MAYBEDEFAULT);
-    rOutProperties.emplace_back(
-        "VBorder", DataTableProperty_VerticalBorder, 
cppu::UnoType<bool>::get(),
-        beans::PropertyAttribute::BOUND | 
beans::PropertyAttribute::MAYBEDEFAULT);
-    rOutProperties.emplace_back("Outline", DataTableProperty_Outilne, 
cppu::UnoType<bool>::get(),
-                                beans::PropertyAttribute::BOUND
-                                    | beans::PropertyAttribute::MAYBEDEFAULT);
-    rOutProperties.emplace_back("Keys", DataTableProperty_Keys, 
cppu::UnoType<bool>::get(),
-                                beans::PropertyAttribute::BOUND
-                                    | beans::PropertyAttribute::MAYBEDEFAULT);
+void lcl_AddPropertiesToVector(std::vector<beans::Property>& rProps)
+{
+    auto const nBound = beans::PropertyAttribute::BOUND;
+    auto const nMaybeDefault = beans::PropertyAttribute::MAYBEDEFAULT;
+
+    rProps.emplace_back("Show", DataTableProperty_Show, 
cppu::UnoType<bool>::get(),
+                        nBound | nMaybeDefault);
+    rProps.emplace_back("HBorder", DataTableProperty_HorizontalBorder, 
cppu::UnoType<bool>::get(),
+                        nBound | nMaybeDefault);
+    rProps.emplace_back("VBorder", DataTableProperty_VerticalBorder, 
cppu::UnoType<bool>::get(),
+                        nBound | nMaybeDefault);
+    rProps.emplace_back("Outline", DataTableProperty_Outilne, 
cppu::UnoType<bool>::get(),
+                        nBound | nMaybeDefault);
+    rProps.emplace_back("Keys", DataTableProperty_Keys, 
cppu::UnoType<bool>::get(),
+                        nBound | nMaybeDefault);
 }
 
 struct StaticLegendDefaults_Initializer
commit 79bbbdb60eb84819d4c39297e40a04b3a9597615
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Fri May 20 18:20:51 2022 +0900
Commit:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
CommitDate: Fri Jun 17 17:52:16 2022 +0200

    chart2: remove setting DataTable* props. from old chart::XDialog
    
    No API change needed as the properties were not officialy part
    of the API in the first place.
    
    Change-Id: I8682087d13ab2e9eb1c619646b87cde59c3a8e45

diff --git a/chart2/source/controller/chartapiwrapper/DiagramWrapper.cxx 
b/chart2/source/controller/chartapiwrapper/DiagramWrapper.cxx
index db1abe739787..0fea6c4da7f9 100644
--- a/chart2/source/controller/chartapiwrapper/DiagramWrapper.cxx
+++ b/chart2/source/controller/chartapiwrapper/DiagramWrapper.cxx
@@ -137,9 +137,6 @@ enum
     PROP_DIAGRAM_HAS_SECOND_Y_AXIS_TITLE,
 
     PROP_DIAGRAM_AUTOMATIC_SIZE,
-    PROP_DIAGRAM_DATATABLEHBORDER,
-    PROP_DIAGRAM_DATATABLEVBORDER,
-    PROP_DIAGRAM_DATATABLEOUTLINE,
     PROP_DIAGRAM_EXTERNALDATA
 };
 
@@ -381,21 +378,7 @@ void lcl_AddPropertiesToVector(
                   cppu::UnoType<bool>::get(),
                   beans::PropertyAttribute::BOUND
                   | beans::PropertyAttribute::MAYBEDEFAULT );
-    rOutProperties.emplace_back( "DataTableHBorder",
-                PROP_DIAGRAM_DATATABLEHBORDER,
-                  cppu::UnoType<bool>::get(),
-                  beans::PropertyAttribute::BOUND
-                  | beans::PropertyAttribute::MAYBEDEFAULT );
-    rOutProperties.emplace_back( "DataTableVBorder",
-                PROP_DIAGRAM_DATATABLEVBORDER,
-                  cppu::UnoType<bool>::get(),
-                  beans::PropertyAttribute::BOUND
-                  | beans::PropertyAttribute::MAYBEDEFAULT );
-    rOutProperties.emplace_back( "DataTableOutline",
-                PROP_DIAGRAM_DATATABLEOUTLINE,
-                  cppu::UnoType<bool>::get(),
-                  beans::PropertyAttribute::BOUND
-                  | beans::PropertyAttribute::MAYBEDEFAULT );
+
     rOutProperties.emplace_back( "ExternalData",
                   PROP_DIAGRAM_EXTERNALDATA,
                   cppu::UnoType<OUString>::get(),
commit fee5e31c368f533b2991ca25d044b3536af5a651
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Thu May 19 21:52:15 2022 +0900
Commit:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
CommitDate: Fri Jun 17 17:52:15 2022 +0200

    chart2: use {V,H}Border, Outline Data Table props. at rendering
    
    insert DataTable class into DataTableView, so it is possible to
    take the properties into account when rendering.
    Change rendering:
    VBorder - draw vert. border of data table
    HBorder - draw horiz. border of data table
    Outline - draw the outline borders of a data table
    
    Change-Id: I8348d0672d9c188014d664d667abddde8ebbc7c0

diff --git a/chart2/source/view/axes/VCartesianAxis.cxx 
b/chart2/source/view/axes/VCartesianAxis.cxx
index 2266dd143d2e..096586279454 100644
--- a/chart2/source/view/axes/VCartesianAxis.cxx
+++ b/chart2/source/view/axes/VCartesianAxis.cxx
@@ -1997,7 +1997,7 @@ void 
VCartesianAxis::createDataTableView(std::vector<std::unique_ptr<VSeriesPlot
 {
     if (m_aAxisProperties.m_bDisplayDataTable)
     {
-        m_pDataTableView.reset(new DataTableView);
+        m_pDataTableView.reset(new 
DataTableView(m_aAxisProperties.m_xDataTableModel));
         m_pDataTableView->initializeValues(rSeriesPlotterList);
         m_xNumberFormatsSupplier = xNumberFormatsSupplier;
     }
diff --git a/chart2/source/view/inc/DataTableView.hxx 
b/chart2/source/view/inc/DataTableView.hxx
index 517de9699d9e..3f4d97629035 100644
--- a/chart2/source/view/inc/DataTableView.hxx
+++ b/chart2/source/view/inc/DataTableView.hxx
@@ -12,6 +12,7 @@
 #include <svx/unoshape.hxx>
 #include <svx/unodraw/SvxTableShape.hxx>
 #include <com/sun/star/awt/Rectangle.hpp>
+#include <DataTable.hxx>
 
 namespace chart
 {
@@ -21,17 +22,18 @@ class DataTableView final
 {
     rtl::Reference<SvxShapeGroupAnyD> m_xTarget;
     rtl::Reference<SvxTableShape> m_xTableShape;
+    rtl::Reference<DataTable> m_xDataTableModel;
 
     std::vector<OUString> m_aDataSeriesNames;
     std::vector<OUString> m_aXValues;
     std::vector<std::vector<OUString>> m_pDataSeriesValues;
 
 public:
-    DataTableView();
+    DataTableView(rtl::Reference<DataTable> const& rDataTableModel);
     void initializeShapes(const rtl::Reference<SvxShapeGroupAnyD>& xTarget);
     void initializeValues(std::vector<std::unique_ptr<VSeriesPlotter>>& 
rSeriesPlotterList);
     void createShapes(basegfx::B2DVector const& rStart, basegfx::B2DVector 
const& rEnd,
-                      sal_Int32 nDistance);
+                      sal_Int32 nColumnWidth);
 };
 
 } //namespace chart
diff --git a/chart2/source/view/main/DataTableView.cxx 
b/chart2/source/view/main/DataTableView.cxx
index 7d29f0e4276d..92714a8a85ba 100644
--- a/chart2/source/view/main/DataTableView.cxx
+++ b/chart2/source/view/main/DataTableView.cxx
@@ -30,11 +30,15 @@ using namespace css;
 
 namespace chart
 {
-DataTableView::DataTableView() = default;
+DataTableView::DataTableView(rtl::Reference<DataTable> const& rDataTableModel)
+    : m_xDataTableModel(rDataTableModel)
+{
+}
 
 namespace
 {
-void setCellDefaults(uno::Reference<beans::XPropertySet>& xPropertySet)
+void setCellDefaults(uno::Reference<beans::XPropertySet>& xPropertySet, bool 
bLeft, bool bTop,
+                     bool bRight, bool bBottom)
 {
     xPropertySet->setPropertyValue("FillColor", uno::Any(Color(0xFFFFFF)));
     xPropertySet->setPropertyValue("TextVerticalAdjust", 
uno::Any(drawing::TextVerticalAdjust_TOP));
@@ -44,10 +48,14 @@ void setCellDefaults(uno::Reference<beans::XPropertySet>& 
xPropertySet)
     aBorderLine.LineWidth = o3tl::convert(0.5, o3tl::Length::pt, 
o3tl::Length::mm100);
     aBorderLine.Color = 0x000000;
 
-    xPropertySet->setPropertyValue("TopBorder", uno::Any(aBorderLine));
-    xPropertySet->setPropertyValue("BottomBorder", uno::Any(aBorderLine));
-    xPropertySet->setPropertyValue("LeftBorder", uno::Any(aBorderLine));
-    xPropertySet->setPropertyValue("RightBorder", uno::Any(aBorderLine));
+    if (bLeft)
+        xPropertySet->setPropertyValue("LeftBorder", uno::Any(aBorderLine));
+    if (bTop)
+        xPropertySet->setPropertyValue("TopBorder", uno::Any(aBorderLine));
+    if (bRight)
+        xPropertySet->setPropertyValue("RightBorder", uno::Any(aBorderLine));
+    if (bBottom)
+        xPropertySet->setPropertyValue("BottomBorder", uno::Any(aBorderLine));
 }
 
 void setTopCell(uno::Reference<beans::XPropertySet>& xPropertySet)
@@ -65,7 +73,7 @@ void setTopCell(uno::Reference<beans::XPropertySet>& 
xPropertySet)
 }
 }
 void DataTableView::createShapes(basegfx::B2DVector const& rStart, 
basegfx::B2DVector const& rEnd,
-                                 sal_Int32 nColumnSize)
+                                 sal_Int32 nColumnWidth)
 {
     if (!m_xTarget.is())
         return;
@@ -74,7 +82,6 @@ void DataTableView::createShapes(basegfx::B2DVector const& 
rStart, basegfx::B2DV
     m_xTableShape = ShapeFactory::createTable(m_xTarget);
 
     uno::Reference<table::XTable> xTable;
-    uno::Reference<util::XBroadcaster> xBroadcaster;
     try
     {
         auto rDelta = rEnd - rStart;
@@ -86,18 +93,31 @@ void DataTableView::createShapes(basegfx::B2DVector const& 
rStart, basegfx::B2DV
         return;
     }
 
-    if (xTable.is())
-        xBroadcaster.set(xTable, uno::UNO_QUERY);
+    if (!xTable.is())
+        return;
+
+    uno::Reference<util::XBroadcaster> xBroadcaster(xTable, uno::UNO_QUERY);
 
     if (!xBroadcaster.is())
         return;
 
     xBroadcaster->lockBroadcasts();
+
+    bool bHBorder = false;
+    bool bVBorder = false;
+    bool bOutline = false;
+
+    m_xDataTableModel->getPropertyValue("HBorder") >>= bHBorder;
+    m_xDataTableModel->getPropertyValue("VBorder") >>= bVBorder;
+    m_xDataTableModel->getPropertyValue("Outline") >>= bOutline;
+
+    sal_Int32 nColumnCount = m_aXValues.size();
     uno::Reference<table::XTableColumns> xTableColumns = xTable->getColumns();
-    xTableColumns->insertByIndex(0, m_aXValues.size());
+    xTableColumns->insertByIndex(0, nColumnCount);
 
+    sal_Int32 nRowCount = m_aDataSeriesNames.size();
     uno::Reference<table::XTableRows> xTableRows = xTable->getRows();
-    xTableRows->insertByIndex(0, m_aDataSeriesNames.size());
+    xTableRows->insertByIndex(0, nRowCount);
 
     {
         uno::Reference<table::XCell> xCell = xTable->getCellByPosition(0, 0);
@@ -120,7 +140,8 @@ void DataTableView::createShapes(basegfx::B2DVector const& 
rStart, basegfx::B2DV
         if (xCellTextRange.is())
         {
             xCellTextRange->setString(rString);
-            setCellDefaults(xPropertySet);
+            bool bLeft = bOutline || (bVBorder && nColumn > 1);
+            setCellDefaults(xPropertySet, bLeft, bOutline, bOutline, bOutline);
         }
         nColumn++;
     }
@@ -133,8 +154,9 @@ void DataTableView::createShapes(basegfx::B2DVector const& 
rStart, basegfx::B2DV
         uno::Reference<text::XTextRange> xCellTextRange(xCell, uno::UNO_QUERY);
         if (xCellTextRange.is())
         {
+            bool bTop = bOutline || (bHBorder && nRow > 1);
             xCellTextRange->setString(rSeriesName);
-            setCellDefaults(xPropertySet);
+            setCellDefaults(xPropertySet, bOutline, bTop, bOutline, bOutline);
         }
         nRow++;
     }
@@ -151,7 +173,25 @@ void DataTableView::createShapes(basegfx::B2DVector const& 
rStart, basegfx::B2DV
             if (xCellTextRange.is())
             {
                 xCellTextRange->setString(rValue);
-                setCellDefaults(xPropertySet);
+
+                bool bLeft = false;
+                bool bTop = false;
+                bool bRight = false;
+                bool bBottom = false;
+
+                if (nColumn > 1 && bVBorder)
+                    bLeft = true;
+
+                if (nRow > 1 && bHBorder)
+                    bTop = true;
+
+                if (nRow == nRowCount && bOutline)
+                    bBottom = true;
+
+                if (nColumn == nColumnCount && bOutline)
+                    bRight = true;
+
+                setCellDefaults(xPropertySet, bLeft, bTop, bRight, bBottom);
             }
             nColumn++;
         }
@@ -161,7 +201,7 @@ void DataTableView::createShapes(basegfx::B2DVector const& 
rStart, basegfx::B2DV
     xBroadcaster->unlockBroadcasts();
 
     auto* pTableObject = 
static_cast<sdr::table::SdrTableObj*>(m_xTableShape->GetSdrObject());
-    pTableObject->DistributeColumns(0, pTableObject->getColumnCount() - 1, 
true, true);
+    pTableObject->DistributeColumns(0, nColumnCount - 1, true, true);
 
     uno::Reference<beans::XPropertySet> 
xPropertySet(xTableColumns->getByIndex(0), uno::UNO_QUERY);
     sal_Int32 nWidth = 0;
@@ -172,7 +212,7 @@ void DataTableView::createShapes(basegfx::B2DVector const& 
rStart, basegfx::B2DV
     for (sal_Int32 i = 1; i < xTableColumns->getCount(); ++i)
     {
         xPropertySet.set(xTableColumns->getByIndex(i), uno::UNO_QUERY);
-        xPropertySet->setPropertyValue("Width", uno::Any(nColumnSize));
+        xPropertySet->setPropertyValue("Width", uno::Any(nColumnWidth));
     }
 }
 
commit 721529a9a89c1c2f1e4834c0af28be0a75ffb093
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Mon May 16 16:19:39 2022 +0900
Commit:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
CommitDate: Fri Jun 17 17:52:15 2022 +0200

    oox: support reading text and shape properties for a data table
    
    Change-Id: I740d3bd6af11457ecb54878be648ad1e22b9d4b8

diff --git a/oox/inc/drawingml/chart/datatablemodel.hxx 
b/oox/inc/drawingml/chart/datatablemodel.hxx
index 5c7fe7901200..937dbb3c60a6 100644
--- a/oox/inc/drawingml/chart/datatablemodel.hxx
+++ b/oox/inc/drawingml/chart/datatablemodel.hxx
@@ -28,6 +28,9 @@ struct DataTableModel
     bool mbShowOutline : 1; /// Show outline
     bool mbShowKeys : 1;
 
+    ModelRef<Shape> mxShapeProp; /// frame formatting.
+    ModelRef<TextBody> mxTextProp; /// text formatting.
+
     DataTableModel()
         : mbShowHBorder(false)
         , mbShowVBorder(false)
diff --git a/oox/source/drawingml/chart/datatablecontext.cxx 
b/oox/source/drawingml/chart/datatablecontext.cxx
index 0813a6424312..c277dae5f4d6 100644
--- a/oox/source/drawingml/chart/datatablecontext.cxx
+++ b/oox/source/drawingml/chart/datatablecontext.cxx
@@ -18,7 +18,8 @@
  */
 
 #include <drawingml/chart/datatablecontext.hxx>
-
+#include <drawingml/shapepropertiescontext.hxx>
+#include <drawingml/textbodycontext.hxx>
 #include <drawingml/chart/plotareamodel.hxx>
 #include <oox/core/xmlfilterbase.hxx>
 #include <oox/helper/attributelist.hxx>
@@ -57,6 +58,10 @@ ContextHandlerRef 
DataTableContext::onCreateContext(sal_Int32 nElement,
                 case C_TOKEN(showKeys):
                     mrModel.mbShowKeys = rAttribs.getBool(XML_val, false);
                     break;
+                case C_TOKEN(spPr):
+                    return new ShapePropertiesContext(*this, 
mrModel.mxShapeProp.create());
+                case C_TOKEN(txPr):
+                    return new TextBodyContext(*this, 
mrModel.mxTextProp.create());
             }
             break;
     }
diff --git a/oox/source/drawingml/chart/datatableconverter.cxx 
b/oox/source/drawingml/chart/datatableconverter.cxx
index 3c477c5d7507..4e42b7468ebc 100644
--- a/oox/source/drawingml/chart/datatableconverter.cxx
+++ b/oox/source/drawingml/chart/datatableconverter.cxx
@@ -55,6 +55,9 @@ void 
DataTableConverter::convertFromModel(uno::Reference<chart2::XDiagram> const
             aPropSet.setProperty(PROP_Outline, mrModel.mbShowOutline);
         if (mrModel.mbShowKeys)
             aPropSet.setProperty(PROP_Keys, mrModel.mbShowKeys);
+
+        getFormatter().convertFormatting(aPropSet, mrModel.mxShapeProp, 
mrModel.mxTextProp,
+                                         OBJECTTYPE_DATATABLE);
     }
     catch (uno::Exception&)
     {
commit c55234a7fc50d6234534272ba943ac5e5c122bc8
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Mon May 16 16:10:02 2022 +0900
Commit:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
CommitDate: Fri Jun 17 17:52:08 2022 +0200

    chart2: add DataTable to AxisProperties, take account at rendering
    
    The Diagram model has the DataTable class, but now we need to
    take this into account at rendering. First add the DataTable to
    AxisProperties, to decide if the data table should be rendered or
    not.
    
    Change-Id: Ia18fcffccc632e4d36011544066072ae3cdfbfc7

diff --git a/chart2/source/view/axes/VAxisProperties.cxx 
b/chart2/source/view/axes/VAxisProperties.cxx
index 8cb9e0eec7ee..f39420c9ce02 100644
--- a/chart2/source/view/axes/VAxisProperties.cxx
+++ b/chart2/source/view/axes/VAxisProperties.cxx
@@ -153,8 +153,9 @@ TickmarkProperties 
AxisProperties::getBiggestTickmarkProperties()
     return aTickmarkProperties;
 }
 
-AxisProperties::AxisProperties( rtl::Reference< Axis > xAxisModel
-                              , ExplicitCategoriesProvider* 
pExplicitCategoriesProvider )
+AxisProperties::AxisProperties(rtl::Reference<::chart::Axis> xAxisModel,
+                               ExplicitCategoriesProvider* 
pExplicitCategoriesProvider,
+                               rtl::Reference<::chart::DataTable> const& 
xDataTableModel)
     : m_xAxisModel(std::move(xAxisModel))
     , m_nDimensionIndex(0)
     , m_bIsMainAxis(true)
@@ -174,6 +175,7 @@ AxisProperties::AxisProperties( rtl::Reference< Axis > 
xAxisModel
     , m_bComplexCategories(false)
     , m_pExplicitCategoriesProvider(pExplicitCategoriesProvider)
     , m_bLimitSpaceForLabels(false)
+    , m_xDataTableModel(xDataTableModel)
 {
 }
 
@@ -256,7 +258,9 @@ void AxisProperties::init( bool bCartesian )
     if( bCartesian )
     {
         if (m_nDimensionIndex == 0)
-            m_bDisplayDataTable = true;
+        {
+            m_bDisplayDataTable = m_xDataTableModel.is();
+        }
 
         if( m_nDimensionIndex == 0 && m_nAxisType == AxisType::CATEGORY
                 && m_pExplicitCategoriesProvider && 
m_pExplicitCategoriesProvider->hasComplexCategories() )
diff --git a/chart2/source/view/axes/VAxisProperties.hxx 
b/chart2/source/view/axes/VAxisProperties.hxx
index d66b2f3a919e..6b6b7c361ea2 100644
--- a/chart2/source/view/axes/VAxisProperties.hxx
+++ b/chart2/source/view/axes/VAxisProperties.hxx
@@ -21,6 +21,7 @@
 #include "TickmarkProperties.hxx"
 #include <Axis.hxx>
 #include <LabelAlignment.hxx>
+#include <DataTable.hxx>
 
 #include <com/sun/star/chart/ChartAxisLabelPosition.hpp>
 #include <com/sun/star/chart/ChartAxisMarkPosition.hpp>
@@ -139,10 +140,13 @@ struct AxisProperties final
 
     bool                                m_bLimitSpaceForLabels;
 
+    rtl::Reference<::chart::DataTable> m_xDataTableModel;
+
     //methods:
 
-    AxisProperties( rtl::Reference< ::chart::Axis > xAxisModel
-                  , ExplicitCategoriesProvider* pExplicitCategoriesProvider );
+    AxisProperties(rtl::Reference<::chart::Axis> xAxisModel,
+                   ExplicitCategoriesProvider* pExplicitCategoriesProvider,
+                   rtl::Reference<::chart::DataTable> const& xDataTableModel);
 
     void init(bool bCartesian=false);//init from model data (m_xAxisModel)
 
diff --git a/chart2/source/view/axes/VCartesianCoordinateSystem.cxx 
b/chart2/source/view/axes/VCartesianCoordinateSystem.cxx
index e1a2ba5046e3..cd0d49188a1c 100644
--- a/chart2/source/view/axes/VCartesianCoordinateSystem.cxx
+++ b/chart2/source/view/axes/VCartesianCoordinateSystem.cxx
@@ -23,6 +23,8 @@
 #include <BaseCoordinateSystem.hxx>
 #include <AxisIndexDefines.hxx>
 #include <Axis.hxx>
+#include <DataTable.hxx>
+#include <Diagram.hxx>
 #include <AxisHelper.hxx>
 #include <cppuhelper/implbase.hxx>
 #include <ChartModel.hxx>
@@ -130,7 +132,8 @@ void VCartesianCoordinateSystem::createVAxisList(
             if(!xAxis.is() || !AxisHelper::shouldAxisBeDisplayed( xAxis, 
m_xCooSysModel ))
                 continue;
 
-            AxisProperties 
aAxisProperties(xAxis,getExplicitCategoriesProvider());
+            rtl::Reference<Diagram> 
xDiagram(xChartDoc->getFirstChartDiagram());
+            AxisProperties aAxisProperties(xAxis, 
getExplicitCategoriesProvider(), xDiagram->getDataTableRef());
             aAxisProperties.m_nDimensionIndex = nDimensionIndex;
             aAxisProperties.m_bSwapXAndY = bSwapXAndY;
             aAxisProperties.m_bIsMainAxis = (nAxisIndex==0);
diff --git a/chart2/source/view/axes/VPolarCoordinateSystem.cxx 
b/chart2/source/view/axes/VPolarCoordinateSystem.cxx
index 3a3351a54fc3..338a1c4ab7ed 100644
--- a/chart2/source/view/axes/VPolarCoordinateSystem.cxx
+++ b/chart2/source/view/axes/VPolarCoordinateSystem.cxx
@@ -24,6 +24,8 @@
 #include <AxisIndexDefines.hxx>
 #include <Axis.hxx>
 #include <AxisHelper.hxx>
+#include <Diagram.hxx>
+#include <DataTable.hxx>
 #include <ChartModel.hxx>
 
 namespace chart
@@ -90,7 +92,9 @@ void VPolarCoordinateSystem::createVAxisList(
             rtl::Reference< Axis > xAxis = 
getAxisByDimension(nDimensionIndex,nAxisIndex);
             if(!xAxis.is() || !AxisHelper::shouldAxisBeDisplayed( xAxis, 
m_xCooSysModel ))
                 continue;
-            AxisProperties 
aAxisProperties(xAxis,getExplicitCategoriesProvider());
+
+            rtl::Reference<Diagram> 
xDiagram(xChartDoc->getFirstChartDiagram());
+            AxisProperties 
aAxisProperties(xAxis,getExplicitCategoriesProvider(), 
xDiagram->getDataTableRef());
             aAxisProperties.init();
             if(aAxisProperties.m_bDisplayLabels)
                 aAxisProperties.m_nNumberFormatKey = 
getNumberFormatKeyForAxis(xAxis, xChartDoc);

Reply via email to