xref: /aoo4110/main/sw/source/ui/docvw/edtdd.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sw.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski #include <hintids.hxx>
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski #include <svx/svdview.hxx>
32*b1cdbd2cSJim Jagielski #include <editeng/outliner.hxx>
33*b1cdbd2cSJim Jagielski //#ifndef _SVDVMARK_HXX //autogen
34*b1cdbd2cSJim Jagielski //#include <svx/svdvmark.hxx>
35*b1cdbd2cSJim Jagielski //#endif
36*b1cdbd2cSJim Jagielski #include <svx/svdobj.hxx>
37*b1cdbd2cSJim Jagielski #include <sot/exchange.hxx>
38*b1cdbd2cSJim Jagielski #include <sot/formats.hxx>
39*b1cdbd2cSJim Jagielski #include <sfx2/bindings.hxx>
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski #include <sfx2/viewfrm.hxx>
42*b1cdbd2cSJim Jagielski #include <fmturl.hxx>
43*b1cdbd2cSJim Jagielski #include <frmfmt.hxx>
44*b1cdbd2cSJim Jagielski #include <wrtsh.hxx>
45*b1cdbd2cSJim Jagielski #include <edtwin.hxx>
46*b1cdbd2cSJim Jagielski #ifndef _VIEW_HXX
47*b1cdbd2cSJim Jagielski #include <view.hxx>
48*b1cdbd2cSJim Jagielski #endif
49*b1cdbd2cSJim Jagielski #include <viewopt.hxx>
50*b1cdbd2cSJim Jagielski #include <swdtflvr.hxx>
51*b1cdbd2cSJim Jagielski #include <swmodule.hxx>
52*b1cdbd2cSJim Jagielski #ifndef _DOCSH_HXX
53*b1cdbd2cSJim Jagielski #include <docsh.hxx>
54*b1cdbd2cSJim Jagielski #endif
55*b1cdbd2cSJim Jagielski #include <wdocsh.hxx>
56*b1cdbd2cSJim Jagielski #include <swundo.hxx>
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski // no include "dbgoutsw.hxx" here!!!!!!
61*b1cdbd2cSJim Jagielski 
62*b1cdbd2cSJim Jagielski extern sal_Bool bNoInterrupt;
63*b1cdbd2cSJim Jagielski extern sal_Bool bFrmDrag;
64*b1cdbd2cSJim Jagielski extern sal_Bool bDDTimerStarted;
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski sal_Bool bExecuteDrag = sal_False;
67*b1cdbd2cSJim Jagielski 
StartDDTimer()68*b1cdbd2cSJim Jagielski void SwEditWin::StartDDTimer()
69*b1cdbd2cSJim Jagielski {
70*b1cdbd2cSJim Jagielski 	aTimer.SetTimeoutHdl(LINK(this, SwEditWin, DDHandler));
71*b1cdbd2cSJim Jagielski 	aTimer.SetTimeout(480);
72*b1cdbd2cSJim Jagielski 	aTimer.Start();
73*b1cdbd2cSJim Jagielski 	bDDTimerStarted = sal_True;
74*b1cdbd2cSJim Jagielski }
75*b1cdbd2cSJim Jagielski 
76*b1cdbd2cSJim Jagielski 
StopDDTimer(SwWrtShell * pSh,const Point & rPt)77*b1cdbd2cSJim Jagielski void SwEditWin::StopDDTimer(SwWrtShell *pSh, const Point &rPt)
78*b1cdbd2cSJim Jagielski {
79*b1cdbd2cSJim Jagielski 	aTimer.Stop();
80*b1cdbd2cSJim Jagielski 	bDDTimerStarted = sal_False;
81*b1cdbd2cSJim Jagielski 	if(!pSh->IsSelFrmMode())
82*b1cdbd2cSJim Jagielski 		(pSh->*pSh->fnSetCrsr)(&rPt,sal_False);
83*b1cdbd2cSJim Jagielski 	aTimer.SetTimeoutHdl(LINK(this,SwEditWin, TimerHandler));
84*b1cdbd2cSJim Jagielski }
85*b1cdbd2cSJim Jagielski 
StartDrag(sal_Int8,const Point & rPosPixel)86*b1cdbd2cSJim Jagielski void SwEditWin::StartDrag( sal_Int8 /*nAction*/, const Point& rPosPixel )
87*b1cdbd2cSJim Jagielski {
88*b1cdbd2cSJim Jagielski 	SwWrtShell &rSh = rView.GetWrtShell();
89*b1cdbd2cSJim Jagielski 	if( rSh.GetDrawView() )
90*b1cdbd2cSJim Jagielski 	{
91*b1cdbd2cSJim Jagielski 		CommandEvent aDragEvent( rPosPixel, COMMAND_STARTDRAG, sal_True );
92*b1cdbd2cSJim Jagielski 		if( rSh.GetDrawView()->Command( aDragEvent, this ) )
93*b1cdbd2cSJim Jagielski 		{
94*b1cdbd2cSJim Jagielski 			rView.GetViewFrame()->GetBindings().InvalidateAll(sal_False);
95*b1cdbd2cSJim Jagielski 			return; // Event von der SdrView ausgewertet
96*b1cdbd2cSJim Jagielski 		}
97*b1cdbd2cSJim Jagielski 	}
98*b1cdbd2cSJim Jagielski 
99*b1cdbd2cSJim Jagielski 	if ( !pApplyTempl && !rSh.IsDrawCreate() && !IsDrawAction())
100*b1cdbd2cSJim Jagielski 	{
101*b1cdbd2cSJim Jagielski 		sal_Bool bStart = sal_False, bDelSelect = sal_False;
102*b1cdbd2cSJim Jagielski 		SdrObject *pObj = NULL;
103*b1cdbd2cSJim Jagielski 		Point aDocPos( PixelToLogic( rPosPixel ) );
104*b1cdbd2cSJim Jagielski 		if ( !rSh.IsInSelect() && rSh.ChgCurrPam( aDocPos, sal_True, sal_True))
105*b1cdbd2cSJim Jagielski 			//Wir sind nicht beim Selektieren und stehen auf einer
106*b1cdbd2cSJim Jagielski 			//Selektion
107*b1cdbd2cSJim Jagielski 			bStart = sal_True;
108*b1cdbd2cSJim Jagielski 		else if ( !bFrmDrag && rSh.IsSelFrmMode() &&
109*b1cdbd2cSJim Jagielski 					rSh.IsInsideSelectedObj( aDocPos ) )
110*b1cdbd2cSJim Jagielski 		{
111*b1cdbd2cSJim Jagielski 			//Wir sind nicht am internen Draggen und stehen auf
112*b1cdbd2cSJim Jagielski 			//einem Objekt (Rahmen, Zeichenobjekt)
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski 			bStart = sal_True;
115*b1cdbd2cSJim Jagielski 		}
116*b1cdbd2cSJim Jagielski 		else if( !bFrmDrag && rView.GetDocShell()->IsReadOnly() &&
117*b1cdbd2cSJim Jagielski 				OBJCNT_NONE != rSh.GetObjCntType( aDocPos, pObj ))
118*b1cdbd2cSJim Jagielski 		{
119*b1cdbd2cSJim Jagielski 			rSh.LockPaint();
120*b1cdbd2cSJim Jagielski             if( rSh.SelectObj( aDocPos, 0, pObj ))
121*b1cdbd2cSJim Jagielski 				bStart = bDelSelect = sal_True;
122*b1cdbd2cSJim Jagielski 			else
123*b1cdbd2cSJim Jagielski 				rSh.UnlockPaint();
124*b1cdbd2cSJim Jagielski 		}
125*b1cdbd2cSJim Jagielski 		else
126*b1cdbd2cSJim Jagielski 		{
127*b1cdbd2cSJim Jagielski 			SwContentAtPos aSwContentAtPos( SwContentAtPos::SW_INETATTR );
128*b1cdbd2cSJim Jagielski 			bStart = rSh.GetContentAtPos( aDocPos,
129*b1cdbd2cSJim Jagielski 						aSwContentAtPos,
130*b1cdbd2cSJim Jagielski 						sal_False );
131*b1cdbd2cSJim Jagielski 		}
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski 		if ( bStart && !bIsInDrag )
134*b1cdbd2cSJim Jagielski 		{
135*b1cdbd2cSJim Jagielski 			bMBPressed = sal_False;
136*b1cdbd2cSJim Jagielski 			ReleaseMouse();
137*b1cdbd2cSJim Jagielski 			bFrmDrag = sal_False;
138*b1cdbd2cSJim Jagielski 			bExecuteDrag = sal_True;
139*b1cdbd2cSJim Jagielski 			SwEditWin::nDDStartPosY = aDocPos.Y();
140*b1cdbd2cSJim Jagielski 			SwEditWin::nDDStartPosX = aDocPos.X();
141*b1cdbd2cSJim Jagielski 			aMovePos = aDocPos;
142*b1cdbd2cSJim Jagielski 			StartExecuteDrag();
143*b1cdbd2cSJim Jagielski 			if( bDelSelect )
144*b1cdbd2cSJim Jagielski 			{
145*b1cdbd2cSJim Jagielski 				rSh.UnSelectFrm();
146*b1cdbd2cSJim Jagielski 				rSh.UnlockPaint();
147*b1cdbd2cSJim Jagielski 			}
148*b1cdbd2cSJim Jagielski 		}
149*b1cdbd2cSJim Jagielski 	}
150*b1cdbd2cSJim Jagielski }
151*b1cdbd2cSJim Jagielski 
StartExecuteDrag()152*b1cdbd2cSJim Jagielski void SwEditWin::StartExecuteDrag()
153*b1cdbd2cSJim Jagielski {
154*b1cdbd2cSJim Jagielski 	if( !bExecuteDrag || bIsInDrag )
155*b1cdbd2cSJim Jagielski 		return;
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski 	bIsInDrag = sal_True;
158*b1cdbd2cSJim Jagielski 
159*b1cdbd2cSJim Jagielski 	SwTransferable* pTransfer = new SwTransferable( rView.GetWrtShell() );
160*b1cdbd2cSJim Jagielski     uno::Reference<
161*b1cdbd2cSJim Jagielski         datatransfer::XTransferable > xRef( pTransfer );
162*b1cdbd2cSJim Jagielski 
163*b1cdbd2cSJim Jagielski 	pTransfer->StartDrag( this, aMovePos );
164*b1cdbd2cSJim Jagielski }
165*b1cdbd2cSJim Jagielski 
DragFinished()166*b1cdbd2cSJim Jagielski void SwEditWin::DragFinished()
167*b1cdbd2cSJim Jagielski {
168*b1cdbd2cSJim Jagielski 	DropCleanup();
169*b1cdbd2cSJim Jagielski 	aTimer.SetTimeoutHdl( LINK(this,SwEditWin, TimerHandler) );
170*b1cdbd2cSJim Jagielski 	bIsInDrag = sal_False;
171*b1cdbd2cSJim Jagielski }
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski 
DropCleanup()174*b1cdbd2cSJim Jagielski void SwEditWin::DropCleanup()
175*b1cdbd2cSJim Jagielski {
176*b1cdbd2cSJim Jagielski 	SwWrtShell &rSh =  rView.GetWrtShell();
177*b1cdbd2cSJim Jagielski 
178*b1cdbd2cSJim Jagielski 	// Stati zuruecksetzen
179*b1cdbd2cSJim Jagielski 	bNoInterrupt = sal_False;
180*b1cdbd2cSJim Jagielski 	if ( bOldIdleSet )
181*b1cdbd2cSJim Jagielski 	{
182*b1cdbd2cSJim Jagielski 		((SwViewOption*)rSh.GetViewOptions())->SetIdle( bOldIdle );
183*b1cdbd2cSJim Jagielski 		bOldIdleSet = sal_False;
184*b1cdbd2cSJim Jagielski 	}
185*b1cdbd2cSJim Jagielski 	if ( pUserMarker )
186*b1cdbd2cSJim Jagielski 		CleanupDropUserMarker();
187*b1cdbd2cSJim Jagielski 	else
188*b1cdbd2cSJim Jagielski 		rSh.UnSetVisCrsr();
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski }
191*b1cdbd2cSJim Jagielski 
CleanupDropUserMarker()192*b1cdbd2cSJim Jagielski void SwEditWin::CleanupDropUserMarker()
193*b1cdbd2cSJim Jagielski {
194*b1cdbd2cSJim Jagielski 	if ( pUserMarker )
195*b1cdbd2cSJim Jagielski 	{
196*b1cdbd2cSJim Jagielski 		delete pUserMarker;
197*b1cdbd2cSJim Jagielski 		pUserMarker = 0;
198*b1cdbd2cSJim Jagielski 		pUserMarkerObj = 0;
199*b1cdbd2cSJim Jagielski 	}
200*b1cdbd2cSJim Jagielski }
201*b1cdbd2cSJim Jagielski 
202*b1cdbd2cSJim Jagielski 
203*b1cdbd2cSJim Jagielski //Messehack (MA,MBA)
lcl_SelectShellForDrop(SwView & rView)204*b1cdbd2cSJim Jagielski void lcl_SelectShellForDrop( SwView &rView )
205*b1cdbd2cSJim Jagielski {
206*b1cdbd2cSJim Jagielski 	if ( !rView.GetCurShell() )
207*b1cdbd2cSJim Jagielski 		rView.SelectShell();
208*b1cdbd2cSJim Jagielski }
209*b1cdbd2cSJim Jagielski 
ExecuteDrop(const ExecuteDropEvent & rEvt)210*b1cdbd2cSJim Jagielski sal_Int8 SwEditWin::ExecuteDrop( const ExecuteDropEvent& rEvt )
211*b1cdbd2cSJim Jagielski {
212*b1cdbd2cSJim Jagielski 	::lcl_SelectShellForDrop( GetView() );
213*b1cdbd2cSJim Jagielski 	DropCleanup();
214*b1cdbd2cSJim Jagielski 	sal_Int8 nRet = DND_ACTION_NONE;
215*b1cdbd2cSJim Jagielski 
216*b1cdbd2cSJim Jagielski 	//Ein Drop auf eine offene OutlinerView geht uns nichts an (siehe auch QueryDrop)
217*b1cdbd2cSJim Jagielski 	SwWrtShell &rSh = rView.GetWrtShell();
218*b1cdbd2cSJim Jagielski 	const Point aDocPt( PixelToLogic( rEvt.maPosPixel ));
219*b1cdbd2cSJim Jagielski 	SdrObject *pObj = 0;
220*b1cdbd2cSJim Jagielski 	OutlinerView* pOLV;
221*b1cdbd2cSJim Jagielski 	rSh.GetObjCntType( aDocPt, pObj );
222*b1cdbd2cSJim Jagielski 
223*b1cdbd2cSJim Jagielski 	if( pObj && 0 != ( pOLV = rSh.GetDrawView()->GetTextEditOutlinerView() ))
224*b1cdbd2cSJim Jagielski 	{
225*b1cdbd2cSJim Jagielski 		Rectangle aRect( pOLV->GetOutputArea() );
226*b1cdbd2cSJim Jagielski 		aRect.Union( pObj->GetLogicRect() );
227*b1cdbd2cSJim Jagielski 		const Point aPos = pOLV->GetWindow()->PixelToLogic(rEvt.maPosPixel);
228*b1cdbd2cSJim Jagielski 		if ( aRect.IsInside(aPos) )
229*b1cdbd2cSJim Jagielski 		{
230*b1cdbd2cSJim Jagielski 			rSh.StartAllAction();
231*b1cdbd2cSJim Jagielski //!!			sal_Int8 nRet = DND_ACTION_NONE/*pOLV->ExecuteDrop( rEvt )*/;
232*b1cdbd2cSJim Jagielski 			rSh.EndAllAction();
233*b1cdbd2cSJim Jagielski 			return nRet;
234*b1cdbd2cSJim Jagielski 		}
235*b1cdbd2cSJim Jagielski 	}
236*b1cdbd2cSJim Jagielski 
237*b1cdbd2cSJim Jagielski 
238*b1cdbd2cSJim Jagielski 	// dvo 2002-05-27, #99027#: There's a special treatment for file lists with a single
239*b1cdbd2cSJim Jagielski 	//                          element, that depends on the actual content of the
240*b1cdbd2cSJim Jagielski 	//                          Transferable to be accessible. Since the transferable
241*b1cdbd2cSJim Jagielski 	//                          may only be accessed after the drop has been accepted
242*b1cdbd2cSJim Jagielski 	//                          (according to KA due to Java D&D), we'll have to
243*b1cdbd2cSJim Jagielski 	//                          reevaluate the drop action once more _with_ the
244*b1cdbd2cSJim Jagielski 	//                          Transferable.
245*b1cdbd2cSJim Jagielski 	sal_uInt16 nEventAction;
246*b1cdbd2cSJim Jagielski 	sal_Int8 nUserOpt = rEvt.mbDefault ? EXCHG_IN_ACTION_DEFAULT
247*b1cdbd2cSJim Jagielski 									   : rEvt.mnAction;
248*b1cdbd2cSJim Jagielski     m_nDropAction = SotExchange::GetExchangeAction(
249*b1cdbd2cSJim Jagielski 								GetDataFlavorExVector(),
250*b1cdbd2cSJim Jagielski                                 m_nDropDestination,
251*b1cdbd2cSJim Jagielski 								rEvt.mnAction,
252*b1cdbd2cSJim Jagielski //!!								rEvt.GetSourceOptions(),
253*b1cdbd2cSJim Jagielski                                 nUserOpt, m_nDropFormat, nEventAction, 0,
254*b1cdbd2cSJim Jagielski 								&rEvt.maDropEvent.Transferable );
255*b1cdbd2cSJim Jagielski 
256*b1cdbd2cSJim Jagielski 
257*b1cdbd2cSJim Jagielski 	TransferableDataHelper aData( rEvt.maDropEvent.Transferable );
258*b1cdbd2cSJim Jagielski 	nRet = rEvt.mnAction;
259*b1cdbd2cSJim Jagielski     if( !SwTransferable::PasteData( aData, rSh, m_nDropAction, m_nDropFormat,
260*b1cdbd2cSJim Jagielski                                 m_nDropDestination, sal_False, rEvt.mbDefault, &aDocPt, nRet))
261*b1cdbd2cSJim Jagielski //!!    nRet = SFX_APP()->ExecuteDrop( rEvt );
262*b1cdbd2cSJim Jagielski 		nRet = DND_ACTION_NONE;
263*b1cdbd2cSJim Jagielski 	else if ( SW_MOD()->pDragDrop )
264*b1cdbd2cSJim Jagielski 		//Bei internem D&D nicht mehr aufraeumen!
265*b1cdbd2cSJim Jagielski 		SW_MOD()->pDragDrop->SetCleanUp( sal_False );
266*b1cdbd2cSJim Jagielski 
267*b1cdbd2cSJim Jagielski 	return nRet;
268*b1cdbd2cSJim Jagielski }
269*b1cdbd2cSJim Jagielski 
270*b1cdbd2cSJim Jagielski 
GetDropDestination(const Point & rPixPnt,SdrObject ** ppObj)271*b1cdbd2cSJim Jagielski sal_uInt16 SwEditWin::GetDropDestination( const Point& rPixPnt, SdrObject ** ppObj )
272*b1cdbd2cSJim Jagielski {
273*b1cdbd2cSJim Jagielski     SwWrtShell &rSh = rView.GetWrtShell();
274*b1cdbd2cSJim Jagielski     const Point aDocPt( PixelToLogic( rPixPnt ) );
275*b1cdbd2cSJim Jagielski     if( rSh.ChgCurrPam( aDocPt )
276*b1cdbd2cSJim Jagielski         || rSh.IsOverReadOnlyPos( aDocPt )
277*b1cdbd2cSJim Jagielski         || rSh.DocPtInsideInputFld( aDocPt ) )
278*b1cdbd2cSJim Jagielski         return 0;
279*b1cdbd2cSJim Jagielski 
280*b1cdbd2cSJim Jagielski     SdrObject *pObj = NULL;
281*b1cdbd2cSJim Jagielski     const ObjCntType eType = rSh.GetObjCntType( aDocPt, pObj );
282*b1cdbd2cSJim Jagielski 
283*b1cdbd2cSJim Jagielski 	//Drop auf OutlinerView (TextEdit im Drawing) soll diese selbst entscheiden!
284*b1cdbd2cSJim Jagielski 	if( pObj )
285*b1cdbd2cSJim Jagielski 	{
286*b1cdbd2cSJim Jagielski 		OutlinerView* pOLV = rSh.GetDrawView()->GetTextEditOutlinerView();
287*b1cdbd2cSJim Jagielski 		if ( pOLV )
288*b1cdbd2cSJim Jagielski 		{
289*b1cdbd2cSJim Jagielski 			Rectangle aRect( pOLV->GetOutputArea() );
290*b1cdbd2cSJim Jagielski 			aRect.Union( pObj->GetLogicRect() );
291*b1cdbd2cSJim Jagielski 			const Point aPos = pOLV->GetWindow()->PixelToLogic( rPixPnt );
292*b1cdbd2cSJim Jagielski 			if( aRect.IsInside( aPos ) )
293*b1cdbd2cSJim Jagielski 				return 0;
294*b1cdbd2cSJim Jagielski 		}
295*b1cdbd2cSJim Jagielski 	}
296*b1cdbd2cSJim Jagielski 
297*b1cdbd2cSJim Jagielski 	//Auf was wollen wir denn gerade droppen?
298*b1cdbd2cSJim Jagielski 	sal_uInt16 nDropDestination = 0;
299*b1cdbd2cSJim Jagielski 
300*b1cdbd2cSJim Jagielski 	//Sonst etwas aus der DrawingEngine getroffen?
301*b1cdbd2cSJim Jagielski 	if( OBJCNT_NONE != eType )
302*b1cdbd2cSJim Jagielski 	{
303*b1cdbd2cSJim Jagielski 		switch ( eType )
304*b1cdbd2cSJim Jagielski 		{
305*b1cdbd2cSJim Jagielski 		case OBJCNT_GRF:
306*b1cdbd2cSJim Jagielski 			{
307*b1cdbd2cSJim Jagielski 				sal_Bool bLink,
308*b1cdbd2cSJim Jagielski 					bIMap = 0 != rSh.GetFmtFromObj( aDocPt )->GetURL().GetMap();
309*b1cdbd2cSJim Jagielski 				String aDummy;
310*b1cdbd2cSJim Jagielski 				rSh.GetGrfAtPos( aDocPt, aDummy, bLink );
311*b1cdbd2cSJim Jagielski 				if ( bLink && bIMap )
312*b1cdbd2cSJim Jagielski 					nDropDestination = EXCHG_DEST_DOC_LNKD_GRAPH_W_IMAP;
313*b1cdbd2cSJim Jagielski 				else if ( bLink )
314*b1cdbd2cSJim Jagielski 					nDropDestination = EXCHG_DEST_DOC_LNKD_GRAPHOBJ;
315*b1cdbd2cSJim Jagielski 				else if ( bIMap )
316*b1cdbd2cSJim Jagielski 					nDropDestination = EXCHG_DEST_DOC_GRAPH_W_IMAP;
317*b1cdbd2cSJim Jagielski 				else
318*b1cdbd2cSJim Jagielski 					nDropDestination = EXCHG_DEST_DOC_GRAPHOBJ;
319*b1cdbd2cSJim Jagielski 			}
320*b1cdbd2cSJim Jagielski 			break;
321*b1cdbd2cSJim Jagielski 		case OBJCNT_FLY:
322*b1cdbd2cSJim Jagielski 			if( rSh.GetView().GetDocShell()->ISA(SwWebDocShell) )
323*b1cdbd2cSJim Jagielski 				nDropDestination = EXCHG_DEST_DOC_TEXTFRAME_WEB;
324*b1cdbd2cSJim Jagielski 			else
325*b1cdbd2cSJim Jagielski 				nDropDestination = EXCHG_DEST_DOC_TEXTFRAME;
326*b1cdbd2cSJim Jagielski 			break;
327*b1cdbd2cSJim Jagielski 		case OBJCNT_OLE:		nDropDestination = EXCHG_DEST_DOC_OLEOBJ; break;
328*b1cdbd2cSJim Jagielski 		case OBJCNT_CONTROL:	/* no Action avail */
329*b1cdbd2cSJim Jagielski 		case OBJCNT_SIMPLE:		nDropDestination = EXCHG_DEST_DOC_DRAWOBJ; break;
330*b1cdbd2cSJim Jagielski 		case OBJCNT_URLBUTTON:	nDropDestination = EXCHG_DEST_DOC_URLBUTTON; break;
331*b1cdbd2cSJim Jagielski 		case OBJCNT_GROUPOBJ:	nDropDestination = EXCHG_DEST_DOC_GROUPOBJ;		break;
332*b1cdbd2cSJim Jagielski 
333*b1cdbd2cSJim Jagielski 		default: ASSERT( !this, "new ObjectType?" );
334*b1cdbd2cSJim Jagielski 		}
335*b1cdbd2cSJim Jagielski 	}
336*b1cdbd2cSJim Jagielski 	if ( !nDropDestination )
337*b1cdbd2cSJim Jagielski 	{
338*b1cdbd2cSJim Jagielski 		if( rSh.GetView().GetDocShell()->ISA(SwWebDocShell) )
339*b1cdbd2cSJim Jagielski 			nDropDestination = EXCHG_DEST_SWDOC_FREE_AREA_WEB;
340*b1cdbd2cSJim Jagielski 		else
341*b1cdbd2cSJim Jagielski 			nDropDestination = EXCHG_DEST_SWDOC_FREE_AREA;
342*b1cdbd2cSJim Jagielski 	}
343*b1cdbd2cSJim Jagielski 	if( ppObj )
344*b1cdbd2cSJim Jagielski 		*ppObj = pObj;
345*b1cdbd2cSJim Jagielski 	return nDropDestination;
346*b1cdbd2cSJim Jagielski }
347*b1cdbd2cSJim Jagielski 
AcceptDrop(const AcceptDropEvent & rEvt)348*b1cdbd2cSJim Jagielski sal_Int8 SwEditWin::AcceptDrop( const AcceptDropEvent& rEvt )
349*b1cdbd2cSJim Jagielski {
350*b1cdbd2cSJim Jagielski 	if( rEvt.mbLeaving )
351*b1cdbd2cSJim Jagielski 	{
352*b1cdbd2cSJim Jagielski 		DropCleanup();
353*b1cdbd2cSJim Jagielski 		return rEvt.mnAction;
354*b1cdbd2cSJim Jagielski 	}
355*b1cdbd2cSJim Jagielski 
356*b1cdbd2cSJim Jagielski 	if( rView.GetDocShell()->IsReadOnly() )
357*b1cdbd2cSJim Jagielski 		return DND_ACTION_NONE;
358*b1cdbd2cSJim Jagielski 
359*b1cdbd2cSJim Jagielski 	SwWrtShell &rSh = rView.GetWrtShell();
360*b1cdbd2cSJim Jagielski 
361*b1cdbd2cSJim Jagielski 	Point aPixPt( rEvt.maPosPixel );
362*b1cdbd2cSJim Jagielski 
363*b1cdbd2cSJim Jagielski 	// If the cursor is near the inner boundary
364*b1cdbd2cSJim Jagielski 	// we attempt to scroll towards the desired direction.
365*b1cdbd2cSJim Jagielski 	Point aPoint;
366*b1cdbd2cSJim Jagielski 	Rectangle aWin(aPoint,GetOutputSizePixel());
367*b1cdbd2cSJim Jagielski 	const int nMargin = 10;
368*b1cdbd2cSJim Jagielski 	aWin.Left() += nMargin;
369*b1cdbd2cSJim Jagielski 	aWin.Top() += nMargin;
370*b1cdbd2cSJim Jagielski 	aWin.Right() -= nMargin;
371*b1cdbd2cSJim Jagielski 	aWin.Bottom() -= nMargin;
372*b1cdbd2cSJim Jagielski 	if(!aWin.IsInside(aPixPt)) {
373*b1cdbd2cSJim Jagielski 		static sal_uLong last_tick = 0;
374*b1cdbd2cSJim Jagielski 		sal_uLong current_tick = Time::GetSystemTicks();
375*b1cdbd2cSJim Jagielski 		if((current_tick-last_tick) > 500) {
376*b1cdbd2cSJim Jagielski 			last_tick = current_tick;
377*b1cdbd2cSJim Jagielski 			if(!bOldIdleSet) {
378*b1cdbd2cSJim Jagielski 				bOldIdle = rSh.GetViewOptions()->IsIdle();
379*b1cdbd2cSJim Jagielski 				((SwViewOption *)rSh.GetViewOptions())->SetIdle(sal_False);
380*b1cdbd2cSJim Jagielski 				bOldIdleSet = sal_True;
381*b1cdbd2cSJim Jagielski 			}
382*b1cdbd2cSJim Jagielski 			CleanupDropUserMarker();
383*b1cdbd2cSJim Jagielski 			if(aPixPt.X() > aWin.Right()) aPixPt.X() += nMargin;
384*b1cdbd2cSJim Jagielski 			if(aPixPt.X() < aWin.Left()) aPixPt.X() -= nMargin;
385*b1cdbd2cSJim Jagielski 			if(aPixPt.Y() > aWin.Bottom()) aPixPt.Y() += nMargin;
386*b1cdbd2cSJim Jagielski 			if(aPixPt.Y() < aWin.Top()) aPixPt.Y() -= nMargin;
387*b1cdbd2cSJim Jagielski 			Point aDocPt(PixelToLogic(aPixPt));
388*b1cdbd2cSJim Jagielski 			SwRect rect(aDocPt,Size(1,1));
389*b1cdbd2cSJim Jagielski 			rSh.MakeVisible(rect);
390*b1cdbd2cSJim Jagielski 		}
391*b1cdbd2cSJim Jagielski 	}
392*b1cdbd2cSJim Jagielski 
393*b1cdbd2cSJim Jagielski 	if(bOldIdleSet) {
394*b1cdbd2cSJim Jagielski 		((SwViewOption *)rSh.GetViewOptions())->SetIdle( bOldIdle );
395*b1cdbd2cSJim Jagielski 		bOldIdleSet = sal_False;
396*b1cdbd2cSJim Jagielski 	}
397*b1cdbd2cSJim Jagielski 
398*b1cdbd2cSJim Jagielski 	SdrObject *pObj = NULL;
399*b1cdbd2cSJim Jagielski     m_nDropDestination = GetDropDestination( aPixPt, &pObj );
400*b1cdbd2cSJim Jagielski     if( !m_nDropDestination )
401*b1cdbd2cSJim Jagielski 		return DND_ACTION_NONE;
402*b1cdbd2cSJim Jagielski 
403*b1cdbd2cSJim Jagielski 	sal_uInt16 nEventAction;
404*b1cdbd2cSJim Jagielski 	sal_Int8 nUserOpt = rEvt.mbDefault ? EXCHG_IN_ACTION_DEFAULT
405*b1cdbd2cSJim Jagielski 									   : rEvt.mnAction;
406*b1cdbd2cSJim Jagielski 
407*b1cdbd2cSJim Jagielski     m_nDropAction = SotExchange::GetExchangeAction(
408*b1cdbd2cSJim Jagielski 								GetDataFlavorExVector(),
409*b1cdbd2cSJim Jagielski                                 m_nDropDestination,
410*b1cdbd2cSJim Jagielski 								rEvt.mnAction,
411*b1cdbd2cSJim Jagielski //!!								rEvt.GetSourceOptions(),
412*b1cdbd2cSJim Jagielski                                 nUserOpt, m_nDropFormat, nEventAction );
413*b1cdbd2cSJim Jagielski 
414*b1cdbd2cSJim Jagielski     if( EXCHG_INOUT_ACTION_NONE != m_nDropAction )
415*b1cdbd2cSJim Jagielski 	{
416*b1cdbd2cSJim Jagielski 		const Point aDocPt( PixelToLogic( aPixPt ) );
417*b1cdbd2cSJim Jagielski 
418*b1cdbd2cSJim Jagielski 		//Bei den default Aktionen wollen wir noch ein bischen mitreden.
419*b1cdbd2cSJim Jagielski 		SwModule *pMod = SW_MOD();
420*b1cdbd2cSJim Jagielski 		if( pMod->pDragDrop )
421*b1cdbd2cSJim Jagielski 		{
422*b1cdbd2cSJim Jagielski 			sal_Bool bCleanup = sal_False;
423*b1cdbd2cSJim Jagielski 			//Zeichenobjekte in Kopf-/Fusszeilen sind nicht erlaubt
424*b1cdbd2cSJim Jagielski 
425*b1cdbd2cSJim Jagielski 			SwWrtShell *pSrcSh = pMod->pDragDrop->GetShell();
426*b1cdbd2cSJim Jagielski 			if( (pSrcSh->GetSelFrmType() == FRMTYPE_DRAWOBJ) &&
427*b1cdbd2cSJim Jagielski                 pSrcSh->IsSelContainsControl() &&
428*b1cdbd2cSJim Jagielski 				 (rSh.GetFrmType( &aDocPt, sal_False ) & (FRMTYPE_HEADER|FRMTYPE_FOOTER)) )
429*b1cdbd2cSJim Jagielski 			{
430*b1cdbd2cSJim Jagielski 				bCleanup = sal_True;
431*b1cdbd2cSJim Jagielski 			}
432*b1cdbd2cSJim Jagielski 			// keine positionsgeschuetzten Objecte verschieben!
433*b1cdbd2cSJim Jagielski 			else if( DND_ACTION_MOVE == rEvt.mnAction &&
434*b1cdbd2cSJim Jagielski 					 pSrcSh->IsSelObjProtected( FLYPROTECT_POS ) )
435*b1cdbd2cSJim Jagielski 			{
436*b1cdbd2cSJim Jagielski 				bCleanup = sal_True;
437*b1cdbd2cSJim Jagielski 			}
438*b1cdbd2cSJim Jagielski 			else if( rEvt.mbDefault )
439*b1cdbd2cSJim Jagielski 			{
440*b1cdbd2cSJim Jagielski 				// JP 13.08.98: internes Drag&Drop: bei gleichem Doc ein Move
441*b1cdbd2cSJim Jagielski 				//				ansonten ein Copy - Task 54974
442*b1cdbd2cSJim Jagielski 				nEventAction = pSrcSh->GetDoc() == rSh.GetDoc()
443*b1cdbd2cSJim Jagielski 									? DND_ACTION_MOVE
444*b1cdbd2cSJim Jagielski 									: DND_ACTION_COPY;
445*b1cdbd2cSJim Jagielski 			}
446*b1cdbd2cSJim Jagielski 			if ( bCleanup )
447*b1cdbd2cSJim Jagielski 			{
448*b1cdbd2cSJim Jagielski 				CleanupDropUserMarker();
449*b1cdbd2cSJim Jagielski 				rSh.UnSetVisCrsr();
450*b1cdbd2cSJim Jagielski 				return DND_ACTION_NONE;
451*b1cdbd2cSJim Jagielski 			}
452*b1cdbd2cSJim Jagielski 		}
453*b1cdbd2cSJim Jagielski 		else
454*b1cdbd2cSJim Jagielski 		{
455*b1cdbd2cSJim Jagielski 			//D&D von ausserhalb des SW soll per default ein Copy sein.
456*b1cdbd2cSJim Jagielski 			if( EXCHG_IN_ACTION_DEFAULT == nEventAction &&
457*b1cdbd2cSJim Jagielski 				DND_ACTION_MOVE == rEvt.mnAction )
458*b1cdbd2cSJim Jagielski 				nEventAction = DND_ACTION_COPY;
459*b1cdbd2cSJim Jagielski 
460*b1cdbd2cSJim Jagielski             if( (SOT_FORMATSTR_ID_SBA_FIELDDATAEXCHANGE == m_nDropFormat &&
461*b1cdbd2cSJim Jagielski                  EXCHG_IN_ACTION_LINK == m_nDropAction) ||
462*b1cdbd2cSJim Jagielski                  SOT_FORMATSTR_ID_SBA_CTRLDATAEXCHANGE == m_nDropFormat  )
463*b1cdbd2cSJim Jagielski 			{
464*b1cdbd2cSJim Jagielski 				SdrMarkView* pMView = PTR_CAST( SdrMarkView, rSh.GetDrawView() );
465*b1cdbd2cSJim Jagielski 				if( pMView && !pMView->IsDesignMode() )
466*b1cdbd2cSJim Jagielski 					return DND_ACTION_NONE;
467*b1cdbd2cSJim Jagielski 			}
468*b1cdbd2cSJim Jagielski 		}
469*b1cdbd2cSJim Jagielski 
470*b1cdbd2cSJim Jagielski 		if ( EXCHG_IN_ACTION_DEFAULT != nEventAction )
471*b1cdbd2cSJim Jagielski             nUserOpt = (sal_Int8)nEventAction;
472*b1cdbd2cSJim Jagielski 
473*b1cdbd2cSJim Jagielski 		// show DropCursor or UserMarker ?
474*b1cdbd2cSJim Jagielski         if( EXCHG_DEST_SWDOC_FREE_AREA_WEB == m_nDropDestination ||
475*b1cdbd2cSJim Jagielski             EXCHG_DEST_SWDOC_FREE_AREA == m_nDropDestination )
476*b1cdbd2cSJim Jagielski 		{
477*b1cdbd2cSJim Jagielski 			CleanupDropUserMarker();
478*b1cdbd2cSJim Jagielski             SwContentAtPos aCont( SwContentAtPos::SW_CONTENT_CHECK );
479*b1cdbd2cSJim Jagielski             if(rSh.GetContentAtPos(aDocPt, aCont))
480*b1cdbd2cSJim Jagielski                 rSh.SwCrsrShell::SetVisCrsr( aDocPt );
481*b1cdbd2cSJim Jagielski 		}
482*b1cdbd2cSJim Jagielski 		else
483*b1cdbd2cSJim Jagielski 		{
484*b1cdbd2cSJim Jagielski 			rSh.UnSetVisCrsr();
485*b1cdbd2cSJim Jagielski 
486*b1cdbd2cSJim Jagielski 			if ( pUserMarkerObj != pObj )
487*b1cdbd2cSJim Jagielski 			{
488*b1cdbd2cSJim Jagielski 				CleanupDropUserMarker();
489*b1cdbd2cSJim Jagielski 				pUserMarkerObj = pObj;
490*b1cdbd2cSJim Jagielski 
491*b1cdbd2cSJim Jagielski 				if(pUserMarkerObj)
492*b1cdbd2cSJim Jagielski 				{
493*b1cdbd2cSJim Jagielski 					pUserMarker = new SdrDropMarkerOverlay( *rSh.GetDrawView(), *pUserMarkerObj );
494*b1cdbd2cSJim Jagielski 				}
495*b1cdbd2cSJim Jagielski 			}
496*b1cdbd2cSJim Jagielski 		}
497*b1cdbd2cSJim Jagielski 		return nUserOpt;
498*b1cdbd2cSJim Jagielski 	}
499*b1cdbd2cSJim Jagielski 
500*b1cdbd2cSJim Jagielski 	CleanupDropUserMarker();
501*b1cdbd2cSJim Jagielski 	rSh.UnSetVisCrsr();
502*b1cdbd2cSJim Jagielski //!!    return SFX_APP()->AcceptDrop( rEvt );
503*b1cdbd2cSJim Jagielski 	return DND_ACTION_NONE;
504*b1cdbd2cSJim Jagielski }
505*b1cdbd2cSJim Jagielski 
506*b1cdbd2cSJim Jagielski 
IMPL_LINK(SwEditWin,DDHandler,Timer *,EMPTYARG)507*b1cdbd2cSJim Jagielski IMPL_LINK( SwEditWin, DDHandler, Timer *, EMPTYARG )
508*b1cdbd2cSJim Jagielski {
509*b1cdbd2cSJim Jagielski 	bDDTimerStarted = sal_False;
510*b1cdbd2cSJim Jagielski 	aTimer.Stop();
511*b1cdbd2cSJim Jagielski 	aTimer.SetTimeout(240);
512*b1cdbd2cSJim Jagielski 	bMBPressed = sal_False;
513*b1cdbd2cSJim Jagielski 	ReleaseMouse();
514*b1cdbd2cSJim Jagielski 	bFrmDrag = sal_False;
515*b1cdbd2cSJim Jagielski 
516*b1cdbd2cSJim Jagielski 	if ( rView.GetViewFrame() )
517*b1cdbd2cSJim Jagielski 	{
518*b1cdbd2cSJim Jagielski 		bExecuteDrag = sal_True;
519*b1cdbd2cSJim Jagielski 		StartExecuteDrag();
520*b1cdbd2cSJim Jagielski 	}
521*b1cdbd2cSJim Jagielski 	return 0;
522*b1cdbd2cSJim Jagielski }
523*b1cdbd2cSJim Jagielski 
524*b1cdbd2cSJim Jagielski 
525*b1cdbd2cSJim Jagielski 
526