[Libreoffice-commits] core.git: Branch 'distro/lhm/libreoffice-6-4+backports' - offapi/com offapi/UnoApi_offapi.mk sc/source

Samuel Mehrbrodt (via logerrit) logerrit at kemper.freedesktop.org
Mon Jun 28 08:54:56 UTC 2021


 offapi/UnoApi_offapi.mk                        |    1 
 offapi/com/sun/star/sheet/FilterFieldType.idl  |   40 +++++++++++++
 offapi/com/sun/star/sheet/FilterFieldValue.idl |   24 ++++++++
 sc/source/filter/inc/autofilterbuffer.hxx      |   23 +++++++
 sc/source/filter/oox/autofilterbuffer.cxx      |   74 +++++++++++++++++++++++--
 sc/source/filter/oox/autofiltercontext.cxx     |    5 +
 sc/source/ui/unoobj/datauno.cxx                |   26 ++++++++
 7 files changed, 189 insertions(+), 4 deletions(-)

New commits:
commit 594989639f120ed058cfc2bd5defc161ad67d474
Author:     Samuel Mehrbrodt <samuel.mehrbrodt at allotropia.de>
AuthorDate: Thu May 6 09:12:05 2021 +0200
Commit:     Thorsten Behrens <thorsten.behrens at allotropia.de>
CommitDate: Mon Jun 28 10:54:22 2021 +0200

    tdf#76258 Add OOXML import for color filter
    
    Change-Id: I74cf4f56e0adf1cb8af8e6e932c14b30cce67c71
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/115168
    Tested-by: Jenkins
    Reviewed-by: Samuel Mehrbrodt <samuel.mehrbrodt at allotropia.de>
    (cherry picked from commit 3c8b248b5a7395b174fc265e3237bd79aeb2455f)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/116600
    Reviewed-by: Thorsten Behrens <thorsten.behrens at allotropia.de>
    Tested-by: Thorsten Behrens <thorsten.behrens at allotropia.de>

diff --git a/offapi/UnoApi_offapi.mk b/offapi/UnoApi_offapi.mk
index 12ab8e2057e9..c360c7e5f270 100644
--- a/offapi/UnoApi_offapi.mk
+++ b/offapi/UnoApi_offapi.mk
@@ -3413,6 +3413,7 @@ $(eval $(call gb_UnoApi_add_idlfiles,offapi,com/sun/star/sheet,\
 	FillMode \
 	FilterConnection \
 	FilterFieldValue \
+	FilterFieldType \
 	FilterOperator \
 	FilterOperator2 \
 	FormulaLanguage \
diff --git a/offapi/com/sun/star/sheet/FilterFieldType.idl b/offapi/com/sun/star/sheet/FilterFieldType.idl
new file mode 100644
index 000000000000..0a5113c7a075
--- /dev/null
+++ b/offapi/com/sun/star/sheet/FilterFieldType.idl
@@ -0,0 +1,40 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * 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/.
+ */
+
+#ifndef __com_sun_star_sheet_FilterFieldType_idl__
+#define __com_sun_star_sheet_FilterFieldType_idl__
+
+module com {  module sun {  module star {  module sheet {
+
+/**
+ * @since LibreOffice 7.2
+ */
+constants FilterFieldType
+{
+   /** Filter by numeric value */
+   const short NUMERIC = 0;
+
+   /** Filter by string value */
+   const short STRING = 1;
+
+   /** Filter by date */
+   const short DATE = 2;
+
+   /** Filter by text color */
+   const short TEXT_COLOR = 3;
+
+   /** Filter by background color */
+   const short BACKGROUND_COLOR = 4;
+};
+
+}; }; }; };
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/offapi/com/sun/star/sheet/FilterFieldValue.idl b/offapi/com/sun/star/sheet/FilterFieldValue.idl
index 5d1b40837476..12e9b8ba62e8 100644
--- a/offapi/com/sun/star/sheet/FilterFieldValue.idl
+++ b/offapi/com/sun/star/sheet/FilterFieldValue.idl
@@ -19,6 +19,8 @@ struct FilterFieldValue
 {
     /** selects whether the TableFilterFieldValue::NumericValue
         or the TableFilterFieldValue::StringValue is used.
+
+        @deprecated - Use FilterType instead.
      */
     boolean IsNumeric;
 
@@ -29,6 +31,28 @@ struct FilterFieldValue
     /** specifies a string value for the condition.
      */
     string StringValue;
+
+    /** Which field should be used for filtering:
+
+        <ul>
+            <li>com::sun::star::sheet::FilterFieldType::NUMERIC -> NumericValue</li>
+            <li>com::sun::star::sheet::FilterFieldType::STRING -> StringValue</li>
+            <li>com::sun::star::sheet::FilterFieldType::DATE -> StringValue</li>
+            <li>com::sun::star::sheet::FilterFieldType::TEXT_COLOR -> ColorValue</li>
+            <li>com::sun::star::sheet::FilterFieldType::BACKGROUND_COLOR -> ColorValue</li>
+        </ul>
+
+        @see com::sun::star::sheet::FilterFieldType
+        @since LibreOffice 7.2
+     */
+    short FilterType;
+
+    /** The color which is used for filtering
+
+        @since LibreOffice 7.2
+     */
+    com::sun::star::util::Color ColorValue;
+
 };
 
 }; }; }; };
