xref: /AOO41X/main/vcl/source/window/seleng.cxx (revision 9f62ea84a806e17e6f2bbff75724a7257a0eb5d9)
1*9f62ea84SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*9f62ea84SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*9f62ea84SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*9f62ea84SAndrew Rist  * distributed with this work for additional information
6*9f62ea84SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*9f62ea84SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*9f62ea84SAndrew Rist  * "License"); you may not use this file except in compliance
9*9f62ea84SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*9f62ea84SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*9f62ea84SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*9f62ea84SAndrew Rist  * software distributed under the License is distributed on an
15*9f62ea84SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*9f62ea84SAndrew Rist  * KIND, either express or implied.  See the License for the
17*9f62ea84SAndrew Rist  * specific language governing permissions and limitations
18*9f62ea84SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*9f62ea84SAndrew Rist  *************************************************************/
21*9f62ea84SAndrew Rist 
22*9f62ea84SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_vcl.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <tools/ref.hxx>
28cdf0e10cSrcweir #include <vcl/window.hxx>
29cdf0e10cSrcweir #include <vcl/seleng.hxx>
30cdf0e10cSrcweir #include <tools/debug.hxx>
31cdf0e10cSrcweir 
32cdf0e10cSrcweir 
33cdf0e10cSrcweir 
34cdf0e10cSrcweir 
ShouldDeselect(sal_Bool bModifierKey1) const35cdf0e10cSrcweir inline sal_Bool SelectionEngine::ShouldDeselect( sal_Bool bModifierKey1 ) const
36cdf0e10cSrcweir {
37cdf0e10cSrcweir //	return !( eSelMode == MULTIPLE_SELECTION && bModifierKey1 );
38cdf0e10cSrcweir 	return eSelMode != MULTIPLE_SELECTION || !bModifierKey1;
39cdf0e10cSrcweir }
40cdf0e10cSrcweir 
41cdf0e10cSrcweir 
42cdf0e10cSrcweir // TODO: FunctionSet::SelectAtPoint raus
43cdf0e10cSrcweir 
44cdf0e10cSrcweir /*************************************************************************
45cdf0e10cSrcweir |*
46cdf0e10cSrcweir |*    SelectionEngine::SelectionEngine()
47cdf0e10cSrcweir |*
48cdf0e10cSrcweir |*    Beschreibung      SELENG.SDW
49cdf0e10cSrcweir |*    Ersterstellung    OV 10.10.94
50cdf0e10cSrcweir |*    Letzte Aenderung  OV 10.10.94
51cdf0e10cSrcweir |*
52cdf0e10cSrcweir *************************************************************************/
53cdf0e10cSrcweir 
SelectionEngine(Window * pWindow,FunctionSet * pFuncSet)54cdf0e10cSrcweir SelectionEngine::SelectionEngine( Window* pWindow, FunctionSet* pFuncSet ) :
55cdf0e10cSrcweir                     pWin( pWindow )
56cdf0e10cSrcweir {
57cdf0e10cSrcweir     eSelMode = SINGLE_SELECTION;
58cdf0e10cSrcweir     pFunctionSet = pFuncSet;
59cdf0e10cSrcweir     nFlags = SELENG_EXPANDONMOVE;
60cdf0e10cSrcweir     nLockedMods = 0;
61cdf0e10cSrcweir 
62cdf0e10cSrcweir     aWTimer.SetTimeoutHdl( LINK( this, SelectionEngine, ImpWatchDog ) );
63cdf0e10cSrcweir     aWTimer.SetTimeout( SELENG_AUTOREPEAT_INTERVAL );
64cdf0e10cSrcweir }
65cdf0e10cSrcweir 
66cdf0e10cSrcweir /*************************************************************************
67cdf0e10cSrcweir |*
68cdf0e10cSrcweir |*    SelectionEngine::~SelectionEngine()
69cdf0e10cSrcweir |*
70cdf0e10cSrcweir |*    Beschreibung      SELENG.SDW
71cdf0e10cSrcweir |*    Ersterstellung    OV 10.10.94
72cdf0e10cSrcweir |*    Letzte Aenderung  OV 10.10.94
73cdf0e10cSrcweir |*
74cdf0e10cSrcweir *************************************************************************/
75cdf0e10cSrcweir 
~SelectionEngine()76cdf0e10cSrcweir SelectionEngine::~SelectionEngine()
77cdf0e10cSrcweir {
78cdf0e10cSrcweir     aWTimer.Stop();
79cdf0e10cSrcweir }
80cdf0e10cSrcweir 
81cdf0e10cSrcweir /*************************************************************************
82cdf0e10cSrcweir |*
83cdf0e10cSrcweir |*    SelectionEngine::ImpWatchDog()
84cdf0e10cSrcweir |*
85cdf0e10cSrcweir |*    Beschreibung      SELENG.SDW
86cdf0e10cSrcweir |*    Ersterstellung    OV 10.10.94
87cdf0e10cSrcweir |*    Letzte Aenderung  OV 10.10.94
88cdf0e10cSrcweir |*
89cdf0e10cSrcweir *************************************************************************/
90cdf0e10cSrcweir 
IMPL_LINK(SelectionEngine,ImpWatchDog,Timer *,EMPTYARG)91cdf0e10cSrcweir IMPL_LINK( SelectionEngine, ImpWatchDog, Timer*, EMPTYARG )
92cdf0e10cSrcweir {
93cdf0e10cSrcweir     if ( !aArea.IsInside( aLastMove.GetPosPixel() ) )
94cdf0e10cSrcweir         SelMouseMove( aLastMove );
95cdf0e10cSrcweir     return 0;
96cdf0e10cSrcweir }
97cdf0e10cSrcweir 
98cdf0e10cSrcweir /*************************************************************************
99cdf0e10cSrcweir |*
100cdf0e10cSrcweir |*    SelectionEngine::SetSelectionMode()
101cdf0e10cSrcweir |*
102cdf0e10cSrcweir |*    Beschreibung      SELENG.SDW
103cdf0e10cSrcweir |*    Ersterstellung    OV 10.10.94
104cdf0e10cSrcweir |*    Letzte Aenderung  OV 10.10.94
105cdf0e10cSrcweir |*
106cdf0e10cSrcweir *************************************************************************/
107cdf0e10cSrcweir 
SetSelectionMode(SelectionMode eMode)108cdf0e10cSrcweir void SelectionEngine::SetSelectionMode( SelectionMode eMode )
109cdf0e10cSrcweir {
110cdf0e10cSrcweir     eSelMode = eMode;
111cdf0e10cSrcweir }
112cdf0e10cSrcweir 
113cdf0e10cSrcweir /*************************************************************************
114cdf0e10cSrcweir |*
115cdf0e10cSrcweir |*    SelectionEngine::ActivateDragMode()
116cdf0e10cSrcweir |*
117cdf0e10cSrcweir |*    Beschreibung      SELENG.SDW
118cdf0e10cSrcweir |*    Ersterstellung    OV 10.10.94
119cdf0e10cSrcweir |*    Letzte Aenderung  OV 10.10.94
120cdf0e10cSrcweir |*
121cdf0e10cSrcweir *************************************************************************/
122cdf0e10cSrcweir 
ActivateDragMode()123cdf0e10cSrcweir void SelectionEngine::ActivateDragMode()
124cdf0e10cSrcweir {
125cdf0e10cSrcweir     DBG_ERRORFILE( "SelectionEngine::ActivateDragMode not implemented" );
126cdf0e10cSrcweir }
127cdf0e10cSrcweir 
128cdf0e10cSrcweir /*************************************************************************
129cdf0e10cSrcweir |*
130cdf0e10cSrcweir |*    SelectionEngine::CursorPosChanging()
131cdf0e10cSrcweir |*
132cdf0e10cSrcweir |*    Beschreibung      SELENG.SDW
133cdf0e10cSrcweir |*    Ersterstellung    OV 10.10.94
134cdf0e10cSrcweir |*    Letzte Aenderung  GT 2002-04-04
135cdf0e10cSrcweir |*
136cdf0e10cSrcweir *************************************************************************/
137cdf0e10cSrcweir 
CursorPosChanging(sal_Bool bShift,sal_Bool bMod1)138cdf0e10cSrcweir void SelectionEngine::CursorPosChanging( sal_Bool bShift, sal_Bool bMod1 )
139cdf0e10cSrcweir {
140cdf0e10cSrcweir     if ( !pFunctionSet )
141cdf0e10cSrcweir         return;
142cdf0e10cSrcweir 
143cdf0e10cSrcweir     if ( bShift && eSelMode != SINGLE_SELECTION )
144cdf0e10cSrcweir     {
145cdf0e10cSrcweir         if ( IsAddMode() )
146cdf0e10cSrcweir         {
147cdf0e10cSrcweir             if ( !(nFlags & SELENG_HAS_ANCH) )
148cdf0e10cSrcweir             {
149cdf0e10cSrcweir                 pFunctionSet->CreateAnchor();
150cdf0e10cSrcweir                 nFlags |= SELENG_HAS_ANCH;
151cdf0e10cSrcweir             }
152cdf0e10cSrcweir         }
153cdf0e10cSrcweir         else
154cdf0e10cSrcweir         {
155cdf0e10cSrcweir             if ( !(nFlags & SELENG_HAS_ANCH) )
156cdf0e10cSrcweir             {
157cdf0e10cSrcweir                 if( ShouldDeselect( bMod1 ) )
158cdf0e10cSrcweir                     pFunctionSet->DeselectAll();
159cdf0e10cSrcweir                 pFunctionSet->CreateAnchor();
160cdf0e10cSrcweir                 nFlags |= SELENG_HAS_ANCH;
161cdf0e10cSrcweir             }
162cdf0e10cSrcweir         }
163cdf0e10cSrcweir     }
164cdf0e10cSrcweir     else
165cdf0e10cSrcweir     {
166cdf0e10cSrcweir         if ( IsAddMode() )
167cdf0e10cSrcweir         {
168cdf0e10cSrcweir             if ( nFlags & SELENG_HAS_ANCH )
169cdf0e10cSrcweir             {
170cdf0e10cSrcweir                 // pFunctionSet->CreateCursor();
171cdf0e10cSrcweir 				pFunctionSet->DestroyAnchor();
172cdf0e10cSrcweir                 nFlags &= (~SELENG_HAS_ANCH);
173cdf0e10cSrcweir             }
174cdf0e10cSrcweir         }
175cdf0e10cSrcweir         else
176cdf0e10cSrcweir         {
177cdf0e10cSrcweir             if( ShouldDeselect( bMod1 ) )
178cdf0e10cSrcweir                 pFunctionSet->DeselectAll();
179cdf0e10cSrcweir 			else
180cdf0e10cSrcweir 				pFunctionSet->DestroyAnchor();
181cdf0e10cSrcweir             nFlags &= (~SELENG_HAS_ANCH);
182cdf0e10cSrcweir         }
183cdf0e10cSrcweir     }
184cdf0e10cSrcweir }
185cdf0e10cSrcweir 
186cdf0e10cSrcweir /*************************************************************************
187cdf0e10cSrcweir |*
188cdf0e10cSrcweir |*    SelectionEngine::SelMouseButtonDown()
189cdf0e10cSrcweir |*
190cdf0e10cSrcweir |*    Beschreibung      SELENG.SDW
191cdf0e10cSrcweir |*    Ersterstellung    OV 10.10.94
192cdf0e10cSrcweir |*    Letzte Aenderung  OV 07.06.95
193cdf0e10cSrcweir |*
194cdf0e10cSrcweir *************************************************************************/
195cdf0e10cSrcweir 
SelMouseButtonDown(const MouseEvent & rMEvt)196cdf0e10cSrcweir sal_Bool SelectionEngine::SelMouseButtonDown( const MouseEvent& rMEvt )
197cdf0e10cSrcweir {
198cdf0e10cSrcweir     nFlags &= (~SELENG_CMDEVT);
199cdf0e10cSrcweir     if ( !pFunctionSet || !pWin || rMEvt.GetClicks() > 1 || rMEvt.IsRight() )
200cdf0e10cSrcweir         return sal_False;
201cdf0e10cSrcweir 
202cdf0e10cSrcweir     sal_uInt16 nModifier = rMEvt.GetModifier() | nLockedMods;
203cdf0e10cSrcweir     if ( nModifier & KEY_MOD2 )
204cdf0e10cSrcweir         return sal_False;
205cdf0e10cSrcweir     // in SingleSelection: Control-Taste filtern (damit auch
206cdf0e10cSrcweir     // mit Ctrl-Click ein D&D gestartet werden kann)
207cdf0e10cSrcweir     if ( nModifier == KEY_MOD1 && eSelMode == SINGLE_SELECTION )
208cdf0e10cSrcweir         nModifier = 0;
209cdf0e10cSrcweir 
210cdf0e10cSrcweir     Point aPos = rMEvt.GetPosPixel();
211cdf0e10cSrcweir     aLastMove = rMEvt;
212cdf0e10cSrcweir 
213cdf0e10cSrcweir 	if( !rMEvt.IsRight() )
214cdf0e10cSrcweir 	{
215cdf0e10cSrcweir 	    pWin->CaptureMouse();
216cdf0e10cSrcweir 		nFlags |= SELENG_IN_SEL;
217cdf0e10cSrcweir 	}
218cdf0e10cSrcweir 	else
219cdf0e10cSrcweir 	{
220cdf0e10cSrcweir 		nModifier = 0;
221cdf0e10cSrcweir 	}
222cdf0e10cSrcweir 
223cdf0e10cSrcweir     switch ( nModifier )
224cdf0e10cSrcweir     {
225cdf0e10cSrcweir         case 0:     // KEY_NO_KEY
226cdf0e10cSrcweir         {
227cdf0e10cSrcweir             sal_Bool bSelAtPoint = pFunctionSet->IsSelectionAtPoint( aPos );
228cdf0e10cSrcweir             nFlags &= (~SELENG_IN_ADD);
229cdf0e10cSrcweir             if ( (nFlags & SELENG_DRG_ENAB) && bSelAtPoint )
230cdf0e10cSrcweir             {
231cdf0e10cSrcweir                 nFlags |= SELENG_WAIT_UPEVT;
232cdf0e10cSrcweir                 nFlags &= ~(SELENG_IN_SEL);
233cdf0e10cSrcweir                 pWin->ReleaseMouse();
234cdf0e10cSrcweir                 return sal_True;  //auf STARTDRAG-Command-Event warten
235cdf0e10cSrcweir             }
236cdf0e10cSrcweir             if ( eSelMode != SINGLE_SELECTION )
237cdf0e10cSrcweir 			{
238cdf0e10cSrcweir 				if( !IsAddMode() )
239cdf0e10cSrcweir 	                pFunctionSet->DeselectAll();
240cdf0e10cSrcweir 				else
241cdf0e10cSrcweir 					pFunctionSet->DestroyAnchor();
242cdf0e10cSrcweir                	nFlags &= (~SELENG_HAS_ANCH); // bHasAnchor = sal_False;
243cdf0e10cSrcweir 			}
244cdf0e10cSrcweir             pFunctionSet->SetCursorAtPoint( aPos );
245cdf0e10cSrcweir             // Sonderbehandlung Single-Selection, damit Select+Drag
246cdf0e10cSrcweir             // in einem Zug moeglich ist
247cdf0e10cSrcweir             if (eSelMode == SINGLE_SELECTION && (nFlags & SELENG_DRG_ENAB))
248cdf0e10cSrcweir                 nFlags |= SELENG_WAIT_UPEVT;
249cdf0e10cSrcweir             return sal_True;
250cdf0e10cSrcweir         }
251cdf0e10cSrcweir 
252cdf0e10cSrcweir         case KEY_SHIFT:
253cdf0e10cSrcweir             if ( eSelMode == SINGLE_SELECTION )
254cdf0e10cSrcweir             {
255cdf0e10cSrcweir                 pWin->ReleaseMouse();
256cdf0e10cSrcweir                 nFlags &= (~SELENG_IN_SEL);
257cdf0e10cSrcweir                 return sal_False;
258cdf0e10cSrcweir             }
259cdf0e10cSrcweir             if ( nFlags & SELENG_ADD_ALW )
260cdf0e10cSrcweir                 nFlags |= SELENG_IN_ADD;
261cdf0e10cSrcweir             else
262cdf0e10cSrcweir                 nFlags &= (~SELENG_IN_ADD);
263cdf0e10cSrcweir 
264cdf0e10cSrcweir             if( !(nFlags & SELENG_HAS_ANCH) )
265cdf0e10cSrcweir             {
266cdf0e10cSrcweir                 if ( !(nFlags & SELENG_IN_ADD) )
267cdf0e10cSrcweir                     pFunctionSet->DeselectAll();
268cdf0e10cSrcweir                 pFunctionSet->CreateAnchor();
269cdf0e10cSrcweir                 nFlags |= SELENG_HAS_ANCH;
270cdf0e10cSrcweir             }
271cdf0e10cSrcweir             pFunctionSet->SetCursorAtPoint( aPos );
272cdf0e10cSrcweir             return sal_True;
273cdf0e10cSrcweir 
274cdf0e10cSrcweir         case KEY_MOD1:
275cdf0e10cSrcweir             // Control nur bei Mehrfachselektion erlaubt
276cdf0e10cSrcweir             if ( eSelMode != MULTIPLE_SELECTION )
277cdf0e10cSrcweir             {
278cdf0e10cSrcweir                 nFlags &= (~SELENG_IN_SEL);
279cdf0e10cSrcweir                 pWin->ReleaseMouse();
280cdf0e10cSrcweir                 return sal_True;  // Mausclick verschlucken
281cdf0e10cSrcweir             }
282cdf0e10cSrcweir             if ( nFlags & SELENG_HAS_ANCH )
283cdf0e10cSrcweir             {
284cdf0e10cSrcweir                 // pFunctionSet->CreateCursor();
285cdf0e10cSrcweir 				pFunctionSet->DestroyAnchor();
286cdf0e10cSrcweir                 nFlags &= (~SELENG_HAS_ANCH);
287cdf0e10cSrcweir             }
288cdf0e10cSrcweir             if ( pFunctionSet->IsSelectionAtPoint( aPos ) )
289cdf0e10cSrcweir             {
290cdf0e10cSrcweir                 pFunctionSet->DeselectAtPoint( aPos );
291cdf0e10cSrcweir                 pFunctionSet->SetCursorAtPoint( aPos, sal_True );
292cdf0e10cSrcweir             }
293cdf0e10cSrcweir             else
294cdf0e10cSrcweir             {
295cdf0e10cSrcweir                 pFunctionSet->SetCursorAtPoint( aPos );
296cdf0e10cSrcweir             }
297cdf0e10cSrcweir             return sal_True;
298cdf0e10cSrcweir 
299cdf0e10cSrcweir         case KEY_SHIFT + KEY_MOD1:
300cdf0e10cSrcweir             if ( eSelMode != MULTIPLE_SELECTION )
301cdf0e10cSrcweir             {
302cdf0e10cSrcweir                 pWin->ReleaseMouse();
303cdf0e10cSrcweir                 nFlags &= (~SELENG_IN_SEL);
304cdf0e10cSrcweir                 return sal_False;
305cdf0e10cSrcweir             }
306cdf0e10cSrcweir             nFlags |= SELENG_IN_ADD; //bIsInAddMode = sal_True;
307cdf0e10cSrcweir             if ( !(nFlags & SELENG_HAS_ANCH) )
308cdf0e10cSrcweir             {
309cdf0e10cSrcweir                 pFunctionSet->CreateAnchor();
310cdf0e10cSrcweir                 nFlags |= SELENG_HAS_ANCH;
311cdf0e10cSrcweir             }
312cdf0e10cSrcweir             pFunctionSet->SetCursorAtPoint( aPos );
313cdf0e10cSrcweir             return sal_True;
314cdf0e10cSrcweir     }
315cdf0e10cSrcweir 
316cdf0e10cSrcweir     return sal_False;
317cdf0e10cSrcweir }
318cdf0e10cSrcweir 
319cdf0e10cSrcweir /*************************************************************************
320cdf0e10cSrcweir |*
321cdf0e10cSrcweir |*    SelectionEngine::SelMouseButtonUp()
322cdf0e10cSrcweir |*
323cdf0e10cSrcweir |*    Beschreibung      SELENG.SDW
324cdf0e10cSrcweir |*    Ersterstellung    OV 10.10.94
325cdf0e10cSrcweir |*    Letzte Aenderung  OV 10.10.94
326cdf0e10cSrcweir |*
327cdf0e10cSrcweir *************************************************************************/
328cdf0e10cSrcweir 
SelMouseButtonUp(const MouseEvent & rMEvt)329cdf0e10cSrcweir sal_Bool SelectionEngine::SelMouseButtonUp( const MouseEvent& rMEvt )
330cdf0e10cSrcweir {
331cdf0e10cSrcweir     aWTimer.Stop();
332cdf0e10cSrcweir     //DbgOut("Up");
333cdf0e10cSrcweir     if( !pFunctionSet || !pWin )
334cdf0e10cSrcweir     {
335cdf0e10cSrcweir         nFlags &= ~(SELENG_CMDEVT | SELENG_WAIT_UPEVT | SELENG_IN_SEL);
336cdf0e10cSrcweir         return sal_False;
337cdf0e10cSrcweir     }
338cdf0e10cSrcweir 
339cdf0e10cSrcweir 	if( !rMEvt.IsRight() )
340cdf0e10cSrcweir 	{
341cdf0e10cSrcweir 	   pWin->ReleaseMouse();
342cdf0e10cSrcweir 	}
343cdf0e10cSrcweir 
344cdf0e10cSrcweir     if( (nFlags & SELENG_WAIT_UPEVT) && !(nFlags & SELENG_CMDEVT) &&
345cdf0e10cSrcweir         eSelMode != SINGLE_SELECTION)
346cdf0e10cSrcweir     {
347cdf0e10cSrcweir         // MouseButtonDown in Sel aber kein CommandEvent eingetrudelt
348cdf0e10cSrcweir         // ==> deselektieren
349cdf0e10cSrcweir         sal_uInt16 nModifier = aLastMove.GetModifier() | nLockedMods;
350cdf0e10cSrcweir         if( nModifier == KEY_MOD1 || IsAlwaysAdding() )
351cdf0e10cSrcweir 		{
352cdf0e10cSrcweir 			if( !(nModifier & KEY_SHIFT) )
353cdf0e10cSrcweir 			{
354cdf0e10cSrcweir 				pFunctionSet->DestroyAnchor();
355cdf0e10cSrcweir 		        nFlags &= (~SELENG_HAS_ANCH); // nix Anker
356cdf0e10cSrcweir 			}
357cdf0e10cSrcweir 			pFunctionSet->DeselectAtPoint( aLastMove.GetPosPixel() );
358cdf0e10cSrcweir         	nFlags &= (~SELENG_HAS_ANCH); // nix Anker
359cdf0e10cSrcweir 	        pFunctionSet->SetCursorAtPoint( aLastMove.GetPosPixel(), sal_True );
360cdf0e10cSrcweir 		}
361cdf0e10cSrcweir 		else
362cdf0e10cSrcweir 		{
363cdf0e10cSrcweir             pFunctionSet->DeselectAll();
364cdf0e10cSrcweir 	        nFlags &= (~SELENG_HAS_ANCH); // nix Anker
365cdf0e10cSrcweir         	pFunctionSet->SetCursorAtPoint( aLastMove.GetPosPixel() );
366cdf0e10cSrcweir 		}
367cdf0e10cSrcweir     }
368cdf0e10cSrcweir 
369cdf0e10cSrcweir     nFlags &= ~(SELENG_CMDEVT | SELENG_WAIT_UPEVT | SELENG_IN_SEL);
370cdf0e10cSrcweir     return sal_True;
371cdf0e10cSrcweir }
372cdf0e10cSrcweir 
373cdf0e10cSrcweir /*************************************************************************
374cdf0e10cSrcweir |*
375cdf0e10cSrcweir |*    SelectionEngine::SelMouseMove()
376cdf0e10cSrcweir |*
377cdf0e10cSrcweir |*    Beschreibung      SELENG.SDW
378cdf0e10cSrcweir |*    Ersterstellung    OV 10.10.94
379cdf0e10cSrcweir |*    Letzte Aenderung  OV 10.10.94
380cdf0e10cSrcweir |*
381cdf0e10cSrcweir *************************************************************************/
382cdf0e10cSrcweir 
SelMouseMove(const MouseEvent & rMEvt)383cdf0e10cSrcweir sal_Bool SelectionEngine::SelMouseMove( const MouseEvent& rMEvt )
384cdf0e10cSrcweir {
385cdf0e10cSrcweir 
386cdf0e10cSrcweir     if ( !pFunctionSet || !(nFlags & SELENG_IN_SEL) ||
387cdf0e10cSrcweir          (nFlags & (SELENG_CMDEVT | SELENG_WAIT_UPEVT)) )
388cdf0e10cSrcweir         return sal_False;
389cdf0e10cSrcweir 
390cdf0e10cSrcweir 	if( !(nFlags & SELENG_EXPANDONMOVE) )
391cdf0e10cSrcweir 		return sal_False; // auf DragEvent warten!
392cdf0e10cSrcweir 
393cdf0e10cSrcweir     aLastMove = rMEvt;
394cdf0e10cSrcweir     // wenn die Maus ausserhalb der Area steht, dann wird die
395cdf0e10cSrcweir     // Frequenz des SetCursorAtPoint() nur durch den Timer bestimmt
396cdf0e10cSrcweir     if( aWTimer.IsActive() && !aArea.IsInside( rMEvt.GetPosPixel() ))
397cdf0e10cSrcweir         return sal_True;
398cdf0e10cSrcweir 
399cdf0e10cSrcweir 
400cdf0e10cSrcweir     aWTimer.Start();
401cdf0e10cSrcweir     if ( eSelMode != SINGLE_SELECTION )
402cdf0e10cSrcweir     {
403cdf0e10cSrcweir         if ( !(nFlags & SELENG_HAS_ANCH) )
404cdf0e10cSrcweir         {
405cdf0e10cSrcweir             pFunctionSet->CreateAnchor();
406cdf0e10cSrcweir             //DbgOut("Move:Creating anchor");
407cdf0e10cSrcweir             nFlags |= SELENG_HAS_ANCH;
408cdf0e10cSrcweir         }
409cdf0e10cSrcweir     }
410cdf0e10cSrcweir 
411cdf0e10cSrcweir     //DbgOut("Move:SetCursor");
412cdf0e10cSrcweir     pFunctionSet->SetCursorAtPoint( rMEvt.GetPosPixel() );
413cdf0e10cSrcweir 
414cdf0e10cSrcweir     return sal_True;
415cdf0e10cSrcweir }
416cdf0e10cSrcweir 
417cdf0e10cSrcweir /*************************************************************************
418cdf0e10cSrcweir |*
419cdf0e10cSrcweir |*    SelectionEngine::SetWindow()
420cdf0e10cSrcweir |*
421cdf0e10cSrcweir |*    Beschreibung      SELENG.SDW
422cdf0e10cSrcweir |*    Ersterstellung    OV 10.10.94
423cdf0e10cSrcweir |*    Letzte Aenderung  OV 10.10.94
424cdf0e10cSrcweir |*
425cdf0e10cSrcweir *************************************************************************/
426cdf0e10cSrcweir 
SetWindow(Window * pNewWin)427cdf0e10cSrcweir void SelectionEngine::SetWindow( Window* pNewWin )
428cdf0e10cSrcweir {
429cdf0e10cSrcweir     if( pNewWin != pWin )
430cdf0e10cSrcweir     {
431cdf0e10cSrcweir         if ( pWin && (nFlags & SELENG_IN_SEL) )
432cdf0e10cSrcweir             pWin->ReleaseMouse();
433cdf0e10cSrcweir         pWin = pNewWin;
434cdf0e10cSrcweir         if ( pWin && ( nFlags & SELENG_IN_SEL ) )
435cdf0e10cSrcweir             pWin->CaptureMouse();
436cdf0e10cSrcweir     }
437cdf0e10cSrcweir }
438cdf0e10cSrcweir 
439cdf0e10cSrcweir /*************************************************************************
440cdf0e10cSrcweir |*
441cdf0e10cSrcweir |*    SelectionEngine::Reset()
442cdf0e10cSrcweir |*
443cdf0e10cSrcweir |*    Beschreibung      SELENG.SDW
444cdf0e10cSrcweir |*    Ersterstellung    OV 07.07.95
445cdf0e10cSrcweir |*    Letzte Aenderung  OV 07.07.95
446cdf0e10cSrcweir |*
447cdf0e10cSrcweir *************************************************************************/
448cdf0e10cSrcweir 
Reset()449cdf0e10cSrcweir void SelectionEngine::Reset()
450cdf0e10cSrcweir {
451cdf0e10cSrcweir     aWTimer.Stop();
452cdf0e10cSrcweir     if ( nFlags & SELENG_IN_SEL )
453cdf0e10cSrcweir         pWin->ReleaseMouse();
454cdf0e10cSrcweir     nFlags &= ~(SELENG_HAS_ANCH | SELENG_IN_SEL);
455cdf0e10cSrcweir     nLockedMods = 0;
456cdf0e10cSrcweir }
457cdf0e10cSrcweir 
458cdf0e10cSrcweir /*************************************************************************
459cdf0e10cSrcweir |*
460cdf0e10cSrcweir |*    SelectionEngine::Command()
461cdf0e10cSrcweir |*
462cdf0e10cSrcweir |*    Beschreibung      SELENG.SDW
463cdf0e10cSrcweir |*    Ersterstellung    OV 07.07.95
464cdf0e10cSrcweir |*    Letzte Aenderung  OV 07.07.95
465cdf0e10cSrcweir |*
466cdf0e10cSrcweir *************************************************************************/
467cdf0e10cSrcweir 
Command(const CommandEvent & rCEvt)468cdf0e10cSrcweir void SelectionEngine::Command( const CommandEvent& rCEvt )
469cdf0e10cSrcweir {
470cdf0e10cSrcweir     // Timer aWTimer ist beim Aufspannen einer Selektion aktiv
471cdf0e10cSrcweir     if ( !pFunctionSet || !pWin || aWTimer.IsActive() )
472cdf0e10cSrcweir         return;
473cdf0e10cSrcweir     aWTimer.Stop();
474cdf0e10cSrcweir     nFlags |= SELENG_CMDEVT;
475cdf0e10cSrcweir     if ( rCEvt.GetCommand() == COMMAND_STARTDRAG )
476cdf0e10cSrcweir     {
477cdf0e10cSrcweir         if ( nFlags & SELENG_DRG_ENAB )
478cdf0e10cSrcweir         {
479cdf0e10cSrcweir             DBG_ASSERT( rCEvt.IsMouseEvent(), "STARTDRAG: Not a MouseEvent" );
480cdf0e10cSrcweir             if ( pFunctionSet->IsSelectionAtPoint( rCEvt.GetMousePosPixel() ) )
481cdf0e10cSrcweir             {
482cdf0e10cSrcweir             	aLastMove = MouseEvent( rCEvt.GetMousePosPixel(),
483cdf0e10cSrcweir            					aLastMove.GetClicks(), aLastMove.GetMode(),
484cdf0e10cSrcweir            					aLastMove.GetButtons(), aLastMove.GetModifier() );
485cdf0e10cSrcweir                 pFunctionSet->BeginDrag();
486cdf0e10cSrcweir                 nFlags &= ~(SELENG_CMDEVT|SELENG_WAIT_UPEVT|SELENG_IN_SEL);
487cdf0e10cSrcweir             }
488cdf0e10cSrcweir             else
489cdf0e10cSrcweir                 nFlags &= ~SELENG_CMDEVT;
490cdf0e10cSrcweir         }
491cdf0e10cSrcweir         else
492cdf0e10cSrcweir             nFlags &= ~SELENG_CMDEVT;
493cdf0e10cSrcweir     }
494cdf0e10cSrcweir }
495