[Libreoffice-commits] core.git: sc/source

Tünde Tóth (via logerrit) logerrit at kemper.freedesktop.org
Thu Mar 11 11:15:21 UTC 2021


 sc/source/ui/inc/hdrcont.hxx  |    2 
 sc/source/ui/view/hdrcont.cxx |  103 +++++++++++++++++++++++++++++++++++++++---
 2 files changed, 98 insertions(+), 7 deletions(-)

New commits:
commit 9bba5f418d4900ba20503dd1d310b3ff68bb14df
Author:     Tünde Tóth <toth.tunde at nisz.hu>
AuthorDate: Thu Jan 28 12:50:53 2021 +0100
Commit:     László Németh <nemeth at numbertext.org>
CommitDate: Thu Mar 11 12:14:39 2021 +0100

    tdf#89841 sc UI: show blue row numbers for filtered rows
    
    improving appearance of Autofilter for interoperability.
    
    Change-Id: I4bbfacd732e8a7d5bb592ae6bb9313be2a8d03d7
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/110130
    Tested-by: László Németh <nemeth at numbertext.org>
    Reviewed-by: László Németh <nemeth at numbertext.org>

diff --git a/sc/source/ui/inc/hdrcont.hxx b/sc/source/ui/inc/hdrcont.hxx
index 777d2e9746df..e30f6e0a3ea5 100644
--- a/sc/source/ui/inc/hdrcont.hxx
+++ b/sc/source/ui/inc/hdrcont.hxx
@@ -39,7 +39,9 @@ private:
     Timer               aShowHelpTimer;
     vcl::Font           aNormFont;
     vcl::Font           aBoldFont;
+    vcl::Font           aAutoFilterFont;
     bool                bBoldSet;
+    bool                bAutoFilterSet;
 
     bool            bVertical;              // Vertical = Row header
 
diff --git a/sc/source/ui/view/hdrcont.cxx b/sc/source/ui/view/hdrcont.cxx
index 78214cb9be68..a4f715ffc81e 100644
--- a/sc/source/ui/view/hdrcont.cxx
+++ b/sc/source/ui/view/hdrcont.cxx
@@ -25,6 +25,7 @@
 
 #include <tabvwsh.hxx>
 #include <hdrcont.hxx>
+#include <dbdata.hxx>
 #include <scmod.hxx>
 #include <inputopt.hxx>
 #include <gridmerg.hxx>
@@ -32,6 +33,7 @@
 #include <markdata.hxx>
 #include <tabview.hxx>
 #include <viewdata.hxx>
+#include <columnspanset.hxx>
 
 #define SC_DRAG_MIN     2
 