diff --git a/sc/source/filter/inc/autofilterbuffer.hxx b/sc/source/filter/inc/autofilterbuffer.hxx
index ae8e8b4fa2a0..cf3593de5e63 100644
--- a/sc/source/filter/inc/autofilterbuffer.hxx
+++ b/sc/source/filter/inc/autofilterbuffer.hxx
@@ -24,6 +24,7 @@
 #include <oox/helper/refvector.hxx>
 #include "workbookhelper.hxx"
 #include <com/sun/star/sheet/TableFilterField3.hpp>
+#include <com/sun/star/util/Color.hpp>
 
 namespace com { namespace sun { namespace star {
     namespace sheet { class XDatabaseRange; }
@@ -49,6 +50,7 @@ struct ApiFilterSettings
     void appendField( bool bAnd, sal_Int32 nOperator, double fValue );
     void appendField( bool bAnd, sal_Int32 nOperator, const OUString& rValue );
     void appendField( bool bAnd, const std::vector<OUString>& rValues );
+    void appendField( bool bAnd, css::util::Color aColor, bool bIsBackgroundColor );
 };
 
 /** Base class for specific filter settings for a column in a filtered range.
@@ -111,6 +113,27 @@ private:
     bool                mbPercent;      /// True = percentage, false = number of items.
 };
 
+/** Settings for a color filter. */
+class ColorFilter : public FilterSettingsBase
+{
+public:
+    explicit ColorFilter(const WorkbookHelper& rHelper);
+
+    /** Imports filter settings from the filters and filter elements. */
+    virtual void importAttribs(sal_Int32 nElement, const AttributeList& rAttribs) override;
+    /** Imports filter settings from the FILTERS and FILTER records. */
+    virtual void importRecord(sal_Int32 nRecId, SequenceInputStream& rStrm) override;
+
+    /** Returns converted UNO API filter settings representing all filter settings. */
+    virtual ApiFilterSettings finalizeImport(sal_Int32 nMaxCount) override;
+
+private:
+    /// Whether we are dealing with the background color (vs. text color)
+    bool mbIsBackgroundColor;
+    /// Style name to retrieve the color from
+    OUString msStyleName;
+};
+
 /** A filter criterion for a custom filter. */
 struct FilterCriterionModel
 {
diff --git a/sc/source/filter/oox/autofilterbuffer.cxx b/sc/source/filter/oox/autofilterbuffer.cxx
index 8209df526283..f433456fb369 100644
--- a/sc/source/filter/oox/autofilterbuffer.cxx
+++ b/sc/source/filter/oox/autofilterbuffer.cxx
@@ -20,6 +20,7 @@
 #include <autofilterbuffer.hxx>
 
 #include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/sheet/FilterFieldType.hpp>
 #include <com/sun/star/sheet/FilterConnection.hpp>
 #include <com/sun/star/sheet/FilterOperator2.hpp>
 #include <com/sun/star/sheet/TableFilterField3.hpp>
@@ -27,6 +28,8 @@
 #include <com/sun/star/sheet/XSheetFilterDescriptor3.hpp>
 #include <com/sun/star/table/TableOrientation.hpp>
 #include <com/sun/star/table/CellAddress.hpp>
+#include <editeng/colritem.hxx>
+#include <editeng/brushitem.hxx>
 #include <rtl/ustrbuf.hxx>
 #include <osl/diagnose.h>
 #include <oox/helper/attributelist.hxx>
@@ -41,12 +44,17 @@
 #include <biffhelper.hxx>
 #include <document.hxx>
 #include <dbdata.hxx>
+#include <scitems.hxx>
 #include <sortparam.hxx>
+#include <stlpool.hxx>
+#include <stlsheet.hxx>
+#include <stylesbuffer.hxx>
 #include <userlist.hxx>
 
 namespace oox {
 namespace xls {
 
+using namespace css;
 using namespace ::com::sun::star::sheet;
 using namespace ::com::sun::star::table;
 using namespace ::com::sun::star::uno;
@@ -161,7 +169,7 @@ void ApiFilterSettings::appendField( bool bAnd, sal_Int32 nOperator, double fVal
     rFilterField.Connection = bAnd ? FilterConnection_AND : FilterConnection_OR;
     rFilterField.Operator = nOperator;
     rFilterField.Values.realloc(1);
-    rFilterField.Values[0].IsNumeric = true;
+    rFilterField.Values[0].FilterType = FilterFieldType::NUMERIC;
     rFilterField.Values[0].NumericValue = fValue;
 }
 
@@ -172,7 +180,7 @@ void ApiFilterSettings::appendField( bool bAnd, sal_Int32 nOperator, const OUStr
     rFilterField.Connection = bAnd ? FilterConnection_AND : FilterConnection_OR;
     rFilterField.Operator = nOperator;
     rFilterField.Values.realloc(1);
-    rFilterField.Values[0].IsNumeric = false;
+    rFilterField.Values[0].FilterType = FilterFieldType::STRING;
     rFilterField.Values[0].StringValue = rValue;
 }
 
@@ -186,11 +194,23 @@ void ApiFilterSettings::appendField( bool bAnd, const std::vector<OUString>& rVa
     rFilterField.Values.realloc(n);
     for (size_t i = 0; i < n; ++i)
     {
-        rFilterField.Values[i].IsNumeric = false;
+        rFilterField.Values[i].FilterType = FilterFieldType::STRING;
         rFilterField.Values[i].StringValue = rValues[i];
     }
 }
 
+void ApiFilterSettings::appendField(bool bAnd, util::Color aColor, bool bIsBackgroundColor)
+{
+    maFilterFields.emplace_back();
+    TableFilterField3& rFilterField = maFilterFields.back();
+    rFilterField.Connection = bAnd ? FilterConnection_AND : FilterConnection_OR;
+    rFilterField.Operator = FilterOperator2::EQUAL;
+    rFilterField.Values.realloc(1);
+    rFilterField.Values[0].FilterType
+        = bIsBackgroundColor ? FilterFieldType::BACKGROUND_COLOR : FilterFieldType::TEXT_COLOR;
+    rFilterField.Values[0].ColorValue = aColor;
+}
+
 FilterSettingsBase::FilterSettingsBase( const WorkbookHelper& rHelper ) :
     WorkbookHelper( rHelper )
 {
@@ -325,6 +345,54 @@ ApiFilterSettings Top10Filter::finalizeImport( sal_Int32 /*nMaxCount*/ )
     return aSettings;
 }
 
+ColorFilter::ColorFilter(const WorkbookHelper& rHelper)
+    : FilterSettingsBase(rHelper)
+{
+}
+
+void ColorFilter::importAttribs(sal_Int32 nElement, const AttributeList& rAttribs)
+{
+    if (nElement == XLS_TOKEN(colorFilter))
+    {
+        // When cellColor attribute not found, it means cellColor = true
+        // cellColor = 0 (false) -> TextColor
+        // cellColor = 1 (true)  -> BackgroundColor
+        mbIsBackgroundColor = rAttribs.getBool(XML_cellColor, true);
+        msStyleName = getStyles().createDxfStyle( rAttribs.getInteger(XML_dxfId, -1) );
+    }
+}
+
+void ColorFilter::importRecord(sal_Int32 /* nRecId */, SequenceInputStream& /* rStrm */)
+{
+    // TODO
+}
+
+ApiFilterSettings ColorFilter::finalizeImport(sal_Int32 /*nMaxCount*/)
+{
+    ApiFilterSettings aSettings;
+    ScDocument& rDoc = getScDocument();
+    ScStyleSheet* pStyleSheet = static_cast<ScStyleSheet*>(
+        rDoc.GetStyleSheetPool()->Find(msStyleName, SfxStyleFamily::Para));
+    if (!pStyleSheet)
+        return aSettings;
+
+    const SfxItemSet& rItemSet = pStyleSheet->GetItemSet();
+    ::Color aColor;
+    if (mbIsBackgroundColor)
+    {
+        const SvxBrushItem* pItem = rItemSet.GetItem<SvxBrushItem>(ATTR_BACKGROUND);
+        aColor = pItem->GetColor();
+    }
+    else
+    {
+        const SvxColorItem* pItem = rItemSet.GetItem<SvxColorItem>(ATTR_FONT_COLOR);
+        aColor = pItem->GetValue();
+    }
+    util::Color nColor(aColor);
+    aSettings.appendField(true, nColor, mbIsBackgroundColor);
+    return aSettings;
+}
+
 FilterCriterionModel::FilterCriterionModel() :
     mnOperator( XML_equal ),
     mnDataType( BIFF_FILTER_DATATYPE_NONE )
diff --git a/sc/source/filter/oox/autofiltercontext.cxx b/sc/source/filter/oox/autofiltercontext.cxx
index 814569e0b45f..550e0f69e5fe 100644
--- a/sc/source/filter/oox/autofiltercontext.cxx
+++ b/sc/source/filter/oox/autofiltercontext.cxx
@@ -44,6 +44,9 @@ ContextHandlerRef FilterSettingsContext::onCreateContext( sal_Int32 nElement, co
         case XLS_TOKEN( customFilters ):
             if( nElement == XLS_TOKEN( customFilter ) ) return this;
         break;
+        case XLS_TOKEN( colorFilter ):
+            if( nElement == XLS_TOKEN( colorFilter ) ) return this;
+        break;
     }
     return nullptr;
 }
@@ -88,6 +91,8 @@ ContextHandlerRef FilterColumnContext::onCreateContext( sal_Int32 nElement, cons
             return new FilterSettingsContext( *this, mrFilterColumn.createFilterSettings< Top10Filter >() );
         case XLS_TOKEN( customFilters ):
             return new FilterSettingsContext( *this, mrFilterColumn.createFilterSettings< CustomFilter >() );
+        case XLS_TOKEN( colorFilter ):
+            return new FilterSettingsContext( *this, mrFilterColumn.createFilterSettings< ColorFilter >() );
     }
     return nullptr;
 }
diff --git a/sc/source/ui/unoobj/datauno.cxx b/sc/source/ui/unoobj/datauno.cxx
index 596da506ad14..03d84526d102 100644
--- a/sc/source/ui/unoobj/datauno.cxx
+++ b/sc/source/ui/unoobj/datauno.cxx
@@ -34,6 +34,7 @@
 #include <com/sun/star/table/TableOrientation.hpp>
 #include <com/sun/star/table/CellRangeAddress.hpp>
 #include <com/sun/star/sheet/DataImportMode.hpp>
+#include <com/sun/star/sheet/FilterFieldType.hpp>
 #include <com/sun/star/sheet/FilterOperator2.hpp>
 #include <com/sun/star/sheet/TableFilterField2.hpp>
 
@@ -63,6 +64,7 @@
 #include <memory>
 
 using namespace com::sun::star;
+using namespace css::sheet;
 
 //  everything without Which-ID, map only for PropertySetInfo
 
@@ -1122,7 +1124,24 @@ void fillQueryParam(
             for (const auto& rVal : rVals)
             {
                 ScQueryEntry::Item aItem;
-                aItem.meType   = rVal.IsNumeric ? ScQueryEntry::ByValue : ScQueryEntry::ByString;
+                switch (rVal.FilterType)
+                {
+                    case FilterFieldType::NUMERIC:
+                        aItem.meType = ScQueryEntry::ByValue;
+                        break;
+                    case FilterFieldType::STRING:
+                        aItem.meType = ScQueryEntry::ByString;
+                        break;
+                    case FilterFieldType::DATE:
+                        aItem.meType = ScQueryEntry::ByDate;
+                        break;
+                    case FilterFieldType::TEXT_COLOR:
+                        aItem.meType = ScQueryEntry::ByTextColor;
+                        break;
+                    case FilterFieldType::BACKGROUND_COLOR:
+                        aItem.meType = ScQueryEntry::ByBackgroundColor;
+                        break;
+                }
                 aItem.mfVal    = rVal.NumericValue;
                 aItem.maString = rPool.intern(rVal.StringValue);
 
@@ -1132,6 +1151,11 @@ void fillQueryParam(
                     pDoc->GetFormatTable()->GetInputLineString(aItem.mfVal, 0, aStr);
                     aItem.maString = rPool.intern(aStr);
                 }
+                else if (aItem.meType == ScQueryEntry::ByTextColor
+                         || aItem.meType == ScQueryEntry::ByBackgroundColor)
+                {
+                    aItem.maColor = Color(rVal.ColorValue);
+                }
 
                 rItems.push_back(aItem);
             }


More information about the Libreoffice-commits mailing list