xref: /aoo41x/main/sw/source/core/crsr/viscrs.cxx (revision cf4248c2)
1efeef26fSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3efeef26fSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4efeef26fSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5efeef26fSAndrew Rist  * distributed with this work for additional information
6efeef26fSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7efeef26fSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8efeef26fSAndrew Rist  * "License"); you may not use this file except in compliance
9efeef26fSAndrew Rist  * with the License.  You may obtain a copy of the License at
10efeef26fSAndrew Rist  *
11efeef26fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12efeef26fSAndrew Rist  *
13efeef26fSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14efeef26fSAndrew Rist  * software distributed under the License is distributed on an
15efeef26fSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16efeef26fSAndrew Rist  * KIND, either express or implied.  See the License for the
17efeef26fSAndrew Rist  * specific language governing permissions and limitations
18efeef26fSAndrew Rist  * under the License.
19efeef26fSAndrew Rist  *
20efeef26fSAndrew Rist  *************************************************************/
21efeef26fSAndrew Rist 
22efeef26fSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sw.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir 
28cdf0e10cSrcweir #ifndef _SVSTDARR_HXX
29cdf0e10cSrcweir #define _SVSTDARR_USHORTS
30cdf0e10cSrcweir #include <svl/svstdarr.hxx>
31cdf0e10cSrcweir #endif
32cdf0e10cSrcweir 
33cdf0e10cSrcweir #include <vcl/dialog.hxx>
34cdf0e10cSrcweir #include <vcl/msgbox.hxx>
35cdf0e10cSrcweir #include <vcl/wrkwin.hxx>
36cdf0e10cSrcweir #include <viewopt.hxx>
37cdf0e10cSrcweir #include <frmtool.hxx>
38cdf0e10cSrcweir #include <viscrs.hxx>
39cdf0e10cSrcweir #include <crsrsh.hxx>
40cdf0e10cSrcweir #include <doc.hxx>
41cdf0e10cSrcweir #include <swtable.hxx>
42cdf0e10cSrcweir #include <viewimp.hxx>
43cdf0e10cSrcweir #include <dview.hxx>
44cdf0e10cSrcweir #include <rootfrm.hxx>
4569a74367SOliver-Rainer Wittmann #include <txtfrm.hxx>
46cdf0e10cSrcweir #include <docary.hxx>
47cdf0e10cSrcweir #include <extinput.hxx>
48cdf0e10cSrcweir #include <ndtxt.hxx>
4969a74367SOliver-Rainer Wittmann #include <txtfld.hxx>
50cdf0e10cSrcweir #include <scriptinfo.hxx>
5169a74367SOliver-Rainer Wittmann #include <mdiexp.hxx>
52cdf0e10cSrcweir #ifndef _COMCORE_HRC
53cdf0e10cSrcweir #include <comcore.hrc>			// ResId fuer Abfrage wenn zu Search & Replaces
54cdf0e10cSrcweir #endif
55cdf0e10cSrcweir 
56cdf0e10cSrcweir #include <svx/sdr/overlay/overlaymanager.hxx>
57cdf0e10cSrcweir #include <svx/sdrpaintwindow.hxx>
58cdf0e10cSrcweir #include <vcl/svapp.hxx>
59cdf0e10cSrcweir #include <svx/sdr/overlay/overlayselection.hxx>
6069a74367SOliver-Rainer Wittmann #include <overlayrangesoutline.hxx>
6169a74367SOliver-Rainer Wittmann 
6269a74367SOliver-Rainer Wittmann #include <boost/scoped_ptr.hpp>
63cdf0e10cSrcweir 
64cdf0e10cSrcweir extern void SwCalcPixStatics( OutputDevice *pOut );
65cdf0e10cSrcweir 
66cdf0e10cSrcweir //Damit beim ShowCrsr nicht immer wieder die gleiche Size teuer ermittelt
67cdf0e10cSrcweir //werden muss, hier statische Member, die beim Wechsel des MapModes
68cdf0e10cSrcweir // angepasst werden
69cdf0e10cSrcweir 
70cdf0e10cSrcweir long SwSelPaintRects::nPixPtX = 0;
71cdf0e10cSrcweir long SwSelPaintRects::nPixPtY = 0;
72cdf0e10cSrcweir MapMode* SwSelPaintRects::pMapMode = 0;
73cdf0e10cSrcweir 
74cdf0e10cSrcweir 
75cdf0e10cSrcweir #ifdef SHOW_BOOKMARKS
76cdf0e10cSrcweir // #include <IMark.hxx>
77cdf0e10cSrcweir //
78cdf0e10cSrcweir // class SwBookmarkRects : public SwSelPaintRects
79cdf0e10cSrcweir // {
80cdf0e10cSrcweir // 	virtual void Paint( const Rectangle& rRect );
81cdf0e10cSrcweir // 	virtual void FillRects();
82cdf0e10cSrcweir //
83cdf0e10cSrcweir // public:
84cdf0e10cSrcweir // 	SwBookmarkRects( const SwCrsrShell& rSh ) : SwSelPaintRects( rSh ) {}
85cdf0e10cSrcweir // };
86cdf0e10cSrcweir //
87cdf0e10cSrcweir // void SwBookmarkRects::Paint( const Rectangle& rRect )
88cdf0e10cSrcweir // {
89cdf0e10cSrcweir // 	Window* pWin = GetShell()->GetWin();
90cdf0e10cSrcweir //
91cdf0e10cSrcweir // 	RasterOp eOld( pWin->GetRasterOp() );
92cdf0e10cSrcweir // 	sal_Bool bLCol = pWin->IsLineColor();
93cdf0e10cSrcweir // 	Color aLCol( pWin->GetLineColor() );
94cdf0e10cSrcweir // 	sal_Bool bFCol = pWin->IsFillColor();
95cdf0e10cSrcweir // 	Color aFCol( pWin->GetFillColor() );
96cdf0e10cSrcweir //
97cdf0e10cSrcweir // 	pWin->SetRasterOp( ROP_XOR );
98cdf0e10cSrcweir // 	Color aCol( RGB_COLORDATA( 0xF0, 0xC8, 0xF0 ) ^ COL_WHITE );
99cdf0e10cSrcweir // 	pWin->SetFillColor( aCol );
100cdf0e10cSrcweir // 	pWin->SetLineColor( aCol );
101cdf0e10cSrcweir //
102cdf0e10cSrcweir // 	pWin->DrawRect( rRect );
103cdf0e10cSrcweir //
104cdf0e10cSrcweir // 	if( bLCol ) pWin->SetLineColor( aLCol ); else pWin->SetLineColor();
105cdf0e10cSrcweir // 	if( bFCol ) pWin->SetFillColor( aFCol ); else pWin->SetFillColor();
106cdf0e10cSrcweir // 	pWin->SetRasterOp( eOld );
107cdf0e10cSrcweir // }
108cdf0e10cSrcweir //
109cdf0e10cSrcweir // void SwBookmarkRects::FillRects()
110cdf0e10cSrcweir // {
111cdf0e10cSrcweir // 	SwRegionRects aReg( GetShell()->VisArea() );
112cdf0e10cSrcweir //
113cdf0e10cSrcweir //     const SwBookmarks& rBkmkTbl = GetShell()->getIDocumentMarkAccess()->getBookmarks();
114cdf0e10cSrcweir // 	SwShellCrsr* pCrsr = 0;
115cdf0e10cSrcweir // 	for( sal_uInt16 n = 0; n < rBkmkTbl.Count(); ++n )
116cdf0e10cSrcweir // 	{
117cdf0e10cSrcweir // 		const SwBookmark& rBkmk = *rBkmkTbl[ n ];
118cdf0e10cSrcweir // 		if( rBkmk.IsBookMark() && rBkmk.GetOtherPos() )
119cdf0e10cSrcweir // 		{
120cdf0e10cSrcweir // 			if( !pCrsr )
121cdf0e10cSrcweir // 			{
122cdf0e10cSrcweir // 				pCrsr = new SwShellCrsr( *GetShell(), rBkmk.GetPos() );
123cdf0e10cSrcweir // 				pCrsr->SetMark();
124cdf0e10cSrcweir // 			}
125cdf0e10cSrcweir // 			else
126cdf0e10cSrcweir // 				*pCrsr->GetPoint() = rBkmk.GetPos();
127cdf0e10cSrcweir // 			*pCrsr->GetMark() = *rBkmk.GetOtherPos();
128cdf0e10cSrcweir // 			pCrsr->FillRects();
129cdf0e10cSrcweir // 			for( sal_uInt16 i = 0; i < pCrsr->Count(); ++i )
130cdf0e10cSrcweir // 				aReg -= (*pCrsr)[ i ];
131cdf0e10cSrcweir //
132cdf0e10cSrcweir // 			pCrsr->Remove( 0, i );
133cdf0e10cSrcweir // 		}
134cdf0e10cSrcweir // 	}
135cdf0e10cSrcweir // 	if( pCrsr ) delete pCrsr;
136cdf0e10cSrcweir //
137cdf0e10cSrcweir // 	aReg.Invert();
138cdf0e10cSrcweir // 	SwRects::Insert( &aReg, 0 );
139cdf0e10cSrcweir // }
140cdf0e10cSrcweir //
141cdf0e10cSrcweir // SwBookmarkRects* pBookMarkRects = 0;
142cdf0e10cSrcweir //
143cdf0e10cSrcweir // void ShowBookmarks( const SwCrsrShell* pSh, int nAction, const SwRect* pRect = 0 )
144cdf0e10cSrcweir // {
145cdf0e10cSrcweir //     if( !pBookMarkRects && pSh->getIDocumentMarkAccess()->getBookmarks().Count() )
146cdf0e10cSrcweir // 		pBookMarkRects = new SwBookmarkRects( *pSh );
147cdf0e10cSrcweir //
148cdf0e10cSrcweir // 	if( pBookMarkRects )
149cdf0e10cSrcweir // 	{
150cdf0e10cSrcweir // 		switch( nAction )
151cdf0e10cSrcweir // 		{
152cdf0e10cSrcweir // 		case 1: pBookMarkRects->Show(); break;
153cdf0e10cSrcweir // 		case 2:	pBookMarkRects->Hide(); break;
154cdf0e10cSrcweir // 		case 3: pBookMarkRects->Invalidate( *pRect ); break;
155cdf0e10cSrcweir // 		}
156cdf0e10cSrcweir //
157cdf0e10cSrcweir // 		if( !pBookMarkRects->Count() )
158cdf0e10cSrcweir // 			delete pBookMarkRects, pBookMarkRects = 0;
159cdf0e10cSrcweir // 	}
160cdf0e10cSrcweir // }
161cdf0e10cSrcweir //
162cdf0e10cSrcweir // #define SHOWBOOKMARKS1( nAct )			ShowBookmarks( GetShell(),nAct );
163cdf0e10cSrcweir // #define SHOWBOOKMARKS2( nAct, pRect )	ShowBookmarks( GetShell(),nAct, pRect );
164cdf0e10cSrcweir 
165cdf0e10cSrcweir #else
166cdf0e10cSrcweir 
167cdf0e10cSrcweir #define SHOWBOOKMARKS1( nAct )
168cdf0e10cSrcweir #define SHOWBOOKMARKS2( nAct, pRect )
169cdf0e10cSrcweir 
170cdf0e10cSrcweir #endif
171cdf0e10cSrcweir 
172cdf0e10cSrcweir #ifdef SHOW_REDLINES
173cdf0e10cSrcweir #include <redline.hxx>
174cdf0e10cSrcweir 
175cdf0e10cSrcweir class SwRedlineRects : public SwSelPaintRects
176cdf0e10cSrcweir {
177cdf0e10cSrcweir 	sal_uInt16 nMode;
178cdf0e10cSrcweir 	sal_uInt16 nNm;
179cdf0e10cSrcweir 
180cdf0e10cSrcweir 	virtual void Paint( const Rectangle& rRect );
181cdf0e10cSrcweir 	virtual void FillRects();
182cdf0e10cSrcweir 
183cdf0e10cSrcweir public:
SwRedlineRects(const SwCrsrShell & rSh,sal_uInt16 nName,sal_uInt16 n)184cdf0e10cSrcweir 	SwRedlineRects( const SwCrsrShell& rSh, sal_uInt16 nName, sal_uInt16 n )
185cdf0e10cSrcweir 		: SwSelPaintRects( rSh ), nMode( n ), nNm( nName )
186cdf0e10cSrcweir 	{}
187cdf0e10cSrcweir };
188cdf0e10cSrcweir 
Paint(const Rectangle & rRect)189cdf0e10cSrcweir void SwRedlineRects::Paint( const Rectangle& rRect )
190cdf0e10cSrcweir {
191cdf0e10cSrcweir 	Window* pWin = GetShell()->GetWin();
192cdf0e10cSrcweir 
193cdf0e10cSrcweir 	RasterOp eOld( pWin->GetRasterOp() );
194cdf0e10cSrcweir 	sal_Bool bLCol = pWin->IsLineColor();
195cdf0e10cSrcweir 	Color aLCol( pWin->GetLineColor() );
196cdf0e10cSrcweir 	sal_Bool bFCol = pWin->IsFillColor();
197cdf0e10cSrcweir 	Color aFCol( pWin->GetFillColor() );
198cdf0e10cSrcweir 
199cdf0e10cSrcweir 	pWin->SetRasterOp( ROP_XOR );
200cdf0e10cSrcweir 	Color aCol;
201cdf0e10cSrcweir 
202cdf0e10cSrcweir 	sal_uInt8 nVal = 0xc8 - ( (nMode / 4) * 16 );
203cdf0e10cSrcweir 	switch( nMode % 4 )
204cdf0e10cSrcweir 	{
205cdf0e10cSrcweir 	case 0: aCol = RGB_COLORDATA( nVal, nVal, 0xFF );	break;
206cdf0e10cSrcweir 	case 1: aCol = RGB_COLORDATA( 0xFF, 0xc8, nVal );	break;
207cdf0e10cSrcweir 	case 2: aCol = RGB_COLORDATA( nVal, 0xFF, nVal );	break;
208cdf0e10cSrcweir 	case 3: aCol = RGB_COLORDATA( 0xFF, nVal, nVal );	break;
209cdf0e10cSrcweir 	}
210cdf0e10cSrcweir 	aCol = aCol.GetColor() ^ COL_WHITE;
211cdf0e10cSrcweir 
212cdf0e10cSrcweir 	pWin->SetFillColor( aCol );
213cdf0e10cSrcweir 	pWin->SetLineColor( aCol );
214cdf0e10cSrcweir 
215cdf0e10cSrcweir 	pWin->DrawRect( rRect );
216cdf0e10cSrcweir 
217cdf0e10cSrcweir 	if( bLCol ) pWin->SetLineColor( aLCol ); else pWin->SetLineColor();
218cdf0e10cSrcweir 	if( bFCol ) pWin->SetFillColor( aFCol ); else pWin->SetFillColor();
219cdf0e10cSrcweir 	pWin->SetRasterOp( eOld );
220cdf0e10cSrcweir }
221cdf0e10cSrcweir 
FillRects()222cdf0e10cSrcweir void SwRedlineRects::FillRects()
223cdf0e10cSrcweir {
224cdf0e10cSrcweir 	SwRegionRects aReg( GetShell()->VisArea() );
225cdf0e10cSrcweir 
226cdf0e10cSrcweir 	const SwRedlineTbl& rTbl = GetShell()->GetDoc()->GetRedlineTbl();
227cdf0e10cSrcweir 	SwShellCrsr* pCrsr = 0;
228cdf0e10cSrcweir 	for( sal_uInt16 n = 0; n < rTbl.Count(); ++n )
229cdf0e10cSrcweir 	{
230cdf0e10cSrcweir 		const SwRedline& rRed = *rTbl[ n ];
231cdf0e10cSrcweir 		if( rRed.HasMark() && (nMode % 4 ) == rRed.GetType() &&
232cdf0e10cSrcweir 			nNm == rRed.GetAuthor() )
233cdf0e10cSrcweir 		{
234cdf0e10cSrcweir 			if( !pCrsr )
235cdf0e10cSrcweir 			{
236cdf0e10cSrcweir 				pCrsr = new SwShellCrsr( *GetShell(), *rRed.GetPoint() );
237cdf0e10cSrcweir 				pCrsr->SetMark();
238cdf0e10cSrcweir 			}
239cdf0e10cSrcweir 			else
240cdf0e10cSrcweir 				*pCrsr->GetPoint() = *rRed.GetPoint();
241cdf0e10cSrcweir 			*pCrsr->GetMark() = *rRed.GetMark();
242cdf0e10cSrcweir 			pCrsr->FillRects();
243cdf0e10cSrcweir 			for( sal_uInt16 i = 0; i < pCrsr->Count(); ++i )
244cdf0e10cSrcweir 				aReg -= (*pCrsr)[ i ];
245cdf0e10cSrcweir 
246cdf0e10cSrcweir 			pCrsr->Remove( 0, i );
247cdf0e10cSrcweir 		}
248cdf0e10cSrcweir 	}
249cdf0e10cSrcweir 	if( pCrsr ) delete pCrsr;
250cdf0e10cSrcweir 
251cdf0e10cSrcweir 	aReg.Invert();
252cdf0e10cSrcweir 	SwRects::Insert( &aReg, 0 );
253cdf0e10cSrcweir }
254cdf0e10cSrcweir 
255cdf0e10cSrcweir SwRedlineRects* aRedlines[ 10 * 4 ];
256cdf0e10cSrcweir static int bFirstCall = sal_True;
257cdf0e10cSrcweir 
ShowRedlines(const SwCrsrShell * pSh,int nAction,const SwRect * pRect=0)258cdf0e10cSrcweir void ShowRedlines( const SwCrsrShell* pSh, int nAction, const SwRect* pRect = 0 )
259cdf0e10cSrcweir {
260cdf0e10cSrcweir 	if( bFirstCall )
261cdf0e10cSrcweir 	{
262cdf0e10cSrcweir 		memset( aRedlines, 0, sizeof(aRedlines));
263cdf0e10cSrcweir 		bFirstCall = sal_False;
264cdf0e10cSrcweir 	}
265cdf0e10cSrcweir 
266cdf0e10cSrcweir 	const SwRedlineTbl& rTbl = pSh->GetDoc()->GetRedlineTbl();
267cdf0e10cSrcweir 	const SwRedlineAuthorTbl& rAuthorTbl = pSh->GetDoc()->GetRedlineAuthorTbl();
268cdf0e10cSrcweir 
269cdf0e10cSrcweir 	for( sal_uInt16 n = 0; n < rAuthorTbl.Count(); ++n )
270cdf0e10cSrcweir 	{
271cdf0e10cSrcweir 		for( int i = 0; i < 4; ++i  )
272cdf0e10cSrcweir 		{
273cdf0e10cSrcweir 			SwRedlineRects** ppRedRect = &aRedlines[ n * 4 + i ];
274cdf0e10cSrcweir 			if( rTbl.Count() && !*ppRedRect )
275cdf0e10cSrcweir 				*ppRedRect = new SwRedlineRects( *pSh, n, n * 4 + i );
276cdf0e10cSrcweir 
277cdf0e10cSrcweir 			if( *ppRedRect )
278cdf0e10cSrcweir 			{
279cdf0e10cSrcweir 				switch( nAction )
280cdf0e10cSrcweir 				{
281cdf0e10cSrcweir 				case 1: (*ppRedRect)->Show(); break;
282cdf0e10cSrcweir 				case 2:	(*ppRedRect)->Hide(); break;
283cdf0e10cSrcweir 				case 3: (*ppRedRect)->Invalidate( *pRect ); break;
284cdf0e10cSrcweir 				}
285cdf0e10cSrcweir 
286cdf0e10cSrcweir 				if( !(*ppRedRect)->Count() )
287cdf0e10cSrcweir 					delete *ppRedRect, *ppRedRect = 0;
288cdf0e10cSrcweir 			}
289cdf0e10cSrcweir 		}
290cdf0e10cSrcweir 	}
291cdf0e10cSrcweir }
292cdf0e10cSrcweir 
293cdf0e10cSrcweir #define SHOWREDLINES1( nAct )			ShowRedlines( GetShell(),nAct );
294cdf0e10cSrcweir #define SHOWREDLINES2( nAct, pRect )	ShowRedlines( GetShell(),nAct, pRect );
295cdf0e10cSrcweir 
296cdf0e10cSrcweir #else
297cdf0e10cSrcweir 
298cdf0e10cSrcweir #define SHOWREDLINES1( nAct )
299cdf0e10cSrcweir #define SHOWREDLINES2( nAct, pRect )
300cdf0e10cSrcweir 
301cdf0e10cSrcweir #endif
302cdf0e10cSrcweir 
303cdf0e10cSrcweir #ifdef JP_REDLINE
304cdf0e10cSrcweir 	if( GetDoc()->GetRedlineTbl().Count() )
305cdf0e10cSrcweir 	{
306cdf0e10cSrcweir 		SwRedlineTbl& rRedlineTbl = (SwRedlineTbl&)GetDoc()->GetRedlineTbl();
307cdf0e10cSrcweir 		for( sal_uInt16 i = 0; i < rRedlineTbl.Count(); ++i )
308cdf0e10cSrcweir 			rRedlineTbl[ i ]->HideRects( *GetShell() );
309cdf0e10cSrcweir 	}
310cdf0e10cSrcweir #endif
311cdf0e10cSrcweir 
312cdf0e10cSrcweir // --------  Ab hier Klassen / Methoden fuer den nicht Text-Cursor ------
313cdf0e10cSrcweir 
SwVisCrsr(const SwCrsrShell * pCShell)314cdf0e10cSrcweir SwVisCrsr::SwVisCrsr( const SwCrsrShell * pCShell )
315cdf0e10cSrcweir 	: pCrsrShell( pCShell )
316cdf0e10cSrcweir {
317cdf0e10cSrcweir 	pCShell->GetWin()->SetCursor( &aTxtCrsr );
318cdf0e10cSrcweir 	bIsVisible = aTxtCrsr.IsVisible();
319cdf0e10cSrcweir 	bIsDragCrsr = sal_False;
320cdf0e10cSrcweir 	aTxtCrsr.SetWidth( 0 );
321cdf0e10cSrcweir 
322cdf0e10cSrcweir #ifdef SW_CRSR_TIMER
323cdf0e10cSrcweir 	bTimerOn = sal_True;
324cdf0e10cSrcweir 	SetTimeout( 50 );       // 50msec Verzoegerung
325cdf0e10cSrcweir #endif
326cdf0e10cSrcweir }
327cdf0e10cSrcweir 
328cdf0e10cSrcweir 
329cdf0e10cSrcweir 
~SwVisCrsr()330cdf0e10cSrcweir SwVisCrsr::~SwVisCrsr()
331cdf0e10cSrcweir {
332cdf0e10cSrcweir #ifdef SW_CRSR_TIMER
333cdf0e10cSrcweir 	if( bTimerOn )
334cdf0e10cSrcweir 		Stop();		// Timer stoppen
335cdf0e10cSrcweir #endif
336cdf0e10cSrcweir 
337cdf0e10cSrcweir 	if( bIsVisible && aTxtCrsr.IsVisible() )
338cdf0e10cSrcweir 		aTxtCrsr.Hide();
339cdf0e10cSrcweir 
340cdf0e10cSrcweir 	pCrsrShell->GetWin()->SetCursor( 0 );
341cdf0e10cSrcweir }
342cdf0e10cSrcweir 
343cdf0e10cSrcweir 
344cdf0e10cSrcweir 
345cdf0e10cSrcweir 
Show()346cdf0e10cSrcweir void SwVisCrsr::Show()
347cdf0e10cSrcweir {
348cdf0e10cSrcweir 	if( !bIsVisible )
349cdf0e10cSrcweir 	{
350cdf0e10cSrcweir 		bIsVisible = sal_True;
351cdf0e10cSrcweir 
352cdf0e10cSrcweir 		// muss ueberhaupt angezeigt werden ?
353cdf0e10cSrcweir 		if( pCrsrShell->VisArea().IsOver( pCrsrShell->aCharRect ) )
354cdf0e10cSrcweir #ifdef SW_CRSR_TIMER
355cdf0e10cSrcweir 		{
356cdf0e10cSrcweir 			if( bTimerOn )
357cdf0e10cSrcweir 				Start();            // Timer aufsetzen
358cdf0e10cSrcweir 			else
359cdf0e10cSrcweir 			{
360cdf0e10cSrcweir 				if( IsActive() )
361cdf0e10cSrcweir 					Stop();         // Timer Stoppen
362cdf0e10cSrcweir 
363cdf0e10cSrcweir 				_SetPosAndShow();
364cdf0e10cSrcweir 			}
365cdf0e10cSrcweir 		}
366cdf0e10cSrcweir #else
367cdf0e10cSrcweir 			_SetPosAndShow();
368cdf0e10cSrcweir #endif
369cdf0e10cSrcweir 	}
370cdf0e10cSrcweir }
371cdf0e10cSrcweir 
372cdf0e10cSrcweir 
373cdf0e10cSrcweir 
Hide()374cdf0e10cSrcweir void SwVisCrsr::Hide()
375cdf0e10cSrcweir {
376cdf0e10cSrcweir 	if( bIsVisible )
377cdf0e10cSrcweir 	{
378cdf0e10cSrcweir 		bIsVisible = sal_False;
379cdf0e10cSrcweir 
380cdf0e10cSrcweir #ifdef SW_CRSR_TIMER
381cdf0e10cSrcweir 		if( IsActive() )
382cdf0e10cSrcweir 			Stop();         // Timer Stoppen
383cdf0e10cSrcweir #endif
384cdf0e10cSrcweir 
385cdf0e10cSrcweir 		if( aTxtCrsr.IsVisible() )		// sollten die Flags nicht gueltig sein?
386cdf0e10cSrcweir 			aTxtCrsr.Hide();
387cdf0e10cSrcweir 	}
388cdf0e10cSrcweir }
389cdf0e10cSrcweir 
390cdf0e10cSrcweir #ifdef SW_CRSR_TIMER
391cdf0e10cSrcweir 
Timeout()392cdf0e10cSrcweir void __EXPORT SwVisCrsr::Timeout()
393cdf0e10cSrcweir {
394cdf0e10cSrcweir 	ASSERT( !bIsDragCrsr, "Timer vorher abschalten" );
395cdf0e10cSrcweir 	if( bIsVisible )
396cdf0e10cSrcweir 	{
397cdf0e10cSrcweir 		if ( !pCrsrShell->GetWin() ) //SwFrmFmt::GetGraphic setzt das Win temp aus!
398cdf0e10cSrcweir 			Start();
399cdf0e10cSrcweir 		else
400cdf0e10cSrcweir 			_SetPosAndShow();
401cdf0e10cSrcweir 	}
402cdf0e10cSrcweir }
403cdf0e10cSrcweir 
ChgCrsrTimerFlag(sal_Bool bTimerOn)404cdf0e10cSrcweir sal_Bool SwCrsrShell::ChgCrsrTimerFlag( sal_Bool bTimerOn )
405cdf0e10cSrcweir {
406cdf0e10cSrcweir 	return pVisCrsr->ChgTimerFlag( bTimerOn );
407cdf0e10cSrcweir }
408cdf0e10cSrcweir 
409cdf0e10cSrcweir 
ChgTimerFlag(sal_Bool bFlag)410cdf0e10cSrcweir sal_Bool SwVisCrsr::ChgTimerFlag( sal_Bool bFlag )
411cdf0e10cSrcweir {
412cdf0e10cSrcweir 	bOld = bTimerOn;
413cdf0e10cSrcweir 	if( !bFlag && bIsVisible && IsActive() )
414cdf0e10cSrcweir 	{
415cdf0e10cSrcweir 		Stop();			// Timer Stoppen
416cdf0e10cSrcweir 		_SetPosAndShow();
417cdf0e10cSrcweir 	}
418cdf0e10cSrcweir 	bTimerOn = bFlag;
419cdf0e10cSrcweir 	return bOld;
420cdf0e10cSrcweir }
421cdf0e10cSrcweir 
422cdf0e10cSrcweir #endif
423cdf0e10cSrcweir 
424cdf0e10cSrcweir 
_SetPosAndShow()425cdf0e10cSrcweir void SwVisCrsr::_SetPosAndShow()
426cdf0e10cSrcweir {
427cdf0e10cSrcweir 	SwRect aRect;
428cdf0e10cSrcweir     long nTmpY = pCrsrShell->aCrsrHeight.Y();
429cdf0e10cSrcweir     if( 0 > nTmpY )
430cdf0e10cSrcweir 	{
431cdf0e10cSrcweir         nTmpY = -nTmpY;
432cdf0e10cSrcweir         aTxtCrsr.SetOrientation( 900 );
433cdf0e10cSrcweir 		aRect = SwRect( pCrsrShell->aCharRect.Pos(),
434cdf0e10cSrcweir            Size( pCrsrShell->aCharRect.Height(), nTmpY ) );
435cdf0e10cSrcweir 		aRect.Pos().X() += pCrsrShell->aCrsrHeight.X();
436cdf0e10cSrcweir         if( pCrsrShell->IsOverwriteCrsr() )
437cdf0e10cSrcweir             aRect.Pos().Y() += aRect.Width();
438cdf0e10cSrcweir 	}
439cdf0e10cSrcweir 	else
440cdf0e10cSrcweir     {
441cdf0e10cSrcweir         aTxtCrsr.SetOrientation( 0 );
442cdf0e10cSrcweir 		aRect = SwRect( pCrsrShell->aCharRect.Pos(),
443cdf0e10cSrcweir            Size( pCrsrShell->aCharRect.Width(), nTmpY ) );
444cdf0e10cSrcweir 		aRect.Pos().Y() += pCrsrShell->aCrsrHeight.X();
445cdf0e10cSrcweir     }
446cdf0e10cSrcweir 
447cdf0e10cSrcweir     // check if cursor should show the current cursor bidi level
448cdf0e10cSrcweir     aTxtCrsr.SetDirection( CURSOR_DIRECTION_NONE );
449cdf0e10cSrcweir     const SwCursor* pTmpCrsr = pCrsrShell->_GetCrsr();
450cdf0e10cSrcweir 
451cdf0e10cSrcweir     if ( pTmpCrsr && !pCrsrShell->IsOverwriteCrsr() )
452cdf0e10cSrcweir     {
453cdf0e10cSrcweir         SwNode& rNode = pTmpCrsr->GetPoint()->nNode.GetNode();
454cdf0e10cSrcweir         if( rNode.IsTxtNode() )
455cdf0e10cSrcweir         {
456cdf0e10cSrcweir             const SwTxtNode& rTNd = *rNode.GetTxtNode();
457cdf0e10cSrcweir             const SwFrm* pFrm = rTNd.getLayoutFrm( pCrsrShell->GetLayout(), 0, 0, sal_False );
458cdf0e10cSrcweir             if ( pFrm )
459cdf0e10cSrcweir             {
460cdf0e10cSrcweir                 const SwScriptInfo* pSI = ((SwTxtFrm*)pFrm)->GetScriptInfo();
461cdf0e10cSrcweir                  // cursor level has to be shown
462cdf0e10cSrcweir                 if ( pSI && pSI->CountDirChg() > 1 )
463cdf0e10cSrcweir                 {
464cdf0e10cSrcweir                     aTxtCrsr.SetDirection(
465cdf0e10cSrcweir                         ( pTmpCrsr->GetCrsrBidiLevel() % 2 ) ?
466cdf0e10cSrcweir                           CURSOR_DIRECTION_RTL :
467cdf0e10cSrcweir                           CURSOR_DIRECTION_LTR );
468cdf0e10cSrcweir                 }
469cdf0e10cSrcweir 
470cdf0e10cSrcweir                 if ( pFrm->IsRightToLeft() )
471cdf0e10cSrcweir                 {
472cdf0e10cSrcweir                     const OutputDevice *pOut = pCrsrShell->GetOut();
473cdf0e10cSrcweir                     if ( pOut )
474cdf0e10cSrcweir                     {
475cdf0e10cSrcweir                         long nSize = pOut->GetSettings().GetStyleSettings().GetCursorSize();
476cdf0e10cSrcweir                         Size aSize( nSize, nSize );
477cdf0e10cSrcweir                         aSize = pOut->PixelToLogic( aSize );
478cdf0e10cSrcweir                         aRect.Left( aRect.Left() - aSize.Width() );
479cdf0e10cSrcweir                     }
480cdf0e10cSrcweir                 }
481cdf0e10cSrcweir             }
482cdf0e10cSrcweir         }
483cdf0e10cSrcweir     }
484cdf0e10cSrcweir 
485cdf0e10cSrcweir     if( aRect.Height() )
486cdf0e10cSrcweir     {
487cdf0e10cSrcweir         ::SwCalcPixStatics( pCrsrShell->GetOut() );
488cdf0e10cSrcweir         ::SwAlignRect( aRect, (ViewShell*)pCrsrShell );
489cdf0e10cSrcweir     }
490cdf0e10cSrcweir     if( !pCrsrShell->IsOverwriteCrsr() || bIsDragCrsr ||
491cdf0e10cSrcweir         pCrsrShell->IsSelection() )
492cdf0e10cSrcweir         aRect.Width( 0 );
493cdf0e10cSrcweir 
494cdf0e10cSrcweir 	aTxtCrsr.SetSize( aRect.SSize() );
495cdf0e10cSrcweir 
496cdf0e10cSrcweir 	aTxtCrsr.SetPos( aRect.Pos() );
497cdf0e10cSrcweir     if ( !pCrsrShell->IsCrsrReadonly()  || pCrsrShell->GetViewOptions()->IsSelectionInReadonly() )
498cdf0e10cSrcweir 	{
499cdf0e10cSrcweir 		if ( pCrsrShell->GetDrawView() )
500cdf0e10cSrcweir 			((SwDrawView*)pCrsrShell->GetDrawView())->SetAnimationEnabled(
501cdf0e10cSrcweir 					!pCrsrShell->IsSelection() );
502cdf0e10cSrcweir 
503cdf0e10cSrcweir 		sal_uInt16 nStyle = bIsDragCrsr ? CURSOR_SHADOW : 0;
504cdf0e10cSrcweir 		if( nStyle != aTxtCrsr.GetStyle() )
505cdf0e10cSrcweir 		{
506cdf0e10cSrcweir 			aTxtCrsr.SetStyle( nStyle );
507cdf0e10cSrcweir 			aTxtCrsr.SetWindow( bIsDragCrsr ? pCrsrShell->GetWin() : 0 );
508cdf0e10cSrcweir 		}
509cdf0e10cSrcweir 
510cdf0e10cSrcweir 		aTxtCrsr.Show();
511cdf0e10cSrcweir 	}
512cdf0e10cSrcweir }
513cdf0e10cSrcweir 
514cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
515cdf0e10cSrcweir 
SwSelPaintRects(const SwCrsrShell & rCSh)516cdf0e10cSrcweir SwSelPaintRects::SwSelPaintRects( const SwCrsrShell& rCSh )
51769a74367SOliver-Rainer Wittmann     : SwRects( 0 )
51869a74367SOliver-Rainer Wittmann     , pCShell( &rCSh )
51969a74367SOliver-Rainer Wittmann     , mpCursorOverlay( 0 )
52069a74367SOliver-Rainer Wittmann     , mbShowTxtInputFldOverlay( true )
52169a74367SOliver-Rainer Wittmann     , mpTxtInputFldOverlay( NULL )
522cdf0e10cSrcweir {
523cdf0e10cSrcweir }
524cdf0e10cSrcweir 
~SwSelPaintRects()525cdf0e10cSrcweir SwSelPaintRects::~SwSelPaintRects()
526cdf0e10cSrcweir {
527cdf0e10cSrcweir 	Hide();
528cdf0e10cSrcweir }
529cdf0e10cSrcweir 
swapContent(SwSelPaintRects & rSwap)530cdf0e10cSrcweir void SwSelPaintRects::swapContent(SwSelPaintRects& rSwap)
531cdf0e10cSrcweir {
53269a74367SOliver-Rainer Wittmann     SwRects aTempRects;
53369a74367SOliver-Rainer Wittmann     aTempRects.Insert(this, 0);
53469a74367SOliver-Rainer Wittmann 
53569a74367SOliver-Rainer Wittmann     Remove(0, Count());
53669a74367SOliver-Rainer Wittmann     Insert(&rSwap, 0);
53769a74367SOliver-Rainer Wittmann 
53869a74367SOliver-Rainer Wittmann     rSwap.Remove(0, rSwap.Count());
53969a74367SOliver-Rainer Wittmann     rSwap.Insert(&aTempRects, 0);
540cdf0e10cSrcweir 
54169a74367SOliver-Rainer Wittmann     // #i75172# also swap mpCursorOverlay
54269a74367SOliver-Rainer Wittmann     sdr::overlay::OverlayObject* pTempOverlay = getCursorOverlay();
54369a74367SOliver-Rainer Wittmann     setCursorOverlay(rSwap.getCursorOverlay());
54469a74367SOliver-Rainer Wittmann     rSwap.setCursorOverlay(pTempOverlay);
545cdf0e10cSrcweir 
54669a74367SOliver-Rainer Wittmann     const bool bTempShowTxtInputFldOverlay = mbShowTxtInputFldOverlay;
54769a74367SOliver-Rainer Wittmann     mbShowTxtInputFldOverlay = rSwap.mbShowTxtInputFldOverlay;
54869a74367SOliver-Rainer Wittmann     rSwap.mbShowTxtInputFldOverlay = bTempShowTxtInputFldOverlay;
549cdf0e10cSrcweir 
55069a74367SOliver-Rainer Wittmann     sw::overlay::OverlayRangesOutline* pTempTxtInputFldOverlay = mpTxtInputFldOverlay;
55169a74367SOliver-Rainer Wittmann     mpTxtInputFldOverlay = rSwap.mpTxtInputFldOverlay;
55269a74367SOliver-Rainer Wittmann     rSwap.mpTxtInputFldOverlay = pTempTxtInputFldOverlay;
553cdf0e10cSrcweir }
554cdf0e10cSrcweir 
Hide()555cdf0e10cSrcweir void SwSelPaintRects::Hide()
556cdf0e10cSrcweir {
55769a74367SOliver-Rainer Wittmann     if(mpCursorOverlay)
55869a74367SOliver-Rainer Wittmann     {
55969a74367SOliver-Rainer Wittmann         delete mpCursorOverlay;
56069a74367SOliver-Rainer Wittmann         mpCursorOverlay = 0;
56169a74367SOliver-Rainer Wittmann     }
56269a74367SOliver-Rainer Wittmann 
56369a74367SOliver-Rainer Wittmann     if ( mpTxtInputFldOverlay != NULL )
56469a74367SOliver-Rainer Wittmann     {
56569a74367SOliver-Rainer Wittmann         delete mpTxtInputFldOverlay;
56669a74367SOliver-Rainer Wittmann         mpTxtInputFldOverlay = NULL;
56769a74367SOliver-Rainer Wittmann     }
568cdf0e10cSrcweir 
56969a74367SOliver-Rainer Wittmann     SwRects::Remove( 0, Count() );
570cdf0e10cSrcweir }
571cdf0e10cSrcweir 
Show()572cdf0e10cSrcweir void SwSelPaintRects::Show()
573cdf0e10cSrcweir {
57469a74367SOliver-Rainer Wittmann     SdrView* pView = (SdrView*)pCShell->GetDrawView();
575cdf0e10cSrcweir 
57669a74367SOliver-Rainer Wittmann     if(pView && pView->PaintWindowCount())
57769a74367SOliver-Rainer Wittmann     {
57869a74367SOliver-Rainer Wittmann         // reset rects
57969a74367SOliver-Rainer Wittmann         SwRects::Remove( 0, SwRects::Count() );
58069a74367SOliver-Rainer Wittmann         FillRects();
581cdf0e10cSrcweir 
58269a74367SOliver-Rainer Wittmann         // get new rects
58369a74367SOliver-Rainer Wittmann         std::vector< basegfx::B2DRange > aNewRanges;
584cdf0e10cSrcweir 
58569a74367SOliver-Rainer Wittmann         for(sal_uInt16 a(0); a < Count(); a++)
58669a74367SOliver-Rainer Wittmann         {
58769a74367SOliver-Rainer Wittmann             const SwRect aNextRect((*this)[a]);
58869a74367SOliver-Rainer Wittmann             const Rectangle aPntRect(aNextRect.SVRect());
589cdf0e10cSrcweir 
590cdf0e10cSrcweir             aNewRanges.push_back(basegfx::B2DRange(
591cdf0e10cSrcweir                 aPntRect.Left(), aPntRect.Top(),
592cdf0e10cSrcweir                 aPntRect.Right() + 1, aPntRect.Bottom() + 1));
59369a74367SOliver-Rainer Wittmann         }
594cdf0e10cSrcweir 
59569a74367SOliver-Rainer Wittmann         if(mpCursorOverlay)
59669a74367SOliver-Rainer Wittmann         {
59769a74367SOliver-Rainer Wittmann             if(aNewRanges.size())
59869a74367SOliver-Rainer Wittmann             {
59969a74367SOliver-Rainer Wittmann                 static_cast< sdr::overlay::OverlaySelection* >(mpCursorOverlay)->setRanges(aNewRanges);
60069a74367SOliver-Rainer Wittmann             }
60169a74367SOliver-Rainer Wittmann             else
60269a74367SOliver-Rainer Wittmann             {
60369a74367SOliver-Rainer Wittmann                 delete mpCursorOverlay;
60469a74367SOliver-Rainer Wittmann                 mpCursorOverlay = 0;
60569a74367SOliver-Rainer Wittmann             }
60669a74367SOliver-Rainer Wittmann         }
60769a74367SOliver-Rainer Wittmann         else if(Count())
60869a74367SOliver-Rainer Wittmann         {
60969a74367SOliver-Rainer Wittmann             SdrPaintWindow* pCandidate = pView->GetPaintWindow(0);
61069a74367SOliver-Rainer Wittmann             sdr::overlay::OverlayManager* pTargetOverlay = pCandidate->GetOverlayManager();
611cdf0e10cSrcweir 
61269a74367SOliver-Rainer Wittmann             if(pTargetOverlay)
61369a74367SOliver-Rainer Wittmann             {
6146043ac9bSArmin Le Grand                 // get the system's hilight color
6156043ac9bSArmin Le Grand                 const SvtOptionsDrawinglayer aSvtOptionsDrawinglayer;
6166043ac9bSArmin Le Grand                 const Color aHighlight(aSvtOptionsDrawinglayer.getHilightColor());
617cdf0e10cSrcweir 
61869a74367SOliver-Rainer Wittmann                 // create correct selection
61969a74367SOliver-Rainer Wittmann                 mpCursorOverlay = new sdr::overlay::OverlaySelection(
62069a74367SOliver-Rainer Wittmann                     sdr::overlay::OVERLAY_TRANSPARENT,
62169a74367SOliver-Rainer Wittmann                     aHighlight,
62269a74367SOliver-Rainer Wittmann                     aNewRanges,
623cdf0e10cSrcweir                     true);
624cdf0e10cSrcweir 
62569a74367SOliver-Rainer Wittmann                 pTargetOverlay->add(*mpCursorOverlay);
62669a74367SOliver-Rainer Wittmann             }
62769a74367SOliver-Rainer Wittmann         }
62869a74367SOliver-Rainer Wittmann 
62969a74367SOliver-Rainer Wittmann         HighlightInputFld();
63069a74367SOliver-Rainer Wittmann     }
63169a74367SOliver-Rainer Wittmann }
63269a74367SOliver-Rainer Wittmann 
63369a74367SOliver-Rainer Wittmann 
HighlightInputFld()63469a74367SOliver-Rainer Wittmann void SwSelPaintRects::HighlightInputFld()
63569a74367SOliver-Rainer Wittmann {
63669a74367SOliver-Rainer Wittmann     std::vector< basegfx::B2DRange > aInputFldRanges;
63769a74367SOliver-Rainer Wittmann 
63869a74367SOliver-Rainer Wittmann     if ( mbShowTxtInputFldOverlay )
63969a74367SOliver-Rainer Wittmann     {
64069a74367SOliver-Rainer Wittmann         SwTxtInputFld* pCurTxtInputFldAtCrsr =
64169a74367SOliver-Rainer Wittmann             dynamic_cast<SwTxtInputFld*>(GetShell()->GetTxtFldAtPos( GetShell()->GetCrsr()->Start(), false ));
64269a74367SOliver-Rainer Wittmann         if ( pCurTxtInputFldAtCrsr != NULL )
64369a74367SOliver-Rainer Wittmann         {
64469a74367SOliver-Rainer Wittmann             SwTxtNode* pTxtNode = pCurTxtInputFldAtCrsr->GetpTxtNode();
64569a74367SOliver-Rainer Wittmann             ::boost::scoped_ptr<SwShellCrsr> pCrsrForInputTxtFld(
64669a74367SOliver-Rainer Wittmann                 new SwShellCrsr( *GetShell(), SwPosition( *pTxtNode, *(pCurTxtInputFldAtCrsr->GetStart()) ) ) );
64769a74367SOliver-Rainer Wittmann             pCrsrForInputTxtFld->SetMark();
64869a74367SOliver-Rainer Wittmann             pCrsrForInputTxtFld->GetMark()->nNode = *pTxtNode;
64969a74367SOliver-Rainer Wittmann             pCrsrForInputTxtFld->GetMark()->nContent.Assign( pTxtNode, *(pCurTxtInputFldAtCrsr->End()) );
65069a74367SOliver-Rainer Wittmann 
65169a74367SOliver-Rainer Wittmann             pCrsrForInputTxtFld->FillRects();
65269a74367SOliver-Rainer Wittmann 
65369a74367SOliver-Rainer Wittmann             for( sal_uInt16 a(0); a < pCrsrForInputTxtFld->Count(); ++a )
65469a74367SOliver-Rainer Wittmann             {
65569a74367SOliver-Rainer Wittmann                 const SwRect aNextRect((*pCrsrForInputTxtFld)[a]);
65669a74367SOliver-Rainer Wittmann                 const Rectangle aPntRect(aNextRect.SVRect());
65769a74367SOliver-Rainer Wittmann 
65869a74367SOliver-Rainer Wittmann                 aInputFldRanges.push_back(basegfx::B2DRange(
65969a74367SOliver-Rainer Wittmann                     aPntRect.Left(), aPntRect.Top(),
66069a74367SOliver-Rainer Wittmann                     aPntRect.Right() + 1, aPntRect.Bottom() + 1));
66169a74367SOliver-Rainer Wittmann             }
66269a74367SOliver-Rainer Wittmann         }
66369a74367SOliver-Rainer Wittmann     }
66469a74367SOliver-Rainer Wittmann 
66569a74367SOliver-Rainer Wittmann     if ( aInputFldRanges.size() > 0 )
66669a74367SOliver-Rainer Wittmann     {
66769a74367SOliver-Rainer Wittmann         if ( mpTxtInputFldOverlay != NULL )
66869a74367SOliver-Rainer Wittmann         {
66969a74367SOliver-Rainer Wittmann             mpTxtInputFldOverlay->setRanges( aInputFldRanges );
67069a74367SOliver-Rainer Wittmann         }
67169a74367SOliver-Rainer Wittmann         else
67269a74367SOliver-Rainer Wittmann         {
67369a74367SOliver-Rainer Wittmann             SdrView* pView = (SdrView*)GetShell()->GetDrawView();
67469a74367SOliver-Rainer Wittmann             SdrPaintWindow* pCandidate = pView->GetPaintWindow(0);
67569a74367SOliver-Rainer Wittmann             sdr::overlay::OverlayManager* pTargetOverlay = pCandidate->GetOverlayManager();
67669a74367SOliver-Rainer Wittmann 
67769a74367SOliver-Rainer Wittmann             if(pTargetOverlay)
67869a74367SOliver-Rainer Wittmann             {
67969a74367SOliver-Rainer Wittmann                 // use system's hilight color with decreased luminance as highlight color
68069a74367SOliver-Rainer Wittmann                 const SvtOptionsDrawinglayer aSvtOptionsDrawinglayer;
68169a74367SOliver-Rainer Wittmann                 Color aHighlight(aSvtOptionsDrawinglayer.getHilightColor());
68269a74367SOliver-Rainer Wittmann                 aHighlight.DecreaseLuminance( 128 );
68369a74367SOliver-Rainer Wittmann 
68469a74367SOliver-Rainer Wittmann                 mpTxtInputFldOverlay = new sw::overlay::OverlayRangesOutline( aHighlight, aInputFldRanges );
68569a74367SOliver-Rainer Wittmann                 pTargetOverlay->add( *mpTxtInputFldOverlay );
68669a74367SOliver-Rainer Wittmann             }
68769a74367SOliver-Rainer Wittmann         }
68869a74367SOliver-Rainer Wittmann     }
68969a74367SOliver-Rainer Wittmann     else
69069a74367SOliver-Rainer Wittmann     {
69169a74367SOliver-Rainer Wittmann         if ( mpTxtInputFldOverlay != NULL )
69269a74367SOliver-Rainer Wittmann         {
69369a74367SOliver-Rainer Wittmann             delete mpTxtInputFldOverlay;
69469a74367SOliver-Rainer Wittmann             mpTxtInputFldOverlay = NULL;
69569a74367SOliver-Rainer Wittmann         }
69669a74367SOliver-Rainer Wittmann     }
697cdf0e10cSrcweir }
698cdf0e10cSrcweir 
69969a74367SOliver-Rainer Wittmann 
Invalidate(const SwRect & rRect)700cdf0e10cSrcweir void SwSelPaintRects::Invalidate( const SwRect& rRect )
701cdf0e10cSrcweir {
702cdf0e10cSrcweir 	sal_uInt16 nSz = Count();
703cdf0e10cSrcweir 	if( !nSz )
704cdf0e10cSrcweir 		return;
705cdf0e10cSrcweir 
706cdf0e10cSrcweir 	SwRegionRects aReg( GetShell()->VisArea() );
707cdf0e10cSrcweir 	aReg.Remove( 0, aReg.Count() );
708cdf0e10cSrcweir 	aReg.Insert( this, 0 );
709cdf0e10cSrcweir 	aReg -= rRect;
710cdf0e10cSrcweir 	SwRects::Remove( 0, nSz );
711cdf0e10cSrcweir 	SwRects::Insert( &aReg, 0 );
712cdf0e10cSrcweir 
713cdf0e10cSrcweir 	// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
714cdf0e10cSrcweir 	// Liegt die Selection rechts oder unten ausserhalb des sichtbaren
715cdf0e10cSrcweir 	// Bereiches, so ist diese nie auf eine Pixel rechts/unten aligned.
716cdf0e10cSrcweir 	// Das muss hier erkannt und ggf. das Rechteckt erweitert werden.
717cdf0e10cSrcweir 	// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
718cdf0e10cSrcweir 	if( GetShell()->bVisPortChgd && 0 != ( nSz = Count()) )
719cdf0e10cSrcweir 	{
720cdf0e10cSrcweir 		SwSelPaintRects::Get1PixelInLogic( *GetShell() );
721cdf0e10cSrcweir 		SwRect* pRect = (SwRect*)GetData();
722cdf0e10cSrcweir 		for( ; nSz--; ++pRect )
723cdf0e10cSrcweir 		{
724cdf0e10cSrcweir 			if( pRect->Right() == GetShell()->aOldRBPos.X() )
725cdf0e10cSrcweir 				pRect->Right( pRect->Right() + nPixPtX );
726cdf0e10cSrcweir 			if( pRect->Bottom() == GetShell()->aOldRBPos.Y() )
727cdf0e10cSrcweir 				pRect->Bottom( pRect->Bottom() + nPixPtY );
728cdf0e10cSrcweir 		}
729cdf0e10cSrcweir 	}
730cdf0e10cSrcweir }
731cdf0e10cSrcweir 
Paint(const Rectangle &)732cdf0e10cSrcweir void SwSelPaintRects::Paint( const Rectangle& /*rRect*/ )
733cdf0e10cSrcweir {
734cdf0e10cSrcweir     // nothing to do with overlays
735cdf0e10cSrcweir }
736cdf0e10cSrcweir 
737cdf0e10cSrcweir 
738cdf0e10cSrcweir // check current MapMode of the shell and set possibly the static members.
739cdf0e10cSrcweir // Optional set the parameters pX, pY
Get1PixelInLogic(const ViewShell & rSh,long * pX,long * pY)740cdf0e10cSrcweir void SwSelPaintRects::Get1PixelInLogic( const ViewShell& rSh,
741cdf0e10cSrcweir 										long* pX, long* pY )
742cdf0e10cSrcweir {
743cdf0e10cSrcweir 	const OutputDevice* pOut = rSh.GetWin();
744cdf0e10cSrcweir 	if ( ! pOut )
745cdf0e10cSrcweir 		pOut = rSh.GetOut();
746cdf0e10cSrcweir 
747cdf0e10cSrcweir 	const MapMode& rMM = pOut->GetMapMode();
748cdf0e10cSrcweir 	if( pMapMode->GetMapUnit() != rMM.GetMapUnit() ||
749cdf0e10cSrcweir 		pMapMode->GetScaleX() != rMM.GetScaleX() ||
750cdf0e10cSrcweir 		pMapMode->GetScaleY() != rMM.GetScaleY() )
751cdf0e10cSrcweir 	{
752cdf0e10cSrcweir 		*pMapMode = rMM;
753cdf0e10cSrcweir 		Size aTmp( 1, 1 );
754cdf0e10cSrcweir 		aTmp = pOut->PixelToLogic( aTmp );
755cdf0e10cSrcweir 		nPixPtX = aTmp.Width();
756cdf0e10cSrcweir 		nPixPtY = aTmp.Height();
757cdf0e10cSrcweir 	}
758cdf0e10cSrcweir 	if( pX )
759cdf0e10cSrcweir 		*pX = nPixPtX;
760cdf0e10cSrcweir 	if( pY )
761cdf0e10cSrcweir 		*pY = nPixPtY;
762cdf0e10cSrcweir }
763cdf0e10cSrcweir 
764cdf0e10cSrcweir 
765cdf0e10cSrcweir /*  */
766cdf0e10cSrcweir 
SwShellCrsr(const SwCrsrShell & rCShell,const SwPosition & rPos)76769a74367SOliver-Rainer Wittmann SwShellCrsr::SwShellCrsr(
76869a74367SOliver-Rainer Wittmann     const SwCrsrShell& rCShell,
76969a74367SOliver-Rainer Wittmann     const SwPosition &rPos )
77069a74367SOliver-Rainer Wittmann     : SwCursor(rPos,0,false)
77169a74367SOliver-Rainer Wittmann     , SwSelPaintRects(rCShell)
77269a74367SOliver-Rainer Wittmann     , pPt(SwPaM::GetPoint())
773cdf0e10cSrcweir {}
774cdf0e10cSrcweir 
775cdf0e10cSrcweir 
SwShellCrsr(const SwCrsrShell & rCShell,const SwPosition & rPos,const Point & rPtPos,SwPaM * pRing)77669a74367SOliver-Rainer Wittmann SwShellCrsr::SwShellCrsr(
77769a74367SOliver-Rainer Wittmann     const SwCrsrShell& rCShell,
77869a74367SOliver-Rainer Wittmann     const SwPosition &rPos,
77969a74367SOliver-Rainer Wittmann     const Point& rPtPos,
78069a74367SOliver-Rainer Wittmann     SwPaM* pRing )
78169a74367SOliver-Rainer Wittmann     : SwCursor(rPos, pRing, false)
78269a74367SOliver-Rainer Wittmann     , SwSelPaintRects(rCShell)
78369a74367SOliver-Rainer Wittmann     , aMkPt(rPtPos)
78469a74367SOliver-Rainer Wittmann     , aPtPt(rPtPos)
78569a74367SOliver-Rainer Wittmann     , pPt(SwPaM::GetPoint())
786cdf0e10cSrcweir {}
787cdf0e10cSrcweir 
788cdf0e10cSrcweir 
SwShellCrsr(SwShellCrsr & rICrsr)789cdf0e10cSrcweir SwShellCrsr::SwShellCrsr( SwShellCrsr& rICrsr )
79069a74367SOliver-Rainer Wittmann     : SwCursor(rICrsr)
79169a74367SOliver-Rainer Wittmann     , SwSelPaintRects(*rICrsr.GetShell())
79269a74367SOliver-Rainer Wittmann     , aMkPt(rICrsr.GetMkPos())
79369a74367SOliver-Rainer Wittmann     , aPtPt(rICrsr.GetPtPos())
79469a74367SOliver-Rainer Wittmann     , pPt(SwPaM::GetPoint())
795cdf0e10cSrcweir {}
796cdf0e10cSrcweir 
~SwShellCrsr()79769a74367SOliver-Rainer Wittmann SwShellCrsr::~SwShellCrsr()
79869a74367SOliver-Rainer Wittmann {}
799cdf0e10cSrcweir 
800cdf0e10cSrcweir 
IsReadOnlyAvailable() const801cdf0e10cSrcweir bool SwShellCrsr::IsReadOnlyAvailable() const
802cdf0e10cSrcweir {
803cdf0e10cSrcweir     return GetShell()->IsReadOnlyAvailable();
804cdf0e10cSrcweir }
805cdf0e10cSrcweir 
SetMark()806cdf0e10cSrcweir void SwShellCrsr::SetMark()
807cdf0e10cSrcweir {
808cdf0e10cSrcweir 	if( SwPaM::GetPoint() == pPt )
809cdf0e10cSrcweir 		aMkPt = aPtPt;
810cdf0e10cSrcweir 	else
811cdf0e10cSrcweir 		aPtPt = aMkPt;
812cdf0e10cSrcweir 	SwPaM::SetMark();
813cdf0e10cSrcweir }
814cdf0e10cSrcweir 
FillRects()815cdf0e10cSrcweir void SwShellCrsr::FillRects()
816cdf0e10cSrcweir {
81769a74367SOliver-Rainer Wittmann     // die neuen Rechtecke berechnen
818*cf4248c2SOliver-Rainer Wittmann     if ( HasMark()
819*cf4248c2SOliver-Rainer Wittmann          && GetPoint()->nNode.GetNode().IsCntntNode()
820*cf4248c2SOliver-Rainer Wittmann          && GetPoint()->nNode.GetNode().GetCntntNode()->getLayoutFrm( GetShell()->GetLayout() )
821*cf4248c2SOliver-Rainer Wittmann          && ( GetMark()->nNode == GetPoint()->nNode
822*cf4248c2SOliver-Rainer Wittmann               || ( GetMark()->nNode.GetNode().IsCntntNode()
823*cf4248c2SOliver-Rainer Wittmann                    && GetMark()->nNode.GetNode().GetCntntNode()->getLayoutFrm( GetShell()->GetLayout() ) ) ) )
824*cf4248c2SOliver-Rainer Wittmann     {
825*cf4248c2SOliver-Rainer Wittmann         GetShell()->GetLayout()->CalcFrmRects( *this );
826*cf4248c2SOliver-Rainer Wittmann     }
827cdf0e10cSrcweir }
828cdf0e10cSrcweir 
829cdf0e10cSrcweir 
Show()830cdf0e10cSrcweir void SwShellCrsr::Show()
831cdf0e10cSrcweir {
832cdf0e10cSrcweir 	SwShellCrsr * pTmp = this;
833cdf0e10cSrcweir 	do {
834cdf0e10cSrcweir 		pTmp->SwSelPaintRects::Show();
835cdf0e10cSrcweir     } while( this != ( pTmp = dynamic_cast<SwShellCrsr*>(pTmp->GetNext()) ) );
836cdf0e10cSrcweir 
837cdf0e10cSrcweir 	SHOWBOOKMARKS1( 1 )
838cdf0e10cSrcweir 	SHOWREDLINES1( 1 )
839cdf0e10cSrcweir }
840cdf0e10cSrcweir 
841cdf0e10cSrcweir 
842cdf0e10cSrcweir 	// Dieses Rechteck wird neu gepaintet, also ist die SSelection in
843cdf0e10cSrcweir 	// dem Bereich ungueltig
Invalidate(const SwRect & rRect)844cdf0e10cSrcweir void SwShellCrsr::Invalidate( const SwRect& rRect )
845cdf0e10cSrcweir {
846cdf0e10cSrcweir 	SwShellCrsr * pTmp = this;
847cdf0e10cSrcweir 
848cdf0e10cSrcweir 	do
849cdf0e10cSrcweir     {
850cdf0e10cSrcweir 		pTmp->SwSelPaintRects::Invalidate( rRect );
851cdf0e10cSrcweir 
852cdf0e10cSrcweir         // --> FME 2005-08-18 #125102#
853cdf0e10cSrcweir         // skip any non SwShellCrsr objects in the ring
854cdf0e10cSrcweir         // (see:SwAutoFormat::DeleteSel()
855cdf0e10cSrcweir         // <--
856cdf0e10cSrcweir         Ring* pTmpRing = pTmp;
857cdf0e10cSrcweir         pTmp = 0;
858cdf0e10cSrcweir         do
859cdf0e10cSrcweir         {
860cdf0e10cSrcweir             pTmpRing = pTmpRing->GetNext();
861cdf0e10cSrcweir             pTmp = dynamic_cast<SwShellCrsr*>(pTmpRing);
862cdf0e10cSrcweir         }
863cdf0e10cSrcweir         while ( !pTmp );
864cdf0e10cSrcweir 	}
865cdf0e10cSrcweir     while( this != pTmp );
866cdf0e10cSrcweir 
867cdf0e10cSrcweir 	SHOWBOOKMARKS2( 3, &rRect )
868cdf0e10cSrcweir 	SHOWREDLINES2( 3, &rRect )
869cdf0e10cSrcweir }
870cdf0e10cSrcweir 
871cdf0e10cSrcweir 
Hide()872cdf0e10cSrcweir void SwShellCrsr::Hide()
873cdf0e10cSrcweir {
874cdf0e10cSrcweir 	SwShellCrsr * pTmp = this;
875cdf0e10cSrcweir 	do {
876cdf0e10cSrcweir 		pTmp->SwSelPaintRects::Hide();
877cdf0e10cSrcweir     } while( this != ( pTmp = dynamic_cast<SwShellCrsr*>(pTmp->GetNext()) ) );
878cdf0e10cSrcweir 
879cdf0e10cSrcweir 	SHOWBOOKMARKS1( 2 )
880cdf0e10cSrcweir 	SHOWREDLINES1( 2 )
881cdf0e10cSrcweir }
882cdf0e10cSrcweir 
Create(SwPaM * pRing) const883cdf0e10cSrcweir SwCursor* SwShellCrsr::Create( SwPaM* pRing ) const
884cdf0e10cSrcweir {
885cdf0e10cSrcweir 	return new SwShellCrsr( *GetShell(), *GetPoint(), GetPtPos(), pRing );
886cdf0e10cSrcweir }
887cdf0e10cSrcweir 
888cdf0e10cSrcweir 
MaxReplaceArived()889cdf0e10cSrcweir short SwShellCrsr::MaxReplaceArived()
890cdf0e10cSrcweir {
891cdf0e10cSrcweir     short nRet = RET_YES;
892cdf0e10cSrcweir 	Window* pDlg = LAYOUT_THIS_WINDOW (::GetSearchDialog());
893cdf0e10cSrcweir 	if( pDlg )
894cdf0e10cSrcweir 	{
895cdf0e10cSrcweir 		// alte Actions beenden; die Tabellen-Frames werden angelegt und
896cdf0e10cSrcweir 		// eine SSelection kann erzeugt werden
897cdf0e10cSrcweir 		SvUShorts aArr;
898cdf0e10cSrcweir 		sal_uInt16 nActCnt;
899cdf0e10cSrcweir 		ViewShell *pShell = const_cast< SwCrsrShell* >( GetShell() ),
900cdf0e10cSrcweir 				  *pSh = pShell;
901cdf0e10cSrcweir 		do {
902cdf0e10cSrcweir 			for( nActCnt = 0; pSh->ActionPend(); ++nActCnt )
903cdf0e10cSrcweir 				pSh->EndAction();
904cdf0e10cSrcweir 			aArr.Insert( nActCnt, aArr.Count() );
905cdf0e10cSrcweir 		} while( pShell != ( pSh = (ViewShell*)pSh->GetNext() ) );
906cdf0e10cSrcweir 
907cdf0e10cSrcweir 		{
908cdf0e10cSrcweir 			nRet = QueryBox( pDlg, SW_RES( MSG_COMCORE_ASKSEARCH )).Execute();
909cdf0e10cSrcweir 		}
910cdf0e10cSrcweir 
911cdf0e10cSrcweir 		for( sal_uInt16 n = 0; n < aArr.Count(); ++n )
912cdf0e10cSrcweir 		{
913cdf0e10cSrcweir             for( nActCnt = aArr[n]; nActCnt--; )
914cdf0e10cSrcweir 				pSh->StartAction();
915cdf0e10cSrcweir 			pSh = (ViewShell*)pSh->GetNext();
916cdf0e10cSrcweir 		}	//swmod 071107//swmod 071225
917cdf0e10cSrcweir 	}
918cdf0e10cSrcweir 	else
919cdf0e10cSrcweir 		// ansonsten aus dem Basic, und dann auf RET_YES schalten
920cdf0e10cSrcweir 		nRet = RET_YES;
921cdf0e10cSrcweir 
922cdf0e10cSrcweir     return nRet;
923cdf0e10cSrcweir }
924cdf0e10cSrcweir 
SaveTblBoxCntnt(const SwPosition * pPos)925cdf0e10cSrcweir void SwShellCrsr::SaveTblBoxCntnt( const SwPosition* pPos )
926cdf0e10cSrcweir {
927cdf0e10cSrcweir 	((SwCrsrShell*)GetShell())->SaveTblBoxCntnt( pPos );
928cdf0e10cSrcweir }
929cdf0e10cSrcweir 
UpDown(sal_Bool bUp,sal_uInt16 nCnt)930cdf0e10cSrcweir sal_Bool SwShellCrsr::UpDown( sal_Bool bUp, sal_uInt16 nCnt )
931cdf0e10cSrcweir {
932cdf0e10cSrcweir 	return SwCursor::UpDown( bUp, nCnt,
933cdf0e10cSrcweir 							&GetPtPos(), GetShell()->GetUpDownX() );
934cdf0e10cSrcweir }
935cdf0e10cSrcweir 
936cdf0e10cSrcweir #ifdef DBG_UTIL
937cdf0e10cSrcweir 
938cdf0e10cSrcweir // JP 05.03.98: zum Testen des UNO-Crsr Verhaltens hier die Implementierung
939cdf0e10cSrcweir //				am sichtbaren Cursor
940cdf0e10cSrcweir 
IsSelOvr(int eFlags)941cdf0e10cSrcweir sal_Bool SwShellCrsr::IsSelOvr( int eFlags )
942cdf0e10cSrcweir {
943cdf0e10cSrcweir 	return SwCursor::IsSelOvr( eFlags );
944cdf0e10cSrcweir }
945cdf0e10cSrcweir 
946cdf0e10cSrcweir #endif
947cdf0e10cSrcweir 
948cdf0e10cSrcweir // sal_True: an die Position kann der Cursor gesetzt werden
IsAtValidPos(sal_Bool bPoint) const949cdf0e10cSrcweir sal_Bool SwShellCrsr::IsAtValidPos( sal_Bool bPoint ) const
950cdf0e10cSrcweir {
951cdf0e10cSrcweir 	if( GetShell() && ( GetShell()->IsAllProtect() ||
952cdf0e10cSrcweir 		GetShell()->GetViewOptions()->IsReadonly() ||
953cdf0e10cSrcweir 		( GetShell()->Imp()->GetDrawView() &&
954cdf0e10cSrcweir 		  GetShell()->Imp()->GetDrawView()->GetMarkedObjectList().GetMarkCount() )))
955cdf0e10cSrcweir 		return sal_True;
956cdf0e10cSrcweir 
957cdf0e10cSrcweir 	return SwCursor::IsAtValidPos( bPoint );
958cdf0e10cSrcweir }
959cdf0e10cSrcweir 
960cdf0e10cSrcweir /*  */
961cdf0e10cSrcweir 
SwShellTableCrsr(const SwCrsrShell & rCrsrSh,const SwPosition & rPos)962cdf0e10cSrcweir SwShellTableCrsr::SwShellTableCrsr( const SwCrsrShell& rCrsrSh,
963cdf0e10cSrcweir 									const SwPosition& rPos )
964cdf0e10cSrcweir 	: SwCursor(rPos,0,false), SwShellCrsr(rCrsrSh, rPos), SwTableCursor(rPos)
965cdf0e10cSrcweir {
966cdf0e10cSrcweir }
967cdf0e10cSrcweir 
SwShellTableCrsr(const SwCrsrShell & rCrsrSh,const SwPosition & rMkPos,const Point & rMkPt,const SwPosition & rPtPos,const Point & rPtPt)968cdf0e10cSrcweir SwShellTableCrsr::SwShellTableCrsr( const SwCrsrShell& rCrsrSh,
969cdf0e10cSrcweir 					const SwPosition& rMkPos, const Point& rMkPt,
970cdf0e10cSrcweir 					const SwPosition& rPtPos, const Point& rPtPt )
971cdf0e10cSrcweir 	: SwCursor(rPtPos,0,false), SwShellCrsr(rCrsrSh, rPtPos), SwTableCursor(rPtPos)
972cdf0e10cSrcweir {
973cdf0e10cSrcweir 	SetMark();
974cdf0e10cSrcweir 	*GetMark() = rMkPos;
975cdf0e10cSrcweir 	GetMkPos() = rMkPt;
976cdf0e10cSrcweir 	GetPtPos() = rPtPt;
977cdf0e10cSrcweir }
978cdf0e10cSrcweir 
~SwShellTableCrsr()979cdf0e10cSrcweir SwShellTableCrsr::~SwShellTableCrsr() {}
980cdf0e10cSrcweir 
SetMark()981cdf0e10cSrcweir void SwShellTableCrsr::SetMark() 				{ SwShellCrsr::SetMark(); }
982cdf0e10cSrcweir 
Create(SwPaM * pRing) const983cdf0e10cSrcweir SwCursor* SwShellTableCrsr::Create( SwPaM* pRing ) const
984cdf0e10cSrcweir {
985cdf0e10cSrcweir 	return SwShellCrsr::Create( pRing );
986cdf0e10cSrcweir }
MaxReplaceArived()987cdf0e10cSrcweir short SwShellTableCrsr::MaxReplaceArived()
988cdf0e10cSrcweir {
989cdf0e10cSrcweir 	return SwShellCrsr::MaxReplaceArived();
990cdf0e10cSrcweir }
SaveTblBoxCntnt(const SwPosition * pPos)991cdf0e10cSrcweir void SwShellTableCrsr::SaveTblBoxCntnt( const SwPosition* pPos )
992cdf0e10cSrcweir {
993cdf0e10cSrcweir 	SwShellCrsr::SaveTblBoxCntnt( pPos );
994cdf0e10cSrcweir }
995cdf0e10cSrcweir 
996cdf0e10cSrcweir 
FillRects()997cdf0e10cSrcweir void SwShellTableCrsr::FillRects()
998cdf0e10cSrcweir {
999cdf0e10cSrcweir 	// die neuen Rechtecke berechnen
1000cdf0e10cSrcweir 	// JP 16.01.98: wenn der Cursor noch "geparkt" ist nichts machen!!
1001cdf0e10cSrcweir 	if( !aSelBoxes.Count() || bParked ||
1002cdf0e10cSrcweir 		!GetPoint()->nNode.GetIndex() )
1003cdf0e10cSrcweir 		return;
1004cdf0e10cSrcweir 
1005cdf0e10cSrcweir 	SwRegionRects aReg( GetShell()->VisArea() );
1006cdf0e10cSrcweir 	SwNodes& rNds = GetDoc()->GetNodes();
1007cdf0e10cSrcweir 	for( sal_uInt16 n = 0; n < aSelBoxes.Count(); ++n )
1008cdf0e10cSrcweir 	{
1009cdf0e10cSrcweir         const SwStartNode* pSttNd = (*(aSelBoxes.GetData() + n ))->GetSttNd();
1010cdf0e10cSrcweir         const SwTableNode* pSelTblNd = pSttNd->FindTableNode();
1011cdf0e10cSrcweir 
1012cdf0e10cSrcweir         SwNodeIndex aIdx( *pSttNd );
1013cdf0e10cSrcweir        	SwCntntNode* pCNd = rNds.GoNextSection( &aIdx, sal_True, sal_False );
1014cdf0e10cSrcweir 
1015cdf0e10cSrcweir         // TABLE IN TABLE
1016cdf0e10cSrcweir         // (see also lcl_FindTopLevelTable in unoobj2.cxx for a different
1017cdf0e10cSrcweir         // version to do this)
1018cdf0e10cSrcweir         const SwTableNode* pCurTblNd = pCNd->FindTableNode();
1019cdf0e10cSrcweir         while ( pSelTblNd != pCurTblNd && pCurTblNd )
1020cdf0e10cSrcweir         {
1021cdf0e10cSrcweir             aIdx = pCurTblNd->EndOfSectionIndex();
1022cdf0e10cSrcweir             pCNd = rNds.GoNextSection( &aIdx, sal_True, sal_False );
1023cdf0e10cSrcweir             pCurTblNd = pCNd->FindTableNode();
1024cdf0e10cSrcweir         }
1025cdf0e10cSrcweir 
1026cdf0e10cSrcweir 		if( !pCNd )
1027cdf0e10cSrcweir 			continue;
1028cdf0e10cSrcweir 
1029cdf0e10cSrcweir 		SwFrm* pFrm = pCNd->getLayoutFrm( GetShell()->GetLayout(), &GetSttPos() );
1030cdf0e10cSrcweir 		while( pFrm && !pFrm->IsCellFrm() )
1031cdf0e10cSrcweir 			pFrm = pFrm->GetUpper();
1032cdf0e10cSrcweir 
1033cdf0e10cSrcweir         ASSERT( pFrm, "Node nicht in einer Tabelle" );
1034cdf0e10cSrcweir 
1035cdf0e10cSrcweir         while ( pFrm )
1036cdf0e10cSrcweir         {
1037cdf0e10cSrcweir     		if( pFrm && aReg.GetOrigin().IsOver( pFrm->Frm() ) )
1038cdf0e10cSrcweir 	    		aReg -= pFrm->Frm();
1039cdf0e10cSrcweir 
1040cdf0e10cSrcweir             pFrm = pFrm->GetNextCellLeaf( MAKEPAGE_NONE );
1041cdf0e10cSrcweir         }
1042cdf0e10cSrcweir     }
1043cdf0e10cSrcweir 	aReg.Invert();
1044cdf0e10cSrcweir 	Insert( &aReg, 0 );
1045cdf0e10cSrcweir }
1046cdf0e10cSrcweir 
1047cdf0e10cSrcweir 
1048cdf0e10cSrcweir // Pruefe, ob sich der SPoint innerhalb der Tabellen-SSelection befindet
IsInside(const Point & rPt) const1049cdf0e10cSrcweir sal_Bool SwShellTableCrsr::IsInside( const Point& rPt ) const
1050cdf0e10cSrcweir {
1051cdf0e10cSrcweir 	// die neuen Rechtecke berechnen
1052cdf0e10cSrcweir 	// JP 16.01.98: wenn der Cursor noch "geparkt" ist nichts machen!!
1053cdf0e10cSrcweir 	if( !aSelBoxes.Count() || bParked ||
1054cdf0e10cSrcweir 		!GetPoint()->nNode.GetIndex()  )
1055cdf0e10cSrcweir 		return sal_False;
1056cdf0e10cSrcweir 
1057cdf0e10cSrcweir 	SwNodes& rNds = GetDoc()->GetNodes();
1058cdf0e10cSrcweir 	for( sal_uInt16 n = 0; n < aSelBoxes.Count(); ++n )
1059cdf0e10cSrcweir 	{
1060cdf0e10cSrcweir 		SwNodeIndex aIdx( *(*(aSelBoxes.GetData() + n ))->GetSttNd() );
1061cdf0e10cSrcweir 		SwCntntNode* pCNd = rNds.GoNextSection( &aIdx, sal_True, sal_False );
1062cdf0e10cSrcweir 		if( !pCNd )
1063cdf0e10cSrcweir 			continue;
1064cdf0e10cSrcweir 
1065cdf0e10cSrcweir 		SwFrm* pFrm = pCNd->getLayoutFrm( GetShell()->GetLayout(), &GetPtPos() );
1066cdf0e10cSrcweir 		while( pFrm && !pFrm->IsCellFrm() )
1067cdf0e10cSrcweir 			pFrm = pFrm->GetUpper();
1068cdf0e10cSrcweir 		ASSERT( pFrm, "Node nicht in einer Tabelle" );
1069cdf0e10cSrcweir 		if( pFrm && pFrm->Frm().IsInside( rPt ) )
1070cdf0e10cSrcweir 			return sal_True;
1071cdf0e10cSrcweir 	}
1072cdf0e10cSrcweir 	return sal_False;
1073cdf0e10cSrcweir }
1074cdf0e10cSrcweir 
1075cdf0e10cSrcweir #ifdef DBG_UTIL
1076cdf0e10cSrcweir 
1077cdf0e10cSrcweir // JP 05.03.98: zum Testen des UNO-Crsr Verhaltens hier die Implementierung
1078cdf0e10cSrcweir //				am sichtbaren Cursor
IsSelOvr(int eFlags)1079cdf0e10cSrcweir sal_Bool SwShellTableCrsr::IsSelOvr( int eFlags )
1080cdf0e10cSrcweir {
1081cdf0e10cSrcweir 	return SwShellCrsr::IsSelOvr( eFlags );
1082cdf0e10cSrcweir }
1083cdf0e10cSrcweir 
1084cdf0e10cSrcweir #endif
1085cdf0e10cSrcweir 
IsAtValidPos(sal_Bool bPoint) const1086cdf0e10cSrcweir sal_Bool SwShellTableCrsr::IsAtValidPos( sal_Bool bPoint ) const
1087cdf0e10cSrcweir {
1088cdf0e10cSrcweir 	return SwShellCrsr::IsAtValidPos( bPoint );
1089cdf0e10cSrcweir }
1090cdf0e10cSrcweir 
1091