1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_sw.hxx" 26 27 28 #include <tools/debug.hxx> 29 #include "viewsh.hxx" 30 #include "rootfrm.hxx" // GetOleShell() 31 #include "txtfrm.hxx" // FindRootFrm() 32 #include "blink.hxx" 33 #include "porlin.hxx" 34 #include "porlay.hxx" // SwLineLayout 35 36 // Sichtbare Zeit: 37 #define BLINK_ON_TIME 2400L 38 // Nihct sichtbare Zeit: 39 #define BLINK_OFF_TIME 800L 40 41 /************************************************************************* 42 * pBlink zeigt auf die Instanz, bei der sich blinkende Portions anmelden 43 * muessen, ggf. muss pBlink erst per new SwBlink angelegt werden. 44 * Diese werden dann rhythmisch zum Repaint angeregt und koennen abfragen, 45 * ob sie zur Zeit sichtbar oder unsichtbar sein sollen ( IsVisible() ). 46 *************************************************************************/ 47 SwBlink *pBlink = NULL; 48 49 50 // Liste von blinkenden Portions 51 SV_IMPL_OP_PTRARR_SORT( SwBlinkList, SwBlinkPortionPtr ) 52 53 SwBlink::SwBlink() 54 { 55 bVisible = sal_True; 56 // Den Timer vorbereiten 57 aTimer.SetTimeout( BLINK_ON_TIME ); 58 aTimer.SetTimeoutHdl( LINK(this, SwBlink, Blinker) ); 59 } 60 61 SwBlink::~SwBlink( ) 62 { 63 aTimer.Stop(); 64 } 65 66 /************************************************************************* 67 * SwBlink::Blinker (Timerablauf): 68 * Sichtbar/unsichtbar-Flag toggeln. 69 * Repaint-Rechtecke der Blinkportions ermitteln und an ihren OleShells 70 * invalidieren. 71 *************************************************************************/ 72 73 IMPL_LINK( SwBlink, Blinker, Timer *, EMPTYARG ) 74 { 75 bVisible = !bVisible; 76 if( bVisible ) 77 aTimer.SetTimeout( BLINK_ON_TIME ); 78 else 79 aTimer.SetTimeout( BLINK_OFF_TIME ); 80 if( aList.Count() ) 81 { 82 83 for( MSHORT nPos = 0; nPos < aList.Count(); ) 84 { 85 const SwBlinkPortion* pTmp = aList[ nPos ]; 86 if( pTmp->GetRootFrm() && 87 ((SwRootFrm*)pTmp->GetRootFrm())->GetCurrShell() ) 88 { 89 ++nPos; 90 91 Point aPos = pTmp->GetPos(); 92 long nWidth, nHeight; 93 switch ( pTmp->GetDirection() ) 94 { 95 case 900: 96 aPos.X() -= pTmp->GetPortion()->GetAscent(); 97 aPos.Y() -= pTmp->GetPortion()->Width(); 98 nWidth = pTmp->GetPortion()->SvLSize().Height(); 99 nHeight = pTmp->GetPortion()->SvLSize().Width(); 100 break; 101 case 1800: 102 aPos.Y() -= pTmp->GetPortion()->Height() - 103 pTmp->GetPortion()->GetAscent(); 104 aPos.X() -= pTmp->GetPortion()->Width(); 105 nWidth = pTmp->GetPortion()->SvLSize().Width(); 106 nHeight = pTmp->GetPortion()->SvLSize().Height(); 107 break; 108 case 2700: 109 aPos.X() -= pTmp->GetPortion()->Height() - 110 pTmp->GetPortion()->GetAscent(); 111 nWidth = pTmp->GetPortion()->SvLSize().Height(); 112 nHeight = pTmp->GetPortion()->SvLSize().Width(); 113 break; 114 default: 115 aPos.Y() -= pTmp->GetPortion()->GetAscent(); 116 nWidth = pTmp->GetPortion()->SvLSize().Width(); 117 nHeight = pTmp->GetPortion()->SvLSize().Height(); 118 } 119 120 Rectangle aRefresh( aPos, Size( nWidth, nHeight ) ); 121 aRefresh.Right() += ( aRefresh.Bottom()- aRefresh.Top() ) / 8; 122 ((SwRootFrm*)pTmp->GetRootFrm()) 123 ->GetCurrShell()->InvalidateWindows( aRefresh ); 124 } 125 else // Portions ohne Shell koennen aus der Liste entfernt werden. 126 aList.Remove( nPos ); 127 } 128 } 129 else // Wenn die Liste leer ist, kann der Timer gestoppt werden. 130 aTimer.Stop(); 131 return sal_True; 132 } 133 134 void SwBlink::Insert( const Point& rPoint, const SwLinePortion* pPor, 135 const SwTxtFrm *pTxtFrm, sal_uInt16 nDir ) 136 { 137 SwBlinkPortion *pBlinkPor = new SwBlinkPortion( pPor, nDir ); 138 139 MSHORT nPos; 140 if( aList.Seek_Entry( pBlinkPor, &nPos ) ) 141 { 142 aList[ nPos ]->SetPos( rPoint ); 143 delete pBlinkPor; 144 } 145 else 146 { 147 pBlinkPor->SetPos( rPoint ); 148 pBlinkPor->SetRootFrm( pTxtFrm->getRootFrm() ); 149 aList.Insert( pBlinkPor ); 150 pTxtFrm->SetBlinkPor(); 151 if( pPor->IsLayPortion() || pPor->IsParaPortion() ) 152 ((SwLineLayout*)pPor)->SetBlinking( sal_True ); 153 154 if( !aTimer.IsActive() ) 155 aTimer.Start(); 156 } 157 } 158 159 void SwBlink::Replace( const SwLinePortion* pOld, const SwLinePortion* pNew ) 160 { 161 // setting direction to 0 because direction does not matter 162 // for this operation 163 SwBlinkPortion aBlink( pOld, 0 ); 164 MSHORT nPos; 165 if( aList.Seek_Entry( &aBlink, &nPos ) ) 166 { 167 SwBlinkPortion* pTmp = new SwBlinkPortion( aList[ nPos ], pNew ); 168 aList.Remove( nPos ); 169 aList.Insert( pTmp ); 170 } 171 } 172 173 void SwBlink::Delete( const SwLinePortion* pPor ) 174 { 175 // setting direction to 0 because direction does not matter 176 // for this operation 177 SwBlinkPortion aBlink( pPor, 0 ); 178 MSHORT nPos; 179 if( aList.Seek_Entry( &aBlink, &nPos ) ) 180 aList.Remove( nPos ); 181 } 182 183 void SwBlink::FrmDelete( const SwRootFrm* pRoot ) 184 { 185 for( MSHORT nPos = 0; nPos < aList.Count(); ) 186 { 187 if( pRoot == aList[ nPos ]->GetRootFrm() ) 188 aList.Remove( nPos ); 189 else 190 ++nPos; 191 } 192 } 193 194 195