/************************************************************************* * * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: swtable.hxx,v $ * * $Revision: 1.10 $ * * last change: $Author: rt $ $Date: 2005-09-09 02:16:56 $ * * The Contents of this file are made available subject to * the terms of GNU Lesser General Public License Version 2.1. * * * GNU Lesser General Public License Version 2.1 * ============================================= * Copyright 2005 by Sun Microsystems, Inc. * 901 San Antonio Road, Palo Alto, CA 94303, USA * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * ************************************************************************/ #ifndef _SWTABLE_HXX #define _SWTABLE_HXX #ifndef _SVMEMPOOL_HXX //autogen #include #endif #ifndef _TOOLS_REF_HXX #include #endif #ifndef _SVARRAY_HXX //autogen #include #endif #ifndef _TBLENUM_HXX #include #endif #ifndef _SWTYPES_HXX #include #endif #ifndef _CALBCK_HXX #include #endif #ifndef _SWRECT_HXX #include #endif #ifdef PRODUCT #ifndef _NODE_HXX #include // fuer StartNode->GetMyIndex #endif #else class SwStartNode; #endif class Color; class SwFrmFmt; class SwTableFmt; class SwTableLineFmt; class SwTableBoxFmt; class SwHTMLTableLayout; class SwTableLine; class SwTableBox; class SwTableNode; class SwTabCols; class SwDoc; class SwSelBoxes; class SwTblCalcPara; class SwChartLines; struct SwPosition; class SwNodeIndex; class SfxPoolItem; class SchMemChart; class SwUndoTblMerge; class SwUndo; class SwTableBox_Impl; class SwUndoTblCpyTbl; #ifndef SW_DECL_SWSERVEROBJECT_DEFINED #define SW_DECL_SWSERVEROBJECT_DEFINED SV_DECL_REF( SwServerObject ) #endif SV_DECL_PTRARR_DEL(SwTableLines, SwTableLine*, 10, 20); SV_DECL_PTRARR_DEL(SwTableBoxes, SwTableBox*, 25, 50); // speicher die Inhaltstragenden Box-Pointer zusaetzlich in einem // sortierten Array (fuers rechnen in der Tabelle) typedef SwTableBox* SwTableBoxPtr; SV_DECL_PTRARR_SORT( SwTableSortBoxes, SwTableBoxPtr, 25, 50 ); class SwTable: public SwClient //Client vom FrmFmt { protected: SwTableLines aLines; SwTableSortBoxes aSortCntBoxes; SwServerObjectRef refObj; // falls DataServer -> Pointer gesetzt SwHTMLTableLayout *pHTMLLayout; // Usually, the table node of a SwTable can be accessed by getting a box // out of aSortCntBoxes, which know their SwStartNode. But in some rare // cases, we need to know the table node of a SwTable, before the table // boxes have been build (SwTableNode::MakeCopy with tables in tables). SwTableNode* pTableNode; //SOLL das fuer jede Tabelle einstellbar sein? TblChgMode eTblChgMode; USHORT nGrfsThatResize; // Anzahl der Grfs, die beim HTML-Import // noch ein Resize der Tbl. anstossen USHORT nRowsToRepeat; // number of rows to repeat on every page BOOL bModifyLocked :1; BOOL IsModifyLocked(){ return bModifyLocked;} public: TYPEINFO(); // single argument ctors shall be explicit. explicit SwTable( SwTableFmt* ); virtual ~SwTable(); // @@@ public copy ctor, but no copy assignment? SwTable( const SwTable& rTable ); // kein Copy der Lines !! private: // @@@ public copy ctor, but no copy assignment? SwTable & operator= (const SwTable &); // no default ctor. SwTable(); public: SwHTMLTableLayout *GetHTMLTableLayout() { return pHTMLLayout; } const SwHTMLTableLayout *GetHTMLTableLayout() const { return pHTMLLayout; } void SetHTMLTableLayout( SwHTMLTableLayout *p ); //Eigentumsuebergang! USHORT IncGrfsThatResize() { return ++nGrfsThatResize; } USHORT DecGrfsThatResize() { return nGrfsThatResize ? --nGrfsThatResize : 0; } void LockModify() { bModifyLocked = TRUE; } //Muessen _immer_ paarig void UnlockModify() { bModifyLocked = FALSE;} //benutzt werden! USHORT GetRowsToRepeat() const { return Min( GetTabLines().Count(), nRowsToRepeat ); } USHORT _GetRowsToRepeat() const { return nRowsToRepeat; } void SetRowsToRepeat( USHORT nNumOfRows ) { nRowsToRepeat = nNumOfRows; } bool IsHeadline( const SwTableLine& rLine ) const; SwTableLines &GetTabLines() { return aLines; } const SwTableLines &GetTabLines() const { return aLines; } SwFrmFmt* GetFrmFmt() { return (SwFrmFmt*)pRegisteredIn; } SwFrmFmt* GetFrmFmt() const { return (SwFrmFmt*)pRegisteredIn; } virtual void Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ); void GetTabCols( SwTabCols &rToFill, const SwTableBox *pStart, FASTBOOL bHidden = FALSE, BOOL bCurRowOnly = FALSE ) const; void SetTabCols( const SwTabCols &rNew, SwTabCols &rOld, const SwTableBox *pStart, BOOL bCurRowOnly ); BOOL InsertCol( SwDoc*, const SwSelBoxes& rBoxes, USHORT nCnt = 1, BOOL bBehind = TRUE ); BOOL InsertRow( SwDoc*, const SwSelBoxes& rBoxes, USHORT nCnt = 1, BOOL bBehind = TRUE ); BOOL AppendRow( SwDoc* pDoc, USHORT nCnt = 1 ); BOOL DeleteSel( SwDoc*, const SwSelBoxes& rBoxes, SwUndo* pUndo = 0, const BOOL bDelMakeFrms = TRUE, const BOOL bCorrBorder = TRUE ); BOOL SplitRow( SwDoc* pDoc, const SwSelBoxes& rBoxes, USHORT nCnt=1, BOOL bSameHeight = FALSE ); BOOL SplitCol( SwDoc* pDoc, const SwSelBoxes& rBoxes, USHORT nCnt=1 ); BOOL Merge( SwDoc* pDoc, const SwSelBoxes& rBoxes, SwTableBox* pMergeBox, SwUndoTblMerge* = 0 ); SwTableSortBoxes& GetTabSortBoxes() { return aSortCntBoxes; } const SwTableSortBoxes& GetTabSortBoxes() const { return aSortCntBoxes; } // lese die 1. Nummer und loesche sie aus dem String // (wird von GetTblBox und SwTblFld benutzt) static USHORT _GetBoxNum( String& rStr, BOOL bFirst = FALSE ); // suche die Inhaltstragende Box mit dem Namen const SwTableBox* GetTblBox( const String& rName ) const; // kopiere die selektierten Boxen in ein anderes Dokument. BOOL MakeCopy( SwDoc*, const SwPosition&, const SwSelBoxes&, BOOL bCpyNds = TRUE, BOOL bCpyName = FALSE ) const; // kopiere die Tabelle in diese. (die Logik steht im TBLRWCL.CXX) BOOL InsTable( const SwTable& rCpyTbl, const SwNodeIndex&, SwUndoTblCpyTbl* pUndo = 0 ); BOOL InsTable( const SwTable& rCpyTbl, const SwSelBoxes&, SwUndoTblCpyTbl* pUndo = 0 ); // kopiere die Headline (mit Inhalt!) der Tabelle in eine andere BOOL CopyHeadlineIntoTable( SwTableNode& rTblNd ); // erfrage die Box, dessen Start-Index auf nBoxStt steht SwTableBox* GetTblBox( ULONG nSttIdx ); const SwTableBox* GetTblBox( ULONG nSttIdx ) const { return ((SwTable*)this)->GetTblBox( nSttIdx ); } // returnt TRUE wenn sich in der Tabelle Verschachtelungen befinden BOOL IsTblComplex() const; //returnt TRUE wenn die Tabelle oder Selektion ausgeglichen ist BOOL IsTblComplexForChart( const String& rSel, SwChartLines* pGetCLines = 0 ) const; // suche alle Inhaltstragenden-Boxen der Grundline in der diese Box // steht. rBoxes auch als Return-Wert, um es gleich weiter zu benutzen //JP 31.01.97: bToTop = TRUE -> hoch bis zur Grundline, // FALSE-> sonst nur die Line der Box SwSelBoxes& SelLineFromBox( const SwTableBox* pBox, SwSelBoxes& rBoxes, BOOL bToTop = TRUE ) const; // erfrage vom Client Informationen virtual BOOL GetInfo( SfxPoolItem& ) const; // suche im Format nach der angemeldeten Tabelle static SwTable* FindTable( SwFrmFmt* pFmt ); // Struktur ein wenig aufraeumen void GCLines(); // BorderLine ein wenig aufraeumen void GCBorderLines(); // returns the table node via aSortCntBoxes or pTableNode SwTableNode* GetTableNode() const; void SetTableNode( SwTableNode* pNode ) { pTableNode = pNode; } // Daten Server-Methoden void SetRefObject( SwServerObject* ); const SwServerObject* GetObject() const { return &refObj; } SwServerObject* GetObject() { return &refObj; } BOOL IsServer() const { return refObj.Is(); } //Daten fuer das Chart fuellen. SchMemChart *UpdateData( SchMemChart *pData, const String* pSelection = 0 ) const; TblChgMode GetTblChgMode() const { return eTblChgMode; } void SetTblChgMode( TblChgMode eMode ) { eTblChgMode = eMode; } BOOL SetColWidth( SwTableBox& rAktBox, USHORT eType, SwTwips nAbsDiff, SwTwips nRelDiff, SwUndo** ppUndo ); BOOL SetRowHeight( SwTableBox& rAktBox, USHORT eType, SwTwips nAbsDiff, SwTwips nRelDiff, SwUndo** ppUndo ); }; class SwTableLine: public SwClient // Client vom FrmFmt { SwTableBoxes aBoxes; SwTableBox *pUpper; public: TYPEINFO(); SwTableLine() : pUpper(0) {} SwTableLine( SwTableLineFmt*, USHORT nBoxes, SwTableBox *pUp ); virtual ~SwTableLine(); SwTableBoxes &GetTabBoxes() { return aBoxes; } const SwTableBoxes &GetTabBoxes() const { return aBoxes; } SwTableBox *GetUpper() { return pUpper; } const SwTableBox *GetUpper() const { return pUpper; } void SetUpper( SwTableBox *pNew ) { pUpper = pNew; } SwFrmFmt* GetFrmFmt() { return (SwFrmFmt*)pRegisteredIn; } SwFrmFmt* GetFrmFmt() const { return (SwFrmFmt*)pRegisteredIn; } //Macht ein eingenes FrmFmt wenn noch mehr Lines von ihm abhaengen. SwFrmFmt* ClaimFrmFmt(); void ChgFrmFmt( SwTableLineFmt* pNewFmt ); // suche nach der naechsten/vorherigen Box mit Inhalt SwTableBox* FindNextBox( const SwTable&, const SwTableBox* =0, BOOL bOvrTblLns=TRUE ) const; SwTableBox* FindPreviousBox( const SwTable&, const SwTableBox* =0, BOOL bOvrTblLns=TRUE ) const; SwTwips GetLineHeight() const; }; class SwTableBox: public SwClient //Client vom FrmFmt { friend class SwNodes; // um den Index umzusetzen ! friend void DelBoxNode(SwTableSortBoxes&); // um den StartNode* zu loeschen ! friend class SwXMLTableContext; //nicht (mehr) implementiert. SwTableBox( const SwTableBox & ); SwTableBox &operator=( const SwTableBox &); //gibts nicht. SwTableLines aLines; const SwStartNode * pSttNd; SwTableLine *pUpper; SwTableBox_Impl* pImpl; // falls das Format schon Formeln/Values enthaelt, muss ein neues // fuer die neue Box erzeugt werden. SwTableBoxFmt* CheckBoxFmt( SwTableBoxFmt* ); public: TYPEINFO(); SwTableBox() : pSttNd(0), pUpper(0), pImpl(0) {} SwTableBox( SwTableBoxFmt*, USHORT nLines, SwTableLine *pUp = 0 ); SwTableBox( SwTableBoxFmt*, const SwStartNode&, SwTableLine *pUp = 0 ); SwTableBox( SwTableBoxFmt*, const SwNodeIndex&, SwTableLine *pUp = 0 ); virtual ~SwTableBox(); SwTableLines &GetTabLines() { return aLines; } const SwTableLines &GetTabLines() const { return aLines; } SwTableLine *GetUpper() { return pUpper; } const SwTableLine *GetUpper() const { return pUpper; } void SetUpper( SwTableLine *pNew ) { pUpper = pNew; } SwFrmFmt* GetFrmFmt() { return (SwFrmFmt*)pRegisteredIn; } SwFrmFmt* GetFrmFmt() const { return (SwFrmFmt*)pRegisteredIn; } //Macht ein eingenes FrmFmt wenn noch mehr Boxen von ihm abhaengen. SwFrmFmt* ClaimFrmFmt(); void ChgFrmFmt( SwTableBoxFmt *pNewFmt ); const SwStartNode *GetSttNd() const { return pSttNd; } ULONG GetSttIdx() const #ifdef PRODUCT { return pSttNd ? pSttNd->GetIndex() : 0; } #else ; #endif // suche nach der naechsten/vorherigen Box mit Inhalt SwTableBox* FindNextBox( const SwTable&, const SwTableBox* =0, BOOL bOvrTblLns=TRUE ) const; SwTableBox* FindPreviousBox( const SwTable&, const SwTableBox* =0, BOOL bOvrTblLns=TRUE ) const; // gebe den Namen dieser Box zurueck. Dieser wird dynamisch bestimmt // und ergibt sich aus der Position in den Lines/Boxen/Tabelle String GetName() const; // gebe den "Wert" der Box zurueck (fuers rechnen in der Tabelle) double GetValue( SwTblCalcPara& rPara ) const; BOOL IsInHeadline( const SwTable* pTbl = 0 ) const; // enthaelt die Box Inhalt, der als Nummer formatiert werden kann? BOOL HasNumCntnt( double& rNum, ULONG& rFmtIndex, BOOL& rIsEmptyTxtNd ) const; ULONG IsValidNumTxtNd( BOOL bCheckAttr = TRUE ) const; // teste ob der BoxInhalt mit der Nummer uebereinstimmt, wenn eine // Tabellenformel gesetzt ist. (fuers Redo des Change vom NumFormat!) BOOL IsNumberChanged() const; // ist das eine FormelBox oder eine Box mit numerischen Inhalt (AutoSum) // Was es ist, besagt der ReturnWert - die WhichId des Attributes // Leere Boxen haben den ReturnWert USHRT_MAX !! USHORT IsFormulaOrValueBox() const; // fuers Laden - tauscht bei Value Zellen den Inhalt aus, falls sie // fuer die Sprache System formatiert sind. void ChgByLanguageSystem(); DECL_FIXEDMEMPOOL_NEWDEL(SwTableBox) // zugriff auf interne Daten - z.Z. benutzt fuer den NumFormatter inline const Color* GetSaveUserColor() const; inline const Color* GetSaveNumFmtColor() const; inline void SetSaveUserColor(const Color* p ); inline void SetSaveNumFmtColor( const Color* p ); }; #endif //_SWTABLE_HXX