diff options
Diffstat (limited to 'sw/inc/tblsel.hxx')
-rw-r--r-- | sw/inc/tblsel.hxx | 237 |
1 files changed, 237 insertions, 0 deletions
diff --git a/sw/inc/tblsel.hxx b/sw/inc/tblsel.hxx new file mode 100644 index 0000000000..892376ba6f --- /dev/null +++ b/sw/inc/tblsel.hxx @@ -0,0 +1,237 @@ +/* -*- 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 . + */ +#ifndef INCLUDED_SW_INC_TBLSEL_HXX +#define INCLUDED_SW_INC_TBLSEL_HXX + +#include "swtable.hxx" +#include "swrect.hxx" +#include "swdllapi.h" + +#include <o3tl/sorted_vector.hxx> + +#include <memory> +#include <deque> +#include <vector> + +class SwCursorShell; +class SwCursor; +class SwTableCursor; +class SwFrame; +class SwTabFrame; +class SwLayoutFrame; +class SwPaM; +class SwNode; +class SwUndoTableMerge; +class SwCellFrame; + +typedef std::deque< SwCellFrame* > SwCellFrames; + +struct CompareSwSelBoxes +{ + bool operator()(SwTableBox* const& lhs, SwTableBox* const& rhs) const + { + return lhs->GetSttIdx() < rhs->GetSttIdx(); + } +}; +class SwSelBoxes : public o3tl::sorted_vector<SwTableBox*, CompareSwSelBoxes> {}; + +// Collects all boxes in table that are selected. +// Selection gets extended in given direction according to enum-parameter. +// Boxes are collected via the Layout; works correctly if tables are split. +// (Cf. MakeSelUnions().) +enum class SwTableSearchType : sal_uInt16 +{ + NONE = 0x01, // No extension. + Row = 0x02, // Extend to rows. + Col = 0x03, // Extend to columns. + + // As flags to the other values! + Protect = 0x08, // Collect protected boxes too. + NoUnionCorrect = 0x10, // Do not correct collected Union. +}; +namespace o3tl { + template<> struct typed_flags<SwTableSearchType> : is_typed_flags<SwTableSearchType, 0x1b> {}; +} + +SW_DLLPUBLIC void GetTableSel( const SwCursorShell& rShell, SwSelBoxes& rBoxes, + const SwTableSearchType = SwTableSearchType::NONE ); + +void GetTableSel( const SwCursor& rCursor, SwSelBoxes& rBoxes, + const SwTableSearchType = SwTableSearchType::NONE ); + +// As before, but don't start from selection but from Start- EndFrames. +void GetTableSel( const SwLayoutFrame* pStart, const SwLayoutFrame* pEnd, + SwSelBoxes& rBoxes, SwCellFrames* pCells, + const SwTableSearchType = SwTableSearchType::NONE ); + +// As before but directly via PaMs. +void GetTableSelCrs( const SwCursorShell& rShell, SwSelBoxes& rBoxes ); +void GetTableSelCrs( const SwTableCursor& rTableCursor, SwSelBoxes& rBoxes ); + +// Collect boxes relevant for auto sum. +bool GetAutoSumSel( const SwCursorShell&, SwCellFrames& ); + +// Check if the SelBoxes contains protected Boxes. +bool HasProtectedCells( const SwSelBoxes& rBoxes ); + +// Check if selection is balanced. +bool ChkChartSel( const SwNode& rSttNd, const SwNode& rEndNd); + +// Check if cell is part of SSelection. +// (Became a function, in order to make sure that GetTableSel() and MakeTableCursor() +// have always the same concept of the selection. +bool IsFrameInTableSel( const SwRect& rUnion, const SwFrame* pCell ); + +// Determine boxes to be merged. +// In this process the rectangle gets "adapted" on the base of the layout, +// i.e. boxes are added if some overlap at the sides. +// Additionally a new box is created and filled with the relevant content. +void GetMergeSel( const SwPaM& rPam, SwSelBoxes& rBoxes, + SwTableBox** ppMergeBox, SwUndoTableMerge* pUndo ); + +// Check if selected boxes allow for a valid merge. +TableMergeErr CheckMergeSel( const SwPaM& rPam ); +TableMergeErr CheckMergeSel( const SwSelBoxes& rBoxes ); + +bool IsEmptyBox( const SwTableBox& rBox, SwPaM& rPam ); + +// Check if Split or InsertCol lead to a box becoming smaller than MINLAY. +bool CheckSplitCells( const SwCursorShell& rShell, sal_uInt16 nDiv, + const SwTableSearchType ); +bool CheckSplitCells( const SwCursor& rCursor, sal_uInt16 nDiv, + const SwTableSearchType ); + +// For working on tab selection also for split tables. +class SwSelUnion +{ + SwRect m_aUnion; // The rectangle enclosing the selection. + SwTabFrame *m_pTable; // The (Follow-)Table for the Union. + +public: + SwSelUnion( const SwRect &rRect, SwTabFrame *pTab ) : + m_aUnion( rRect ), m_pTable( pTab ) {} + + const SwRect& GetUnion() const { return m_aUnion; } + SwRect& GetUnion() { return m_aUnion; } + const SwTabFrame *GetTable() const { return m_pTable; } + SwTabFrame *GetTable() { return m_pTable; } +}; + +// Determines tables affected by a table selection and union rectangles +// of the selection (also for split tables) +typedef std::vector<SwSelUnion> SwSelUnions; + +// Gets the tables involved in a table selection and the union-rectangles of the selections +// - also for split tables. +// If a parameter is passed that != SwTableSearchType::NONE +// the selection is extended in the given direction. +void MakeSelUnions( SwSelUnions&, const SwLayoutFrame *pStart, + const SwLayoutFrame *pEnd, + const SwTableSearchType = SwTableSearchType::NONE ); + +// These classes copy the current table selections (rBoxes) into a +// separate structure while keeping the table structure. + +class FndBox_; +class FndLine_; + +typedef std::vector<std::unique_ptr<FndBox_>> FndBoxes_t; +typedef std::vector<std::unique_ptr<FndLine_>> FndLines_t; + +class FndBox_ +{ + SwTableBox* m_pBox; + FndLines_t m_Lines; + FndLine_* m_pUpper; + + SwTableLine *m_pLineBefore; ///< For deleting/restoring the layout. + SwTableLine *m_pLineBehind; ///< For deleting/restoring the layout. + + FndBox_(FndBox_ const&) = delete; + FndBox_& operator=(FndBox_ const&) = delete; + +public: + inline FndBox_( SwTableBox* pB, FndLine_* pFL ); + + const FndLines_t& GetLines() const { return m_Lines; } + FndLines_t& GetLines() { return m_Lines; } + const SwTableBox* GetBox() const { return m_pBox; } + SwTableBox* GetBox() { return m_pBox; } + const FndLine_* GetUpper() const { return m_pUpper; } + FndLine_* GetUpper() { return m_pUpper; } + + void SetTableLines( const SwSelBoxes &rBoxes, const SwTable &rTable ); + void SetTableLines( const SwTable &rTable ); + //Add an input param to identify if acc table should be disposed + void DelFrames ( SwTable &rTable ); + void MakeFrames( SwTable &rTable ); + void MakeNewFrames( SwTable &rTable, const sal_uInt16 nNumber, + const bool bBehind ); + bool AreLinesToRestore( const SwTable &rTable ) const; + + void ClearLineBehind() { m_pLineBehind = nullptr; } +}; + +class FndLine_ +{ + SwTableLine* m_pLine; + FndBoxes_t m_Boxes; + FndBox_* m_pUpper; + + FndLine_(FndLine_ const&) = delete; + FndLine_& operator=(FndLine_ const&) = delete; + +public: + FndLine_(SwTableLine* pL, FndBox_* pFB) : m_pLine(pL), m_pUpper(pFB) {} + const FndBoxes_t& GetBoxes() const { return m_Boxes; } + FndBoxes_t& GetBoxes() { return m_Boxes; } + const SwTableLine* GetLine() const { return m_pLine; } + SwTableLine* GetLine() { return m_pLine; } + const FndBox_* GetUpper() const { return m_pUpper; } + FndBox_* GetUpper() { return m_pUpper; } + + void SetUpper( FndBox_* pUp ) { m_pUpper = pUp; } +}; + +FndBox_::FndBox_( SwTableBox* pB, FndLine_* pFL ) : + m_pBox(pB), m_pUpper(pFL), m_pLineBefore( nullptr ), m_pLineBehind( nullptr ) {} + +struct FndPara +{ + const SwSelBoxes& rBoxes; + FndLine_* pFndLine; + FndBox_* pFndBox; + + FndPara( const SwSelBoxes& rBxs, FndBox_* pFB ) + : rBoxes(rBxs), pFndLine(nullptr), pFndBox(pFB) {} + FndPara( const FndPara& rPara, FndBox_* pFB ) + : rBoxes(rPara.rBoxes), pFndLine(rPara.pFndLine), pFndBox(pFB) {} + FndPara( const FndPara& rPara, FndLine_* pFL ) + : rBoxes(rPara.rBoxes), pFndLine(pFL), pFndBox(rPara.pFndBox) {} +}; + +/** This creates a structure mirroring the SwTable structure that contains all + rows and non-leaf boxes (as pointers to SwTableBox/SwTableLine, not copies), + plus the leaf boxes that are selected by pFndPara->rBoxes + */ +SW_DLLPUBLIC void ForEach_FndLineCopyCol(SwTableLines& rLines, FndPara* pFndPara ); + +#endif // INCLUDED_SW_INC_TBLSEL_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |