diff options
author | Andreas Martens <ama@openoffice.org> | 2000-12-11 10:05:15 +0000 |
---|---|---|
committer | Andreas Martens <ama@openoffice.org> | 2000-12-11 10:05:15 +0000 |
commit | eced5faac874a15fc4f461f2b8b8a94fee3a2fc3 (patch) | |
tree | 5e5a784ef863bd78ec260cb6e8d7f7866c226737 /sw | |
parent | 0a63a8934d0d5ca51a4da619034264da147b8c7a (diff) |
#81704#: Selection/travelling in doubleline portions
Diffstat (limited to 'sw')
-rw-r--r-- | sw/source/core/text/inftxt.cxx | 38 | ||||
-rw-r--r-- | sw/source/core/text/inftxt.hxx | 10 | ||||
-rw-r--r-- | sw/source/core/text/itratr.cxx | 14 | ||||
-rw-r--r-- | sw/source/core/text/itratr.hxx | 20 | ||||
-rw-r--r-- | sw/source/core/text/pormulti.cxx | 66 | ||||
-rw-r--r-- | sw/source/core/text/pormulti.hxx | 15 | ||||
-rw-r--r-- | sw/source/core/text/redlnitr.cxx | 5 |
7 files changed, 118 insertions, 50 deletions
diff --git a/sw/source/core/text/inftxt.cxx b/sw/source/core/text/inftxt.cxx index c02238981946..adbfce2a6747 100644 --- a/sw/source/core/text/inftxt.cxx +++ b/sw/source/core/text/inftxt.cxx @@ -2,9 +2,9 @@ * * $RCSfile: inftxt.cxx,v $ * - * $Revision: 1.15 $ + * $Revision: 1.16 $ * - * last change: $Author: ama $ $Date: 2000-11-30 11:37:32 $ + * last change: $Author: ama $ $Date: 2000-12-11 11:00:17 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -166,6 +166,9 @@ #ifndef _FRMSH_HXX #include <frmsh.hxx> #endif +#ifndef _ITRATR_HXX +#include <itratr.hxx> +#endif using namespace ::com::sun::star; using namespace ::com::sun::star::linguistic2; @@ -1156,23 +1159,31 @@ SwTxtSlotLen::~SwTxtSlotLen() * SwFontSave::SwFontSave() *************************************************************************/ -SwFontSave::SwFontSave( const SwTxtSizeInfo &rInf, SwFont *pNewFnt ) - : pFnt( pNewFnt ? ((SwTxtSizeInfo&)rInf).GetFont() : 0 ) +SwFontSave::SwFontSave( const SwTxtSizeInfo &rInf, SwFont *pNew, + SwAttrIter* pItr ) + : pFnt( pNew ? ((SwTxtSizeInfo&)rInf).GetFont() : 0 ) { if( pFnt ) { pInf = &((SwTxtSizeInfo&)rInf); - if( pFnt->DifferentMagic( pNewFnt, pFnt->GetActual() ) || - pNewFnt->GetActual() != pFnt->GetActual() ) + if( pFnt->DifferentMagic( pNew, pFnt->GetActual() ) || + pNew->GetActual() != pFnt->GetActual() ) { - pNewFnt->SetTransparent( sal_True ); - pNewFnt->SetAlign( ALIGN_BASELINE ); - pInf->SetFont( pNewFnt ); + pNew->SetTransparent( sal_True ); + pNew->SetAlign( ALIGN_BASELINE ); + pInf->SetFont( pNew ); } else pFnt = 0; - pNewFnt->Invalidate(); - pNewFnt->ChgPhysFnt( pInf->GetVsh(), pInf->GetOut() ); + pNew->Invalidate(); + pNew->ChgPhysFnt( pInf->GetVsh(), pInf->GetOut() ); + if( pItr && pItr->GetFnt() == pFnt ) + { + pIter = pItr; + pIter->SetFnt( pNew ); + } + else + pIter = NULL; } } @@ -1187,6 +1198,11 @@ SwFontSave::~SwFontSave() // SwFont zurueckstellen pFnt->Invalidate(); pInf->SetFont( pFnt ); + if( pIter ) + { + pIter->SetFnt( pFnt ); + pIter->nPos = STRING_LEN; + } } } diff --git a/sw/source/core/text/inftxt.hxx b/sw/source/core/text/inftxt.hxx index 04ed62e4f629..c510c6d43078 100644 --- a/sw/source/core/text/inftxt.hxx +++ b/sw/source/core/text/inftxt.hxx @@ -2,9 +2,9 @@ * * $RCSfile: inftxt.hxx,v $ * - * $Revision: 1.11 $ + * $Revision: 1.12 $ * - * last change: $Author: ama $ $Date: 2000-11-30 15:13:45 $ + * last change: $Author: ama $ $Date: 2000-12-11 11:00:54 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -97,6 +97,7 @@ class SwTxtSizeInfo; class SwViewOption; class ViewShell; class SwTxtFtn; +class SwAttrIter; /* Minimum: Prozentwert fuers kernen */ #define MINKERNPERCENT 5 @@ -677,9 +678,10 @@ class SwFontSave { SwTxtSizeInfo *pInf; SwFont *pFnt; - SwFont *pNewFnt; + SwAttrIter *pIter; public: - SwFontSave( const SwTxtSizeInfo &rInf, SwFont *pFnt ); + SwFontSave( const SwTxtSizeInfo &rInf, SwFont *pFnt, + SwAttrIter* pItr = NULL ); ~SwFontSave(); }; diff --git a/sw/source/core/text/itratr.cxx b/sw/source/core/text/itratr.cxx index 1a1650743877..4280b59800e6 100644 --- a/sw/source/core/text/itratr.cxx +++ b/sw/source/core/text/itratr.cxx @@ -2,9 +2,9 @@ * * $RCSfile: itratr.cxx,v $ * - * $Revision: 1.5 $ + * $Revision: 1.6 $ * - * last change: $Author: ama $ $Date: 2000-11-30 11:41:22 $ + * last change: $Author: ama $ $Date: 2000-12-11 11:03:35 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -248,7 +248,7 @@ sal_Bool SwAttrIter::SeekAndChg( const xub_StrLen nNewPos, OutputDevice *pOut ) { // wenn der Aenderungszaehler auf Null ist, kennen wir die MagicNo // des gewuenschten Fonts ... - if ( !nChgCnt ) + if ( !nChgCnt && !nPropFont ) pFnt->SetMagic( aMagicNo[ pFnt->GetActual() ], aFntIdx[ pFnt->GetActual() ], pFnt->GetActual() ); pFnt->ChgPhysFnt( pShell, pOut ); @@ -259,7 +259,7 @@ sal_Bool SwAttrIter::SeekAndChg( const xub_StrLen nNewPos, OutputDevice *pOut ) sal_Bool SwAttrIter::IsSymbol( const xub_StrLen nNewPos ) { Seek( nNewPos ); - if ( !nChgCnt ) + if ( !nChgCnt && !nPropFont ) pFnt->SetMagic( aMagicNo[ pFnt->GetActual() ], aFntIdx[ pFnt->GetActual() ], pFnt->GetActual() ); return pFnt->IsSymbol( pShell ); @@ -308,6 +308,8 @@ sal_Bool SwAttrIter::SeekStartAndChg( OutputDevice *pOut, const sal_Bool bParaFo pFnt->GetTox() = 0; pFnt->GetRef() = 0; nStartIndex = nEndIndex = nPos = nChgCnt = 0; + if( nPropFont ) + pFnt->SetProportion( nPropFont ); if( pRedln ) { pRedln->Clear( pFnt ); @@ -342,7 +344,7 @@ sal_Bool SwAttrIter::SeekStartAndChg( OutputDevice *pOut, const sal_Bool bParaFo { // wenn der Aenderungszaehler auf Null ist, kennen wir die MagicNo // des gewuenschten Fonts ... - if ( !nChgCnt ) + if ( !nChgCnt && !nPropFont ) pFnt->SetMagic( aMagicNo[ pFnt->GetActual() ], aFntIdx[ pFnt->GetActual() ], pFnt->GetActual() ); pFnt->ChgPhysFnt( pShell, pOut ); @@ -411,6 +413,8 @@ sal_Bool SwAttrIter::Seek( const xub_StrLen nNewPos ) pFnt->SetFnt( pAttrSet ); pFnt->GetTox() = 0; pFnt->GetRef() = 0; + if( nPropFont ) + pFnt->SetProportion( nPropFont ); nStartIndex = nEndIndex = nPos = 0; nChgCnt = 0; } diff --git a/sw/source/core/text/itratr.hxx b/sw/source/core/text/itratr.hxx index 375ed557bf1e..ee653a10e6c1 100644 --- a/sw/source/core/text/itratr.hxx +++ b/sw/source/core/text/itratr.hxx @@ -2,9 +2,9 @@ * * $RCSfile: itratr.hxx,v $ * - * $Revision: 1.3 $ + * $Revision: 1.4 $ * - * last change: $Author: ama $ $Date: 2000-09-29 13:53:38 $ + * last change: $Author: ama $ $Date: 2000-12-11 11:04:00 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -87,6 +87,7 @@ class ViewShell; class SwAttrIter { + friend class SwFontSave; protected: ViewShell *pShell; SwFont *pFnt; @@ -102,23 +103,25 @@ private: SwRedlineItr *pRedln; xub_StrLen nStartIndex, nEndIndex, nPos; MSHORT nChgCnt; + BYTE nPropFont; void SeekFwd( const xub_StrLen nPos ); + inline SetFnt( SwFont* pNew ) { pFnt = pNew; } protected: void Chg( SwTxtAttr *pHt ); void Rst( SwTxtAttr *pHt ); void CtorInit( SwTxtNode& rTxtNode ); - inline SwAttrIter() : pFnt(0), pLastOut(0), nChgCnt(0), pShell(0), pRedln(0) - { aMagicNo[0] = aMagicNo[1] = aMagicNo[2] = 0; + inline SwAttrIter() : pFnt(0), pLastOut(0), nChgCnt(0), nPropFont(0), + pShell(0), pRedln(0) { aMagicNo[0] = aMagicNo[1] = aMagicNo[2] = 0; aFntIdx[0] = aFntIdx[1] = aFntIdx[2] = 0; } USHORT ScriptType( const xub_StrLen nPos ); public: // Konstruktor, Destruktor inline SwAttrIter( SwTxtNode& rTxtNode ) - : pFnt(0), pLastOut(0), nChgCnt(0), pRedln(0) - { aMagicNo[0] = aMagicNo[1] = aMagicNo[2] = 0; - aFntIdx[0] = aFntIdx[1] = aFntIdx[2] = 0; CtorInit( rTxtNode ); } + : pFnt(0), pLastOut(0), nChgCnt(0), nPropFont(0), pShell(0), pRedln(0) + { aMagicNo[0] = aMagicNo[1] = aMagicNo[2] = 0; + aFntIdx[0] = aFntIdx[1] = aFntIdx[2] = 0; CtorInit( rTxtNode ); } virtual ~SwAttrIter(); @@ -152,6 +155,9 @@ public: inline SwFont *GetFnt() { return pFnt; } inline const SwFont *GetFnt() const { return pFnt; } + + inline const BYTE GetPropFont() const { return nPropFont; } + inline void SetPropFont( const BYTE nNew ) { nPropFont = nNew; } #ifdef DEBUG void Dump( SvStream &rOS ) const; #endif diff --git a/sw/source/core/text/pormulti.cxx b/sw/source/core/text/pormulti.cxx index 7c709caa93f8..afc0f3ab8f33 100644 --- a/sw/source/core/text/pormulti.cxx +++ b/sw/source/core/text/pormulti.cxx @@ -2,9 +2,9 @@ * * $RCSfile: pormulti.cxx,v $ * - * $Revision: 1.13 $ + * $Revision: 1.14 $ * - * last change: $Author: ama $ $Date: 2000-12-01 12:55:48 $ + * last change: $Author: ama $ $Date: 2000-12-11 11:04:43 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -234,6 +234,9 @@ SwDoubleLinePortion::SwDoubleLinePortion( const SwTxtAttr& rAttr, xub_StrLen nEnd ) : SwMultiPortion( nEnd ), pBracket( new SwBracket() ) { SetDouble(); + + pBracket->nStart = *rAttr.GetStart(); + if( RES_CHRATR_TWO_LINES == rAttr.Which() ) { pBracket->cPre = rAttr.Get2Lines().GetStartBracket(); @@ -262,6 +265,11 @@ SwDoubleLinePortion::SwDoubleLinePortion( const SwTxtAttr& rAttr, pBracket->cPost = 0; } } + if( !pBracket->cPre && !pBracket->cPost ) + { + delete pBracket; + pBracket = 0; + } } @@ -306,13 +314,14 @@ void SwDoubleLinePortion::PaintBracket( SwTxtPaintInfo &rInf, * and fills it, if not both characters are 0x00. * --------------------------------------------------*/ -void SwDoubleLinePortion::SetBrackets( sal_Unicode cPre, sal_Unicode cPost ) +void SwDoubleLinePortion::SetBrackets( const SwDoubleLinePortion& rDouble ) { - if( cPre || cPost ) + if( rDouble.pBracket ) { pBracket = new SwBracket; - pBracket->cPre = cPre; - pBracket->cPost = cPost; + pBracket->cPre = rDouble.pBracket->cPre; + pBracket->cPost = rDouble.pBracket->cPost; + pBracket->nStart = rDouble.pBracket->nStart; } } @@ -927,19 +936,28 @@ void SwTxtPainter::PaintMultiPortion( const SwRect &rPaint, SwSpaceManipulator aManip( GetInfo(), rMulti ); SwFontSave *pFontSave; + SwFont* pTmpFnt; + if( rMulti.IsDouble() ) { - SwFont* pTmpFnt = new SwFont( *GetInfo().GetFont() ); - pTmpFnt->SetProportion( 50 ); - pFontSave = new SwFontSave( GetInfo(), pTmpFnt ); + pTmpFnt = new SwFont( *GetInfo().GetFont() ); + SetPropFont( 50 ); + pTmpFnt->SetProportion( GetPropFont() ); + pFontSave = new SwFontSave( GetInfo(), pTmpFnt, this ); } else + { pFontSave = NULL; + pTmpFnt = NULL; + } if( rMulti.HasBrackets() ) { + xub_StrLen nOldIdx = GetInfo().GetIdx(); + GetInfo().SetIdx(((SwDoubleLinePortion&)rMulti).GetBrackets()->nStart); SeekAndChg( GetInfo() ); ((SwDoubleLinePortion&)rMulti).PaintBracket( GetInfo(), 0, sal_True ); + GetInfo().SetIdx( nOldIdx ); } KSHORT nTmpX = GetInfo().X(); @@ -1004,8 +1022,8 @@ void SwTxtPainter::PaintMultiPortion( const SwRect &rPaint, pLay = pLay->GetNext(); pPor = pLay->GetFirstPortion(); bRest = pLay->IsRest(); - GetInfo().X( nTmpX ); aManip.SecondLine(); + GetInfo().X( nTmpX ); // We switch to the baseline of the next inner line GetInfo().Y( GetInfo().Y() + rMulti.GetRoot().Height() - rMulti.GetRoot().GetAscent() + pLay->GetAscent() ); @@ -1017,15 +1035,20 @@ void SwTxtPainter::PaintMultiPortion( const SwRect &rPaint, if( rMulti.HasBrackets() ) { + xub_StrLen nOldIdx = GetInfo().GetIdx(); + GetInfo().SetIdx(((SwDoubleLinePortion&)rMulti).GetBrackets()->nStart); SeekAndChg( GetInfo() ); GetInfo().X( nOldX ); ((SwDoubleLinePortion&)rMulti).PaintBracket( GetInfo(), aManip.GetSpaceAdd(), sal_False ); + GetInfo().SetIdx( nOldIdx ); } // Restore the saved values GetInfo().X( nOldX ); GetInfo().SetLen( nOldLen ); delete pFontSave; + delete pTmpFnt; + SetPropFont( 0 ); } /*-----------------13.10.00 16:46------------------- @@ -1062,20 +1085,28 @@ BOOL SwTxtFormatter::BuildMultiPortion( SwTxtFormatInfo &rInf, SwMultiPortion& rMulti ) { SwTwips nMaxWidth = rInf.Width(); + + if( rMulti.HasBrackets() ) + { + xub_StrLen nOldIdx = rInf.GetIdx(); + rInf.SetIdx( ((SwDoubleLinePortion&)rMulti).GetBrackets()->nStart ); + SeekAndChg( rInf ); + ((SwDoubleLinePortion&)rMulti).FormatBrackets( rInf, nMaxWidth ); + rInf.SetIdx( nOldIdx ); + } + SeekAndChg( rInf ); SwFontSave *pFontSave; if( rMulti.IsDouble() ) { SwFont* pTmpFnt = new SwFont( *rInf.GetFont() ); - pTmpFnt->SetProportion( 50 ); - pFontSave = new SwFontSave( rInf, pTmpFnt ); + SetPropFont( 50 ); + pTmpFnt->SetProportion( GetPropFont() ); + pFontSave = new SwFontSave( rInf, pTmpFnt, this ); } else pFontSave = NULL; - if( rMulti.HasBrackets() ) - ((SwDoubleLinePortion&)rMulti).FormatBrackets( rInf, nMaxWidth ); - SwTwips nTmpX = rInf.X(); pMulti = &rMulti; @@ -1273,9 +1304,11 @@ BOOL SwTxtFormatter::BuildMultiPortion( SwTxtFormatInfo &rInf, rInf.SetRest( pTmp ); } rInf.SetTxt( *pOldTxt ); + SeekAndChg( rInf ); delete pFirstRest; delete pSecondRest; delete pFontSave; + SetPropFont( 0 ); return bRet; } @@ -1428,8 +1461,10 @@ SwTxtCursorSave::SwTxtCursorSave( SwTxtCursor* pTxtCursor, pTxtCursor->Next() ) ; // nothing nWidth = pTxtCursor->pCurr->Width(); + nOldProp = pTxtCursor->GetPropFont(); if( pMulti->IsDouble() ) { + pTxtCursor->SetPropFont( 50 ); bSpaceChg = pMulti->ChgSpaceAdd( pTxtCursor->pCurr, nSpaceAdd ); if( nSpaceAdd > 0 && !pMulti->HasTabulator() ) pTxtCursor->pCurr->Width( nWidth + nSpaceAdd * @@ -1446,5 +1481,6 @@ SwTxtCursorSave::~SwTxtCursorSave() pTxtCrsr->pCurr->Width( nWidth ); pTxtCrsr->pCurr = pCurr; pTxtCrsr->nStart = nStart; + pTxtCrsr->SetPropFont( nOldProp ); } diff --git a/sw/source/core/text/pormulti.hxx b/sw/source/core/text/pormulti.hxx index 1462d28f7d9f..6fe24bcfdf27 100644 --- a/sw/source/core/text/pormulti.hxx +++ b/sw/source/core/text/pormulti.hxx @@ -2,9 +2,9 @@ * * $RCSfile: pormulti.hxx,v $ * - * $Revision: 1.7 $ + * $Revision: 1.8 $ * - * last change: $Author: ama $ $Date: 2000-11-14 11:38:37 $ + * last change: $Author: ama $ $Date: 2000-12-11 11:05:15 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -79,6 +79,7 @@ class SwTxtPaintInfo; struct SwBracket { + xub_StrLen nStart; // Start of text attribute determins the font KSHORT nAscent; // Ascent of the brackets KSHORT nHeight; // Height of them KSHORT nPreWidth; // Width of the opening bracket @@ -107,16 +108,18 @@ class SwMultiPortion : public SwLinePortion sal_Bool bTop :1; // Phonetic position sal_Bool bFormatted :1; // Already formatted sal_Bool bFollowFld :1; // Field follow inside + sal_Bool bRotation :1; // Rotation (horizontal <-> vertical) protected: SwMultiPortion( xub_StrLen nEnd ) : pFldRest( 0 ), bTab1( sal_False ), bTab2( sal_False ), bDouble( sal_False ), bRuby( sal_False ), - bFormatted( sal_False ), bFollowFld( sal_False ) + bFormatted( sal_False ), bFollowFld( sal_False ), bRotation( sal_False ) { SetWhichPor( POR_MULTI ); SetLen( nEnd ); } inline void SetDouble() { bDouble = sal_True; } inline void SetRuby() { bRuby = sal_True; } inline void SetTop( sal_Bool bNew ) { bTop = bNew; } inline void SetTab1( sal_Bool bNew ) { bTab1 = bNew; } inline void SetTab2( sal_Bool bNew ) { bTab2 = bNew; } + inline void SetRotation( sal_Bool bNew ) { bRotation = bNew; } inline sal_Bool GetTab1() const { return bTab1; } inline sal_Bool GetTab2() const { return bTab2; } public: @@ -144,6 +147,7 @@ public: inline sal_Bool ChgSpaceAdd( SwLineLayout* pCurr, short nSpaceAdd ); inline sal_Bool HasBrackets() const; + inline sal_Bool GetRotation() const { return bRotation; } OUTPUT_OPERATOR }; @@ -159,9 +163,7 @@ public: ~SwDoubleLinePortion(); inline SwBracket* GetBrackets() const { return pBracket; } - void SetBrackets( sal_Unicode cPre, sal_Unicode cPost ); - inline void SetBrackets( const SwDoubleLinePortion& rDouble ) - { SetBrackets( rDouble.pBracket->cPre, rDouble.pBracket->cPost ); } + void SetBrackets( const SwDoubleLinePortion& rDouble ); void PaintBracket( SwTxtPaintInfo& rInf, short nSpc, sal_Bool bOpen ) const; void FormatBrackets( SwTxtFormatInfo &rInf, SwTwips& nMaxWidth ); inline KSHORT PreWidth() const { return pBracket->nPreWidth; }; @@ -211,6 +213,7 @@ class SwTxtCursorSave SwLineLayout* pCurr; SwTwips nWidth; xub_StrLen nStart; + BYTE nOldProp; sal_Bool bSpaceChg; public: SwTxtCursorSave( SwTxtCursor* pTxtCursor, SwMultiPortion* pMulti, diff --git a/sw/source/core/text/redlnitr.cxx b/sw/source/core/text/redlnitr.cxx index 7358bb152b3a..d32ec53f95c7 100644 --- a/sw/source/core/text/redlnitr.cxx +++ b/sw/source/core/text/redlnitr.cxx @@ -2,9 +2,9 @@ * * $RCSfile: redlnitr.cxx,v $ * - * $Revision: 1.6 $ + * $Revision: 1.7 $ * - * last change: $Author: ama $ $Date: 2000-11-30 11:40:40 $ + * last change: $Author: ama $ $Date: 2000-12-11 11:02:57 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -218,6 +218,7 @@ void SwAttrIter::CtorInit( SwTxtNode& rTxtNode ) } nStartIndex = nEndIndex = nPos = nChgCnt = 0; + nPropFont = 0; SwDoc* pDoc = rTxtNode.GetDoc(); const SwExtTextInput* pExtInp = pDoc->GetExtTextInput( rTxtNode ); |