1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: swtable.hxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
33 #ifndef _SVMEMPOOL_HXX //autogen
34 #include <tools/mempool.hxx>
36 #ifndef _TOOLS_REF_HXX
37 #include <tools/ref.hxx>
39 #ifndef _SVARRAY_HXX //autogen
40 #include <bf_svtools/svarray.hxx>
43 #include <tblenum.hxx>
51 #include <node.hxx> // fuer StartNode->GetMyIndex
56 } //namespace binfilter
66 class SwHTMLTableLayout
;
79 class SwTableBox_Impl
;
81 #ifndef SW_DECL_SWSERVEROBJECT_DEFINED
82 #define SW_DECL_SWSERVEROBJECT_DEFINED
83 SV_DECL_REF( SwServerObject
)
86 SV_DECL_PTRARR_DEL(SwTableLines
, SwTableLine
*, 10, 20)//STRIP008 ;
87 SV_DECL_PTRARR_DEL(SwTableBoxes
, SwTableBox
*, 25, 50)//STRIP008 ;
89 // speicher die Inhaltstragenden Box-Pointer zusaetzlich in einem
90 // sortierten Array (fuers rechnen in der Tabelle)
91 typedef SwTableBox
* SwTableBoxPtr
;
92 SV_DECL_PTRARR_SORT( SwTableSortBoxes
, SwTableBoxPtr
, 25, 50 )//STRIP008 ;
94 class SwTable
: public SwClient
//Client vom FrmFmt
98 SwTableSortBoxes aSortCntBoxes
;
99 SwServerObjectRef refObj
; // falls DataServer -> Pointer gesetzt
101 SwHTMLTableLayout
*pHTMLLayout
;
103 //SOLL das fuer jede Tabelle einstellbar sein?
104 TblChgMode eTblChgMode
;
106 USHORT nGrfsThatResize
; // Anzahl der Grfs, die beim HTML-Import
107 // noch ein Resize der Tbl. anstossen
109 BOOL bModifyLocked
:1;
110 BOOL bHeadlineRepeat
:1;
112 BOOL
IsModifyLocked(){ return bModifyLocked
;}
117 SwTable( SwTableFmt
* );
118 SwTable( const SwTable
& rTable
); // kein Copy der Lines !!
121 SwHTMLTableLayout
*GetHTMLTableLayout() { return pHTMLLayout
; }
122 const SwHTMLTableLayout
*GetHTMLTableLayout() const { return pHTMLLayout
; }
123 void SetHTMLTableLayout( SwHTMLTableLayout
*p
); //Eigentumsuebergang!
125 USHORT
IncGrfsThatResize() { return ++nGrfsThatResize
; }
126 USHORT
DecGrfsThatResize() { return nGrfsThatResize
? --nGrfsThatResize
: 0; }
128 void LockModify() { bModifyLocked
= TRUE
; } //Muessen _immer_ paarig
129 void UnlockModify() { bModifyLocked
= FALSE
;} //benutzt werden!
131 BOOL
IsHeadlineRepeat() const { return bHeadlineRepeat
; }
132 void SetHeadlineRepeat( BOOL bSet
) { bHeadlineRepeat
= bSet
; }
134 SwTableLines
&GetTabLines() { return aLines
; }
135 const SwTableLines
&GetTabLines() const { return aLines
; }
137 SwFrmFmt
* GetFrmFmt() { return (SwFrmFmt
*)pRegisteredIn
; }
138 SwFrmFmt
* GetFrmFmt() const { return (SwFrmFmt
*)pRegisteredIn
; }
140 virtual void Modify( SfxPoolItem
* pOld
, SfxPoolItem
* pNew
);
142 void GetTabCols( SwTabCols
&rToFill
, const SwTableBox
*pStart
,
143 FASTBOOL bHidden
= FALSE
, BOOL bCurRowOnly
= FALSE
) const;
145 BOOL
DeleteSel( SwDoc
*, const SwSelBoxes
& rBoxes
,
146 const BOOL bDelMakeFrms
= TRUE
,
147 const BOOL bCorrBorder
= TRUE
);
148 BOOL
Merge( SwDoc
* pDoc
, const SwSelBoxes
& rBoxes
,
149 SwTableBox
* pMergeBox
);
151 SwTableSortBoxes
& GetTabSortBoxes() { return aSortCntBoxes
; }
152 const SwTableSortBoxes
& GetTabSortBoxes() const { return aSortCntBoxes
; }
154 // gebe den Zellnamen zu der angebenen Row/Col zurueck. Das ist
155 // nur fuer ausgeglichene Tabellen interessant, weil diese keine
156 // "Sub"Boxen kennen. Es wird z.B. aus (0,0) ein "A1".
157 // lese die 1. Nummer und loesche sie aus dem String
158 // (wird von GetTblBox und SwTblFld benutzt)
159 static USHORT
_GetBoxNum( String
& rStr
, BOOL bFirst
= FALSE
);
160 // suche die Inhaltstragende Box mit dem Namen
161 const SwTableBox
* GetTblBox( const String
& rName
) const;
162 // kopiere die selektierten Boxen in ein anderes Dokument.
163 // kopiere die Tabelle in diese. (die Logik steht im TBLRWCL.CXX)
164 // kopiere die Headline (mit Inhalt!) der Tabelle in eine andere
166 // erfrage die Box, dessen Start-Index auf nBoxStt steht
167 SwTableBox
* GetTblBox( ULONG nSttIdx
);
168 const SwTableBox
* GetTblBox( ULONG nSttIdx
) const
169 { return ((SwTable
*)this)->GetTblBox( nSttIdx
); }
171 // returnt TRUE wenn sich in der Tabelle Verschachtelungen befinden
172 BOOL
IsTblComplex() const;
174 //returnt TRUE wenn die Tabelle oder Selektion ausgeglichen ist
175 BOOL
IsTblComplexForChart( const String
& rSel
,
176 SwChartLines
* pGetCLines
= 0 ) const;
178 // suche alle Inhaltstragenden-Boxen der Grundline in der diese Box
179 // steht. rBoxes auch als Return-Wert, um es gleich weiter zu benutzen
180 //JP 31.01.97: bToTop = TRUE -> hoch bis zur Grundline,
181 // FALSE-> sonst nur die Line der Box
182 // erfrage vom Client Informationen
183 virtual BOOL
GetInfo( SfxPoolItem
& ) const;
185 // suche im Format nach der angemeldeten Tabelle
186 static SwTable
* FindTable( SwFrmFmt
* pFmt
);
188 // Struktur ein wenig aufraeumen
190 // BorderLine ein wenig aufraeumen
191 void GCBorderLines();
193 SwTableNode
* GetTableNode() const;
195 // Daten Server-Methoden
196 const SwServerObject
* GetObject() const { return &refObj
; }
197 SwServerObject
* GetObject() { return &refObj
; }
199 //Daten fuer das Chart fuellen.
200 SchMemChart
*UpdateData( SchMemChart
*pData
,
201 const String
* pSelection
= 0 ) const;
203 TblChgMode
GetTblChgMode() const { return eTblChgMode
; }
204 void SetTblChgMode( TblChgMode eMode
) { eTblChgMode
= eMode
; }
208 class SwTableLine
: public SwClient
// Client vom FrmFmt
216 SwTableLine( SwTableLineFmt
*, USHORT nBoxes
, SwTableBox
*pUp
);
219 SwTableBoxes
&GetTabBoxes() { return aBoxes
; }
220 const SwTableBoxes
&GetTabBoxes() const { return aBoxes
; }
222 SwTableBox
*GetUpper() { return pUpper
; }
223 const SwTableBox
*GetUpper() const { return pUpper
; }
224 void SetUpper( SwTableBox
*pNew
) { pUpper
= pNew
; }
227 SwFrmFmt
* GetFrmFmt() { return (SwFrmFmt
*)pRegisteredIn
; }
228 SwFrmFmt
* GetFrmFmt() const { return (SwFrmFmt
*)pRegisteredIn
; }
230 //Macht ein eingenes FrmFmt wenn noch mehr Lines von ihm abhaengen.
231 SwFrmFmt
* ClaimFrmFmt();
232 void ChgFrmFmt( SwTableLineFmt
* pNewFmt
);
234 // suche nach der naechsten/vorherigen Box mit Inhalt
235 SwTableBox
* FindNextBox( const SwTable
&, const SwTableBox
* =0,
236 BOOL bOvrTblLns
=TRUE
) const;
237 SwTableBox
* FindPreviousBox( const SwTable
&, const SwTableBox
* =0,
238 BOOL bOvrTblLns
=TRUE
) const;
242 class SwTableBox
: public SwClient
//Client vom FrmFmt
244 friend class SwNodes
; // um den Index umzusetzen !
245 friend void DelBoxNode(SwTableSortBoxes
&); // um den StartNode* zu loeschen !
246 friend class SwXMLTableContext
;
248 //nicht (mehr) implementiert.
249 SwTableBox( const SwTableBox
& );
252 const SwStartNode
* pSttNd
;
254 SwTableBox_Impl
* pImpl
;
256 SwTableBox
&operator=( const SwTableBox
&); //gibts nicht.
257 // falls das Format schon Formeln/Values enthaelt, muss ein neues
258 // fuer die neue Box erzeugt werden.
259 SwTableBoxFmt
* CheckBoxFmt( SwTableBoxFmt
* );
264 SwTableBox( SwTableBoxFmt
*, USHORT nLines
, SwTableLine
*pUp
= 0 );
265 SwTableBox( SwTableBoxFmt
*, const SwStartNode
&, SwTableLine
*pUp
= 0 );
266 SwTableBox( SwTableBoxFmt
*, const SwNodeIndex
&, SwTableLine
*pUp
= 0 );
269 SwTableLines
&GetTabLines() { return aLines
; }
270 const SwTableLines
&GetTabLines() const { return aLines
; }
272 SwTableLine
*GetUpper() { return pUpper
; }
273 const SwTableLine
*GetUpper() const { return pUpper
; }
274 void SetUpper( SwTableLine
*pNew
) { pUpper
= pNew
; }
276 SwFrmFmt
* GetFrmFmt() { return (SwFrmFmt
*)pRegisteredIn
; }
277 SwFrmFmt
* GetFrmFmt() const { return (SwFrmFmt
*)pRegisteredIn
; }
279 //Macht ein eingenes FrmFmt wenn noch mehr Boxen von ihm abhaengen.
280 SwFrmFmt
* ClaimFrmFmt();
281 void ChgFrmFmt( SwTableBoxFmt
*pNewFmt
);
283 const SwStartNode
*GetSttNd() const { return pSttNd
; }
284 ULONG
GetSttIdx() const
286 { return pSttNd
? pSttNd
->GetIndex() : 0; }
291 // suche nach der naechsten/vorherigen Box mit Inhalt
292 // gebe den Namen dieser Box zurueck. Dieser wird dynamisch bestimmt
293 // und ergibt sich aus der Position in den Lines/Boxen/Tabelle
294 String
GetName() const;
295 // gebe den "Wert" der Box zurueck (fuers rechnen in der Tabelle)
296 double GetValue( SwTblCalcPara
& rPara
) const;
298 BOOL
IsInHeadline( const SwTable
* pTbl
= 0 ) const;
300 // enthaelt die Box Inhalt, der als Nummer formatiert werden kann?
301 ULONG
IsValidNumTxtNd( BOOL bCheckAttr
= TRUE
) const;
302 // teste ob der BoxInhalt mit der Nummer uebereinstimmt, wenn eine
303 // Tabellenformel gesetzt ist. (fuers Redo des Change vom NumFormat!)
305 // ist das eine FormelBox oder eine Box mit numerischen Inhalt (AutoSum)
306 // Was es ist, besagt der ReturnWert - die WhichId des Attributes
307 // Leere Boxen haben den ReturnWert USHRT_MAX !!
309 // fuers Laden - tauscht bei Value Zellen den Inhalt aus, falls sie
310 // fuer die Sprache System formatiert sind.
311 void ChgByLanguageSystem();
313 DECL_FIXEDMEMPOOL_NEWDEL(SwTableBox
)
315 // zugriff auf interne Daten - z.Z. benutzt fuer den NumFormatter
318 } //namespace binfilter
319 #endif //_SWTABLE_HXX