editeng/source/editeng/editview.cxx | 1 sc/inc/docuno.hxx | 3 ++ sc/inc/viewopti.hxx | 10 ++++++++ sc/qa/unit/tiledrendering/tiledrendering.cxx | 31 +++++++++++++++++++++++++++ sc/source/core/data/patattr.cxx | 29 ++++++++++++++++++++----- sc/source/core/tool/viewopti.cxx | 4 +++ sc/source/ui/app/scmod.cxx | 27 +++++++++++++++++++++++ sc/source/ui/unoobj/docuno.cxx | 17 ++++++++++++++ sc/source/ui/view/gridwin4.cxx | 17 +++++++++++++- 9 files changed, 132 insertions(+), 7 deletions(-)
New commits: commit 53d5cc538d9c274cc4d7dfe38229f0f54706b403 Author: Paris Oplopoios <paris.oplopo...@collabora.com> AuthorDate: Tue May 23 03:50:30 2023 +0300 Commit: Paris Oplopoios <parisop...@gmail.com> CommitDate: Fri Jun 2 18:22:34 2023 +0200 Add Calc view separation for tiled rendering Calc now uses different colors based on the current view theme to paint tiles when using tiled rendering Change-Id: I1ca84371141ff026ad49ec362518ca13c59c7c6e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/152137 Tested-by: Paris Oplopoios <parisop...@gmail.com> Reviewed-by: Tomaž Vajngerl <qui...@gmail.com> (cherry picked from commit f4eb56b8b9ff3492e0a02fb76eb4ea7b851f4774) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/152440 Tested-by: Jenkins Reviewed-by: Paris Oplopoios <parisop...@gmail.com> diff --git a/editeng/source/editeng/editview.cxx b/editeng/source/editeng/editview.cxx index cc03a135cdcd..f6c90309747c 100644 --- a/editeng/source/editeng/editview.cxx +++ b/editeng/source/editeng/editview.cxx @@ -719,6 +719,7 @@ void EditView::MoveParagraphs( tools::Long nDiff ) void EditView::SetBackgroundColor( const Color& rColor ) { pImpEditView->SetBackgroundColor( rColor ); + pImpEditView->pEditEngine->SetBackgroundColor( rColor ); } Color const & EditView::GetBackgroundColor() const diff --git a/sc/inc/docuno.hxx b/sc/inc/docuno.hxx index 837f93ec3558..23de1dad63ce 100644 --- a/sc/inc/docuno.hxx +++ b/sc/inc/docuno.hxx @@ -394,6 +394,9 @@ public: /// @see vcl::ITiledRenderable::completeFunction(). virtual void completeFunction(const OUString& rFunctionName) override; + + /// @see vcl::ITiledRenderable::getViewRenderState(). + OString getViewRenderState() override; }; class ScDrawPagesObj final : public cppu::WeakImplHelper< diff --git a/sc/inc/viewopti.hxx b/sc/inc/viewopti.hxx index 52b23c86b978..489a3e8c81da 100644 --- a/sc/inc/viewopti.hxx +++ b/sc/inc/viewopti.hxx @@ -95,6 +95,12 @@ public: void SetGridOptions( const ScGridOptions& rNew ) { aGridOpt = rNew; } std::unique_ptr<SvxGridItem> CreateGridItem() const; + const OUString& GetColorSchemeName() const { return sColorSchemeName; } + void SetColorSchemeName( const OUString& rName ) { sColorSchemeName = rName; } + + const Color& GetDocColor() const { return aDocCol; } + void SetDocColor(const Color& rDocColor) { aDocCol = rDocColor; } + ScViewOptions& operator= ( const ScViewOptions& rCpy ); bool operator== ( const ScViewOptions& rOpt ) const; bool operator!= ( const ScViewOptions& rOpt ) const { return !(operator==(rOpt)); } @@ -105,6 +111,10 @@ private: Color aGridCol; OUString aGridColName; ScGridOptions aGridOpt; + // The name of the color scheme + OUString sColorSchemeName = "Default"; + // The background color of the document + Color aDocCol; }; // Item for the options dialog - View diff --git a/sc/qa/unit/tiledrendering/tiledrendering.cxx b/sc/qa/unit/tiledrendering/tiledrendering.cxx index 5968cfc8fdd6..6eb2aa134e69 100644 --- a/sc/qa/unit/tiledrendering/tiledrendering.cxx +++ b/sc/qa/unit/tiledrendering/tiledrendering.cxx @@ -3056,6 +3056,37 @@ CPPUNIT_TEST_FIXTURE(ScTiledRenderingTest, testUndoReorderingMulti) CPPUNIT_ASSERT_EQUAL(OUString("DD"), pDoc->GetString(ScAddress(0, 3, 0))); } +CPPUNIT_TEST_FIXTURE(ScTiledRenderingTest, testGetViewRenderState) +{ + // Add an empty dark scheme to avoid a warning + svtools::EditableColorConfig aColorConfig; + aColorConfig.AddScheme(u"Dark"); + + ScModelObj* pModelObj = createDoc("empty.ods"); + int nFirstViewId = SfxLokHelper::getView(); + ViewCallback aView1; + + CPPUNIT_ASSERT_EQUAL(OString(";Default"), pModelObj->getViewRenderState()); + // Create a second view + SfxLokHelper::createView(); + ViewCallback aView2; + CPPUNIT_ASSERT_EQUAL(OString(";Default"), pModelObj->getViewRenderState()); + // Set second view to dark scheme + { + uno::Sequence<beans::PropertyValue> aPropertyValues = comphelper::InitPropertySequence( + { + { "NewTheme", uno::Any(OUString("Dark")) }, + } + ); + dispatchCommand(mxComponent, ".uno:ChangeTheme", aPropertyValues); + } + CPPUNIT_ASSERT_EQUAL(OString(";Dark"), pModelObj->getViewRenderState()); + + // Switch back to first view and make sure it's the same + SfxLokHelper::setView(nFirstViewId); + CPPUNIT_ASSERT_EQUAL(OString(";Default"), pModelObj->getViewRenderState()); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/core/data/patattr.cxx b/sc/source/core/data/patattr.cxx index 4368057d9889..532831f90a78 100644 --- a/sc/source/core/data/patattr.cxx +++ b/sc/source/core/data/patattr.cxx @@ -65,6 +65,8 @@ #include <scmod.hxx> #include <fillinfo.hxx> #include <boost/functional/hash.hpp> +#include <comphelper/lok.hxx> +#include <tabvwsh.hxx> ScPatternAttr::ScPatternAttr( SfxItemSet&& pItemSet, const OUString& rStyleName ) : SfxSetItem ( ATTR_PATTERN, std::move(pItemSet) ), @@ -436,15 +438,30 @@ void ScPatternAttr::GetFont( if ( aBackColor == COL_TRANSPARENT || eAutoMode == SC_AUTOCOL_IGNOREBACK || eAutoMode == SC_AUTOCOL_IGNOREALL ) { - if ( eAutoMode == SC_AUTOCOL_PRINT ) - aBackColor = COL_WHITE; - else if ( pBackConfigColor ) + if (!comphelper::LibreOfficeKit::isActive()) { - // pBackConfigColor can be used to avoid repeated lookup of the configured color - aBackColor = *pBackConfigColor; + if ( eAutoMode == SC_AUTOCOL_PRINT ) + aBackColor = COL_WHITE; + else if ( pBackConfigColor ) + { + // pBackConfigColor can be used to avoid repeated lookup of the configured color + aBackColor = *pBackConfigColor; + } + else + aBackColor = SC_MOD()->GetColorConfig().GetColorValue(svtools::DOCCOLOR).nColor; } else - aBackColor = SC_MOD()->GetColorConfig().GetColorValue(svtools::DOCCOLOR).nColor; + { + // Get document color from current view instead + SfxViewShell* pSfxViewShell = SfxViewShell::Current(); + ScTabViewShell* pViewShell = dynamic_cast<ScTabViewShell*>(pSfxViewShell); + if (pViewShell) + { + const ScViewData& pViewData = pViewShell->GetViewData(); + const ScViewOptions& aViewOptions = pViewData.GetOptions(); + aBackColor = aViewOptions.GetDocColor(); + } + } } // get system text color for comparison diff --git a/sc/source/core/tool/viewopti.cxx b/sc/source/core/tool/viewopti.cxx index ad09d7ea70f4..80d8915effb9 100644 --- a/sc/source/core/tool/viewopti.cxx +++ b/sc/source/core/tool/viewopti.cxx @@ -27,6 +27,7 @@ #include <global.hxx> #include <viewopti.hxx> #include <sc.hrc> +#include <scmod.hxx> #include <miscuno.hxx> using namespace utl; @@ -114,6 +115,8 @@ void ScViewOptions::SetDefaults() aGridCol = svtools::ColorConfig().GetColorValue( svtools::CALCGRID ).nColor; + aDocCol = SC_MOD()->GetColorConfig().GetColorValue(svtools::DOCCOLOR).nColor; + aGridOpt.SetDefaults(); } @@ -138,6 +141,7 @@ bool ScViewOptions::operator==( const ScViewOptions& rOpt ) const bEqual = bEqual && (aGridCol == rOpt.aGridCol); bEqual = bEqual && (aGridColName == rOpt.aGridColName); bEqual = bEqual && (aGridOpt == rOpt.aGridOpt); + bEqual = bEqual && (aDocCol == rOpt.aDocCol); return bEqual; } diff --git a/sc/source/ui/app/scmod.cxx b/sc/source/ui/app/scmod.cxx index c4055320d88f..544d8b80b8ed 100644 --- a/sc/source/ui/app/scmod.cxx +++ b/sc/source/ui/app/scmod.cxx @@ -94,6 +94,8 @@ #include <scabstdlg.hxx> #include <formula/errorcodes.hxx> #include <documentlinkmgr.hxx> +#include <LibreOfficeKit/LibreOfficeKitEnums.h> +#include <sfx2/lokhelper.hxx> #define SC_IDLE_MIN 150 #define SC_IDLE_MAX 3000 @@ -151,6 +153,9 @@ ScModule::ScModule( SfxObjectFactory* pFact ) : ScGlobal::InitTextHeight( m_pMessagePool.get() ); StartListening( *SfxGetpApp() ); // for SfxHintId::Deinitializing + + // Initialize the color config + GetColorConfig(); } ScModule::~ScModule() @@ -203,6 +208,28 @@ void ScModule::ConfigurationChanged( utl::ConfigurationBroadcaster* p, Configura } } + if (comphelper::LibreOfficeKit::isActive() && m_pColorConfig) + { + SfxViewShell* pSfxViewShell = SfxViewShell::Current(); + ScTabViewShell* pViewShell = dynamic_cast<ScTabViewShell*>(pSfxViewShell); + + if (pViewShell) + { + ScViewData& pViewData = pViewShell->GetViewData(); + ScViewOptions aViewOptions = pViewData.GetOptions(); + Color aFillColor(m_pColorConfig->GetColorValue(svtools::DOCCOLOR).nColor); + aViewOptions.SetDocColor(aFillColor); + aViewOptions.SetColorSchemeName(m_pColorConfig->GetCurrentSchemeName()); + pViewData.SetOptions(aViewOptions); + ScModelObj* pScModelObj = comphelper::getFromUnoTunnel<ScModelObj>(SfxObjectShell::Current()->GetModel()); + SfxLokHelper::notifyViewRenderState(SfxViewShell::Current(), pScModelObj); + // In Online, the document color is the one used for the background, contrary to + // Writer and Draw that use the application background color. + pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_APPLICATION_BACKGROUND_COLOR, + aFillColor.AsRGBHexString().toUtf8()); + } + } + // force all views to repaint, using the new options SfxViewShell* pViewShell = SfxViewShell::GetFirst(); while(pViewShell) diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx index 563c84399256..3473c0818a2c 100644 --- a/sc/source/ui/unoobj/docuno.cxx +++ b/sc/source/ui/unoobj/docuno.cxx @@ -1239,6 +1239,23 @@ void ScModelObj::completeFunction(const OUString& rFunctionName) } } +OString ScModelObj::getViewRenderState() +{ + OStringBuffer aState; + ScViewData* pViewData = ScDocShell::GetViewData(); + + if (pViewData) + { + aState.append(';'); + + const ScViewOptions& aViewOptions = pViewData->GetOptions(); + OString aThemeName = OUStringToOString(aViewOptions.GetColorSchemeName(), RTL_TEXTENCODING_UTF8); + aState.append(aThemeName); + } + + return aState.makeStringAndClear(); +} + void ScModelObj::initializeForTiledRendering(const css::uno::Sequence<css::beans::PropertyValue>& rArguments) { SolarMutexGuard aGuard; diff --git a/sc/source/ui/view/gridwin4.cxx b/sc/source/ui/view/gridwin4.cxx index 16d37447072d..80217c811847 100644 --- a/sc/source/ui/view/gridwin4.cxx +++ b/sc/source/ui/view/gridwin4.cxx @@ -25,6 +25,7 @@ #include <editeng/colritem.hxx> #include <editeng/editview.hxx> #include <editeng/fhgtitem.hxx> +#include <editeng/brushitem.hxx> #include <sfx2/bindings.hxx> #include <sfx2/printer.hxx> #include <vcl/cursor.hxx> @@ -1122,7 +1123,21 @@ void ScGridWindow::DrawContent(OutputDevice &rDevice, const ScTableInfo& rTableI tools::Long nScreenY = aOutputData.nScrY; rDevice.SetLineColor(); - rDevice.SetFillColor(pOtherEditView->GetBackgroundColor()); + SfxViewShell* pSfxViewShell = SfxViewShell::Current(); + ScTabViewShell* pCurrentViewShell = dynamic_cast<ScTabViewShell*>(pSfxViewShell); + if (pCurrentViewShell) + { + const ScViewData& pViewData = pCurrentViewShell->GetViewData(); + const ScViewOptions& aViewOptions = pViewData.GetOptions(); + const ScPatternAttr* pPattern = rDoc.GetPattern( nCol1, nRow1, nTab ); + Color aCellColor = pPattern->GetItem(ATTR_BACKGROUND).GetColor(); + if (aCellColor.IsTransparent()) + { + aCellColor = aViewOptions.GetDocColor(); + } + rDevice.SetFillColor(aCellColor); + pOtherEditView->SetBackgroundColor(aCellColor); + } Point aStart = mrViewData.GetScrPos( nCol1, nRow1, eOtherWhich ); Point aEnd = mrViewData.GetScrPos( nCol2+1, nRow2+1, eOtherWhich );