office-gobmx/sw/inc/ndtxt.hxx

395 lines
15 KiB
C++

/*************************************************************************
*
* $RCSfile: ndtxt.hxx,v $
*
* $Revision: 1.4 $
*
* last change: $Author: jp $ $Date: 2001-02-23 14:28:01 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
*
* - GNU Lesser General Public License Version 2.1
* - Sun Industry Standards Source License Version 1.1
*
* Sun Microsystems Inc., October, 2000
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2000 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
*
*
* Sun Industry Standards Source License Version 1.1
* =================================================
* The contents of this file are subject to the Sun Industry Standards
* Source License Version 1.1 (the "License"); You may not use this file
* except in compliance with the License. You may obtain a copy of the
* License at http://www.openoffice.org/license.html.
*
* Software provided under this License is provided on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
* See the License for the specific provisions governing your rights and
* obligations concerning the Software.
*
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
*
* Copyright: 2000 by Sun Microsystems, Inc.
*
* All Rights Reserved.
*
* Contributor(s): _______________________________________
*
*
************************************************************************/
#ifndef _NDTXT_HXX
#define _NDTXT_HXX
#ifndef _NODE_HXX
#include <node.hxx>
#endif
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _NDHINTS_HXX
#include <ndhints.hxx>
#endif
#ifndef _ERRHDL_HXX
#include <errhdl.hxx>
#endif
namespace utl {
class TransliterationWrapper;
};
class SwNumRules;
class SwTxtFmtColl;
class SwCntntFrm;
class SwTxtFld; // Fuer GetTxtFld()
class SwAttrSet;
class SwUndoTransliterate;
struct SwSpellArgs; // fuer Spell()
class SwInterHyphInfo; // Hyphenate(), splargs.hxx
class SwWrongList; // fuer OnlineSpelling
class SwNodeNum;
class OutputDevice;
// Konstanten fuer das Text-Insert:
#define INS_DEFAULT 0x0000 // keine Extras
#define INS_EMPTYEXPAND 0x0001 // leere Hints beim Einfuegen aufspannen
#define INS_NOHINTEXPAND 0x0002 // Hints an der InsPos nicht aufspannen
namespace com { namespace sun { namespace star { namespace uno {
template < class > class Sequence;
}}}}
// --------------------
// SwTxtNode
// --------------------
class SwTxtNode: public SwCntntNode
{
// fuer das Erzeugen des ersten TextNode
friend class SwDoc; // CTOR und AppendTxtNode()
friend class SwNodes;
friend class SwTxtFrm;
friend void SwpHints::Insert( SwTxtAttr*, SwTxtNode&, USHORT );
//Kann 0 sein, nur dann nicht 0 wenn harte Attribute drin stehen.
//Also niemals direkt zugreifen!
SwpHints *pSwpHints;
SwWrongList *pWrong; // Rechtschreibfehler nach Online-Spelling
SwNodeNum *pNdNum; // Numerierung fuer diesen Absatz
SwNodeNum *pNdOutl; // Outline fuer diesen Absatz
XubString aText;
SwTxtNode( const SwNodeIndex &rWhere, SwTxtFmtColl *pTxtColl,
SwAttrSet* pAutoAttr = 0 );
// Kopiert die Attribute an nStart nach pDest.
void CopyAttr( SwTxtNode *pDest, const xub_StrLen nStart, const xub_StrLen nOldPos);
SwTxtNode* _MakeNewTxtNode( const SwNodeIndex&, BOOL bNext = TRUE,
BOOL bChgFollow = TRUE );
void _Cut( SwTxtNode *pDest, const SwIndex &rDestStart,
const SwIndex &rStart, xub_StrLen nLen, BOOL bUpdate = TRUE );
SwTxtAttr* MakeTxtAttr( const SfxPoolItem& rNew, xub_StrLen nStt, xub_StrLen nEnd,
BOOL bPool = TRUE );
// Verlagere alles umfassende harte Attribute in den AttrSet des Absatzes
void MoveTxtAttr_To_AttrSet(); // wird von SplitNode gerufen.
// lege den spz. AttrSet an
virtual void NewAttrSet( SwAttrPool& );
void Replace0xFF( XubString& rTxt, xub_StrLen& rTxtStt,
xub_StrLen nEndPos, BOOL bExpandFlds ) const;
public:
const String& GetTxt() const { return aText; }
// Zugriff auf SwpHints
inline SwpHints &GetSwpHints();
inline const SwpHints &GetSwpHints() const;
inline SwpHints *GetpSwpHints() { return pSwpHints; }
inline const SwpHints *GetpSwpHints() const { return pSwpHints; }
void SetWrong( SwWrongList *pNew );
inline SwWrongList *GetWrong() { return pWrong; }
inline const SwWrongList *GetWrong() const { return pWrong; }
inline BOOL HasHints() const { return pSwpHints ? TRUE : FALSE; }
inline SwpHints &GetOrCreateSwpHints();
virtual ~SwTxtNode();
virtual xub_StrLen Len() const;
// steht in itratr
void GetMinMaxSize( ULONG nIndex, ULONG& rMin, ULONG &rMax, ULONG &rAbs,
OutputDevice* pOut = 0 ) const;
/*
* Einfuegen anderer Datentypen durch Erzeugen eines
* temporaeren Strings.
*/
SwTxtNode& Insert( xub_Unicode c, const SwIndex &rIdx );
SwTxtNode& Insert( const XubString &rStr, const SwIndex &rIdx,
const USHORT nMode = INS_DEFAULT );
SwTxtNode& Erase( const SwIndex &rIdx, xub_StrLen nCount = STRING_LEN,
const USHORT nMode = INS_DEFAULT );
// Aktionen auf Attributen
// loesche alle TextAttribute die als Attribut im Set vorhanden sind
// (Set-Pointer != 0 ) oder alle deren Which-Wert mit nWhich mappen
// oder wenn Which = 0, alle.
void RstAttr( const SwIndex &rIdx, xub_StrLen nLen, USHORT nWhich = 0,
const SfxItemSet* pSet = 0, BOOL bInclRefToxMark = FALSE );
void GCAttr();
// loesche das Text-Attribut (muss beim Pool abgemeldet werden!)
void DestroyAttr( SwTxtAttr* pAttr );
// loesche alle Attribute aus dem SwpHintsArray.
void ClearSwpHintsArr( int bDelAll = TRUE, int bDelFields = TRUE );
// uebernehme den Pointer auf das Text-Attribut
BOOL Insert( SwTxtAttr *pAttr, USHORT nMode = 0 );
// lege ein neues TextAttribut an und fuege es ins SwpHints-Array ein
// returne den neuen Pointer (oder 0 bei Fehlern)!
SwTxtAttr* Insert( const SfxPoolItem& rAttr,
xub_StrLen nStt, xub_StrLen nEnd, USHORT nMode = 0 );
// setze diese Attribute am TextNode. Wird der gesamte Bereich umspannt,
// dann setze sie nur im AutoAttrSet (SwCntntNode:: SetAttr)
BOOL SetAttr( const SfxItemSet& rSet,
xub_StrLen nStt, xub_StrLen nEnd, USHORT nMode = 0 );
// erfrage die Attribute vom TextNode ueber den Bereich
BOOL GetAttr( SfxItemSet& rSet, xub_StrLen nStt, xub_StrLen nEnd,
BOOL bOnlyTxtAttr = FALSE,
BOOL bGetFromChrFmt = TRUE ) const;
// uebertrage Attribute eines AttrSets ( AutoFmt ) in das SwpHintsArray
void FmtToTxtAttr( SwTxtNode* pNd );
// loeschen eines einzelnen Attributes (fuer SwUndoAttr)
// ( nur das Attribut loeschen, dass mit Which,Start und End oder
// mit pTxtHint identisch ist (es gibt nur ein gueltiges))
// AUSNAHME: ToxMarks !!!
void Delete( USHORT nTxtWhich, xub_StrLen nStart, xub_StrLen nEnd = 0 );
void Delete( SwTxtAttr * pTxtAttr, BOOL bThisOnly = FALSE );
// Aktionen auf Text und Attributen
void Copy(SwTxtNode *pDest, const SwIndex &rStart, USHORT nLen);
void Copy(SwTxtNode *pDest, const SwIndex &rDestStart,
const SwIndex &rStart, xub_StrLen nLen);
void Cut(SwTxtNode *pDest, const SwIndex &rStart, xub_StrLen nLen);
inline void Cut(SwTxtNode *pDest, const SwIndex &rDestStart,
const SwIndex &rStart, xub_StrLen nLen);
// ersetze im String an Position nIdx das Zeichen
void Replace( const SwIndex& rStart, xub_Unicode cCh );
void Replace( const SwIndex& rStart, xub_StrLen nLen, const XubString& rText );
void ReplaceTextOnly( xub_StrLen nPos, const XubString& rText,
const ::com::sun::star::uno::Sequence<long>& rOffsets );
// virtuelle Methoden aus dem CntntNode
virtual SwCntntFrm *MakeFrm();
virtual SwCntntNode *SplitNode( const SwPosition & );
virtual SwCntntNode *JoinNext();
virtual SwCntntNode *JoinPrev();
SwCntntNode *AppendNode( const SwPosition & );
// setze ggf. das DontExpand-Flag an INet bzw. Zeichenvorlagen
BOOL DontExpandFmt( const SwIndex& rIdx, BOOL bFlag = TRUE,
BOOL bFmtToTxtAttributes = TRUE );
// gebe das vorgegebene Attribut, welches an der TextPosition (rIdx)
// gesetzt ist zurueck. Gibt es keines, returne 0-Pointer
// gesetzt heisst: Start <= rIdx < End
SwTxtAttr *GetTxtAttr( const SwIndex& rIdx, USHORT nWhichHt,
BOOL bExpand = FALSE ) const;
// Diese Methode liefert nur Textattribute auf der Position nIdx
// zurueck, die kein EndIdx besitzen und denselben Which besitzen.
// Ueblicherweise steht an dieser Position ein CH_TXTATR.
// Bei RES_TXTATR_END entfaellt die Pruefung auf den Which-Wert.
SwTxtAttr *GetTxtAttr( const xub_StrLen nIdx,
const USHORT nWhichHt = RES_TXTATR_END ) const;
SwTxtFld *GetTxtFld( const SwIndex& rIdx )
{ return (SwTxtFld *)GetTxtAttr( rIdx, RES_TXTATR_FIELD ); }
// Aktuelles Wort zurueckliefern
XubString GetCurWord(xub_StrLen);
USHORT Spell(SwSpellArgs*);
inline SwTxtFmtColl *GetTxtColl() const;
virtual SwFmtColl *ChgFmtColl( SwFmtColl* );
void _ChgTxtCollUpdateNum( const SwTxtFmtColl* pOld,
const SwTxtFmtColl* pNew );
// kopiere die Collection mit allen Autoformaten zum Dest-Node
// dieser kann auch in einem anderen Dokument stehen!
// (Methode steht im ndcopy.cxx!!)
void CopyCollFmt( SwTxtNode& rDestNd );
// Numerierung
const SwNodeNum* UpdateNum( const SwNodeNum& );
const SwNumRule *GetNumRule() const;
const SwNodeNum* GetNum() const { return pNdNum; }
// OutlineNumerierung
const SwNodeNum* UpdateOutlineNum( const SwNodeNum& );
const SwNodeNum* GetOutlineNum() const { return pNdOutl; }
void NumRuleChgd(); // Frames benachrichtigen
XubString GetNumString() const; // returnt Outline oder Num - String
long GetLeftMarginWithNum( BOOL bTxtLeft = FALSE ) const;
BOOL GetFirstLineOfsWithNum( short& rFirstOffset ) const;
USHORT GetLang( const xub_StrLen nBegin, const xub_StrLen nLen = 0) const;
// steht in ndcopy.cxx
BOOL IsSymbol( const xub_StrLen nBegin ) const; // steht in itratr.cxx
virtual SwCntntNode* MakeCopy( SwDoc*, const SwNodeIndex& ) const;
// interaktive Trennung: wir finden den TxtFrm und rufen sein CalcHyph
BOOL Hyphenate( SwInterHyphInfo &rHyphInf );
void DelSoftHyph( const xub_StrLen nStart, const xub_StrLen nEnd );
// Liefert einen String mit expandierten Feldern zurueck
// opt. die Kapitel/Nummer-String zurueck
XubString GetExpandTxt( const xub_StrLen nIdx = 0,
const xub_StrLen nLen = STRING_LEN,
const BOOL bWithNum = FALSE ) const;
BOOL GetExpandTxt( SwTxtNode& rDestNd, const SwIndex* pDestIdx = 0,
xub_StrLen nIdx = 0, xub_StrLen nLen = STRING_LEN,
BOOL bWithNum = FALSE ) const;
XubString GetRedlineTxt( xub_StrLen nIdx = 0,
xub_StrLen nLen = STRING_LEN,
BOOL bExpandFlds = FALSE,
BOOL bWithNum = FALSE ) const;
//Liefert fuer die Initalfunktion tatsaechliche Anzahl der Initialzeichen
//bei nWishLen == 0 die des ersten Wortes
USHORT GetDropLen( USHORT nWishLen) const;
// Berechnung des Visible-Flags
inline BOOL CalcVisibleFlag()
{ if(pSwpHints) return pSwpHints->CalcVisibleFlag(); return FALSE; }
// Setzen des CalcVisible-Flags
inline void SetCalcVisible(){ if(pSwpHints) pSwpHints->SetCalcVisible(); }
// Ist der Absatz sichtbar
inline BOOL IsVisible() const
{ return pSwpHints ? pSwpHints->IsVisible() : TRUE; }
// Besitzt der Absatz Fussnoten?
inline BOOL HasFtn() const {return pSwpHints ? pSwpHints->HasFtn() : FALSE;}
inline SwTxtAttr* MakeTmpTxtAttr( const SfxPoolItem& rNew )
{ return MakeTxtAttr( rNew, 0, 0, FALSE ); }
TYPEINFO(); // fuer rtti
// fuers Umhaengen der TxtFmtCollections (Outline-Nummerierung!!)
virtual void Modify( SfxPoolItem*, SfxPoolItem* );
// virtual BOOL GetInfo( SfxPoolItem& ) const;
// aus SwIndexReg
virtual void Update( const SwIndex & aPos, USHORT xub_StrLen,
BOOL bNegativ = FALSE );
FASTBOOL IsInSymbolFont( USHORT xub_StrLen ) const;
// change text to Upper/Lower/Hiragana/Katagana/...
void TransliterateText( utl::TransliterationWrapper& rTrans,
xub_StrLen nStart, xub_StrLen nEnd,
SwUndoTransliterate* pUndo = 0 );
USHORT GetScalingOfSelectedText( xub_StrLen nStt, xub_StrLen nEnd ) const;
DECL_FIXEDMEMPOOL_NEWDEL(SwTxtNode)
};
//-----------------------------------------------------------------------------
inline SwpHints &SwTxtNode::GetSwpHints()
{
ASSERT_ID( pSwpHints, ERR_NOHINTS);
return *pSwpHints;
}
inline const SwpHints &SwTxtNode::GetSwpHints() const
{
ASSERT_ID( pSwpHints, ERR_NOHINTS);
return *pSwpHints;
}
inline SwpHints& SwTxtNode::GetOrCreateSwpHints()
{
if( !pSwpHints )
pSwpHints = new SwpHints;
return *pSwpHints;
}
inline SwTxtFmtColl* SwTxtNode::GetTxtColl() const
{
return (SwTxtFmtColl*)GetRegisteredIn();
}
// fuer den IBM-Compiler nicht inlinen wg. 42876
#ifndef ICC
// Inline Metoden aus Node.hxx - erst hier ist der TxtNode bekannt !!
inline SwTxtNode *SwNode::GetTxtNode()
{
return ND_TEXTNODE == nNodeType ? (SwTxtNode*)this : 0;
}
inline const SwTxtNode *SwNode::GetTxtNode() const
{
return ND_TEXTNODE == nNodeType ? (const SwTxtNode*)this : 0;
}
#endif
inline void SwTxtNode::Cut(SwTxtNode *pDest, const SwIndex &rDestStart,
const SwIndex &rStart, xub_StrLen nLen)
{
_Cut( pDest, rDestStart, rStart, nLen, TRUE );
}
#endif