summaryrefslogtreecommitdiffstats
path: root/sw/source/core/doc/docchart.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core/doc/docchart.cxx')
-rw-r--r--sw/source/core/doc/docchart.cxx196
1 files changed, 196 insertions, 0 deletions
diff --git a/sw/source/core/doc/docchart.cxx b/sw/source/core/doc/docchart.cxx
new file mode 100644
index 0000000000..e421ac9ad0
--- /dev/null
+++ b/sw/source/core/doc/docchart.cxx
@@ -0,0 +1,196 @@
+/* -*- 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/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <doc.hxx>
+#include <IDocumentChartDataProviderAccess.hxx>
+#include <IDocumentState.hxx>
+#include <IDocumentLayoutAccess.hxx>
+#include <ndindex.hxx>
+#include <swtable.hxx>
+#include <viewsh.hxx>
+#include <ndole.hxx>
+#include <swtblfmt.hxx>
+#include <tblsel.hxx>
+#include <frameformats.hxx>
+#include <unochart.hxx>
+#include <osl/diagnose.h>
+
+void SwTable::UpdateCharts() const
+{
+ GetFrameFormat()->GetDoc()->UpdateCharts( GetFrameFormat()->GetName() );
+}
+
+bool SwTable::IsTableComplexForChart( std::u16string_view aSelection ) const
+{
+ const SwTableBox* pSttBox, *pEndBox;
+ if( 2 < aSelection.size() )
+ {
+ const size_t nSeparator = aSelection.find( u':' );
+ OSL_ENSURE( std::u16string_view::npos != nSeparator, "no valid selection" );
+
+ // Remove brackets at the beginning and from the end
+ const sal_Int32 nOffset = '<' == aSelection[0] ? 1 : 0;
+ const sal_Int32 nLength = '>' == aSelection[ aSelection.size()-1 ]
+ ? aSelection.size()-1 : aSelection.size();
+
+ pSttBox = GetTableBox(OUString(aSelection.substr( nOffset, nSeparator - nOffset )));
+ pEndBox = GetTableBox(OUString(aSelection.substr( nSeparator+1, nLength - (nSeparator+1) )));
+ }
+ else
+ {
+ const SwTableLines* pLns = &GetTabLines();
+ pSttBox = (*pLns)[ 0 ]->GetTabBoxes().front();
+ while( !pSttBox->GetSttNd() )
+ // Until the Content Box!
+ pSttBox = pSttBox->GetTabLines().front()->GetTabBoxes().front();
+
+ const SwTableBoxes* pBoxes = &pLns->back()->GetTabBoxes();
+ pEndBox = pBoxes->back();
+ while( !pEndBox->GetSttNd() )
+ {
+ // Until the Content Box!
+ pLns = &pEndBox->GetTabLines();
+ pBoxes = &pLns->back()->GetTabBoxes();
+ pEndBox = pBoxes->back();
+ }
+ }
+
+ return !pSttBox || !pEndBox || !::ChkChartSel( *pSttBox->GetSttNd(),
+ *pEndBox->GetSttNd() );
+}
+
+void SwDoc::DoUpdateAllCharts()
+{
+ SwViewShell* pVSh = getIDocumentLayoutAccess().GetCurrentViewShell();
+ if( !pVSh )
+ return;
+
+ for(const SwTableFormat* pFormat: *GetTableFrameFormats())
+ {
+ if( SwTable* pTmpTable = SwTable::FindTable( pFormat ) )
+ if( const SwTableNode* pTableNd = pTmpTable->GetTableNode() )
+ if( pTableNd->GetNodes().IsDocNodes() )
+ {
+ UpdateCharts_( *pTmpTable, *pVSh );
+ }
+ }
+}
+
+void SwDoc::UpdateCharts_( const SwTable& rTable, SwViewShell const & rVSh ) const
+{
+ OUString aName( rTable.GetFrameFormat()->GetName() );
+ SwStartNode *pStNd;
+ SwNodeIndex aIdx( *GetNodes().GetEndOfAutotext().StartOfSectionNode(), 1 );
+ while( nullptr != (pStNd = aIdx.GetNode().GetStartNode()) )
+ {
+ ++aIdx;
+ SwOLENode *pONd = aIdx.GetNode().GetOLENode();
+ if( pONd &&
+ aName == pONd->GetChartTableName() &&
+ pONd->getLayoutFrame( rVSh.GetLayout() ) )
+ {
+ // tdf#122995 for OLE/Charts in SW we do not (yet) have a refresh
+ // mechanism or embedding of the primitive representation, so this
+ // needs to be done locally here (simplest solution).
+ bool bImmediateMode(false);
+
+ if(pONd->IsChart())
+ {
+ // refresh to trigger repaint
+ const SwRect aChartRect(pONd->FindLayoutRect());
+ if(!aChartRect.IsEmpty())
+ const_cast<SwViewShell &>(rVSh).InvalidateWindows(aChartRect);
+
+ // forced refresh of the chart's primitive representation
+ pONd->GetOLEObj().resetBufferedData();
+
+ // InvalidateTable using the Immediate-Mode, else the chart will
+ // not yet know that it is invalidated at the next repaint and create
+ // the same graphical representation again
+ bImmediateMode = true;
+ }
+
+ SwChartDataProvider *pPCD = getIDocumentChartDataProviderAccess().GetChartDataProvider();
+ if (pPCD)
+ pPCD->InvalidateTable( &rTable, bImmediateMode );
+ // following this the framework will now take care of repainting
+ // the chart or it's replacement image...
+ }
+ aIdx.Assign( *pStNd->EndOfSectionNode(), + 1 );
+ }
+}
+
+void SwDoc::UpdateCharts( const OUString& rName ) const
+{
+ SwTable* pTmpTable = SwTable::FindTable( FindTableFormatByName( rName ) );
+ if( pTmpTable )
+ {
+ SwViewShell const * pVSh = getIDocumentLayoutAccess().GetCurrentViewShell();
+
+ if( pVSh )
+ UpdateCharts_( *pTmpTable, *pVSh );
+ }
+}
+
+void SwDoc::SetTableName( SwFrameFormat& rTableFormat, const OUString &rNewName )
+{
+ const OUString aOldName( rTableFormat.GetName() );
+
+ bool bNameFound = rNewName.isEmpty();
+ if( !bNameFound )
+ {
+ for(const SwTableFormat* pFormat: *GetTableFrameFormats())
+ {
+ if( !pFormat->IsDefault() &&
+ pFormat->GetName() == rNewName && IsUsed( *pFormat ) )
+ {
+ bNameFound = true;
+ break;
+ }
+ }
+ }
+
+ if( !bNameFound )
+ rTableFormat.SetFormatName( rNewName, true );
+ else
+ rTableFormat.SetFormatName( GetUniqueTableName(), true );
+
+ SwStartNode *pStNd;
+ SwNodeIndex aIdx( *GetNodes().GetEndOfAutotext().StartOfSectionNode(), 1 );
+ while ( nullptr != (pStNd = aIdx.GetNode().GetStartNode()) )
+ {
+ ++aIdx;
+ SwOLENode *pNd = aIdx.GetNode().GetOLENode();
+ if( pNd && aOldName == pNd->GetChartTableName() )
+ {
+ pNd->SetChartTableName( rNewName );
+
+ SwTable* pTable = SwTable::FindTable( &rTableFormat );
+ SwChartDataProvider *pPCD = getIDocumentChartDataProviderAccess().GetChartDataProvider();
+ if (pPCD)
+ pPCD->InvalidateTable( pTable );
+ // following this the framework will now take care of repainting
+ // the chart or it's replacement image...
+ }
+ aIdx.Assign( *pStNd->EndOfSectionNode(), + 1 );
+ }
+ getIDocumentState().SetModified();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */