Files
libreoffice/sw/source/core/inc/txtfrm.hxx
Oliver Bolte 103a0da5f4 INTEGRATION: CWS swqbugfixes09 (1.43.72); FILE MERGED
2004/10/29 11:39:39 fme 1.43.72.1: #i29062# Prefer FormatQuick over Format during painting
2004-11-16 14:43:18 +00:00

820 lines
30 KiB
C++

/*************************************************************************
*
* $RCSfile: txtfrm.hxx,v $
*
* $Revision: 1.44 $
*
* last change: $Author: obo $ $Date: 2004-11-16 15:43:18 $
*
* 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 _TXTFRM_HXX
#define _TXTFRM_HXX
#ifndef _SVMEMPOOL_HXX //autogen
#include <tools/mempool.hxx>
#endif
#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif
#include "cntfrm.hxx"
#define STRSIZE(x) (sizeof(x)-1)
class SwCharRange;
class SwTxtNode;
class SwTxtFormatter;
class SwTxtFormatInfo;
class SwParaPortion;
class WidowsAndOrphans;
class SwBodyFrm;
class SwFooterFrm;
class SwTxtFtn;
class SwInterHyphInfo; // Hyphenate()
class SwCache;
class SwBorderAttrs;
class SwFrmFmt;
class SwFldPortion;
class OutputDevice;
class SwTestFormat;
class SwStripes;
struct SwCrsrMoveState;
struct SwFillData;
class SwPortionHandler;
class SwScriptInfo;
#define GRID_ON 0
#define GRID_HEIGHT 1
#define RUBY_HEIGHT 2
#define RUBY_TOP 3
#define GRID_CELLS 4
class SwTxtFrm: public SwCntntFrm
{
friend class SwTxtIter;
friend class SwTestFormat;
friend class WidowsAndOrphans;
friend class SwTxtFrmLocker; // duerfen Lock()/Unlock()
friend sal_Bool lcl_ChangeOffset( SwTxtFrm* pFrm, USHORT nNew );
static SwCache *pTxtCache; //Pointer auf den Line-Cache
static long nMinPrtLine; //Diese Linie darf beim Drucken nicht
//unterschritten werden, Hack fuer Tabellenzellen ueber mehrere Seiten
ULONG nAllLines :24;//Anzahl der Zeilen fuer das Paint (inkl. nThisLines)
ULONG nThisLines :8; //Anzahl der Zeilen dieses Frames
// The x position for flys anchored at this paragraph.
// These values are calculated in SwTxtFrm::CalcBaseOfstForFly()
SwTwips mnFlyAnchorOfst;
// The x position for wrap-through flys anchored at this paragraph.
SwTwips mnFlyAnchorOfstNoWrap;
SwTwips mnFtnLine;
// OD 2004-03-17 #i11860# - re-factoring of #i11859#
// member for height of last line (value needed for proportional line spacing)
SwTwips mnHeightOfLastLine;
xub_StrLen nOfst; //nOfst gibt den Offset im Cntnt (Anzahl Zeichen) an.
USHORT nCacheIdx; //Index in den Cache, USHRT_MAX wenn definitiv
//kein passendes Objekt im Cache steht.
//Teilt den Master ab und erzeugt einen Follow oder passt die
//Daten im Follow an.
void _AdjustFollow( SwTxtFormatter &rLine, const xub_StrLen nOffset,
const xub_StrLen nStrEnd, const sal_uInt8 nMode );
inline void AdjustFollow( SwTxtFormatter &rLine, const xub_StrLen nOffset,
const xub_StrLen nStrEnd, const sal_uInt8 nMode );
//Iteriert ueber alle Zeilen und stellt das Linespacing
//entsprechend dem Attribut ein.
void CalcLineSpace();
void InitCtor(); // Wird in beiden Ctoren gerufen
// Wird nur in Format gerufen:
void AdjustFrm( const SwTwips nChgHeight, sal_Bool bHasToFit = sal_False );
// wertet in Format() die Preps aus.
sal_Bool CalcPreps();
void PrepWidows( const USHORT nNeed, sal_Bool bNotify = sal_True );
void _InvalidateRange( const SwCharRange &, const long = 0);
inline void InvalidateRange( const SwCharRange &, const long = 0);
// WidowsAndOrphans, AdjustFrm, AdjustFollow
void FormatAdjust( SwTxtFormatter &rLine, WidowsAndOrphans &rFrmBreak,
const xub_StrLen nStrLen, const sal_Bool bDummy );
sal_Bool bLocked : 1; // im Format?
sal_Bool bFormatted : 1; // nach Format auf sal_True
sal_Bool bWidow : 1; // sind wir ein Widow
sal_Bool bJustWidow : 1; // haben wir soeben Widow angefordert
sal_Bool bEmpty : 1; // sind wir ein leerer Absatz
sal_Bool bInFtnConnect : 1; // Steht gerade im Connect
sal_Bool bFtn : 1; // Hat mindestens eine Fussnote
sal_Bool bRepaint : 1; // TxtFrm: Repaint steht zur Abholung bereit
sal_Bool bBlinkPor : 1; // enthaelt Blink-Portions
sal_Bool bFieldFollow : 1; // beginne mit Feldrest des Masters
sal_Bool bHasAnimation : 1; // enthaelt animierte SwGrfNumPortion
sal_Bool bIsSwapped : 1; // during text formatting we swap the
// width and height for vertical formatting
// OD 14.03.2003 #i11760# - flag to control, if follow is formatted in
// method <CalcFollow(..)>.
// E.g., avoid formatting of follow, if method <SwLayoutFrm::FormatWidthCols(..)>
// is running.
sal_Bool mbFollowFormatAllowed : 1;
void ResetPreps();
inline void Lock() { bLocked = sal_True; }
inline void Unlock() { bLocked = sal_False; }
inline void SetFormatted( const sal_Bool bNew ) { bFormatted = bNew; }
inline void SetWidow( const sal_Bool bNew ) { bWidow = bNew; }
inline void SetJustWidow( const sal_Bool bNew ) { bJustWidow = bNew; }
inline void SetEmpty( const sal_Bool bNew ) { bEmpty = bNew; }
inline void SetFieldFollow( const sal_Bool bNew ) { bFieldFollow = bNew; }
sal_Bool IsIdxInside( const xub_StrLen nPos, const xub_StrLen nLen ) const;
// Wechselt den Frame oder auch nicht (vgl. FlyCnt)
sal_Bool _GetCrsrOfst(SwPosition *pPos, const Point &rPoint,
const sal_Bool bChgFrm, SwCrsrMoveState* = 0 ) const;
void FillCrsrPos( SwFillData &rFill ) const;
// formatiert genau eine Zeile ...
sal_Bool FormatLine( SwTxtFormatter &rLine, const sal_Bool bPrev );
// Um Stack einzusparen aufgeteilt ...
// _Format ruft _Format mit Parametern
void _Format( SwParaPortion *pPara );
void _Format( SwTxtFormatter &rLine, SwTxtFormatInfo &rInf,
const sal_Bool bAdjust = sal_False );
void FormatOnceMore( SwTxtFormatter &rLine, SwTxtFormatInfo &rInf );
// formatiert den Follow und sorgt fuer die Entsorgung bei Orphans
sal_Bool CalcFollow( const xub_StrLen nTxtOfst );
// korrigiert die Stelle ab der formatiert werden muss.
xub_StrLen FindBrk(const String &rTxt, const xub_StrLen nStart,
const xub_StrLen nEnd) const;
// inline-Weiche
SwTwips _GetFtnFrmHeight() const;
// Aus CalcPreps ausgelagert.
sal_Bool CalcPrepFtnAdjust();
// Fuer Ftn und WidOrp: Zwangsvalidierung
void ValidateFrm();
void ValidateBodyFrm();
sal_Bool _GetDropRect( SwRect &rRect ) const;
void SetPara( SwParaPortion *pNew, sal_Bool bDelete = sal_True );
sal_Bool _IsFtnNumFrm() const;
// 6995: Formatinformationen auffrischen
sal_Bool FormatQuick( bool bForceQuickFormat );
// Opt: Leere Absaetze formatieren
sal_Bool FormatEmpty();
SwTwips EmptyHeight() const;
// Opt: Leere Absaetze painten
sal_Bool PaintEmpty( const SwRect &, sal_Bool bCheck ) const;
void ChgThisLines();//Muss immer gerufen werden, wenn sich die Zeilenazahl
//veraendert haben kann.
// required for 'new' relative anchor position
void CalcBaseOfstForFly();
/** method to determine height of last line, needed for proportional line spacing
OD 2004-03-17 #i11860#
@author OD
*/
void _CalcHeightOfLastLine();
public:
//public, weil der eine oder andere die Methode rufen darf um das
//Prepare zu sparen - mit Vorsicht zu geniessen!
void Init();
// Wird von FormatSpelling( ) gerufen
SwRect _AutoSpell( SwCntntNode* , USHORT );
// Wird vom CollectAutoCmplWords gerufen
void CollectAutoCmplWrds( SwCntntNode* , USHORT , sal_Bool bIsVisArea );
// Returns the screen position of rPos. The values are relative to the upper
// left position of the page frame.
// Additional information can be obtained by passing an SwCrsrMoveState object.
// Returns sal_False if rPos > number of character is string
virtual sal_Bool GetCharRect( SwRect& rRect, const SwPosition& rPos,
SwCrsrMoveState* pCMS = 0 ) const;
// Eine etwas abgespeckte GetCharRect-Version fuer autopositionierte Rahmen
sal_Bool GetAutoPos( SwRect &, const SwPosition& ) const;
/** determine top of line for given position in the text frame
OD 11.11.2003 #i22341#
Assumption: given position exists in the text frame or in a follow of it
OD 2004-02-02 - adjustment
Top of first paragraph line is the top of the paragraph.
OD 2004-03-18 #i11860# - Consider upper space amount considered for
previous frame and the page grid.
@author OD
@param _onTopOfLine
output parameter - top of line, if the given position is found in the
text frame.
@param _rPos
input parameter - reference to the position in the text frame
@return boolean indicating, if the top of line for the given position
has been determined or not.
*/
bool GetTopOfLine( SwTwips& _onTopOfLine,
const SwPosition& _rPos ) const;
//Liefert in nOffset den Offset des Characters innerhalb des
//gesetzten Textbuffers zurueck, welcher der durch aPoint
//gegebenen Position innerhalb der SSize des Layout am
//naechsten ist. Wenn der SPoint ausserhalb der SSize liegt,
//liefert die Funktion sal_False, sal_True sonst.
virtual sal_Bool GetCrsrOfst( SwPosition *, Point&,
SwCrsrMoveState* = 0) const;
// GetKeyCrsrOfst sorgt dafuer, dass der Frame nicht gewechselt wird
// (z.B. Wechsel in den zeichengebundenen Frame).
inline sal_Bool GetKeyCrsrOfst(SwPosition *pPos, const Point &rPoint ) const
{ return _GetCrsrOfst( pPos, rPoint, sal_False ); }
void PaintExtraData( const SwRect & rRect ) const; //Seitennummer usw.
SwRect Paint();
virtual void Paint( const SwRect & ) const;
virtual void Modify( SfxPoolItem*, SfxPoolItem* );
virtual sal_Bool GetInfo( SfxPoolItem & ) const;
//Layoutorientiertes Cursortravelling: Linker, rechter Rand,
//vorhergehende/naechste Zeile, gleiche horizontale Position.
virtual sal_Bool LeftMargin(SwPaM *) const;
virtual sal_Bool RightMargin(SwPaM *, sal_Bool bAPI = sal_False) const;
virtual sal_Bool UnitUp(SwPaM *, const SwTwips nOffset = 0,
sal_Bool bSetInReadOnly = sal_False ) const;
virtual sal_Bool UnitDown(SwPaM *, const SwTwips nOffset = 0,
sal_Bool bSetInReadOnly = sal_False ) const;
sal_Bool _UnitUp(SwPaM *, const SwTwips nOffset = 0,
sal_Bool bSetInReadOnly = sal_False ) const;
sal_Bool _UnitDown(SwPaM *, const SwTwips nOffset = 0,
sal_Bool bSetInReadOnly = sal_False ) const;
// Prepares the cursor position for a visual cursor move (BiDi).
// The behaviour is different for insert and overwrite cursors
void PrepareVisualMove( xub_StrLen& nPos, BYTE& nCrsrLevel,
sal_Bool& bRight, sal_Bool bInsertCrsr );
// Methoden zur Verwaltung von FolgeFrames
SwCntntFrm *SplitFrm( const xub_StrLen nTxtPos );
SwCntntFrm *JoinFrm();
inline USHORT GetOfst() const { return nOfst; }
void _SetOfst( const USHORT nNewOfst );
inline void SetOfst ( const USHORT nNewOfst );
inline void ManipOfst ( const USHORT nNewOfst ){ nOfst = nNewOfst; }
SwTxtFrm *GetFrmAtPos ( const SwPosition &rPos);
inline const SwTxtFrm *GetFrmAtPos ( const SwPosition &rPos) const;
// OD 07.10.2003 #110978# - return <reference> instead of <pointer>
SwTxtFrm& GetFrmAtOfst( const xub_StrLen nOfst );
// Wenn es einen Follow gibt und wir selbst keinen Text enthalten:
inline sal_Bool IsEmptyMaster() const
{ return GetFollow() && !GetFollow()->GetOfst(); }
// Liefert den zu bearbeitenden Textausschnitt zurueck (inline, s.u.)
const String& GetTxt() const;
inline SwTxtNode *GetTxtNode()
{ return (SwTxtNode*)SwCntntFrm::GetNode(); }
inline const SwTxtNode *GetTxtNode() const
{ return (SwTxtNode*)SwCntntFrm::GetNode(); }
SwTxtFrm(SwTxtNode * const);
inline ~SwTxtFrm() { if( HasAnimation() ) ClearPara(); }
// SwCntntFrm: der "kurze Dienstweg" fuer die Frames.
// Wer den void* falsch casted ist selbst Schuld!
// Auf jedenfall muss der void* auf 0 geprueft werden.
virtual void Prepare( const PrepareHint ePrep = PREP_CLEAR,
const void *pVoid = 0, sal_Bool bNotify = sal_True );
// nMaxHeight is the required height
// bSplit indicates, that the paragraph has to be split
// bTst indicates, that we are currently doing a test formatting
virtual sal_Bool WouldFit( SwTwips &nMaxHeight, sal_Bool &bSplit, sal_Bool bTst );
// Hier das WouldFit-Aequivalent fuer mal kurz probeweise
// umgehaengte TextFrames, auch hier liefert
// nMaxHeight die benoetigte Hoehe,
// und bSplit sagt, obj der Absatz gesplittet werden muss.
// Uebergeben wird der potentielle Vorgaenger fuer die Abstandsberechnung
sal_Bool TestFormat( const SwFrm* pPrv, SwTwips &nMaxHeight, sal_Bool &bSplit );
// Wir formatieren eine Zeile fuer die interaktive Trennung
// Return: found
sal_Bool Hyphenate( SwInterHyphInfo &rInf );
// Probegrow
inline SwTwips GrowTst( const SwTwips nGrow );
SwParaPortion *GetPara();
inline const SwParaPortion *GetPara() const;
inline sal_Bool HasPara() const;
sal_Bool _HasPara() const;
// If there are any hanging punctuation portions in the margin
// the offset will be returned.
SwTwips HangingMargin() const;
// RTTI
TYPEINFO();
DECL_FIXEDMEMPOOL_NEWDEL(SwTxtFrm)
// Locking
inline sal_Bool IsLocked() const { return bLocked; }
inline sal_Bool IsFormatted() const { return bFormatted; }
inline sal_Bool IsWidow() const { return bWidow; }
inline sal_Bool IsJustWidow() const { return bJustWidow; }
inline sal_Bool IsEmpty() const { return bEmpty; }
inline sal_Bool HasFtn() const { return bFtn; }
inline sal_Bool IsInFtnConnect()const { return bInFtnConnect;}
inline sal_Bool IsFieldFollow() const { return bFieldFollow;}
inline void SetRepaint() const;
inline void ResetRepaint() const;
inline sal_Bool HasRepaint() const { return bRepaint; }
inline void SetBlinkPor() const;
inline void ResetBlinkPor() const;
inline sal_Bool HasBlinkPor() const { return bBlinkPor; }
inline void SetAnimation() const
{ ( (SwTxtFrm*)this )->bHasAnimation = sal_True; }
inline sal_Bool HasAnimation() const { return bHasAnimation; }
inline sal_Bool IsSwapped() const { return bIsSwapped; }
// Hat der Frm eine lokale Fussnote (in diesem Frm bzw. Follow)?
#ifdef PRODUCT
void CalcFtnFlag();
#else
void CalcFtnFlag( xub_StrLen nStop = STRING_LEN );//Fuer den Test von SplitFrm
#endif
// Hidden
sal_Bool IsHiddenNow() const; // bHidden && pOut == pPrt
void HideHidden(); // Anhaengsel entfernen wenn Hidden
void HideFootnotes( xub_StrLen nStart, xub_StrLen nEnd );
/** method to hide/show objects
OD 2004-01-15 #110582#
method hides respectively shows objects, which are anchored at paragraph,
at/as a character of the paragraph, corresponding to the paragraph and
paragraph portion visibility.
@author OD
*/
void HideAndShowObjects();
// Ftn
void RemoveFtn( const xub_StrLen nStart = 0,
const xub_StrLen nLen = STRING_LEN );
inline SwTwips GetFtnFrmHeight() const;
SwTxtFrm *FindFtnRef( const SwTxtFtn *pFtn );
inline const SwTxtFrm *FindFtnRef( const SwTxtFtn *pFtn ) const
{ return FindFtnRef( pFtn ); }
void ConnectFtn( SwTxtFtn *pFtn, const SwTwips nDeadLine );
// Wenn wir eine Ftn sind, die auf ihre Referenz zu waechst...
// public weil von SwCntntFrm::MakeAll benoetigt.
SwTwips GetFtnLine( const SwTxtFtn *pFtn, sal_Bool bLocked ) const;
// Liefern den linken und den rechten Rand in
// Dokumentkoordinaten (unter Beachtung der Absatzattribute).
inline SwTwips GetLeftMargin() const;
inline SwTwips GetRightMargin() const;
virtual void Format( const SwBorderAttrs *pAttrs = 0 );
virtual void CheckDirection( BOOL bVert );
// Liefert die Summe der Zeilenhoehen in pLine zurueck.
USHORT GetParHeight() const;
// Liefert die Resthoehe zurueck
inline SwTwips GetRstHeight() const;
inline SwTxtFrm *GetFollow();
inline const SwTxtFrm *GetFollow() const;
// Suche die Seitennummer von ErgoSum und QuoVadis
SwTxtFrm *FindQuoVadisFrm();
// holt die Formatierug nach, wenn der Idle-Handler zugeschlagen hat.
// --> FME 2004-10-29 #i29062# GetFormatted() can trigger a full formatting
// of the paragraph, causing other layout frames to become invalid. This
// has to be avoided during painting. Therefore we need to pass the
// information that we are currently in the paint process.
SwTxtFrm* GetFormatted( bool bForceQuickFormat = false );
// <--
// wird demnaechst uebertragen
inline void SetFtn( const sal_Bool bNew ) { bFtn = bNew; }
// Beruecksichtigung der Follows
inline sal_Bool IsInside( const xub_StrLen nPos ) const;
const SwBodyFrm *FindBodyFrm() const;
// DropCaps und Selektionen
inline sal_Bool GetDropRect( SwRect &rRect ) const
{ return HasPara() ? _GetDropRect( rRect ) : sal_False; }
static SwCache *GetTxtCache() { return pTxtCache; }
static void SetTxtCache( SwCache *pNew ) { pTxtCache = pNew; }
static long GetMinPrtLine() { return nMinPrtLine; }
static void SetMinPrtLine( long nNew ) { nMinPrtLine = nNew; }
inline USHORT GetCacheIdx() const { return nCacheIdx; }
inline void SetCacheIdx( const USHORT nNew ) { nCacheIdx = nNew; }
//Entfert die Line-Informationen aus dem Cache.
void ClearPara();
// Bin ich ein FtnFrm, der eine Nummer am Absatzanfang hat?
inline sal_Bool IsFtnNumFrm() const
{ return IsInFtn() && !GetIndPrev() && _IsFtnNumFrm(); }
// simuliert eine Formatierung, als wenn es keinen rechten Rand und
// keine Flys oder andere Hindernisse gaebe und liefert die Breite.
USHORT CalcFitToContent();
// liefert den zusaetzlichen Zeilenabstand fuer den naechsten Absatz
// OD 07.01.2004 #i11859# - change return data type;
// add default parameter <_bNoPropLineSpacing> to control, if the
// value of a proportional line spacing is returned or not
long GetLineSpace( const bool _bNoPropLineSpacing = false ) const;
// liefert die erste Zeilenhoehe zurueck
USHORT FirstLineHeight() const;
// Haengt FlyInCntFrm um, wenn nEnd > Index >= nStart ist.
void MoveFlyInCnt( SwTxtFrm *pNew, USHORT nStart, USHORT nEnd );
// Berechnet die Position von FlyInCntFrms
USHORT CalcFlyPos( SwFrmFmt* pSearch );
// Ermittelt die Startposition und Schrittweite des Registers
sal_Bool FillRegister( SwTwips& rRegStart, USHORT& rRegDiff );
USHORT GetLineCount( USHORT nPos ); //Ermittelt die Zeilenanzahl
//Fuer die Anzeige der Zeilennummern.
ULONG GetAllLines() const { return nAllLines; }
ULONG GetThisLines() const { return nThisLines;}
void RecalcAllLines();
// Stoppt Animationen innerhalb von Numerierungen
void StopAnimation( OutputDevice *pOut );
void CriticalLines(const OutputDevice& rOut,SwStripes &rStripes,long nOffs);
// visit all portions for Accessibility
void VisitPortions( SwPortionHandler& rPH ) const;
// returns the script info stored at the paraportion
const SwScriptInfo* GetScriptInfo() const;
// Swaps width and height of the text frame
void SwapWidthAndHeight();
// Calculates the coordinates of a rectangle when switching from
// horizontal to vertical layout.
void SwitchHorizontalToVertical( SwRect& rRect ) const;
// Calculates the coordinates of a point when switching from
// horizontal to vertical layout.
void SwitchHorizontalToVertical( Point& rPoint ) const;
// Calculates the a limit value when switching from
// horizontal to vertical layout.
long SwitchHorizontalToVertical( long nLimit ) const;
// Calculates the coordinates of a rectangle when switching from
// vertical to horizontal layout.
void SwitchVerticalToHorizontal( SwRect& rRect ) const;
// Calculates the coordinates of a point when switching from
// vertical to horizontal layout.
void SwitchVerticalToHorizontal( Point& rPoint ) const;
// Calculates the a limit value when switching from
// vertical to horizontal layout.
long SwitchVerticalToHorizontal( long nLimit ) const;
// Calculates the coordinates of a rectangle when switching from
// LTR to RTL layout
void SwitchLTRtoRTL( SwRect& rRect ) const;
// Calculates the coordinates of a point when switching from
// LTR to RTL layout.
void SwitchLTRtoRTL( Point& rPoint ) const;
// Calculates the coordinates of a rectangle when switching from
// RTL to LTR layout
inline void SwitchRTLtoLTR( SwRect& rRect ) const { SwitchLTRtoRTL( rRect ); }
// Calculates the coordinates of a point when switching from
// RTL to LTR layout.
inline void SwitchRTLtoLTR( Point& rPoint ) const { SwitchLTRtoRTL( rPoint ); };
// OD 14.03.2003 #i11760# - access to new member <mbNoFollowFormat>
inline const bool FollowFormatAllowed() const
{
return mbFollowFormatAllowed;
}
inline void AllowFollowFormat()
{
mbFollowFormatAllowed = true;
}
inline void ForbidFollowFormat()
{
mbFollowFormatAllowed = false;
}
SwTwips GetBaseOfstForFly( sal_Bool bIgnoreFlysAnchoredAtThisFrame ) const
{
return ( bIgnoreFlysAnchoredAtThisFrame ?
mnFlyAnchorOfst :
mnFlyAnchorOfstNoWrap );
}
// OD 2004-03-17 #i11860#
inline SwTwips GetHeightOfLastLine() const
{
return mnHeightOfLastLine;
}
};
/*************************************************************************
* class SwTxtFrmLocker
*************************************************************************/
class SwTxtFrmLocker
{
private:
SwTxtFrm * const pFrm;
public:
inline SwTxtFrmLocker( SwTxtFrm *pTxtFrm )
: pFrm( pTxtFrm->IsLocked() ? 0 : pTxtFrm )
{ if( pFrm ) pFrm->Lock(); }
inline ~SwTxtFrmLocker() { if( pFrm ) pFrm->Unlock(); }
};
/*************************************************************************
* Inline-Implementierung
*************************************************************************/
inline const SwParaPortion *SwTxtFrm::GetPara() const
{
return ((SwTxtFrm*)this)->GetPara();
}
inline sal_Bool SwTxtFrm::HasPara() const
{
return nCacheIdx != USHRT_MAX ? _HasPara() : sal_False;
}
// 9104: Frm().Height() - Prt().Height(), siehe widorp.cxx und 7455, 6114, 7908
inline SwTwips SwTxtFrm::GetRstHeight() const
{
return !GetUpper() ? 0 : ((const SwFrm*)GetUpper())->Frm().Top()
+ ((const SwFrm*)GetUpper())->Prt().Top()
+ ((const SwFrm*)GetUpper())->Prt().Height()
- Frm().Top() - (Frm().Height() - Prt().Height());
}
inline SwTwips SwTxtFrm::GetLeftMargin() const
{
return Frm().Left() + Prt().Left();
}
inline SwTwips SwTxtFrm::GetRightMargin() const
{
return Frm().Left() + Prt().Left() + Prt().Width();
}
inline SwTwips SwTxtFrm::GrowTst( const SwTwips nGrow )
{
return Grow( nGrow, sal_True );
}
#if OSL_DEBUG_LEVEL > 1
// fragt auf WYSIWYG DBG ab
extern sal_Bool IsDbg( const SwTxtFrm *pFrm );
#define DBTXTFRM aDbstream << "SwTxtFrm[" << GetFrmId() << "]"
#endif
inline sal_Bool SwTxtFrm::IsInside( const xub_StrLen nPos ) const
{
sal_Bool bRet = sal_True;
if( nPos < GetOfst() )
bRet = sal_False;
else
{
const SwTxtFrm *pFoll = GetFollow();
if( pFoll && nPos >= pFoll->GetOfst() )
bRet = sal_False;
}
return bRet;
}
inline SwTwips SwTxtFrm::GetFtnFrmHeight() const
{
if( !IsFollow() && IsInFtn() && HasPara() )
return _GetFtnFrmHeight();
else
return 0;
}
inline const SwTxtFrm *SwTxtFrm::GetFollow() const
{
return (const SwTxtFrm*)SwCntntFrm::GetFollow();
}
inline SwTxtFrm *SwTxtFrm::GetFollow()
{
return (SwTxtFrm*)SwCntntFrm::GetFollow();
}
inline const SwTxtFrm *SwTxtFrm::GetFrmAtPos( const SwPosition &rPos) const
{
return ((SwTxtFrm*)this)->GetFrmAtPos( rPos );
}
inline void SwTxtFrm::AdjustFollow( SwTxtFormatter &rLine,
const xub_StrLen nOffset, const xub_StrLen nStrEnd, const sal_uInt8 nMode )
{
if ( HasFollow() )
_AdjustFollow( rLine, nOffset, nStrEnd, nMode );
}
inline void SwTxtFrm::SetOfst( const xub_StrLen nNewOfst )
{
if ( nOfst != nNewOfst )
_SetOfst( nNewOfst );
}
inline void SwTxtFrm::SetRepaint() const
{
((SwTxtFrm*)this)->bRepaint = sal_True;
}
inline void SwTxtFrm::ResetRepaint() const
{
((SwTxtFrm*)this)->bRepaint = sal_False;
}
inline void SwTxtFrm::SetBlinkPor() const
{
((SwTxtFrm*)this)->bBlinkPor = sal_True;
}
inline void SwTxtFrm::ResetBlinkPor() const
{
((SwTxtFrm*)this)->bBlinkPor = sal_False;
}
#ifdef LINGU_STATISTIK
class SwLinguStatistik
{
public:
long nWords; // gepruefte Worte
long nFlushCnt; // zaehlt die Messungen
long nWrong; // als falsch erkannt
long nAlter; // Alternativvorschlaege
long nSpellTime; // Zeitmessung
long nSynonym; // Thesaurus
long nNoSynonym; // Thesaurus ratlos
long nMeaning; // Thesaurus-Bedeutung
long nNoMeaning; // Thesaurus meinungslos
long nTheTime; // Zeitmessung
long nHyphens; // Trennstellen
long nNoHyph; // Worte ohne Trennstellen
long nHyphErr; // Fehler beim Trennen
long nHyphTime; // Zeitmessung
SpellCheck *pSpell;
LanguageType eLang;
void Flush();
inline SwLinguStatistik()
{ nWords = nWrong = nAlter = nSynonym = nNoSynonym =
nHyphens = nNoHyph = nHyphErr = nSpellTime = nTheTime =
nHyphTime = nFlushCnt = 0;
pSpell = NULL;
eLang = LANGUAGE_DONTKNOW; }
inline ~SwLinguStatistik(){ Flush(); }
};
// globale Variable, implementiert in txtfrm.cxx
extern SwLinguStatistik aSwLinguStat;
#define SW_LING(nWhich,nInc) (aSwLinguStat.nWhich) += nInc;
#endif
#define SWAP_IF_SWAPPED( pFrm )\
sal_Bool bUndoSwap = sal_False; \
if ( pFrm->IsVertical() && pFrm->IsSwapped() )\
{ \
bUndoSwap = sal_True; \
((SwTxtFrm*)pFrm)->SwapWidthAndHeight(); \
}
#define SWAP_IF_NOT_SWAPPED( pFrm )\
sal_Bool bUndoSwap = sal_False; \
if ( pFrm->IsVertical() && ! pFrm->IsSwapped() )\
{ \
bUndoSwap = sal_True; \
((SwTxtFrm*)pFrm)->SwapWidthAndHeight(); \
}
#define UNDO_SWAP( pFrm )\
if ( bUndoSwap )\
((SwTxtFrm*)pFrm)->SwapWidthAndHeight();
// Helper class which can be used instead of the macros if a function
// has too many returns
class SwFrmSwapper
{
const SwTxtFrm* pFrm;
sal_Bool bUndo;
public:
SwFrmSwapper( const SwTxtFrm* pFrm, sal_Bool bSwapIfNotSwapped );
~SwFrmSwapper();
};
class SwLayoutModeModifier
{
const OutputDevice& rOut;
long nOldLayoutMode;
public:
SwLayoutModeModifier( const OutputDevice& rOutp );
~SwLayoutModeModifier();
void Modify( sal_Bool bChgToRTL );
void SetAuto();
};
#endif