blob: e0feffdb115f9eff133c29dcc0e75ea648a8f044 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef _ITRTXT_HXX
#define _ITRTXT_HXX
#include "swtypes.hxx"
#include "itratr.hxx"
#include "inftxt.hxx"
class SwTxtFrm;
struct SwPosition;
struct SwCrsrMoveState;
class SwMarginPortion;
class SwFlyPortion;
/*************************************************************************
* class SwTxtIter
*************************************************************************/
class SwTxtIter : public SwAttrIter
{
protected:
SwLineInfo aLineInf;
SwTxtFrm *pFrm;
SwTxtInfo *pInf;
SwLineLayout *pCurr;
SwLineLayout *pPrev;
SwTwips nFrameStart;
SwTwips nY;
SwTwips nRegStart; // Anfangsposition (Y) des Registers
xub_StrLen nStart; // Start im Textstring, Ende = pCurr->GetLen()
KSHORT nRegDiff; // Zeilenabstand des Registers
MSHORT nLineNr; // Zeilennummer
sal_Bool bPrev : 1;
sal_Bool bRegisterOn : 1; // Registerhaltigkeit
sal_Bool bOneBlock : 1; // Blocksatz: Einzelwoerter austreiben
sal_Bool bLastBlock : 1; // Blocksatz: Auch die letzte Zeile
sal_Bool bLastCenter : 1; // Blocksatz: Letzte Zeile zentrieren
SwLineLayout *_GetPrev();
// Zuruecksetzen in die erste Zeile.
void Init();
void CtorInitTxtIter( SwTxtFrm *pFrm, SwTxtInfo *pInf );
inline SwTxtIter(SwTxtNode* pTxtNode) : SwAttrIter(pTxtNode) { }
public:
inline SwTxtIter( SwTxtFrm *pTxtFrm, SwTxtInfo *pTxtInf ) : SwAttrIter(pTxtFrm!=NULL?pTxtFrm->GetTxtNode():NULL)
{ CtorInitTxtIter( pTxtFrm, pTxtInf ); }
inline const SwLineLayout *GetCurr() const { return pCurr; } // niemals 0!
inline const SwLineLayout *GetNext() const { return pCurr->GetNext(); }
const SwLineLayout *GetPrev();
inline xub_StrLen GetLength() const { return pCurr->GetLen(); }
inline MSHORT GetLineNr() const { return nLineNr; }
inline xub_StrLen GetStart() const { return nStart; }
inline xub_StrLen GetEnd() const { return GetStart() + GetLength(); }
inline SwTwips Y() const { return nY; }
inline SwTwips RegStart() const { return nRegStart; }
inline KSHORT RegDiff() const { return nRegDiff; }
inline sal_Bool IsRegisterOn() const { return bRegisterOn; }
inline SwTxtInfo &GetInfo() { return *pInf; }
inline const SwTxtInfo &GetInfo() const { return *pInf; }
inline void Top() { Init(); }
void Bottom();
const SwLineLayout *Next();
const SwLineLayout *Prev();
// Ueberspringt die Dummyzeilen der FlyFrms
const SwLineLayout *NextLine();
const SwLineLayout *PrevLine();
const SwLineLayout *GetNextLine() const;
const SwLineLayout *GetPrevLine();
void CharToLine( const xub_StrLen );
const SwLineLayout *TwipsToLine(const SwTwips);
// schneidet ab pCurr alle ab.
void TruncLines( sal_Bool bNoteFollow = sal_False );
inline KSHORT GetLineHeight() const { return pCurr->GetRealHeight(); }
void CalcAscentAndHeight( KSHORT &rAscent, KSHORT &rHeight ) const;
// 5298, viel Aerger durch die Abfrage auf pCurr == pPara
inline sal_Bool IsFirstTxtLine() const
{ return nStart == GetInfo().GetTxtStart() &&
!( pCurr->IsDummy() && GetNextLine() ); }
// Als Ersatz fuer das alte IsFirstLine()
inline sal_Bool IsParaLine() const
{ return pCurr == pInf->GetParaPortion(); }
const SwLineInfo &GetLineInfo() const { return aLineInf; }
inline SwTwips GetFirstPos() const { return nFrameStart; }
inline sal_Bool SeekAndChg( SwTxtSizeInfo &rInf );
inline sal_Bool SeekAndChgBefore( SwTxtSizeInfo &rInf );
inline sal_Bool SeekStartAndChg( SwTxtSizeInfo &rInf, const sal_Bool bPara=sal_False );
inline SwTxtFrm *GetTxtFrm() { return pFrm; }
inline const SwTxtFrm *GetTxtFrm() const { return pFrm; }
// zaehlt aufeinanderfolgende Trennungen, um MaxHyphens einzuhalten
void CntHyphens( sal_uInt8 &nEndCnt, sal_uInt8 &nMidCnt) const;
};
/*************************************************************************
* class SwTxtMargin
*************************************************************************/
class SwTxtMargin : public SwTxtIter
{
private:
SwTwips nLeft;
SwTwips nRight;
SwTwips nFirst;
KSHORT nDropLeft;
KSHORT nDropHeight;
KSHORT nDropDescent;
MSHORT nDropLines;
MSHORT nAdjust;
// --> OD 2008-06-30 #i91133#
SwTwips mnTabLeft;
// <--
protected:
// fuer FormatQuoVadis
inline void Right( const SwTwips nNew ) { nRight = nNew; }
// fuer CalcFlyAdjust
inline void SetDropLeft( const KSHORT nNew ) { nDropLeft = nNew; }
void CtorInitTxtMargin( SwTxtFrm *pFrm, SwTxtSizeInfo *pInf );
inline SwTxtMargin(SwTxtNode* pTxtNode) : SwTxtIter(pTxtNode) { }
public:
inline SwTxtMargin( SwTxtFrm *pTxtFrm, SwTxtSizeInfo *pTxtSizeInf ) : SwTxtIter(pTxtFrm!=NULL?pTxtFrm->GetTxtNode():NULL)
{ CtorInitTxtMargin( pTxtFrm, pTxtSizeInf ); }
inline SwTwips GetLeftMargin() const;
inline SwTwips Left() const;
inline SwTwips Right() const { return nRight; }
inline SwTwips FirstLeft() const { return nFirst; }
inline SwTwips CurrWidth() const { return pCurr->PrtWidth(); }
SwTwips GetLineStart() const;
inline SwTwips GetLineEnd() const { return GetLineStart() + CurrWidth(); }
inline Point GetTopLeft() const { return Point( GetLineStart(), Y() ); }
inline sal_Bool IsOneBlock() const { return bOneBlock; }
inline sal_Bool IsLastBlock() const { return bLastBlock; }
inline sal_Bool IsLastCenter() const { return bLastCenter; }
inline MSHORT GetAdjust() const { return nAdjust; }
inline KSHORT GetLineWidth() const
{ return KSHORT( Right() - GetLeftMargin() + 1 ); }
inline SwTwips GetLeftMin() const { return nFirst < nLeft ? nFirst : nLeft; }
inline sal_Bool HasNegFirst() const { return nFirst < nLeft; }
// --> OD 2008-06-30 #i91133#
inline SwTwips GetTabLeft() const
{
return mnTabLeft;
}
// <--
// DropCaps
inline MSHORT GetDropLines() const { return nDropLines; }
inline void SetDropLines( const MSHORT nNew ) { nDropLines = nNew; }
inline KSHORT GetDropLeft() const { return nDropLeft; }
inline KSHORT GetDropHeight() const { return nDropHeight; }
inline void SetDropHeight( const KSHORT nNew ) { nDropHeight = nNew; }
inline KSHORT GetDropDescent() const { return nDropDescent; }
inline void SetDropDescent( const KSHORT nNew ) { nDropDescent = nNew; }
void DropInit();
// liefert TxtPos fuer Start und Ende der aktuellen Zeile ohne whitespaces
// In frminf.cxx implementiert.
xub_StrLen GetTxtStart() const;
xub_StrLen GetTxtEnd() const;
inline SwTxtSizeInfo &GetInfo()
{ return (SwTxtSizeInfo&)SwTxtIter::GetInfo(); }
inline const SwTxtSizeInfo &GetInfo() const
{ return (const SwTxtSizeInfo&)SwTxtIter::GetInfo(); }
};
/*************************************************************************
* class SwTxtAdjuster
*************************************************************************/
class SwTxtAdjuster : public SwTxtMargin
{
// Gleicht die Portions aus, wenn Adjustment und FlyFrms vorliegen.
void CalcFlyAdjust( SwLineLayout *pCurr );
// ruft SplitGlues und CalcBlockAdjust
void FormatBlock( );
// Erstellt bei kurzen Zeilen die Glue-Kette.
SwMarginPortion* CalcRightMargin( SwLineLayout *pCurr, SwTwips nReal = 0 );
// Berechnung des Adjustments (FlyPortions)
SwFlyPortion *CalcFlyPortion( const long nRealWidth,
const SwRect &rCurrRect );
protected:
inline SwTxtAdjuster(SwTxtNode* pTxtNode) : SwTxtMargin(pTxtNode) { }
// spannt beim Blocksatz die Glues auf.
void CalcNewBlock( SwLineLayout *pCurr, const SwLinePortion *pStopAt,
SwTwips nReal = 0, bool bSkipKashida = false );
SwTwips CalcKanaAdj( SwLineLayout *pCurr );
public:
inline SwTxtAdjuster( SwTxtFrm *pTxtFrm, SwTxtSizeInfo *pTxtSizeInf ) : SwTxtMargin(pTxtFrm!=NULL?pTxtFrm->GetTxtNode():NULL)
{ CtorInitTxtMargin( pTxtFrm, pTxtSizeInf ); }
// wird von SwTxtFormatter wegen UpdatePos ueberladen
void CalcAdjLine( SwLineLayout *pCurr );
// sorgt fuer das nachtraegliche adjustieren
inline void GetAdjusted() const
{
if( pCurr->IsFormatAdj() )
((SwTxtAdjuster*)this)->CalcAdjLine( pCurr );
}
// DropCaps-Extrawurst
void CalcDropAdjust();
void CalcDropRepaint();
};
/*************************************************************************
* class SwTxtCursor
*************************************************************************/
class SwTxtCursor : public SwTxtAdjuster
{
// A small helper-class to save SwTxtCursor member, manipulate them
// and to restore them
friend class SwTxtCursorSave;
// 1170: Mehrdeutigkeiten
static sal_Bool bRightMargin;
void _GetCharRect(SwRect *, const xub_StrLen, SwCrsrMoveState* );
protected:
void CtorInitTxtCursor( SwTxtFrm *pFrm, SwTxtSizeInfo *pInf );
inline SwTxtCursor(SwTxtNode* pTxtNode) : SwTxtAdjuster(pTxtNode) { }
public:
inline SwTxtCursor( SwTxtFrm *pTxtFrm, SwTxtSizeInfo *pTxtSizeInf ) : SwTxtAdjuster(pTxtFrm!=NULL?pTxtFrm->GetTxtNode():NULL)
{ CtorInitTxtCursor( pTxtFrm, pTxtSizeInf ); }
sal_Bool GetCharRect(SwRect *, const xub_StrLen, SwCrsrMoveState* = 0,
const long nMax = 0 );
sal_Bool GetEndCharRect(SwRect *, const xub_StrLen, SwCrsrMoveState* = 0,
const long nMax = 0 );
xub_StrLen GetCrsrOfst( SwPosition *pPos, const Point &rPoint,
const MSHORT nChgNode, SwCrsrMoveState* = 0 ) const;
// 1170: beruecksichtigt Mehrdeutigkeiten; Implementierung s.u.
const SwLineLayout *CharCrsrToLine( const xub_StrLen nPos );
// calculates baseline for portion rPor
// bAutoToCentered indicates, if AUTOMATIC mode means CENTERED or BASELINE
sal_uInt16 AdjustBaseLine( const SwLineLayout& rLine, const SwLinePortion* pPor,
sal_uInt16 nPorHeight = 0, sal_uInt16 nAscent = 0,
const sal_Bool bAutoToCentered = sal_False ) const;
static inline void SetRightMargin( const sal_Bool bNew ){ bRightMargin = bNew; }
static inline sal_Bool IsRightMargin() { return bRightMargin; }
};
/*************************************************************************
* SwHookOut
*
* Change current output device to printer, this has to be done before
* formatting.
*************************************************************************/
class SwHookOut
{
SwTxtSizeInfo* pInf;
OutputDevice* pOut;
sal_Bool bOnWin;
public:
SwHookOut( SwTxtSizeInfo& rInfo );
~SwHookOut();
};
/*************************************************************************
* Inline-Implementierungen
*************************************************************************/
inline sal_Bool SwTxtIter::SeekAndChg( SwTxtSizeInfo &rInf )
{
return SeekAndChgAttrIter( rInf.GetIdx(), rInf.GetOut() );
}
inline sal_Bool SwTxtIter::SeekAndChgBefore( SwTxtSizeInfo &rInf )
{
if ( rInf.GetIdx() )
return SeekAndChgAttrIter( rInf.GetIdx()-1, rInf.GetOut() );
else
return SeekAndChgAttrIter( rInf.GetIdx(), rInf.GetOut() );
}
inline sal_Bool SwTxtIter::SeekStartAndChg( SwTxtSizeInfo &rInf, const sal_Bool bPara )
{
return SeekStartAndChgAttrIter( rInf.GetOut(), bPara );
}
inline SwTwips SwTxtMargin::GetLeftMargin() const
{
return IsFirstTxtLine() ? nFirst : Left();
}
inline SwTwips SwTxtMargin::Left() const
{
return (nDropLines >= nLineNr && 1 != nLineNr) ? nFirst + nDropLeft : nLeft;
}
#endif