summaryrefslogtreecommitdiffstats
path: root/sc/inc/fillinfo.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/inc/fillinfo.hxx')
-rw-r--r--sc/inc/fillinfo.hxx291
1 files changed, 291 insertions, 0 deletions
diff --git a/sc/inc/fillinfo.hxx b/sc/inc/fillinfo.hxx
new file mode 100644
index 0000000000..81086ed358
--- /dev/null
+++ b/sc/inc/fillinfo.hxx
@@ -0,0 +1,291 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sal/config.h>
+
+#include <memory>
+
+#include <svx/framelinkarray.hxx>
+#include "colorscale.hxx"
+#include "cellvalue.hxx"
+#include <o3tl/typed_flags_set.hxx>
+#include <optional>
+
+class SfxItemSet;
+class SvxBrushItem;
+class SvxBoxItem;
+class SvxLineItem;
+class SvxShadowItem;
+
+class ScPatternAttr;
+
+enum class ScRotateDir : sal_uInt8 {
+ NONE, Standard, Left, Right, Center
+};
+
+enum class ScClipMark : sal_uInt8 {
+ NONE = 0x00, Left = 0x01, Right = 0x02, Bottom = 0x03, Top = 0x04
+};
+namespace o3tl {
+ template<> struct typed_flags<ScClipMark> : is_typed_flags<ScClipMark, 0x07> {};
+}
+
+const sal_uInt8 SC_CLIPMARK_SIZE = 64;
+
+enum ScShadowPart
+{
+ SC_SHADOW_HSTART,
+ SC_SHADOW_VSTART,
+ SC_SHADOW_HORIZ,
+ SC_SHADOW_VERT,
+ SC_SHADOW_CORNER
+};
+
+struct ScDataBarInfo
+{
+ double mnZero; // 0 to 100
+ Color maColor;
+ double mnLength; // -100 to 100
+ bool mbGradient;
+ bool mbShowValue;
+ Color maAxisColor;
+
+ bool operator==(const ScDataBarInfo& r) const
+ {
+ if( mnZero != r.mnZero )
+ return false;
+ if( maColor != r.maColor )
+ return false;
+ if(mnLength != r.mnLength)
+ return false;
+ if (mbGradient != r.mbGradient)
+ return false;
+
+ return true;
+ }
+
+ bool operator!=(const ScDataBarInfo& r) const
+ {
+ return !(*this == r);
+ }
+};
+
+struct ScIconSetInfo
+{
+ sal_Int32 nIconIndex;
+ ScIconSetType eIconSetType;
+ tools::Long mnHeight = 0;
+ bool mbShowValue;
+};
+
+// FillInfo() computes some info for all cells starting from column 0,
+// but most of the info is needed only for cells in the given columns.
+// Keeping all the info in ScCellInfo could lead to allocation and initialization
+// of MiB's of memory, so split the info needed for all cells to a smaller structure.
+struct ScBasicCellInfo
+{
+ ScBasicCellInfo()
+ : nWidth(0)
+ , bEmptyCellText(true)
+ , bEditEngine(false) // view-internal
+ {}
+ sal_uInt16 nWidth;
+ bool bEmptyCellText : 1;
+ bool bEditEngine : 1; // output-internal
+};
+
+struct ScCellInfo
+{
+ ScCellInfo()
+ : pPatternAttr(nullptr)
+ , pConditionSet(nullptr)
+ , pDataBar(nullptr)
+ , pIconSet(nullptr)
+ , pBackground(nullptr) // TODO: omit?
+ , pLinesAttr(nullptr)
+ , mpTLBRLine(nullptr)
+ , mpBLTRLine(nullptr)
+ , pShadowAttr(nullptr)
+ , pHShadowOrigin(nullptr)
+ , pVShadowOrigin(nullptr)
+ , eHShadowPart(SC_SHADOW_HSTART)
+ , eVShadowPart(SC_SHADOW_HSTART)
+ , nClipMark(ScClipMark::NONE)
+ , nRotateDir(ScRotateDir::NONE)
+ , bMerged(false)
+ , bHOverlapped(false)
+ , bVOverlapped(false)
+ , bAutoFilter(false)
+ , bPivotButton(false)
+ , bPivotPopupButton(false)
+ , bFilterActive(false)
+ , bPrinted(false) // view-internal
+ , bHideGrid(false) // view-internal
+ , bPivotCollapseButton(false)
+ , bPivotExpandButton(false)
+ , bPivotPopupButtonMulti(false)
+ {
+ }
+
+ ScCellInfo(const ScCellInfo&) = delete;
+ const ScCellInfo& operator=(const ScCellInfo&) = delete;
+
+ ScRefCellValue maCell;
+
+ const ScPatternAttr* pPatternAttr;
+ const SfxItemSet* pConditionSet;
+ std::optional<Color> mxColorScale;
+ const ScDataBarInfo* pDataBar;
+ const ScIconSetInfo* pIconSet;
+
+ const SvxBrushItem* pBackground;
+
+ const SvxBoxItem* pLinesAttr; /// original item from document.
+ const SvxLineItem* mpTLBRLine; /// original item from document.
+ const SvxLineItem* mpBLTRLine; /// original item from document.
+
+ const SvxShadowItem* pShadowAttr; // original item (internal)
+
+ const SvxShadowItem* pHShadowOrigin;
+ const SvxShadowItem* pVShadowOrigin;
+
+ ScShadowPart eHShadowPart : 4; // shadow effective for drawing
+ ScShadowPart eVShadowPart : 4;
+ ScClipMark nClipMark;
+ ScRotateDir nRotateDir;
+
+ bool bMerged : 1;
+ bool bHOverlapped : 1;
+ bool bVOverlapped : 1;
+ bool bAutoFilter : 1;
+ bool bPivotButton:1;
+ bool bPivotPopupButton:1;
+ bool bFilterActive:1;
+ bool bPrinted : 1; // when required (pagebreak mode)
+ bool bHideGrid : 1; // output-internal
+ bool bPivotCollapseButton : 1; // dp compact layout collapse button
+ bool bPivotExpandButton : 1; // dp compact layout expand button
+ bool bPivotPopupButtonMulti : 1; // dp button with popup arrow for multiple fields
+};
+
+const SCCOL SC_ROTMAX_NONE = SCCOL_MAX;
+
+struct RowInfo
+{
+ RowInfo() = default;
+ RowInfo(const RowInfo&) = delete;
+ const RowInfo& operator=(const RowInfo&) = delete;
+
+ ScCellInfo& cellInfo(SCCOL nCol)
+ {
+ assert( nCol >= nStartCol - 1 );
+#ifdef DBG_UTIL
+ assert( nCol <= nEndCol + 1 );
+#endif
+ return pCellInfo[ nCol - nStartCol + 1 ];
+ }
+ const ScCellInfo& cellInfo(SCCOL nCol) const
+ {
+ return const_cast<RowInfo*>(this)->cellInfo(nCol);
+ }
+
+ ScBasicCellInfo& basicCellInfo(SCCOL nCol)
+ {
+ assert( nCol >= -1 );
+#ifdef DBG_UTIL
+ assert( nCol <= nEndCol + 1 );
+#endif
+ return pBasicCellInfo[ nCol + 1 ];
+ }
+ const ScBasicCellInfo& basicCellInfo(SCCOL nCol) const
+ {
+ return const_cast<RowInfo*>(this)->basicCellInfo(nCol);
+ }
+
+ void allocCellInfo(SCCOL startCol, SCCOL endCol)
+ {
+ nStartCol = startCol;
+#ifdef DBG_UTIL
+ nEndCol = endCol;
+#endif
+ pCellInfo = new ScCellInfo[ endCol - nStartCol + 1 + 2 ];
+ pBasicCellInfo = new ScBasicCellInfo[ endCol + 1 + 2 ];
+ }
+ void freeCellInfo()
+ {
+ delete[] pCellInfo;
+ delete[] pBasicCellInfo;
+ }
+
+ sal_uInt16 nHeight;
+ SCROW nRowNo;
+ SCCOL nRotMaxCol; // SC_ROTMAX_NONE, if nothing
+
+ bool bEmptyBack:1;
+ bool bAutoFilter:1;
+ bool bPivotButton:1;
+ bool bChanged:1; // TRUE, if not tested
+ bool bPivotToggle:1;
+
+private:
+ // This class allocates ScCellInfo with also one item extra before and after.
+ // To make handling easier, this is private and access functions take care of adjusting
+ // the array indexes and error-checking. ScCellInfo is allocated only for a given
+ // range of columns plus one on each side, ScBasicCellInfo is allocated for columns
+ // starting from column 0 until the last column given, again plus one on each side.
+ ScCellInfo* pCellInfo;
+ ScBasicCellInfo* pBasicCellInfo;
+ SCCOL nStartCol;
+#ifdef DBG_UTIL
+ SCCOL nEndCol;
+#endif
+};
+
+struct ScTableInfo
+{
+ svx::frame::Array maArray;
+ std::unique_ptr<RowInfo[]>
+ mpRowInfo;
+ SCSIZE mnArrCount;
+ SCSIZE mnArrCapacity;
+ bool mbPageMode;
+
+ explicit ScTableInfo(const SCSIZE capacity = 1024);
+ ~ScTableInfo();
+ ScTableInfo(const ScTableInfo&) = delete;
+ const ScTableInfo& operator=(const ScTableInfo&) = delete;
+
+ void addDataBarInfo(std::unique_ptr<const ScDataBarInfo> info)
+ {
+ mDataBarInfos.push_back(std::move(info));
+ }
+ void addIconSetInfo(std::unique_ptr<const ScIconSetInfo> info)
+ {
+ mIconSetInfos.push_back(std::move(info));
+ }
+private:
+ // These are owned here and not in ScCellInfo to avoid freeing
+ // memory for every pointer in ScCellInfo, most of which are nullptr.
+ std::vector<std::unique_ptr<const ScDataBarInfo>> mDataBarInfos;
+ std::vector<std::unique_ptr<const ScIconSetInfo>> mIconSetInfos;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */