diff options
Diffstat (limited to 'sw/source/core/inc/tblrwcl.hxx')
-rw-r--r-- | sw/source/core/inc/tblrwcl.hxx | 228 |
1 files changed, 228 insertions, 0 deletions
diff --git a/sw/source/core/inc/tblrwcl.hxx b/sw/source/core/inc/tblrwcl.hxx new file mode 100644 index 000000000000..6100ee41a422 --- /dev/null +++ b/sw/source/core/inc/tblrwcl.hxx @@ -0,0 +1,228 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef _TBLRWCL_HXX +#define _TBLRWCL_HXX +#ifndef _SVSTDARR_HXX +#define _SVSTDARR_USHORTS +#include <svl/svstdarr.hxx> +#endif +#include <vector> +#include <swtypes.hxx> +#include <tblsel.hxx> +#include <swtable.hxx> + +class SvxBorderLine; +class SwDoc; +class SwTableNode; +class _FndLine; +class _FndBox; +class SwTableLine; +class SwTableBox; +class SwTableBoxFmt; +class SwHistory; +class SwCntntNode; +class SfxPoolItem; +class SwShareBoxFmts; +class SwFmtFrmSize; + +// Funktions Deklarationen: +BOOL lcl_CopyRow( const _FndLine*& rpFndLine, void* pPara ); +BOOL lcl_CopyCol( const _FndBox*& rpFndBox, void* pPara ); + +BOOL lcl_MergeGCBox( const SwTableBox*& rpBox, void* pPara ); +BOOL lcl_MergeGCLine( const SwTableLine*& rpLine, void* pPara ); + +BOOL lcl_Merge_MoveBox( const _FndBox*& rpFndBox, void* pPara ); +BOOL lcl_Merge_MoveLine( const _FndLine*& rpFndLine, void* pPara ); + +BOOL lcl_CopyBoxToDoc( const _FndBox*& rpFndBox, void* pPara ); +BOOL lcl_CopyLineToDoc( const _FndLine*& rpFndLn, void* pPara ); + +BOOL lcl_BoxSetHeadCondColl( const SwTableBox*& rpBox, void* pPara ); +BOOL lcl_LineSetHeadCondColl( const SwTableLine*& rpLine, void* pPara ); + + +#ifdef DBG_UTIL +void _CheckBoxWidth( const SwTableLine& rLine, SwTwips nSize ); +#endif + +void _InsTblBox( SwDoc* pDoc, SwTableNode* pTblNd, + SwTableLine* pLine, SwTableBoxFmt* pBoxFrmFmt, + SwTableBox* pBox, USHORT nInsPos, USHORT nCnt = 1 ); + +SW_DLLPUBLIC void _DeleteBox( SwTable& rTbl, SwTableBox* pBox, SwUndo* pUndo = 0, + BOOL bCalcNewSize = TRUE, const BOOL bCorrBorder = TRUE, + SwShareBoxFmts* pShareFmts = 0 ); + +// Klasse fuers SplitTable +// sammelt von einer Line die Boxen aller obersten oder untersten Lines +// in einem Array. Zusaetzlich werden die Positionen vermerkt. +// ( die Implementierung steht im ndtbl.cxx) + +class SwCollectTblLineBoxes +{ + SvUShorts aPosArr; + SwSelBoxes_SAR aBoxes; + SwHistory* pHst; + USHORT nMode, nWidth; + BOOL bGetFromTop : 1; + BOOL bGetValues : 1; + +public: + SwCollectTblLineBoxes( BOOL bTop, USHORT nMd = 0, SwHistory* pHist=0 ) + : aPosArr( 16, 16 ), aBoxes( 16, 16 ), + pHst( pHist ), nMode( nMd ), nWidth( 0 ), + bGetFromTop( bTop ), bGetValues( TRUE ) + + {} + + void AddBox( const SwTableBox& rBox ); + const SwTableBox* GetBoxOfPos( const SwTableBox& rBox ); + void AddToUndoHistory( const SwCntntNode& rNd ); + + USHORT Count() const { return aBoxes.Count(); } + const SwTableBox& GetBox( USHORT nPos, USHORT* pWidth = 0 ) const + { + // hier wird die EndPos der Spalte benoetigt! + if( pWidth ) + *pWidth = nPos+1 == aPosArr.Count() ? nWidth + : aPosArr[ nPos+1 ]; + return *aBoxes[ nPos ]; + } + + BOOL IsGetFromTop() const { return bGetFromTop; } + BOOL IsGetValues() const { return bGetValues; } + + USHORT GetMode() const { return nMode; } + void SetValues( BOOL bFlag ) { bGetValues = FALSE; nWidth = 0; + bGetFromTop = bFlag; } + BOOL Resize( USHORT nOffset, USHORT nWidth ); +}; + +BOOL lcl_Box_CollectBox( const SwTableBox*& rpBox, void* pPara ); +BOOL lcl_Line_CollectBox( const SwTableLine*& rpLine, void* pPara ); + +BOOL lcl_BoxSetSplitBoxFmts( const SwTableBox*& rpBox, void* pPara ); + +// This structure is needed by Undo to restore row span attributes +// when a table has been splitted into two tables +struct SwSaveRowSpan +{ + USHORT mnSplitLine; // the line number where the table has been splitted + std::vector< long > mnRowSpans; // the row span attributes in this line + SwSaveRowSpan( SwTableBoxes& rBoxes, USHORT nSplitLn ); +}; + +struct _SwGCLineBorder +{ + const SwTableLines* pLines; + SwShareBoxFmts* pShareFmts; + USHORT nLinePos; + + _SwGCLineBorder( const SwTable& rTable ) + : pLines( &rTable.GetTabLines() ), pShareFmts(0), nLinePos( 0 ) {} + + _SwGCLineBorder( const SwTableBox& rBox ) + : pLines( &rBox.GetTabLines() ), pShareFmts(0), nLinePos( 0 ) {} + BOOL IsLastLine() const { return nLinePos + 1 >= pLines->Count(); } +}; + +class _SwGCBorder_BoxBrd +{ + const SvxBorderLine* pBrdLn; + BOOL bAnyBorderFnd; +public: + _SwGCBorder_BoxBrd() : pBrdLn( 0 ), bAnyBorderFnd( FALSE ) {} + + void SetBorder( const SvxBorderLine& rBorderLine ) + { pBrdLn = &rBorderLine; bAnyBorderFnd = FALSE; } + + // checke, ob die linke Border dieselbe wie die gesetzte ist + // returnt FALSE falls gar keine Border gesetzt ist + BOOL CheckLeftBorderOfFormat( const SwFrmFmt& rFmt ); + + BOOL IsAnyBorderFound() const { return bAnyBorderFnd; } +}; + +BOOL lcl_GC_Line_Border( const SwTableLine*& , void* pPara ); +BOOL lcl_GC_Box_Border( const SwTableBox*& , void* pPara ); + +BOOL lcl_GCBorder_ChkBoxBrd_L( const SwTableLine*& , void* pPara ); +BOOL lcl_GCBorder_ChkBoxBrd_B( const SwTableBox*& , void* pPara ); + +BOOL lcl_GCBorder_GetLastBox_L( const SwTableLine*& , void* pPara ); +BOOL lcl_GCBorder_GetLastBox_B( const SwTableBox*& , void* pPara ); + + +class SwShareBoxFmt +{ + const SwFrmFmt* pOldFmt; + SvPtrarr aNewFmts; + +public: + SwShareBoxFmt( const SwFrmFmt& rFmt ) + : pOldFmt( &rFmt ), aNewFmts( 1, 4 ) + {} + + const SwFrmFmt& GetOldFormat() const { return *pOldFmt; } + + SwFrmFmt* GetFormat( long nWidth ) const; + SwFrmFmt* GetFormat( const SfxPoolItem& rItem ) const; + void AddFormat( const SwFrmFmt& rFmt ); + // returnt TRUE, wenn geloescht werden kann + BOOL RemoveFormat( const SwFrmFmt& rFmt ); +}; + + +SV_DECL_PTRARR_DEL( _SwShareBoxFmts, SwShareBoxFmt*, 8, 8 ) + +class SwShareBoxFmts +{ + _SwShareBoxFmts aShareArr; + BOOL Seek_Entry( const SwFrmFmt& rFmt, USHORT* pPos ) const; + + void ChangeFrmFmt( SwTableBox* pBox, SwTableLine* pLn, SwFrmFmt& rFmt ); + +public: + SwShareBoxFmts() {} + ~SwShareBoxFmts(); + + SwFrmFmt* GetFormat( const SwFrmFmt& rFmt, long nWidth ) const; + SwFrmFmt* GetFormat( const SwFrmFmt& rFmt, const SfxPoolItem& ) const; + + void AddFormat( const SwFrmFmt& rOld, const SwFrmFmt& rNew ); + + void SetSize( SwTableBox& rBox, const SwFmtFrmSize& rSz ); + void SetAttr( SwTableBox& rBox, const SfxPoolItem& rItem ); + void SetAttr( SwTableLine& rLine, const SfxPoolItem& rItem ); + + void RemoveFormat( const SwFrmFmt& rFmt ); +}; + + + +#endif |