1efeef26fSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3efeef26fSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4efeef26fSAndrew Rist * or more contributor license agreements. See the NOTICE file
5efeef26fSAndrew Rist * distributed with this work for additional information
6efeef26fSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7efeef26fSAndrew Rist * to you under the Apache License, Version 2.0 (the
8efeef26fSAndrew Rist * "License"); you may not use this file except in compliance
9efeef26fSAndrew Rist * with the License. You may obtain a copy of the License at
10cdf0e10cSrcweir *
11efeef26fSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir *
13efeef26fSAndrew Rist * Unless required by applicable law or agreed to in writing,
14efeef26fSAndrew Rist * software distributed under the License is distributed on an
15efeef26fSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16efeef26fSAndrew Rist * KIND, either express or implied. See the License for the
17efeef26fSAndrew Rist * specific language governing permissions and limitations
18efeef26fSAndrew Rist * under the License.
19cdf0e10cSrcweir *
20efeef26fSAndrew Rist *************************************************************/
21efeef26fSAndrew Rist
22efeef26fSAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sw.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir #include <com/sun/star/text/HoriOrientation.hpp>
28cdf0e10cSrcweir #include <com/sun/star/chart2/XChartDocument.hpp>
29cdf0e10cSrcweir #include <hintids.hxx>
30cdf0e10cSrcweir
31cdf0e10cSrcweir #define _ZFORLIST_DECLARE_TABLE
32cdf0e10cSrcweir #include <editeng/brshitem.hxx>
33cdf0e10cSrcweir #include <editeng/lrspitem.hxx>
34cdf0e10cSrcweir #include <editeng/protitem.hxx>
35cdf0e10cSrcweir #include <editeng/boxitem.hxx>
36cdf0e10cSrcweir #include <tools/fract.hxx>
37cdf0e10cSrcweir #include <fmtfsize.hxx>
38cdf0e10cSrcweir #include <fmtornt.hxx>
39cdf0e10cSrcweir #include <doc.hxx>
40cdf0e10cSrcweir #include <cntfrm.hxx>
41cdf0e10cSrcweir #include <tabfrm.hxx>
42cdf0e10cSrcweir #include <frmtool.hxx>
43cdf0e10cSrcweir #include <pam.hxx>
44cdf0e10cSrcweir #include <swtable.hxx>
45cdf0e10cSrcweir #include <ndtxt.hxx>
46cdf0e10cSrcweir #include <tblsel.hxx>
47cdf0e10cSrcweir #include <fldbas.hxx>
48cdf0e10cSrcweir #include <swundo.hxx>
49cdf0e10cSrcweir #include <rowfrm.hxx>
50cdf0e10cSrcweir #include <ddefld.hxx>
51cdf0e10cSrcweir #include <hints.hxx>
52cdf0e10cSrcweir #include <UndoTable.hxx>
53cdf0e10cSrcweir #include <cellatr.hxx>
54cdf0e10cSrcweir #include <mvsave.hxx>
55cdf0e10cSrcweir #include <swtblfmt.hxx>
56cdf0e10cSrcweir #include <swddetbl.hxx>
57cdf0e10cSrcweir #include <poolfmt.hxx>
58cdf0e10cSrcweir #include <tblrwcl.hxx>
59cdf0e10cSrcweir #include <unochart.hxx>
60cdf0e10cSrcweir #include <boost/shared_ptr.hpp>
61cdf0e10cSrcweir #include <switerator.hxx>
62cdf0e10cSrcweir
63cdf0e10cSrcweir using namespace com::sun::star;
64cdf0e10cSrcweir using namespace com::sun::star::uno;
65cdf0e10cSrcweir
66cdf0e10cSrcweir
67cdf0e10cSrcweir #define COLFUZZY 20
68cdf0e10cSrcweir #define ROWFUZZY 10
69cdf0e10cSrcweir
70cdf0e10cSrcweir using namespace ::com::sun::star;
71cdf0e10cSrcweir
72cdf0e10cSrcweir #ifndef DBG_UTIL
73cdf0e10cSrcweir #define CHECK_TABLE(t)
74cdf0e10cSrcweir #else
75cdf0e10cSrcweir #ifdef DEBUG
76cdf0e10cSrcweir #define CHECK_TABLE(t) (t).CheckConsistency();
77cdf0e10cSrcweir #else
78cdf0e10cSrcweir #define CHECK_TABLE(t)
79cdf0e10cSrcweir #endif
80cdf0e10cSrcweir #endif
81cdf0e10cSrcweir
82cdf0e10cSrcweir typedef SwTableLine* SwTableLinePtr;
83cdf0e10cSrcweir SV_DECL_PTRARR_SORT( SwSortTableLines, SwTableLinePtr, 16, 16 )
84cdf0e10cSrcweir SV_IMPL_PTRARR_SORT( SwSortTableLines, SwTableLinePtr );
85cdf0e10cSrcweir
86cdf0e10cSrcweir SV_IMPL_PTRARR( _SwShareBoxFmts, SwShareBoxFmt* )
87cdf0e10cSrcweir
88cdf0e10cSrcweir // fuers setzen der Frame-Formate an den Boxen reicht es, das aktuelle
89cdf0e10cSrcweir // im Array zu suchen. Ist es vorhanden, so gebe das neue zurueck
90cdf0e10cSrcweir struct _CpyTabFrm
91cdf0e10cSrcweir {
92cdf0e10cSrcweir union {
93cdf0e10cSrcweir SwTableBoxFmt *pFrmFmt; // fuer CopyCol
94cdf0e10cSrcweir SwTwips nSize; // fuer DelCol
95cdf0e10cSrcweir } Value;
96cdf0e10cSrcweir SwTableBoxFmt *pNewFrmFmt;
97cdf0e10cSrcweir
_CpyTabFrm_CpyTabFrm98cdf0e10cSrcweir _CpyTabFrm( SwTableBoxFmt* pAktFrmFmt ) : pNewFrmFmt( 0 )
99cdf0e10cSrcweir { Value.pFrmFmt = pAktFrmFmt; }
100cdf0e10cSrcweir
101cdf0e10cSrcweir _CpyTabFrm& operator=( const _CpyTabFrm& );
102cdf0e10cSrcweir
operator ==_CpyTabFrm103cdf0e10cSrcweir sal_Bool operator==( const _CpyTabFrm& rCpyTabFrm )
104cdf0e10cSrcweir { return (sal_uLong)Value.nSize == (sal_uLong)rCpyTabFrm.Value.nSize; }
operator <_CpyTabFrm105cdf0e10cSrcweir sal_Bool operator<( const _CpyTabFrm& rCpyTabFrm )
106cdf0e10cSrcweir { return (sal_uLong)Value.nSize < (sal_uLong)rCpyTabFrm.Value.nSize; }
107cdf0e10cSrcweir };
108cdf0e10cSrcweir
109cdf0e10cSrcweir struct CR_SetBoxWidth
110cdf0e10cSrcweir {
111cdf0e10cSrcweir SwSelBoxes aBoxes;
112cdf0e10cSrcweir SwSortTableLines aLines;
113cdf0e10cSrcweir SvUShorts aLinesWidth;
114cdf0e10cSrcweir SwShareBoxFmts aShareFmts;
115cdf0e10cSrcweir SwTableNode* pTblNd;
116cdf0e10cSrcweir SwUndoTblNdsChg* pUndo;
117cdf0e10cSrcweir SwTwips nDiff, nSide, nMaxSize, nLowerDiff;
118cdf0e10cSrcweir TblChgMode nMode;
119cdf0e10cSrcweir sal_uInt16 nTblWidth, nRemainWidth, nBoxWidth;
120cdf0e10cSrcweir sal_Bool bBigger, bLeft, bSplittBox, bAnyBoxFnd;
121cdf0e10cSrcweir
CR_SetBoxWidthCR_SetBoxWidth122cdf0e10cSrcweir CR_SetBoxWidth( sal_uInt16 eType, SwTwips nDif, SwTwips nSid, SwTwips nTblW,
123cdf0e10cSrcweir SwTwips nMax, SwTableNode* pTNd )
124cdf0e10cSrcweir : pTblNd( pTNd ),
125cdf0e10cSrcweir nDiff( nDif ), nSide( nSid ), nMaxSize( nMax ), nLowerDiff( 0 ),
126cdf0e10cSrcweir nTblWidth( (sal_uInt16)nTblW ), nRemainWidth( 0 ), nBoxWidth( 0 ),
127cdf0e10cSrcweir bSplittBox( sal_False ), bAnyBoxFnd( sal_False )
128cdf0e10cSrcweir {
129cdf0e10cSrcweir bLeft = nsTblChgWidthHeightType::WH_COL_LEFT == ( eType & 0xff ) ||
130cdf0e10cSrcweir nsTblChgWidthHeightType::WH_CELL_LEFT == ( eType & 0xff );
131cdf0e10cSrcweir bBigger = 0 != (eType & nsTblChgWidthHeightType::WH_FLAG_BIGGER );
132cdf0e10cSrcweir nMode = pTblNd->GetTable().GetTblChgMode();
133cdf0e10cSrcweir }
CR_SetBoxWidthCR_SetBoxWidth134cdf0e10cSrcweir CR_SetBoxWidth( const CR_SetBoxWidth& rCpy )
135cdf0e10cSrcweir : pTblNd( rCpy.pTblNd ),
136cdf0e10cSrcweir pUndo( rCpy.pUndo ),
137cdf0e10cSrcweir nDiff( rCpy.nDiff ), nSide( rCpy.nSide ),
138cdf0e10cSrcweir nMaxSize( rCpy.nMaxSize ), nLowerDiff( 0 ),
139cdf0e10cSrcweir nMode( rCpy.nMode ), nTblWidth( rCpy.nTblWidth ),
1408a5d84ebSHerbert Dürr nRemainWidth( rCpy.nRemainWidth ), nBoxWidth( rCpy.nBoxWidth ),
141cdf0e10cSrcweir bBigger( rCpy.bBigger ), bLeft( rCpy.bLeft ),
142cdf0e10cSrcweir bSplittBox( rCpy.bSplittBox ), bAnyBoxFnd( rCpy.bAnyBoxFnd )
143cdf0e10cSrcweir {
144cdf0e10cSrcweir aLines.Insert( &rCpy.aLines );
145cdf0e10cSrcweir aLinesWidth.Insert( &rCpy.aLinesWidth, 0 );
146cdf0e10cSrcweir }
147cdf0e10cSrcweir
CreateUndoCR_SetBoxWidth148cdf0e10cSrcweir SwUndoTblNdsChg* CreateUndo( SwUndoId eUndoType )
149cdf0e10cSrcweir {
150cdf0e10cSrcweir return pUndo = new SwUndoTblNdsChg( eUndoType, aBoxes, *pTblNd );
151cdf0e10cSrcweir }
152cdf0e10cSrcweir
LoopClearCR_SetBoxWidth153cdf0e10cSrcweir void LoopClear()
154cdf0e10cSrcweir {
155cdf0e10cSrcweir nLowerDiff = 0; nRemainWidth = 0;
156cdf0e10cSrcweir }
157cdf0e10cSrcweir
AddBoxWidthCR_SetBoxWidth158cdf0e10cSrcweir void AddBoxWidth( const SwTableBox& rBox, sal_uInt16 nWidth )
159cdf0e10cSrcweir {
160cdf0e10cSrcweir SwTableLinePtr p = (SwTableLine*)rBox.GetUpper();
161cdf0e10cSrcweir sal_uInt16 nFndPos;
162cdf0e10cSrcweir if( aLines.Insert( p, nFndPos ))
163cdf0e10cSrcweir aLinesWidth.Insert( nWidth, nFndPos );
164cdf0e10cSrcweir else
165cdf0e10cSrcweir aLinesWidth[ nFndPos ] = aLinesWidth[ nFndPos ] + nWidth;
166cdf0e10cSrcweir }
167cdf0e10cSrcweir
GetBoxWidthCR_SetBoxWidth168cdf0e10cSrcweir sal_uInt16 GetBoxWidth( const SwTableLine& rLn ) const
169cdf0e10cSrcweir {
170cdf0e10cSrcweir SwTableLinePtr p = (SwTableLine*)&rLn;
171cdf0e10cSrcweir sal_uInt16 nFndPos;
172cdf0e10cSrcweir if( aLines.Seek_Entry( p, &nFndPos ) )
173cdf0e10cSrcweir nFndPos = aLinesWidth[ nFndPos ];
174cdf0e10cSrcweir else
175cdf0e10cSrcweir nFndPos = 0;
176cdf0e10cSrcweir return nFndPos;
177cdf0e10cSrcweir }
178cdf0e10cSrcweir };
179cdf0e10cSrcweir
180cdf0e10cSrcweir sal_Bool lcl_SetSelBoxWidth( SwTableLine* pLine, CR_SetBoxWidth& rParam,
181cdf0e10cSrcweir SwTwips nDist, sal_Bool bCheck );
182cdf0e10cSrcweir sal_Bool lcl_SetOtherBoxWidth( SwTableLine* pLine, CR_SetBoxWidth& rParam,
183cdf0e10cSrcweir SwTwips nDist, sal_Bool bCheck );
184cdf0e10cSrcweir sal_Bool lcl_InsSelBox( SwTableLine* pLine, CR_SetBoxWidth& rParam,
185cdf0e10cSrcweir SwTwips nDist, sal_Bool bCheck );
186cdf0e10cSrcweir sal_Bool lcl_InsOtherBox( SwTableLine* pLine, CR_SetBoxWidth& rParam,
187cdf0e10cSrcweir SwTwips nDist, sal_Bool bCheck );
188cdf0e10cSrcweir sal_Bool lcl_DelSelBox( SwTableLine* pLine, CR_SetBoxWidth& rParam,
189cdf0e10cSrcweir SwTwips nDist, sal_Bool bCheck );
190cdf0e10cSrcweir sal_Bool lcl_DelOtherBox( SwTableLine* pLine, CR_SetBoxWidth& rParam,
191cdf0e10cSrcweir SwTwips nDist, sal_Bool bCheck );
192cdf0e10cSrcweir
193cdf0e10cSrcweir typedef sal_Bool (*FN_lcl_SetBoxWidth)(SwTableLine*, CR_SetBoxWidth&, SwTwips, sal_Bool );
194cdf0e10cSrcweir
195cdf0e10cSrcweir #if defined(DBG_UTIL) || defined( JP_DEBUG )
196cdf0e10cSrcweir
197cdf0e10cSrcweir void _CheckBoxWidth( const SwTableLine& rLine, SwTwips nSize );
198cdf0e10cSrcweir
199cdf0e10cSrcweir #define CHECKBOXWIDTH \
200cdf0e10cSrcweir { \
201cdf0e10cSrcweir SwTwips nSize = GetFrmFmt()->GetFrmSize().GetWidth(); \
202cdf0e10cSrcweir for( sal_uInt16 nTmp = 0; nTmp < aLines.Count(); ++nTmp ) \
203cdf0e10cSrcweir ::_CheckBoxWidth( *aLines[ nTmp ], nSize ); \
204cdf0e10cSrcweir }
205cdf0e10cSrcweir
206cdf0e10cSrcweir #define CHECKTABLELAYOUT \
207cdf0e10cSrcweir { \
208cdf0e10cSrcweir for ( sal_uInt16 i = 0; i < GetTabLines().Count(); ++i ) \
209cdf0e10cSrcweir { \
210cdf0e10cSrcweir SwFrmFmt* pFmt = GetTabLines()[i]->GetFrmFmt(); \
211cdf0e10cSrcweir SwIterator<SwRowFrm,SwFmt> aIter( *pFmt ); \
212cdf0e10cSrcweir for (SwRowFrm* pFrm=aIter.First(); pFrm; pFrm=aIter.Next())\
213cdf0e10cSrcweir { \
214cdf0e10cSrcweir if ( pFrm->GetTabLine() == GetTabLines()[i] ) \
215cdf0e10cSrcweir { \
216cdf0e10cSrcweir ASSERT( pFrm->GetUpper()->IsTabFrm(), \
217cdf0e10cSrcweir "Table layout does not match table structure" ) \
218cdf0e10cSrcweir } \
219cdf0e10cSrcweir } \
220cdf0e10cSrcweir } \
221cdf0e10cSrcweir }
222cdf0e10cSrcweir
223cdf0e10cSrcweir #else
224cdf0e10cSrcweir
225cdf0e10cSrcweir #define CHECKBOXWIDTH
226cdf0e10cSrcweir #define CHECKTABLELAYOUT
227cdf0e10cSrcweir
228cdf0e10cSrcweir #endif
229cdf0e10cSrcweir
230cdf0e10cSrcweir
231cdf0e10cSrcweir struct CR_SetLineHeight
232cdf0e10cSrcweir {
233cdf0e10cSrcweir SwSelBoxes aBoxes;
234cdf0e10cSrcweir SwShareBoxFmts aShareFmts;
235cdf0e10cSrcweir SwTableNode* pTblNd;
236cdf0e10cSrcweir SwUndoTblNdsChg* pUndo;
237cdf0e10cSrcweir SwTwips nMaxSpace, nMaxHeight;
238cdf0e10cSrcweir TblChgMode nMode;
239cdf0e10cSrcweir sal_uInt16 nLines;
240cdf0e10cSrcweir sal_Bool bBigger, bTop, bSplittBox, bAnyBoxFnd;
241cdf0e10cSrcweir
CR_SetLineHeightCR_SetLineHeight242cdf0e10cSrcweir CR_SetLineHeight( sal_uInt16 eType, SwTableNode* pTNd )
243cdf0e10cSrcweir : pTblNd( pTNd ), pUndo( 0 ),
244cdf0e10cSrcweir nMaxSpace( 0 ), nMaxHeight( 0 ), nLines( 0 ),
245cdf0e10cSrcweir bSplittBox( sal_False ), bAnyBoxFnd( sal_False )
246cdf0e10cSrcweir {
247cdf0e10cSrcweir bTop = nsTblChgWidthHeightType::WH_ROW_TOP == ( eType & 0xff ) || nsTblChgWidthHeightType::WH_CELL_TOP == ( eType & 0xff );
248cdf0e10cSrcweir bBigger = 0 != (eType & nsTblChgWidthHeightType::WH_FLAG_BIGGER );
249cdf0e10cSrcweir if( eType & nsTblChgWidthHeightType::WH_FLAG_INSDEL )
250cdf0e10cSrcweir bBigger = !bBigger;
251cdf0e10cSrcweir nMode = pTblNd->GetTable().GetTblChgMode();
252cdf0e10cSrcweir }
CR_SetLineHeightCR_SetLineHeight253cdf0e10cSrcweir CR_SetLineHeight( const CR_SetLineHeight& rCpy )
254cdf0e10cSrcweir : pTblNd( rCpy.pTblNd ), pUndo( rCpy.pUndo ),
255cdf0e10cSrcweir nMaxSpace( rCpy.nMaxSpace ), nMaxHeight( rCpy.nMaxHeight ),
256cdf0e10cSrcweir nMode( rCpy.nMode ), nLines( rCpy.nLines ),
257cdf0e10cSrcweir bBigger( rCpy.bBigger ), bTop( rCpy.bTop ),
258cdf0e10cSrcweir bSplittBox( rCpy.bSplittBox ), bAnyBoxFnd( rCpy.bAnyBoxFnd )
259cdf0e10cSrcweir {}
260cdf0e10cSrcweir
CreateUndoCR_SetLineHeight261cdf0e10cSrcweir SwUndoTblNdsChg* CreateUndo( SwUndoId nUndoType )
262cdf0e10cSrcweir {
263cdf0e10cSrcweir return pUndo = new SwUndoTblNdsChg( nUndoType, aBoxes, *pTblNd );
264cdf0e10cSrcweir }
265cdf0e10cSrcweir };
266cdf0e10cSrcweir
267cdf0e10cSrcweir sal_Bool lcl_SetSelLineHeight( SwTableLine* pLine, CR_SetLineHeight& rParam,
268cdf0e10cSrcweir SwTwips nDist, sal_Bool bCheck );
269cdf0e10cSrcweir sal_Bool lcl_SetOtherLineHeight( SwTableLine* pLine, CR_SetLineHeight& rParam,
270cdf0e10cSrcweir SwTwips nDist, sal_Bool bCheck );
271cdf0e10cSrcweir sal_Bool lcl_InsDelSelLine( SwTableLine* pLine, CR_SetLineHeight& rParam,
272cdf0e10cSrcweir SwTwips nDist, sal_Bool bCheck );
273cdf0e10cSrcweir
274cdf0e10cSrcweir typedef sal_Bool (*FN_lcl_SetLineHeight)(SwTableLine*, CR_SetLineHeight&, SwTwips, sal_Bool );
275cdf0e10cSrcweir
operator =(const _CpyTabFrm & rCpyTabFrm)276cdf0e10cSrcweir _CpyTabFrm& _CpyTabFrm::operator=( const _CpyTabFrm& rCpyTabFrm )
277cdf0e10cSrcweir {
278cdf0e10cSrcweir pNewFrmFmt = rCpyTabFrm.pNewFrmFmt;
279cdf0e10cSrcweir Value = rCpyTabFrm.Value;
280cdf0e10cSrcweir return *this;
281cdf0e10cSrcweir }
282cdf0e10cSrcweir
283cdf0e10cSrcweir SV_DECL_VARARR_SORT( _CpyTabFrms, _CpyTabFrm, 0, 50 )
284cdf0e10cSrcweir SV_IMPL_VARARR_SORT( _CpyTabFrms, _CpyTabFrm )
285cdf0e10cSrcweir
286cdf0e10cSrcweir void lcl_DelCpyTabFrmFmts( _CpyTabFrm& rArr );
287cdf0e10cSrcweir
288cdf0e10cSrcweir // ---------------------------------------------------------------
289cdf0e10cSrcweir
290cdf0e10cSrcweir struct _CpyPara
291cdf0e10cSrcweir {
292cdf0e10cSrcweir boost::shared_ptr< std::vector< std::vector< sal_uLong > > > pWidths;
293cdf0e10cSrcweir SwDoc* pDoc;
294cdf0e10cSrcweir SwTableNode* pTblNd;
295cdf0e10cSrcweir _CpyTabFrms& rTabFrmArr;
296cdf0e10cSrcweir SwTableLine* pInsLine;
297cdf0e10cSrcweir SwTableBox* pInsBox;
298cdf0e10cSrcweir sal_uLong nOldSize, nNewSize; // zum Korrigieren der Size-Attribute
299cdf0e10cSrcweir sal_uLong nMinLeft, nMaxRight;
300cdf0e10cSrcweir sal_uInt16 nCpyCnt, nInsPos;
301cdf0e10cSrcweir sal_uInt16 nLnIdx, nBoxIdx;
302cdf0e10cSrcweir sal_uInt8 nDelBorderFlag;
303cdf0e10cSrcweir sal_Bool bCpyCntnt;
304cdf0e10cSrcweir
_CpyPara_CpyPara305cdf0e10cSrcweir _CpyPara( SwTableNode* pNd, sal_uInt16 nCopies, _CpyTabFrms& rFrmArr,
306cdf0e10cSrcweir sal_Bool bCopyContent = sal_True )
307cdf0e10cSrcweir : pDoc( pNd->GetDoc() ), pTblNd( pNd ), rTabFrmArr(rFrmArr),
308cdf0e10cSrcweir pInsLine(0), pInsBox(0), nOldSize(0), nNewSize(0),
309cdf0e10cSrcweir nMinLeft(ULONG_MAX), nMaxRight(0),
310cdf0e10cSrcweir nCpyCnt(nCopies), nInsPos(0),
311cdf0e10cSrcweir nLnIdx(0), nBoxIdx(0),
312cdf0e10cSrcweir nDelBorderFlag(0), bCpyCntnt( bCopyContent )
313cdf0e10cSrcweir {}
_CpyPara_CpyPara314cdf0e10cSrcweir _CpyPara( const _CpyPara& rPara, SwTableLine* pLine )
315cdf0e10cSrcweir : pWidths( rPara.pWidths ), pDoc(rPara.pDoc), pTblNd(rPara.pTblNd),
316cdf0e10cSrcweir rTabFrmArr(rPara.rTabFrmArr), pInsLine(pLine), pInsBox(rPara.pInsBox),
317cdf0e10cSrcweir nOldSize(0), nNewSize(rPara.nNewSize), nMinLeft( rPara.nMinLeft ),
318cdf0e10cSrcweir nMaxRight( rPara.nMaxRight ), nCpyCnt(rPara.nCpyCnt), nInsPos(0),
319cdf0e10cSrcweir nLnIdx( rPara.nLnIdx), nBoxIdx( rPara.nBoxIdx ),
320cdf0e10cSrcweir nDelBorderFlag( rPara.nDelBorderFlag ), bCpyCntnt( rPara.bCpyCntnt )
321cdf0e10cSrcweir {}
_CpyPara_CpyPara322cdf0e10cSrcweir _CpyPara( const _CpyPara& rPara, SwTableBox* pBox )
323cdf0e10cSrcweir : pWidths( rPara.pWidths ), pDoc(rPara.pDoc), pTblNd(rPara.pTblNd),
324cdf0e10cSrcweir rTabFrmArr(rPara.rTabFrmArr), pInsLine(rPara.pInsLine), pInsBox(pBox),
325cdf0e10cSrcweir nOldSize(rPara.nOldSize), nNewSize(rPara.nNewSize),
326cdf0e10cSrcweir nMinLeft( rPara.nMinLeft ), nMaxRight( rPara.nMaxRight ),
327cdf0e10cSrcweir nCpyCnt(rPara.nCpyCnt), nInsPos(0), nLnIdx(rPara.nLnIdx), nBoxIdx(rPara.nBoxIdx),
328cdf0e10cSrcweir nDelBorderFlag( rPara.nDelBorderFlag ), bCpyCntnt( rPara.bCpyCntnt )
329cdf0e10cSrcweir {}
330cdf0e10cSrcweir void SetBoxWidth( SwTableBox* pBox );
331cdf0e10cSrcweir };
332cdf0e10cSrcweir
333cdf0e10cSrcweir
lcl_CopyCol(const _FndBox * & rpFndBox,void * pPara)334cdf0e10cSrcweir sal_Bool lcl_CopyCol( const _FndBox*& rpFndBox, void* pPara )
335cdf0e10cSrcweir {
336cdf0e10cSrcweir _CpyPara* pCpyPara = (_CpyPara*)pPara;
337cdf0e10cSrcweir
338cdf0e10cSrcweir // suche das FrmFmt im Array aller Frame-Formate
339cdf0e10cSrcweir SwTableBox* pBox = (SwTableBox*)rpFndBox->GetBox();
340cdf0e10cSrcweir _CpyTabFrm aFindFrm( (SwTableBoxFmt*)pBox->GetFrmFmt() );
341cdf0e10cSrcweir
342cdf0e10cSrcweir sal_uInt16 nFndPos;
343cdf0e10cSrcweir if( pCpyPara->nCpyCnt )
344cdf0e10cSrcweir {
345cdf0e10cSrcweir if( !pCpyPara->rTabFrmArr.Seek_Entry( aFindFrm, &nFndPos ))
346cdf0e10cSrcweir {
347cdf0e10cSrcweir // fuer das verschachtelte Kopieren sicher auch das neue Format
348cdf0e10cSrcweir // als alt.
349cdf0e10cSrcweir SwTableBoxFmt* pNewFmt = (SwTableBoxFmt*)pBox->ClaimFrmFmt();
350cdf0e10cSrcweir
351cdf0e10cSrcweir // suche die selektierten Boxen in der Line:
352cdf0e10cSrcweir _FndLine* pCmpLine = NULL;
353cdf0e10cSrcweir SwFmtFrmSize aFrmSz( pNewFmt->GetFrmSize() );
354cdf0e10cSrcweir
355cdf0e10cSrcweir bool bDiffCount = false;
356cdf0e10cSrcweir if( pBox->GetTabLines().Count() )
357cdf0e10cSrcweir {
358cdf0e10cSrcweir pCmpLine = rpFndBox->GetLines()[ 0 ];
359cdf0e10cSrcweir if ( pCmpLine->GetBoxes().Count() != pCmpLine->GetLine()->GetTabBoxes().Count() )
360cdf0e10cSrcweir bDiffCount = true;
361cdf0e10cSrcweir }
362cdf0e10cSrcweir
363cdf0e10cSrcweir if( bDiffCount )
364cdf0e10cSrcweir {
365cdf0e10cSrcweir // die erste Line sollte reichen
366cdf0e10cSrcweir _FndBoxes& rFndBoxes = pCmpLine->GetBoxes();
367cdf0e10cSrcweir long nSz = 0;
368cdf0e10cSrcweir for( sal_uInt16 n = rFndBoxes.Count(); n; )
369cdf0e10cSrcweir nSz += rFndBoxes[ --n ]->GetBox()->GetFrmFmt()->GetFrmSize().GetWidth();
370cdf0e10cSrcweir aFrmSz.SetWidth( aFrmSz.GetWidth() -
371cdf0e10cSrcweir nSz / ( pCpyPara->nCpyCnt + 1 ) );
372cdf0e10cSrcweir pNewFmt->SetFmtAttr( aFrmSz );
373cdf0e10cSrcweir aFrmSz.SetWidth( nSz / ( pCpyPara->nCpyCnt + 1 ) );
374cdf0e10cSrcweir
375cdf0e10cSrcweir // fuer die neue Box ein neues Format mit der Groesse anlegen!
376cdf0e10cSrcweir aFindFrm.pNewFrmFmt = (SwTableBoxFmt*)pNewFmt->GetDoc()->
377cdf0e10cSrcweir MakeTableLineFmt();
378cdf0e10cSrcweir *aFindFrm.pNewFrmFmt = *pNewFmt;
379cdf0e10cSrcweir aFindFrm.pNewFrmFmt->SetFmtAttr( aFrmSz );
380cdf0e10cSrcweir }
381cdf0e10cSrcweir else
382cdf0e10cSrcweir {
383cdf0e10cSrcweir aFrmSz.SetWidth( aFrmSz.GetWidth() / ( pCpyPara->nCpyCnt + 1 ) );
384cdf0e10cSrcweir pNewFmt->SetFmtAttr( aFrmSz );
385cdf0e10cSrcweir
386cdf0e10cSrcweir aFindFrm.pNewFrmFmt = pNewFmt;
387cdf0e10cSrcweir pCpyPara->rTabFrmArr.Insert( aFindFrm );
388cdf0e10cSrcweir aFindFrm.Value.pFrmFmt = pNewFmt;
389cdf0e10cSrcweir pCpyPara->rTabFrmArr.Insert( aFindFrm );
390cdf0e10cSrcweir }
391cdf0e10cSrcweir }
392cdf0e10cSrcweir else
393cdf0e10cSrcweir {
394cdf0e10cSrcweir aFindFrm = pCpyPara->rTabFrmArr[ nFndPos ];
395cdf0e10cSrcweir // aFindFrm.pNewFrmFmt->Add( pBox );
396cdf0e10cSrcweir pBox->ChgFrmFmt( (SwTableBoxFmt*)aFindFrm.pNewFrmFmt );
397cdf0e10cSrcweir }
398cdf0e10cSrcweir }
399cdf0e10cSrcweir else
400cdf0e10cSrcweir {
401cdf0e10cSrcweir if( pCpyPara->nDelBorderFlag &&
402cdf0e10cSrcweir pCpyPara->rTabFrmArr.Seek_Entry( aFindFrm, &nFndPos ))
403cdf0e10cSrcweir aFindFrm = pCpyPara->rTabFrmArr[ nFndPos ];
404cdf0e10cSrcweir else
405cdf0e10cSrcweir aFindFrm.pNewFrmFmt = (SwTableBoxFmt*)pBox->GetFrmFmt();
406cdf0e10cSrcweir }
407cdf0e10cSrcweir
408cdf0e10cSrcweir if( rpFndBox->GetLines().Count() )
409cdf0e10cSrcweir {
410cdf0e10cSrcweir pBox = new SwTableBox( aFindFrm.pNewFrmFmt,
411cdf0e10cSrcweir rpFndBox->GetLines().Count(), pCpyPara->pInsLine );
412cdf0e10cSrcweir pCpyPara->pInsLine->GetTabBoxes().C40_INSERT( SwTableBox, pBox, pCpyPara->nInsPos++);
413cdf0e10cSrcweir _CpyPara aPara( *pCpyPara, pBox );
414cdf0e10cSrcweir aPara.nDelBorderFlag &= 7;
415cdf0e10cSrcweir
416cdf0e10cSrcweir ((_FndBox*)rpFndBox)->GetLines().ForEach( &lcl_CopyRow, &aPara );
417cdf0e10cSrcweir }
418cdf0e10cSrcweir else
419cdf0e10cSrcweir {
420cdf0e10cSrcweir ::_InsTblBox( pCpyPara->pDoc, pCpyPara->pTblNd, pCpyPara->pInsLine,
421cdf0e10cSrcweir aFindFrm.pNewFrmFmt, pBox, pCpyPara->nInsPos++ );
422cdf0e10cSrcweir
423cdf0e10cSrcweir const _FndBoxes& rFndBxs = rpFndBox->GetUpper()->GetBoxes();
424cdf0e10cSrcweir if( 8 > pCpyPara->nDelBorderFlag
425cdf0e10cSrcweir ? pCpyPara->nDelBorderFlag
426cdf0e10cSrcweir : rpFndBox == rFndBxs[ rFndBxs.Count() - 1 ] )
427cdf0e10cSrcweir {
428cdf0e10cSrcweir const SvxBoxItem& rBoxItem = pBox->GetFrmFmt()->GetBox();
429cdf0e10cSrcweir if( 8 > pCpyPara->nDelBorderFlag
430cdf0e10cSrcweir ? rBoxItem.GetTop()
431cdf0e10cSrcweir : rBoxItem.GetRight() )
432cdf0e10cSrcweir {
433cdf0e10cSrcweir aFindFrm.Value.pFrmFmt = (SwTableBoxFmt*)pBox->GetFrmFmt();
434cdf0e10cSrcweir
435cdf0e10cSrcweir SvxBoxItem aNew( rBoxItem );
436cdf0e10cSrcweir if( 8 > pCpyPara->nDelBorderFlag )
437cdf0e10cSrcweir aNew.SetLine( 0, BOX_LINE_TOP );
438cdf0e10cSrcweir else
439cdf0e10cSrcweir aNew.SetLine( 0, BOX_LINE_RIGHT );
440cdf0e10cSrcweir
441cdf0e10cSrcweir if( 1 == pCpyPara->nDelBorderFlag ||
442cdf0e10cSrcweir 8 == pCpyPara->nDelBorderFlag )
443cdf0e10cSrcweir {
444cdf0e10cSrcweir // es wird dahinter kopiert, bei allen Boxen die
445cdf0e10cSrcweir // TopBorderLine loeschen
446cdf0e10cSrcweir pBox = pCpyPara->pInsLine->GetTabBoxes()[
447cdf0e10cSrcweir pCpyPara->nInsPos - 1 ];
448cdf0e10cSrcweir }
449cdf0e10cSrcweir
450cdf0e10cSrcweir aFindFrm.pNewFrmFmt = (SwTableBoxFmt*)pBox->GetFrmFmt();
451cdf0e10cSrcweir
452cdf0e10cSrcweir // ansonsten wird davor kopiert und die erste Line behaelt
453cdf0e10cSrcweir // die TopLine und an der originalen wird sie entfernt
454cdf0e10cSrcweir pBox->ClaimFrmFmt()->SetFmtAttr( aNew );
455cdf0e10cSrcweir
456cdf0e10cSrcweir if( !pCpyPara->nCpyCnt )
457cdf0e10cSrcweir pCpyPara->rTabFrmArr.Insert( aFindFrm );
458cdf0e10cSrcweir }
459cdf0e10cSrcweir }
460cdf0e10cSrcweir }
461cdf0e10cSrcweir return sal_True;
462cdf0e10cSrcweir }
463cdf0e10cSrcweir
lcl_CopyRow(const _FndLine * & rpFndLine,void * pPara)464cdf0e10cSrcweir sal_Bool lcl_CopyRow( const _FndLine*& rpFndLine, void* pPara )
465cdf0e10cSrcweir {
466cdf0e10cSrcweir _CpyPara* pCpyPara = (_CpyPara*)pPara;
467cdf0e10cSrcweir SwTableLine* pNewLine = new SwTableLine(
468cdf0e10cSrcweir (SwTableLineFmt*)rpFndLine->GetLine()->GetFrmFmt(),
469cdf0e10cSrcweir rpFndLine->GetBoxes().Count(), pCpyPara->pInsBox );
470cdf0e10cSrcweir if( pCpyPara->pInsBox )
471cdf0e10cSrcweir {
472cdf0e10cSrcweir pCpyPara->pInsBox->GetTabLines().C40_INSERT( SwTableLine, pNewLine, pCpyPara->nInsPos++ );
473cdf0e10cSrcweir }
474cdf0e10cSrcweir else
475cdf0e10cSrcweir {
476cdf0e10cSrcweir pCpyPara->pTblNd->GetTable().GetTabLines().C40_INSERT( SwTableLine, pNewLine,
477cdf0e10cSrcweir pCpyPara->nInsPos++ );
478cdf0e10cSrcweir }
479cdf0e10cSrcweir
480cdf0e10cSrcweir _CpyPara aPara( *pCpyPara, pNewLine );
481cdf0e10cSrcweir ((_FndLine*)rpFndLine)->GetBoxes().ForEach( &lcl_CopyCol, &aPara );
482cdf0e10cSrcweir
483cdf0e10cSrcweir pCpyPara->nDelBorderFlag &= 0xf8;
484cdf0e10cSrcweir return sal_True;
485cdf0e10cSrcweir }
486cdf0e10cSrcweir
487cdf0e10cSrcweir //-----------------------------------------------------------
488cdf0e10cSrcweir
lcl_InsCol(_FndLine * pFndLn,_CpyPara & rCpyPara,sal_uInt16 nCpyCnt,sal_Bool bBehind)489cdf0e10cSrcweir void lcl_InsCol( _FndLine* pFndLn, _CpyPara& rCpyPara, sal_uInt16 nCpyCnt,
490cdf0e10cSrcweir sal_Bool bBehind )
491cdf0e10cSrcweir {
492cdf0e10cSrcweir // Bug 29124: nicht nur in den Grundlines kopieren. Wenns geht, so weit
493cdf0e10cSrcweir // runter wie moeglich.
494cdf0e10cSrcweir _FndBox* pFBox;
495cdf0e10cSrcweir if( 1 == pFndLn->GetBoxes().Count() &&
496cdf0e10cSrcweir !( pFBox = pFndLn->GetBoxes()[ 0 ] )->GetBox()->GetSttNd() )
497cdf0e10cSrcweir {
498cdf0e10cSrcweir // eine Box mit mehreren Lines, also in diese Lines einfuegen
499cdf0e10cSrcweir for( sal_uInt16 n = 0; n < pFBox->GetLines().Count(); ++n )
500cdf0e10cSrcweir lcl_InsCol( pFBox->GetLines()[ n ], rCpyPara, nCpyCnt, bBehind );
501cdf0e10cSrcweir }
502cdf0e10cSrcweir else
503cdf0e10cSrcweir {
504cdf0e10cSrcweir rCpyPara.pInsLine = pFndLn->GetLine();
505cdf0e10cSrcweir SwTableBox* pBox = pFndLn->GetBoxes()[ bBehind ?
506cdf0e10cSrcweir pFndLn->GetBoxes().Count()-1 : 0 ]->GetBox();
507cdf0e10cSrcweir rCpyPara.nInsPos = pFndLn->GetLine()->GetTabBoxes().C40_GETPOS( SwTableBox, pBox );
508cdf0e10cSrcweir if( bBehind )
509cdf0e10cSrcweir ++rCpyPara.nInsPos;
510cdf0e10cSrcweir
511cdf0e10cSrcweir for( sal_uInt16 n = 0; n < nCpyCnt; ++n )
512cdf0e10cSrcweir {
513cdf0e10cSrcweir if( n + 1 == nCpyCnt && bBehind )
514cdf0e10cSrcweir rCpyPara.nDelBorderFlag = 9;
515cdf0e10cSrcweir else
516cdf0e10cSrcweir rCpyPara.nDelBorderFlag = 8;
517cdf0e10cSrcweir pFndLn->GetBoxes().ForEach( &lcl_CopyCol, &rCpyPara );
518cdf0e10cSrcweir }
519cdf0e10cSrcweir }
520cdf0e10cSrcweir }
521cdf0e10cSrcweir
GetRowFrm(SwTableLine & rLine)522cdf0e10cSrcweir SwRowFrm* GetRowFrm( SwTableLine& rLine )
523cdf0e10cSrcweir {
524cdf0e10cSrcweir SwIterator<SwRowFrm,SwFmt> aIter( *rLine.GetFrmFmt() );
525cdf0e10cSrcweir for( SwRowFrm* pFrm = aIter.First(); pFrm; pFrm = aIter.Next() )
526cdf0e10cSrcweir if( pFrm->GetTabLine() == &rLine )
527cdf0e10cSrcweir return pFrm;
528cdf0e10cSrcweir return 0;
529cdf0e10cSrcweir }
530cdf0e10cSrcweir
531cdf0e10cSrcweir
InsertCol(SwDoc * pDoc,const SwSelBoxes & rBoxes,sal_uInt16 nCnt,sal_Bool bBehind)532cdf0e10cSrcweir sal_Bool SwTable::InsertCol( SwDoc* pDoc, const SwSelBoxes& rBoxes, sal_uInt16 nCnt, sal_Bool bBehind )
533cdf0e10cSrcweir {
534cdf0e10cSrcweir ASSERT( rBoxes.Count() && nCnt, "keine gueltige Box-Liste" );
535cdf0e10cSrcweir SwTableNode* pTblNd = (SwTableNode*)rBoxes[0]->GetSttNd()->FindTableNode();
536cdf0e10cSrcweir if( !pTblNd )
537cdf0e10cSrcweir return sal_False;
538cdf0e10cSrcweir
539cdf0e10cSrcweir sal_Bool bRes = sal_True;
540cdf0e10cSrcweir if( IsNewModel() )
541cdf0e10cSrcweir bRes = NewInsertCol( pDoc, rBoxes, nCnt, bBehind );
542cdf0e10cSrcweir else
543cdf0e10cSrcweir {
544cdf0e10cSrcweir // suche alle Boxen / Lines
545cdf0e10cSrcweir _FndBox aFndBox( 0, 0 );
546cdf0e10cSrcweir {
547cdf0e10cSrcweir _FndPara aPara( rBoxes, &aFndBox );
548cdf0e10cSrcweir GetTabLines().ForEach( &_FndLineCopyCol, &aPara );
549cdf0e10cSrcweir }
550cdf0e10cSrcweir if( !aFndBox.GetLines().Count() )
551cdf0e10cSrcweir return sal_False;
552cdf0e10cSrcweir
553cdf0e10cSrcweir SetHTMLTableLayout( 0 ); // MIB 9.7.97: HTML-Layout loeschen
554cdf0e10cSrcweir
555cdf0e10cSrcweir //Lines fuer das Layout-Update herausuchen.
556cdf0e10cSrcweir aFndBox.SetTableLines( *this );
557cdf0e10cSrcweir aFndBox.DelFrms( *this );
558cdf0e10cSrcweir
559cdf0e10cSrcweir // TL_CHART2: nothing to be done since chart2 currently does not want to
560cdf0e10cSrcweir // get notified about new rows/cols.
561cdf0e10cSrcweir
562cdf0e10cSrcweir _CpyTabFrms aTabFrmArr;
563cdf0e10cSrcweir _CpyPara aCpyPara( pTblNd, nCnt, aTabFrmArr );
564cdf0e10cSrcweir
565cdf0e10cSrcweir for( sal_uInt16 n = 0; n < aFndBox.GetLines().Count(); ++n )
566cdf0e10cSrcweir lcl_InsCol( aFndBox.GetLines()[ n ], aCpyPara, nCnt, bBehind );
567cdf0e10cSrcweir
568cdf0e10cSrcweir // dann raeume die Struktur dieser Line noch mal auf, generell alle
569cdf0e10cSrcweir GCLines();
570cdf0e10cSrcweir
571cdf0e10cSrcweir //Layout updaten
572cdf0e10cSrcweir aFndBox.MakeFrms( *this );
573cdf0e10cSrcweir
574cdf0e10cSrcweir CHECKBOXWIDTH
575cdf0e10cSrcweir CHECKTABLELAYOUT
576cdf0e10cSrcweir bRes = sal_True;
577cdf0e10cSrcweir }
578cdf0e10cSrcweir
579cdf0e10cSrcweir SwChartDataProvider *pPCD = pDoc->GetChartDataProvider();
580cdf0e10cSrcweir if (pPCD && nCnt)
581cdf0e10cSrcweir pPCD->AddRowCols( *this, rBoxes, nCnt, bBehind );
582cdf0e10cSrcweir pDoc->UpdateCharts( GetFrmFmt()->GetName() );
583cdf0e10cSrcweir
584cdf0e10cSrcweir return bRes;
585cdf0e10cSrcweir }
586cdf0e10cSrcweir
_InsertRow(SwDoc * pDoc,const SwSelBoxes & rBoxes,sal_uInt16 nCnt,sal_Bool bBehind)587cdf0e10cSrcweir sal_Bool SwTable::_InsertRow( SwDoc* pDoc, const SwSelBoxes& rBoxes,
588cdf0e10cSrcweir sal_uInt16 nCnt, sal_Bool bBehind )
589cdf0e10cSrcweir {
590cdf0e10cSrcweir ASSERT( pDoc && rBoxes.Count() && nCnt, "keine gueltige Box-Liste" );
591cdf0e10cSrcweir SwTableNode* pTblNd = (SwTableNode*)rBoxes[0]->GetSttNd()->FindTableNode();
592cdf0e10cSrcweir if( !pTblNd )
593cdf0e10cSrcweir return sal_False;
594cdf0e10cSrcweir
595cdf0e10cSrcweir // suche alle Boxen / Lines
596cdf0e10cSrcweir _FndBox aFndBox( 0, 0 );
597cdf0e10cSrcweir {
598cdf0e10cSrcweir _FndPara aPara( rBoxes, &aFndBox );
599cdf0e10cSrcweir GetTabLines().ForEach( &_FndLineCopyCol, &aPara );
600cdf0e10cSrcweir }
601cdf0e10cSrcweir if( !aFndBox.GetLines().Count() )
602cdf0e10cSrcweir return sal_False;
603cdf0e10cSrcweir
604cdf0e10cSrcweir SetHTMLTableLayout( 0 ); // MIB 9.7.97: HTML-Layout loeschen
605cdf0e10cSrcweir
606cdf0e10cSrcweir _FndBox* pFndBox = &aFndBox;
607cdf0e10cSrcweir {
608cdf0e10cSrcweir _FndLine* pFndLine;
609cdf0e10cSrcweir while( 1 == pFndBox->GetLines().Count() &&
610cdf0e10cSrcweir 1 == ( pFndLine = pFndBox->GetLines()[ 0 ])->GetBoxes().Count() )
611cdf0e10cSrcweir {
612cdf0e10cSrcweir // nicht zu weit runter, eine Line mit Boxen muss nachbleiben!!
613cdf0e10cSrcweir _FndBox* pTmpBox = pFndLine->GetBoxes()[ 0 ];
614cdf0e10cSrcweir if( pTmpBox->GetLines().Count() )
615cdf0e10cSrcweir pFndBox = pTmpBox;
616cdf0e10cSrcweir else
617cdf0e10cSrcweir break;
618cdf0e10cSrcweir }
619cdf0e10cSrcweir }
620cdf0e10cSrcweir
621cdf0e10cSrcweir //Lines fuer das Layout-Update herausuchen.
622cdf0e10cSrcweir const sal_Bool bLayout = !IsNewModel() &&
623cdf0e10cSrcweir 0 != SwIterator<SwTabFrm,SwFmt>::FirstElement( *GetFrmFmt() );
624cdf0e10cSrcweir
625cdf0e10cSrcweir if ( bLayout )
626cdf0e10cSrcweir {
627cdf0e10cSrcweir aFndBox.SetTableLines( *this );
628cdf0e10cSrcweir if( pFndBox != &aFndBox )
629cdf0e10cSrcweir aFndBox.DelFrms( *this );
630cdf0e10cSrcweir // TL_CHART2: nothing to be done since chart2 currently does not want to
631cdf0e10cSrcweir // get notified about new rows/cols.
632cdf0e10cSrcweir }
633cdf0e10cSrcweir
634cdf0e10cSrcweir _CpyTabFrms aTabFrmArr;
635cdf0e10cSrcweir _CpyPara aCpyPara( pTblNd, 0, aTabFrmArr );
636cdf0e10cSrcweir
637cdf0e10cSrcweir SwTableLine* pLine = pFndBox->GetLines()[ bBehind ?
638cdf0e10cSrcweir pFndBox->GetLines().Count()-1 : 0 ]->GetLine();
639cdf0e10cSrcweir if( &aFndBox == pFndBox )
640cdf0e10cSrcweir aCpyPara.nInsPos = GetTabLines().C40_GETPOS( SwTableLine, pLine );
641cdf0e10cSrcweir else
642cdf0e10cSrcweir {
643cdf0e10cSrcweir aCpyPara.pInsBox = pFndBox->GetBox();
644cdf0e10cSrcweir aCpyPara.nInsPos = pFndBox->GetBox()->GetTabLines().C40_GETPOS( SwTableLine, pLine );
645cdf0e10cSrcweir }
646cdf0e10cSrcweir
647cdf0e10cSrcweir if( bBehind )
648cdf0e10cSrcweir {
649cdf0e10cSrcweir ++aCpyPara.nInsPos;
650cdf0e10cSrcweir aCpyPara.nDelBorderFlag = 1;
651cdf0e10cSrcweir }
652cdf0e10cSrcweir else
653cdf0e10cSrcweir aCpyPara.nDelBorderFlag = 2;
654cdf0e10cSrcweir
655cdf0e10cSrcweir for( sal_uInt16 nCpyCnt = 0; nCpyCnt < nCnt; ++nCpyCnt )
656cdf0e10cSrcweir {
657cdf0e10cSrcweir if( bBehind )
658cdf0e10cSrcweir aCpyPara.nDelBorderFlag = 1;
659cdf0e10cSrcweir pFndBox->GetLines().ForEach( &lcl_CopyRow, &aCpyPara );
660cdf0e10cSrcweir }
661cdf0e10cSrcweir
662cdf0e10cSrcweir // dann raeume die Struktur dieser Line noch mal auf, generell alle
663cdf0e10cSrcweir if( !pDoc->IsInReading() )
664cdf0e10cSrcweir GCLines();
665cdf0e10cSrcweir
666cdf0e10cSrcweir //Layout updaten
667cdf0e10cSrcweir if ( bLayout )
668cdf0e10cSrcweir {
669cdf0e10cSrcweir if( pFndBox != &aFndBox )
670cdf0e10cSrcweir aFndBox.MakeFrms( *this );
671cdf0e10cSrcweir else
672cdf0e10cSrcweir aFndBox.MakeNewFrms( *this, nCnt, bBehind );
673cdf0e10cSrcweir }
674cdf0e10cSrcweir
675cdf0e10cSrcweir CHECKBOXWIDTH
676cdf0e10cSrcweir CHECKTABLELAYOUT
677cdf0e10cSrcweir
678cdf0e10cSrcweir SwChartDataProvider *pPCD = pDoc->GetChartDataProvider();
679cdf0e10cSrcweir if (pPCD && nCnt)
680cdf0e10cSrcweir pPCD->AddRowCols( *this, rBoxes, nCnt, bBehind );
681cdf0e10cSrcweir pDoc->UpdateCharts( GetFrmFmt()->GetName() );
682cdf0e10cSrcweir
683cdf0e10cSrcweir return sal_True;
684cdf0e10cSrcweir }
685cdf0e10cSrcweir
686cdf0e10cSrcweir sal_Bool _FndBoxAppendRowLine( const SwTableLine*& rpLine, void* pPara );
687cdf0e10cSrcweir
_FndBoxAppendRowBox(const SwTableBox * & rpBox,void * pPara)688cdf0e10cSrcweir sal_Bool _FndBoxAppendRowBox( const SwTableBox*& rpBox, void* pPara )
689cdf0e10cSrcweir {
690cdf0e10cSrcweir _FndPara* pFndPara = (_FndPara*)pPara;
691cdf0e10cSrcweir _FndBox* pFndBox = new _FndBox( (SwTableBox*)rpBox, pFndPara->pFndLine );
692cdf0e10cSrcweir if( rpBox->GetTabLines().Count() )
693cdf0e10cSrcweir {
694cdf0e10cSrcweir _FndPara aPara( *pFndPara, pFndBox );
695cdf0e10cSrcweir pFndBox->GetBox()->GetTabLines().ForEach( &_FndBoxAppendRowLine, &aPara );
696cdf0e10cSrcweir if( !pFndBox->GetLines().Count() )
697cdf0e10cSrcweir delete pFndBox;
698cdf0e10cSrcweir }
699cdf0e10cSrcweir else
700cdf0e10cSrcweir pFndPara->pFndLine->GetBoxes().C40_INSERT( _FndBox, pFndBox,
701cdf0e10cSrcweir pFndPara->pFndLine->GetBoxes().Count() );
702cdf0e10cSrcweir return sal_True;
703cdf0e10cSrcweir }
704cdf0e10cSrcweir
_FndBoxAppendRowLine(const SwTableLine * & rpLine,void * pPara)705cdf0e10cSrcweir sal_Bool _FndBoxAppendRowLine( const SwTableLine*& rpLine, void* pPara )
706cdf0e10cSrcweir {
707cdf0e10cSrcweir _FndPara* pFndPara = (_FndPara*)pPara;
708cdf0e10cSrcweir _FndLine* pFndLine = new _FndLine( (SwTableLine*)rpLine, pFndPara->pFndBox );
709cdf0e10cSrcweir _FndPara aPara( *pFndPara, pFndLine );
710cdf0e10cSrcweir pFndLine->GetLine()->GetTabBoxes().ForEach( &_FndBoxAppendRowBox, &aPara );
711cdf0e10cSrcweir if( pFndLine->GetBoxes().Count() )
712cdf0e10cSrcweir {
713cdf0e10cSrcweir pFndPara->pFndBox->GetLines().C40_INSERT( _FndLine, pFndLine,
714cdf0e10cSrcweir pFndPara->pFndBox->GetLines().Count() );
715cdf0e10cSrcweir }
716cdf0e10cSrcweir else
717cdf0e10cSrcweir delete pFndLine;
718cdf0e10cSrcweir return sal_True;
719cdf0e10cSrcweir }
720cdf0e10cSrcweir
721cdf0e10cSrcweir
AppendRow(SwDoc * pDoc,sal_uInt16 nCnt)722cdf0e10cSrcweir sal_Bool SwTable::AppendRow( SwDoc* pDoc, sal_uInt16 nCnt )
723cdf0e10cSrcweir {
724cdf0e10cSrcweir SwTableNode* pTblNd = (SwTableNode*)aSortCntBoxes[0]->GetSttNd()->FindTableNode();
725cdf0e10cSrcweir if( !pTblNd )
726cdf0e10cSrcweir return sal_False;
727cdf0e10cSrcweir
728cdf0e10cSrcweir // suche alle Boxen / Lines
729cdf0e10cSrcweir _FndBox aFndBox( 0, 0 );
730cdf0e10cSrcweir {
731cdf0e10cSrcweir const SwTableLine* pLLine = GetTabLines()[ GetTabLines().Count()-1 ];
732cdf0e10cSrcweir
733cdf0e10cSrcweir const SwSelBoxes* pBxs = 0; // Dummy !!!
734cdf0e10cSrcweir _FndPara aPara( *pBxs, &aFndBox );
735cdf0e10cSrcweir
736cdf0e10cSrcweir _FndBoxAppendRowLine( pLLine, &aPara );
737cdf0e10cSrcweir }
738cdf0e10cSrcweir if( !aFndBox.GetLines().Count() )
739cdf0e10cSrcweir return sal_False;
740cdf0e10cSrcweir
741cdf0e10cSrcweir SetHTMLTableLayout( 0 ); // MIB 9.7.97: HTML-Layout loeschen
742cdf0e10cSrcweir
743cdf0e10cSrcweir //Lines fuer das Layout-Update herausuchen.
744cdf0e10cSrcweir bool bLayout = 0 != SwIterator<SwTabFrm,SwFmt>::FirstElement( *GetFrmFmt() );
745cdf0e10cSrcweir if( bLayout )
746cdf0e10cSrcweir {
747cdf0e10cSrcweir aFndBox.SetTableLines( *this );
748cdf0e10cSrcweir // TL_CHART2: nothing to be done since chart2 currently does not want to
749cdf0e10cSrcweir // get notified about new rows/cols.
750cdf0e10cSrcweir }
751cdf0e10cSrcweir
752cdf0e10cSrcweir _CpyTabFrms aTabFrmArr;
753cdf0e10cSrcweir _CpyPara aCpyPara( pTblNd, 0, aTabFrmArr );
754cdf0e10cSrcweir aCpyPara.nInsPos = GetTabLines().Count();
755cdf0e10cSrcweir aCpyPara.nDelBorderFlag = 1;
756cdf0e10cSrcweir
757cdf0e10cSrcweir for( sal_uInt16 nCpyCnt = 0; nCpyCnt < nCnt; ++nCpyCnt )
758cdf0e10cSrcweir {
759cdf0e10cSrcweir aCpyPara.nDelBorderFlag = 1;
760cdf0e10cSrcweir aFndBox.GetLines().ForEach( &lcl_CopyRow, &aCpyPara );
761cdf0e10cSrcweir }
762cdf0e10cSrcweir
763cdf0e10cSrcweir // dann raeume die Struktur dieser Line noch mal auf, generell alle
764cdf0e10cSrcweir if( !pDoc->IsInReading() )
765cdf0e10cSrcweir GCLines();
766cdf0e10cSrcweir
767cdf0e10cSrcweir //Layout updaten
768cdf0e10cSrcweir if ( bLayout )
769cdf0e10cSrcweir {
770cdf0e10cSrcweir aFndBox.MakeNewFrms( *this, nCnt, sal_True );
771cdf0e10cSrcweir }
772cdf0e10cSrcweir // TL_CHART2: need to inform chart of probably changed cell names
773cdf0e10cSrcweir pDoc->UpdateCharts( GetFrmFmt()->GetName() );
774cdf0e10cSrcweir
775cdf0e10cSrcweir CHECKBOXWIDTH
776cdf0e10cSrcweir CHECKTABLELAYOUT
777cdf0e10cSrcweir
778cdf0e10cSrcweir return sal_True;
779cdf0e10cSrcweir }
780cdf0e10cSrcweir
781cdf0e10cSrcweir
782cdf0e10cSrcweir void lcl_LastBoxSetWidth( SwTableBoxes &rBoxes, const long nOffset,
783cdf0e10cSrcweir sal_Bool bFirst, SwShareBoxFmts& rShareFmts );
784cdf0e10cSrcweir
lcl_LastBoxSetWidthLine(SwTableLines & rLines,const long nOffset,sal_Bool bFirst,SwShareBoxFmts & rShareFmts)785cdf0e10cSrcweir void lcl_LastBoxSetWidthLine( SwTableLines &rLines, const long nOffset,
786cdf0e10cSrcweir sal_Bool bFirst, SwShareBoxFmts& rShareFmts )
787cdf0e10cSrcweir {
788cdf0e10cSrcweir for ( sal_uInt16 i = 0; i < rLines.Count(); ++i )
789cdf0e10cSrcweir ::lcl_LastBoxSetWidth( rLines[i]->GetTabBoxes(), nOffset, bFirst,
790cdf0e10cSrcweir rShareFmts );
791cdf0e10cSrcweir }
792cdf0e10cSrcweir
lcl_LastBoxSetWidth(SwTableBoxes & rBoxes,const long nOffset,sal_Bool bFirst,SwShareBoxFmts & rShareFmts)793cdf0e10cSrcweir void lcl_LastBoxSetWidth( SwTableBoxes &rBoxes, const long nOffset,
794cdf0e10cSrcweir sal_Bool bFirst, SwShareBoxFmts& rShareFmts )
795cdf0e10cSrcweir {
796cdf0e10cSrcweir SwTableBox& rBox = *rBoxes[ bFirst ? 0 : rBoxes.Count() - 1 ];
797cdf0e10cSrcweir if( !rBox.GetSttNd() )
798cdf0e10cSrcweir ::lcl_LastBoxSetWidthLine( rBox.GetTabLines(), nOffset,
799cdf0e10cSrcweir bFirst, rShareFmts );
800cdf0e10cSrcweir
801cdf0e10cSrcweir //Die Box anpassen
802cdf0e10cSrcweir SwFrmFmt *pBoxFmt = rBox.GetFrmFmt();
803cdf0e10cSrcweir SwFmtFrmSize aNew( pBoxFmt->GetFrmSize() );
804cdf0e10cSrcweir aNew.SetWidth( aNew.GetWidth() + nOffset );
805cdf0e10cSrcweir SwFrmFmt *pFmt = rShareFmts.GetFormat( *pBoxFmt, aNew );
806cdf0e10cSrcweir if( pFmt )
807cdf0e10cSrcweir rBox.ChgFrmFmt( (SwTableBoxFmt*)pFmt );
808cdf0e10cSrcweir else
809cdf0e10cSrcweir {
810cdf0e10cSrcweir pFmt = rBox.ClaimFrmFmt();
811cdf0e10cSrcweir
812cdf0e10cSrcweir pFmt->LockModify();
813cdf0e10cSrcweir pFmt->SetFmtAttr( aNew );
814cdf0e10cSrcweir pFmt->UnlockModify();
815cdf0e10cSrcweir
816cdf0e10cSrcweir rShareFmts.AddFormat( *pBoxFmt, *pFmt );
817cdf0e10cSrcweir }
818cdf0e10cSrcweir }
819cdf0e10cSrcweir
_DeleteBox(SwTable & rTbl,SwTableBox * pBox,SwUndo * pUndo,sal_Bool bCalcNewSize,const sal_Bool bCorrBorder,SwShareBoxFmts * pShareFmts)820cdf0e10cSrcweir void _DeleteBox( SwTable& rTbl, SwTableBox* pBox, SwUndo* pUndo,
821cdf0e10cSrcweir sal_Bool bCalcNewSize, const sal_Bool bCorrBorder,
822cdf0e10cSrcweir SwShareBoxFmts* pShareFmts )
823cdf0e10cSrcweir {
824cdf0e10cSrcweir do {
825cdf0e10cSrcweir SwTwips nBoxSz = bCalcNewSize ?
826cdf0e10cSrcweir pBox->GetFrmFmt()->GetFrmSize().GetWidth() : 0;
827cdf0e10cSrcweir SwTableLine* pLine = pBox->GetUpper();
828cdf0e10cSrcweir SwTableBoxes& rTblBoxes = pLine->GetTabBoxes();
829cdf0e10cSrcweir sal_uInt16 nDelPos = rTblBoxes.C40_GETPOS( SwTableBox, pBox );
830cdf0e10cSrcweir SwTableBox* pUpperBox = pBox->GetUpper()->GetUpper();
831cdf0e10cSrcweir
832cdf0e10cSrcweir // Sonderbehandlung fuer Umrandung:
833cdf0e10cSrcweir if( bCorrBorder && 1 < rTblBoxes.Count() )
834cdf0e10cSrcweir {
835cdf0e10cSrcweir sal_Bool bChgd = sal_False;
836cdf0e10cSrcweir const SvxBoxItem& rBoxItem = pBox->GetFrmFmt()->GetBox();
837cdf0e10cSrcweir
838cdf0e10cSrcweir if( rBoxItem.GetLeft() || rBoxItem.GetRight() )
839cdf0e10cSrcweir {
840cdf0e10cSrcweir //JP 02.04.97: 1.Teil fuer Bug 36271
841cdf0e10cSrcweir // zuerst die linken/rechten Kanten
842cdf0e10cSrcweir if( nDelPos + 1 < rTblBoxes.Count() )
843cdf0e10cSrcweir {
844cdf0e10cSrcweir SwTableBox* pNxtBox = rTblBoxes[ nDelPos + 1 ];
845cdf0e10cSrcweir const SvxBoxItem& rNxtBoxItem = pNxtBox->GetFrmFmt()->GetBox();
846cdf0e10cSrcweir
847cdf0e10cSrcweir SwTableBox* pPrvBox = nDelPos ? rTblBoxes[ nDelPos - 1 ] : 0;
848cdf0e10cSrcweir
849cdf0e10cSrcweir if( pNxtBox->GetSttNd() && !rNxtBoxItem.GetLeft() &&
850cdf0e10cSrcweir ( !pPrvBox || !pPrvBox->GetFrmFmt()->GetBox().GetRight()) )
851cdf0e10cSrcweir {
852cdf0e10cSrcweir SvxBoxItem aTmp( rNxtBoxItem );
853cdf0e10cSrcweir aTmp.SetLine( rBoxItem.GetLeft() ? rBoxItem.GetLeft()
854cdf0e10cSrcweir : rBoxItem.GetRight(),
855cdf0e10cSrcweir BOX_LINE_LEFT );
856cdf0e10cSrcweir if( pShareFmts )
857cdf0e10cSrcweir pShareFmts->SetAttr( *pNxtBox, aTmp );
858cdf0e10cSrcweir else
859cdf0e10cSrcweir pNxtBox->ClaimFrmFmt()->SetFmtAttr( aTmp );
860cdf0e10cSrcweir bChgd = sal_True;
861cdf0e10cSrcweir }
862cdf0e10cSrcweir }
863cdf0e10cSrcweir if( !bChgd && nDelPos )
864cdf0e10cSrcweir {
865cdf0e10cSrcweir SwTableBox* pPrvBox = rTblBoxes[ nDelPos - 1 ];
866cdf0e10cSrcweir const SvxBoxItem& rPrvBoxItem = pPrvBox->GetFrmFmt()->GetBox();
867cdf0e10cSrcweir
868cdf0e10cSrcweir SwTableBox* pNxtBox = nDelPos + 1 < rTblBoxes.Count()
869cdf0e10cSrcweir ? rTblBoxes[ nDelPos + 1 ] : 0;
870cdf0e10cSrcweir
871cdf0e10cSrcweir if( pPrvBox->GetSttNd() && !rPrvBoxItem.GetRight() &&
872cdf0e10cSrcweir ( !pNxtBox || !pNxtBox->GetFrmFmt()->GetBox().GetLeft()) )
873cdf0e10cSrcweir {
874cdf0e10cSrcweir SvxBoxItem aTmp( rPrvBoxItem );
875cdf0e10cSrcweir aTmp.SetLine( rBoxItem.GetLeft() ? rBoxItem.GetLeft()
876cdf0e10cSrcweir : rBoxItem.GetRight(),
877cdf0e10cSrcweir BOX_LINE_RIGHT );
878cdf0e10cSrcweir if( pShareFmts )
879cdf0e10cSrcweir pShareFmts->SetAttr( *pPrvBox, aTmp );
880cdf0e10cSrcweir else
881cdf0e10cSrcweir pPrvBox->ClaimFrmFmt()->SetFmtAttr( aTmp );
882cdf0e10cSrcweir }
883cdf0e10cSrcweir }
884cdf0e10cSrcweir }
885cdf0e10cSrcweir
886cdf0e10cSrcweir }
887cdf0e10cSrcweir
888cdf0e10cSrcweir // erst die Box, dann die Nodes loeschen!!
889cdf0e10cSrcweir SwStartNode* pSttNd = (SwStartNode*)pBox->GetSttNd();
890cdf0e10cSrcweir if( pShareFmts )
891cdf0e10cSrcweir pShareFmts->RemoveFormat( *rTblBoxes[ nDelPos ]->GetFrmFmt() );
892cdf0e10cSrcweir rTblBoxes.DeleteAndDestroy( nDelPos );
893cdf0e10cSrcweir
894cdf0e10cSrcweir if( pSttNd )
895cdf0e10cSrcweir {
896cdf0e10cSrcweir // ist das UndoObject zum speichern der Section vorbereitet?
897cdf0e10cSrcweir if( pUndo && pUndo->IsDelBox() )
898cdf0e10cSrcweir ((SwUndoTblNdsChg*)pUndo)->SaveSection( pSttNd );
899cdf0e10cSrcweir else
900cdf0e10cSrcweir pSttNd->GetDoc()->DeleteSection( pSttNd );
901cdf0e10cSrcweir }
902cdf0e10cSrcweir
903cdf0e10cSrcweir // auch die Zeile noch loeschen ??
904cdf0e10cSrcweir if( rTblBoxes.Count() )
905cdf0e10cSrcweir {
906cdf0e10cSrcweir // dann passe noch die Frame-SSize an
907cdf0e10cSrcweir sal_Bool bLastBox = nDelPos == rTblBoxes.Count();
908cdf0e10cSrcweir if( bLastBox )
909cdf0e10cSrcweir --nDelPos;
910cdf0e10cSrcweir pBox = rTblBoxes[nDelPos];
911cdf0e10cSrcweir if( bCalcNewSize )
912cdf0e10cSrcweir {
913cdf0e10cSrcweir SwFmtFrmSize aNew( pBox->GetFrmFmt()->GetFrmSize() );
914cdf0e10cSrcweir aNew.SetWidth( aNew.GetWidth() + nBoxSz );
915cdf0e10cSrcweir if( pShareFmts )
916cdf0e10cSrcweir pShareFmts->SetSize( *pBox, aNew );
917cdf0e10cSrcweir else
918cdf0e10cSrcweir pBox->ClaimFrmFmt()->SetFmtAttr( aNew );
919cdf0e10cSrcweir
920cdf0e10cSrcweir if( !pBox->GetSttNd() )
921cdf0e10cSrcweir {
922cdf0e10cSrcweir // dann muss es auch rekursiv in allen Zeilen, in allen
923cdf0e10cSrcweir // Zellen erfolgen!
924cdf0e10cSrcweir SwShareBoxFmts aShareFmts;
925cdf0e10cSrcweir ::lcl_LastBoxSetWidthLine( pBox->GetTabLines(), nBoxSz,
926cdf0e10cSrcweir !bLastBox,
927cdf0e10cSrcweir pShareFmts ? *pShareFmts
928cdf0e10cSrcweir : aShareFmts );
929cdf0e10cSrcweir }
930cdf0e10cSrcweir }
931cdf0e10cSrcweir break; // nichts mehr loeschen
932cdf0e10cSrcweir }
933cdf0e10cSrcweir // loesche die Line aus Tabelle/Box
934cdf0e10cSrcweir if( !pUpperBox )
935cdf0e10cSrcweir {
936cdf0e10cSrcweir // dann loesche auch noch die Line aus der Tabelle
937cdf0e10cSrcweir nDelPos = rTbl.GetTabLines().C40_GETPOS( SwTableLine, pLine );
938cdf0e10cSrcweir if( pShareFmts )
939cdf0e10cSrcweir pShareFmts->RemoveFormat( *rTbl.GetTabLines()[ nDelPos ]->GetFrmFmt() );
940cdf0e10cSrcweir rTbl.GetTabLines().DeleteAndDestroy( nDelPos );
941cdf0e10cSrcweir break; // mehr kann nicht geloescht werden
942cdf0e10cSrcweir }
943cdf0e10cSrcweir
944cdf0e10cSrcweir // dann loesche auch noch die Line
945cdf0e10cSrcweir pBox = pUpperBox;
946cdf0e10cSrcweir nDelPos = pBox->GetTabLines().C40_GETPOS( SwTableLine, pLine );
947cdf0e10cSrcweir if( pShareFmts )
948cdf0e10cSrcweir pShareFmts->RemoveFormat( *pBox->GetTabLines()[ nDelPos ]->GetFrmFmt() );
949cdf0e10cSrcweir pBox->GetTabLines().DeleteAndDestroy( nDelPos );
950cdf0e10cSrcweir } while( !pBox->GetTabLines().Count() );
951cdf0e10cSrcweir }
952cdf0e10cSrcweir
lcl_FndNxtPrvDelBox(const SwTableLines & rTblLns,SwTwips nBoxStt,SwTwips nBoxWidth,sal_uInt16 nLinePos,sal_Bool bNxt,SwSelBoxes * pAllDelBoxes,sal_uInt16 * pCurPos)953cdf0e10cSrcweir SwTableBox* lcl_FndNxtPrvDelBox( const SwTableLines& rTblLns,
954cdf0e10cSrcweir SwTwips nBoxStt, SwTwips nBoxWidth,
955cdf0e10cSrcweir sal_uInt16 nLinePos, sal_Bool bNxt,
956cdf0e10cSrcweir SwSelBoxes* pAllDelBoxes, sal_uInt16* pCurPos )
957cdf0e10cSrcweir {
958cdf0e10cSrcweir SwTableBox* pFndBox = 0;
959cdf0e10cSrcweir do {
960cdf0e10cSrcweir if( bNxt )
961cdf0e10cSrcweir ++nLinePos;
962cdf0e10cSrcweir else
963cdf0e10cSrcweir --nLinePos;
964cdf0e10cSrcweir SwTableLine* pLine = rTblLns[ nLinePos ];
965cdf0e10cSrcweir SwTwips nFndBoxWidth = 0;
966cdf0e10cSrcweir SwTwips nFndWidth = nBoxStt + nBoxWidth;
967cdf0e10cSrcweir sal_uInt16 nBoxCnt = pLine->GetTabBoxes().Count();
968cdf0e10cSrcweir
969cdf0e10cSrcweir pFndBox = pLine->GetTabBoxes()[ 0 ];
970cdf0e10cSrcweir for( sal_uInt16 n = 0; 0 < nFndWidth && n < nBoxCnt; ++n )
971cdf0e10cSrcweir {
972cdf0e10cSrcweir pFndBox = pLine->GetTabBoxes()[ n ];
973cdf0e10cSrcweir nFndWidth -= (nFndBoxWidth = pFndBox->GetFrmFmt()->
974cdf0e10cSrcweir GetFrmSize().GetWidth());
975cdf0e10cSrcweir }
976cdf0e10cSrcweir
977cdf0e10cSrcweir // suche die erste ContentBox
978cdf0e10cSrcweir while( !pFndBox->GetSttNd() )
979cdf0e10cSrcweir {
980cdf0e10cSrcweir const SwTableLines& rLowLns = pFndBox->GetTabLines();
981cdf0e10cSrcweir if( bNxt )
982cdf0e10cSrcweir pFndBox = rLowLns[ 0 ]->GetTabBoxes()[ 0 ];
983cdf0e10cSrcweir else
984cdf0e10cSrcweir pFndBox = rLowLns[ rLowLns.Count() - 1 ]->GetTabBoxes()[ 0 ];
985cdf0e10cSrcweir }
986cdf0e10cSrcweir
987cdf0e10cSrcweir if( Abs( nFndWidth ) > COLFUZZY ||
988cdf0e10cSrcweir Abs( nBoxWidth - nFndBoxWidth ) > COLFUZZY )
989cdf0e10cSrcweir pFndBox = 0;
990cdf0e10cSrcweir else if( pAllDelBoxes )
991cdf0e10cSrcweir {
992cdf0e10cSrcweir // falls der Vorganger auch geloscht wird, ist nicht zu tun
993cdf0e10cSrcweir sal_uInt16 nFndPos;
994cdf0e10cSrcweir if( !pAllDelBoxes->Seek_Entry( pFndBox, &nFndPos ) )
995cdf0e10cSrcweir break;
996cdf0e10cSrcweir
997cdf0e10cSrcweir // sonst noch mal weitersuchen
998cdf0e10cSrcweir // Die Box muessen wir aber nicht nochmal abpruefen
999cdf0e10cSrcweir pFndBox = 0;
1000cdf0e10cSrcweir if( nFndPos <= *pCurPos )
1001cdf0e10cSrcweir --*pCurPos;
1002cdf0e10cSrcweir pAllDelBoxes->Remove( nFndPos );
1003cdf0e10cSrcweir }
1004cdf0e10cSrcweir } while( bNxt ? ( nLinePos + 1 < rTblLns.Count() ) : nLinePos );
1005cdf0e10cSrcweir return pFndBox;
1006cdf0e10cSrcweir }
1007cdf0e10cSrcweir
lcl_SaveUpperLowerBorder(SwTable & rTbl,const SwTableBox & rBox,SwShareBoxFmts & rShareFmts,SwSelBoxes * pAllDelBoxes=0,sal_uInt16 * pCurPos=0)1008cdf0e10cSrcweir void lcl_SaveUpperLowerBorder( SwTable& rTbl, const SwTableBox& rBox,
1009cdf0e10cSrcweir SwShareBoxFmts& rShareFmts,
1010cdf0e10cSrcweir SwSelBoxes* pAllDelBoxes = 0,
1011cdf0e10cSrcweir sal_uInt16* pCurPos = 0 )
1012cdf0e10cSrcweir {
1013cdf0e10cSrcweir //JP 16.04.97: 2.Teil fuer Bug 36271
1014cdf0e10cSrcweir sal_Bool bChgd = sal_False;
1015cdf0e10cSrcweir const SwTableLine* pLine = rBox.GetUpper();
1016cdf0e10cSrcweir const SwTableBoxes& rTblBoxes = pLine->GetTabBoxes();
1017cdf0e10cSrcweir const SwTableBox* pUpperBox = &rBox;
1018cdf0e10cSrcweir sal_uInt16 nDelPos = rTblBoxes.C40_GETPOS( SwTableBox, pUpperBox );
1019cdf0e10cSrcweir pUpperBox = rBox.GetUpper()->GetUpper();
1020cdf0e10cSrcweir const SvxBoxItem& rBoxItem = rBox.GetFrmFmt()->GetBox();
1021cdf0e10cSrcweir
1022cdf0e10cSrcweir // dann die unteren/oberen Kanten
1023cdf0e10cSrcweir if( rBoxItem.GetTop() || rBoxItem.GetBottom() )
1024cdf0e10cSrcweir {
1025cdf0e10cSrcweir bChgd = sal_False;
1026cdf0e10cSrcweir const SwTableLines* pTblLns;
1027cdf0e10cSrcweir if( pUpperBox )
1028cdf0e10cSrcweir pTblLns = &pUpperBox->GetTabLines();
1029cdf0e10cSrcweir else
1030cdf0e10cSrcweir pTblLns = &rTbl.GetTabLines();
1031cdf0e10cSrcweir
1032cdf0e10cSrcweir sal_uInt16 nLnPos = pTblLns->GetPos( pLine );
1033cdf0e10cSrcweir
1034cdf0e10cSrcweir // bestimme die Attr.Position der akt. zu loeschenden Box
1035cdf0e10cSrcweir // und suche dann in der unteren / oberen Line die entspr.
1036cdf0e10cSrcweir // Gegenstuecke
1037cdf0e10cSrcweir SwTwips nBoxStt = 0;
1038cdf0e10cSrcweir for( sal_uInt16 n = 0; n < nDelPos; ++n )
1039cdf0e10cSrcweir nBoxStt += rTblBoxes[ n ]->GetFrmFmt()->GetFrmSize().GetWidth();
1040cdf0e10cSrcweir SwTwips nBoxWidth = rBox.GetFrmFmt()->GetFrmSize().GetWidth();
1041cdf0e10cSrcweir
1042cdf0e10cSrcweir SwTableBox *pPrvBox = 0, *pNxtBox = 0;
1043cdf0e10cSrcweir if( nLnPos ) // Vorgaenger?
1044cdf0e10cSrcweir pPrvBox = ::lcl_FndNxtPrvDelBox( *pTblLns, nBoxStt, nBoxWidth,
1045cdf0e10cSrcweir nLnPos, sal_False, pAllDelBoxes, pCurPos );
1046cdf0e10cSrcweir
1047cdf0e10cSrcweir if( nLnPos + 1 < pTblLns->Count() ) // Nachfolger?
1048cdf0e10cSrcweir pNxtBox = ::lcl_FndNxtPrvDelBox( *pTblLns, nBoxStt, nBoxWidth,
1049cdf0e10cSrcweir nLnPos, sal_True, pAllDelBoxes, pCurPos );
1050cdf0e10cSrcweir
1051cdf0e10cSrcweir if( pNxtBox && pNxtBox->GetSttNd() )
1052cdf0e10cSrcweir {
1053cdf0e10cSrcweir const SvxBoxItem& rNxtBoxItem = pNxtBox->GetFrmFmt()->GetBox();
1054cdf0e10cSrcweir if( !rNxtBoxItem.GetTop() && ( !pPrvBox ||
1055cdf0e10cSrcweir !pPrvBox->GetFrmFmt()->GetBox().GetBottom()) )
1056cdf0e10cSrcweir {
1057cdf0e10cSrcweir SvxBoxItem aTmp( rNxtBoxItem );
1058cdf0e10cSrcweir aTmp.SetLine( rBoxItem.GetTop() ? rBoxItem.GetTop()
1059cdf0e10cSrcweir : rBoxItem.GetBottom(),
1060cdf0e10cSrcweir BOX_LINE_TOP );
1061cdf0e10cSrcweir rShareFmts.SetAttr( *pNxtBox, aTmp );
1062cdf0e10cSrcweir bChgd = sal_True;
1063cdf0e10cSrcweir }
1064cdf0e10cSrcweir }
1065cdf0e10cSrcweir if( !bChgd && pPrvBox && pPrvBox->GetSttNd() )
1066cdf0e10cSrcweir {
1067cdf0e10cSrcweir const SvxBoxItem& rPrvBoxItem = pPrvBox->GetFrmFmt()->GetBox();
1068cdf0e10cSrcweir if( !rPrvBoxItem.GetTop() && ( !pNxtBox ||
1069cdf0e10cSrcweir !pNxtBox->GetFrmFmt()->GetBox().GetTop()) )
1070cdf0e10cSrcweir {
1071cdf0e10cSrcweir SvxBoxItem aTmp( rPrvBoxItem );
1072cdf0e10cSrcweir aTmp.SetLine( rBoxItem.GetTop() ? rBoxItem.GetTop()
1073cdf0e10cSrcweir : rBoxItem.GetBottom(),
1074cdf0e10cSrcweir BOX_LINE_BOTTOM );
1075cdf0e10cSrcweir rShareFmts.SetAttr( *pPrvBox, aTmp );
1076cdf0e10cSrcweir }
1077cdf0e10cSrcweir }
1078cdf0e10cSrcweir
1079cdf0e10cSrcweir }
1080cdf0e10cSrcweir }
1081cdf0e10cSrcweir
1082cdf0e10cSrcweir
DeleteSel(SwDoc * pDoc,const SwSelBoxes & rBoxes,const SwSelBoxes * pMerged,SwUndo * pUndo,const sal_Bool bDelMakeFrms,const sal_Bool bCorrBorder)1083cdf0e10cSrcweir sal_Bool SwTable::DeleteSel(
1084cdf0e10cSrcweir SwDoc* pDoc
1085cdf0e10cSrcweir ,
1086cdf0e10cSrcweir const SwSelBoxes& rBoxes,
1087cdf0e10cSrcweir const SwSelBoxes* pMerged, SwUndo* pUndo,
1088cdf0e10cSrcweir const sal_Bool bDelMakeFrms, const sal_Bool bCorrBorder )
1089cdf0e10cSrcweir {
1090cdf0e10cSrcweir ASSERT( pDoc, "No doc?" );
1091cdf0e10cSrcweir SwTableNode* pTblNd = 0;
1092cdf0e10cSrcweir if( rBoxes.Count() )
1093cdf0e10cSrcweir {
1094cdf0e10cSrcweir pTblNd = (SwTableNode*)rBoxes[0]->GetSttNd()->FindTableNode();
1095cdf0e10cSrcweir if( !pTblNd )
1096cdf0e10cSrcweir return sal_False;
1097cdf0e10cSrcweir }
1098cdf0e10cSrcweir
1099cdf0e10cSrcweir SetHTMLTableLayout( 0 ); // MIB 9.7.97: HTML-Layout loeschen
1100cdf0e10cSrcweir
1101cdf0e10cSrcweir //Lines fuer das Layout-Update herausuchen.
1102cdf0e10cSrcweir _FndBox aFndBox( 0, 0 );
1103cdf0e10cSrcweir if ( bDelMakeFrms )
1104cdf0e10cSrcweir {
1105cdf0e10cSrcweir if( pMerged && pMerged->Count() )
1106cdf0e10cSrcweir aFndBox.SetTableLines( *pMerged, *this );
1107cdf0e10cSrcweir else if( rBoxes.Count() )
1108cdf0e10cSrcweir aFndBox.SetTableLines( rBoxes, *this );
1109cdf0e10cSrcweir aFndBox.DelFrms( *this );
1110cdf0e10cSrcweir }
1111cdf0e10cSrcweir
1112cdf0e10cSrcweir SwShareBoxFmts aShareFmts;
1113cdf0e10cSrcweir
1114cdf0e10cSrcweir // erst die Umrandung umsetzen, dann loeschen
1115cdf0e10cSrcweir if( bCorrBorder )
1116cdf0e10cSrcweir {
1117cdf0e10cSrcweir SwSelBoxes aBoxes;
1118cdf0e10cSrcweir aBoxes.Insert( &rBoxes );
1119cdf0e10cSrcweir for( sal_uInt16 n = 0; n < aBoxes.Count(); ++n )
1120cdf0e10cSrcweir ::lcl_SaveUpperLowerBorder( *this, *rBoxes[ n ], aShareFmts,
1121cdf0e10cSrcweir &aBoxes, &n );
1122cdf0e10cSrcweir }
1123cdf0e10cSrcweir
1124cdf0e10cSrcweir PrepareDelBoxes( rBoxes );
1125cdf0e10cSrcweir
1126cdf0e10cSrcweir SwChartDataProvider *pPCD = pDoc->GetChartDataProvider();
1127cdf0e10cSrcweir //
1128cdf0e10cSrcweir // delete boxes from last to first
1129cdf0e10cSrcweir for( sal_uInt16 n = 0; n < rBoxes.Count(); ++n )
1130cdf0e10cSrcweir {
1131cdf0e10cSrcweir sal_uInt16 nIdx = rBoxes.Count() - 1 - n;
1132cdf0e10cSrcweir
1133cdf0e10cSrcweir // first adapt the data-sequence for chart if necessary
1134cdf0e10cSrcweir // (needed to move the implementation cursor properly to it's new
1135cdf0e10cSrcweir // position which can't be done properly if the cell is already gone)
1136cdf0e10cSrcweir if (pPCD && pTblNd)
1137cdf0e10cSrcweir pPCD->DeleteBox( &pTblNd->GetTable(), *rBoxes[nIdx] );
1138cdf0e10cSrcweir
1139cdf0e10cSrcweir // ... then delete the boxes
1140cdf0e10cSrcweir _DeleteBox( *this, rBoxes[nIdx], pUndo, sal_True, bCorrBorder, &aShareFmts );
1141cdf0e10cSrcweir }
1142cdf0e10cSrcweir
1143cdf0e10cSrcweir // dann raeume die Struktur aller Lines auf
1144cdf0e10cSrcweir GCLines();
1145cdf0e10cSrcweir
1146cdf0e10cSrcweir if( bDelMakeFrms && aFndBox.AreLinesToRestore( *this ) )
1147cdf0e10cSrcweir aFndBox.MakeFrms( *this );
1148cdf0e10cSrcweir
1149cdf0e10cSrcweir // TL_CHART2: now inform chart that sth has changed
1150cdf0e10cSrcweir pDoc->UpdateCharts( GetFrmFmt()->GetName() );
1151cdf0e10cSrcweir
1152cdf0e10cSrcweir CHECKTABLELAYOUT
1153cdf0e10cSrcweir CHECK_TABLE( *this )
1154cdf0e10cSrcweir
1155cdf0e10cSrcweir return sal_True;
1156cdf0e10cSrcweir }
1157cdf0e10cSrcweir
1158cdf0e10cSrcweir
1159cdf0e10cSrcweir // ---------------------------------------------------------------
1160cdf0e10cSrcweir
OldSplitRow(SwDoc * pDoc,const SwSelBoxes & rBoxes,sal_uInt16 nCnt,sal_Bool bSameHeight)1161cdf0e10cSrcweir sal_Bool SwTable::OldSplitRow( SwDoc* pDoc, const SwSelBoxes& rBoxes, sal_uInt16 nCnt,
1162cdf0e10cSrcweir sal_Bool bSameHeight )
1163cdf0e10cSrcweir {
1164cdf0e10cSrcweir ASSERT( pDoc && rBoxes.Count() && nCnt, "keine gueltigen Werte" );
1165cdf0e10cSrcweir SwTableNode* pTblNd = (SwTableNode*)rBoxes[0]->GetSttNd()->FindTableNode();
1166cdf0e10cSrcweir if( !pTblNd )
1167cdf0e10cSrcweir return sal_False;
1168cdf0e10cSrcweir
1169cdf0e10cSrcweir // TL_CHART2: splitting/merging of a number of cells or rows will usually make
1170cdf0e10cSrcweir // the table to complex to be handled with chart.
1171cdf0e10cSrcweir // Thus we tell the charts to use their own data provider and forget about this table
1172cdf0e10cSrcweir pDoc->CreateChartInternalDataProviders( this );
1173cdf0e10cSrcweir
1174cdf0e10cSrcweir SetHTMLTableLayout( 0 ); // MIB 9.7.97: HTML-Layout loeschen
1175cdf0e10cSrcweir
1176cdf0e10cSrcweir // If the rows should get the same (min) height, we first have
1177cdf0e10cSrcweir // to store the old row heights before deleting the frames
1178cdf0e10cSrcweir long* pRowHeights = 0;
1179cdf0e10cSrcweir if ( bSameHeight )
1180cdf0e10cSrcweir {
1181cdf0e10cSrcweir pRowHeights = new long[ rBoxes.Count() ];
1182cdf0e10cSrcweir for( sal_uInt16 n = 0; n < rBoxes.Count(); ++n )
1183cdf0e10cSrcweir {
1184cdf0e10cSrcweir SwTableBox* pSelBox = *( rBoxes.GetData() + n );
1185cdf0e10cSrcweir const SwRowFrm* pRow = GetRowFrm( *pSelBox->GetUpper() );
1186cdf0e10cSrcweir ASSERT( pRow, "wo ist der Frm von der SwTableLine?" )
1187cdf0e10cSrcweir SWRECTFN( pRow )
1188cdf0e10cSrcweir pRowHeights[ n ] = (pRow->Frm().*fnRect->fnGetHeight)();
1189cdf0e10cSrcweir }
1190cdf0e10cSrcweir }
1191cdf0e10cSrcweir
1192cdf0e10cSrcweir //Lines fuer das Layout-Update herausuchen.
1193cdf0e10cSrcweir _FndBox aFndBox( 0, 0 );
1194cdf0e10cSrcweir aFndBox.SetTableLines( rBoxes, *this );
1195cdf0e10cSrcweir aFndBox.DelFrms( *this );
1196cdf0e10cSrcweir
1197cdf0e10cSrcweir for( sal_uInt16 n = 0; n < rBoxes.Count(); ++n )
1198cdf0e10cSrcweir {
1199cdf0e10cSrcweir SwTableBox* pSelBox = *( rBoxes.GetData() + n );
1200cdf0e10cSrcweir ASSERT( pSelBox, "Box steht nicht in der Tabelle" );
1201cdf0e10cSrcweir
1202cdf0e10cSrcweir // dann fuege in die Box nCnt neue Zeilen ein
1203cdf0e10cSrcweir SwTableLine* pInsLine = pSelBox->GetUpper();
1204cdf0e10cSrcweir SwTableBoxFmt* pFrmFmt = (SwTableBoxFmt*)pSelBox->GetFrmFmt();
1205cdf0e10cSrcweir
1206cdf0e10cSrcweir // Hoehe der Line beachten, gegebenenfalls neu setzen
1207cdf0e10cSrcweir SwFmtFrmSize aFSz( pInsLine->GetFrmFmt()->GetFrmSize() );
1208cdf0e10cSrcweir if ( bSameHeight && ATT_VAR_SIZE == aFSz.GetHeightSizeType() )
1209cdf0e10cSrcweir aFSz.SetHeightSizeType( ATT_MIN_SIZE );
1210cdf0e10cSrcweir
1211cdf0e10cSrcweir sal_Bool bChgLineSz = 0 != aFSz.GetHeight() || bSameHeight;
1212cdf0e10cSrcweir if ( bChgLineSz )
1213cdf0e10cSrcweir aFSz.SetHeight( ( bSameHeight ? pRowHeights[ n ] : aFSz.GetHeight() ) /
1214cdf0e10cSrcweir (nCnt + 1) );
1215cdf0e10cSrcweir
1216cdf0e10cSrcweir SwTableBox* pNewBox = new SwTableBox( pFrmFmt, nCnt, pInsLine );
1217cdf0e10cSrcweir sal_uInt16 nBoxPos = pInsLine->GetTabBoxes().C40_GETPOS( SwTableBox, pSelBox );
1218cdf0e10cSrcweir pInsLine->GetTabBoxes().Remove( nBoxPos ); // alte loeschen
1219cdf0e10cSrcweir pInsLine->GetTabBoxes().C40_INSERT( SwTableBox, pNewBox, nBoxPos );
1220cdf0e10cSrcweir
1221cdf0e10cSrcweir // Hintergrund- / Rand Attribut loeschen
1222cdf0e10cSrcweir SwTableBox* pLastBox = pSelBox; // zum verteilen der TextNodes !!
1223cdf0e10cSrcweir // sollte Bereiche in der Box stehen, dann bleibt sie so bestehen
1224cdf0e10cSrcweir // !! FALLS DAS GEAENDERT WIRD MUSS DAS UNDO ANGEPASST WERDEN !!!
1225cdf0e10cSrcweir sal_Bool bMoveNodes = sal_True;
1226cdf0e10cSrcweir {
1227cdf0e10cSrcweir sal_uLong nSttNd = pLastBox->GetSttIdx() + 1,
1228cdf0e10cSrcweir nEndNd = pLastBox->GetSttNd()->EndOfSectionIndex();
1229cdf0e10cSrcweir while( nSttNd < nEndNd )
1230cdf0e10cSrcweir if( !pDoc->GetNodes()[ nSttNd++ ]->IsTxtNode() )
1231cdf0e10cSrcweir {
1232cdf0e10cSrcweir bMoveNodes = sal_False;
1233cdf0e10cSrcweir break;
1234cdf0e10cSrcweir }
1235cdf0e10cSrcweir }
1236cdf0e10cSrcweir
1237cdf0e10cSrcweir SwTableBoxFmt* pCpyBoxFrmFmt = (SwTableBoxFmt*)pSelBox->GetFrmFmt();
1238cdf0e10cSrcweir sal_Bool bChkBorder = 0 != pCpyBoxFrmFmt->GetBox().GetTop();
1239cdf0e10cSrcweir if( bChkBorder )
1240cdf0e10cSrcweir pCpyBoxFrmFmt = (SwTableBoxFmt*)pSelBox->ClaimFrmFmt();
1241cdf0e10cSrcweir
1242cdf0e10cSrcweir for( sal_uInt16 i = 0; i <= nCnt; ++i )
1243cdf0e10cSrcweir {
1244cdf0e10cSrcweir // also erstmal eine neue Linie in der neuen Box
1245cdf0e10cSrcweir SwTableLine* pNewLine = new SwTableLine(
1246cdf0e10cSrcweir (SwTableLineFmt*)pInsLine->GetFrmFmt(), 1, pNewBox );
1247cdf0e10cSrcweir if( bChgLineSz )
1248cdf0e10cSrcweir {
1249cdf0e10cSrcweir pNewLine->ClaimFrmFmt()->SetFmtAttr( aFSz );
1250cdf0e10cSrcweir }
1251cdf0e10cSrcweir
1252cdf0e10cSrcweir pNewBox->GetTabLines().C40_INSERT( SwTableLine, pNewLine, i );
1253cdf0e10cSrcweir // dann eine neue Box in der Line
1254cdf0e10cSrcweir if( !i ) // haenge die originale Box ein
1255cdf0e10cSrcweir {
1256cdf0e10cSrcweir pSelBox->SetUpper( pNewLine );
1257cdf0e10cSrcweir pNewLine->GetTabBoxes().C40_INSERT( SwTableBox, pSelBox, 0 );
1258cdf0e10cSrcweir }
1259cdf0e10cSrcweir else
1260cdf0e10cSrcweir {
1261cdf0e10cSrcweir ::_InsTblBox( pDoc, pTblNd, pNewLine, pCpyBoxFrmFmt,
1262cdf0e10cSrcweir pLastBox, 0 );
1263cdf0e10cSrcweir
1264cdf0e10cSrcweir if( bChkBorder )
1265cdf0e10cSrcweir {
1266cdf0e10cSrcweir pCpyBoxFrmFmt = (SwTableBoxFmt*)pNewLine->GetTabBoxes()[ 0 ]->ClaimFrmFmt();
1267cdf0e10cSrcweir SvxBoxItem aTmp( pCpyBoxFrmFmt->GetBox() );
1268cdf0e10cSrcweir aTmp.SetLine( 0, BOX_LINE_TOP );
1269cdf0e10cSrcweir pCpyBoxFrmFmt->SetFmtAttr( aTmp );
1270cdf0e10cSrcweir bChkBorder = sal_False;
1271cdf0e10cSrcweir }
1272cdf0e10cSrcweir
1273cdf0e10cSrcweir if( bMoveNodes )
1274cdf0e10cSrcweir {
1275cdf0e10cSrcweir const SwNode* pEndNd = pLastBox->GetSttNd()->EndOfSectionNode();
1276cdf0e10cSrcweir if( pLastBox->GetSttIdx()+2 != pEndNd->GetIndex() )
1277cdf0e10cSrcweir {
1278cdf0e10cSrcweir // TextNodes verschieben
1279cdf0e10cSrcweir SwNodeRange aRg( *pLastBox->GetSttNd(), +2, *pEndNd );
1280cdf0e10cSrcweir pLastBox = pNewLine->GetTabBoxes()[0]; // neu setzen
1281cdf0e10cSrcweir SwNodeIndex aInsPos( *pLastBox->GetSttNd(), 1 );
1282cdf0e10cSrcweir pDoc->GetNodes()._MoveNodes(aRg, pDoc->GetNodes(), aInsPos, sal_False);
1283cdf0e10cSrcweir pDoc->GetNodes().Delete( aInsPos, 1 ); // den leeren noch loeschen
1284cdf0e10cSrcweir }
1285cdf0e10cSrcweir }
1286cdf0e10cSrcweir }
1287cdf0e10cSrcweir }
1288cdf0e10cSrcweir // in Boxen mit Lines darf es nur noch Size/Fillorder geben
1289cdf0e10cSrcweir pFrmFmt = (SwTableBoxFmt*)pNewBox->ClaimFrmFmt();
1290cdf0e10cSrcweir pFrmFmt->ResetFmtAttr( RES_LR_SPACE, RES_FRMATR_END - 1 );
1291cdf0e10cSrcweir pFrmFmt->ResetFmtAttr( RES_BOXATR_BEGIN, RES_BOXATR_END - 1 );
1292cdf0e10cSrcweir }
1293cdf0e10cSrcweir
1294cdf0e10cSrcweir delete[] pRowHeights;
1295cdf0e10cSrcweir
1296cdf0e10cSrcweir GCLines();
1297cdf0e10cSrcweir
1298cdf0e10cSrcweir aFndBox.MakeFrms( *this );
1299cdf0e10cSrcweir
1300cdf0e10cSrcweir CHECKBOXWIDTH
1301cdf0e10cSrcweir CHECKTABLELAYOUT
1302cdf0e10cSrcweir return sal_True;
1303cdf0e10cSrcweir }
1304cdf0e10cSrcweir
SplitCol(SwDoc * pDoc,const SwSelBoxes & rBoxes,sal_uInt16 nCnt)1305cdf0e10cSrcweir sal_Bool SwTable::SplitCol( SwDoc* pDoc, const SwSelBoxes& rBoxes, sal_uInt16 nCnt )
1306cdf0e10cSrcweir {
1307cdf0e10cSrcweir ASSERT( pDoc && rBoxes.Count() && nCnt, "keine gueltigen Werte" );
1308cdf0e10cSrcweir SwTableNode* pTblNd = (SwTableNode*)rBoxes[0]->GetSttNd()->FindTableNode();
1309cdf0e10cSrcweir if( !pTblNd )
1310cdf0e10cSrcweir return sal_False;
1311cdf0e10cSrcweir
1312cdf0e10cSrcweir // TL_CHART2: splitting/merging of a number of cells or rows will usually make
1313cdf0e10cSrcweir // the table to complex to be handled with chart.
1314cdf0e10cSrcweir // Thus we tell the charts to use their own data provider and forget about this table
1315cdf0e10cSrcweir pDoc->CreateChartInternalDataProviders( this );
1316cdf0e10cSrcweir
1317cdf0e10cSrcweir SetHTMLTableLayout( 0 ); // MIB 9.7.97: HTML-Layout loeschen
1318cdf0e10cSrcweir SwSelBoxes aSelBoxes;
1319cdf0e10cSrcweir aSelBoxes.Insert(rBoxes.GetData(), rBoxes.Count());
1320cdf0e10cSrcweir ExpandSelection( aSelBoxes );
1321cdf0e10cSrcweir
1322cdf0e10cSrcweir //Lines fuer das Layout-Update herausuchen.
1323cdf0e10cSrcweir _FndBox aFndBox( 0, 0 );
1324cdf0e10cSrcweir aFndBox.SetTableLines( aSelBoxes, *this );
1325cdf0e10cSrcweir aFndBox.DelFrms( *this );
1326cdf0e10cSrcweir
1327cdf0e10cSrcweir _CpyTabFrms aFrmArr;
1328cdf0e10cSrcweir SvPtrarr aLastBoxArr;
1329cdf0e10cSrcweir sal_uInt16 nFndPos;
1330cdf0e10cSrcweir for( sal_uInt16 n = 0; n < aSelBoxes.Count(); ++n )
1331cdf0e10cSrcweir {
1332cdf0e10cSrcweir SwTableBox* pSelBox = *( aSelBoxes.GetData() + n );
1333cdf0e10cSrcweir ASSERT( pSelBox, "Box steht nicht in der Tabelle" );
1334cdf0e10cSrcweir
1335cdf0e10cSrcweir // We don't want to split small table cells into very very small cells
1336cdf0e10cSrcweir if( pSelBox->GetFrmFmt()->GetFrmSize().GetWidth()/( nCnt + 1 ) < 10 )
1337cdf0e10cSrcweir continue;
1338cdf0e10cSrcweir
1339cdf0e10cSrcweir // dann teile die Box nCnt in nCnt Boxen
1340cdf0e10cSrcweir SwTableLine* pInsLine = pSelBox->GetUpper();
1341cdf0e10cSrcweir sal_uInt16 nBoxPos = pInsLine->GetTabBoxes().C40_GETPOS( SwTableBox, pSelBox );
1342cdf0e10cSrcweir
1343cdf0e10cSrcweir // suche das FrmFmt im Array aller Frame-Formate
1344cdf0e10cSrcweir SwTableBoxFmt* pLastBoxFmt;
1345cdf0e10cSrcweir _CpyTabFrm aFindFrm( (SwTableBoxFmt*)pSelBox->GetFrmFmt() );
1346cdf0e10cSrcweir if( !aFrmArr.Seek_Entry( aFindFrm, &nFndPos ))
1347cdf0e10cSrcweir {
1348cdf0e10cSrcweir // aender das FrmFmt
1349cdf0e10cSrcweir aFindFrm.pNewFrmFmt = (SwTableBoxFmt*)pSelBox->ClaimFrmFmt();
1350cdf0e10cSrcweir SwTwips nBoxSz = aFindFrm.pNewFrmFmt->GetFrmSize().GetWidth();
1351cdf0e10cSrcweir SwTwips nNewBoxSz = nBoxSz / ( nCnt + 1 );
1352cdf0e10cSrcweir aFindFrm.pNewFrmFmt->SetFmtAttr( SwFmtFrmSize( ATT_VAR_SIZE,
1353cdf0e10cSrcweir nNewBoxSz, 0 ) );
1354cdf0e10cSrcweir aFrmArr.Insert( aFindFrm );
1355cdf0e10cSrcweir
1356cdf0e10cSrcweir pLastBoxFmt = aFindFrm.pNewFrmFmt;
1357cdf0e10cSrcweir if( nBoxSz != ( nNewBoxSz * (nCnt + 1)))
1358cdf0e10cSrcweir {
1359cdf0e10cSrcweir // es bleibt ein Rest, also muss fuer die letzte Box ein
1360cdf0e10cSrcweir // eigenes Format definiert werden
1361cdf0e10cSrcweir pLastBoxFmt = new SwTableBoxFmt( *aFindFrm.pNewFrmFmt );
1362cdf0e10cSrcweir pLastBoxFmt->SetFmtAttr( SwFmtFrmSize( ATT_VAR_SIZE,
1363cdf0e10cSrcweir nBoxSz - ( nNewBoxSz * nCnt ), 0 ) );
1364cdf0e10cSrcweir }
1365cdf0e10cSrcweir void* p = pLastBoxFmt;
1366cdf0e10cSrcweir aLastBoxArr.Insert( p, nFndPos );
1367cdf0e10cSrcweir }
1368cdf0e10cSrcweir else
1369cdf0e10cSrcweir {
1370cdf0e10cSrcweir aFindFrm = aFrmArr[ nFndPos ];
1371cdf0e10cSrcweir pSelBox->ChgFrmFmt( (SwTableBoxFmt*)aFindFrm.pNewFrmFmt );
1372cdf0e10cSrcweir pLastBoxFmt = (SwTableBoxFmt*)aLastBoxArr[ nFndPos ];
1373cdf0e10cSrcweir }
1374cdf0e10cSrcweir
1375cdf0e10cSrcweir // dann fuege mal an der Position die neuen Boxen ein
1376cdf0e10cSrcweir for( sal_uInt16 i = 1; i < nCnt; ++i )
1377cdf0e10cSrcweir ::_InsTblBox( pDoc, pTblNd, pInsLine, aFindFrm.pNewFrmFmt,
1378cdf0e10cSrcweir pSelBox, nBoxPos + i ); // dahinter einfuegen
1379cdf0e10cSrcweir
1380cdf0e10cSrcweir ::_InsTblBox( pDoc, pTblNd, pInsLine, pLastBoxFmt,
1381cdf0e10cSrcweir pSelBox, nBoxPos + nCnt ); // dahinter einfuegen
1382cdf0e10cSrcweir
1383cdf0e10cSrcweir // Sonderbehandlung fuer die Umrandung:
1384cdf0e10cSrcweir const SvxBoxItem& aSelBoxItem = aFindFrm.pNewFrmFmt->GetBox();
1385cdf0e10cSrcweir if( aSelBoxItem.GetRight() )
1386cdf0e10cSrcweir {
1387cdf0e10cSrcweir pInsLine->GetTabBoxes()[ nBoxPos + nCnt ]->ClaimFrmFmt();
1388cdf0e10cSrcweir
1389cdf0e10cSrcweir SvxBoxItem aTmp( aSelBoxItem );
1390cdf0e10cSrcweir aTmp.SetLine( 0, BOX_LINE_RIGHT );
1391cdf0e10cSrcweir aFindFrm.pNewFrmFmt->SetFmtAttr( aTmp );
1392cdf0e10cSrcweir
1393cdf0e10cSrcweir // und dann das Format aus dem "cache" entfernen
1394cdf0e10cSrcweir for( sal_uInt16 i = aFrmArr.Count(); i; )
1395cdf0e10cSrcweir {
1396cdf0e10cSrcweir const _CpyTabFrm& rCTF = aFrmArr[ --i ];
1397cdf0e10cSrcweir if( rCTF.pNewFrmFmt == aFindFrm.pNewFrmFmt ||
1398cdf0e10cSrcweir rCTF.Value.pFrmFmt == aFindFrm.pNewFrmFmt )
1399cdf0e10cSrcweir {
1400cdf0e10cSrcweir aFrmArr.Remove( i );
1401cdf0e10cSrcweir aLastBoxArr.Remove( i );
1402cdf0e10cSrcweir }
1403cdf0e10cSrcweir }
1404cdf0e10cSrcweir }
1405cdf0e10cSrcweir }
1406cdf0e10cSrcweir
1407cdf0e10cSrcweir //Layout updaten
1408cdf0e10cSrcweir aFndBox.MakeFrms( *this );
1409cdf0e10cSrcweir
1410cdf0e10cSrcweir CHECKBOXWIDTH
1411cdf0e10cSrcweir CHECKTABLELAYOUT
1412cdf0e10cSrcweir return sal_True;
1413cdf0e10cSrcweir }
1414cdf0e10cSrcweir
1415cdf0e10cSrcweir // ---------------------------------------------------------------
1416cdf0e10cSrcweir
1417cdf0e10cSrcweir /*
1418cdf0e10cSrcweir ----------------------- >> MERGE << ------------------------
1419cdf0e10cSrcweir Algorithmus:
1420cdf0e10cSrcweir ist in der _FndBox nur eine Line angegeben, nehme die Line
1421cdf0e10cSrcweir und teste die Anzahl der Boxen
1422cdf0e10cSrcweir - ist mehr als 1 Box angegeben, so wird auf Boxenebene zusammen-
1423cdf0e10cSrcweir gefasst, d.H. die neue Box wird so Breit wie die alten.
1424cdf0e10cSrcweir - Alle Lines die ueber/unter dem Bereich liegen werden in die
1425cdf0e10cSrcweir Box als Line + Box mit Lines eingefuegt
1426cdf0e10cSrcweir - Alle Lines die vor/hinter dem Bereich liegen werden in
1427cdf0e10cSrcweir die Boxen Left/Right eingetragen
1428cdf0e10cSrcweir
1429cdf0e10cSrcweir ----------------------- >> MERGE << ------------------------
1430cdf0e10cSrcweir */
1431cdf0e10cSrcweir
lcl_CpyLines(sal_uInt16 nStt,sal_uInt16 nEnd,SwTableLines & rLines,SwTableBox * pInsBox,sal_uInt16 nPos=USHRT_MAX)1432cdf0e10cSrcweir void lcl_CpyLines( sal_uInt16 nStt, sal_uInt16 nEnd,
1433cdf0e10cSrcweir SwTableLines& rLines,
1434cdf0e10cSrcweir SwTableBox* pInsBox,
1435cdf0e10cSrcweir sal_uInt16 nPos = USHRT_MAX )
1436cdf0e10cSrcweir {
1437cdf0e10cSrcweir for( sal_uInt16 n = nStt; n < nEnd; ++n )
1438cdf0e10cSrcweir rLines[n]->SetUpper( pInsBox );
1439cdf0e10cSrcweir if( USHRT_MAX == nPos )
1440cdf0e10cSrcweir nPos = pInsBox->GetTabLines().Count();
1441cdf0e10cSrcweir pInsBox->GetTabLines().Insert( &rLines, nPos, nStt, nEnd );
1442cdf0e10cSrcweir rLines.Remove( nStt, nEnd - nStt );
1443cdf0e10cSrcweir }
1444cdf0e10cSrcweir
lcl_CpyBoxes(sal_uInt16 nStt,sal_uInt16 nEnd,SwTableBoxes & rBoxes,SwTableLine * pInsLine,sal_uInt16 nPos=USHRT_MAX)1445cdf0e10cSrcweir void lcl_CpyBoxes( sal_uInt16 nStt, sal_uInt16 nEnd,
1446cdf0e10cSrcweir SwTableBoxes& rBoxes,
1447cdf0e10cSrcweir SwTableLine* pInsLine,
1448cdf0e10cSrcweir sal_uInt16 nPos = USHRT_MAX )
1449cdf0e10cSrcweir {
1450cdf0e10cSrcweir for( sal_uInt16 n = nStt; n < nEnd; ++n )
1451cdf0e10cSrcweir rBoxes[n]->SetUpper( pInsLine );
1452cdf0e10cSrcweir if( USHRT_MAX == nPos )
1453cdf0e10cSrcweir nPos = pInsLine->GetTabBoxes().Count();
1454cdf0e10cSrcweir pInsLine->GetTabBoxes().Insert( &rBoxes, nPos, nStt, nEnd );
1455cdf0e10cSrcweir rBoxes.Remove( nStt, nEnd - nStt );
1456cdf0e10cSrcweir }
1457cdf0e10cSrcweir
lcl_CalcWidth(SwTableBox * pBox)1458cdf0e10cSrcweir void lcl_CalcWidth( SwTableBox* pBox )
1459cdf0e10cSrcweir {
1460cdf0e10cSrcweir // Annahme: jede Line in der Box ist gleich gross
1461cdf0e10cSrcweir SwFrmFmt* pFmt = pBox->ClaimFrmFmt();
1462cdf0e10cSrcweir ASSERT( pBox->GetTabLines().Count(), "Box hat keine Lines" );
1463cdf0e10cSrcweir
1464cdf0e10cSrcweir SwTableLine* pLine = pBox->GetTabLines()[0];
1465cdf0e10cSrcweir ASSERT( pLine, "Box steht in keiner Line" );
1466cdf0e10cSrcweir
1467cdf0e10cSrcweir long nWidth = 0;
1468cdf0e10cSrcweir for( sal_uInt16 n = 0; n < pLine->GetTabBoxes().Count(); ++n )
1469cdf0e10cSrcweir nWidth += pLine->GetTabBoxes()[n]->GetFrmFmt()->GetFrmSize().GetWidth();
1470cdf0e10cSrcweir
1471cdf0e10cSrcweir pFmt->SetFmtAttr( SwFmtFrmSize( ATT_VAR_SIZE, nWidth, 0 ));
1472cdf0e10cSrcweir
1473cdf0e10cSrcweir // in Boxen mit Lines darf es nur noch Size/Fillorder geben
1474cdf0e10cSrcweir pFmt->ResetFmtAttr( RES_LR_SPACE, RES_FRMATR_END - 1 );
1475cdf0e10cSrcweir pFmt->ResetFmtAttr( RES_BOXATR_BEGIN, RES_BOXATR_END - 1 );
1476cdf0e10cSrcweir }
1477cdf0e10cSrcweir
1478cdf0e10cSrcweir
1479cdf0e10cSrcweir
1480cdf0e10cSrcweir struct _InsULPara
1481cdf0e10cSrcweir {
1482cdf0e10cSrcweir SwTableNode* pTblNd;
1483cdf0e10cSrcweir SwTableLine* pInsLine;
1484cdf0e10cSrcweir SwTableBox* pInsBox;
1485cdf0e10cSrcweir sal_Bool bUL_LR : 1; // Upper-Lower(sal_True) oder Left-Right(sal_False) ?
1486cdf0e10cSrcweir sal_Bool bUL : 1; // Upper-Left(sal_True) oder Lower-Right(sal_False) ?
1487cdf0e10cSrcweir
1488cdf0e10cSrcweir SwTableBox* pLeftBox;
1489cdf0e10cSrcweir SwTableBox* pRightBox;
1490cdf0e10cSrcweir SwTableBox* pMergeBox;
1491cdf0e10cSrcweir
_InsULPara_InsULPara1492cdf0e10cSrcweir _InsULPara( SwTableNode* pTNd, sal_Bool bUpperLower, sal_Bool bUpper,
1493cdf0e10cSrcweir SwTableBox* pLeft, SwTableBox* pMerge, SwTableBox* pRight,
1494cdf0e10cSrcweir SwTableLine* pLine=0, SwTableBox* pBox=0 )
1495cdf0e10cSrcweir : pTblNd( pTNd ), pInsLine( pLine ), pInsBox( pBox ),
1496cdf0e10cSrcweir pLeftBox( pLeft ), pRightBox( pRight ), pMergeBox( pMerge )
1497cdf0e10cSrcweir { bUL_LR = bUpperLower; bUL = bUpper; }
1498cdf0e10cSrcweir
SetLeft_InsULPara1499cdf0e10cSrcweir void SetLeft( SwTableBox* pBox=0 )
1500cdf0e10cSrcweir { bUL_LR = sal_False; bUL = sal_True; if( pBox ) pInsBox = pBox; }
SetRight_InsULPara1501cdf0e10cSrcweir void SetRight( SwTableBox* pBox=0 )
1502cdf0e10cSrcweir { bUL_LR = sal_False; bUL = sal_False; if( pBox ) pInsBox = pBox; }
SetUpper_InsULPara1503cdf0e10cSrcweir void SetUpper( SwTableLine* pLine=0 )
1504cdf0e10cSrcweir { bUL_LR = sal_True; bUL = sal_True; if( pLine ) pInsLine = pLine; }
SetLower_InsULPara1505cdf0e10cSrcweir void SetLower( SwTableLine* pLine=0 )
1506cdf0e10cSrcweir { bUL_LR = sal_True; bUL = sal_False; if( pLine ) pInsLine = pLine; }
1507cdf0e10cSrcweir };
1508cdf0e10cSrcweir
1509cdf0e10cSrcweir
lcl_Merge_MoveBox(const _FndBox * & rpFndBox,void * pPara)1510cdf0e10cSrcweir sal_Bool lcl_Merge_MoveBox( const _FndBox*& rpFndBox, void* pPara )
1511cdf0e10cSrcweir {
1512cdf0e10cSrcweir _InsULPara* pULPara = (_InsULPara*)pPara;
1513cdf0e10cSrcweir SwTableBoxes* pBoxes;
1514cdf0e10cSrcweir
1515cdf0e10cSrcweir sal_uInt16 nStt = 0, nEnd = rpFndBox->GetLines().Count();
1516cdf0e10cSrcweir sal_uInt16 nInsPos = USHRT_MAX;
1517cdf0e10cSrcweir if( !pULPara->bUL_LR ) // Left/Right
1518cdf0e10cSrcweir {
1519cdf0e10cSrcweir sal_uInt16 nPos;
1520cdf0e10cSrcweir SwTableBox* pFndBox = (SwTableBox*)rpFndBox->GetBox();
1521cdf0e10cSrcweir pBoxes = &pFndBox->GetUpper()->GetTabBoxes();
1522cdf0e10cSrcweir if( pULPara->bUL ) // Left ?
1523cdf0e10cSrcweir {
1524cdf0e10cSrcweir // gibt es noch davor Boxen, dann move sie
1525cdf0e10cSrcweir if( 0 != ( nPos = pBoxes->C40_GETPOS( SwTableBox, pFndBox )) )
1526cdf0e10cSrcweir lcl_CpyBoxes( 0, nPos, *pBoxes, pULPara->pInsLine );
1527cdf0e10cSrcweir }
1528cdf0e10cSrcweir else // Right
1529cdf0e10cSrcweir // gibt es noch dahinter Boxen, dann move sie
1530cdf0e10cSrcweir if( (nPos = pBoxes->C40_GETPOS( SwTableBox, pFndBox )) +1 < pBoxes->Count() )
1531cdf0e10cSrcweir {
1532cdf0e10cSrcweir nInsPos = pULPara->pInsLine->GetTabBoxes().Count();
1533cdf0e10cSrcweir lcl_CpyBoxes( nPos+1, pBoxes->Count(),
1534cdf0e10cSrcweir *pBoxes, pULPara->pInsLine );
1535cdf0e10cSrcweir }
1536cdf0e10cSrcweir }
1537cdf0e10cSrcweir // Upper/Lower und gehts noch tiefer ??
1538cdf0e10cSrcweir else if( rpFndBox->GetLines().Count() )
1539cdf0e10cSrcweir {
1540cdf0e10cSrcweir // suche nur die Line, ab der Verschoben werden muss
1541cdf0e10cSrcweir nStt = pULPara->bUL ? 0 : rpFndBox->GetLines().Count()-1;
1542cdf0e10cSrcweir nEnd = nStt+1;
1543cdf0e10cSrcweir }
1544cdf0e10cSrcweir
1545cdf0e10cSrcweir pBoxes = &pULPara->pInsLine->GetTabBoxes();
1546cdf0e10cSrcweir
1547cdf0e10cSrcweir // geht es noch eine weitere Stufe runter?
1548cdf0e10cSrcweir if( rpFndBox->GetBox()->GetTabLines().Count() )
1549cdf0e10cSrcweir {
1550cdf0e10cSrcweir SwTableBox* pBox = new SwTableBox(
1551cdf0e10cSrcweir (SwTableBoxFmt*)rpFndBox->GetBox()->GetFrmFmt(), 0, pULPara->pInsLine );
1552cdf0e10cSrcweir _InsULPara aPara( *pULPara );
1553cdf0e10cSrcweir aPara.pInsBox = pBox;
1554cdf0e10cSrcweir ((_FndBox*)rpFndBox)->GetLines().ForEach( nStt, nEnd,
1555cdf0e10cSrcweir &lcl_Merge_MoveLine, &aPara );
1556cdf0e10cSrcweir if( pBox->GetTabLines().Count() )
1557cdf0e10cSrcweir {
1558cdf0e10cSrcweir if( USHRT_MAX == nInsPos )
1559cdf0e10cSrcweir nInsPos = pBoxes->Count();
1560cdf0e10cSrcweir pBoxes->C40_INSERT( SwTableBox, pBox, nInsPos );
1561cdf0e10cSrcweir lcl_CalcWidth( pBox ); // bereche die Breite der Box
1562cdf0e10cSrcweir }
1563cdf0e10cSrcweir else
1564cdf0e10cSrcweir delete pBox;
1565cdf0e10cSrcweir }
1566cdf0e10cSrcweir return sal_True;
1567cdf0e10cSrcweir }
1568cdf0e10cSrcweir
lcl_Merge_MoveLine(const _FndLine * & rpFndLine,void * pPara)1569cdf0e10cSrcweir sal_Bool lcl_Merge_MoveLine( const _FndLine*& rpFndLine, void* pPara )
1570cdf0e10cSrcweir {
1571cdf0e10cSrcweir _InsULPara* pULPara = (_InsULPara*)pPara;
1572cdf0e10cSrcweir SwTableLines* pLines;
1573cdf0e10cSrcweir
1574cdf0e10cSrcweir sal_uInt16 nStt = 0, nEnd = rpFndLine->GetBoxes().Count();
1575cdf0e10cSrcweir sal_uInt16 nInsPos = USHRT_MAX;
1576cdf0e10cSrcweir if( pULPara->bUL_LR ) // UpperLower ?
1577cdf0e10cSrcweir {
1578cdf0e10cSrcweir sal_uInt16 nPos;
1579cdf0e10cSrcweir SwTableLine* pFndLn = (SwTableLine*)rpFndLine->GetLine();
1580cdf0e10cSrcweir pLines = pFndLn->GetUpper() ?
1581cdf0e10cSrcweir &pFndLn->GetUpper()->GetTabLines() :
1582cdf0e10cSrcweir &pULPara->pTblNd->GetTable().GetTabLines();
1583cdf0e10cSrcweir
1584cdf0e10cSrcweir SwTableBox* pLBx = rpFndLine->GetBoxes()[0]->GetBox();
1585cdf0e10cSrcweir SwTableBox* pRBx = rpFndLine->GetBoxes()[
1586cdf0e10cSrcweir rpFndLine->GetBoxes().Count()-1]->GetBox();
1587cdf0e10cSrcweir sal_uInt16 nLeft = pFndLn->GetTabBoxes().C40_GETPOS( SwTableBox, pLBx );
1588cdf0e10cSrcweir sal_uInt16 nRight = pFndLn->GetTabBoxes().C40_GETPOS( SwTableBox, pRBx );
1589cdf0e10cSrcweir
1590cdf0e10cSrcweir // if( ( nLeft && nRight+1 < pFndLn->GetTabBoxes().Count() ) ||
1591cdf0e10cSrcweir // ( !nLeft && nRight+1 >= pFndLn->GetTabBoxes().Count() ) )
1592cdf0e10cSrcweir if( !nLeft || nRight == pFndLn->GetTabBoxes().Count() )
1593cdf0e10cSrcweir {
1594cdf0e10cSrcweir if( pULPara->bUL ) // Upper ?
1595cdf0e10cSrcweir {
1596cdf0e10cSrcweir // gibt es noch davor Zeilen, dann move sie
1597cdf0e10cSrcweir if( 0 != ( nPos = pLines->C40_GETPOS( SwTableLine, pFndLn )) )
1598cdf0e10cSrcweir lcl_CpyLines( 0, nPos, *pLines, pULPara->pInsBox );
1599cdf0e10cSrcweir }
1600cdf0e10cSrcweir else
1601cdf0e10cSrcweir // gibt es noch dahinter Zeilen, dann move sie
1602cdf0e10cSrcweir if( (nPos = pLines->C40_GETPOS( SwTableLine, pFndLn )) +1 < pLines->Count() )
1603cdf0e10cSrcweir {
1604cdf0e10cSrcweir nInsPos = pULPara->pInsBox->GetTabLines().Count();
1605cdf0e10cSrcweir lcl_CpyLines( nPos+1, pLines->Count(), *pLines,
1606cdf0e10cSrcweir pULPara->pInsBox );
1607cdf0e10cSrcweir }
1608cdf0e10cSrcweir }
1609cdf0e10cSrcweir else if( nLeft )
1610cdf0e10cSrcweir {
1611cdf0e10cSrcweir // es gibt links noch weitere Boxen, also setze Left-
1612cdf0e10cSrcweir // und Merge-Box in eine Box und Line, fuege davor/dahinter
1613cdf0e10cSrcweir // eine Line mit Box ein, in die die oberen/unteren Lines
1614cdf0e10cSrcweir // eingefuegt werden
1615cdf0e10cSrcweir SwTableLine* pInsLine = pULPara->pLeftBox->GetUpper();
1616cdf0e10cSrcweir SwTableBox* pLMBox = new SwTableBox(
1617cdf0e10cSrcweir (SwTableBoxFmt*)pULPara->pLeftBox->GetFrmFmt(), 0, pInsLine );
1618cdf0e10cSrcweir SwTableLine* pLMLn = new SwTableLine(
1619cdf0e10cSrcweir (SwTableLineFmt*)pInsLine->GetFrmFmt(), 2, pLMBox );
1620cdf0e10cSrcweir pLMLn->ClaimFrmFmt()->ResetFmtAttr( RES_FRM_SIZE );
1621cdf0e10cSrcweir
1622cdf0e10cSrcweir pLMBox->GetTabLines().C40_INSERT( SwTableLine, pLMLn, 0 );
1623cdf0e10cSrcweir
1624cdf0e10cSrcweir lcl_CpyBoxes( 0, 2, pInsLine->GetTabBoxes(), pLMLn );
1625cdf0e10cSrcweir
1626cdf0e10cSrcweir pInsLine->GetTabBoxes().C40_INSERT( SwTableBox, pLMBox, 0 );
1627cdf0e10cSrcweir
1628cdf0e10cSrcweir if( pULPara->bUL ) // Upper ?
1629cdf0e10cSrcweir {
1630cdf0e10cSrcweir // gibt es noch davor Zeilen, dann move sie
1631cdf0e10cSrcweir if( 0 != ( nPos = pLines->C40_GETPOS( SwTableLine, pFndLn )) )
1632cdf0e10cSrcweir lcl_CpyLines( 0, nPos, *pLines, pLMBox, 0 );
1633cdf0e10cSrcweir }
1634cdf0e10cSrcweir else
1635cdf0e10cSrcweir // gibt es noch dahinter Zeilen, dann move sie
1636cdf0e10cSrcweir if( (nPos = pLines->C40_GETPOS( SwTableLine, pFndLn )) +1 < pLines->Count() )
1637cdf0e10cSrcweir lcl_CpyLines( nPos+1, pLines->Count(), *pLines,
1638cdf0e10cSrcweir pLMBox );
1639cdf0e10cSrcweir lcl_CalcWidth( pLMBox ); // bereche die Breite der Box
1640cdf0e10cSrcweir }
1641cdf0e10cSrcweir else if( nRight+1 < pFndLn->GetTabBoxes().Count() )
1642cdf0e10cSrcweir {
1643cdf0e10cSrcweir // es gibt rechts noch weitere Boxen, also setze Right-
1644cdf0e10cSrcweir // und Merge-Box in eine Box und Line, fuege davor/dahinter
1645cdf0e10cSrcweir // eine Line mit Box ein, in die die oberen/unteren Lines
1646cdf0e10cSrcweir // eingefuegt werden
1647cdf0e10cSrcweir SwTableLine* pInsLine = pULPara->pRightBox->GetUpper();
1648cdf0e10cSrcweir SwTableBox* pRMBox;
1649cdf0e10cSrcweir if( pULPara->pLeftBox->GetUpper() == pInsLine )
1650cdf0e10cSrcweir {
1651cdf0e10cSrcweir pRMBox = new SwTableBox(
1652cdf0e10cSrcweir (SwTableBoxFmt*)pULPara->pRightBox->GetFrmFmt(), 0, pInsLine );
1653cdf0e10cSrcweir SwTableLine* pRMLn = new SwTableLine(
1654cdf0e10cSrcweir (SwTableLineFmt*)pInsLine->GetFrmFmt(), 2, pRMBox );
1655cdf0e10cSrcweir pRMLn->ClaimFrmFmt()->ResetFmtAttr( RES_FRM_SIZE );
1656cdf0e10cSrcweir pRMBox->GetTabLines().C40_INSERT( SwTableLine, pRMLn, 0 );
1657cdf0e10cSrcweir
1658cdf0e10cSrcweir lcl_CpyBoxes( 1, 3, pInsLine->GetTabBoxes(), pRMLn );
1659cdf0e10cSrcweir
1660cdf0e10cSrcweir pInsLine->GetTabBoxes().C40_INSERT( SwTableBox, pRMBox, 0 );
1661cdf0e10cSrcweir }
1662cdf0e10cSrcweir else
1663cdf0e10cSrcweir {
1664cdf0e10cSrcweir // Left und Merge wurden schon zusammengefuegt, also move
1665cdf0e10cSrcweir // Right auch mit in die Line
1666cdf0e10cSrcweir
1667cdf0e10cSrcweir pInsLine = pULPara->pLeftBox->GetUpper();
1668cdf0e10cSrcweir sal_uInt16 nMvPos = pULPara->pRightBox->GetUpper()->GetTabBoxes().
1669cdf0e10cSrcweir C40_GETPOS( SwTableBox, pULPara->pRightBox );
1670cdf0e10cSrcweir lcl_CpyBoxes( nMvPos, nMvPos+1,
1671cdf0e10cSrcweir pULPara->pRightBox->GetUpper()->GetTabBoxes(),
1672cdf0e10cSrcweir pInsLine );
1673cdf0e10cSrcweir pRMBox = pInsLine->GetUpper();
1674cdf0e10cSrcweir
1675cdf0e10cSrcweir // sind schon Lines vorhanden, dann muessen diese in eine
1676cdf0e10cSrcweir // neue Line und Box
1677cdf0e10cSrcweir nMvPos = pRMBox->GetTabLines().C40_GETPOS( SwTableLine, pInsLine );
1678cdf0e10cSrcweir if( pULPara->bUL ? nMvPos
1679cdf0e10cSrcweir : nMvPos+1 < pRMBox->GetTabLines().Count() )
1680cdf0e10cSrcweir {
1681cdf0e10cSrcweir // alle Lines zu einer neuen Line und Box zusammenfassen
1682cdf0e10cSrcweir SwTableLine* pNewLn = new SwTableLine(
1683cdf0e10cSrcweir (SwTableLineFmt*)pInsLine->GetFrmFmt(), 1, pRMBox );
1684cdf0e10cSrcweir pNewLn->ClaimFrmFmt()->ResetFmtAttr( RES_FRM_SIZE );
1685cdf0e10cSrcweir pRMBox->GetTabLines().C40_INSERT( SwTableLine, pNewLn,
1686cdf0e10cSrcweir pULPara->bUL ? nMvPos : nMvPos+1 );
1687cdf0e10cSrcweir pRMBox = new SwTableBox( (SwTableBoxFmt*)pRMBox->GetFrmFmt(), 0, pNewLn );
1688cdf0e10cSrcweir pNewLn->GetTabBoxes().C40_INSERT( SwTableBox, pRMBox, 0 );
1689cdf0e10cSrcweir
1690cdf0e10cSrcweir sal_uInt16 nPos1, nPos2;
1691cdf0e10cSrcweir if( pULPara->bUL )
1692cdf0e10cSrcweir nPos1 = 0,
1693cdf0e10cSrcweir nPos2 = nMvPos;
1694cdf0e10cSrcweir else
1695cdf0e10cSrcweir nPos1 = nMvPos+2,
1696cdf0e10cSrcweir nPos2 = pNewLn->GetUpper()->GetTabLines().Count();
1697cdf0e10cSrcweir
1698cdf0e10cSrcweir lcl_CpyLines( nPos1, nPos2,
1699cdf0e10cSrcweir pNewLn->GetUpper()->GetTabLines(), pRMBox );
1700cdf0e10cSrcweir lcl_CalcWidth( pRMBox ); // bereche die Breite der Box
1701cdf0e10cSrcweir
1702cdf0e10cSrcweir pRMBox = new SwTableBox( (SwTableBoxFmt*)pRMBox->GetFrmFmt(), 0, pNewLn );
1703cdf0e10cSrcweir pNewLn->GetTabBoxes().C40_INSERT( SwTableBox, pRMBox,
1704cdf0e10cSrcweir pNewLn->GetTabBoxes().Count() );
1705cdf0e10cSrcweir }
1706cdf0e10cSrcweir }
1707cdf0e10cSrcweir if( pULPara->bUL ) // Upper ?
1708cdf0e10cSrcweir {
1709cdf0e10cSrcweir // gibt es noch davor Zeilen, dann move sie
1710cdf0e10cSrcweir if( 0 != ( nPos = pLines->C40_GETPOS( SwTableLine, pFndLn )) )
1711cdf0e10cSrcweir lcl_CpyLines( 0, nPos, *pLines, pRMBox, 0 );
1712cdf0e10cSrcweir }
1713cdf0e10cSrcweir else
1714cdf0e10cSrcweir // gibt es noch dahinter Zeilen, dann move sie
1715cdf0e10cSrcweir if( (nPos = pLines->C40_GETPOS( SwTableLine, pFndLn )) +1 < pLines->Count() )
1716cdf0e10cSrcweir lcl_CpyLines( nPos+1, pLines->Count(), *pLines,
1717cdf0e10cSrcweir pRMBox );
1718cdf0e10cSrcweir lcl_CalcWidth( pRMBox ); // bereche die Breite der Box
1719cdf0e10cSrcweir }
1720cdf0e10cSrcweir else {
1721cdf0e10cSrcweir ASSERT( sal_False , "Was denn nun" );
1722cdf0e10cSrcweir }
1723cdf0e10cSrcweir }
1724cdf0e10cSrcweir // Left/Right
1725cdf0e10cSrcweir else
1726cdf0e10cSrcweir {
1727cdf0e10cSrcweir // suche nur die Line, ab der Verschoben werden muss
1728cdf0e10cSrcweir nStt = pULPara->bUL ? 0 : rpFndLine->GetBoxes().Count()-1;
1729cdf0e10cSrcweir nEnd = nStt+1;
1730cdf0e10cSrcweir }
1731cdf0e10cSrcweir pLines = &pULPara->pInsBox->GetTabLines();
1732cdf0e10cSrcweir
1733cdf0e10cSrcweir SwTableLine* pNewLine = new SwTableLine(
1734cdf0e10cSrcweir (SwTableLineFmt*)rpFndLine->GetLine()->GetFrmFmt(), 0, pULPara->pInsBox );
1735cdf0e10cSrcweir _InsULPara aPara( *pULPara ); // kopieren
1736cdf0e10cSrcweir aPara.pInsLine = pNewLine;
1737cdf0e10cSrcweir ((_FndLine*)rpFndLine)->GetBoxes().ForEach( nStt, nEnd,
1738cdf0e10cSrcweir &lcl_Merge_MoveBox, &aPara );
1739cdf0e10cSrcweir if( pNewLine->GetTabBoxes().Count() )
1740cdf0e10cSrcweir {
1741cdf0e10cSrcweir if( USHRT_MAX == nInsPos )
1742cdf0e10cSrcweir nInsPos = pLines->Count();
1743cdf0e10cSrcweir pLines->C40_INSERT( SwTableLine, pNewLine, nInsPos );
1744cdf0e10cSrcweir }
1745cdf0e10cSrcweir else
1746cdf0e10cSrcweir delete pNewLine;
1747cdf0e10cSrcweir
1748cdf0e10cSrcweir return sal_True;
1749cdf0e10cSrcweir }
1750cdf0e10cSrcweir
1751cdf0e10cSrcweir
OldMerge(SwDoc * pDoc,const SwSelBoxes & rBoxes,SwTableBox * pMergeBox,SwUndoTblMerge * pUndo)1752cdf0e10cSrcweir sal_Bool SwTable::OldMerge( SwDoc* pDoc, const SwSelBoxes& rBoxes,
1753cdf0e10cSrcweir SwTableBox* pMergeBox, SwUndoTblMerge* pUndo )
1754cdf0e10cSrcweir {
1755cdf0e10cSrcweir ASSERT( rBoxes.Count() && pMergeBox, "keine gueltigen Werte" );
1756cdf0e10cSrcweir SwTableNode* pTblNd = (SwTableNode*)rBoxes[0]->GetSttNd()->FindTableNode();
1757cdf0e10cSrcweir if( !pTblNd )
1758cdf0e10cSrcweir return sal_False;
1759cdf0e10cSrcweir
1760cdf0e10cSrcweir // suche alle Boxen / Lines
1761cdf0e10cSrcweir _FndBox aFndBox( 0, 0 );
1762cdf0e10cSrcweir {
1763cdf0e10cSrcweir _FndPara aPara( rBoxes, &aFndBox );
1764cdf0e10cSrcweir GetTabLines().ForEach( &_FndLineCopyCol, &aPara );
1765cdf0e10cSrcweir }
1766cdf0e10cSrcweir if( !aFndBox.GetLines().Count() )
1767cdf0e10cSrcweir return sal_False;
1768cdf0e10cSrcweir
1769cdf0e10cSrcweir // TL_CHART2: splitting/merging of a number of cells or rows will usually make
1770cdf0e10cSrcweir // the table to complex to be handled with chart.
1771cdf0e10cSrcweir // Thus we tell the charts to use their own data provider and forget about this table
1772cdf0e10cSrcweir pDoc->CreateChartInternalDataProviders( this );
1773cdf0e10cSrcweir
1774cdf0e10cSrcweir SetHTMLTableLayout( 0 ); // MIB 9.7.97: HTML-Layout loeschen
1775cdf0e10cSrcweir
1776cdf0e10cSrcweir if( pUndo )
1777cdf0e10cSrcweir pUndo->SetSelBoxes( rBoxes );
1778cdf0e10cSrcweir
1779cdf0e10cSrcweir //Lines fuer das Layout-Update herausuchen.
1780cdf0e10cSrcweir aFndBox.SetTableLines( *this );
1781cdf0e10cSrcweir aFndBox.DelFrms( *this );
1782cdf0e10cSrcweir
1783cdf0e10cSrcweir _FndBox* pFndBox = &aFndBox;
1784cdf0e10cSrcweir while( 1 == pFndBox->GetLines().Count() &&
1785cdf0e10cSrcweir 1 == pFndBox->GetLines()[0]->GetBoxes().Count() )
1786cdf0e10cSrcweir pFndBox = pFndBox->GetLines()[0]->GetBoxes()[0];
1787cdf0e10cSrcweir
1788cdf0e10cSrcweir SwTableLine* pInsLine = new SwTableLine(
1789cdf0e10cSrcweir (SwTableLineFmt*)pFndBox->GetLines()[0]->GetLine()->GetFrmFmt(), 0,
1790cdf0e10cSrcweir !pFndBox->GetUpper() ? 0 : pFndBox->GetBox() );
1791cdf0e10cSrcweir pInsLine->ClaimFrmFmt()->ResetFmtAttr( RES_FRM_SIZE );
1792cdf0e10cSrcweir
1793cdf0e10cSrcweir // trage die neue Line ein
1794cdf0e10cSrcweir SwTableLines* pLines = pFndBox->GetUpper() ?
1795cdf0e10cSrcweir &pFndBox->GetBox()->GetTabLines() : &GetTabLines();
1796cdf0e10cSrcweir
1797cdf0e10cSrcweir SwTableLine* pNewLine = pFndBox->GetLines()[0]->GetLine();
1798cdf0e10cSrcweir sal_uInt16 nInsPos = pLines->C40_GETPOS( SwTableLine, pNewLine );
1799cdf0e10cSrcweir pLines->C40_INSERT( SwTableLine, pInsLine, nInsPos );
1800cdf0e10cSrcweir
1801cdf0e10cSrcweir SwTableBox* pLeftBox = new SwTableBox( (SwTableBoxFmt*)pMergeBox->GetFrmFmt(), 0, pInsLine );
1802cdf0e10cSrcweir SwTableBox* pRightBox = new SwTableBox( (SwTableBoxFmt*)pMergeBox->GetFrmFmt(), 0, pInsLine );
1803cdf0e10cSrcweir pMergeBox->SetUpper( pInsLine );
1804cdf0e10cSrcweir pInsLine->GetTabBoxes().C40_INSERT( SwTableBox, pLeftBox, 0 );
1805cdf0e10cSrcweir pLeftBox->ClaimFrmFmt();
1806cdf0e10cSrcweir pInsLine->GetTabBoxes().C40_INSERT( SwTableBox, pMergeBox, 1 );
1807cdf0e10cSrcweir pInsLine->GetTabBoxes().C40_INSERT( SwTableBox, pRightBox, 2 );
1808cdf0e10cSrcweir pRightBox->ClaimFrmFmt();
1809cdf0e10cSrcweir
1810cdf0e10cSrcweir // in diese kommen alle Lines, die ueber dem selektierten Bereich stehen
1811cdf0e10cSrcweir // Sie bilden also eine Upper/Lower Line
1812cdf0e10cSrcweir _InsULPara aPara( pTblNd, sal_True, sal_True, pLeftBox, pMergeBox, pRightBox, pInsLine );
1813cdf0e10cSrcweir
1814cdf0e10cSrcweir // move die oben/unten ueberhaengenden Lines vom selektierten Bereich
1815cdf0e10cSrcweir pFndBox->GetLines()[0]->GetBoxes().ForEach( &lcl_Merge_MoveBox,
1816cdf0e10cSrcweir &aPara );
1817cdf0e10cSrcweir aPara.SetLower( pInsLine );
1818cdf0e10cSrcweir sal_uInt16 nEnd = pFndBox->GetLines().Count()-1;
1819cdf0e10cSrcweir pFndBox->GetLines()[nEnd]->GetBoxes().ForEach( &lcl_Merge_MoveBox,
1820cdf0e10cSrcweir &aPara );
1821cdf0e10cSrcweir
1822cdf0e10cSrcweir // move die links/rechts hereinreichenden Boxen vom selektierten Bereich
1823cdf0e10cSrcweir aPara.SetLeft( pLeftBox );
1824cdf0e10cSrcweir pFndBox->GetLines().ForEach( &lcl_Merge_MoveLine, &aPara );
1825cdf0e10cSrcweir
1826cdf0e10cSrcweir aPara.SetRight( pRightBox );
1827cdf0e10cSrcweir pFndBox->GetLines().ForEach( &lcl_Merge_MoveLine, &aPara );
1828cdf0e10cSrcweir
1829cdf0e10cSrcweir if( !pLeftBox->GetTabLines().Count() )
1830cdf0e10cSrcweir _DeleteBox( *this, pLeftBox, 0, sal_False, sal_False );
1831cdf0e10cSrcweir else
1832cdf0e10cSrcweir {
1833cdf0e10cSrcweir lcl_CalcWidth( pLeftBox ); // bereche die Breite der Box
1834cdf0e10cSrcweir if( pUndo && pLeftBox->GetSttNd() )
1835cdf0e10cSrcweir pUndo->AddNewBox( pLeftBox->GetSttIdx() );
1836cdf0e10cSrcweir }
1837cdf0e10cSrcweir if( !pRightBox->GetTabLines().Count() )
1838cdf0e10cSrcweir _DeleteBox( *this, pRightBox, 0, sal_False, sal_False );
1839cdf0e10cSrcweir else
1840cdf0e10cSrcweir {
1841cdf0e10cSrcweir lcl_CalcWidth( pRightBox ); // bereche die Breite der Box
1842cdf0e10cSrcweir if( pUndo && pRightBox->GetSttNd() )
1843cdf0e10cSrcweir pUndo->AddNewBox( pRightBox->GetSttIdx() );
1844cdf0e10cSrcweir }
1845cdf0e10cSrcweir
1846cdf0e10cSrcweir DeleteSel( pDoc, rBoxes, 0, 0, sal_False, sal_False );
1847cdf0e10cSrcweir
1848cdf0e10cSrcweir // dann raeume die Struktur dieser Line noch mal auf:
1849cdf0e10cSrcweir // generell alle Aufraeumen
1850cdf0e10cSrcweir GCLines();
1851cdf0e10cSrcweir
1852cdf0e10cSrcweir GetTabLines()[0]->GetTabBoxes().ForEach( &lcl_BoxSetHeadCondColl, 0 );
1853cdf0e10cSrcweir
1854cdf0e10cSrcweir aFndBox.MakeFrms( *this );
1855cdf0e10cSrcweir
1856cdf0e10cSrcweir CHECKBOXWIDTH
1857cdf0e10cSrcweir CHECKTABLELAYOUT
1858cdf0e10cSrcweir
1859cdf0e10cSrcweir return sal_True;
1860cdf0e10cSrcweir }
1861cdf0e10cSrcweir
1862cdf0e10cSrcweir // ---------------------------------------------------------------
1863cdf0e10cSrcweir
lcl_CheckRowSpan(SwTable & rTbl)1864cdf0e10cSrcweir void lcl_CheckRowSpan( SwTable &rTbl )
1865cdf0e10cSrcweir {
1866cdf0e10cSrcweir sal_uInt16 nLineCount = rTbl.GetTabLines().Count();
1867cdf0e10cSrcweir sal_uInt16 nMaxSpan = nLineCount;
1868cdf0e10cSrcweir long nMinSpan = 1;
1869cdf0e10cSrcweir while( nMaxSpan )
1870cdf0e10cSrcweir {
1871cdf0e10cSrcweir SwTableLine* pLine = rTbl.GetTabLines()[ nLineCount - nMaxSpan ];
1872cdf0e10cSrcweir for( sal_uInt16 nBox = 0; nBox < pLine->GetTabBoxes().Count(); ++nBox )
1873cdf0e10cSrcweir {
1874cdf0e10cSrcweir SwTableBox* pBox = pLine->GetTabBoxes()[nBox];
1875cdf0e10cSrcweir long nRowSpan = pBox->getRowSpan();
1876cdf0e10cSrcweir if( nRowSpan > nMaxSpan )
1877cdf0e10cSrcweir pBox->setRowSpan( nMaxSpan );
1878cdf0e10cSrcweir else if( nRowSpan < nMinSpan )
1879cdf0e10cSrcweir pBox->setRowSpan( nMinSpan > 0 ? nMaxSpan : nMinSpan );
1880cdf0e10cSrcweir }
1881cdf0e10cSrcweir --nMaxSpan;
1882cdf0e10cSrcweir nMinSpan = -nMaxSpan;
1883cdf0e10cSrcweir }
1884cdf0e10cSrcweir }
1885cdf0e10cSrcweir
lcl_GetBoxOffset(const _FndBox & rBox)1886cdf0e10cSrcweir sal_uInt16 lcl_GetBoxOffset( const _FndBox& rBox )
1887cdf0e10cSrcweir {
1888cdf0e10cSrcweir // suche die erste Box
1889cdf0e10cSrcweir const _FndBox* pFirstBox = &rBox;
1890cdf0e10cSrcweir while( pFirstBox->GetLines().Count() )
1891cdf0e10cSrcweir pFirstBox = pFirstBox->GetLines()[ 0 ]->GetBoxes()[ 0 ];
1892cdf0e10cSrcweir
1893cdf0e10cSrcweir sal_uInt16 nRet = 0;
1894cdf0e10cSrcweir // dann ueber die Lines nach oben die Position bestimmen
1895cdf0e10cSrcweir const SwTableBox* pBox = pFirstBox->GetBox();
1896cdf0e10cSrcweir do {
1897cdf0e10cSrcweir const SwTableBoxes& rBoxes = pBox->GetUpper()->GetTabBoxes();
1898cdf0e10cSrcweir const SwTableBox* pCmp;
1899cdf0e10cSrcweir for( sal_uInt16 n = 0; pBox != ( pCmp = rBoxes[ n ] ); ++n )
1900cdf0e10cSrcweir nRet = nRet + (sal_uInt16) pCmp->GetFrmFmt()->GetFrmSize().GetWidth();
1901cdf0e10cSrcweir pBox = pBox->GetUpper()->GetUpper();
1902cdf0e10cSrcweir } while( pBox );
1903cdf0e10cSrcweir return nRet;
1904cdf0e10cSrcweir }
1905cdf0e10cSrcweir
lcl_GetLineWidth(const _FndLine & rLine)1906cdf0e10cSrcweir sal_uInt16 lcl_GetLineWidth( const _FndLine& rLine )
1907cdf0e10cSrcweir {
1908cdf0e10cSrcweir sal_uInt16 nRet = 0;
1909cdf0e10cSrcweir for( sal_uInt16 n = rLine.GetBoxes().Count(); n; )
1910cdf0e10cSrcweir nRet = nRet + (sal_uInt16)rLine.GetBoxes()[ --n ]->GetBox()->GetFrmFmt()
1911cdf0e10cSrcweir ->GetFrmSize().GetWidth();
1912cdf0e10cSrcweir return nRet;
1913cdf0e10cSrcweir }
1914cdf0e10cSrcweir
lcl_CalcNewWidths(const _FndLines & rFndLines,_CpyPara & rPara)1915cdf0e10cSrcweir void lcl_CalcNewWidths( const _FndLines& rFndLines, _CpyPara& rPara )
1916cdf0e10cSrcweir {
1917cdf0e10cSrcweir rPara.pWidths.reset();
1918cdf0e10cSrcweir sal_uInt16 nLineCount = rFndLines.Count();
1919cdf0e10cSrcweir if( nLineCount )
1920cdf0e10cSrcweir {
1921cdf0e10cSrcweir rPara.pWidths = boost::shared_ptr< std::vector< std::vector< sal_uLong > > >
1922cdf0e10cSrcweir ( new std::vector< std::vector< sal_uLong > >( nLineCount ));
1923cdf0e10cSrcweir // First we collect information about the left/right borders of all
1924cdf0e10cSrcweir // selected cells
1925cdf0e10cSrcweir for( sal_uInt16 nLine = 0; nLine < nLineCount; ++nLine )
1926cdf0e10cSrcweir {
1927cdf0e10cSrcweir std::vector< sal_uLong > &rWidth = (*rPara.pWidths.get())[ nLine ];
1928cdf0e10cSrcweir const _FndLine *pFndLine = rFndLines[ nLine ];
1929cdf0e10cSrcweir if( pFndLine && pFndLine->GetBoxes().Count() )
1930cdf0e10cSrcweir {
1931cdf0e10cSrcweir const SwTableLine *pLine = pFndLine->GetLine();
1932cdf0e10cSrcweir if( pLine && pLine->GetTabBoxes().Count() )
1933cdf0e10cSrcweir {
1934cdf0e10cSrcweir sal_uInt16 nBoxCount = pLine->GetTabBoxes().Count();
1935cdf0e10cSrcweir sal_uLong nPos = 0;
1936cdf0e10cSrcweir // The first selected box...
1937cdf0e10cSrcweir const SwTableBox *pSel = pFndLine->GetBoxes()[0]->GetBox();
1938cdf0e10cSrcweir sal_uInt16 nBox = 0;
1939cdf0e10cSrcweir // Sum up the width of all boxes before the first selected box
1940cdf0e10cSrcweir while( nBox < nBoxCount )
1941cdf0e10cSrcweir {
1942cdf0e10cSrcweir SwTableBox* pBox = pLine->GetTabBoxes()[nBox++];
1943cdf0e10cSrcweir if( pBox != pSel )
1944cdf0e10cSrcweir nPos += pBox->GetFrmFmt()->GetFrmSize().GetWidth();
1945cdf0e10cSrcweir else
1946cdf0e10cSrcweir break;
1947cdf0e10cSrcweir }
1948cdf0e10cSrcweir // nPos is now the left border of the first selceted box
1949cdf0e10cSrcweir if( rPara.nMinLeft > nPos )
1950cdf0e10cSrcweir rPara.nMinLeft = nPos;
1951cdf0e10cSrcweir nBoxCount = pFndLine->GetBoxes().Count();
1952cdf0e10cSrcweir rWidth = std::vector< sal_uLong >( nBoxCount+2 );
1953cdf0e10cSrcweir rWidth[ 0 ] = nPos;
1954cdf0e10cSrcweir // Add now the widths of all selected boxes and store
1955cdf0e10cSrcweir // the positions in the vector
1956cdf0e10cSrcweir for( nBox = 0; nBox < nBoxCount; )
1957cdf0e10cSrcweir {
1958cdf0e10cSrcweir nPos += pFndLine->GetBoxes()[nBox]
1959cdf0e10cSrcweir ->GetBox()->GetFrmFmt()->GetFrmSize().GetWidth();
1960cdf0e10cSrcweir rWidth[ ++nBox ] = nPos;
1961cdf0e10cSrcweir }
1962cdf0e10cSrcweir // nPos: The right border of the last selected box
1963cdf0e10cSrcweir if( rPara.nMaxRight < nPos )
1964cdf0e10cSrcweir rPara.nMaxRight = nPos;
1965cdf0e10cSrcweir if( nPos <= rWidth[ 0 ] )
1966cdf0e10cSrcweir rWidth.clear();
1967cdf0e10cSrcweir }
1968cdf0e10cSrcweir }
1969cdf0e10cSrcweir }
1970cdf0e10cSrcweir }
1971cdf0e10cSrcweir // Second step: calculate the new widths for the copied cells
1972cdf0e10cSrcweir sal_uLong nSelSize = rPara.nMaxRight - rPara.nMinLeft;
1973cdf0e10cSrcweir if( nSelSize )
1974cdf0e10cSrcweir {
1975cdf0e10cSrcweir for( sal_uInt16 nLine = 0; nLine < nLineCount; ++nLine )
1976cdf0e10cSrcweir {
1977cdf0e10cSrcweir std::vector< sal_uLong > &rWidth = (*rPara.pWidths.get())[ nLine ];
1978cdf0e10cSrcweir sal_uInt16 nCount = (sal_uInt16)rWidth.size();
1979cdf0e10cSrcweir if( nCount > 2 )
1980cdf0e10cSrcweir {
1981cdf0e10cSrcweir rWidth[ nCount - 1 ] = rPara.nMaxRight;
1982cdf0e10cSrcweir sal_uLong nLastPos = 0;
1983cdf0e10cSrcweir for( sal_uInt16 nBox = 0; nBox < nCount; ++nBox )
1984cdf0e10cSrcweir {
1985cdf0e10cSrcweir sal_uInt64 nNextPos = rWidth[ nBox ];
1986cdf0e10cSrcweir nNextPos -= rPara.nMinLeft;
1987cdf0e10cSrcweir nNextPos *= rPara.nNewSize;
1988cdf0e10cSrcweir nNextPos /= nSelSize;
1989cdf0e10cSrcweir rWidth[ nBox ] = (sal_uLong)(nNextPos - nLastPos);
1990cdf0e10cSrcweir nLastPos = (sal_uLong)nNextPos;
1991cdf0e10cSrcweir }
1992cdf0e10cSrcweir }
1993cdf0e10cSrcweir }
1994cdf0e10cSrcweir }
1995cdf0e10cSrcweir }
1996cdf0e10cSrcweir
lcl_CopyBoxToDoc(const _FndBox * & rpFndBox,void * pPara)1997cdf0e10cSrcweir sal_Bool lcl_CopyBoxToDoc( const _FndBox*& rpFndBox, void* pPara )
1998cdf0e10cSrcweir {
1999cdf0e10cSrcweir _CpyPara* pCpyPara = (_CpyPara*)pPara;
2000cdf0e10cSrcweir
2001cdf0e10cSrcweir // Calculation of new size
2002cdf0e10cSrcweir sal_uLong nRealSize;
2003cdf0e10cSrcweir sal_uLong nDummy1 = 0;
2004cdf0e10cSrcweir sal_uLong nDummy2 = 0;
2005cdf0e10cSrcweir if( pCpyPara->pTblNd->GetTable().IsNewModel() )
2006cdf0e10cSrcweir {
2007cdf0e10cSrcweir if( pCpyPara->nBoxIdx == 1 )
2008cdf0e10cSrcweir nDummy1 = (*pCpyPara->pWidths.get())[pCpyPara->nLnIdx][0];
2009cdf0e10cSrcweir nRealSize = (*pCpyPara->pWidths.get())[pCpyPara->nLnIdx][pCpyPara->nBoxIdx++];
2010cdf0e10cSrcweir if( pCpyPara->nBoxIdx == (*pCpyPara->pWidths.get())[pCpyPara->nLnIdx].size()-1 )
2011cdf0e10cSrcweir nDummy2 = (*pCpyPara->pWidths.get())[pCpyPara->nLnIdx][pCpyPara->nBoxIdx];
2012cdf0e10cSrcweir }
2013cdf0e10cSrcweir else
2014cdf0e10cSrcweir {
2015cdf0e10cSrcweir nRealSize = pCpyPara->nNewSize;
2016cdf0e10cSrcweir nRealSize *= rpFndBox->GetBox()->GetFrmFmt()->GetFrmSize().GetWidth();
2017cdf0e10cSrcweir nRealSize /= pCpyPara->nOldSize;
2018cdf0e10cSrcweir }
2019cdf0e10cSrcweir
2020cdf0e10cSrcweir sal_uLong nSize;
2021cdf0e10cSrcweir bool bDummy = nDummy1 > 0;
2022cdf0e10cSrcweir if( bDummy )
2023cdf0e10cSrcweir nSize = nDummy1;
2024cdf0e10cSrcweir else
2025cdf0e10cSrcweir {
2026cdf0e10cSrcweir nSize = nRealSize;
2027cdf0e10cSrcweir nRealSize = 0;
2028cdf0e10cSrcweir }
2029cdf0e10cSrcweir do
2030cdf0e10cSrcweir {
2031cdf0e10cSrcweir // suche das Frame-Format in der Liste aller Frame-Formate
2032cdf0e10cSrcweir _CpyTabFrm aFindFrm( (SwTableBoxFmt*)rpFndBox->GetBox()->GetFrmFmt() );
2033cdf0e10cSrcweir
2034cdf0e10cSrcweir SwFmtFrmSize aFrmSz;
2035cdf0e10cSrcweir sal_uInt16 nFndPos;
2036cdf0e10cSrcweir if( !pCpyPara->rTabFrmArr.Seek_Entry( aFindFrm, &nFndPos ) ||
2037cdf0e10cSrcweir ( aFrmSz = ( aFindFrm = pCpyPara->rTabFrmArr[ nFndPos ]).pNewFrmFmt->
2038cdf0e10cSrcweir GetFrmSize()).GetWidth() != (SwTwips)nSize )
2039cdf0e10cSrcweir {
2040cdf0e10cSrcweir // es ist noch nicht vorhanden, also kopiere es
2041cdf0e10cSrcweir aFindFrm.pNewFrmFmt = pCpyPara->pDoc->MakeTableBoxFmt();
2042cdf0e10cSrcweir aFindFrm.pNewFrmFmt->CopyAttrs( *rpFndBox->GetBox()->GetFrmFmt() );
2043cdf0e10cSrcweir if( !pCpyPara->bCpyCntnt )
2044cdf0e10cSrcweir aFindFrm.pNewFrmFmt->ResetFmtAttr( RES_BOXATR_FORMULA, RES_BOXATR_VALUE );
2045cdf0e10cSrcweir aFrmSz.SetWidth( nSize );
2046cdf0e10cSrcweir aFindFrm.pNewFrmFmt->SetFmtAttr( aFrmSz );
2047cdf0e10cSrcweir pCpyPara->rTabFrmArr.Insert( aFindFrm );
2048cdf0e10cSrcweir }
2049cdf0e10cSrcweir
2050cdf0e10cSrcweir SwTableBox* pBox;
2051cdf0e10cSrcweir if( rpFndBox->GetLines().Count() )
2052cdf0e10cSrcweir {
2053cdf0e10cSrcweir pBox = new SwTableBox( aFindFrm.pNewFrmFmt,
2054cdf0e10cSrcweir rpFndBox->GetLines().Count(), pCpyPara->pInsLine );
2055cdf0e10cSrcweir pCpyPara->pInsLine->GetTabBoxes().C40_INSERT( SwTableBox, pBox, pCpyPara->nInsPos++ );
2056cdf0e10cSrcweir _CpyPara aPara( *pCpyPara, pBox );
2057cdf0e10cSrcweir aPara.nNewSize = nSize; // hole die Groesse
2058cdf0e10cSrcweir ((_FndBox*)rpFndBox)->GetLines().ForEach( &lcl_CopyLineToDoc, &aPara );
2059cdf0e10cSrcweir }
2060cdf0e10cSrcweir else
2061cdf0e10cSrcweir {
2062cdf0e10cSrcweir // erzeuge eine leere Box
2063cdf0e10cSrcweir pCpyPara->pDoc->GetNodes().InsBoxen( pCpyPara->pTblNd, pCpyPara->pInsLine,
2064cdf0e10cSrcweir aFindFrm.pNewFrmFmt,
2065cdf0e10cSrcweir (SwTxtFmtColl*)pCpyPara->pDoc->GetDfltTxtFmtColl(),
2066cdf0e10cSrcweir 0, pCpyPara->nInsPos );
2067cdf0e10cSrcweir pBox = pCpyPara->pInsLine->GetTabBoxes()[ pCpyPara->nInsPos ];
2068cdf0e10cSrcweir if( bDummy )
2069cdf0e10cSrcweir pBox->setDummyFlag( true );
2070cdf0e10cSrcweir else if( pCpyPara->bCpyCntnt )
2071cdf0e10cSrcweir {
2072cdf0e10cSrcweir // dann kopiere mal den Inhalt in diese leere Box
2073cdf0e10cSrcweir pBox->setRowSpan( rpFndBox->GetBox()->getRowSpan() );
2074cdf0e10cSrcweir
2075cdf0e10cSrcweir // der Inhalt kopiert wird, dann koennen auch Formeln&Values
2076cdf0e10cSrcweir // kopiert werden.
2077cdf0e10cSrcweir {
2078cdf0e10cSrcweir SfxItemSet aBoxAttrSet( pCpyPara->pDoc->GetAttrPool(),
2079cdf0e10cSrcweir RES_BOXATR_FORMAT, RES_BOXATR_VALUE );
2080cdf0e10cSrcweir aBoxAttrSet.Put( rpFndBox->GetBox()->GetFrmFmt()->GetAttrSet() );
2081cdf0e10cSrcweir if( aBoxAttrSet.Count() )
2082cdf0e10cSrcweir {
2083cdf0e10cSrcweir const SfxPoolItem* pItem;
2084cdf0e10cSrcweir SvNumberFormatter* pN = pCpyPara->pDoc->GetNumberFormatter( sal_False );
2085cdf0e10cSrcweir if( pN && pN->HasMergeFmtTbl() && SFX_ITEM_SET == aBoxAttrSet.
2086cdf0e10cSrcweir GetItemState( RES_BOXATR_FORMAT, sal_False, &pItem ) )
2087cdf0e10cSrcweir {
2088cdf0e10cSrcweir sal_uLong nOldIdx = ((SwTblBoxNumFormat*)pItem)->GetValue();
2089cdf0e10cSrcweir sal_uLong nNewIdx = pN->GetMergeFmtIndex( nOldIdx );
2090cdf0e10cSrcweir if( nNewIdx != nOldIdx )
2091cdf0e10cSrcweir aBoxAttrSet.Put( SwTblBoxNumFormat( nNewIdx ));
2092cdf0e10cSrcweir }
2093cdf0e10cSrcweir pBox->ClaimFrmFmt()->SetFmtAttr( aBoxAttrSet );
2094cdf0e10cSrcweir }
2095cdf0e10cSrcweir }
2096cdf0e10cSrcweir SwDoc* pFromDoc = rpFndBox->GetBox()->GetFrmFmt()->GetDoc();
2097cdf0e10cSrcweir SwNodeRange aCpyRg( *rpFndBox->GetBox()->GetSttNd(), 1,
2098cdf0e10cSrcweir *rpFndBox->GetBox()->GetSttNd()->EndOfSectionNode() );
2099cdf0e10cSrcweir SwNodeIndex aInsIdx( *pBox->GetSttNd(), 1 );
2100cdf0e10cSrcweir
2101*dec99bbdSOliver-Rainer Wittmann pFromDoc->CopyWithFlyInFly( aCpyRg, 0, aInsIdx, NULL, sal_False );
2102cdf0e10cSrcweir // den initialen TextNode loeschen
2103cdf0e10cSrcweir pCpyPara->pDoc->GetNodes().Delete( aInsIdx, 1 );
2104cdf0e10cSrcweir }
2105cdf0e10cSrcweir ++pCpyPara->nInsPos;
2106cdf0e10cSrcweir }
2107cdf0e10cSrcweir if( nRealSize )
2108cdf0e10cSrcweir {
2109cdf0e10cSrcweir bDummy = false;
2110cdf0e10cSrcweir nSize = nRealSize;
2111cdf0e10cSrcweir nRealSize = 0;
2112cdf0e10cSrcweir }
2113cdf0e10cSrcweir else
2114cdf0e10cSrcweir {
2115cdf0e10cSrcweir bDummy = true;
2116cdf0e10cSrcweir nSize = nDummy2;
2117cdf0e10cSrcweir nDummy2 = 0;
2118cdf0e10cSrcweir }
2119cdf0e10cSrcweir }
2120cdf0e10cSrcweir while( nSize );
2121cdf0e10cSrcweir return sal_True;
2122cdf0e10cSrcweir }
2123cdf0e10cSrcweir
lcl_CopyLineToDoc(const _FndLine * & rpFndLine,void * pPara)2124cdf0e10cSrcweir sal_Bool lcl_CopyLineToDoc( const _FndLine*& rpFndLine, void* pPara )
2125cdf0e10cSrcweir {
2126cdf0e10cSrcweir _CpyPara* pCpyPara = (_CpyPara*)pPara;
2127cdf0e10cSrcweir
2128cdf0e10cSrcweir // suche das Format in der Liste aller Formate
2129cdf0e10cSrcweir _CpyTabFrm aFindFrm( (SwTableBoxFmt*)rpFndLine->GetLine()->GetFrmFmt() );
2130cdf0e10cSrcweir sal_uInt16 nFndPos;
2131cdf0e10cSrcweir if( !pCpyPara->rTabFrmArr.Seek_Entry( aFindFrm, &nFndPos ))
2132cdf0e10cSrcweir {
2133cdf0e10cSrcweir // es ist noch nicht vorhanden, also kopiere es
2134cdf0e10cSrcweir aFindFrm.pNewFrmFmt = (SwTableBoxFmt*)pCpyPara->pDoc->MakeTableLineFmt();
2135cdf0e10cSrcweir aFindFrm.pNewFrmFmt->CopyAttrs( *rpFndLine->GetLine()->GetFrmFmt() );
2136cdf0e10cSrcweir pCpyPara->rTabFrmArr.Insert( aFindFrm );
2137cdf0e10cSrcweir }
2138cdf0e10cSrcweir else
2139cdf0e10cSrcweir aFindFrm = pCpyPara->rTabFrmArr[ nFndPos ];
2140cdf0e10cSrcweir
2141cdf0e10cSrcweir SwTableLine* pNewLine = new SwTableLine( (SwTableLineFmt*)aFindFrm.pNewFrmFmt,
2142cdf0e10cSrcweir rpFndLine->GetBoxes().Count(), pCpyPara->pInsBox );
2143cdf0e10cSrcweir if( pCpyPara->pInsBox )
2144cdf0e10cSrcweir {
2145cdf0e10cSrcweir pCpyPara->pInsBox->GetTabLines().C40_INSERT( SwTableLine, pNewLine, pCpyPara->nInsPos++ );
2146cdf0e10cSrcweir }
2147cdf0e10cSrcweir else
2148cdf0e10cSrcweir {
2149cdf0e10cSrcweir pCpyPara->pTblNd->GetTable().GetTabLines().C40_INSERT( SwTableLine, pNewLine,
2150cdf0e10cSrcweir pCpyPara->nInsPos++ );
2151cdf0e10cSrcweir }
2152cdf0e10cSrcweir
2153cdf0e10cSrcweir _CpyPara aPara( *pCpyPara, pNewLine );
2154cdf0e10cSrcweir
2155cdf0e10cSrcweir if( pCpyPara->pTblNd->GetTable().IsNewModel() )
2156cdf0e10cSrcweir {
2157cdf0e10cSrcweir aPara.nOldSize = 0; // will not be used
2158cdf0e10cSrcweir aPara.nBoxIdx = 1;
2159cdf0e10cSrcweir }
2160cdf0e10cSrcweir else if( rpFndLine->GetBoxes().Count() ==
2161cdf0e10cSrcweir rpFndLine->GetLine()->GetTabBoxes().Count() )
2162cdf0e10cSrcweir {
2163cdf0e10cSrcweir // hole die Size vom Parent
2164cdf0e10cSrcweir const SwFrmFmt* pFmt;
2165cdf0e10cSrcweir
2166cdf0e10cSrcweir if( rpFndLine->GetLine()->GetUpper() )
2167cdf0e10cSrcweir pFmt = rpFndLine->GetLine()->GetUpper()->GetFrmFmt();
2168cdf0e10cSrcweir else
2169cdf0e10cSrcweir pFmt = pCpyPara->pTblNd->GetTable().GetFrmFmt();
2170cdf0e10cSrcweir aPara.nOldSize = pFmt->GetFrmSize().GetWidth();
2171cdf0e10cSrcweir }
2172cdf0e10cSrcweir else
2173cdf0e10cSrcweir // errechne sie
2174cdf0e10cSrcweir for( sal_uInt16 n = 0; n < rpFndLine->GetBoxes().Count(); ++n )
2175cdf0e10cSrcweir aPara.nOldSize += rpFndLine->GetBoxes()[n]
2176cdf0e10cSrcweir ->GetBox()->GetFrmFmt()->GetFrmSize().GetWidth();
2177cdf0e10cSrcweir
2178cdf0e10cSrcweir ((_FndLine*)rpFndLine)->GetBoxes().ForEach( &lcl_CopyBoxToDoc, &aPara );
2179cdf0e10cSrcweir if( pCpyPara->pTblNd->GetTable().IsNewModel() )
2180cdf0e10cSrcweir ++pCpyPara->nLnIdx;
2181cdf0e10cSrcweir return sal_True;
2182cdf0e10cSrcweir }
2183cdf0e10cSrcweir
CopyHeadlineIntoTable(SwTableNode & rTblNd)2184cdf0e10cSrcweir sal_Bool SwTable::CopyHeadlineIntoTable( SwTableNode& rTblNd )
2185cdf0e10cSrcweir {
2186cdf0e10cSrcweir // suche alle Boxen / Lines
2187cdf0e10cSrcweir SwSelBoxes aSelBoxes;
2188cdf0e10cSrcweir SwTableBox* pBox = GetTabSortBoxes()[ 0 ];
2189cdf0e10cSrcweir pBox = GetTblBox( pBox->GetSttNd()->StartOfSectionNode()->GetIndex() + 1 );
2190cdf0e10cSrcweir SelLineFromBox( pBox, aSelBoxes, sal_True );
2191cdf0e10cSrcweir
2192cdf0e10cSrcweir _FndBox aFndBox( 0, 0 );
2193cdf0e10cSrcweir {
2194cdf0e10cSrcweir _FndPara aPara( aSelBoxes, &aFndBox );
2195cdf0e10cSrcweir ((SwTableLines&)GetTabLines()).ForEach( &_FndLineCopyCol, &aPara );
2196cdf0e10cSrcweir }
2197cdf0e10cSrcweir if( !aFndBox.GetLines().Count() )
2198cdf0e10cSrcweir return sal_False;
2199cdf0e10cSrcweir
2200cdf0e10cSrcweir {
2201cdf0e10cSrcweir // Tabellen-Formeln in die relative Darstellung umwandeln
2202cdf0e10cSrcweir SwTableFmlUpdate aMsgHnt( this );
2203cdf0e10cSrcweir aMsgHnt.eFlags = TBL_RELBOXNAME;
2204cdf0e10cSrcweir GetFrmFmt()->GetDoc()->UpdateTblFlds( &aMsgHnt );
2205cdf0e10cSrcweir }
2206cdf0e10cSrcweir
2207cdf0e10cSrcweir _CpyTabFrms aCpyFmt;
2208cdf0e10cSrcweir _CpyPara aPara( &rTblNd, 1, aCpyFmt, sal_True );
2209cdf0e10cSrcweir aPara.nNewSize = aPara.nOldSize = rTblNd.GetTable().GetFrmFmt()->GetFrmSize().GetWidth();
2210cdf0e10cSrcweir // dann kopiere mal
2211cdf0e10cSrcweir if( IsNewModel() )
2212cdf0e10cSrcweir lcl_CalcNewWidths( aFndBox.GetLines(), aPara );
2213cdf0e10cSrcweir aFndBox.GetLines().ForEach( &lcl_CopyLineToDoc, &aPara );
2214cdf0e10cSrcweir if( rTblNd.GetTable().IsNewModel() )
2215cdf0e10cSrcweir { // The copied line must not contain any row span attributes > 1
2216cdf0e10cSrcweir SwTableLine* pLine = rTblNd.GetTable().GetTabLines()[0];
2217cdf0e10cSrcweir sal_uInt16 nColCount = pLine->GetTabBoxes().Count();
2218cdf0e10cSrcweir ASSERT( nColCount, "Empty Table Line" )
2219cdf0e10cSrcweir for( sal_uInt16 nCurrCol = 0; nCurrCol < nColCount; ++nCurrCol )
2220cdf0e10cSrcweir {
2221cdf0e10cSrcweir SwTableBox* pTableBox = pLine->GetTabBoxes()[nCurrCol];
2222cdf0e10cSrcweir ASSERT( pTableBox, "Missing Table Box" );
2223cdf0e10cSrcweir pTableBox->setRowSpan( 1 );
2224cdf0e10cSrcweir }
2225cdf0e10cSrcweir }
2226cdf0e10cSrcweir
2227cdf0e10cSrcweir return sal_True;
2228cdf0e10cSrcweir }
2229cdf0e10cSrcweir
MakeCopy(SwDoc * pInsDoc,const SwPosition & rPos,const SwSelBoxes & rSelBoxes,sal_Bool bCpyNds,sal_Bool bCpyName) const2230cdf0e10cSrcweir sal_Bool SwTable::MakeCopy( SwDoc* pInsDoc, const SwPosition& rPos,
2231cdf0e10cSrcweir const SwSelBoxes& rSelBoxes, sal_Bool bCpyNds,
2232cdf0e10cSrcweir sal_Bool bCpyName ) const
2233cdf0e10cSrcweir {
2234cdf0e10cSrcweir // suche alle Boxen / Lines
2235cdf0e10cSrcweir _FndBox aFndBox( 0, 0 );
2236cdf0e10cSrcweir {
2237cdf0e10cSrcweir _FndPara aPara( rSelBoxes, &aFndBox );
2238cdf0e10cSrcweir ((SwTableLines&)GetTabLines()).ForEach( &_FndLineCopyCol, &aPara );
2239cdf0e10cSrcweir }
2240cdf0e10cSrcweir if( !aFndBox.GetLines().Count() )
2241cdf0e10cSrcweir return sal_False;
2242cdf0e10cSrcweir
2243cdf0e10cSrcweir // erst die Poolvorlagen fuer die Tabelle kopieren, damit die dann
2244cdf0e10cSrcweir // wirklich kopiert und damit die gueltigen Werte haben.
2245cdf0e10cSrcweir SwDoc* pSrcDoc = GetFrmFmt()->GetDoc();
2246cdf0e10cSrcweir if( pSrcDoc != pInsDoc )
2247cdf0e10cSrcweir {
2248cdf0e10cSrcweir pInsDoc->CopyTxtColl( *pSrcDoc->GetTxtCollFromPool( RES_POOLCOLL_TABLE ) );
2249cdf0e10cSrcweir pInsDoc->CopyTxtColl( *pSrcDoc->GetTxtCollFromPool( RES_POOLCOLL_TABLE_HDLN ) );
2250cdf0e10cSrcweir }
2251cdf0e10cSrcweir
2252cdf0e10cSrcweir SwTable* pNewTbl = (SwTable*)pInsDoc->InsertTable(
2253cdf0e10cSrcweir SwInsertTableOptions( tabopts::HEADLINE_NO_BORDER, 1 ),
2254cdf0e10cSrcweir rPos, 1, 1, GetFrmFmt()->GetHoriOrient().GetHoriOrient(),
2255cdf0e10cSrcweir 0, 0, sal_False, IsNewModel() );
2256cdf0e10cSrcweir if( !pNewTbl )
2257cdf0e10cSrcweir return sal_False;
2258cdf0e10cSrcweir
2259cdf0e10cSrcweir SwNodeIndex aIdx( rPos.nNode, -1 );
2260cdf0e10cSrcweir SwTableNode* pTblNd = aIdx.GetNode().FindTableNode();
2261cdf0e10cSrcweir aIdx++;
2262cdf0e10cSrcweir ASSERT( pTblNd, "wo ist denn nun der TableNode?" );
2263cdf0e10cSrcweir
2264cdf0e10cSrcweir pTblNd->GetTable().SetRowsToRepeat( GetRowsToRepeat() );
2265cdf0e10cSrcweir
2266cdf0e10cSrcweir if( IS_TYPE( SwDDETable, this ))
2267cdf0e10cSrcweir {
2268cdf0e10cSrcweir // es wird eine DDE-Tabelle kopiert
2269cdf0e10cSrcweir // ist im neuen Dokument ueberhaupt der FeldTyp vorhanden ?
2270cdf0e10cSrcweir SwFieldType* pFldType = pInsDoc->InsertFldType(
2271cdf0e10cSrcweir *((SwDDETable*)this)->GetDDEFldType() );
2272cdf0e10cSrcweir ASSERT( pFldType, "unbekannter FieldType" );
2273cdf0e10cSrcweir
2274cdf0e10cSrcweir // tauschen am Node den Tabellen-Pointer aus
2275cdf0e10cSrcweir pNewTbl = new SwDDETable( *pNewTbl,
2276cdf0e10cSrcweir (SwDDEFieldType*)pFldType );
2277cdf0e10cSrcweir pTblNd->SetNewTable( pNewTbl, sal_False );
2278cdf0e10cSrcweir }
2279cdf0e10cSrcweir
2280cdf0e10cSrcweir pNewTbl->GetFrmFmt()->CopyAttrs( *GetFrmFmt() );
2281cdf0e10cSrcweir pNewTbl->SetTblChgMode( GetTblChgMode() );
2282cdf0e10cSrcweir
2283cdf0e10cSrcweir //Vernichten der Frms die bereits angelegt wurden.
2284cdf0e10cSrcweir pTblNd->DelFrms();
2285cdf0e10cSrcweir
2286cdf0e10cSrcweir {
2287cdf0e10cSrcweir // Tabellen-Formeln in die relative Darstellung umwandeln
2288cdf0e10cSrcweir SwTableFmlUpdate aMsgHnt( this );
2289cdf0e10cSrcweir aMsgHnt.eFlags = TBL_RELBOXNAME;
2290cdf0e10cSrcweir pSrcDoc->UpdateTblFlds( &aMsgHnt );
2291cdf0e10cSrcweir }
2292cdf0e10cSrcweir
2293cdf0e10cSrcweir SwTblNumFmtMerge aTNFM( *pSrcDoc, *pInsDoc );
2294cdf0e10cSrcweir
2295cdf0e10cSrcweir // Namen auch kopieren oder neuen eindeutigen erzeugen
2296cdf0e10cSrcweir if( bCpyName )
2297cdf0e10cSrcweir pNewTbl->GetFrmFmt()->SetName( GetFrmFmt()->GetName() );
2298cdf0e10cSrcweir
2299cdf0e10cSrcweir _CpyTabFrms aCpyFmt;
2300cdf0e10cSrcweir _CpyPara aPara( pTblNd, 1, aCpyFmt, bCpyNds );
2301cdf0e10cSrcweir aPara.nNewSize = aPara.nOldSize = GetFrmFmt()->GetFrmSize().GetWidth();
2302cdf0e10cSrcweir
2303cdf0e10cSrcweir if( IsNewModel() )
2304cdf0e10cSrcweir lcl_CalcNewWidths( aFndBox.GetLines(), aPara );
2305cdf0e10cSrcweir // dann kopiere mal
2306cdf0e10cSrcweir aFndBox.GetLines().ForEach( &lcl_CopyLineToDoc, &aPara );
2307cdf0e10cSrcweir
2308cdf0e10cSrcweir // dann setze oben und unten noch die "richtigen" Raender:
2309cdf0e10cSrcweir {
2310cdf0e10cSrcweir _FndLine* pFndLn = aFndBox.GetLines()[ 0 ];
2311cdf0e10cSrcweir SwTableLine* pLn = pFndLn->GetLine();
2312cdf0e10cSrcweir const SwTableLine* pTmp = pLn;
2313cdf0e10cSrcweir sal_uInt16 nLnPos = GetTabLines().GetPos( pTmp );
2314cdf0e10cSrcweir if( USHRT_MAX != nLnPos && nLnPos )
2315cdf0e10cSrcweir {
2316cdf0e10cSrcweir // es gibt eine Line davor
2317cdf0e10cSrcweir SwCollectTblLineBoxes aLnPara( sal_False, HEADLINE_BORDERCOPY );
2318cdf0e10cSrcweir
2319cdf0e10cSrcweir pLn = GetTabLines()[ nLnPos - 1 ];
2320cdf0e10cSrcweir pLn->GetTabBoxes().ForEach( &lcl_Box_CollectBox, &aLnPara );
2321cdf0e10cSrcweir
2322cdf0e10cSrcweir if( aLnPara.Resize( lcl_GetBoxOffset( aFndBox ),
2323cdf0e10cSrcweir lcl_GetLineWidth( *pFndLn )) )
2324cdf0e10cSrcweir {
2325cdf0e10cSrcweir aLnPara.SetValues( sal_True );
2326cdf0e10cSrcweir pLn = pNewTbl->GetTabLines()[ 0 ];
2327cdf0e10cSrcweir pLn->GetTabBoxes().ForEach( &lcl_BoxSetSplitBoxFmts, &aLnPara );
2328cdf0e10cSrcweir }
2329cdf0e10cSrcweir }
2330cdf0e10cSrcweir
2331cdf0e10cSrcweir pFndLn = aFndBox.GetLines()[ aFndBox.GetLines().Count() -1 ];
2332cdf0e10cSrcweir pLn = pFndLn->GetLine();
2333cdf0e10cSrcweir pTmp = pLn;
2334cdf0e10cSrcweir nLnPos = GetTabLines().GetPos( pTmp );
2335cdf0e10cSrcweir if( nLnPos < GetTabLines().Count() - 1 )
2336cdf0e10cSrcweir {
2337cdf0e10cSrcweir // es gibt eine Line dahinter
2338cdf0e10cSrcweir SwCollectTblLineBoxes aLnPara( sal_True, HEADLINE_BORDERCOPY );
2339cdf0e10cSrcweir
2340cdf0e10cSrcweir pLn = GetTabLines()[ nLnPos + 1 ];
2341cdf0e10cSrcweir pLn->GetTabBoxes().ForEach( &lcl_Box_CollectBox, &aLnPara );
2342cdf0e10cSrcweir
2343cdf0e10cSrcweir if( aLnPara.Resize( lcl_GetBoxOffset( aFndBox ),
2344cdf0e10cSrcweir lcl_GetLineWidth( *pFndLn )) )
2345cdf0e10cSrcweir {
2346cdf0e10cSrcweir aLnPara.SetValues( sal_False );
2347cdf0e10cSrcweir pLn = pNewTbl->GetTabLines()[ pNewTbl->GetTabLines().Count()-1 ];
2348cdf0e10cSrcweir pLn->GetTabBoxes().ForEach( &lcl_BoxSetSplitBoxFmts, &aLnPara );
2349cdf0e10cSrcweir }
2350cdf0e10cSrcweir }
2351cdf0e10cSrcweir }
2352cdf0e10cSrcweir
2353cdf0e10cSrcweir // die initiale Box muss noch geloescht werden
2354cdf0e10cSrcweir _DeleteBox( *pNewTbl, pNewTbl->GetTabLines()[
2355cdf0e10cSrcweir pNewTbl->GetTabLines().Count() - 1 ]->GetTabBoxes()[0],
2356cdf0e10cSrcweir 0, sal_False, sal_False );
2357cdf0e10cSrcweir
2358cdf0e10cSrcweir if( pNewTbl->IsNewModel() )
2359cdf0e10cSrcweir lcl_CheckRowSpan( *pNewTbl );
2360cdf0e10cSrcweir // Mal kurz aufraeumen:
2361cdf0e10cSrcweir pNewTbl->GCLines();
2362cdf0e10cSrcweir
2363cdf0e10cSrcweir pTblNd->MakeFrms( &aIdx ); // erzeuge die Frames neu
2364cdf0e10cSrcweir
2365cdf0e10cSrcweir CHECKTABLELAYOUT
2366cdf0e10cSrcweir
2367cdf0e10cSrcweir return sal_True;
2368cdf0e10cSrcweir }
2369cdf0e10cSrcweir
2370cdf0e10cSrcweir
2371cdf0e10cSrcweir
2372cdf0e10cSrcweir // ---------------------------------------------------------------
2373cdf0e10cSrcweir
2374cdf0e10cSrcweir // suche ab dieser Line nach der naechsten Box mit Inhalt
FindNextBox(const SwTable & rTbl,const SwTableBox * pSrchBox,sal_Bool bOvrTblLns) const2375cdf0e10cSrcweir SwTableBox* SwTableLine::FindNextBox( const SwTable& rTbl,
2376cdf0e10cSrcweir const SwTableBox* pSrchBox, sal_Bool bOvrTblLns ) const
2377cdf0e10cSrcweir {
2378cdf0e10cSrcweir const SwTableLine* pLine = this; // fuer M800
2379cdf0e10cSrcweir SwTableBox* pBox;
2380cdf0e10cSrcweir sal_uInt16 nFndPos;
2381cdf0e10cSrcweir if( GetTabBoxes().Count() && pSrchBox &&
2382cdf0e10cSrcweir USHRT_MAX != ( nFndPos = GetTabBoxes().GetPos( pSrchBox )) &&
2383cdf0e10cSrcweir nFndPos + 1 != GetTabBoxes().Count() )
2384cdf0e10cSrcweir {
2385cdf0e10cSrcweir pBox = GetTabBoxes()[ nFndPos + 1 ];
2386cdf0e10cSrcweir while( pBox->GetTabLines().Count() )
2387cdf0e10cSrcweir pBox = pBox->GetTabLines()[0]->GetTabBoxes()[0];
2388cdf0e10cSrcweir return pBox;
2389cdf0e10cSrcweir }
2390cdf0e10cSrcweir
2391cdf0e10cSrcweir if( GetUpper() )
2392cdf0e10cSrcweir {
2393cdf0e10cSrcweir nFndPos = GetUpper()->GetTabLines().GetPos( pLine );
2394cdf0e10cSrcweir ASSERT( USHRT_MAX != nFndPos, "Line nicht in der Tabelle" );
2395cdf0e10cSrcweir // gibts eine weitere Line
2396cdf0e10cSrcweir if( nFndPos+1 >= GetUpper()->GetTabLines().Count() )
2397cdf0e10cSrcweir return GetUpper()->GetUpper()->FindNextBox( rTbl, GetUpper(), bOvrTblLns );
2398cdf0e10cSrcweir pLine = GetUpper()->GetTabLines()[nFndPos+1];
2399cdf0e10cSrcweir }
2400cdf0e10cSrcweir else if( bOvrTblLns ) // ueber die "GrundLines" einer Tabelle ?
2401cdf0e10cSrcweir {
2402cdf0e10cSrcweir // suche in der Tabelle nach der naechsten Line
2403cdf0e10cSrcweir nFndPos = rTbl.GetTabLines().GetPos( pLine );
2404cdf0e10cSrcweir if( nFndPos + 1 >= rTbl.GetTabLines().Count() )
2405cdf0e10cSrcweir return 0; // es gibt keine weitere Box mehr
2406cdf0e10cSrcweir
2407cdf0e10cSrcweir pLine = rTbl.GetTabLines()[ nFndPos+1 ];
2408cdf0e10cSrcweir }
2409cdf0e10cSrcweir else
2410cdf0e10cSrcweir return 0;
2411cdf0e10cSrcweir
2412cdf0e10cSrcweir if( pLine->GetTabBoxes().Count() )
2413cdf0e10cSrcweir {
2414cdf0e10cSrcweir pBox = pLine->GetTabBoxes()[0];
2415cdf0e10cSrcweir while( pBox->GetTabLines().Count() )
2416cdf0e10cSrcweir pBox = pBox->GetTabLines()[0]->GetTabBoxes()[0];
2417cdf0e10cSrcweir return pBox;
2418cdf0e10cSrcweir }
2419cdf0e10cSrcweir return pLine->FindNextBox( rTbl, 0, bOvrTblLns );
2420cdf0e10cSrcweir }
2421cdf0e10cSrcweir
2422cdf0e10cSrcweir // suche ab dieser Line nach der vorherigen Box
FindPreviousBox(const SwTable & rTbl,const SwTableBox * pSrchBox,sal_Bool bOvrTblLns) const2423cdf0e10cSrcweir SwTableBox* SwTableLine::FindPreviousBox( const SwTable& rTbl,
2424cdf0e10cSrcweir const SwTableBox* pSrchBox, sal_Bool bOvrTblLns ) const
2425cdf0e10cSrcweir {
2426cdf0e10cSrcweir const SwTableLine* pLine = this; // fuer M800
2427cdf0e10cSrcweir SwTableBox* pBox;
2428cdf0e10cSrcweir sal_uInt16 nFndPos;
2429cdf0e10cSrcweir if( GetTabBoxes().Count() && pSrchBox &&
2430cdf0e10cSrcweir USHRT_MAX != ( nFndPos = GetTabBoxes().GetPos( pSrchBox )) &&
2431cdf0e10cSrcweir nFndPos )
2432cdf0e10cSrcweir {
2433cdf0e10cSrcweir pBox = GetTabBoxes()[ nFndPos - 1 ];
2434cdf0e10cSrcweir while( pBox->GetTabLines().Count() )
2435cdf0e10cSrcweir {
2436cdf0e10cSrcweir pLine = pBox->GetTabLines()[pBox->GetTabLines().Count()-1];
2437cdf0e10cSrcweir pBox = pLine->GetTabBoxes()[pLine->GetTabBoxes().Count()-1];
2438cdf0e10cSrcweir }
2439cdf0e10cSrcweir return pBox;
2440cdf0e10cSrcweir }
2441cdf0e10cSrcweir
2442cdf0e10cSrcweir if( GetUpper() )
2443cdf0e10cSrcweir {
2444cdf0e10cSrcweir nFndPos = GetUpper()->GetTabLines().GetPos( pLine );
2445cdf0e10cSrcweir ASSERT( USHRT_MAX != nFndPos, "Line nicht in der Tabelle" );
2446cdf0e10cSrcweir // gibts eine weitere Line
2447cdf0e10cSrcweir if( !nFndPos )
2448cdf0e10cSrcweir return GetUpper()->GetUpper()->FindPreviousBox( rTbl, GetUpper(), bOvrTblLns );
2449cdf0e10cSrcweir pLine = GetUpper()->GetTabLines()[nFndPos-1];
2450cdf0e10cSrcweir }
2451cdf0e10cSrcweir else if( bOvrTblLns ) // ueber die "GrundLines" einer Tabelle ?
2452cdf0e10cSrcweir {
2453cdf0e10cSrcweir // suche in der Tabelle nach der naechsten Line
2454cdf0e10cSrcweir nFndPos = rTbl.GetTabLines().GetPos( pLine );
2455cdf0e10cSrcweir if( !nFndPos )
2456cdf0e10cSrcweir return 0; // es gibt keine weitere Box mehr
2457cdf0e10cSrcweir
2458cdf0e10cSrcweir pLine = rTbl.GetTabLines()[ nFndPos-1 ];
2459cdf0e10cSrcweir }
2460cdf0e10cSrcweir else
2461cdf0e10cSrcweir return 0;
2462cdf0e10cSrcweir
2463cdf0e10cSrcweir if( pLine->GetTabBoxes().Count() )
2464cdf0e10cSrcweir {
2465cdf0e10cSrcweir pBox = pLine->GetTabBoxes()[pLine->GetTabBoxes().Count()-1];
2466cdf0e10cSrcweir while( pBox->GetTabLines().Count() )
2467cdf0e10cSrcweir {
2468cdf0e10cSrcweir pLine = pBox->GetTabLines()[pBox->GetTabLines().Count()-1];
2469cdf0e10cSrcweir pBox = pLine->GetTabBoxes()[pLine->GetTabBoxes().Count()-1];
2470cdf0e10cSrcweir }
2471cdf0e10cSrcweir return pBox;
2472cdf0e10cSrcweir }
2473cdf0e10cSrcweir return pLine->FindPreviousBox( rTbl, 0, bOvrTblLns );
2474cdf0e10cSrcweir }
2475cdf0e10cSrcweir
2476cdf0e10cSrcweir // suche ab dieser Line nach der naechsten Box mit Inhalt
FindNextBox(const SwTable & rTbl,const SwTableBox * pSrchBox,sal_Bool bOvrTblLns) const2477cdf0e10cSrcweir SwTableBox* SwTableBox::FindNextBox( const SwTable& rTbl,
2478cdf0e10cSrcweir const SwTableBox* pSrchBox, sal_Bool bOvrTblLns ) const
2479cdf0e10cSrcweir {
2480cdf0e10cSrcweir if( !pSrchBox && !GetTabLines().Count() )
2481cdf0e10cSrcweir return (SwTableBox*)this;
2482cdf0e10cSrcweir return GetUpper()->FindNextBox( rTbl, pSrchBox ? pSrchBox : this,
2483cdf0e10cSrcweir bOvrTblLns );
2484cdf0e10cSrcweir
2485cdf0e10cSrcweir }
2486cdf0e10cSrcweir
2487cdf0e10cSrcweir // suche ab dieser Line nach der naechsten Box mit Inhalt
FindPreviousBox(const SwTable & rTbl,const SwTableBox * pSrchBox,sal_Bool bOvrTblLns) const2488cdf0e10cSrcweir SwTableBox* SwTableBox::FindPreviousBox( const SwTable& rTbl,
2489cdf0e10cSrcweir const SwTableBox* pSrchBox, sal_Bool bOvrTblLns ) const
2490cdf0e10cSrcweir {
2491cdf0e10cSrcweir if( !pSrchBox && !GetTabLines().Count() )
2492cdf0e10cSrcweir return (SwTableBox*)this;
2493cdf0e10cSrcweir return GetUpper()->FindPreviousBox( rTbl, pSrchBox ? pSrchBox : this,
2494cdf0e10cSrcweir bOvrTblLns );
2495cdf0e10cSrcweir }
2496cdf0e10cSrcweir
2497cdf0e10cSrcweir
lcl_BoxSetHeadCondColl(const SwTableBox * & rpBox,void *)2498cdf0e10cSrcweir sal_Bool lcl_BoxSetHeadCondColl( const SwTableBox*& rpBox, void* )
2499cdf0e10cSrcweir {
2500cdf0e10cSrcweir // in der HeadLine sind die Absaetze mit BedingtenVorlage anzupassen
2501cdf0e10cSrcweir const SwStartNode* pSttNd = rpBox->GetSttNd();
2502cdf0e10cSrcweir if( pSttNd )
2503cdf0e10cSrcweir pSttNd->CheckSectionCondColl();
2504cdf0e10cSrcweir else
2505cdf0e10cSrcweir ((SwTableBox*)rpBox)->GetTabLines().ForEach( &lcl_LineSetHeadCondColl, 0 );
2506cdf0e10cSrcweir return sal_True;
2507cdf0e10cSrcweir }
2508cdf0e10cSrcweir
lcl_LineSetHeadCondColl(const SwTableLine * & rpLine,void *)2509cdf0e10cSrcweir sal_Bool lcl_LineSetHeadCondColl( const SwTableLine*& rpLine, void* )
2510cdf0e10cSrcweir {
2511cdf0e10cSrcweir ((SwTableLine*)rpLine)->GetTabBoxes().ForEach( &lcl_BoxSetHeadCondColl, 0 );
2512cdf0e10cSrcweir return sal_True;
2513cdf0e10cSrcweir }
2514cdf0e10cSrcweir
2515cdf0e10cSrcweir /* */
2516cdf0e10cSrcweir
lcl_GetDistance(SwTableBox * pBox,sal_Bool bLeft)2517cdf0e10cSrcweir SwTwips lcl_GetDistance( SwTableBox* pBox, sal_Bool bLeft )
2518cdf0e10cSrcweir {
2519cdf0e10cSrcweir sal_Bool bFirst = sal_True;
2520cdf0e10cSrcweir SwTwips nRet = 0;
2521cdf0e10cSrcweir SwTableLine* pLine;
2522cdf0e10cSrcweir while( pBox && 0 != ( pLine = pBox->GetUpper() ) )
2523cdf0e10cSrcweir {
2524cdf0e10cSrcweir sal_uInt16 nStt = 0, nPos = pLine->GetTabBoxes().C40_GETPOS( SwTableBox, pBox );
2525cdf0e10cSrcweir
2526cdf0e10cSrcweir if( bFirst && !bLeft )
2527cdf0e10cSrcweir ++nPos;
2528cdf0e10cSrcweir bFirst = sal_False;
2529cdf0e10cSrcweir
2530cdf0e10cSrcweir while( nStt < nPos )
2531cdf0e10cSrcweir nRet += pLine->GetTabBoxes()[ nStt++ ]->GetFrmFmt()
2532cdf0e10cSrcweir ->GetFrmSize().GetWidth();
2533cdf0e10cSrcweir pBox = pLine->GetUpper();
2534cdf0e10cSrcweir }
2535cdf0e10cSrcweir return nRet;
2536cdf0e10cSrcweir }
2537cdf0e10cSrcweir
lcl_SetSelBoxWidth(SwTableLine * pLine,CR_SetBoxWidth & rParam,SwTwips nDist,sal_Bool bCheck)2538cdf0e10cSrcweir sal_Bool lcl_SetSelBoxWidth( SwTableLine* pLine, CR_SetBoxWidth& rParam,
2539cdf0e10cSrcweir SwTwips nDist, sal_Bool bCheck )
2540cdf0e10cSrcweir {
2541cdf0e10cSrcweir SwTableBoxes& rBoxes = pLine->GetTabBoxes();
2542cdf0e10cSrcweir for( sal_uInt16 n = 0; n < rBoxes.Count(); ++n )
2543cdf0e10cSrcweir {
2544cdf0e10cSrcweir SwTableBox* pBox = rBoxes[ n ];
2545cdf0e10cSrcweir SwFrmFmt* pFmt = pBox->GetFrmFmt();
2546cdf0e10cSrcweir const SwFmtFrmSize& rSz = pFmt->GetFrmSize();
2547cdf0e10cSrcweir SwTwips nWidth = rSz.GetWidth();
2548cdf0e10cSrcweir sal_Bool bGreaterBox = sal_False;
2549cdf0e10cSrcweir
2550cdf0e10cSrcweir if( bCheck )
2551cdf0e10cSrcweir {
2552cdf0e10cSrcweir for( sal_uInt16 i = 0; i < pBox->GetTabLines().Count(); ++i )
2553cdf0e10cSrcweir if( !::lcl_SetSelBoxWidth( pBox->GetTabLines()[ i ], rParam,
2554cdf0e10cSrcweir nDist, sal_True ))
2555cdf0e10cSrcweir return sal_False;
2556cdf0e10cSrcweir
2557cdf0e10cSrcweir // dann noch mal alle "ContentBoxen" sammeln
2558cdf0e10cSrcweir if( ( 0 != ( bGreaterBox = TBLFIX_CHGABS != rParam.nMode && ( nDist + ( rParam.bLeft ? 0 : nWidth ) ) >= rParam.nSide)) ||
2559cdf0e10cSrcweir ( !rParam.bBigger && ( Abs( nDist + (( rParam.nMode && rParam.bLeft ) ? 0 : nWidth ) - rParam.nSide ) < COLFUZZY ) ) )
2560cdf0e10cSrcweir {
2561cdf0e10cSrcweir rParam.bAnyBoxFnd = sal_True;
2562cdf0e10cSrcweir SwTwips nLowerDiff;
2563cdf0e10cSrcweir if( bGreaterBox && TBLFIX_CHGPROP == rParam.nMode )
2564cdf0e10cSrcweir {
2565cdf0e10cSrcweir // die "anderen Boxen" wurden angepasst,
2566cdf0e10cSrcweir // also sich um diesen Betrag aendern
2567cdf0e10cSrcweir nLowerDiff = (nDist + ( rParam.bLeft ? 0 : nWidth ) ) - rParam.nSide;
2568cdf0e10cSrcweir nLowerDiff *= rParam.nDiff;
2569cdf0e10cSrcweir nLowerDiff /= rParam.nMaxSize;
2570cdf0e10cSrcweir nLowerDiff = rParam.nDiff - nLowerDiff;
2571cdf0e10cSrcweir }
2572cdf0e10cSrcweir else
2573cdf0e10cSrcweir nLowerDiff = rParam.nDiff;
2574cdf0e10cSrcweir
2575cdf0e10cSrcweir if( nWidth < nLowerDiff || nWidth - nLowerDiff < MINLAY )
2576cdf0e10cSrcweir return sal_False;
2577cdf0e10cSrcweir }
2578cdf0e10cSrcweir }
2579cdf0e10cSrcweir else
2580cdf0e10cSrcweir {
2581cdf0e10cSrcweir SwTwips nLowerDiff = 0, nOldLower = rParam.nLowerDiff;
2582cdf0e10cSrcweir for( sal_uInt16 i = 0; i < pBox->GetTabLines().Count(); ++i )
2583cdf0e10cSrcweir {
2584cdf0e10cSrcweir rParam.nLowerDiff = 0;
2585cdf0e10cSrcweir lcl_SetSelBoxWidth( pBox->GetTabLines()[ i ], rParam, nDist, sal_False );
2586cdf0e10cSrcweir
2587cdf0e10cSrcweir if( nLowerDiff < rParam.nLowerDiff )
2588cdf0e10cSrcweir nLowerDiff = rParam.nLowerDiff;
2589cdf0e10cSrcweir }
2590cdf0e10cSrcweir rParam.nLowerDiff = nOldLower;
2591cdf0e10cSrcweir
2592cdf0e10cSrcweir
2593cdf0e10cSrcweir if( nLowerDiff ||
2594cdf0e10cSrcweir ( 0 != ( bGreaterBox = !nOldLower && TBLFIX_CHGABS != rParam.nMode &&
2595cdf0e10cSrcweir ( nDist + ( rParam.bLeft ? 0 : nWidth ) ) >= rParam.nSide)) ||
2596cdf0e10cSrcweir ( Abs( nDist + ( (rParam.nMode && rParam.bLeft) ? 0 : nWidth )
2597cdf0e10cSrcweir - rParam.nSide ) < COLFUZZY ))
2598cdf0e10cSrcweir {
2599cdf0e10cSrcweir // in dieser Spalte ist der Cursor - also verkleinern / vergroessern
2600cdf0e10cSrcweir SwFmtFrmSize aNew( rSz );
2601cdf0e10cSrcweir
2602cdf0e10cSrcweir if( !nLowerDiff )
2603cdf0e10cSrcweir {
2604cdf0e10cSrcweir if( bGreaterBox && TBLFIX_CHGPROP == rParam.nMode )
2605cdf0e10cSrcweir {
2606cdf0e10cSrcweir // die "anderen Boxen" wurden angepasst,
2607cdf0e10cSrcweir // also sich um diesen Betrag aendern
2608cdf0e10cSrcweir nLowerDiff = (nDist + ( rParam.bLeft ? 0 : nWidth ) ) - rParam.nSide;
2609cdf0e10cSrcweir nLowerDiff *= rParam.nDiff;
2610cdf0e10cSrcweir nLowerDiff /= rParam.nMaxSize;
2611cdf0e10cSrcweir nLowerDiff = rParam.nDiff - nLowerDiff;
2612cdf0e10cSrcweir }
2613cdf0e10cSrcweir else
2614cdf0e10cSrcweir nLowerDiff = rParam.nDiff;
2615cdf0e10cSrcweir }
2616cdf0e10cSrcweir
2617cdf0e10cSrcweir rParam.nLowerDiff += nLowerDiff;
2618cdf0e10cSrcweir
2619cdf0e10cSrcweir if( rParam.bBigger )
2620cdf0e10cSrcweir aNew.SetWidth( nWidth + nLowerDiff );
2621cdf0e10cSrcweir else
2622cdf0e10cSrcweir aNew.SetWidth( nWidth - nLowerDiff );
2623cdf0e10cSrcweir rParam.aShareFmts.SetSize( *pBox, aNew );
2624cdf0e10cSrcweir break;
2625cdf0e10cSrcweir }
2626cdf0e10cSrcweir }
2627cdf0e10cSrcweir
2628cdf0e10cSrcweir if( rParam.bLeft && rParam.nMode && nDist >= rParam.nSide )
2629cdf0e10cSrcweir break;
2630cdf0e10cSrcweir
2631cdf0e10cSrcweir nDist += nWidth;
2632cdf0e10cSrcweir
2633cdf0e10cSrcweir // wenns groesser wird, dann wars das
2634cdf0e10cSrcweir if( ( TBLFIX_CHGABS == rParam.nMode || !rParam.bLeft ) &&
2635cdf0e10cSrcweir nDist >= rParam.nSide )
2636cdf0e10cSrcweir break;
2637cdf0e10cSrcweir }
2638cdf0e10cSrcweir return sal_True;
2639cdf0e10cSrcweir }
2640cdf0e10cSrcweir
lcl_SetOtherBoxWidth(SwTableLine * pLine,CR_SetBoxWidth & rParam,SwTwips nDist,sal_Bool bCheck)2641cdf0e10cSrcweir sal_Bool lcl_SetOtherBoxWidth( SwTableLine* pLine, CR_SetBoxWidth& rParam,
2642cdf0e10cSrcweir SwTwips nDist, sal_Bool bCheck )
2643cdf0e10cSrcweir {
2644cdf0e10cSrcweir SwTableBoxes& rBoxes = pLine->GetTabBoxes();
2645cdf0e10cSrcweir for( sal_uInt16 n = 0; n < rBoxes.Count(); ++n )
2646cdf0e10cSrcweir {
2647cdf0e10cSrcweir SwTableBox* pBox = rBoxes[ n ];
2648cdf0e10cSrcweir SwFrmFmt* pFmt = pBox->GetFrmFmt();
2649cdf0e10cSrcweir const SwFmtFrmSize& rSz = pFmt->GetFrmSize();
2650cdf0e10cSrcweir SwTwips nWidth = rSz.GetWidth();
2651cdf0e10cSrcweir
2652cdf0e10cSrcweir if( bCheck )
2653cdf0e10cSrcweir {
2654cdf0e10cSrcweir for( sal_uInt16 i = 0; i < pBox->GetTabLines().Count(); ++i )
2655cdf0e10cSrcweir if( !::lcl_SetOtherBoxWidth( pBox->GetTabLines()[ i ],
2656cdf0e10cSrcweir rParam, nDist, sal_True ))
2657cdf0e10cSrcweir return sal_False;
2658cdf0e10cSrcweir
2659cdf0e10cSrcweir if( rParam.bBigger && ( TBLFIX_CHGABS == rParam.nMode
2660cdf0e10cSrcweir ? Abs( nDist - rParam.nSide ) < COLFUZZY
2661cdf0e10cSrcweir : ( rParam.bLeft ? nDist < rParam.nSide - COLFUZZY
2662cdf0e10cSrcweir : nDist >= rParam.nSide - COLFUZZY )) )
2663cdf0e10cSrcweir {
2664cdf0e10cSrcweir rParam.bAnyBoxFnd = sal_True;
2665cdf0e10cSrcweir SwTwips nDiff;
2666cdf0e10cSrcweir if( TBLFIX_CHGPROP == rParam.nMode ) // Tabelle fix, proport.
2667cdf0e10cSrcweir {
2668cdf0e10cSrcweir // relativ berechnen
2669cdf0e10cSrcweir nDiff = nWidth;
2670cdf0e10cSrcweir nDiff *= rParam.nDiff;
2671cdf0e10cSrcweir nDiff /= rParam.nMaxSize;
2672cdf0e10cSrcweir }
2673cdf0e10cSrcweir else
2674cdf0e10cSrcweir nDiff = rParam.nDiff;
2675cdf0e10cSrcweir
2676cdf0e10cSrcweir if( nWidth < nDiff || nWidth - nDiff < MINLAY )
2677cdf0e10cSrcweir return sal_False;
2678cdf0e10cSrcweir }
2679cdf0e10cSrcweir }
2680cdf0e10cSrcweir else
2681cdf0e10cSrcweir {
2682cdf0e10cSrcweir SwTwips nLowerDiff = 0, nOldLower = rParam.nLowerDiff;
2683cdf0e10cSrcweir for( sal_uInt16 i = 0; i < pBox->GetTabLines().Count(); ++i )
2684cdf0e10cSrcweir {
2685cdf0e10cSrcweir rParam.nLowerDiff = 0;
2686cdf0e10cSrcweir lcl_SetOtherBoxWidth( pBox->GetTabLines()[ i ], rParam,
2687cdf0e10cSrcweir nDist, sal_False );
2688cdf0e10cSrcweir
2689cdf0e10cSrcweir if( nLowerDiff < rParam.nLowerDiff )
2690cdf0e10cSrcweir nLowerDiff = rParam.nLowerDiff;
2691cdf0e10cSrcweir }
2692cdf0e10cSrcweir rParam.nLowerDiff = nOldLower;
2693cdf0e10cSrcweir
2694cdf0e10cSrcweir if( nLowerDiff ||
2695cdf0e10cSrcweir ( TBLFIX_CHGABS == rParam.nMode
2696cdf0e10cSrcweir ? Abs( nDist - rParam.nSide ) < COLFUZZY
2697cdf0e10cSrcweir : ( rParam.bLeft ? nDist < rParam.nSide - COLFUZZY
2698cdf0e10cSrcweir : nDist >= rParam.nSide - COLFUZZY)
2699cdf0e10cSrcweir ) )
2700cdf0e10cSrcweir {
2701cdf0e10cSrcweir SwFmtFrmSize aNew( rSz );
2702cdf0e10cSrcweir
2703cdf0e10cSrcweir if( !nLowerDiff )
2704cdf0e10cSrcweir {
2705cdf0e10cSrcweir if( TBLFIX_CHGPROP == rParam.nMode ) // Tabelle fix, proport.
2706cdf0e10cSrcweir {
2707cdf0e10cSrcweir // relativ berechnen
2708cdf0e10cSrcweir nLowerDiff = nWidth;
2709cdf0e10cSrcweir nLowerDiff *= rParam.nDiff;
2710cdf0e10cSrcweir nLowerDiff /= rParam.nMaxSize;
2711cdf0e10cSrcweir }
2712cdf0e10cSrcweir else
2713cdf0e10cSrcweir nLowerDiff = rParam.nDiff;
2714cdf0e10cSrcweir }
2715cdf0e10cSrcweir
2716cdf0e10cSrcweir rParam.nLowerDiff += nLowerDiff;
2717cdf0e10cSrcweir
2718cdf0e10cSrcweir if( rParam.bBigger )
2719cdf0e10cSrcweir aNew.SetWidth( nWidth - nLowerDiff );
2720cdf0e10cSrcweir else
2721cdf0e10cSrcweir aNew.SetWidth( nWidth + nLowerDiff );
2722cdf0e10cSrcweir
2723cdf0e10cSrcweir rParam.aShareFmts.SetSize( *pBox, aNew );
2724cdf0e10cSrcweir }
2725cdf0e10cSrcweir }
2726cdf0e10cSrcweir
2727cdf0e10cSrcweir nDist += nWidth;
2728cdf0e10cSrcweir if( ( TBLFIX_CHGABS == rParam.nMode || rParam.bLeft ) &&
2729cdf0e10cSrcweir nDist > rParam.nSide )
2730cdf0e10cSrcweir break;
2731cdf0e10cSrcweir }
2732cdf0e10cSrcweir return sal_True;
2733cdf0e10cSrcweir }
2734cdf0e10cSrcweir
2735cdf0e10cSrcweir /**/
2736cdf0e10cSrcweir
lcl_InsSelBox(SwTableLine * pLine,CR_SetBoxWidth & rParam,SwTwips nDist,sal_Bool bCheck)2737cdf0e10cSrcweir sal_Bool lcl_InsSelBox( SwTableLine* pLine, CR_SetBoxWidth& rParam,
2738cdf0e10cSrcweir SwTwips nDist, sal_Bool bCheck )
2739cdf0e10cSrcweir {
2740cdf0e10cSrcweir SwTableBoxes& rBoxes = pLine->GetTabBoxes();
2741cdf0e10cSrcweir sal_uInt16 n, nCmp;
2742cdf0e10cSrcweir for( n = 0; n < rBoxes.Count(); ++n )
2743cdf0e10cSrcweir {
2744cdf0e10cSrcweir SwTableBox* pBox = rBoxes[ n ];
2745cdf0e10cSrcweir SwTableBoxFmt* pFmt = (SwTableBoxFmt*)pBox->GetFrmFmt();
2746cdf0e10cSrcweir const SwFmtFrmSize& rSz = pFmt->GetFrmSize();
2747cdf0e10cSrcweir SwTwips nWidth = rSz.GetWidth();
2748cdf0e10cSrcweir
2749cdf0e10cSrcweir if( bCheck )
2750cdf0e10cSrcweir {
2751cdf0e10cSrcweir for( sal_uInt16 i = 0; i < pBox->GetTabLines().Count(); ++i )
2752cdf0e10cSrcweir if( !::lcl_InsSelBox( pBox->GetTabLines()[ i ], rParam,
2753cdf0e10cSrcweir nDist, sal_True ))
2754cdf0e10cSrcweir return sal_False;
2755cdf0e10cSrcweir
2756cdf0e10cSrcweir // dann noch mal alle "ContentBoxen" sammeln
2757cdf0e10cSrcweir if( Abs( nDist + ( rParam.bLeft ? 0 : nWidth )
2758cdf0e10cSrcweir - rParam.nSide ) < COLFUZZY )
2759cdf0e10cSrcweir nCmp = 1;
2760cdf0e10cSrcweir else if( nDist + ( rParam.bLeft ? 0 : nWidth/2 ) > rParam.nSide )
2761cdf0e10cSrcweir nCmp = 2;
2762cdf0e10cSrcweir else
2763cdf0e10cSrcweir nCmp = 0;
2764cdf0e10cSrcweir
2765cdf0e10cSrcweir if( nCmp )
2766cdf0e10cSrcweir {
2767cdf0e10cSrcweir rParam.bAnyBoxFnd = sal_True;
2768cdf0e10cSrcweir if( pFmt->GetProtect().IsCntntProtected() )
2769cdf0e10cSrcweir return sal_False;
2770cdf0e10cSrcweir
2771cdf0e10cSrcweir if( rParam.bSplittBox &&
2772cdf0e10cSrcweir nWidth - rParam.nDiff <= COLFUZZY +
2773cdf0e10cSrcweir ( 567 / 2 /* min. 0,5 cm Platz lassen*/) )
2774cdf0e10cSrcweir return sal_False;
2775cdf0e10cSrcweir
2776cdf0e10cSrcweir if( pBox->GetSttNd() )
2777cdf0e10cSrcweir rParam.aBoxes.Insert( pBox );
2778cdf0e10cSrcweir
2779cdf0e10cSrcweir break;
2780cdf0e10cSrcweir }
2781cdf0e10cSrcweir }
2782cdf0e10cSrcweir else
2783cdf0e10cSrcweir {
2784cdf0e10cSrcweir SwTwips nLowerDiff = 0, nOldLower = rParam.nLowerDiff;
2785cdf0e10cSrcweir for( sal_uInt16 i = 0; i < pBox->GetTabLines().Count(); ++i )
2786cdf0e10cSrcweir {
2787cdf0e10cSrcweir rParam.nLowerDiff = 0;
2788cdf0e10cSrcweir lcl_InsSelBox( pBox->GetTabLines()[ i ], rParam, nDist, sal_False );
2789cdf0e10cSrcweir
2790cdf0e10cSrcweir if( nLowerDiff < rParam.nLowerDiff )
2791cdf0e10cSrcweir nLowerDiff = rParam.nLowerDiff;
2792cdf0e10cSrcweir }
2793cdf0e10cSrcweir rParam.nLowerDiff = nOldLower;
2794cdf0e10cSrcweir
2795cdf0e10cSrcweir if( nLowerDiff )
2796cdf0e10cSrcweir nCmp = 1;
2797cdf0e10cSrcweir else if( Abs( nDist + ( rParam.bLeft ? 0 : nWidth )
2798cdf0e10cSrcweir - rParam.nSide ) < COLFUZZY )
2799cdf0e10cSrcweir nCmp = 2;
2800cdf0e10cSrcweir else if( nDist + nWidth / 2 > rParam.nSide )
2801cdf0e10cSrcweir nCmp = 3;
2802cdf0e10cSrcweir else
2803cdf0e10cSrcweir nCmp = 0;
2804cdf0e10cSrcweir
2805cdf0e10cSrcweir if( nCmp )
2806cdf0e10cSrcweir {
2807cdf0e10cSrcweir // in dieser Spalte ist der Cursor - also verkleinern / vergroessern
2808cdf0e10cSrcweir if( 1 == nCmp )
2809cdf0e10cSrcweir {
2810cdf0e10cSrcweir if( !rParam.bSplittBox )
2811cdf0e10cSrcweir {
2812cdf0e10cSrcweir // die akt. Box auf
2813cdf0e10cSrcweir SwFmtFrmSize aNew( rSz );
2814cdf0e10cSrcweir aNew.SetWidth( nWidth + rParam.nDiff );
2815cdf0e10cSrcweir rParam.aShareFmts.SetSize( *pBox, aNew );
2816cdf0e10cSrcweir }
2817cdf0e10cSrcweir }
2818cdf0e10cSrcweir else
2819cdf0e10cSrcweir {
2820cdf0e10cSrcweir ASSERT( pBox->GetSttNd(), "Das muss eine EndBox sein!");
2821cdf0e10cSrcweir
2822cdf0e10cSrcweir if( !rParam.bLeft && 3 != nCmp )
2823cdf0e10cSrcweir ++n;
2824cdf0e10cSrcweir
2825cdf0e10cSrcweir ::_InsTblBox( pFmt->GetDoc(), rParam.pTblNd,
2826cdf0e10cSrcweir pLine, pFmt, pBox, n );
2827cdf0e10cSrcweir
2828cdf0e10cSrcweir SwTableBox* pNewBox = rBoxes[ n ];
2829cdf0e10cSrcweir SwFmtFrmSize aNew( rSz );
2830cdf0e10cSrcweir aNew.SetWidth( rParam.nDiff );
2831cdf0e10cSrcweir rParam.aShareFmts.SetSize( *pNewBox, aNew );
2832cdf0e10cSrcweir
2833cdf0e10cSrcweir // Sonderfall: kein Platz in den anderen Boxen
2834cdf0e10cSrcweir // aber in der Zelle
2835cdf0e10cSrcweir if( rParam.bSplittBox )
2836cdf0e10cSrcweir {
2837cdf0e10cSrcweir // die akt. Box auf
2838cdf0e10cSrcweir SwFmtFrmSize aNewSize( rSz );
2839cdf0e10cSrcweir aNewSize.SetWidth( nWidth - rParam.nDiff );
2840cdf0e10cSrcweir rParam.aShareFmts.SetSize( *pBox, aNewSize );
2841cdf0e10cSrcweir }
2842cdf0e10cSrcweir
2843cdf0e10cSrcweir // Sonderbehandlung fuer Umrandung die Rechte muss
2844cdf0e10cSrcweir // entfernt werden
2845cdf0e10cSrcweir {
2846cdf0e10cSrcweir const SvxBoxItem& rBoxItem = pBox->GetFrmFmt()->GetBox();
2847cdf0e10cSrcweir if( rBoxItem.GetRight() )
2848cdf0e10cSrcweir {
2849cdf0e10cSrcweir SvxBoxItem aTmp( rBoxItem );
2850cdf0e10cSrcweir aTmp.SetLine( 0, BOX_LINE_RIGHT );
2851cdf0e10cSrcweir rParam.aShareFmts.SetAttr( rParam.bLeft
2852cdf0e10cSrcweir ? *pNewBox
2853cdf0e10cSrcweir : *pBox, aTmp );
2854cdf0e10cSrcweir }
2855cdf0e10cSrcweir }
2856cdf0e10cSrcweir }
2857cdf0e10cSrcweir
2858cdf0e10cSrcweir rParam.nLowerDiff = rParam.nDiff;
2859cdf0e10cSrcweir break;
2860cdf0e10cSrcweir }
2861cdf0e10cSrcweir }
2862cdf0e10cSrcweir
2863cdf0e10cSrcweir if( rParam.bLeft && rParam.nMode && nDist >= rParam.nSide )
2864cdf0e10cSrcweir break;
2865cdf0e10cSrcweir
2866cdf0e10cSrcweir nDist += nWidth;
2867cdf0e10cSrcweir }
2868cdf0e10cSrcweir return sal_True;
2869cdf0e10cSrcweir }
2870cdf0e10cSrcweir
lcl_InsOtherBox(SwTableLine * pLine,CR_SetBoxWidth & rParam,SwTwips nDist,sal_Bool bCheck)2871cdf0e10cSrcweir sal_Bool lcl_InsOtherBox( SwTableLine* pLine, CR_SetBoxWidth& rParam,
2872cdf0e10cSrcweir SwTwips nDist, sal_Bool bCheck )
2873cdf0e10cSrcweir {
2874cdf0e10cSrcweir // Sonderfall: kein Platz in den anderen Boxen aber in der Zelle
2875cdf0e10cSrcweir if( rParam.bSplittBox )
2876cdf0e10cSrcweir return sal_True;
2877cdf0e10cSrcweir
2878cdf0e10cSrcweir SwTableBoxes& rBoxes = pLine->GetTabBoxes();
2879cdf0e10cSrcweir sal_uInt16 n;
2880cdf0e10cSrcweir
2881cdf0e10cSrcweir // Tabelle fix, proport.
2882cdf0e10cSrcweir if( !rParam.nRemainWidth && TBLFIX_CHGPROP == rParam.nMode )
2883cdf0e10cSrcweir {
2884cdf0e10cSrcweir // dann die richtige Breite suchen, auf die sich die relative
2885cdf0e10cSrcweir // Breitenanpassung bezieht.
2886cdf0e10cSrcweir SwTwips nTmpDist = nDist;
2887cdf0e10cSrcweir for( n = 0; n < rBoxes.Count(); ++n )
2888cdf0e10cSrcweir {
2889cdf0e10cSrcweir SwTwips nWidth = rBoxes[ n ]->GetFrmFmt()->GetFrmSize().GetWidth();
2890cdf0e10cSrcweir if( (nTmpDist + nWidth / 2 ) > rParam.nSide )
2891cdf0e10cSrcweir {
2892cdf0e10cSrcweir rParam.nRemainWidth = rParam.bLeft
2893cdf0e10cSrcweir ? sal_uInt16(nTmpDist)
2894cdf0e10cSrcweir : sal_uInt16(rParam.nTblWidth - nTmpDist);
2895cdf0e10cSrcweir break;
2896cdf0e10cSrcweir }
2897cdf0e10cSrcweir nTmpDist += nWidth;
2898cdf0e10cSrcweir }
2899cdf0e10cSrcweir }
2900cdf0e10cSrcweir
2901cdf0e10cSrcweir for( n = 0; n < rBoxes.Count(); ++n )
2902cdf0e10cSrcweir {
2903cdf0e10cSrcweir SwTableBox* pBox = rBoxes[ n ];
2904cdf0e10cSrcweir SwFrmFmt* pFmt = pBox->GetFrmFmt();
2905cdf0e10cSrcweir const SwFmtFrmSize& rSz = pFmt->GetFrmSize();
2906cdf0e10cSrcweir SwTwips nWidth = rSz.GetWidth();
2907cdf0e10cSrcweir
2908cdf0e10cSrcweir if( bCheck )
2909cdf0e10cSrcweir {
2910cdf0e10cSrcweir for( sal_uInt16 i = 0; i < pBox->GetTabLines().Count(); ++i )
2911cdf0e10cSrcweir if( !::lcl_InsOtherBox( pBox->GetTabLines()[ i ],
2912cdf0e10cSrcweir rParam, nDist, sal_True ))
2913cdf0e10cSrcweir return sal_False;
2914cdf0e10cSrcweir
2915cdf0e10cSrcweir if(
2916cdf0e10cSrcweir rParam.bLeft ? ((nDist + nWidth / 2 ) <= rParam.nSide &&
2917cdf0e10cSrcweir (TBLFIX_CHGABS != rParam.nMode ||
2918cdf0e10cSrcweir (n < rBoxes.Count() &&
2919cdf0e10cSrcweir (nDist + nWidth + rBoxes[ n+1 ]->
2920cdf0e10cSrcweir GetFrmFmt()->GetFrmSize().GetWidth() / 2)
2921cdf0e10cSrcweir > rParam.nSide) ))
2922cdf0e10cSrcweir : (nDist + nWidth / 2 ) > rParam.nSide
2923cdf0e10cSrcweir )
2924cdf0e10cSrcweir {
2925cdf0e10cSrcweir rParam.bAnyBoxFnd = sal_True;
2926cdf0e10cSrcweir SwTwips nDiff;
2927cdf0e10cSrcweir if( TBLFIX_CHGPROP == rParam.nMode ) // Tabelle fix, proport.
2928cdf0e10cSrcweir {
2929cdf0e10cSrcweir // relativ berechnen
2930cdf0e10cSrcweir nDiff = nWidth;
2931cdf0e10cSrcweir nDiff *= rParam.nDiff;
2932cdf0e10cSrcweir nDiff /= rParam.nRemainWidth;
2933cdf0e10cSrcweir
2934cdf0e10cSrcweir if( nWidth < nDiff || nWidth - nDiff < MINLAY )
2935cdf0e10cSrcweir return sal_False;
2936cdf0e10cSrcweir }
2937cdf0e10cSrcweir else
2938cdf0e10cSrcweir {
2939cdf0e10cSrcweir nDiff = rParam.nDiff;
2940cdf0e10cSrcweir
2941cdf0e10cSrcweir // teste ob die linke oder rechte Box gross genug
2942cdf0e10cSrcweir // ist, um den Platz abzugeben!
2943cdf0e10cSrcweir // es wird davor oder dahinter eine Box eingefuegt!
2944cdf0e10cSrcweir SwTwips nTmpWidth = nWidth;
2945cdf0e10cSrcweir if( rParam.bLeft && pBox->GetUpper()->GetUpper() )
2946cdf0e10cSrcweir {
2947cdf0e10cSrcweir const SwTableBox* pTmpBox = pBox;
2948cdf0e10cSrcweir sal_uInt16 nBoxPos = n;
2949cdf0e10cSrcweir while( !nBoxPos && pTmpBox->GetUpper()->GetUpper() )
2950cdf0e10cSrcweir {
2951cdf0e10cSrcweir pTmpBox = pTmpBox->GetUpper()->GetUpper();
2952cdf0e10cSrcweir nBoxPos = pTmpBox->GetUpper()->GetTabBoxes().GetPos( pTmpBox );
2953cdf0e10cSrcweir }
2954cdf0e10cSrcweir // if( nBoxPos )
2955cdf0e10cSrcweir nTmpWidth = pTmpBox->GetFrmFmt()->GetFrmSize().GetWidth();
2956cdf0e10cSrcweir // else
2957cdf0e10cSrcweir // nTmpWidth = 0;
2958cdf0e10cSrcweir }
2959cdf0e10cSrcweir
2960cdf0e10cSrcweir if( nTmpWidth < nDiff || nTmpWidth - nDiff < MINLAY )
2961cdf0e10cSrcweir return sal_False;
2962cdf0e10cSrcweir break;
2963cdf0e10cSrcweir }
2964cdf0e10cSrcweir }
2965cdf0e10cSrcweir }
2966cdf0e10cSrcweir else
2967cdf0e10cSrcweir {
2968cdf0e10cSrcweir SwTwips nLowerDiff = 0, nOldLower = rParam.nLowerDiff;
2969cdf0e10cSrcweir for( sal_uInt16 i = 0; i < pBox->GetTabLines().Count(); ++i )
2970cdf0e10cSrcweir {
2971cdf0e10cSrcweir rParam.nLowerDiff = 0;
2972cdf0e10cSrcweir lcl_InsOtherBox( pBox->GetTabLines()[ i ], rParam,
2973cdf0e10cSrcweir nDist, sal_False );
2974cdf0e10cSrcweir
2975cdf0e10cSrcweir if( nLowerDiff < rParam.nLowerDiff )
2976cdf0e10cSrcweir nLowerDiff = rParam.nLowerDiff;
2977cdf0e10cSrcweir }
2978cdf0e10cSrcweir rParam.nLowerDiff = nOldLower;
2979cdf0e10cSrcweir
2980cdf0e10cSrcweir if( nLowerDiff ||
2981cdf0e10cSrcweir (rParam.bLeft ? ((nDist + nWidth / 2 ) <= rParam.nSide &&
2982cdf0e10cSrcweir (TBLFIX_CHGABS != rParam.nMode ||
2983cdf0e10cSrcweir (n < rBoxes.Count() &&
2984cdf0e10cSrcweir (nDist + nWidth + rBoxes[ n+1 ]->
2985cdf0e10cSrcweir GetFrmFmt()->GetFrmSize().GetWidth() / 2)
2986cdf0e10cSrcweir > rParam.nSide) ))
2987cdf0e10cSrcweir : (nDist + nWidth / 2 ) > rParam.nSide ))
2988cdf0e10cSrcweir {
2989cdf0e10cSrcweir if( !nLowerDiff )
2990cdf0e10cSrcweir {
2991cdf0e10cSrcweir if( TBLFIX_CHGPROP == rParam.nMode ) // Tabelle fix, proport.
2992cdf0e10cSrcweir {
2993cdf0e10cSrcweir // relativ berechnen
2994cdf0e10cSrcweir nLowerDiff = nWidth;
2995cdf0e10cSrcweir nLowerDiff *= rParam.nDiff;
2996cdf0e10cSrcweir nLowerDiff /= rParam.nRemainWidth;
2997cdf0e10cSrcweir }
2998cdf0e10cSrcweir else
2999cdf0e10cSrcweir nLowerDiff = rParam.nDiff;
3000cdf0e10cSrcweir }
3001cdf0e10cSrcweir
3002cdf0e10cSrcweir SwFmtFrmSize aNew( rSz );
3003cdf0e10cSrcweir rParam.nLowerDiff += nLowerDiff;
3004cdf0e10cSrcweir
3005cdf0e10cSrcweir if( rParam.bBigger )
3006cdf0e10cSrcweir aNew.SetWidth( nWidth - nLowerDiff );
3007cdf0e10cSrcweir else
3008cdf0e10cSrcweir aNew.SetWidth( nWidth + nLowerDiff );
3009cdf0e10cSrcweir rParam.aShareFmts.SetSize( *pBox, aNew );
3010cdf0e10cSrcweir
3011cdf0e10cSrcweir if( TBLFIX_CHGABS == rParam.nMode )
3012cdf0e10cSrcweir break;
3013cdf0e10cSrcweir }
3014cdf0e10cSrcweir }
3015cdf0e10cSrcweir
3016cdf0e10cSrcweir nDist += nWidth;
3017cdf0e10cSrcweir }
3018cdf0e10cSrcweir return sal_True;
3019cdf0e10cSrcweir }
3020cdf0e10cSrcweir
3021cdf0e10cSrcweir
3022cdf0e10cSrcweir // das Ergebnis des Positions Vergleiches
3023cdf0e10cSrcweir // POS_BEFORE, // Box liegt davor
3024cdf0e10cSrcweir // POS_BEHIND, // Box liegt dahinter
3025cdf0e10cSrcweir // POS_INSIDE, // Box liegt vollstaendig in Start/End
3026cdf0e10cSrcweir // POS_OUTSIDE, // Box ueberlappt Start/End vollstaendig
3027cdf0e10cSrcweir // POS_EQUAL, // Box und Start/End sind gleich
3028cdf0e10cSrcweir // POS_OVERLAP_BEFORE, // Box ueberlappt den Start
3029cdf0e10cSrcweir // POS_OVERLAP_BEHIND // Box ueberlappt das Ende
3030cdf0e10cSrcweir
_CheckBoxInRange(sal_uInt16 nStt,sal_uInt16 nEnd,sal_uInt16 nBoxStt,sal_uInt16 nBoxEnd)3031cdf0e10cSrcweir SwComparePosition _CheckBoxInRange( sal_uInt16 nStt, sal_uInt16 nEnd,
3032cdf0e10cSrcweir sal_uInt16 nBoxStt, sal_uInt16 nBoxEnd )
3033cdf0e10cSrcweir {
3034cdf0e10cSrcweir // COLFUZZY noch beachten!!
3035cdf0e10cSrcweir SwComparePosition nRet;
3036cdf0e10cSrcweir if( nBoxStt + COLFUZZY < nStt )
3037cdf0e10cSrcweir {
3038cdf0e10cSrcweir if( nBoxEnd > nStt + COLFUZZY )
3039cdf0e10cSrcweir {
3040cdf0e10cSrcweir if( nBoxEnd >= nEnd + COLFUZZY )
3041cdf0e10cSrcweir nRet = POS_OUTSIDE;
3042cdf0e10cSrcweir else
3043cdf0e10cSrcweir nRet = POS_OVERLAP_BEFORE;
3044cdf0e10cSrcweir }
3045cdf0e10cSrcweir else
3046cdf0e10cSrcweir nRet = POS_BEFORE;
3047cdf0e10cSrcweir }
3048cdf0e10cSrcweir else if( nEnd > nBoxStt + COLFUZZY )
3049cdf0e10cSrcweir {
3050cdf0e10cSrcweir if( nEnd + COLFUZZY >= nBoxEnd )
3051cdf0e10cSrcweir {
3052cdf0e10cSrcweir if( COLFUZZY > Abs( long(nEnd) - long(nBoxEnd) ) &&
3053cdf0e10cSrcweir COLFUZZY > Abs( long(nStt) - long(nBoxStt) ) )
3054cdf0e10cSrcweir nRet = POS_EQUAL;
3055cdf0e10cSrcweir else
3056cdf0e10cSrcweir nRet = POS_INSIDE;
3057cdf0e10cSrcweir }
3058cdf0e10cSrcweir else
3059cdf0e10cSrcweir nRet = POS_OVERLAP_BEHIND;
3060cdf0e10cSrcweir }
3061cdf0e10cSrcweir else
3062cdf0e10cSrcweir nRet = POS_BEHIND;
3063cdf0e10cSrcweir
3064cdf0e10cSrcweir return nRet;
3065cdf0e10cSrcweir }
3066cdf0e10cSrcweir
lcl_DelSelBox_CorrLowers(SwTableLine & rLine,CR_SetBoxWidth & rParam,SwTwips nWidth)3067cdf0e10cSrcweir void lcl_DelSelBox_CorrLowers( SwTableLine& rLine, CR_SetBoxWidth& rParam,
3068cdf0e10cSrcweir SwTwips nWidth )
3069cdf0e10cSrcweir {
3070cdf0e10cSrcweir // 1. Schritt die eigene Breite feststellen
3071cdf0e10cSrcweir SwTableBoxes& rBoxes = rLine.GetTabBoxes();
3072cdf0e10cSrcweir SwTwips nBoxWidth = 0;
3073cdf0e10cSrcweir sal_uInt16 n;
3074cdf0e10cSrcweir
3075cdf0e10cSrcweir for( n = rBoxes.Count(); n; )
3076cdf0e10cSrcweir nBoxWidth += rBoxes[ --n ]->GetFrmFmt()->GetFrmSize().GetWidth();
3077cdf0e10cSrcweir
3078cdf0e10cSrcweir if( COLFUZZY < Abs( nWidth - nBoxWidth ))
3079cdf0e10cSrcweir {
3080cdf0e10cSrcweir // sie muessen also angepasst werden
3081cdf0e10cSrcweir for( n = rBoxes.Count(); n; )
3082cdf0e10cSrcweir {
3083cdf0e10cSrcweir SwTableBox* pBox = rBoxes[ --n ];
3084cdf0e10cSrcweir SwFmtFrmSize aNew( pBox->GetFrmFmt()->GetFrmSize() );
3085cdf0e10cSrcweir long nDiff = aNew.GetWidth();
3086cdf0e10cSrcweir nDiff *= nWidth;
3087cdf0e10cSrcweir nDiff /= nBoxWidth;
3088cdf0e10cSrcweir aNew.SetWidth( nDiff );
3089cdf0e10cSrcweir
3090cdf0e10cSrcweir rParam.aShareFmts.SetSize( *pBox, aNew );
3091cdf0e10cSrcweir
3092cdf0e10cSrcweir if( !pBox->GetSttNd() )
3093cdf0e10cSrcweir {
3094cdf0e10cSrcweir // hat selbst auch Lower, also auch die anpassen
3095cdf0e10cSrcweir for( sal_uInt16 i = pBox->GetTabLines().Count(); i; )
3096cdf0e10cSrcweir ::lcl_DelSelBox_CorrLowers( *pBox->GetTabLines()[ --i ],
3097cdf0e10cSrcweir rParam, nDiff );
3098cdf0e10cSrcweir }
3099cdf0e10cSrcweir }
3100cdf0e10cSrcweir }
3101cdf0e10cSrcweir }
3102cdf0e10cSrcweir
lcl_ChgBoxSize(SwTableBox & rBox,CR_SetBoxWidth & rParam,const SwFmtFrmSize & rOldSz,sal_uInt16 & rDelWidth,SwTwips nDist)3103cdf0e10cSrcweir void lcl_ChgBoxSize( SwTableBox& rBox, CR_SetBoxWidth& rParam,
3104cdf0e10cSrcweir const SwFmtFrmSize& rOldSz,
3105cdf0e10cSrcweir sal_uInt16& rDelWidth, SwTwips nDist )
3106cdf0e10cSrcweir {
3107cdf0e10cSrcweir long nDiff = 0;
3108cdf0e10cSrcweir sal_Bool bSetSize = sal_False;
3109cdf0e10cSrcweir
3110cdf0e10cSrcweir switch( rParam.nMode )
3111cdf0e10cSrcweir {
3112cdf0e10cSrcweir case TBLFIX_CHGABS: // Tabelle feste Breite, den Nachbar andern
3113cdf0e10cSrcweir nDiff = rDelWidth + rParam.nLowerDiff;
3114cdf0e10cSrcweir bSetSize = sal_True;
3115cdf0e10cSrcweir break;
3116cdf0e10cSrcweir
3117cdf0e10cSrcweir case TBLFIX_CHGPROP: // Tabelle feste Breite, alle Nachbarn aendern
3118cdf0e10cSrcweir if( !rParam.nRemainWidth )
3119cdf0e10cSrcweir {
3120cdf0e10cSrcweir // dann kurz berechnen:
3121cdf0e10cSrcweir if( rParam.bLeft )
3122cdf0e10cSrcweir rParam.nRemainWidth = sal_uInt16(nDist);
3123cdf0e10cSrcweir else
3124cdf0e10cSrcweir rParam.nRemainWidth = sal_uInt16(rParam.nTblWidth - nDist);
3125cdf0e10cSrcweir }
3126cdf0e10cSrcweir
3127cdf0e10cSrcweir // relativ berechnen
3128cdf0e10cSrcweir nDiff = rOldSz.GetWidth();
3129cdf0e10cSrcweir nDiff *= rDelWidth + rParam.nLowerDiff;
3130cdf0e10cSrcweir nDiff /= rParam.nRemainWidth;
3131cdf0e10cSrcweir
3132cdf0e10cSrcweir bSetSize = sal_True;
3133cdf0e10cSrcweir break;
3134cdf0e10cSrcweir
3135cdf0e10cSrcweir case TBLVAR_CHGABS: // Tabelle variable, alle Nachbarn aendern
3136cdf0e10cSrcweir if( COLFUZZY < Abs( rParam.nBoxWidth -
3137cdf0e10cSrcweir ( rDelWidth + rParam.nLowerDiff )))
3138cdf0e10cSrcweir {
3139cdf0e10cSrcweir nDiff = rDelWidth + rParam.nLowerDiff - rParam.nBoxWidth;
3140cdf0e10cSrcweir if( 0 < nDiff )
3141cdf0e10cSrcweir rDelWidth = rDelWidth - sal_uInt16(nDiff);
3142cdf0e10cSrcweir else
3143cdf0e10cSrcweir rDelWidth = rDelWidth + sal_uInt16(-nDiff);
3144cdf0e10cSrcweir bSetSize = sal_True;
3145cdf0e10cSrcweir }
3146cdf0e10cSrcweir break;
3147cdf0e10cSrcweir }
3148cdf0e10cSrcweir
3149cdf0e10cSrcweir if( bSetSize )
3150cdf0e10cSrcweir {
3151cdf0e10cSrcweir SwFmtFrmSize aNew( rOldSz );
3152cdf0e10cSrcweir aNew.SetWidth( aNew.GetWidth() + nDiff );
3153cdf0e10cSrcweir rParam.aShareFmts.SetSize( rBox, aNew );
3154cdf0e10cSrcweir
3155cdf0e10cSrcweir // dann leider nochmals die Lower anpassen
3156cdf0e10cSrcweir for( sal_uInt16 i = rBox.GetTabLines().Count(); i; )
3157cdf0e10cSrcweir ::lcl_DelSelBox_CorrLowers( *rBox.GetTabLines()[ --i ], rParam,
3158cdf0e10cSrcweir aNew.GetWidth() );
3159cdf0e10cSrcweir }
3160cdf0e10cSrcweir }
3161cdf0e10cSrcweir
lcl_DeleteBox_Rekursiv(CR_SetBoxWidth & rParam,SwTableBox & rBox,sal_Bool bCheck)3162cdf0e10cSrcweir sal_Bool lcl_DeleteBox_Rekursiv( CR_SetBoxWidth& rParam, SwTableBox& rBox,
3163cdf0e10cSrcweir sal_Bool bCheck )
3164cdf0e10cSrcweir {
3165cdf0e10cSrcweir sal_Bool bRet = sal_True;
3166cdf0e10cSrcweir if( rBox.GetSttNd() )
3167cdf0e10cSrcweir {
3168cdf0e10cSrcweir if( bCheck )
3169cdf0e10cSrcweir {
3170cdf0e10cSrcweir rParam.bAnyBoxFnd = sal_True;
3171cdf0e10cSrcweir if( rBox.GetFrmFmt()->GetProtect().IsCntntProtected() )
3172cdf0e10cSrcweir bRet = sal_False;
3173cdf0e10cSrcweir else
3174cdf0e10cSrcweir {
3175cdf0e10cSrcweir SwTableBox* pBox = &rBox;
3176cdf0e10cSrcweir rParam.aBoxes.Insert( pBox );
3177cdf0e10cSrcweir }
3178cdf0e10cSrcweir }
3179cdf0e10cSrcweir else
3180cdf0e10cSrcweir ::_DeleteBox( rParam.pTblNd->GetTable(), &rBox,
3181cdf0e10cSrcweir rParam.pUndo, sal_False, sal_True, &rParam.aShareFmts );
3182cdf0e10cSrcweir }
3183cdf0e10cSrcweir else
3184cdf0e10cSrcweir {
3185cdf0e10cSrcweir // die muessen leider alle sequentiel ueber die
3186cdf0e10cSrcweir // Contentboxen geloescht werden
3187cdf0e10cSrcweir for( sal_uInt16 i = rBox.GetTabLines().Count(); i; )
3188cdf0e10cSrcweir {
3189cdf0e10cSrcweir SwTableLine& rLine = *rBox.GetTabLines()[ --i ];
3190cdf0e10cSrcweir for( sal_uInt16 n = rLine.GetTabBoxes().Count(); n; )
3191cdf0e10cSrcweir if( !::lcl_DeleteBox_Rekursiv( rParam,
3192cdf0e10cSrcweir *rLine.GetTabBoxes()[ --n ], bCheck ))
3193cdf0e10cSrcweir return sal_False;
3194cdf0e10cSrcweir }
3195cdf0e10cSrcweir }
3196cdf0e10cSrcweir return bRet;
3197cdf0e10cSrcweir }
3198cdf0e10cSrcweir
lcl_DelSelBox(SwTableLine * pTabLine,CR_SetBoxWidth & rParam,SwTwips nDist,sal_Bool bCheck)3199cdf0e10cSrcweir sal_Bool lcl_DelSelBox( SwTableLine* pTabLine, CR_SetBoxWidth& rParam,
3200cdf0e10cSrcweir SwTwips nDist, sal_Bool bCheck )
3201cdf0e10cSrcweir {
3202cdf0e10cSrcweir SwTableBoxes& rBoxes = pTabLine->GetTabBoxes();
3203cdf0e10cSrcweir sal_uInt16 n, nCntEnd, nBoxChkStt, nBoxChkEnd, nDelWidth = 0;
3204cdf0e10cSrcweir if( rParam.bLeft )
3205cdf0e10cSrcweir {
3206cdf0e10cSrcweir n = rBoxes.Count();
3207cdf0e10cSrcweir nCntEnd = 0;
3208cdf0e10cSrcweir nBoxChkStt = (sal_uInt16)rParam.nSide;
3209cdf0e10cSrcweir nBoxChkEnd = static_cast<sal_uInt16>(rParam.nSide + rParam.nBoxWidth);
3210cdf0e10cSrcweir }
3211cdf0e10cSrcweir else
3212cdf0e10cSrcweir {
3213cdf0e10cSrcweir n = 0;
3214cdf0e10cSrcweir nCntEnd = rBoxes.Count();
3215cdf0e10cSrcweir nBoxChkStt = static_cast<sal_uInt16>(rParam.nSide - rParam.nBoxWidth);
3216cdf0e10cSrcweir nBoxChkEnd = (sal_uInt16)rParam.nSide;
3217cdf0e10cSrcweir }
3218cdf0e10cSrcweir
3219cdf0e10cSrcweir
3220cdf0e10cSrcweir while( n != nCntEnd )
3221cdf0e10cSrcweir {
3222cdf0e10cSrcweir SwTableBox* pBox;
3223cdf0e10cSrcweir if( rParam.bLeft )
3224cdf0e10cSrcweir pBox = rBoxes[ --n ];
3225cdf0e10cSrcweir else
3226cdf0e10cSrcweir pBox = rBoxes[ n++ ];
3227cdf0e10cSrcweir
3228cdf0e10cSrcweir SwFrmFmt* pFmt = pBox->GetFrmFmt();
3229cdf0e10cSrcweir const SwFmtFrmSize& rSz = pFmt->GetFrmSize();
3230cdf0e10cSrcweir long nWidth = rSz.GetWidth();
3231cdf0e10cSrcweir sal_Bool bDelBox = sal_False, bChgLowers = sal_False;
3232cdf0e10cSrcweir
3233cdf0e10cSrcweir // die Boxenbreite testen und entpsrechend reagieren
3234cdf0e10cSrcweir SwComparePosition ePosType = ::_CheckBoxInRange(
3235cdf0e10cSrcweir nBoxChkStt, nBoxChkEnd,
3236cdf0e10cSrcweir sal_uInt16(rParam.bLeft ? nDist - nWidth : nDist),
3237cdf0e10cSrcweir sal_uInt16(rParam.bLeft ? nDist : nDist + nWidth));
3238cdf0e10cSrcweir
3239cdf0e10cSrcweir switch( ePosType )
3240cdf0e10cSrcweir {
3241cdf0e10cSrcweir case POS_BEFORE:
3242cdf0e10cSrcweir if( bCheck )
3243cdf0e10cSrcweir {
3244cdf0e10cSrcweir if( rParam.bLeft )
3245cdf0e10cSrcweir return sal_True;
3246cdf0e10cSrcweir }
3247cdf0e10cSrcweir else if( rParam.bLeft )
3248cdf0e10cSrcweir {
3249cdf0e10cSrcweir ::lcl_ChgBoxSize( *pBox, rParam, rSz, nDelWidth, nDist );
3250cdf0e10cSrcweir if( TBLFIX_CHGABS == rParam.nMode )
3251cdf0e10cSrcweir n = nCntEnd;
3252cdf0e10cSrcweir }
3253cdf0e10cSrcweir break;
3254cdf0e10cSrcweir
3255cdf0e10cSrcweir case POS_BEHIND:
3256cdf0e10cSrcweir if( bCheck )
3257cdf0e10cSrcweir {
3258cdf0e10cSrcweir if( !rParam.bLeft )
3259cdf0e10cSrcweir return sal_True;
3260cdf0e10cSrcweir }
3261cdf0e10cSrcweir else if( !rParam.bLeft )
3262cdf0e10cSrcweir {
3263cdf0e10cSrcweir ::lcl_ChgBoxSize( *pBox, rParam, rSz, nDelWidth, nDist );
3264cdf0e10cSrcweir if( TBLFIX_CHGABS == rParam.nMode )
3265cdf0e10cSrcweir n = nCntEnd;
3266cdf0e10cSrcweir }
3267cdf0e10cSrcweir break;
3268cdf0e10cSrcweir
3269cdf0e10cSrcweir case POS_OUTSIDE: // Box ueberlappt Start/End vollstaendig
3270cdf0e10cSrcweir case POS_INSIDE: // Box liegt vollstaendig in Start/End
3271cdf0e10cSrcweir case POS_EQUAL: // Box und Start/End sind gleich
3272cdf0e10cSrcweir bDelBox = sal_True;
3273cdf0e10cSrcweir break;
3274cdf0e10cSrcweir
3275cdf0e10cSrcweir case POS_OVERLAP_BEFORE: // Box ueberlappt den Start
3276cdf0e10cSrcweir if( nBoxChkStt <= ( nDist + (rParam.bLeft ? - nWidth / 2
3277cdf0e10cSrcweir : nWidth / 2 )))
3278cdf0e10cSrcweir {
3279cdf0e10cSrcweir if( !pBox->GetSttNd() )
3280cdf0e10cSrcweir bChgLowers = sal_True;
3281cdf0e10cSrcweir else
3282cdf0e10cSrcweir bDelBox = sal_True;
3283cdf0e10cSrcweir }
3284cdf0e10cSrcweir else if( !bCheck && rParam.bLeft )
3285cdf0e10cSrcweir {
3286cdf0e10cSrcweir if( !pBox->GetSttNd() )
3287cdf0e10cSrcweir bChgLowers = sal_True;
3288cdf0e10cSrcweir else
3289cdf0e10cSrcweir {
3290cdf0e10cSrcweir ::lcl_ChgBoxSize( *pBox, rParam, rSz, nDelWidth, nDist );
3291cdf0e10cSrcweir if( TBLFIX_CHGABS == rParam.nMode )
3292cdf0e10cSrcweir n = nCntEnd;
3293cdf0e10cSrcweir }
3294cdf0e10cSrcweir }
3295cdf0e10cSrcweir break;
3296cdf0e10cSrcweir
3297cdf0e10cSrcweir case POS_OVERLAP_BEHIND: // Box ueberlappt das Ende
3298cdf0e10cSrcweir // JP 10.02.99:
3299cdf0e10cSrcweir // generell loeschen oder wie beim OVERLAP_Before nur die, die
3300cdf0e10cSrcweir // bis zur Haelfte in die "Loesch-"Box reicht ???
3301cdf0e10cSrcweir if( !pBox->GetSttNd() )
3302cdf0e10cSrcweir bChgLowers = sal_True;
3303cdf0e10cSrcweir else
3304cdf0e10cSrcweir bDelBox = sal_True;
3305cdf0e10cSrcweir break;
3306cdf0e10cSrcweir default: break;
3307cdf0e10cSrcweir }
3308cdf0e10cSrcweir
3309cdf0e10cSrcweir if( bDelBox )
3310cdf0e10cSrcweir {
3311cdf0e10cSrcweir nDelWidth = nDelWidth + sal_uInt16(nWidth);
3312cdf0e10cSrcweir if( bCheck )
3313cdf0e10cSrcweir {
3314cdf0e10cSrcweir // die letzte/erste Box kann nur bei Tbl-Var geloescht werden,
3315cdf0e10cSrcweir // wenn diese so gross ist, wie die Aenderung an der Tabelle
3316cdf0e10cSrcweir if( (( TBLVAR_CHGABS != rParam.nMode ||
3317cdf0e10cSrcweir nDelWidth != rParam.nBoxWidth ) &&
3318cdf0e10cSrcweir COLFUZZY > Abs( rParam.bLeft
3319cdf0e10cSrcweir ? nWidth - nDist
3320cdf0e10cSrcweir : (nDist + nWidth - rParam.nTblWidth )))
3321cdf0e10cSrcweir || !::lcl_DeleteBox_Rekursiv( rParam, *pBox, bCheck ) )
3322cdf0e10cSrcweir return sal_False;
3323cdf0e10cSrcweir
3324cdf0e10cSrcweir if( pFmt->GetProtect().IsCntntProtected() )
3325cdf0e10cSrcweir return sal_False;
3326cdf0e10cSrcweir }
3327cdf0e10cSrcweir else
3328cdf0e10cSrcweir {
3329cdf0e10cSrcweir ::lcl_DeleteBox_Rekursiv( rParam, *pBox, bCheck );
3330cdf0e10cSrcweir
3331cdf0e10cSrcweir if( !rParam.bLeft )
3332cdf0e10cSrcweir --n, --nCntEnd;
3333cdf0e10cSrcweir }
3334cdf0e10cSrcweir }
3335cdf0e10cSrcweir else if( bChgLowers )
3336cdf0e10cSrcweir {
3337cdf0e10cSrcweir sal_Bool bFirst = sal_True, bCorrLowers = sal_False;
3338cdf0e10cSrcweir long nLowerDiff = 0;
3339cdf0e10cSrcweir long nOldLower = rParam.nLowerDiff;
3340cdf0e10cSrcweir sal_uInt16 nOldRemain = rParam.nRemainWidth;
3341cdf0e10cSrcweir sal_uInt16 i;
3342cdf0e10cSrcweir
3343cdf0e10cSrcweir for( i = pBox->GetTabLines().Count(); i; )
3344cdf0e10cSrcweir {
3345cdf0e10cSrcweir rParam.nLowerDiff = nDelWidth + nOldLower;
3346cdf0e10cSrcweir rParam.nRemainWidth = nOldRemain;
3347cdf0e10cSrcweir SwTableLine* pLine = pBox->GetTabLines()[ --i ];
3348cdf0e10cSrcweir if( !::lcl_DelSelBox( pLine, rParam, nDist, bCheck ))
3349cdf0e10cSrcweir return sal_False;
3350cdf0e10cSrcweir
3351cdf0e10cSrcweir // gibt es die Box und die darin enthaltenen Lines noch??
3352cdf0e10cSrcweir if( n < rBoxes.Count() &&
3353cdf0e10cSrcweir pBox == rBoxes[ rParam.bLeft ? n : n-1 ] &&
3354cdf0e10cSrcweir i < pBox->GetTabLines().Count() &&
3355cdf0e10cSrcweir pLine == pBox->GetTabLines()[ i ] )
3356cdf0e10cSrcweir {
3357cdf0e10cSrcweir if( !bFirst && !bCorrLowers &&
3358cdf0e10cSrcweir COLFUZZY < Abs( nLowerDiff - rParam.nLowerDiff ) )
3359cdf0e10cSrcweir bCorrLowers = sal_True;
3360cdf0e10cSrcweir
3361cdf0e10cSrcweir // die groesste "loesch" Breite entscheidet, aber nur wenn
3362cdf0e10cSrcweir // nicht die gesamte Line geloescht wurde
3363cdf0e10cSrcweir if( nLowerDiff < rParam.nLowerDiff )
3364cdf0e10cSrcweir nLowerDiff = rParam.nLowerDiff;
3365cdf0e10cSrcweir
3366cdf0e10cSrcweir bFirst = sal_False;
3367cdf0e10cSrcweir }
3368cdf0e10cSrcweir }
3369cdf0e10cSrcweir rParam.nLowerDiff = nOldLower;
3370cdf0e10cSrcweir rParam.nRemainWidth = nOldRemain;
3371cdf0e10cSrcweir
3372cdf0e10cSrcweir // wurden alle Boxen geloescht? Dann ist die DelBreite natuerlich
3373cdf0e10cSrcweir // die Boxenbreite
3374cdf0e10cSrcweir if( !nLowerDiff )
3375cdf0e10cSrcweir nLowerDiff = nWidth;
3376cdf0e10cSrcweir
3377cdf0e10cSrcweir // DelBreite anpassen!!
3378cdf0e10cSrcweir nDelWidth = nDelWidth + sal_uInt16(nLowerDiff);
3379cdf0e10cSrcweir
3380cdf0e10cSrcweir if( !bCheck )
3381cdf0e10cSrcweir {
3382cdf0e10cSrcweir // wurde die Box schon entfernt?
3383cdf0e10cSrcweir if( n > rBoxes.Count() ||
3384cdf0e10cSrcweir pBox != rBoxes[ ( rParam.bLeft ? n : n-1 ) ] )
3385cdf0e10cSrcweir {
3386cdf0e10cSrcweir // dann beim Loeschen nach rechts die Laufvar. anpassen
3387cdf0e10cSrcweir if( !rParam.bLeft )
3388cdf0e10cSrcweir --n, --nCntEnd;
3389cdf0e10cSrcweir }
3390cdf0e10cSrcweir else
3391cdf0e10cSrcweir {
3392cdf0e10cSrcweir // sonst muss die Groesse der Box angepasst werden
3393cdf0e10cSrcweir SwFmtFrmSize aNew( rSz );
3394cdf0e10cSrcweir sal_Bool bCorrRel = sal_False;
3395cdf0e10cSrcweir
3396cdf0e10cSrcweir if( TBLVAR_CHGABS != rParam.nMode )
3397cdf0e10cSrcweir {
3398cdf0e10cSrcweir switch( ePosType )
3399cdf0e10cSrcweir {
3400cdf0e10cSrcweir case POS_OVERLAP_BEFORE: // Box ueberlappt den Start
3401cdf0e10cSrcweir if( TBLFIX_CHGPROP == rParam.nMode )
3402cdf0e10cSrcweir bCorrRel = rParam.bLeft;
3403cdf0e10cSrcweir else if( rParam.bLeft ) // TBLFIX_CHGABS
3404cdf0e10cSrcweir {
3405cdf0e10cSrcweir nLowerDiff = nLowerDiff - nDelWidth;
3406cdf0e10cSrcweir bCorrLowers = sal_True;
3407cdf0e10cSrcweir n = nCntEnd;
3408cdf0e10cSrcweir }
3409cdf0e10cSrcweir break;
3410cdf0e10cSrcweir
3411cdf0e10cSrcweir case POS_OVERLAP_BEHIND: // Box ueberlappt das Ende
3412cdf0e10cSrcweir if( TBLFIX_CHGPROP == rParam.nMode )
3413cdf0e10cSrcweir bCorrRel = !rParam.bLeft;
3414cdf0e10cSrcweir else if( !rParam.bLeft ) // TBLFIX_CHGABS
3415cdf0e10cSrcweir {
3416cdf0e10cSrcweir nLowerDiff = nLowerDiff - nDelWidth;
3417cdf0e10cSrcweir bCorrLowers = sal_True;
3418cdf0e10cSrcweir n = nCntEnd;
3419cdf0e10cSrcweir }
3420cdf0e10cSrcweir break;
3421cdf0e10cSrcweir
3422cdf0e10cSrcweir default:
3423cdf0e10cSrcweir ASSERT( !pBox, "hier sollte man nie hinkommen" );
3424cdf0e10cSrcweir break;
3425cdf0e10cSrcweir }
3426cdf0e10cSrcweir }
3427cdf0e10cSrcweir
3428cdf0e10cSrcweir if( bCorrRel )
3429cdf0e10cSrcweir {
3430cdf0e10cSrcweir if( !rParam.nRemainWidth )
3431cdf0e10cSrcweir {
3432cdf0e10cSrcweir // dann kurz berechnen:
3433cdf0e10cSrcweir if( rParam.bLeft )
3434cdf0e10cSrcweir rParam.nRemainWidth = sal_uInt16(nDist - nLowerDiff);
3435cdf0e10cSrcweir else
3436cdf0e10cSrcweir rParam.nRemainWidth = sal_uInt16(rParam.nTblWidth - nDist
3437cdf0e10cSrcweir - nLowerDiff );
3438cdf0e10cSrcweir }
3439cdf0e10cSrcweir
3440cdf0e10cSrcweir long nDiff = aNew.GetWidth() - nLowerDiff;
3441cdf0e10cSrcweir nDiff *= nDelWidth + rParam.nLowerDiff;
3442cdf0e10cSrcweir nDiff /= rParam.nRemainWidth;
3443cdf0e10cSrcweir
3444cdf0e10cSrcweir aNew.SetWidth( aNew.GetWidth() - nLowerDiff + nDiff );
3445cdf0e10cSrcweir }
3446cdf0e10cSrcweir else
3447cdf0e10cSrcweir aNew.SetWidth( aNew.GetWidth() - nLowerDiff );
3448cdf0e10cSrcweir rParam.aShareFmts.SetSize( *pBox, aNew );
3449cdf0e10cSrcweir
3450cdf0e10cSrcweir if( bCorrLowers )
3451cdf0e10cSrcweir {
3452cdf0e10cSrcweir // dann leider nochmals die Lower anpassen
3453cdf0e10cSrcweir for( i = pBox->GetTabLines().Count(); i; )
3454cdf0e10cSrcweir ::lcl_DelSelBox_CorrLowers( *pBox->
3455cdf0e10cSrcweir GetTabLines()[ --i ], rParam, aNew.GetWidth() );
3456cdf0e10cSrcweir }
3457cdf0e10cSrcweir }
3458cdf0e10cSrcweir }
3459cdf0e10cSrcweir }
3460cdf0e10cSrcweir
3461cdf0e10cSrcweir if( rParam.bLeft )
3462cdf0e10cSrcweir nDist -= nWidth;
3463cdf0e10cSrcweir else
3464cdf0e10cSrcweir nDist += nWidth;
3465cdf0e10cSrcweir }
3466cdf0e10cSrcweir rParam.nLowerDiff = nDelWidth;
3467cdf0e10cSrcweir return sal_True;
3468cdf0e10cSrcweir }
3469cdf0e10cSrcweir
3470cdf0e10cSrcweir // Dummy Funktion fuer die Methode SetColWidth
lcl_DelOtherBox(SwTableLine *,CR_SetBoxWidth &,SwTwips,sal_Bool)3471cdf0e10cSrcweir sal_Bool lcl_DelOtherBox( SwTableLine* , CR_SetBoxWidth& , SwTwips , sal_Bool )
3472cdf0e10cSrcweir {
3473cdf0e10cSrcweir return sal_True;
3474cdf0e10cSrcweir }
3475cdf0e10cSrcweir
3476cdf0e10cSrcweir /**/
3477cdf0e10cSrcweir
lcl_AjustLines(SwTableLine * pLine,CR_SetBoxWidth & rParam)3478cdf0e10cSrcweir void lcl_AjustLines( SwTableLine* pLine, CR_SetBoxWidth& rParam )
3479cdf0e10cSrcweir {
3480cdf0e10cSrcweir SwTableBoxes& rBoxes = pLine->GetTabBoxes();
3481cdf0e10cSrcweir for( sal_uInt16 n = 0; n < rBoxes.Count(); ++n )
3482cdf0e10cSrcweir {
3483cdf0e10cSrcweir SwTableBox* pBox = rBoxes[ n ];
3484cdf0e10cSrcweir
3485cdf0e10cSrcweir SwFmtFrmSize aSz( pBox->GetFrmFmt()->GetFrmSize() );
3486cdf0e10cSrcweir SwTwips nWidth = aSz.GetWidth();
3487cdf0e10cSrcweir nWidth *= rParam.nDiff;
3488cdf0e10cSrcweir nWidth /= rParam.nMaxSize;
3489cdf0e10cSrcweir aSz.SetWidth( nWidth );
3490cdf0e10cSrcweir rParam.aShareFmts.SetSize( *pBox, aSz );
3491cdf0e10cSrcweir
3492cdf0e10cSrcweir for( sal_uInt16 i = 0; i < pBox->GetTabLines().Count(); ++i )
3493cdf0e10cSrcweir ::lcl_AjustLines( pBox->GetTabLines()[ i ], rParam );
3494cdf0e10cSrcweir }
3495cdf0e10cSrcweir }
3496cdf0e10cSrcweir
3497cdf0e10cSrcweir #if defined(DBG_UTIL) || defined( JP_DEBUG )
3498cdf0e10cSrcweir
_CheckBoxWidth(const SwTableLine & rLine,SwTwips nSize)3499cdf0e10cSrcweir void _CheckBoxWidth( const SwTableLine& rLine, SwTwips nSize )
3500cdf0e10cSrcweir {
3501cdf0e10cSrcweir const SwTableBoxes& rBoxes = rLine.GetTabBoxes();
3502cdf0e10cSrcweir
3503cdf0e10cSrcweir SwTwips nAktSize = 0;
3504cdf0e10cSrcweir // checke doch mal ob die Tabellen korrekte Breiten haben
3505cdf0e10cSrcweir for( sal_uInt16 n = 0; n < rBoxes.Count(); ++n )
3506cdf0e10cSrcweir {
3507cdf0e10cSrcweir const SwTableBox* pBox = rBoxes[ n ];
3508cdf0e10cSrcweir const SwTwips nBoxW = pBox->GetFrmFmt()->GetFrmSize().GetWidth();
3509cdf0e10cSrcweir nAktSize += nBoxW;
3510cdf0e10cSrcweir
3511cdf0e10cSrcweir for( sal_uInt16 i = 0; i < pBox->GetTabLines().Count(); ++i )
3512cdf0e10cSrcweir _CheckBoxWidth( *pBox->GetTabLines()[ i ], nBoxW );
3513cdf0e10cSrcweir }
3514cdf0e10cSrcweir
3515cdf0e10cSrcweir if( Abs( nAktSize - nSize ) > ( COLFUZZY * rBoxes.Count() ) )
3516cdf0e10cSrcweir {
3517cdf0e10cSrcweir DBG_ERROR( "Boxen der Line zu klein/gross" );
3518cdf0e10cSrcweir #if defined( WNT ) && defined( JP_DEBUG )
3519cdf0e10cSrcweir __asm int 3;
3520cdf0e10cSrcweir #endif
3521cdf0e10cSrcweir }
3522cdf0e10cSrcweir }
3523cdf0e10cSrcweir
3524cdf0e10cSrcweir #endif
3525cdf0e10cSrcweir
lcl_SaveInsDelData(CR_SetBoxWidth & rParam,SwUndo ** ppUndo,SwTableSortBoxes & rTmpLst,SwTwips nDistStt)3526cdf0e10cSrcweir _FndBox* lcl_SaveInsDelData( CR_SetBoxWidth& rParam, SwUndo** ppUndo,
3527cdf0e10cSrcweir SwTableSortBoxes& rTmpLst, SwTwips nDistStt )
3528cdf0e10cSrcweir {
3529cdf0e10cSrcweir // suche alle Boxen / Lines
3530cdf0e10cSrcweir SwTable& rTbl = rParam.pTblNd->GetTable();
3531cdf0e10cSrcweir
3532cdf0e10cSrcweir if( !rParam.aBoxes.Count() )
3533cdf0e10cSrcweir {
3534cdf0e10cSrcweir // erstmal die Boxen besorgen !
3535cdf0e10cSrcweir if( rParam.bBigger )
3536cdf0e10cSrcweir for( sal_uInt16 n = 0; n < rTbl.GetTabLines().Count(); ++n )
3537cdf0e10cSrcweir ::lcl_DelSelBox( rTbl.GetTabLines()[ n ], rParam, nDistStt, sal_True );
3538cdf0e10cSrcweir else
3539cdf0e10cSrcweir for( sal_uInt16 n = 0; n < rTbl.GetTabLines().Count(); ++n )
3540cdf0e10cSrcweir ::lcl_InsSelBox( rTbl.GetTabLines()[ n ], rParam, nDistStt, sal_True );
3541cdf0e10cSrcweir }
3542cdf0e10cSrcweir
3543cdf0e10cSrcweir // loeschen der gesamten Tabelle verhindern
3544cdf0e10cSrcweir if( rParam.bBigger && rParam.aBoxes.Count() ==
3545cdf0e10cSrcweir rTbl.GetTabSortBoxes().Count() )
3546cdf0e10cSrcweir return 0;
3547cdf0e10cSrcweir
3548cdf0e10cSrcweir _FndBox* pFndBox = new _FndBox( 0, 0 );
3549cdf0e10cSrcweir if( rParam.bBigger )
3550cdf0e10cSrcweir pFndBox->SetTableLines( rParam.aBoxes, rTbl );
3551cdf0e10cSrcweir else
3552cdf0e10cSrcweir {
3553cdf0e10cSrcweir _FndPara aPara( rParam.aBoxes, pFndBox );
3554cdf0e10cSrcweir rTbl.GetTabLines().ForEach( &_FndLineCopyCol, &aPara );
3555cdf0e10cSrcweir ASSERT( pFndBox->GetLines().Count(), "Wo sind die Boxen" );
3556cdf0e10cSrcweir pFndBox->SetTableLines( rTbl );
3557cdf0e10cSrcweir
3558cdf0e10cSrcweir if( ppUndo )
3559cdf0e10cSrcweir rTmpLst.Insert( &rTbl.GetTabSortBoxes(), 0, rTbl.GetTabSortBoxes().Count() );
3560cdf0e10cSrcweir }
3561cdf0e10cSrcweir
3562cdf0e10cSrcweir //Lines fuer das Layout-Update herausuchen.
3563cdf0e10cSrcweir pFndBox->DelFrms( rTbl );
3564cdf0e10cSrcweir
3565cdf0e10cSrcweir // TL_CHART2: this function gest called from SetColWidth exclusively,
3566cdf0e10cSrcweir // thus it is currently speculated that nothing needs to be done here.
3567cdf0e10cSrcweir // Note: that SetColWidth is currently not completely understood though :-(
3568cdf0e10cSrcweir
3569cdf0e10cSrcweir return pFndBox;
3570cdf0e10cSrcweir }
3571cdf0e10cSrcweir
SetColWidth(SwTableBox & rAktBox,sal_uInt16 eType,SwTwips nAbsDiff,SwTwips nRelDiff,SwUndo ** ppUndo)3572cdf0e10cSrcweir sal_Bool SwTable::SetColWidth( SwTableBox& rAktBox, sal_uInt16 eType,
3573cdf0e10cSrcweir SwTwips nAbsDiff, SwTwips nRelDiff, SwUndo** ppUndo )
3574cdf0e10cSrcweir {
3575cdf0e10cSrcweir SetHTMLTableLayout( 0 ); // MIB 9.7.97: HTML-Layout loeschen
3576cdf0e10cSrcweir
3577cdf0e10cSrcweir const SwFmtFrmSize& rSz = GetFrmFmt()->GetFrmSize();
3578cdf0e10cSrcweir const SvxLRSpaceItem& rLR = GetFrmFmt()->GetLRSpace();
3579cdf0e10cSrcweir
3580cdf0e10cSrcweir _FndBox* pFndBox = 0; // fuers Einfuegen/Loeschen
3581cdf0e10cSrcweir SwTableSortBoxes aTmpLst( 0, 5 ); // fuers Undo
3582cdf0e10cSrcweir sal_Bool bBigger,
3583cdf0e10cSrcweir bRet = sal_False,
3584cdf0e10cSrcweir bLeft = nsTblChgWidthHeightType::WH_COL_LEFT == ( eType & 0xff ) ||
3585cdf0e10cSrcweir nsTblChgWidthHeightType::WH_CELL_LEFT == ( eType & 0xff ),
3586cdf0e10cSrcweir bInsDel = 0 != (eType & nsTblChgWidthHeightType::WH_FLAG_INSDEL );
3587cdf0e10cSrcweir sal_uInt16 n;
3588cdf0e10cSrcweir sal_uLong nBoxIdx = rAktBox.GetSttIdx();
3589cdf0e10cSrcweir
3590cdf0e10cSrcweir // bestimme die akt. Kante der Box
3591cdf0e10cSrcweir // wird nur fuer die Breitenmanipulation benoetigt!
3592cdf0e10cSrcweir const SwTwips nDist = ::lcl_GetDistance( &rAktBox, bLeft );
3593cdf0e10cSrcweir SwTwips nDistStt = 0;
3594cdf0e10cSrcweir CR_SetBoxWidth aParam( eType, nRelDiff, nDist, rSz.GetWidth(),
3595cdf0e10cSrcweir bLeft ? nDist : rSz.GetWidth() - nDist,
3596cdf0e10cSrcweir (SwTableNode*)rAktBox.GetSttNd()->FindTableNode() );
3597cdf0e10cSrcweir bBigger = aParam.bBigger;
3598cdf0e10cSrcweir
3599cdf0e10cSrcweir FN_lcl_SetBoxWidth fnSelBox, fnOtherBox;
3600cdf0e10cSrcweir if( bInsDel )
3601cdf0e10cSrcweir {
3602cdf0e10cSrcweir if( bBigger )
3603cdf0e10cSrcweir {
3604cdf0e10cSrcweir fnSelBox = lcl_DelSelBox;
3605cdf0e10cSrcweir fnOtherBox = lcl_DelOtherBox;
3606cdf0e10cSrcweir aParam.nBoxWidth = (sal_uInt16)rAktBox.GetFrmFmt()->GetFrmSize().GetWidth();
3607cdf0e10cSrcweir if( bLeft )
3608cdf0e10cSrcweir nDistStt = rSz.GetWidth();
3609cdf0e10cSrcweir }
3610cdf0e10cSrcweir else
3611cdf0e10cSrcweir {
3612cdf0e10cSrcweir fnSelBox = lcl_InsSelBox;
3613cdf0e10cSrcweir fnOtherBox = lcl_InsOtherBox;
3614cdf0e10cSrcweir }
3615cdf0e10cSrcweir }
3616cdf0e10cSrcweir else
3617cdf0e10cSrcweir {
3618cdf0e10cSrcweir fnSelBox = lcl_SetSelBoxWidth;
3619cdf0e10cSrcweir fnOtherBox = lcl_SetOtherBoxWidth;
3620cdf0e10cSrcweir }
3621cdf0e10cSrcweir
3622cdf0e10cSrcweir
3623cdf0e10cSrcweir switch( eType & 0xff )
3624cdf0e10cSrcweir {
3625cdf0e10cSrcweir case nsTblChgWidthHeightType::WH_COL_RIGHT:
3626cdf0e10cSrcweir case nsTblChgWidthHeightType::WH_COL_LEFT:
3627cdf0e10cSrcweir if( TBLVAR_CHGABS == eTblChgMode )
3628cdf0e10cSrcweir {
3629cdf0e10cSrcweir if( bInsDel )
3630cdf0e10cSrcweir bBigger = !bBigger;
3631cdf0e10cSrcweir
3632cdf0e10cSrcweir // erstmal testen, ob ueberhaupt Platz ist
3633cdf0e10cSrcweir sal_Bool bChgLRSpace = sal_True;
3634cdf0e10cSrcweir if( bBigger )
3635cdf0e10cSrcweir {
3636cdf0e10cSrcweir if( GetFrmFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) &&
3637cdf0e10cSrcweir !rSz.GetWidthPercent() )
3638cdf0e10cSrcweir {
3639cdf0e10cSrcweir bRet = rSz.GetWidth() < USHRT_MAX - nRelDiff;
3640cdf0e10cSrcweir bChgLRSpace = bLeft ? rLR.GetLeft() >= nAbsDiff
3641cdf0e10cSrcweir : rLR.GetRight() >= nAbsDiff;
3642cdf0e10cSrcweir }
3643cdf0e10cSrcweir else
3644cdf0e10cSrcweir bRet = bLeft ? rLR.GetLeft() >= nAbsDiff
3645cdf0e10cSrcweir : rLR.GetRight() >= nAbsDiff;
3646cdf0e10cSrcweir
3647cdf0e10cSrcweir if( !bRet && bInsDel &&
3648cdf0e10cSrcweir // auf der anderen Seite Platz?
3649cdf0e10cSrcweir ( bLeft ? rLR.GetRight() >= nAbsDiff
3650cdf0e10cSrcweir : rLR.GetLeft() >= nAbsDiff ))
3651cdf0e10cSrcweir {
3652cdf0e10cSrcweir bRet = sal_True; bLeft = !bLeft;
3653cdf0e10cSrcweir }
3654cdf0e10cSrcweir
3655cdf0e10cSrcweir if( !bRet )
3656cdf0e10cSrcweir {
3657cdf0e10cSrcweir // dann sich selbst rekursiv aufrufen; nur mit
3658cdf0e10cSrcweir // einem anderen Mode -> proprotional
3659cdf0e10cSrcweir TblChgMode eOld = eTblChgMode;
3660cdf0e10cSrcweir eTblChgMode = TBLFIX_CHGPROP;
3661cdf0e10cSrcweir
3662cdf0e10cSrcweir bRet = SetColWidth( rAktBox, eType, nAbsDiff, nRelDiff,
3663cdf0e10cSrcweir ppUndo );
3664cdf0e10cSrcweir eTblChgMode = eOld;
3665cdf0e10cSrcweir return bRet;
3666cdf0e10cSrcweir }
3667cdf0e10cSrcweir }
3668cdf0e10cSrcweir else
3669cdf0e10cSrcweir {
3670cdf0e10cSrcweir bRet = sal_True;
3671cdf0e10cSrcweir for( n = 0; n < aLines.Count(); ++n )
3672cdf0e10cSrcweir {
3673cdf0e10cSrcweir aParam.LoopClear();
3674cdf0e10cSrcweir if( !(*fnSelBox)( aLines[ n ], aParam, nDistStt, sal_True ))
3675cdf0e10cSrcweir {
3676cdf0e10cSrcweir bRet = sal_False;
3677cdf0e10cSrcweir break;
3678cdf0e10cSrcweir }
3679cdf0e10cSrcweir }
3680cdf0e10cSrcweir }
3681cdf0e10cSrcweir
3682cdf0e10cSrcweir if( bRet )
3683cdf0e10cSrcweir {
3684cdf0e10cSrcweir if( bInsDel )
3685cdf0e10cSrcweir {
3686cdf0e10cSrcweir pFndBox = ::lcl_SaveInsDelData( aParam, ppUndo,
3687cdf0e10cSrcweir aTmpLst, nDistStt );
3688cdf0e10cSrcweir if( aParam.bBigger && aParam.aBoxes.Count() ==
3689cdf0e10cSrcweir aSortCntBoxes.Count() )
3690cdf0e10cSrcweir {
3691cdf0e10cSrcweir // dies gesamte Tabelle soll geloescht werden!!
3692cdf0e10cSrcweir GetFrmFmt()->GetDoc()->DeleteRowCol( aParam.aBoxes );
3693cdf0e10cSrcweir return sal_False;
3694cdf0e10cSrcweir }
3695cdf0e10cSrcweir
3696cdf0e10cSrcweir if( ppUndo )
3697cdf0e10cSrcweir *ppUndo = aParam.CreateUndo(
3698cdf0e10cSrcweir aParam.bBigger ? UNDO_COL_DELETE
3699cdf0e10cSrcweir : UNDO_TABLE_INSCOL );
3700cdf0e10cSrcweir }
3701cdf0e10cSrcweir else if( ppUndo )
3702cdf0e10cSrcweir *ppUndo = new SwUndoAttrTbl( *aParam.pTblNd, sal_True );
3703cdf0e10cSrcweir
3704cdf0e10cSrcweir long nFrmWidth = LONG_MAX;
3705cdf0e10cSrcweir LockModify();
3706cdf0e10cSrcweir SwFmtFrmSize aSz( rSz );
3707cdf0e10cSrcweir SvxLRSpaceItem aLR( rLR );
3708cdf0e10cSrcweir if( bBigger )
3709cdf0e10cSrcweir {
3710cdf0e10cSrcweir // falls die Tabelle keinen Platz zum Wachsen hat, dann
3711cdf0e10cSrcweir // muessen wir welchen schaffen!
3712cdf0e10cSrcweir if( aSz.GetWidth() + nRelDiff > USHRT_MAX )
3713cdf0e10cSrcweir {
3714cdf0e10cSrcweir // dann mal herunterbrechen auf USHRT_MAX / 2
3715cdf0e10cSrcweir CR_SetBoxWidth aTmpPara( 0, aSz.GetWidth() / 2,
3716cdf0e10cSrcweir 0, aSz.GetWidth(), aSz.GetWidth(), aParam.pTblNd );
3717cdf0e10cSrcweir for( sal_uInt16 nLn = 0; nLn < aLines.Count(); ++nLn )
3718cdf0e10cSrcweir ::lcl_AjustLines( aLines[ nLn ], aTmpPara );
3719cdf0e10cSrcweir aSz.SetWidth( aSz.GetWidth() / 2 );
3720cdf0e10cSrcweir aParam.nDiff = nRelDiff /= 2;
3721cdf0e10cSrcweir aParam.nSide /= 2;
3722cdf0e10cSrcweir aParam.nMaxSize /= 2;
3723cdf0e10cSrcweir }
3724cdf0e10cSrcweir
3725cdf0e10cSrcweir if( bLeft )
3726cdf0e10cSrcweir aLR.SetLeft( sal_uInt16( aLR.GetLeft() - nAbsDiff ) );
3727cdf0e10cSrcweir else
3728cdf0e10cSrcweir aLR.SetRight( sal_uInt16( aLR.GetRight() - nAbsDiff ) );
3729cdf0e10cSrcweir }
3730cdf0e10cSrcweir else if( bLeft )
3731cdf0e10cSrcweir aLR.SetLeft( sal_uInt16( aLR.GetLeft() + nAbsDiff ) );
3732cdf0e10cSrcweir else
3733cdf0e10cSrcweir aLR.SetRight( sal_uInt16( aLR.GetRight() + nAbsDiff ) );
3734cdf0e10cSrcweir
3735cdf0e10cSrcweir if( bChgLRSpace )
3736cdf0e10cSrcweir GetFrmFmt()->SetFmtAttr( aLR );
3737cdf0e10cSrcweir const SwFmtHoriOrient& rHOri = GetFrmFmt()->GetHoriOrient();
3738cdf0e10cSrcweir if( text::HoriOrientation::FULL == rHOri.GetHoriOrient() ||
3739cdf0e10cSrcweir (text::HoriOrientation::LEFT == rHOri.GetHoriOrient() && aLR.GetLeft()) ||
3740cdf0e10cSrcweir (text::HoriOrientation::RIGHT == rHOri.GetHoriOrient() && aLR.GetRight()))
3741cdf0e10cSrcweir {
3742cdf0e10cSrcweir SwFmtHoriOrient aHOri( rHOri );
3743cdf0e10cSrcweir aHOri.SetHoriOrient( text::HoriOrientation::NONE );
3744cdf0e10cSrcweir GetFrmFmt()->SetFmtAttr( aHOri );
3745cdf0e10cSrcweir
3746cdf0e10cSrcweir // sollte die Tabelle noch auf relativen Werten
3747cdf0e10cSrcweir // (USHRT_MAX) stehen dann muss es jetzt auf absolute
3748cdf0e10cSrcweir // umgerechnet werden. Bug 61494
3749cdf0e10cSrcweir if( GetFrmFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) &&
3750cdf0e10cSrcweir !rSz.GetWidthPercent() )
3751cdf0e10cSrcweir {
3752cdf0e10cSrcweir SwTabFrm* pTabFrm = SwIterator<SwTabFrm,SwFmt>::FirstElement( *GetFrmFmt() );
3753cdf0e10cSrcweir if( pTabFrm &&
3754cdf0e10cSrcweir pTabFrm->Prt().Width() != rSz.GetWidth() )
3755cdf0e10cSrcweir {
3756cdf0e10cSrcweir nFrmWidth = pTabFrm->Prt().Width();
3757cdf0e10cSrcweir if( bBigger )
3758cdf0e10cSrcweir nFrmWidth += nAbsDiff;
3759cdf0e10cSrcweir else
3760cdf0e10cSrcweir nFrmWidth -= nAbsDiff;
3761cdf0e10cSrcweir }
3762cdf0e10cSrcweir }
3763cdf0e10cSrcweir }
3764cdf0e10cSrcweir
3765cdf0e10cSrcweir if( bBigger )
3766cdf0e10cSrcweir aSz.SetWidth( aSz.GetWidth() + nRelDiff );
3767cdf0e10cSrcweir else
3768cdf0e10cSrcweir aSz.SetWidth( aSz.GetWidth() - nRelDiff );
3769cdf0e10cSrcweir
3770cdf0e10cSrcweir if( rSz.GetWidthPercent() )
3771cdf0e10cSrcweir aSz.SetWidthPercent( static_cast<sal_uInt8>(( aSz.GetWidth() * 100 ) /
3772cdf0e10cSrcweir ( aSz.GetWidth() + aLR.GetRight() + aLR.GetLeft())));
3773cdf0e10cSrcweir
3774cdf0e10cSrcweir GetFrmFmt()->SetFmtAttr( aSz );
3775cdf0e10cSrcweir aParam.nTblWidth = sal_uInt16( aSz.GetWidth() );
3776cdf0e10cSrcweir
3777cdf0e10cSrcweir UnlockModify();
3778cdf0e10cSrcweir
3779cdf0e10cSrcweir for( n = aLines.Count(); n; )
3780cdf0e10cSrcweir {
3781cdf0e10cSrcweir --n;
3782cdf0e10cSrcweir aParam.LoopClear();
3783cdf0e10cSrcweir (*fnSelBox)( aLines[ n ], aParam, nDistStt, sal_False );
3784cdf0e10cSrcweir }
3785cdf0e10cSrcweir
3786cdf0e10cSrcweir // sollte die Tabelle noch auf relativen Werten
3787cdf0e10cSrcweir // (USHRT_MAX) stehen dann muss es jetzt auf absolute
3788cdf0e10cSrcweir // umgerechnet werden. Bug 61494
3789cdf0e10cSrcweir if( LONG_MAX != nFrmWidth )
3790cdf0e10cSrcweir {
3791cdf0e10cSrcweir SwFmtFrmSize aAbsSz( aSz );
3792cdf0e10cSrcweir aAbsSz.SetWidth( nFrmWidth );
3793cdf0e10cSrcweir GetFrmFmt()->SetFmtAttr( aAbsSz );
3794cdf0e10cSrcweir }
3795cdf0e10cSrcweir }
3796cdf0e10cSrcweir }
3797cdf0e10cSrcweir else if( bInsDel ||
3798cdf0e10cSrcweir ( bLeft ? nDist : Abs( rSz.GetWidth() - nDist ) > COLFUZZY ) )
3799cdf0e10cSrcweir {
3800cdf0e10cSrcweir bRet = sal_True;
3801cdf0e10cSrcweir if( bLeft && TBLFIX_CHGABS == eTblChgMode && !bInsDel )
3802cdf0e10cSrcweir aParam.bBigger = !bBigger;
3803cdf0e10cSrcweir
3804cdf0e10cSrcweir // erstmal testen, ob ueberhaupt Platz ist
3805cdf0e10cSrcweir if( bInsDel )
3806cdf0e10cSrcweir {
3807cdf0e10cSrcweir if( aParam.bBigger )
3808cdf0e10cSrcweir {
3809cdf0e10cSrcweir for( n = 0; n < aLines.Count(); ++n )
3810cdf0e10cSrcweir {
3811cdf0e10cSrcweir aParam.LoopClear();
3812cdf0e10cSrcweir if( !(*fnSelBox)( aLines[ n ], aParam, nDistStt, sal_True ))
3813cdf0e10cSrcweir {
3814cdf0e10cSrcweir bRet = sal_False;
3815cdf0e10cSrcweir break;
3816cdf0e10cSrcweir }
3817cdf0e10cSrcweir }
3818cdf0e10cSrcweir }
3819cdf0e10cSrcweir else
3820cdf0e10cSrcweir {
3821cdf0e10cSrcweir if( 0 != ( bRet = bLeft ? nDist != 0
3822cdf0e10cSrcweir : ( rSz.GetWidth() - nDist ) > COLFUZZY ) )
3823cdf0e10cSrcweir {
3824cdf0e10cSrcweir for( n = 0; n < aLines.Count(); ++n )
3825cdf0e10cSrcweir {
3826cdf0e10cSrcweir aParam.LoopClear();
3827cdf0e10cSrcweir if( !(*fnOtherBox)( aLines[ n ], aParam, 0, sal_True ))
3828cdf0e10cSrcweir {
3829cdf0e10cSrcweir bRet = sal_False;
3830cdf0e10cSrcweir break;
3831cdf0e10cSrcweir }
3832cdf0e10cSrcweir }
3833cdf0e10cSrcweir if( bRet && !aParam.bAnyBoxFnd )
3834cdf0e10cSrcweir bRet = sal_False;
3835cdf0e10cSrcweir }
3836cdf0e10cSrcweir
3837cdf0e10cSrcweir if( !bRet && rAktBox.GetFrmFmt()->GetFrmSize().GetWidth()
3838cdf0e10cSrcweir - nRelDiff > COLFUZZY +
3839cdf0e10cSrcweir ( 567 / 2 /* min. 0,5 cm Platz lassen*/) )
3840cdf0e10cSrcweir {
3841cdf0e10cSrcweir // dann den Platz von der akt. Zelle nehmen
3842cdf0e10cSrcweir aParam.bSplittBox = sal_True;
3843cdf0e10cSrcweir // aber das muss auch mal getestet werden!
3844cdf0e10cSrcweir bRet = sal_True;
3845cdf0e10cSrcweir
3846cdf0e10cSrcweir for( n = 0; n < aLines.Count(); ++n )
3847cdf0e10cSrcweir {
3848cdf0e10cSrcweir aParam.LoopClear();
3849cdf0e10cSrcweir if( !(*fnSelBox)( aLines[ n ], aParam, nDistStt, sal_True ))
3850cdf0e10cSrcweir {
3851cdf0e10cSrcweir bRet = sal_False;
3852cdf0e10cSrcweir break;
3853cdf0e10cSrcweir }
3854cdf0e10cSrcweir }
3855cdf0e10cSrcweir }
3856cdf0e10cSrcweir }
3857cdf0e10cSrcweir }
3858cdf0e10cSrcweir else if( aParam.bBigger )
3859cdf0e10cSrcweir {
3860cdf0e10cSrcweir for( n = 0; n < aLines.Count(); ++n )
3861cdf0e10cSrcweir {
3862cdf0e10cSrcweir aParam.LoopClear();
3863cdf0e10cSrcweir if( !(*fnOtherBox)( aLines[ n ], aParam, 0, sal_True ))
3864cdf0e10cSrcweir {
3865cdf0e10cSrcweir bRet = sal_False;
3866cdf0e10cSrcweir break;
3867cdf0e10cSrcweir }
3868cdf0e10cSrcweir }
3869cdf0e10cSrcweir }
3870cdf0e10cSrcweir else
3871cdf0e10cSrcweir {
3872cdf0e10cSrcweir for( n = 0; n < aLines.Count(); ++n )
3873cdf0e10cSrcweir {
3874cdf0e10cSrcweir aParam.LoopClear();
3875cdf0e10cSrcweir if( !(*fnSelBox)( aLines[ n ], aParam, nDistStt, sal_True ))
3876cdf0e10cSrcweir {
3877cdf0e10cSrcweir bRet = sal_False;
3878cdf0e10cSrcweir break;
3879cdf0e10cSrcweir }
3880cdf0e10cSrcweir }
3881cdf0e10cSrcweir }
3882cdf0e10cSrcweir
3883cdf0e10cSrcweir // wenn ja, dann setzen
3884cdf0e10cSrcweir if( bRet )
3885cdf0e10cSrcweir {
3886cdf0e10cSrcweir CR_SetBoxWidth aParam1( aParam );
3887cdf0e10cSrcweir if( bInsDel )
3888cdf0e10cSrcweir {
3889cdf0e10cSrcweir aParam1.bBigger = !aParam.bBigger;
3890cdf0e10cSrcweir pFndBox = ::lcl_SaveInsDelData( aParam, ppUndo,
3891cdf0e10cSrcweir aTmpLst, nDistStt );
3892cdf0e10cSrcweir if( ppUndo )
3893cdf0e10cSrcweir *ppUndo = aParam.CreateUndo(
3894cdf0e10cSrcweir aParam.bBigger ? UNDO_TABLE_DELBOX
3895cdf0e10cSrcweir : UNDO_TABLE_INSCOL );
3896cdf0e10cSrcweir }
3897cdf0e10cSrcweir else if( ppUndo )
3898cdf0e10cSrcweir *ppUndo = new SwUndoAttrTbl( *aParam.pTblNd, sal_True );
3899cdf0e10cSrcweir
3900cdf0e10cSrcweir if( bInsDel
3901cdf0e10cSrcweir ? ( TBLFIX_CHGABS == eTblChgMode ? bLeft : bLeft )
3902cdf0e10cSrcweir : ( TBLFIX_CHGABS != eTblChgMode && bLeft ) )
3903cdf0e10cSrcweir {
3904cdf0e10cSrcweir for( n = aLines.Count(); n; )
3905cdf0e10cSrcweir {
3906cdf0e10cSrcweir --n;
3907cdf0e10cSrcweir aParam.LoopClear();
3908cdf0e10cSrcweir aParam1.LoopClear();
3909cdf0e10cSrcweir (*fnSelBox)( aLines[ n ], aParam, nDistStt, sal_False );
3910cdf0e10cSrcweir (*fnOtherBox)( aLines[ n ], aParam1, nDistStt, sal_False );
3911cdf0e10cSrcweir }
3912cdf0e10cSrcweir }
3913cdf0e10cSrcweir else
3914cdf0e10cSrcweir for( n = aLines.Count(); n; )
3915cdf0e10cSrcweir {
3916cdf0e10cSrcweir --n;
3917cdf0e10cSrcweir aParam.LoopClear();
3918cdf0e10cSrcweir aParam1.LoopClear();
3919cdf0e10cSrcweir (*fnOtherBox)( aLines[ n ], aParam1, nDistStt, sal_False );
3920cdf0e10cSrcweir (*fnSelBox)( aLines[ n ], aParam, nDistStt, sal_False );
3921cdf0e10cSrcweir }
3922cdf0e10cSrcweir }
3923cdf0e10cSrcweir }
3924cdf0e10cSrcweir break;
3925cdf0e10cSrcweir
3926cdf0e10cSrcweir case nsTblChgWidthHeightType::WH_CELL_RIGHT:
3927cdf0e10cSrcweir case nsTblChgWidthHeightType::WH_CELL_LEFT:
3928cdf0e10cSrcweir if( TBLVAR_CHGABS == eTblChgMode )
3929cdf0e10cSrcweir {
3930cdf0e10cSrcweir // dann sich selbst rekursiv aufrufen; nur mit
3931cdf0e10cSrcweir // einem anderen Mode -> Nachbarn
3932cdf0e10cSrcweir TblChgMode eOld = eTblChgMode;
3933cdf0e10cSrcweir eTblChgMode = TBLFIX_CHGABS;
3934cdf0e10cSrcweir
3935cdf0e10cSrcweir bRet = SetColWidth( rAktBox, eType, nAbsDiff, nRelDiff,
3936cdf0e10cSrcweir ppUndo );
3937cdf0e10cSrcweir eTblChgMode = eOld;
3938cdf0e10cSrcweir return bRet;
3939cdf0e10cSrcweir }
3940cdf0e10cSrcweir else if( bInsDel || ( bLeft ? nDist
3941cdf0e10cSrcweir : (rSz.GetWidth() - nDist) > COLFUZZY ))
3942cdf0e10cSrcweir {
3943cdf0e10cSrcweir if( bLeft && TBLFIX_CHGABS == eTblChgMode && !bInsDel )
3944cdf0e10cSrcweir aParam.bBigger = !bBigger;
3945cdf0e10cSrcweir
3946cdf0e10cSrcweir // erstmal testen, ob ueberhaupt Platz ist
3947cdf0e10cSrcweir SwTableBox* pBox = &rAktBox;
3948cdf0e10cSrcweir SwTableLine* pLine = rAktBox.GetUpper();
3949cdf0e10cSrcweir while( pLine->GetUpper() )
3950cdf0e10cSrcweir {
3951cdf0e10cSrcweir sal_uInt16 nPos = pLine->GetTabBoxes().C40_GETPOS( SwTableBox, pBox );
3952cdf0e10cSrcweir if( bLeft ? nPos : nPos + 1 != pLine->GetTabBoxes().Count() )
3953cdf0e10cSrcweir break;
3954cdf0e10cSrcweir
3955cdf0e10cSrcweir pBox = pLine->GetUpper();
3956cdf0e10cSrcweir pLine = pBox->GetUpper();
3957cdf0e10cSrcweir }
3958cdf0e10cSrcweir
3959cdf0e10cSrcweir if( pLine->GetUpper() )
3960cdf0e10cSrcweir {
3961cdf0e10cSrcweir // dann muss die Distanz wieder korriegiert werden!
3962cdf0e10cSrcweir aParam.nSide -= ::lcl_GetDistance( pLine->GetUpper(), sal_True );
3963cdf0e10cSrcweir
3964cdf0e10cSrcweir if( bLeft )
3965cdf0e10cSrcweir aParam.nMaxSize = aParam.nSide;
3966cdf0e10cSrcweir else
3967cdf0e10cSrcweir aParam.nMaxSize = pLine->GetUpper()->GetFrmFmt()->
3968cdf0e10cSrcweir GetFrmSize().GetWidth() - aParam.nSide;
3969cdf0e10cSrcweir }
3970cdf0e10cSrcweir
3971cdf0e10cSrcweir // erstmal testen, ob ueberhaupt Platz ist
3972cdf0e10cSrcweir if( bInsDel )
3973cdf0e10cSrcweir {
3974cdf0e10cSrcweir if( 0 != ( bRet = bLeft ? nDist != 0
3975cdf0e10cSrcweir : ( rSz.GetWidth() - nDist ) > COLFUZZY ) &&
3976cdf0e10cSrcweir !aParam.bBigger )
3977cdf0e10cSrcweir {
3978cdf0e10cSrcweir bRet = (*fnOtherBox)( pLine, aParam, 0, sal_True );
3979cdf0e10cSrcweir if( bRet && !aParam.bAnyBoxFnd )
3980cdf0e10cSrcweir bRet = sal_False;
3981cdf0e10cSrcweir }
3982cdf0e10cSrcweir
3983cdf0e10cSrcweir if( !bRet && !aParam.bBigger && rAktBox.GetFrmFmt()->
3984cdf0e10cSrcweir GetFrmSize().GetWidth() - nRelDiff > COLFUZZY +
3985cdf0e10cSrcweir ( 567 / 2 /* min. 0,5 cm Platz lassen*/) )
3986cdf0e10cSrcweir {
3987cdf0e10cSrcweir // dann den Platz von der akt. Zelle nehmen
3988cdf0e10cSrcweir aParam.bSplittBox = sal_True;
3989cdf0e10cSrcweir bRet = sal_True;
3990cdf0e10cSrcweir }
3991cdf0e10cSrcweir }
3992cdf0e10cSrcweir else
3993cdf0e10cSrcweir {
3994cdf0e10cSrcweir FN_lcl_SetBoxWidth fnTmp = aParam.bBigger ? fnOtherBox : fnSelBox;
3995cdf0e10cSrcweir bRet = (*fnTmp)( pLine, aParam, nDistStt, sal_True );
3996cdf0e10cSrcweir }
3997cdf0e10cSrcweir
3998cdf0e10cSrcweir // wenn ja, dann setzen
3999cdf0e10cSrcweir if( bRet )
4000cdf0e10cSrcweir {
4001cdf0e10cSrcweir CR_SetBoxWidth aParam1( aParam );
4002cdf0e10cSrcweir if( bInsDel )
4003cdf0e10cSrcweir {
4004cdf0e10cSrcweir aParam1.bBigger = !aParam.bBigger;
4005cdf0e10cSrcweir pFndBox = ::lcl_SaveInsDelData( aParam, ppUndo, aTmpLst, nDistStt );
4006cdf0e10cSrcweir if( ppUndo )
4007cdf0e10cSrcweir *ppUndo = aParam.CreateUndo(
4008cdf0e10cSrcweir aParam.bBigger ? UNDO_TABLE_DELBOX
4009cdf0e10cSrcweir : UNDO_TABLE_INSCOL );
4010cdf0e10cSrcweir }
4011cdf0e10cSrcweir else if( ppUndo )
4012cdf0e10cSrcweir *ppUndo = new SwUndoAttrTbl( *aParam.pTblNd, sal_True );
4013cdf0e10cSrcweir
4014cdf0e10cSrcweir if( bInsDel
4015cdf0e10cSrcweir ? ( TBLFIX_CHGABS == eTblChgMode ? (bBigger && bLeft) : bLeft )
4016cdf0e10cSrcweir : ( TBLFIX_CHGABS != eTblChgMode && bLeft ) )
4017cdf0e10cSrcweir {
4018cdf0e10cSrcweir (*fnSelBox)( pLine, aParam, nDistStt, sal_False );
4019cdf0e10cSrcweir (*fnOtherBox)( pLine, aParam1, nDistStt, sal_False );
4020cdf0e10cSrcweir }
4021cdf0e10cSrcweir else
4022cdf0e10cSrcweir {
4023cdf0e10cSrcweir (*fnOtherBox)( pLine, aParam1, nDistStt, sal_False );
4024cdf0e10cSrcweir (*fnSelBox)( pLine, aParam, nDistStt, sal_False );
4025cdf0e10cSrcweir }
4026cdf0e10cSrcweir }
4027cdf0e10cSrcweir }
4028cdf0e10cSrcweir break;
4029cdf0e10cSrcweir
4030cdf0e10cSrcweir }
4031cdf0e10cSrcweir
4032cdf0e10cSrcweir if( pFndBox )
4033cdf0e10cSrcweir {
4034cdf0e10cSrcweir // dann raeume die Struktur aller Lines auf
4035cdf0e10cSrcweir GCLines();
4036cdf0e10cSrcweir
4037cdf0e10cSrcweir //Layout updaten
4038cdf0e10cSrcweir if( !bBigger || pFndBox->AreLinesToRestore( *this ) )
4039cdf0e10cSrcweir pFndBox->MakeFrms( *this );
4040cdf0e10cSrcweir
4041cdf0e10cSrcweir // TL_CHART2: it is currently unclear if sth has to be done here.
4042cdf0e10cSrcweir // The function name hints that nothing needs to be done, on the other
4043cdf0e10cSrcweir // hand there is a case where sth gets deleted. :-(
4044cdf0e10cSrcweir
4045cdf0e10cSrcweir delete pFndBox;
4046cdf0e10cSrcweir
4047cdf0e10cSrcweir if( ppUndo && *ppUndo )
4048cdf0e10cSrcweir {
4049cdf0e10cSrcweir aParam.pUndo->SetColWidthParam( nBoxIdx, static_cast<sal_uInt16>(eTblChgMode), eType,
4050cdf0e10cSrcweir nAbsDiff, nRelDiff );
4051cdf0e10cSrcweir if( !aParam.bBigger )
4052cdf0e10cSrcweir aParam.pUndo->SaveNewBoxes( *aParam.pTblNd, aTmpLst );
4053cdf0e10cSrcweir }
4054cdf0e10cSrcweir }
4055cdf0e10cSrcweir
4056cdf0e10cSrcweir if( bRet )
4057cdf0e10cSrcweir {
4058cdf0e10cSrcweir CHECKBOXWIDTH
4059cdf0e10cSrcweir CHECKTABLELAYOUT
4060cdf0e10cSrcweir }
4061cdf0e10cSrcweir
4062cdf0e10cSrcweir return bRet;
4063cdf0e10cSrcweir }
4064cdf0e10cSrcweir /* */
4065cdf0e10cSrcweir
lcl_SaveInsDelData(CR_SetLineHeight & rParam,SwUndo ** ppUndo,SwTableSortBoxes & rTmpLst)4066cdf0e10cSrcweir _FndBox* lcl_SaveInsDelData( CR_SetLineHeight& rParam, SwUndo** ppUndo,
4067cdf0e10cSrcweir SwTableSortBoxes& rTmpLst )
4068cdf0e10cSrcweir {
4069cdf0e10cSrcweir // suche alle Boxen / Lines
4070cdf0e10cSrcweir SwTable& rTbl = rParam.pTblNd->GetTable();
4071cdf0e10cSrcweir
4072cdf0e10cSrcweir ASSERT( rParam.aBoxes.Count(), "ohne Boxen ist nichts zu machen!" );
4073cdf0e10cSrcweir
4074cdf0e10cSrcweir // loeschen der gesamten Tabelle verhindern
4075cdf0e10cSrcweir if( !rParam.bBigger && rParam.aBoxes.Count() ==
4076cdf0e10cSrcweir rTbl.GetTabSortBoxes().Count() )
4077cdf0e10cSrcweir return 0;
4078cdf0e10cSrcweir
4079cdf0e10cSrcweir _FndBox* pFndBox = new _FndBox( 0, 0 );
4080cdf0e10cSrcweir if( !rParam.bBigger )
4081cdf0e10cSrcweir pFndBox->SetTableLines( rParam.aBoxes, rTbl );
4082cdf0e10cSrcweir else
4083cdf0e10cSrcweir {
4084cdf0e10cSrcweir _FndPara aPara( rParam.aBoxes, pFndBox );
4085cdf0e10cSrcweir rTbl.GetTabLines().ForEach( &_FndLineCopyCol, &aPara );
4086cdf0e10cSrcweir ASSERT( pFndBox->GetLines().Count(), "Wo sind die Boxen" );
4087cdf0e10cSrcweir pFndBox->SetTableLines( rTbl );
4088cdf0e10cSrcweir
4089cdf0e10cSrcweir if( ppUndo )
4090cdf0e10cSrcweir rTmpLst.Insert( &rTbl.GetTabSortBoxes(), 0, rTbl.GetTabSortBoxes().Count() );
4091cdf0e10cSrcweir }
4092cdf0e10cSrcweir
4093cdf0e10cSrcweir //Lines fuer das Layout-Update heraussuchen.
4094cdf0e10cSrcweir pFndBox->DelFrms( rTbl );
4095cdf0e10cSrcweir
4096cdf0e10cSrcweir // TL_CHART2: it is currently unclear if sth has to be done here.
4097cdf0e10cSrcweir
4098cdf0e10cSrcweir return pFndBox;
4099cdf0e10cSrcweir }
4100cdf0e10cSrcweir
SetLineHeight(SwTableLine & rLine,SwTwips nOldHeight,SwTwips nNewHeight,sal_Bool bMinSize)4101cdf0e10cSrcweir void SetLineHeight( SwTableLine& rLine, SwTwips nOldHeight, SwTwips nNewHeight,
4102cdf0e10cSrcweir sal_Bool bMinSize )
4103cdf0e10cSrcweir {
4104cdf0e10cSrcweir SwLayoutFrm* pLineFrm = GetRowFrm( rLine );
4105cdf0e10cSrcweir ASSERT( pLineFrm, "wo ist der Frm von der SwTableLine?" );
4106cdf0e10cSrcweir
4107cdf0e10cSrcweir SwFrmFmt* pFmt = rLine.ClaimFrmFmt();
4108cdf0e10cSrcweir
4109cdf0e10cSrcweir SwTwips nMyNewH, nMyOldH = pLineFrm->Frm().Height();
4110cdf0e10cSrcweir if( !nOldHeight ) // die BaseLine und absolut
4111cdf0e10cSrcweir nMyNewH = nMyOldH + nNewHeight;
4112cdf0e10cSrcweir else
4113cdf0e10cSrcweir {
4114cdf0e10cSrcweir // moeglichst genau rechnen
4115cdf0e10cSrcweir Fraction aTmp( nMyOldH );
4116cdf0e10cSrcweir aTmp *= Fraction( nNewHeight, nOldHeight );
4117cdf0e10cSrcweir aTmp += Fraction( 1, 2 ); // ggfs. aufrunden
4118cdf0e10cSrcweir nMyNewH = aTmp;
4119cdf0e10cSrcweir }
4120cdf0e10cSrcweir
4121cdf0e10cSrcweir SwFrmSize eSize = ATT_MIN_SIZE;
4122cdf0e10cSrcweir if( !bMinSize &&
4123cdf0e10cSrcweir ( nMyOldH - nMyNewH ) > ( CalcRowRstHeight( pLineFrm ) + ROWFUZZY ))
4124cdf0e10cSrcweir eSize = ATT_FIX_SIZE;
4125cdf0e10cSrcweir
4126cdf0e10cSrcweir pFmt->SetFmtAttr( SwFmtFrmSize( eSize, 0, nMyNewH ) );
4127cdf0e10cSrcweir
4128cdf0e10cSrcweir // erst alle inneren anpassen
4129cdf0e10cSrcweir SwTableBoxes& rBoxes = rLine.GetTabBoxes();
4130cdf0e10cSrcweir for( sal_uInt16 n = 0; n < rBoxes.Count(); ++n )
4131cdf0e10cSrcweir {
4132cdf0e10cSrcweir SwTableBox& rBox = *rBoxes[ n ];
4133cdf0e10cSrcweir for( sal_uInt16 i = 0; i < rBox.GetTabLines().Count(); ++i )
4134cdf0e10cSrcweir SetLineHeight( *rBox.GetTabLines()[ i ], nMyOldH, nMyNewH, bMinSize );
4135cdf0e10cSrcweir }
4136cdf0e10cSrcweir }
4137cdf0e10cSrcweir
lcl_SetSelLineHeight(SwTableLine * pLine,CR_SetLineHeight & rParam,SwTwips nDist,sal_Bool bCheck)4138cdf0e10cSrcweir sal_Bool lcl_SetSelLineHeight( SwTableLine* pLine, CR_SetLineHeight& rParam,
4139cdf0e10cSrcweir SwTwips nDist, sal_Bool bCheck )
4140cdf0e10cSrcweir {
4141cdf0e10cSrcweir sal_Bool bRet = sal_True;
4142cdf0e10cSrcweir if( !bCheck )
4143cdf0e10cSrcweir {
4144cdf0e10cSrcweir // Zeilenhoehe einstellen
4145cdf0e10cSrcweir SetLineHeight( *pLine, 0, rParam.bBigger ? nDist : -nDist,
4146cdf0e10cSrcweir rParam.bBigger );
4147cdf0e10cSrcweir }
4148cdf0e10cSrcweir else if( !rParam.bBigger )
4149cdf0e10cSrcweir {
4150cdf0e10cSrcweir // anhand der alten Size die neue relative errechnen
4151cdf0e10cSrcweir SwLayoutFrm* pLineFrm = GetRowFrm( *pLine );
4152cdf0e10cSrcweir ASSERT( pLineFrm, "wo ist der Frm von der SwTableLine?" );
4153cdf0e10cSrcweir SwTwips nRstHeight = CalcRowRstHeight( pLineFrm );
4154cdf0e10cSrcweir if( (nRstHeight + ROWFUZZY) < nDist )
4155cdf0e10cSrcweir bRet = sal_False;
4156cdf0e10cSrcweir }
4157cdf0e10cSrcweir return bRet;
4158cdf0e10cSrcweir }
4159cdf0e10cSrcweir
lcl_SetOtherLineHeight(SwTableLine * pLine,CR_SetLineHeight & rParam,SwTwips nDist,sal_Bool bCheck)4160cdf0e10cSrcweir sal_Bool lcl_SetOtherLineHeight( SwTableLine* pLine, CR_SetLineHeight& rParam,
4161cdf0e10cSrcweir SwTwips nDist, sal_Bool bCheck )
4162cdf0e10cSrcweir {
4163cdf0e10cSrcweir sal_Bool bRet = sal_True;
4164cdf0e10cSrcweir if( bCheck )
4165cdf0e10cSrcweir {
4166cdf0e10cSrcweir if( rParam.bBigger )
4167cdf0e10cSrcweir {
4168cdf0e10cSrcweir // anhand der alten Size die neue relative errechnen
4169cdf0e10cSrcweir SwLayoutFrm* pLineFrm = GetRowFrm( *pLine );
4170cdf0e10cSrcweir ASSERT( pLineFrm, "wo ist der Frm von der SwTableLine?" );
4171cdf0e10cSrcweir
4172cdf0e10cSrcweir if( TBLFIX_CHGPROP == rParam.nMode )
4173cdf0e10cSrcweir {
4174cdf0e10cSrcweir nDist *= pLineFrm->Frm().Height();
4175cdf0e10cSrcweir nDist /= rParam.nMaxHeight;
4176cdf0e10cSrcweir }
4177cdf0e10cSrcweir bRet = nDist <= CalcRowRstHeight( pLineFrm );
4178cdf0e10cSrcweir }
4179cdf0e10cSrcweir }
4180cdf0e10cSrcweir else
4181cdf0e10cSrcweir {
4182cdf0e10cSrcweir // Zeilenhoehe einstellen
4183cdf0e10cSrcweir // pLine ist die nachfolgende / vorhergehende -> also anpassen
4184cdf0e10cSrcweir if( TBLFIX_CHGPROP == rParam.nMode )
4185cdf0e10cSrcweir {
4186cdf0e10cSrcweir SwLayoutFrm* pLineFrm = GetRowFrm( *pLine );
4187cdf0e10cSrcweir ASSERT( pLineFrm, "wo ist der Frm von der SwTableLine?" );
4188cdf0e10cSrcweir
4189cdf0e10cSrcweir // aus der alten Size die neue relative errechnen
4190cdf0e10cSrcweir // Wird die selektierte Box groesser ueber den MaxSpace anpassen,
4191cdf0e10cSrcweir // sonst ueber die MaxHeight
4192cdf0e10cSrcweir if( 1 /*!rParam.bBigger*/ )
4193cdf0e10cSrcweir {
4194cdf0e10cSrcweir nDist *= pLineFrm->Frm().Height();
4195cdf0e10cSrcweir nDist /= rParam.nMaxHeight;
4196cdf0e10cSrcweir }
4197cdf0e10cSrcweir else
4198cdf0e10cSrcweir {
4199cdf0e10cSrcweir // aus der alten Size die neue relative errechnen
4200cdf0e10cSrcweir nDist *= CalcRowRstHeight( pLineFrm );
4201cdf0e10cSrcweir nDist /= rParam.nMaxSpace;
4202cdf0e10cSrcweir }
4203cdf0e10cSrcweir }
4204cdf0e10cSrcweir SetLineHeight( *pLine, 0, rParam.bBigger ? -nDist : nDist,
4205cdf0e10cSrcweir !rParam.bBigger );
4206cdf0e10cSrcweir }
4207cdf0e10cSrcweir return bRet;
4208cdf0e10cSrcweir }
4209cdf0e10cSrcweir
lcl_InsDelSelLine(SwTableLine * pLine,CR_SetLineHeight & rParam,SwTwips nDist,sal_Bool bCheck)4210cdf0e10cSrcweir sal_Bool lcl_InsDelSelLine( SwTableLine* pLine, CR_SetLineHeight& rParam,
4211cdf0e10cSrcweir SwTwips nDist, sal_Bool bCheck )
4212cdf0e10cSrcweir {
4213cdf0e10cSrcweir sal_Bool bRet = sal_True;
4214cdf0e10cSrcweir if( !bCheck )
4215cdf0e10cSrcweir {
4216cdf0e10cSrcweir SwTableBoxes& rBoxes = pLine->GetTabBoxes();
4217cdf0e10cSrcweir SwDoc* pDoc = pLine->GetFrmFmt()->GetDoc();
4218cdf0e10cSrcweir if( !rParam.bBigger )
4219cdf0e10cSrcweir {
4220cdf0e10cSrcweir sal_uInt16 n;
4221cdf0e10cSrcweir
4222cdf0e10cSrcweir for( n = rBoxes.Count(); n; )
4223cdf0e10cSrcweir ::lcl_SaveUpperLowerBorder( rParam.pTblNd->GetTable(),
4224cdf0e10cSrcweir *rBoxes[ --n ],
4225cdf0e10cSrcweir rParam.aShareFmts );
4226cdf0e10cSrcweir for( n = rBoxes.Count(); n; )
4227cdf0e10cSrcweir ::_DeleteBox( rParam.pTblNd->GetTable(),
4228cdf0e10cSrcweir rBoxes[ --n ], rParam.pUndo, sal_False,
4229cdf0e10cSrcweir sal_False, &rParam.aShareFmts );
4230cdf0e10cSrcweir }
4231cdf0e10cSrcweir else
4232cdf0e10cSrcweir {
4233cdf0e10cSrcweir // Zeile einfuegen
4234cdf0e10cSrcweir SwTableLine* pNewLine = new SwTableLine( (SwTableLineFmt*)pLine->GetFrmFmt(),
4235cdf0e10cSrcweir rBoxes.Count(), pLine->GetUpper() );
4236cdf0e10cSrcweir SwTableLines* pLines;
4237cdf0e10cSrcweir if( pLine->GetUpper() )
4238cdf0e10cSrcweir pLines = &pLine->GetUpper()->GetTabLines();
4239cdf0e10cSrcweir else
4240cdf0e10cSrcweir pLines = &rParam.pTblNd->GetTable().GetTabLines();
4241cdf0e10cSrcweir sal_uInt16 nPos = pLines->C40_GETPOS( SwTableLine, pLine );
4242cdf0e10cSrcweir if( !rParam.bTop )
4243cdf0e10cSrcweir ++nPos;
4244cdf0e10cSrcweir pLines->C40_INSERT( SwTableLine, pNewLine, nPos );
4245cdf0e10cSrcweir
4246cdf0e10cSrcweir SwFrmFmt* pNewFmt = pNewLine->ClaimFrmFmt();
4247cdf0e10cSrcweir pNewFmt->SetFmtAttr( SwFmtFrmSize( ATT_MIN_SIZE, 0, nDist ) );
4248cdf0e10cSrcweir
4249cdf0e10cSrcweir // und noch mal die Anzahl Boxen erzeugen
4250cdf0e10cSrcweir SwTableBoxes& rNewBoxes = pNewLine->GetTabBoxes();
4251cdf0e10cSrcweir for( sal_uInt16 n = 0; n < rBoxes.Count(); ++n )
4252cdf0e10cSrcweir {
4253cdf0e10cSrcweir SwTwips nWidth = 0;
4254cdf0e10cSrcweir SwTableBox* pOld = rBoxes[ n ];
4255cdf0e10cSrcweir if( !pOld->GetSttNd() )
4256cdf0e10cSrcweir {
4257cdf0e10cSrcweir // keine normale "Content"-Box also auf die 1. naechste
4258cdf0e10cSrcweir // Box zurueckfallen
4259cdf0e10cSrcweir nWidth = pOld->GetFrmFmt()->GetFrmSize().GetWidth();
4260cdf0e10cSrcweir while( !pOld->GetSttNd() )
4261cdf0e10cSrcweir pOld = pOld->GetTabLines()[ 0 ]->GetTabBoxes()[ 0 ];
4262cdf0e10cSrcweir }
4263cdf0e10cSrcweir ::_InsTblBox( pDoc, rParam.pTblNd, pNewLine,
4264cdf0e10cSrcweir (SwTableBoxFmt*)pOld->GetFrmFmt(), pOld, n );
4265cdf0e10cSrcweir
4266cdf0e10cSrcweir // Sonderbehandlung fuer Umrandung die Obere muss
4267cdf0e10cSrcweir // entfernt werden
4268cdf0e10cSrcweir const SvxBoxItem& rBoxItem = pOld->GetFrmFmt()->GetBox();
4269cdf0e10cSrcweir if( rBoxItem.GetTop() )
4270cdf0e10cSrcweir {
4271cdf0e10cSrcweir SvxBoxItem aTmp( rBoxItem );
4272cdf0e10cSrcweir aTmp.SetLine( 0, BOX_LINE_TOP );
4273cdf0e10cSrcweir rParam.aShareFmts.SetAttr( rParam.bTop
4274cdf0e10cSrcweir ? *pOld
4275cdf0e10cSrcweir : *rNewBoxes[ n ], aTmp );
4276cdf0e10cSrcweir }
4277cdf0e10cSrcweir
4278cdf0e10cSrcweir if( nWidth )
4279cdf0e10cSrcweir rParam.aShareFmts.SetAttr( *rNewBoxes[ n ],
4280cdf0e10cSrcweir SwFmtFrmSize( ATT_FIX_SIZE, nWidth, 0 ) );
4281cdf0e10cSrcweir }
4282cdf0e10cSrcweir }
4283cdf0e10cSrcweir }
4284cdf0e10cSrcweir else
4285cdf0e10cSrcweir {
4286cdf0e10cSrcweir // Boxen einsammeln!
4287cdf0e10cSrcweir SwTableBoxes& rBoxes = pLine->GetTabBoxes();
4288cdf0e10cSrcweir for( sal_uInt16 n = rBoxes.Count(); n; )
4289cdf0e10cSrcweir {
4290cdf0e10cSrcweir SwTableBox* pBox = rBoxes[ --n ];
4291cdf0e10cSrcweir if( pBox->GetFrmFmt()->GetProtect().IsCntntProtected() )
4292cdf0e10cSrcweir return sal_False;
4293cdf0e10cSrcweir
4294cdf0e10cSrcweir if( pBox->GetSttNd() )
4295cdf0e10cSrcweir rParam.aBoxes.Insert( pBox );
4296cdf0e10cSrcweir else
4297cdf0e10cSrcweir {
4298cdf0e10cSrcweir for( sal_uInt16 i = pBox->GetTabLines().Count(); i; )
4299cdf0e10cSrcweir lcl_InsDelSelLine( pBox->GetTabLines()[ --i ],
4300cdf0e10cSrcweir rParam, 0, sal_True );
4301cdf0e10cSrcweir }
4302cdf0e10cSrcweir }
4303cdf0e10cSrcweir }
4304cdf0e10cSrcweir return bRet;
4305cdf0e10cSrcweir }
4306cdf0e10cSrcweir
SetRowHeight(SwTableBox & rAktBox,sal_uInt16 eType,SwTwips nAbsDiff,SwTwips nRelDiff,SwUndo ** ppUndo)4307cdf0e10cSrcweir sal_Bool SwTable::SetRowHeight( SwTableBox& rAktBox, sal_uInt16 eType,
4308cdf0e10cSrcweir SwTwips nAbsDiff, SwTwips nRelDiff,SwUndo** ppUndo )
4309cdf0e10cSrcweir {
4310cdf0e10cSrcweir SwTableLine* pLine = rAktBox.GetUpper();
4311cdf0e10cSrcweir
4312cdf0e10cSrcweir SwTableLine* pBaseLine = pLine;
4313cdf0e10cSrcweir while( pBaseLine->GetUpper() )
4314cdf0e10cSrcweir pBaseLine = pBaseLine->GetUpper()->GetUpper();
4315cdf0e10cSrcweir
4316cdf0e10cSrcweir _FndBox* pFndBox = 0; // fuers Einfuegen/Loeschen
4317cdf0e10cSrcweir SwTableSortBoxes aTmpLst( 0, 5 ); // fuers Undo
4318cdf0e10cSrcweir sal_Bool bBigger,
4319cdf0e10cSrcweir bRet = sal_False,
4320cdf0e10cSrcweir bTop = nsTblChgWidthHeightType::WH_ROW_TOP == ( eType & 0xff ) ||
4321cdf0e10cSrcweir nsTblChgWidthHeightType::WH_CELL_TOP == ( eType & 0xff ),
4322cdf0e10cSrcweir bInsDel = 0 != (eType & nsTblChgWidthHeightType::WH_FLAG_INSDEL );
4323cdf0e10cSrcweir sal_uInt16 n, nBaseLinePos = GetTabLines().C40_GETPOS( SwTableLine, pBaseLine );
4324cdf0e10cSrcweir sal_uLong nBoxIdx = rAktBox.GetSttIdx();
4325cdf0e10cSrcweir
4326cdf0e10cSrcweir CR_SetLineHeight aParam( eType,
4327cdf0e10cSrcweir (SwTableNode*)rAktBox.GetSttNd()->FindTableNode() );
4328cdf0e10cSrcweir bBigger = aParam.bBigger;
4329cdf0e10cSrcweir
4330cdf0e10cSrcweir FN_lcl_SetLineHeight fnSelLine, fnOtherLine = lcl_SetOtherLineHeight;
4331cdf0e10cSrcweir if( bInsDel )
4332cdf0e10cSrcweir fnSelLine = lcl_InsDelSelLine;
4333cdf0e10cSrcweir else
4334cdf0e10cSrcweir fnSelLine = lcl_SetSelLineHeight;
4335cdf0e10cSrcweir
4336cdf0e10cSrcweir SwTableLines* pLines = &aLines;
4337cdf0e10cSrcweir
4338cdf0e10cSrcweir // wie kommt man an die Hoehen heran?
4339cdf0e10cSrcweir switch( eType & 0xff )
4340cdf0e10cSrcweir {
4341cdf0e10cSrcweir case nsTblChgWidthHeightType::WH_CELL_TOP:
4342cdf0e10cSrcweir case nsTblChgWidthHeightType::WH_CELL_BOTTOM:
4343cdf0e10cSrcweir if( pLine == pBaseLine )
4344cdf0e10cSrcweir break; // dann geht es nicht!
4345cdf0e10cSrcweir
4346cdf0e10cSrcweir // ist eine verschachtelte Line (Box!)
4347cdf0e10cSrcweir pLines = &pLine->GetUpper()->GetTabLines();
4348cdf0e10cSrcweir nBaseLinePos = pLines->C40_GETPOS( SwTableLine, pLine );
4349cdf0e10cSrcweir pBaseLine = pLine;
4350cdf0e10cSrcweir // kein break!
4351cdf0e10cSrcweir
4352cdf0e10cSrcweir case nsTblChgWidthHeightType::WH_ROW_TOP:
4353cdf0e10cSrcweir case nsTblChgWidthHeightType::WH_ROW_BOTTOM:
4354cdf0e10cSrcweir {
4355cdf0e10cSrcweir if( bInsDel && !bBigger ) // um wieviel wird es Hoeher?
4356cdf0e10cSrcweir {
4357cdf0e10cSrcweir nAbsDiff = GetRowFrm( *pBaseLine )->Frm().Height();
4358cdf0e10cSrcweir }
4359cdf0e10cSrcweir
4360cdf0e10cSrcweir if( TBLVAR_CHGABS == eTblChgMode )
4361cdf0e10cSrcweir {
4362cdf0e10cSrcweir // erstmal testen, ob ueberhaupt Platz ist
4363cdf0e10cSrcweir if( bBigger )
4364cdf0e10cSrcweir {
4365cdf0e10cSrcweir bRet = sal_True;
4366cdf0e10cSrcweir // was ist mit Top, was ist mit Tabelle im Rahmen oder in Kopf-/Fusszeile
4367cdf0e10cSrcweir // mit fester Hoehe ??
4368cdf0e10cSrcweir if( !bRet )
4369cdf0e10cSrcweir {
4370cdf0e10cSrcweir // dann sich selbst rekursiv aufrufen; nur mit
4371cdf0e10cSrcweir // einem anderen Mode -> proprotional
4372cdf0e10cSrcweir TblChgMode eOld = eTblChgMode;
4373cdf0e10cSrcweir eTblChgMode = TBLFIX_CHGPROP;
4374cdf0e10cSrcweir
4375cdf0e10cSrcweir bRet = SetRowHeight( rAktBox, eType, nAbsDiff,
4376cdf0e10cSrcweir nRelDiff, ppUndo );
4377cdf0e10cSrcweir
4378cdf0e10cSrcweir eTblChgMode = eOld;
4379cdf0e10cSrcweir return bRet;
4380cdf0e10cSrcweir }
4381cdf0e10cSrcweir }
4382cdf0e10cSrcweir else
4383cdf0e10cSrcweir bRet = (*fnSelLine)( (*pLines)[ nBaseLinePos ], aParam,
4384cdf0e10cSrcweir nAbsDiff, sal_True );
4385cdf0e10cSrcweir
4386cdf0e10cSrcweir if( bRet )
4387cdf0e10cSrcweir {
4388cdf0e10cSrcweir if( bInsDel )
4389cdf0e10cSrcweir {
4390cdf0e10cSrcweir if( !aParam.aBoxes.Count() )
4391cdf0e10cSrcweir ::lcl_InsDelSelLine( (*pLines)[ nBaseLinePos ],
4392cdf0e10cSrcweir aParam, 0, sal_True );
4393cdf0e10cSrcweir
4394cdf0e10cSrcweir pFndBox = ::lcl_SaveInsDelData( aParam, ppUndo, aTmpLst );
4395cdf0e10cSrcweir
4396cdf0e10cSrcweir // #110525# delete complete table when last row is
4397cdf0e10cSrcweir // deleted
4398cdf0e10cSrcweir if( !bBigger &&
4399cdf0e10cSrcweir aParam.aBoxes.Count() == aSortCntBoxes.Count() )
4400cdf0e10cSrcweir {
4401cdf0e10cSrcweir GetFrmFmt()->GetDoc()->DeleteRowCol( aParam.aBoxes );
4402cdf0e10cSrcweir return sal_False;
4403cdf0e10cSrcweir }
4404cdf0e10cSrcweir
4405cdf0e10cSrcweir
4406cdf0e10cSrcweir if( ppUndo )
4407cdf0e10cSrcweir *ppUndo = aParam.CreateUndo(
4408cdf0e10cSrcweir bBigger ? UNDO_TABLE_INSROW
4409cdf0e10cSrcweir : UNDO_ROW_DELETE );
4410cdf0e10cSrcweir }
4411cdf0e10cSrcweir else if( ppUndo )
4412cdf0e10cSrcweir *ppUndo = new SwUndoAttrTbl( *aParam.pTblNd, sal_True );
4413cdf0e10cSrcweir
4414cdf0e10cSrcweir (*fnSelLine)( (*pLines)[ nBaseLinePos ], aParam,
4415cdf0e10cSrcweir nAbsDiff, sal_False );
4416cdf0e10cSrcweir }
4417cdf0e10cSrcweir }
4418cdf0e10cSrcweir else
4419cdf0e10cSrcweir {
4420cdf0e10cSrcweir bRet = sal_True;
4421cdf0e10cSrcweir sal_uInt16 nStt, nEnd;
4422cdf0e10cSrcweir if( bTop )
4423cdf0e10cSrcweir nStt = 0, nEnd = nBaseLinePos;
4424cdf0e10cSrcweir else
4425cdf0e10cSrcweir nStt = nBaseLinePos + 1, nEnd = pLines->Count();
4426cdf0e10cSrcweir
4427cdf0e10cSrcweir // die akt. Hoehe der Lines besorgen
4428cdf0e10cSrcweir if( TBLFIX_CHGPROP == eTblChgMode )
4429cdf0e10cSrcweir {
4430cdf0e10cSrcweir for( n = nStt; n < nEnd; ++n )
4431cdf0e10cSrcweir {
4432cdf0e10cSrcweir SwLayoutFrm* pLineFrm = GetRowFrm( *(*pLines)[ n ] );
4433cdf0e10cSrcweir ASSERT( pLineFrm, "wo ist der Frm von der SwTableLine?" );
4434cdf0e10cSrcweir aParam.nMaxSpace += CalcRowRstHeight( pLineFrm );
4435cdf0e10cSrcweir aParam.nMaxHeight += pLineFrm->Frm().Height();
4436cdf0e10cSrcweir }
4437cdf0e10cSrcweir if( bBigger && aParam.nMaxSpace < nAbsDiff )
4438cdf0e10cSrcweir bRet = sal_False;
4439cdf0e10cSrcweir }
4440cdf0e10cSrcweir else
4441cdf0e10cSrcweir {
4442cdf0e10cSrcweir if( bTop ? nEnd : nStt < nEnd )
4443cdf0e10cSrcweir {
4444cdf0e10cSrcweir if( bTop )
4445cdf0e10cSrcweir nStt = nEnd - 1;
4446cdf0e10cSrcweir else
4447cdf0e10cSrcweir nEnd = nStt + 1;
4448cdf0e10cSrcweir }
4449cdf0e10cSrcweir else
4450cdf0e10cSrcweir bRet = sal_False;
4451cdf0e10cSrcweir }
4452cdf0e10cSrcweir
4453cdf0e10cSrcweir if( bRet )
4454cdf0e10cSrcweir {
4455cdf0e10cSrcweir if( bBigger )
4456cdf0e10cSrcweir {
4457cdf0e10cSrcweir for( n = nStt; n < nEnd; ++n )
4458cdf0e10cSrcweir {
4459cdf0e10cSrcweir if( !(*fnOtherLine)( (*pLines)[ n ], aParam,
4460cdf0e10cSrcweir nAbsDiff, sal_True ))
4461cdf0e10cSrcweir {
4462cdf0e10cSrcweir bRet = sal_False;
4463cdf0e10cSrcweir break;
4464cdf0e10cSrcweir }
4465cdf0e10cSrcweir }
4466cdf0e10cSrcweir }
4467cdf0e10cSrcweir else
4468cdf0e10cSrcweir bRet = (*fnSelLine)( (*pLines)[ nBaseLinePos ], aParam,
4469cdf0e10cSrcweir nAbsDiff, sal_True );
4470cdf0e10cSrcweir }
4471cdf0e10cSrcweir
4472cdf0e10cSrcweir if( bRet )
4473cdf0e10cSrcweir {
4474cdf0e10cSrcweir // dann mal anpassen
4475cdf0e10cSrcweir if( bInsDel )
4476cdf0e10cSrcweir {
4477cdf0e10cSrcweir if( !aParam.aBoxes.Count() )
4478cdf0e10cSrcweir ::lcl_InsDelSelLine( (*pLines)[ nBaseLinePos ],
4479cdf0e10cSrcweir aParam, 0, sal_True );
4480cdf0e10cSrcweir pFndBox = ::lcl_SaveInsDelData( aParam, ppUndo, aTmpLst );
4481cdf0e10cSrcweir if( ppUndo )
4482cdf0e10cSrcweir *ppUndo = aParam.CreateUndo(
4483cdf0e10cSrcweir bBigger ? UNDO_TABLE_INSROW
4484cdf0e10cSrcweir : UNDO_ROW_DELETE );
4485cdf0e10cSrcweir }
4486cdf0e10cSrcweir else if( ppUndo )
4487cdf0e10cSrcweir *ppUndo = new SwUndoAttrTbl( *aParam.pTblNd, sal_True );
4488cdf0e10cSrcweir
4489cdf0e10cSrcweir CR_SetLineHeight aParam1( aParam );
4490cdf0e10cSrcweir if( TBLFIX_CHGPROP == eTblChgMode && !bBigger &&
4491cdf0e10cSrcweir !aParam.nMaxSpace )
4492cdf0e10cSrcweir {
4493cdf0e10cSrcweir // dann muss der gesamte Platz auf alle Lines
4494cdf0e10cSrcweir // gleichmaessig verteilt werden. Dafuer wird die
4495cdf0e10cSrcweir // Anzahl benoetigt
4496cdf0e10cSrcweir aParam1.nLines = nEnd - nStt;
4497cdf0e10cSrcweir }
4498cdf0e10cSrcweir
4499cdf0e10cSrcweir if( bTop )
4500cdf0e10cSrcweir {
4501cdf0e10cSrcweir (*fnSelLine)( (*pLines)[ nBaseLinePos ], aParam,
4502cdf0e10cSrcweir nAbsDiff, sal_False );
4503cdf0e10cSrcweir for( n = nStt; n < nEnd; ++n )
4504cdf0e10cSrcweir (*fnOtherLine)( (*pLines)[ n ], aParam1,
4505cdf0e10cSrcweir nAbsDiff, sal_False );
4506cdf0e10cSrcweir }
4507cdf0e10cSrcweir else
4508cdf0e10cSrcweir {
4509cdf0e10cSrcweir for( n = nStt; n < nEnd; ++n )
4510cdf0e10cSrcweir (*fnOtherLine)( (*pLines)[ n ], aParam1,
4511cdf0e10cSrcweir nAbsDiff, sal_False );
4512cdf0e10cSrcweir (*fnSelLine)( (*pLines)[ nBaseLinePos ], aParam,
4513cdf0e10cSrcweir nAbsDiff, sal_False );
4514cdf0e10cSrcweir }
4515cdf0e10cSrcweir }
4516cdf0e10cSrcweir else
4517cdf0e10cSrcweir {
4518cdf0e10cSrcweir // dann sich selbst rekursiv aufrufen; nur mit
4519cdf0e10cSrcweir // einem anderen Mode -> proprotional
4520cdf0e10cSrcweir TblChgMode eOld = eTblChgMode;
4521cdf0e10cSrcweir eTblChgMode = TBLVAR_CHGABS;
4522cdf0e10cSrcweir
4523cdf0e10cSrcweir bRet = SetRowHeight( rAktBox, eType, nAbsDiff,
4524cdf0e10cSrcweir nRelDiff, ppUndo );
4525cdf0e10cSrcweir
4526cdf0e10cSrcweir eTblChgMode = eOld;
4527cdf0e10cSrcweir pFndBox = 0;
4528cdf0e10cSrcweir }
4529cdf0e10cSrcweir }
4530cdf0e10cSrcweir }
4531cdf0e10cSrcweir break;
4532cdf0e10cSrcweir }
4533cdf0e10cSrcweir
4534cdf0e10cSrcweir if( pFndBox )
4535cdf0e10cSrcweir {
4536cdf0e10cSrcweir // dann raeume die Struktur aller Lines auf
4537cdf0e10cSrcweir GCLines();
4538cdf0e10cSrcweir
4539cdf0e10cSrcweir //Layout updaten
4540cdf0e10cSrcweir if( bBigger || pFndBox->AreLinesToRestore( *this ) )
4541cdf0e10cSrcweir pFndBox->MakeFrms( *this );
4542cdf0e10cSrcweir
4543cdf0e10cSrcweir // TL_CHART2: it is currently unclear if sth has to be done here.
4544cdf0e10cSrcweir
4545cdf0e10cSrcweir delete pFndBox;
4546cdf0e10cSrcweir
4547cdf0e10cSrcweir if( ppUndo && *ppUndo )
4548cdf0e10cSrcweir {
4549cdf0e10cSrcweir aParam.pUndo->SetColWidthParam( nBoxIdx, static_cast<sal_uInt16>(eTblChgMode), eType,
4550cdf0e10cSrcweir nAbsDiff, nRelDiff );
4551cdf0e10cSrcweir if( bBigger )
4552cdf0e10cSrcweir aParam.pUndo->SaveNewBoxes( *aParam.pTblNd, aTmpLst );
4553cdf0e10cSrcweir }
4554cdf0e10cSrcweir }
4555cdf0e10cSrcweir
4556cdf0e10cSrcweir CHECKTABLELAYOUT
4557cdf0e10cSrcweir
4558cdf0e10cSrcweir return bRet;
4559cdf0e10cSrcweir }
4560cdf0e10cSrcweir
4561cdf0e10cSrcweir /* */
4562cdf0e10cSrcweir
GetFormat(long nWidth) const4563cdf0e10cSrcweir SwFrmFmt* SwShareBoxFmt::GetFormat( long nWidth ) const
4564cdf0e10cSrcweir {
4565cdf0e10cSrcweir SwFrmFmt *pRet = 0, *pTmp;
4566cdf0e10cSrcweir for( sal_uInt16 n = aNewFmts.Count(); n; )
4567cdf0e10cSrcweir if( ( pTmp = (SwFrmFmt*)aNewFmts[ --n ])->GetFrmSize().GetWidth()
4568cdf0e10cSrcweir == nWidth )
4569cdf0e10cSrcweir {
4570cdf0e10cSrcweir pRet = pTmp;
4571cdf0e10cSrcweir break;
4572cdf0e10cSrcweir }
4573cdf0e10cSrcweir return pRet;
4574cdf0e10cSrcweir }
4575cdf0e10cSrcweir
GetFormat(const SfxPoolItem & rItem) const4576cdf0e10cSrcweir SwFrmFmt* SwShareBoxFmt::GetFormat( const SfxPoolItem& rItem ) const
4577cdf0e10cSrcweir {
4578cdf0e10cSrcweir const SfxPoolItem* pItem;
4579cdf0e10cSrcweir sal_uInt16 nWhich = rItem.Which();
4580cdf0e10cSrcweir SwFrmFmt *pRet = 0, *pTmp;
4581cdf0e10cSrcweir const SfxPoolItem& rFrmSz = pOldFmt->GetFmtAttr( RES_FRM_SIZE, sal_False );
4582cdf0e10cSrcweir for( sal_uInt16 n = aNewFmts.Count(); n; )
4583cdf0e10cSrcweir if( SFX_ITEM_SET == ( pTmp = (SwFrmFmt*)aNewFmts[ --n ])->
4584cdf0e10cSrcweir GetItemState( nWhich, sal_False, &pItem ) && *pItem == rItem &&
4585cdf0e10cSrcweir pTmp->GetFmtAttr( RES_FRM_SIZE, sal_False ) == rFrmSz )
4586cdf0e10cSrcweir {
4587cdf0e10cSrcweir pRet = pTmp;
4588cdf0e10cSrcweir break;
4589cdf0e10cSrcweir }
4590cdf0e10cSrcweir return pRet;
4591cdf0e10cSrcweir }
4592cdf0e10cSrcweir
AddFormat(const SwFrmFmt & rNew)4593cdf0e10cSrcweir void SwShareBoxFmt::AddFormat( const SwFrmFmt& rNew )
4594cdf0e10cSrcweir {
4595cdf0e10cSrcweir void* pFmt = (void*)&rNew;
4596cdf0e10cSrcweir aNewFmts.Insert( pFmt, aNewFmts.Count() );
4597cdf0e10cSrcweir }
4598cdf0e10cSrcweir
RemoveFormat(const SwFrmFmt & rFmt)4599cdf0e10cSrcweir sal_Bool SwShareBoxFmt::RemoveFormat( const SwFrmFmt& rFmt )
4600cdf0e10cSrcweir {
4601cdf0e10cSrcweir // returnt sal_True, wenn geloescht werden kann
4602cdf0e10cSrcweir if( pOldFmt == &rFmt )
4603cdf0e10cSrcweir return sal_True;
4604cdf0e10cSrcweir
4605cdf0e10cSrcweir void* p = (void*)&rFmt;
4606cdf0e10cSrcweir sal_uInt16 nFnd = aNewFmts.GetPos( p );
4607cdf0e10cSrcweir if( USHRT_MAX != nFnd )
4608cdf0e10cSrcweir aNewFmts.Remove( nFnd );
4609cdf0e10cSrcweir return 0 == aNewFmts.Count();
4610cdf0e10cSrcweir }
4611cdf0e10cSrcweir
~SwShareBoxFmts()4612cdf0e10cSrcweir SwShareBoxFmts::~SwShareBoxFmts()
4613cdf0e10cSrcweir {
4614cdf0e10cSrcweir }
4615cdf0e10cSrcweir
GetFormat(const SwFrmFmt & rFmt,long nWidth) const4616cdf0e10cSrcweir SwFrmFmt* SwShareBoxFmts::GetFormat( const SwFrmFmt& rFmt, long nWidth ) const
4617cdf0e10cSrcweir {
4618cdf0e10cSrcweir sal_uInt16 nPos;
4619cdf0e10cSrcweir return Seek_Entry( rFmt, &nPos )
4620cdf0e10cSrcweir ? aShareArr[ nPos ]->GetFormat( nWidth )
4621cdf0e10cSrcweir : 0;
4622cdf0e10cSrcweir }
GetFormat(const SwFrmFmt & rFmt,const SfxPoolItem & rItem) const4623cdf0e10cSrcweir SwFrmFmt* SwShareBoxFmts::GetFormat( const SwFrmFmt& rFmt,
4624cdf0e10cSrcweir const SfxPoolItem& rItem ) const
4625cdf0e10cSrcweir {
4626cdf0e10cSrcweir sal_uInt16 nPos;
4627cdf0e10cSrcweir return Seek_Entry( rFmt, &nPos )
4628cdf0e10cSrcweir ? aShareArr[ nPos ]->GetFormat( rItem )
4629cdf0e10cSrcweir : 0;
4630cdf0e10cSrcweir }
4631cdf0e10cSrcweir
AddFormat(const SwFrmFmt & rOld,const SwFrmFmt & rNew)4632cdf0e10cSrcweir void SwShareBoxFmts::AddFormat( const SwFrmFmt& rOld, const SwFrmFmt& rNew )
4633cdf0e10cSrcweir {
4634cdf0e10cSrcweir // wenn das Format nicht geshared ist, braucht es auch nicht in die
4635cdf0e10cSrcweir // Liste aufgenommen werden. Denn es gibt keinen 2. der es sucht.
4636cdf0e10cSrcweir //leider werden auch die CellFrms gefunden
4637cdf0e10cSrcweir // if( !rOld.IsLastDepend() )
4638cdf0e10cSrcweir {
4639cdf0e10cSrcweir sal_uInt16 nPos;
4640cdf0e10cSrcweir SwShareBoxFmt* pEntry;
4641cdf0e10cSrcweir if( !Seek_Entry( rOld, &nPos ))
4642cdf0e10cSrcweir {
4643cdf0e10cSrcweir pEntry = new SwShareBoxFmt( rOld );
4644cdf0e10cSrcweir aShareArr.C40_INSERT( SwShareBoxFmt, pEntry, nPos );
4645cdf0e10cSrcweir }
4646cdf0e10cSrcweir else
4647cdf0e10cSrcweir pEntry = aShareArr[ nPos ];
4648cdf0e10cSrcweir
4649cdf0e10cSrcweir pEntry->AddFormat( rNew );
4650cdf0e10cSrcweir }
4651cdf0e10cSrcweir }
ChangeFrmFmt(SwTableBox * pBox,SwTableLine * pLn,SwFrmFmt & rFmt)4652cdf0e10cSrcweir void SwShareBoxFmts::ChangeFrmFmt( SwTableBox* pBox, SwTableLine* pLn,
4653cdf0e10cSrcweir SwFrmFmt& rFmt )
4654cdf0e10cSrcweir {
4655cdf0e10cSrcweir SwClient aCl;
4656cdf0e10cSrcweir SwFrmFmt* pOld = 0;
4657cdf0e10cSrcweir if( pBox )
4658cdf0e10cSrcweir {
4659cdf0e10cSrcweir pOld = pBox->GetFrmFmt();
4660cdf0e10cSrcweir pOld->Add( &aCl );
4661cdf0e10cSrcweir pBox->ChgFrmFmt( (SwTableBoxFmt*)&rFmt );
4662cdf0e10cSrcweir }
4663cdf0e10cSrcweir else if( pLn )
4664cdf0e10cSrcweir {
4665cdf0e10cSrcweir pOld = pLn->GetFrmFmt();
4666cdf0e10cSrcweir pOld->Add( &aCl );
4667cdf0e10cSrcweir pLn->ChgFrmFmt( (SwTableLineFmt*)&rFmt );
4668cdf0e10cSrcweir }
4669cdf0e10cSrcweir if( pOld && pOld->IsLastDepend() )
4670cdf0e10cSrcweir {
4671cdf0e10cSrcweir RemoveFormat( *pOld );
4672cdf0e10cSrcweir delete pOld;
4673cdf0e10cSrcweir }
4674cdf0e10cSrcweir }
4675cdf0e10cSrcweir
SetSize(SwTableBox & rBox,const SwFmtFrmSize & rSz)4676cdf0e10cSrcweir void SwShareBoxFmts::SetSize( SwTableBox& rBox, const SwFmtFrmSize& rSz )
4677cdf0e10cSrcweir {
4678cdf0e10cSrcweir SwFrmFmt *pBoxFmt = rBox.GetFrmFmt(),
4679cdf0e10cSrcweir *pRet = GetFormat( *pBoxFmt, rSz.GetWidth() );
4680cdf0e10cSrcweir if( pRet )
4681cdf0e10cSrcweir ChangeFrmFmt( &rBox, 0, *pRet );
4682cdf0e10cSrcweir else
4683cdf0e10cSrcweir {
4684cdf0e10cSrcweir pRet = rBox.ClaimFrmFmt();
4685cdf0e10cSrcweir pRet->SetFmtAttr( rSz );
4686cdf0e10cSrcweir AddFormat( *pBoxFmt, *pRet );
4687cdf0e10cSrcweir }
4688cdf0e10cSrcweir }
4689cdf0e10cSrcweir
SetAttr(SwTableBox & rBox,const SfxPoolItem & rItem)4690cdf0e10cSrcweir void SwShareBoxFmts::SetAttr( SwTableBox& rBox, const SfxPoolItem& rItem )
4691cdf0e10cSrcweir {
4692cdf0e10cSrcweir SwFrmFmt *pBoxFmt = rBox.GetFrmFmt(),
4693cdf0e10cSrcweir *pRet = GetFormat( *pBoxFmt, rItem );
4694cdf0e10cSrcweir if( pRet )
4695cdf0e10cSrcweir ChangeFrmFmt( &rBox, 0, *pRet );
4696cdf0e10cSrcweir else
4697cdf0e10cSrcweir {
4698cdf0e10cSrcweir pRet = rBox.ClaimFrmFmt();
4699cdf0e10cSrcweir pRet->SetFmtAttr( rItem );
4700cdf0e10cSrcweir AddFormat( *pBoxFmt, *pRet );
4701cdf0e10cSrcweir }
4702cdf0e10cSrcweir }
4703cdf0e10cSrcweir
SetAttr(SwTableLine & rLine,const SfxPoolItem & rItem)4704cdf0e10cSrcweir void SwShareBoxFmts::SetAttr( SwTableLine& rLine, const SfxPoolItem& rItem )
4705cdf0e10cSrcweir {
4706cdf0e10cSrcweir SwFrmFmt *pLineFmt = rLine.GetFrmFmt(),
4707cdf0e10cSrcweir *pRet = GetFormat( *pLineFmt, rItem );
4708cdf0e10cSrcweir if( pRet )
4709cdf0e10cSrcweir ChangeFrmFmt( 0, &rLine, *pRet );
4710cdf0e10cSrcweir else
4711cdf0e10cSrcweir {
4712cdf0e10cSrcweir pRet = rLine.ClaimFrmFmt();
4713cdf0e10cSrcweir pRet->SetFmtAttr( rItem );
4714cdf0e10cSrcweir AddFormat( *pLineFmt, *pRet );
4715cdf0e10cSrcweir }
4716cdf0e10cSrcweir }
4717cdf0e10cSrcweir
RemoveFormat(const SwFrmFmt & rFmt)4718cdf0e10cSrcweir void SwShareBoxFmts::RemoveFormat( const SwFrmFmt& rFmt )
4719cdf0e10cSrcweir {
4720cdf0e10cSrcweir for( sal_uInt16 i = aShareArr.Count(); i; )
4721cdf0e10cSrcweir if( aShareArr[ --i ]->RemoveFormat( rFmt ))
4722cdf0e10cSrcweir aShareArr.DeleteAndDestroy( i );
4723cdf0e10cSrcweir }
4724cdf0e10cSrcweir
Seek_Entry(const SwFrmFmt & rFmt,sal_uInt16 * pPos) const4725cdf0e10cSrcweir sal_Bool SwShareBoxFmts::Seek_Entry( const SwFrmFmt& rFmt, sal_uInt16* pPos ) const
4726cdf0e10cSrcweir {
4727cdf0e10cSrcweir sal_uLong nIdx = (sal_uLong)&rFmt;
4728cdf0e10cSrcweir sal_uInt16 nO = aShareArr.Count(), nM, nU = 0;
4729cdf0e10cSrcweir if( nO > 0 )
4730cdf0e10cSrcweir {
4731cdf0e10cSrcweir nO--;
4732cdf0e10cSrcweir while( nU <= nO )
4733cdf0e10cSrcweir {
4734cdf0e10cSrcweir nM = nU + ( nO - nU ) / 2;
4735cdf0e10cSrcweir sal_uLong nFmt = (sal_uLong)&aShareArr[ nM ]->GetOldFormat();
4736cdf0e10cSrcweir if( nFmt == nIdx )
4737cdf0e10cSrcweir {
4738cdf0e10cSrcweir if( pPos )
4739cdf0e10cSrcweir *pPos = nM;
4740cdf0e10cSrcweir return sal_True;
4741cdf0e10cSrcweir }
4742cdf0e10cSrcweir else if( nFmt < nIdx )
4743cdf0e10cSrcweir nU = nM + 1;
4744cdf0e10cSrcweir else if( nM == 0 )
4745cdf0e10cSrcweir {
4746cdf0e10cSrcweir if( pPos )
4747cdf0e10cSrcweir *pPos = nU;
4748cdf0e10cSrcweir return sal_False;
4749cdf0e10cSrcweir }
4750cdf0e10cSrcweir else
4751cdf0e10cSrcweir nO = nM - 1;
4752cdf0e10cSrcweir }
4753cdf0e10cSrcweir }
4754cdf0e10cSrcweir if( pPos )
4755cdf0e10cSrcweir *pPos = nU;
4756cdf0e10cSrcweir return sal_False;
4757cdf0e10cSrcweir }
4758cdf0e10cSrcweir
4759cdf0e10cSrcweir
4760