/************************************************************** * * 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" #include #include "viewsh.hxx" #include "rootfrm.hxx" // GetOleShell() #include "txtfrm.hxx" // FindRootFrm() #include "blink.hxx" #include "porlin.hxx" #include "porlay.hxx" // SwLineLayout // Sichtbare Zeit: #define BLINK_ON_TIME 2400L // Nihct sichtbare Zeit: #define BLINK_OFF_TIME 800L /************************************************************************* * pBlink zeigt auf die Instanz, bei der sich blinkende Portions anmelden * muessen, ggf. muss pBlink erst per new SwBlink angelegt werden. * Diese werden dann rhythmisch zum Repaint angeregt und koennen abfragen, * ob sie zur Zeit sichtbar oder unsichtbar sein sollen ( IsVisible() ). *************************************************************************/ SwBlink *pBlink = NULL; // Liste von blinkenden Portions SV_IMPL_OP_PTRARR_SORT( SwBlinkList, SwBlinkPortionPtr ) SwBlink::SwBlink() { bVisible = sal_True; // Den Timer vorbereiten aTimer.SetTimeout( BLINK_ON_TIME ); aTimer.SetTimeoutHdl( LINK(this, SwBlink, Blinker) ); } SwBlink::~SwBlink( ) { aTimer.Stop(); } /************************************************************************* * SwBlink::Blinker (Timerablauf): * Sichtbar/unsichtbar-Flag toggeln. * Repaint-Rechtecke der Blinkportions ermitteln und an ihren OleShells * invalidieren. *************************************************************************/ IMPL_LINK( SwBlink, Blinker, Timer *, EMPTYARG ) { bVisible = !bVisible; if( bVisible ) aTimer.SetTimeout( BLINK_ON_TIME ); else aTimer.SetTimeout( BLINK_OFF_TIME ); if( aList.Count() ) { for( MSHORT nPos = 0; nPos < aList.Count(); ) { const SwBlinkPortion* pTmp = aList[ nPos ]; if( pTmp->GetRootFrm() && ((SwRootFrm*)pTmp->GetRootFrm())->GetCurrShell() ) { ++nPos; Point aPos = pTmp->GetPos(); long nWidth, nHeight; switch ( pTmp->GetDirection() ) { case 900: aPos.X() -= pTmp->GetPortion()->GetAscent(); aPos.Y() -= pTmp->GetPortion()->Width(); nWidth = pTmp->GetPortion()->SvLSize().Height(); nHeight = pTmp->GetPortion()->SvLSize().Width(); break; case 1800: aPos.Y() -= pTmp->GetPortion()->Height() - pTmp->GetPortion()->GetAscent(); aPos.X() -= pTmp->GetPortion()->Width(); nWidth = pTmp->GetPortion()->SvLSize().Width(); nHeight = pTmp->GetPortion()->SvLSize().Height(); break; case 2700: aPos.X() -= pTmp->GetPortion()->Height() - pTmp->GetPortion()->GetAscent(); nWidth = pTmp->GetPortion()->SvLSize().Height(); nHeight = pTmp->GetPortion()->SvLSize().Width(); break; default: aPos.Y() -= pTmp->GetPortion()->GetAscent(); nWidth = pTmp->GetPortion()->SvLSize().Width(); nHeight = pTmp->GetPortion()->SvLSize().Height(); } Rectangle aRefresh( aPos, Size( nWidth, nHeight ) ); aRefresh.Right() += ( aRefresh.Bottom()- aRefresh.Top() ) / 8; ((SwRootFrm*)pTmp->GetRootFrm()) ->GetCurrShell()->InvalidateWindows( aRefresh ); } else // Portions ohne Shell koennen aus der Liste entfernt werden. aList.Remove( nPos ); } } else // Wenn die Liste leer ist, kann der Timer gestoppt werden. aTimer.Stop(); return sal_True; } void SwBlink::Insert( const Point& rPoint, const SwLinePortion* pPor, const SwTxtFrm *pTxtFrm, sal_uInt16 nDir ) { SwBlinkPortion *pBlinkPor = new SwBlinkPortion( pPor, nDir ); MSHORT nPos; if( aList.Seek_Entry( pBlinkPor, &nPos ) ) { aList[ nPos ]->SetPos( rPoint ); delete pBlinkPor; } else { pBlinkPor->SetPos( rPoint ); pBlinkPor->SetRootFrm( pTxtFrm->getRootFrm() ); aList.Insert( pBlinkPor ); pTxtFrm->SetBlinkPor(); if( pPor->IsLayPortion() || pPor->IsParaPortion() ) ((SwLineLayout*)pPor)->SetBlinking( sal_True ); if( !aTimer.IsActive() ) aTimer.Start(); } } void SwBlink::Replace( const SwLinePortion* pOld, const SwLinePortion* pNew ) { // setting direction to 0 because direction does not matter // for this operation SwBlinkPortion aBlink( pOld, 0 ); MSHORT nPos; if( aList.Seek_Entry( &aBlink, &nPos ) ) { SwBlinkPortion* pTmp = new SwBlinkPortion( aList[ nPos ], pNew ); aList.Remove( nPos ); aList.Insert( pTmp ); } } void SwBlink::Delete( const SwLinePortion* pPor ) { // setting direction to 0 because direction does not matter // for this operation SwBlinkPortion aBlink( pPor, 0 ); MSHORT nPos; if( aList.Seek_Entry( &aBlink, &nPos ) ) aList.Remove( nPos ); } void SwBlink::FrmDelete( const SwRootFrm* pRoot ) { for( MSHORT nPos = 0; nPos < aList.Count(); ) { if( pRoot == aList[ nPos ]->GetRootFrm() ) aList.Remove( nPos ); else ++nPos; } }