@@ -75,9 +77,11 @@ ScHeaderControl::ScHeaderControl( vcl::Window* pParent, SelectionEngine* pSelect
     aNormFont.SetTransparent( true );       //! hard-set WEIGHT_NORMAL ???
     aBoldFont = aNormFont;
     aBoldFont.SetWeight( WEIGHT_BOLD );
+    aAutoFilterFont = aNormFont;
 
     SetFont(aBoldFont);
     bBoldSet = true;
+    bAutoFilterSet = false;
 
     Size aSize = LogicToPixel( Size(
         GetTextWidth("8888"),
@@ -223,12 +227,18 @@ void ScHeaderControl::Paint( vcl::RenderContext& /*rRenderContext*/, const tools
 
     Color aTextColor = rStyleSettings.GetButtonTextColor();
     Color aSelTextColor = rStyleSettings.GetHighlightTextColor();
+    Color aAFilterTextColor = COL_LIGHTBLUE;    // color of filtered row numbers
     aNormFont.SetColor( aTextColor );
+    aAutoFilterFont.SetColor(aAFilterTextColor);
     if ( bHighContrast )
         aBoldFont.SetColor( aTextColor );
     else
         aBoldFont.SetColor( aSelTextColor );
-    SetTextColor( ( bBoldSet && !bHighContrast ) ? aSelTextColor : aTextColor );
+
+    if (bAutoFilterSet)
+        SetTextColor(aAFilterTextColor);
+    else
+        SetTextColor((bBoldSet && !bHighContrast) ? aSelTextColor : aTextColor);
 
     Color aSelLineColor = rStyleSettings.GetHighlightColor();
     aSelLineColor.Merge( COL_BLACK, 0xe0 );        // darken just a little bit
@@ -381,6 +391,57 @@ void ScHeaderControl::Paint( vcl::RenderContext& /*rRenderContext*/, const tools
         }
     }
 
+    // tdf#89841 Use blue row numbers when Autofilter selected
+    std::vector<sc::ColRowSpan> aSpans;
+    if (bVertical)
+    {
+        SCTAB nTab = pTabView->GetViewData().GetTabNo();
+        ScDocument& rDoc = pTabView->GetViewData().GetDocument();
+
+        ScDBData* pDBData = rDoc.GetAnonymousDBData(nTab);
+        if (pDBData && pDBData->HasAutoFilter())
+        {
+            SCSIZE nSelected = 0;
+            SCSIZE nTotal = 0;
+            pDBData->GetFilterSelCount(nSelected, nTotal);
+            if (nTotal > nSelected)
+            {
+                ScRange aRange;
+                pDBData->GetArea(aRange);
+                SCCOLROW nStartRow = static_cast<SCCOLROW>(aRange.aStart.Row());
+                SCCOLROW nEndRow = static_cast<SCCOLROW>(aRange.aEnd.Row());
+                if (pDBData->HasHeader())
+                    nStartRow++;
+                aSpans.push_back(sc::ColRowSpan(nStartRow, nEndRow));
+            }
+        }
+
+        ScDBCollection* pDocColl = rDoc.GetDBCollection();
+        if (!pDocColl->empty())
+        {
+            ScDBCollection::NamedDBs& rDBs = pDocColl->getNamedDBs();
+            for (const auto& rxDB : rDBs)
+            {
+                if (rxDB->GetTab() == nTab && rxDB->HasAutoFilter())
+                {
+                    SCSIZE nSelected = 0;
+                    SCSIZE nTotal = 0;
+                    rxDB->GetFilterSelCount(nSelected, nTotal);
+                    if (nTotal > nSelected)
+                    {
+                        ScRange aRange;
+                        rxDB->GetArea(aRange);
+                        SCCOLROW nStartRow = static_cast<SCCOLROW>(aRange.aStart.Row());
+                        SCCOLROW nEndRow = static_cast<SCCOLROW>(aRange.aEnd.Row());
+                        if (rxDB->HasHeader())
+                            nStartRow++;
+                        aSpans.push_back(sc::ColRowSpan(nStartRow, nEndRow));
+                    }
+                }
+            }
+        }
+    }
+
     //  loop through entries several times to avoid changing the line color too often
     //  and to allow merging of lines
 
@@ -488,14 +549,42 @@ void ScHeaderControl::Paint( vcl::RenderContext& /*rRenderContext*/, const tools
                         case SC_HDRPAINT_TEXT:
                             if ( nSizePix > 1 )     // minimal check for small columns/rows
                             {
-                                if ( bMark != bBoldSet )
+                                if (bVertical)
                                 {
-                                    if (bMark)
-                                        SetFont(aBoldFont);
-                                    else
-                                        SetFont(aNormFont);
-                                    bBoldSet = bMark;
+                                    bool bAutoFilterPos = false;
+                                    for (const auto& rSpan : aSpans)
+                                    {
+                                        if (nEntryNo >= rSpan.mnStart && nEntryNo <= rSpan.mnEnd)
+                                        {
+                                            bAutoFilterPos = true;
+                                            break;
+                                        }
+                                    }
+
+                                    if (bMark != bBoldSet || bAutoFilterPos != bAutoFilterSet)
+                                    {
+                                        if (bMark)
+                                            SetFont(aBoldFont);
+                                        else if (bAutoFilterPos)
+                                            SetFont(aAutoFilterFont);
+                                        else
+                                            SetFont(aNormFont);
+                                        bBoldSet = bMark;
+                                        bAutoFilterSet = bAutoFilterPos && !bMark;
+                                    }
+                                }
+                                else
+                                {
+                                    if (bMark != bBoldSet)
+                                    {
+                                        if (bMark)
+                                            SetFont(aBoldFont);
+                                        else
+                                            SetFont(aNormFont);
+                                        bBoldSet = bMark;
+                                    }
                                 }
+
                                 aString = GetEntryText( nEntryNo );
                                 aTextSize.setWidth( GetTextWidth( aString ) );
                                 aTextSize.setHeight( GetTextHeight() );


More information about the Libreoffice-commits mailing list