Update ooo320-m1
[ooovba.git] / binfilter / inc / bf_sw / swtable.hxx
blobefdde26b51f2e158944ca52b4aa29d72acba665d
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: swtable.hxx,v $
10 * $Revision: 1.9 $
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 ************************************************************************/
30 #ifndef _SWTABLE_HXX
31 #define _SWTABLE_HXX
33 #ifndef _SVMEMPOOL_HXX //autogen
34 #include <tools/mempool.hxx>
35 #endif
36 #ifndef _TOOLS_REF_HXX
37 #include <tools/ref.hxx>
38 #endif
39 #ifndef _SVARRAY_HXX //autogen
40 #include <bf_svtools/svarray.hxx>
41 #endif
42 #ifndef _TBLENUM_HXX
43 #include <tblenum.hxx>
44 #endif
45 #ifndef _CALBCK_HXX
46 #include <calbck.hxx>
47 #endif
49 #ifdef PRODUCT
50 #ifndef _NODE_HXX
51 #include <node.hxx> // fuer StartNode->GetMyIndex
52 #endif
53 #else
54 namespace binfilter {
55 class SwStartNode;
56 } //namespace binfilter
57 #endif
58 class Color;
59 namespace binfilter {
61 class SfxPoolItem;
62 class SwFrmFmt;
63 class SwTableFmt;
64 class SwTableLineFmt;
65 class SwTableBoxFmt;
66 class SwHTMLTableLayout;
67 class SwTableLine;
68 class SwTableBox;
69 class SwTableNode;
70 class SwTabCols;
71 class SwDoc;
72 class SwSelBoxes;
73 class SwTblCalcPara;
74 class SwChartLines;
75 struct SwPosition;
76 class SwNodeIndex;
78 class SchMemChart;
79 class SwTableBox_Impl;
81 #ifndef SW_DECL_SWSERVEROBJECT_DEFINED
82 #define SW_DECL_SWSERVEROBJECT_DEFINED
83 SV_DECL_REF( SwServerObject )
84 #endif
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
96 protected:
97 SwTableLines aLines;
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;}
114 public:
115 TYPEINFO();
117 SwTable( SwTableFmt* );
118 SwTable( const SwTable& rTable ); // kein Copy der Lines !!
119 ~SwTable();
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
189 void GCLines();
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
210 SwTableBoxes aBoxes;
211 SwTableBox *pUpper;
213 public:
214 TYPEINFO();
216 SwTableLine( SwTableLineFmt*, USHORT nBoxes, SwTableBox *pUp );
217 ~SwTableLine();
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 & );
251 SwTableLines aLines;
252 const SwStartNode * pSttNd;
253 SwTableLine *pUpper;
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* );
261 public:
262 TYPEINFO();
264 SwTableBox( SwTableBoxFmt*, USHORT nLines, SwTableLine *pUp = 0 );
265 SwTableBox( SwTableBoxFmt*, const SwStartNode&, SwTableLine *pUp = 0 );
266 SwTableBox( SwTableBoxFmt*, const SwNodeIndex&, SwTableLine *pUp = 0 );
267 ~SwTableBox();
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
285 #ifdef PRODUCT
286 { return pSttNd ? pSttNd->GetIndex() : 0; }
287 #else
289 #endif
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