/************************************************************** * * 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. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sw.hxx" #ifndef _SVSTDARR_HXX #define _SVSTDARR_USHORTS #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef _COMCORE_HRC #include // ResId fuer Abfrage wenn zu Search & Replaces #endif #include #include #include #include #include #include extern void SwCalcPixStatics( OutputDevice *pOut ); //Damit beim ShowCrsr nicht immer wieder die gleiche Size teuer ermittelt //werden muss, hier statische Member, die beim Wechsel des MapModes // angepasst werden long SwSelPaintRects::nPixPtX = 0; long SwSelPaintRects::nPixPtY = 0; MapMode* SwSelPaintRects::pMapMode = 0; #ifdef SHOW_BOOKMARKS // #include // // class SwBookmarkRects : public SwSelPaintRects // { // virtual void Paint( const Rectangle& rRect ); // virtual void FillRects(); // // public: // SwBookmarkRects( const SwCrsrShell& rSh ) : SwSelPaintRects( rSh ) {} // }; // // void SwBookmarkRects::Paint( const Rectangle& rRect ) // { // Window* pWin = GetShell()->GetWin(); // // RasterOp eOld( pWin->GetRasterOp() ); // sal_Bool bLCol = pWin->IsLineColor(); // Color aLCol( pWin->GetLineColor() ); // sal_Bool bFCol = pWin->IsFillColor(); // Color aFCol( pWin->GetFillColor() ); // // pWin->SetRasterOp( ROP_XOR ); // Color aCol( RGB_COLORDATA( 0xF0, 0xC8, 0xF0 ) ^ COL_WHITE ); // pWin->SetFillColor( aCol ); // pWin->SetLineColor( aCol ); // // pWin->DrawRect( rRect ); // // if( bLCol ) pWin->SetLineColor( aLCol ); else pWin->SetLineColor(); // if( bFCol ) pWin->SetFillColor( aFCol ); else pWin->SetFillColor(); // pWin->SetRasterOp( eOld ); // } // // void SwBookmarkRects::FillRects() // { // SwRegionRects aReg( GetShell()->VisArea() ); // // const SwBookmarks& rBkmkTbl = GetShell()->getIDocumentMarkAccess()->getBookmarks(); // SwShellCrsr* pCrsr = 0; // for( sal_uInt16 n = 0; n < rBkmkTbl.Count(); ++n ) // { // const SwBookmark& rBkmk = *rBkmkTbl[ n ]; // if( rBkmk.IsBookMark() && rBkmk.GetOtherPos() ) // { // if( !pCrsr ) // { // pCrsr = new SwShellCrsr( *GetShell(), rBkmk.GetPos() ); // pCrsr->SetMark(); // } // else // *pCrsr->GetPoint() = rBkmk.GetPos(); // *pCrsr->GetMark() = *rBkmk.GetOtherPos(); // pCrsr->FillRects(); // for( sal_uInt16 i = 0; i < pCrsr->Count(); ++i ) // aReg -= (*pCrsr)[ i ]; // // pCrsr->Remove( 0, i ); // } // } // if( pCrsr ) delete pCrsr; // // aReg.Invert(); // SwRects::Insert( &aReg, 0 ); // } // // SwBookmarkRects* pBookMarkRects = 0; // // void ShowBookmarks( const SwCrsrShell* pSh, int nAction, const SwRect* pRect = 0 ) // { // if( !pBookMarkRects && pSh->getIDocumentMarkAccess()->getBookmarks().Count() ) // pBookMarkRects = new SwBookmarkRects( *pSh ); // // if( pBookMarkRects ) // { // switch( nAction ) // { // case 1: pBookMarkRects->Show(); break; // case 2: pBookMarkRects->Hide(); break; // case 3: pBookMarkRects->Invalidate( *pRect ); break; // } // // if( !pBookMarkRects->Count() ) // delete pBookMarkRects, pBookMarkRects = 0; // } // } // // #define SHOWBOOKMARKS1( nAct ) ShowBookmarks( GetShell(),nAct ); // #define SHOWBOOKMARKS2( nAct, pRect ) ShowBookmarks( GetShell(),nAct, pRect ); #else #define SHOWBOOKMARKS1( nAct ) #define SHOWBOOKMARKS2( nAct, pRect ) #endif #ifdef SHOW_REDLINES #include class SwRedlineRects : public SwSelPaintRects { sal_uInt16 nMode; sal_uInt16 nNm; virtual void Paint( const Rectangle& rRect ); virtual void FillRects(); public: SwRedlineRects( const SwCrsrShell& rSh, sal_uInt16 nName, sal_uInt16 n ) : SwSelPaintRects( rSh ), nMode( n ), nNm( nName ) {} }; void SwRedlineRects::Paint( const Rectangle& rRect ) { Window* pWin = GetShell()->GetWin(); RasterOp eOld( pWin->GetRasterOp() ); sal_Bool bLCol = pWin->IsLineColor(); Color aLCol( pWin->GetLineColor() ); sal_Bool bFCol = pWin->IsFillColor(); Color aFCol( pWin->GetFillColor() ); pWin->SetRasterOp( ROP_XOR ); Color aCol; sal_uInt8 nVal = 0xc8 - ( (nMode / 4) * 16 ); switch( nMode % 4 ) { case 0: aCol = RGB_COLORDATA( nVal, nVal, 0xFF ); break; case 1: aCol = RGB_COLORDATA( 0xFF, 0xc8, nVal ); break; case 2: aCol = RGB_COLORDATA( nVal, 0xFF, nVal ); break; case 3: aCol = RGB_COLORDATA( 0xFF, nVal, nVal ); break; } aCol = aCol.GetColor() ^ COL_WHITE; pWin->SetFillColor( aCol ); pWin->SetLineColor( aCol ); pWin->DrawRect( rRect ); if( bLCol ) pWin->SetLineColor( aLCol ); else pWin->SetLineColor(); if( bFCol ) pWin->SetFillColor( aFCol ); else pWin->SetFillColor(); pWin->SetRasterOp( eOld ); } void SwRedlineRects::FillRects() { SwRegionRects aReg( GetShell()->VisArea() ); const SwRedlineTbl& rTbl = GetShell()->GetDoc()->GetRedlineTbl(); SwShellCrsr* pCrsr = 0; for( sal_uInt16 n = 0; n < rTbl.Count(); ++n ) { const SwRedline& rRed = *rTbl[ n ]; if( rRed.HasMark() && (nMode % 4 ) == rRed.GetType() && nNm == rRed.GetAuthor() ) { if( !pCrsr ) { pCrsr = new SwShellCrsr( *GetShell(), *rRed.GetPoint() ); pCrsr->SetMark(); } else *pCrsr->GetPoint() = *rRed.GetPoint(); *pCrsr->GetMark() = *rRed.GetMark(); pCrsr->FillRects(); for( sal_uInt16 i = 0; i < pCrsr->Count(); ++i ) aReg -= (*pCrsr)[ i ]; pCrsr->Remove( 0, i ); } } if( pCrsr ) delete pCrsr; aReg.Invert(); SwRects::Insert( &aReg, 0 ); } SwRedlineRects* aRedlines[ 10 * 4 ]; static int bFirstCall = sal_True; void ShowRedlines( const SwCrsrShell* pSh, int nAction, const SwRect* pRect = 0 ) { if( bFirstCall ) { memset( aRedlines, 0, sizeof(aRedlines)); bFirstCall = sal_False; } const SwRedlineTbl& rTbl = pSh->GetDoc()->GetRedlineTbl(); const SwRedlineAuthorTbl& rAuthorTbl = pSh->GetDoc()->GetRedlineAuthorTbl(); for( sal_uInt16 n = 0; n < rAuthorTbl.Count(); ++n ) { for( int i = 0; i < 4; ++i ) { SwRedlineRects** ppRedRect = &aRedlines[ n * 4 + i ]; if( rTbl.Count() && !*ppRedRect ) *ppRedRect = new SwRedlineRects( *pSh, n, n * 4 + i ); if( *ppRedRect ) { switch( nAction ) { case 1: (*ppRedRect)->Show(); break; case 2: (*ppRedRect)->Hide(); break; case 3: (*ppRedRect)->Invalidate( *pRect ); break; } if( !(*ppRedRect)->Count() ) delete *ppRedRect, *ppRedRect = 0; } } } } #define SHOWREDLINES1( nAct ) ShowRedlines( GetShell(),nAct ); #define SHOWREDLINES2( nAct, pRect ) ShowRedlines( GetShell(),nAct, pRect ); #else #define SHOWREDLINES1( nAct ) #define SHOWREDLINES2( nAct, pRect ) #endif #ifdef JP_REDLINE if( GetDoc()->GetRedlineTbl().Count() ) { SwRedlineTbl& rRedlineTbl = (SwRedlineTbl&)GetDoc()->GetRedlineTbl(); for( sal_uInt16 i = 0; i < rRedlineTbl.Count(); ++i ) rRedlineTbl[ i ]->HideRects( *GetShell() ); } #endif // -------- Ab hier Klassen / Methoden fuer den nicht Text-Cursor ------ SwVisCrsr::SwVisCrsr( const SwCrsrShell * pCShell ) : pCrsrShell( pCShell ) { pCShell->GetWin()->SetCursor( &aTxtCrsr ); bIsVisible = aTxtCrsr.IsVisible(); bIsDragCrsr = sal_False; aTxtCrsr.SetWidth( 0 ); #ifdef SW_CRSR_TIMER bTimerOn = sal_True; SetTimeout( 50 ); // 50msec Verzoegerung #endif } SwVisCrsr::~SwVisCrsr() { #ifdef SW_CRSR_TIMER if( bTimerOn ) Stop(); // Timer stoppen #endif if( bIsVisible && aTxtCrsr.IsVisible() ) aTxtCrsr.Hide(); pCrsrShell->GetWin()->SetCursor( 0 ); } void SwVisCrsr::Show() { if( !bIsVisible ) { bIsVisible = sal_True; // muss ueberhaupt angezeigt werden ? if( pCrsrShell->VisArea().IsOver( pCrsrShell->aCharRect ) ) #ifdef SW_CRSR_TIMER { if( bTimerOn ) Start(); // Timer aufsetzen else { if( IsActive() ) Stop(); // Timer Stoppen _SetPosAndShow(); } } #else _SetPosAndShow(); #endif } } void SwVisCrsr::Hide() { if( bIsVisible ) { bIsVisible = sal_False; #ifdef SW_CRSR_TIMER if( IsActive() ) Stop(); // Timer Stoppen #endif if( aTxtCrsr.IsVisible() ) // sollten die Flags nicht gueltig sein? aTxtCrsr.Hide(); } } #ifdef SW_CRSR_TIMER void __EXPORT SwVisCrsr::Timeout() { ASSERT( !bIsDragCrsr, "Timer vorher abschalten" ); if( bIsVisible ) { if ( !pCrsrShell->GetWin() ) //SwFrmFmt::GetGraphic setzt das Win temp aus! Start(); else _SetPosAndShow(); } } sal_Bool SwCrsrShell::ChgCrsrTimerFlag( sal_Bool bTimerOn ) { return pVisCrsr->ChgTimerFlag( bTimerOn ); } sal_Bool SwVisCrsr::ChgTimerFlag( sal_Bool bFlag ) { bOld = bTimerOn; if( !bFlag && bIsVisible && IsActive() ) { Stop(); // Timer Stoppen _SetPosAndShow(); } bTimerOn = bFlag; return bOld; } #endif void SwVisCrsr::_SetPosAndShow() { SwRect aRect; long nTmpY = pCrsrShell->aCrsrHeight.Y(); if( 0 > nTmpY ) { nTmpY = -nTmpY; aTxtCrsr.SetOrientation( 900 ); aRect = SwRect( pCrsrShell->aCharRect.Pos(), Size( pCrsrShell->aCharRect.Height(), nTmpY ) ); aRect.Pos().X() += pCrsrShell->aCrsrHeight.X(); if( pCrsrShell->IsOverwriteCrsr() ) aRect.Pos().Y() += aRect.Width(); } else { aTxtCrsr.SetOrientation( 0 ); aRect = SwRect( pCrsrShell->aCharRect.Pos(), Size( pCrsrShell->aCharRect.Width(), nTmpY ) ); aRect.Pos().Y() += pCrsrShell->aCrsrHeight.X(); } // check if cursor should show the current cursor bidi level aTxtCrsr.SetDirection( CURSOR_DIRECTION_NONE ); const SwCursor* pTmpCrsr = pCrsrShell->_GetCrsr(); if ( pTmpCrsr && !pCrsrShell->IsOverwriteCrsr() ) { SwNode& rNode = pTmpCrsr->GetPoint()->nNode.GetNode(); if( rNode.IsTxtNode() ) { const SwTxtNode& rTNd = *rNode.GetTxtNode(); const SwFrm* pFrm = rTNd.getLayoutFrm( pCrsrShell->GetLayout(), 0, 0, sal_False ); if ( pFrm ) { const SwScriptInfo* pSI = ((SwTxtFrm*)pFrm)->GetScriptInfo(); // cursor level has to be shown if ( pSI && pSI->CountDirChg() > 1 ) { aTxtCrsr.SetDirection( ( pTmpCrsr->GetCrsrBidiLevel() % 2 ) ? CURSOR_DIRECTION_RTL : CURSOR_DIRECTION_LTR ); } if ( pFrm->IsRightToLeft() ) { const OutputDevice *pOut = pCrsrShell->GetOut(); if ( pOut ) { long nSize = pOut->GetSettings().GetStyleSettings().GetCursorSize(); Size aSize( nSize, nSize ); aSize = pOut->PixelToLogic( aSize ); aRect.Left( aRect.Left() - aSize.Width() ); } } } } } if( aRect.Height() ) { ::SwCalcPixStatics( pCrsrShell->GetOut() ); ::SwAlignRect( aRect, (ViewShell*)pCrsrShell ); } if( !pCrsrShell->IsOverwriteCrsr() || bIsDragCrsr || pCrsrShell->IsSelection() ) aRect.Width( 0 ); aTxtCrsr.SetSize( aRect.SSize() ); aTxtCrsr.SetPos( aRect.Pos() ); if ( !pCrsrShell->IsCrsrReadonly() || pCrsrShell->GetViewOptions()->IsSelectionInReadonly() ) { if ( pCrsrShell->GetDrawView() ) ((SwDrawView*)pCrsrShell->GetDrawView())->SetAnimationEnabled( !pCrsrShell->IsSelection() ); sal_uInt16 nStyle = bIsDragCrsr ? CURSOR_SHADOW : 0; if( nStyle != aTxtCrsr.GetStyle() ) { aTxtCrsr.SetStyle( nStyle ); aTxtCrsr.SetWindow( bIsDragCrsr ? pCrsrShell->GetWin() : 0 ); } aTxtCrsr.Show(); } } ////////////////////////////////////////////////////////////////////////////// SwSelPaintRects::SwSelPaintRects( const SwCrsrShell& rCSh ) : SwRects( 0 ) , pCShell( &rCSh ) , mpCursorOverlay( 0 ) , mbShowTxtInputFldOverlay( true ) , mpTxtInputFldOverlay( NULL ) { } SwSelPaintRects::~SwSelPaintRects() { Hide(); } void SwSelPaintRects::swapContent(SwSelPaintRects& rSwap) { SwRects aTempRects; aTempRects.Insert(this, 0); Remove(0, Count()); Insert(&rSwap, 0); rSwap.Remove(0, rSwap.Count()); rSwap.Insert(&aTempRects, 0); // #i75172# also swap mpCursorOverlay sdr::overlay::OverlayObject* pTempOverlay = getCursorOverlay(); setCursorOverlay(rSwap.getCursorOverlay()); rSwap.setCursorOverlay(pTempOverlay); const bool bTempShowTxtInputFldOverlay = mbShowTxtInputFldOverlay; mbShowTxtInputFldOverlay = rSwap.mbShowTxtInputFldOverlay; rSwap.mbShowTxtInputFldOverlay = bTempShowTxtInputFldOverlay; sw::overlay::OverlayRangesOutline* pTempTxtInputFldOverlay = mpTxtInputFldOverlay; mpTxtInputFldOverlay = rSwap.mpTxtInputFldOverlay; rSwap.mpTxtInputFldOverlay = pTempTxtInputFldOverlay; } void SwSelPaintRects::Hide() { if(mpCursorOverlay) { delete mpCursorOverlay; mpCursorOverlay = 0; } if ( mpTxtInputFldOverlay != NULL ) { delete mpTxtInputFldOverlay; mpTxtInputFldOverlay = NULL; } SwRects::Remove( 0, Count() ); } void SwSelPaintRects::Show() { SdrView* pView = (SdrView*)pCShell->GetDrawView(); if(pView && pView->PaintWindowCount()) { // reset rects SwRects::Remove( 0, SwRects::Count() ); FillRects(); // get new rects std::vector< basegfx::B2DRange > aNewRanges; for(sal_uInt16 a(0); a < Count(); a++) { const SwRect aNextRect((*this)[a]); const Rectangle aPntRect(aNextRect.SVRect()); aNewRanges.push_back(basegfx::B2DRange( aPntRect.Left(), aPntRect.Top(), aPntRect.Right() + 1, aPntRect.Bottom() + 1)); } if(mpCursorOverlay) { if(aNewRanges.size()) { static_cast< sdr::overlay::OverlaySelection* >(mpCursorOverlay)->setRanges(aNewRanges); } else { delete mpCursorOverlay; mpCursorOverlay = 0; } } else if(Count()) { SdrPaintWindow* pCandidate = pView->GetPaintWindow(0); sdr::overlay::OverlayManager* pTargetOverlay = pCandidate->GetOverlayManager(); if(pTargetOverlay) { // get the system's hilight color const SvtOptionsDrawinglayer aSvtOptionsDrawinglayer; const Color aHighlight(aSvtOptionsDrawinglayer.getHilightColor()); // create correct selection mpCursorOverlay = new sdr::overlay::OverlaySelection( sdr::overlay::OVERLAY_TRANSPARENT, aHighlight, aNewRanges, true); pTargetOverlay->add(*mpCursorOverlay); } } HighlightInputFld(); } } void SwSelPaintRects::HighlightInputFld() { std::vector< basegfx::B2DRange > aInputFldRanges; if ( mbShowTxtInputFldOverlay ) { SwTxtInputFld* pCurTxtInputFldAtCrsr = dynamic_cast(GetShell()->GetTxtFldAtPos( GetShell()->GetCrsr()->Start(), false )); if ( pCurTxtInputFldAtCrsr != NULL ) { SwTxtNode* pTxtNode = pCurTxtInputFldAtCrsr->GetpTxtNode(); ::boost::scoped_ptr pCrsrForInputTxtFld( new SwShellCrsr( *GetShell(), SwPosition( *pTxtNode, *(pCurTxtInputFldAtCrsr->GetStart()) ) ) ); pCrsrForInputTxtFld->SetMark(); pCrsrForInputTxtFld->GetMark()->nNode = *pTxtNode; pCrsrForInputTxtFld->GetMark()->nContent.Assign( pTxtNode, *(pCurTxtInputFldAtCrsr->End()) ); pCrsrForInputTxtFld->FillRects(); for( sal_uInt16 a(0); a < pCrsrForInputTxtFld->Count(); ++a ) { const SwRect aNextRect((*pCrsrForInputTxtFld)[a]); const Rectangle aPntRect(aNextRect.SVRect()); aInputFldRanges.push_back(basegfx::B2DRange( aPntRect.Left(), aPntRect.Top(), aPntRect.Right() + 1, aPntRect.Bottom() + 1)); } } } if ( aInputFldRanges.size() > 0 ) { if ( mpTxtInputFldOverlay != NULL ) { mpTxtInputFldOverlay->setRanges( aInputFldRanges ); } else { SdrView* pView = (SdrView*)GetShell()->GetDrawView(); SdrPaintWindow* pCandidate = pView->GetPaintWindow(0); sdr::overlay::OverlayManager* pTargetOverlay = pCandidate->GetOverlayManager(); if(pTargetOverlay) { // use system's hilight color with decreased luminance as highlight color const SvtOptionsDrawinglayer aSvtOptionsDrawinglayer; Color aHighlight(aSvtOptionsDrawinglayer.getHilightColor()); aHighlight.DecreaseLuminance( 128 ); mpTxtInputFldOverlay = new sw::overlay::OverlayRangesOutline( aHighlight, aInputFldRanges ); pTargetOverlay->add( *mpTxtInputFldOverlay ); } } } else { if ( mpTxtInputFldOverlay != NULL ) { delete mpTxtInputFldOverlay; mpTxtInputFldOverlay = NULL; } } } void SwSelPaintRects::Invalidate( const SwRect& rRect ) { sal_uInt16 nSz = Count(); if( !nSz ) return; SwRegionRects aReg( GetShell()->VisArea() ); aReg.Remove( 0, aReg.Count() ); aReg.Insert( this, 0 ); aReg -= rRect; SwRects::Remove( 0, nSz ); SwRects::Insert( &aReg, 0 ); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // Liegt die Selection rechts oder unten ausserhalb des sichtbaren // Bereiches, so ist diese nie auf eine Pixel rechts/unten aligned. // Das muss hier erkannt und ggf. das Rechteckt erweitert werden. // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if( GetShell()->bVisPortChgd && 0 != ( nSz = Count()) ) { SwSelPaintRects::Get1PixelInLogic( *GetShell() ); SwRect* pRect = (SwRect*)GetData(); for( ; nSz--; ++pRect ) { if( pRect->Right() == GetShell()->aOldRBPos.X() ) pRect->Right( pRect->Right() + nPixPtX ); if( pRect->Bottom() == GetShell()->aOldRBPos.Y() ) pRect->Bottom( pRect->Bottom() + nPixPtY ); } } } void SwSelPaintRects::Paint( const Rectangle& /*rRect*/ ) { // nothing to do with overlays } // check current MapMode of the shell and set possibly the static members. // Optional set the parameters pX, pY void SwSelPaintRects::Get1PixelInLogic( const ViewShell& rSh, long* pX, long* pY ) { const OutputDevice* pOut = rSh.GetWin(); if ( ! pOut ) pOut = rSh.GetOut(); const MapMode& rMM = pOut->GetMapMode(); if( pMapMode->GetMapUnit() != rMM.GetMapUnit() || pMapMode->GetScaleX() != rMM.GetScaleX() || pMapMode->GetScaleY() != rMM.GetScaleY() ) { *pMapMode = rMM; Size aTmp( 1, 1 ); aTmp = pOut->PixelToLogic( aTmp ); nPixPtX = aTmp.Width(); nPixPtY = aTmp.Height(); } if( pX ) *pX = nPixPtX; if( pY ) *pY = nPixPtY; } /* */ SwShellCrsr::SwShellCrsr( const SwCrsrShell& rCShell, const SwPosition &rPos ) : SwCursor(rPos,0,false) , SwSelPaintRects(rCShell) , pPt(SwPaM::GetPoint()) {} SwShellCrsr::SwShellCrsr( const SwCrsrShell& rCShell, const SwPosition &rPos, const Point& rPtPos, SwPaM* pRing ) : SwCursor(rPos, pRing, false) , SwSelPaintRects(rCShell) , aMkPt(rPtPos) , aPtPt(rPtPos) , pPt(SwPaM::GetPoint()) {} SwShellCrsr::SwShellCrsr( SwShellCrsr& rICrsr ) : SwCursor(rICrsr) , SwSelPaintRects(*rICrsr.GetShell()) , aMkPt(rICrsr.GetMkPos()) , aPtPt(rICrsr.GetPtPos()) , pPt(SwPaM::GetPoint()) {} SwShellCrsr::~SwShellCrsr() {} bool SwShellCrsr::IsReadOnlyAvailable() const { return GetShell()->IsReadOnlyAvailable(); } void SwShellCrsr::SetMark() { if( SwPaM::GetPoint() == pPt ) aMkPt = aPtPt; else aPtPt = aMkPt; SwPaM::SetMark(); } void SwShellCrsr::FillRects() { // die neuen Rechtecke berechnen if ( HasMark() && GetPoint()->nNode.GetNode().IsCntntNode() && GetPoint()->nNode.GetNode().GetCntntNode()->getLayoutFrm( GetShell()->GetLayout() ) && ( GetMark()->nNode == GetPoint()->nNode || ( GetMark()->nNode.GetNode().IsCntntNode() && GetMark()->nNode.GetNode().GetCntntNode()->getLayoutFrm( GetShell()->GetLayout() ) ) ) ) { GetShell()->GetLayout()->CalcFrmRects( *this ); } } void SwShellCrsr::Show() { SwShellCrsr * pTmp = this; do { pTmp->SwSelPaintRects::Show(); } while( this != ( pTmp = dynamic_cast(pTmp->GetNext()) ) ); SHOWBOOKMARKS1( 1 ) SHOWREDLINES1( 1 ) } // Dieses Rechteck wird neu gepaintet, also ist die SSelection in // dem Bereich ungueltig void SwShellCrsr::Invalidate( const SwRect& rRect ) { SwShellCrsr * pTmp = this; do { pTmp->SwSelPaintRects::Invalidate( rRect ); // --> FME 2005-08-18 #125102# // skip any non SwShellCrsr objects in the ring // (see:SwAutoFormat::DeleteSel() // <-- Ring* pTmpRing = pTmp; pTmp = 0; do { pTmpRing = pTmpRing->GetNext(); pTmp = dynamic_cast(pTmpRing); } while ( !pTmp ); } while( this != pTmp ); SHOWBOOKMARKS2( 3, &rRect ) SHOWREDLINES2( 3, &rRect ) } void SwShellCrsr::Hide() { SwShellCrsr * pTmp = this; do { pTmp->SwSelPaintRects::Hide(); } while( this != ( pTmp = dynamic_cast(pTmp->GetNext()) ) ); SHOWBOOKMARKS1( 2 ) SHOWREDLINES1( 2 ) } SwCursor* SwShellCrsr::Create( SwPaM* pRing ) const { return new SwShellCrsr( *GetShell(), *GetPoint(), GetPtPos(), pRing ); } short SwShellCrsr::MaxReplaceArived() { short nRet = RET_YES; Window* pDlg = LAYOUT_THIS_WINDOW (::GetSearchDialog()); if( pDlg ) { // alte Actions beenden; die Tabellen-Frames werden angelegt und // eine SSelection kann erzeugt werden SvUShorts aArr; sal_uInt16 nActCnt; ViewShell *pShell = const_cast< SwCrsrShell* >( GetShell() ), *pSh = pShell; do { for( nActCnt = 0; pSh->ActionPend(); ++nActCnt ) pSh->EndAction(); aArr.Insert( nActCnt, aArr.Count() ); } while( pShell != ( pSh = (ViewShell*)pSh->GetNext() ) ); { nRet = QueryBox( pDlg, SW_RES( MSG_COMCORE_ASKSEARCH )).Execute(); } for( sal_uInt16 n = 0; n < aArr.Count(); ++n ) { for( nActCnt = aArr[n]; nActCnt--; ) pSh->StartAction(); pSh = (ViewShell*)pSh->GetNext(); } //swmod 071107//swmod 071225 } else // ansonsten aus dem Basic, und dann auf RET_YES schalten nRet = RET_YES; return nRet; } void SwShellCrsr::SaveTblBoxCntnt( const SwPosition* pPos ) { ((SwCrsrShell*)GetShell())->SaveTblBoxCntnt( pPos ); } sal_Bool SwShellCrsr::UpDown( sal_Bool bUp, sal_uInt16 nCnt ) { return SwCursor::UpDown( bUp, nCnt, &GetPtPos(), GetShell()->GetUpDownX() ); } #ifdef DBG_UTIL // JP 05.03.98: zum Testen des UNO-Crsr Verhaltens hier die Implementierung // am sichtbaren Cursor sal_Bool SwShellCrsr::IsSelOvr( int eFlags ) { return SwCursor::IsSelOvr( eFlags ); } #endif // sal_True: an die Position kann der Cursor gesetzt werden sal_Bool SwShellCrsr::IsAtValidPos( sal_Bool bPoint ) const { if( GetShell() && ( GetShell()->IsAllProtect() || GetShell()->GetViewOptions()->IsReadonly() || ( GetShell()->Imp()->GetDrawView() && GetShell()->Imp()->GetDrawView()->GetMarkedObjectList().GetMarkCount() ))) return sal_True; return SwCursor::IsAtValidPos( bPoint ); } /* */ SwShellTableCrsr::SwShellTableCrsr( const SwCrsrShell& rCrsrSh, const SwPosition& rPos ) : SwCursor(rPos,0,false), SwShellCrsr(rCrsrSh, rPos), SwTableCursor(rPos) { } SwShellTableCrsr::SwShellTableCrsr( const SwCrsrShell& rCrsrSh, const SwPosition& rMkPos, const Point& rMkPt, const SwPosition& rPtPos, const Point& rPtPt ) : SwCursor(rPtPos,0,false), SwShellCrsr(rCrsrSh, rPtPos), SwTableCursor(rPtPos) { SetMark(); *GetMark() = rMkPos; GetMkPos() = rMkPt; GetPtPos() = rPtPt; } SwShellTableCrsr::~SwShellTableCrsr() {} void SwShellTableCrsr::SetMark() { SwShellCrsr::SetMark(); } SwCursor* SwShellTableCrsr::Create( SwPaM* pRing ) const { return SwShellCrsr::Create( pRing ); } short SwShellTableCrsr::MaxReplaceArived() { return SwShellCrsr::MaxReplaceArived(); } void SwShellTableCrsr::SaveTblBoxCntnt( const SwPosition* pPos ) { SwShellCrsr::SaveTblBoxCntnt( pPos ); } void SwShellTableCrsr::FillRects() { // die neuen Rechtecke berechnen // JP 16.01.98: wenn der Cursor noch "geparkt" ist nichts machen!! if( !aSelBoxes.Count() || bParked || !GetPoint()->nNode.GetIndex() ) return; SwRegionRects aReg( GetShell()->VisArea() ); SwNodes& rNds = GetDoc()->GetNodes(); for( sal_uInt16 n = 0; n < aSelBoxes.Count(); ++n ) { const SwStartNode* pSttNd = (*(aSelBoxes.GetData() + n ))->GetSttNd(); const SwTableNode* pSelTblNd = pSttNd->FindTableNode(); SwNodeIndex aIdx( *pSttNd ); SwCntntNode* pCNd = rNds.GoNextSection( &aIdx, sal_True, sal_False ); // TABLE IN TABLE // (see also lcl_FindTopLevelTable in unoobj2.cxx for a different // version to do this) const SwTableNode* pCurTblNd = pCNd->FindTableNode(); while ( pSelTblNd != pCurTblNd && pCurTblNd ) { aIdx = pCurTblNd->EndOfSectionIndex(); pCNd = rNds.GoNextSection( &aIdx, sal_True, sal_False ); pCurTblNd = pCNd->FindTableNode(); } if( !pCNd ) continue; SwFrm* pFrm = pCNd->getLayoutFrm( GetShell()->GetLayout(), &GetSttPos() ); while( pFrm && !pFrm->IsCellFrm() ) pFrm = pFrm->GetUpper(); ASSERT( pFrm, "Node nicht in einer Tabelle" ); while ( pFrm ) { if( pFrm && aReg.GetOrigin().IsOver( pFrm->Frm() ) ) aReg -= pFrm->Frm(); pFrm = pFrm->GetNextCellLeaf( MAKEPAGE_NONE ); } } aReg.Invert(); Insert( &aReg, 0 ); } // Pruefe, ob sich der SPoint innerhalb der Tabellen-SSelection befindet sal_Bool SwShellTableCrsr::IsInside( const Point& rPt ) const { // die neuen Rechtecke berechnen // JP 16.01.98: wenn der Cursor noch "geparkt" ist nichts machen!! if( !aSelBoxes.Count() || bParked || !GetPoint()->nNode.GetIndex() ) return sal_False; SwNodes& rNds = GetDoc()->GetNodes(); for( sal_uInt16 n = 0; n < aSelBoxes.Count(); ++n ) { SwNodeIndex aIdx( *(*(aSelBoxes.GetData() + n ))->GetSttNd() ); SwCntntNode* pCNd = rNds.GoNextSection( &aIdx, sal_True, sal_False ); if( !pCNd ) continue; SwFrm* pFrm = pCNd->getLayoutFrm( GetShell()->GetLayout(), &GetPtPos() ); while( pFrm && !pFrm->IsCellFrm() ) pFrm = pFrm->GetUpper(); ASSERT( pFrm, "Node nicht in einer Tabelle" ); if( pFrm && pFrm->Frm().IsInside( rPt ) ) return sal_True; } return sal_False; } #ifdef DBG_UTIL // JP 05.03.98: zum Testen des UNO-Crsr Verhaltens hier die Implementierung // am sichtbaren Cursor sal_Bool SwShellTableCrsr::IsSelOvr( int eFlags ) { return SwShellCrsr::IsSelOvr( eFlags ); } #endif sal_Bool SwShellTableCrsr::IsAtValidPos( sal_Bool bPoint ) const { return SwShellCrsr::IsAtValidPos( bPoint ); }