1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 #include "precompiled_reportdesign.hxx"
28 #include <vcl/scrbar.hxx>
29 #include <vcl/svapp.hxx>
30 #include <vcl/seleng.hxx>
31 #include <com/sun/star/linguistic2/XSpellChecker1.hpp>
32 #include <com/sun/star/embed/EmbedStates.hpp>
33 #include <com/sun/star/beans/XPropertySet.hpp>
34 
35 #include <svx/svdview.hxx>
36 #include <svx/svdpagv.hxx>
37 #include <editeng/outlobj.hxx>
38 #include <editeng/unolingu.hxx>
39 #include <svx/svdetc.hxx>
40 #include <editeng/editstat.hxx>
41 #include <svx/svdoutl.hxx>
42 #include <svx/svddrgmt.hxx>
43 #include <svx/svdoashp.hxx>
44 #include <svx/svxids.hrc>
45 #include <svx/svditer.hxx>
46 
47 #include <toolkit/helper/vclunohelper.hxx>
48 
49 #include "dlgedfunc.hxx"
50 #include "ReportSection.hxx"
51 #include "DesignView.hxx"
52 #include "ReportController.hxx"
53 #include "SectionView.hxx"
54 #include "ViewsWindow.hxx"
55 #include "ReportWindow.hxx"
56 #include "RptObject.hxx"
57 #include "ScrollHelper.hxx"
58 
59 #include "ReportRuler.hxx"
60 #include "UITools.hxx"
61 
62 #include <uistrings.hrc>
63 #include "UndoEnv.hxx"
64 #include <RptModel.hxx>
65 #include <tools/diagnose_ex.h>
66 
67 #define DEFAUL_MOVE_SIZE    100
68 namespace rptui
69 {
70 using namespace ::com::sun::star;
71 //----------------------------------------------------------------------------
72 
73 //----------------------------------------------------------------------------
74 
75 IMPL_LINK( DlgEdFunc, ScrollTimeout, Timer *,  )
76 {
77 	ForceScroll( m_pParent->PixelToLogic( m_pParent->GetPointerPosPixel() ) );
78 	return 0;
79 }
80 
81 //----------------------------------------------------------------------------
82 
83 void DlgEdFunc::ForceScroll( const Point& rPos )
84 {
85 	aScrollTimer.Stop();
86 
87 	OReportWindow* pReportWindow = m_pParent->getSectionWindow()->getViewsWindow()->getView();
88 	OScrollWindowHelper* pScrollWindow = pReportWindow->getScrollWindow();
89 
90 	Size aOut = pReportWindow->GetOutputSizePixel();
91     Fraction aStartWidth(long(REPORT_STARTMARKER_WIDTH));
92     aStartWidth *= m_pParent->GetMapMode().GetScaleX();
93 
94 	aOut.Width() -= (long)aStartWidth;
95     aOut.Height() = m_pParent->GetOutputSizePixel().Height();
96 
97     Point aPos = pScrollWindow->getThumbPos();
98     aPos.X() *= 0.5;
99     aPos.Y() *= 0.5;
100 	Rectangle aOutRect( aPos, aOut );
101 	aOutRect = m_pParent->PixelToLogic( aOutRect );
102 	//Rectangle aWorkArea = m_pParent->getView()->GetWorkArea();
103     Point aGcc3WorkaroundTemporary;
104     Rectangle aWorkArea(aGcc3WorkaroundTemporary,pScrollWindow->getTotalSize());
105     aWorkArea.Right() -= (long)aStartWidth;
106 	aWorkArea = pScrollWindow->PixelToLogic( aWorkArea );
107 	if( !aOutRect.IsInside( rPos ) && aWorkArea.IsInside( rPos ) )
108 	{
109 		ScrollBar* pHScroll = pScrollWindow->GetHScroll();
110 		ScrollBar* pVScroll = pScrollWindow->GetVScroll();
111 		ScrollType eH = SCROLL_LINEDOWN,eV = SCROLL_LINEDOWN;
112 		if( rPos.X() < aOutRect.Left() )
113             eH = SCROLL_LINEUP;
114 		else if( rPos.X() <= aOutRect.Right() )
115 			eH = SCROLL_DONTKNOW;
116 
117 		if( rPos.Y() < aOutRect.Top() )
118 			eV = SCROLL_LINEUP;
119 		else if( rPos.Y() <= aOutRect.Bottom() )
120 			eV = SCROLL_DONTKNOW;
121 
122         pHScroll->DoScrollAction(eH);
123         pVScroll->DoScrollAction(eV);
124 	}
125 
126 	aScrollTimer.Start();
127 }
128 
129 //----------------------------------------------------------------------------
130 
131 DlgEdFunc::DlgEdFunc( OReportSection* _pParent )
132 :m_pParent(_pParent),
133  m_rView(_pParent->getSectionView()),
134  m_xOverlappingObj(NULL),
135  m_pOverlappingObj(NULL),
136  m_bSelectionMode(false),
137  m_bUiActive(false),
138  m_bShowPropertyBrowser(false)
139 {
140 	// m_pParent = _pParent;
141 	aScrollTimer.SetTimeoutHdl( LINK( this, DlgEdFunc, ScrollTimeout ) );
142     m_rView.SetActualWin( m_pParent);
143 	aScrollTimer.SetTimeout( SELENG_AUTOREPEAT_INTERVAL );
144 }
145 
146 //----------------------------------------------------------------------------
147 void DlgEdFunc::setOverlappedControlColor(sal_Int32 _nColor)
148 {
149     m_nOverlappedControlColor = _nColor;
150 }
151 // -----------------------------------------------------------------------------
152 sal_Int32 lcl_setColorOfObject(uno::Reference< uno::XInterface > _xObj, long _nColorTRGB)
153 {
154     sal_Int32 nBackColor = 0;
155     try
156     {
157         uno::Reference<report::XReportComponent> xComponent(_xObj, uno::UNO_QUERY_THROW);
158         // NOT NEED if UNO_QUERY_THROW:
159 		// if (xComponent.is())
160         // {
161         uno::Reference< beans::XPropertySet > xProp(xComponent, uno::UNO_QUERY_THROW);
162         // if (xProp.is())
163         // {
164 		// ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ControlBackground"))
165 		// is PROPERTY_CONTROLBACKGROUND
166 		uno::Any aAny = xProp->getPropertyValue(PROPERTY_CONTROLBACKGROUND);
167         if (aAny.hasValue())
168         {
169             aAny >>= nBackColor;
170             // try to set background color at the ReportComponent
171             uno::Any aBlackColorAny = uno::makeAny(_nColorTRGB);
172             xProp->setPropertyValue(PROPERTY_CONTROLBACKGROUND, aBlackColorAny);
173         }
174         // aCopies.push_back(xComponent->createClone());
175     }
176     catch(uno::Exception&)
177     {
178         // bit my shiny metal as!
179         // OSL_ENSURE(0,"Can't copy report elements!");
180     }
181     return nBackColor;
182 }
183 // -----------------------------------------------------------------------------
184 DlgEdFunc::~DlgEdFunc()
185 {
186 	unColorizeOverlappedObj();
187 	aScrollTimer.Stop();
188 }
189 
190 //----------------------------------------------------------------------------
191 
192 sal_Bool DlgEdFunc::MouseButtonDown( const MouseEvent& rMEvt )
193 {
194     m_aMDPos = m_pParent->PixelToLogic( rMEvt.GetPosPixel() );
195 	m_pParent->GrabFocus();
196     sal_Bool bHandled = sal_False;
197     if ( rMEvt.IsLeft() )
198     {
199         if ( rMEvt.GetClicks() > 1 )
200         {
201             // show property browser
202 		    if ( m_pParent->GetMode() != RPTUI_READONLY )
203             {
204                 uno::Sequence<beans::PropertyValue> aArgs(1);
205                 aArgs[0].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ShowProperties"));
206                 aArgs[0].Value <<= sal_True;
207                 m_pParent->getSectionWindow()->getViewsWindow()->getView()->getReportView()->getController().executeUnChecked(SID_SHOW_PROPERTYBROWSER,aArgs);
208                 m_pParent->getSectionWindow()->getViewsWindow()->getView()->getReportView()->UpdatePropertyBrowserDelayed(m_rView);
209                 // TODO character in shapes
210                 //    SdrViewEvent aVEvt;
211                 // m_rView.PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);
212                 //    if ( aVEvt.pRootObj && aVEvt.pRootObj->ISA(SdrTextObj) )
213                 //        SetInEditMode(static_cast<SdrTextObj *>(aVEvt.pRootObj),rMEvt, sal_False);
214                 bHandled = sal_True;
215             }
216         }
217         else
218         {
219             SdrHdl* pHdl = m_rView.PickHandle(m_aMDPos);
220             //m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(m_pView);
221 
222 	        // if selected object was hit, drag object
223 	        if ( pHdl!=NULL || m_rView.IsMarkedHit(m_aMDPos) )
224             {
225                 bHandled = sal_True;
226                 m_pParent->CaptureMouse();
227 		        m_pParent->getSectionWindow()->getViewsWindow()->BegDragObj(m_aMDPos, pHdl,&m_rView);
228             }
229         }
230     }
231     else if ( rMEvt.IsRight() && !rMEvt.IsLeft() && rMEvt.GetClicks() == 1 ) // mark object when context menu was selected
232     {
233         SdrPageView* pPV = m_rView.GetSdrPageView();
234 		SdrViewEvent aVEvt;
235 		if ( m_rView.PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt) != SDRHIT_MARKEDOBJECT && !rMEvt.IsShift() )
236             m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(NULL);
237         if ( aVEvt.pRootObj )
238 		    m_rView.MarkObj(aVEvt.pRootObj, pPV);
239         else
240             m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(NULL);
241 
242         bHandled = sal_True;
243     }
244     else if( !rMEvt.IsLeft() )
245 		bHandled = sal_True;
246     if ( !bHandled )
247         m_pParent->CaptureMouse();
248     return bHandled;
249 }
250 
251 //----------------------------------------------------------------------------
252 
253 sal_Bool DlgEdFunc::MouseButtonUp( const MouseEvent& /*rMEvt*/ )
254 {
255     sal_Bool bHandled = sal_False;
256 	m_pParent->getSectionWindow()->getViewsWindow()->stopScrollTimer();
257 	return bHandled;
258 }
259 // -----------------------------------------------------------------------------
260 void DlgEdFunc::checkTwoCklicks(const MouseEvent& rMEvt)
261 {
262     deactivateOle();
263 
264     const sal_uInt16 nClicks = rMEvt.GetClicks();
265 	if ( nClicks == 2 && rMEvt.IsLeft() )
266 	{
267 		if ( m_rView.AreObjectsMarked() )
268 		{
269 			const SdrMarkList& rMarkList = m_rView.GetMarkedObjectList();
270 			if (rMarkList.GetMarkCount() == 1)
271 			{
272 				const SdrMark* pMark = rMarkList.GetMark(0);
273 				SdrObject* pObj = pMark->GetMarkedSdrObj();
274 				activateOle(pObj);
275             } // if (rMarkList.GetMarkCount() == 1)
276         } // if ( pView->AreObjectsMarked() )
277     }
278 }
279 // -----------------------------------------------------------------------------
280 void DlgEdFunc::stopScrollTimer()
281 {
282     unColorizeOverlappedObj();
283     aScrollTimer.Stop();
284     if ( m_pParent->IsMouseCaptured() )
285         m_pParent->ReleaseMouse();
286 }
287 //----------------------------------------------------------------------------
288 
289 sal_Bool DlgEdFunc::MouseMove( const MouseEvent& /*rMEvt*/ )
290 {
291 	return sal_False;
292 }
293 //------------------------------------------------------------------------------
294 sal_Bool DlgEdFunc::handleKeyEvent(const KeyEvent& _rEvent)
295 {
296 	sal_Bool bReturn = sal_False;
297 
298     if ( !m_bUiActive )
299     {
300         const KeyCode& rCode = _rEvent.GetKeyCode();
301 	    sal_uInt16 nCode = rCode.GetCode();
302 
303 		switch ( nCode )
304 		{
305 			case KEY_ESCAPE:
306 			{
307 				if ( m_pParent->getSectionWindow()->getViewsWindow()->IsAction() )
308 				{
309 					m_pParent->getSectionWindow()->getViewsWindow()->BrkAction();
310 					bReturn = sal_True;
311 				}
312     	        else if ( m_rView.IsTextEdit() )
313 	    	    {
314 		    		m_rView.SdrEndTextEdit();
315 		        	bReturn = sal_True;
316 	            }
317 				else if ( m_rView.AreObjectsMarked() )
318 				{
319 					const SdrHdlList& rHdlList = m_rView.GetHdlList();
320 					SdrHdl* pHdl = rHdlList.GetFocusHdl();
321 					if ( pHdl )
322 						((SdrHdlList&)rHdlList).ResetFocusHdl();
323 					else
324             	        m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(NULL);
325 						//m_rView.UnmarkAll();
326 
327 				    deactivateOle(true);
328 					bReturn = sal_False;
329 				}
330                 else
331                 {
332                     deactivateOle(true);
333                 }
334 			}
335 			break;
336 			case KEY_TAB:
337 			{
338 				if ( !rCode.IsMod1() && !rCode.IsMod2() )
339 				{
340 					// mark next object
341 					if ( !m_rView.MarkNextObj( !rCode.IsShift() ) )
342 					{
343 						// if no next object, mark first/last
344 						m_rView.UnmarkAllObj();
345 						m_rView.MarkNextObj( !rCode.IsShift() );
346 					}
347 
348 					if ( m_rView.AreObjectsMarked() )
349 						m_rView.MakeVisible( m_rView.GetAllMarkedRect(), *m_pParent);
350 
351 					bReturn = sal_True;
352 				}
353 				else if ( rCode.IsMod1() && rCode.IsMod2())
354 				{
355 					// selected handle
356 					const SdrHdlList& rHdlList = m_rView.GetHdlList();
357 					((SdrHdlList&)rHdlList).TravelFocusHdl( !rCode.IsShift() );
358 
359 					// guarantee visibility of focused handle
360 					SdrHdl* pHdl = rHdlList.GetFocusHdl();
361 					if ( pHdl )
362 					{
363 						Point aHdlPosition( pHdl->GetPos() );
364 						Rectangle aVisRect( aHdlPosition - Point( DEFAUL_MOVE_SIZE, DEFAUL_MOVE_SIZE ), Size( 200, 200 ) );
365 						m_rView.MakeVisible( aVisRect, *m_pParent);
366 					}
367 
368 					bReturn = sal_True;
369 				}
370 			}
371 			break;
372 			case KEY_UP:
373 			case KEY_DOWN:
374 			case KEY_LEFT:
375 			case KEY_RIGHT:
376 			{
377     	        m_pParent->getSectionWindow()->getViewsWindow()->handleKey(rCode);
378 				bReturn = sal_True;
379 			}
380 			break;
381         	case KEY_RETURN:
382             	if ( !rCode.IsMod1() )
383                 {
384                     const SdrMarkList& rMarkList = m_rView.GetMarkedObjectList();
385                     if ( rMarkList.GetMarkCount() == 1 )
386                     {
387                         SdrObject* pObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj();
388                         activateOle(pObj);
389                     }
390                 }
391                 break;
392             case KEY_DELETE:
393                 if ( !rCode.IsMod1() && !rCode.IsMod2() )
394                 {
395                     bReturn = sal_True;
396                     break;
397                 } // if ( !rCode.IsMod1() && !rCode.IsMod2() )
398                 // run through
399 			default:
400 			{
401         	    bReturn = m_rView.KeyInput(_rEvent, m_pParent);
402 			}
403 			break;
404 		}
405 	}
406 
407 	if ( bReturn && m_pParent->IsMouseCaptured() )
408 		m_pParent->ReleaseMouse();
409 
410 	return bReturn;
411 }
412 // -----------------------------------------------------------------------------
413 void DlgEdFunc::activateOle(SdrObject* _pObj)
414 {
415     if ( _pObj )
416     {
417         const sal_uInt16 nSdrObjKind = _pObj->GetObjIdentifier();
418         //
419 	    //	OLE: activate
420 	    //
421 	    if (nSdrObjKind == OBJ_OLE2)
422 	    {
423             bool bIsInplaceOle = false;
424 		    if (!bIsInplaceOle)
425 		    {
426                 SdrOle2Obj* pOleObj = dynamic_cast<SdrOle2Obj*>(_pObj);
427                 if ( pOleObj->GetObjRef().is() )
428 			    {
429                     if (m_rView.IsTextEdit())
430 		            {
431 			            m_rView.SdrEndTextEdit();
432 		            }
433 
434                     pOleObj->AddOwnLightClient();
435                     pOleObj->SetWindow(VCLUnoHelper::GetInterface(m_pParent));
436                     try
437                     {
438                         pOleObj->GetObjRef()->changeState( embed::EmbedStates::UI_ACTIVE );
439                         m_bUiActive = true;
440                         OReportController& rController = m_pParent->getSectionWindow()->getViewsWindow()->getView()->getReportView()->getController();
441                         m_bShowPropertyBrowser = rController.isCommandChecked(SID_SHOW_PROPERTYBROWSER);
442                         if ( m_bShowPropertyBrowser )
443                             rController.executeChecked(SID_SHOW_PROPERTYBROWSER,uno::Sequence< beans::PropertyValue >());
444                     }
445                     catch( uno::Exception& )
446                     {
447                         DBG_UNHANDLED_EXCEPTION();
448                     }
449 			    }
450 		    }
451 	    } // if (nSdrObjKind == OBJ_OLE2)
452     } // if ( _pObj )
453 }
454 // -----------------------------------------------------------------------------
455 void DlgEdFunc::deactivateOle(bool _bSelect)
456 {
457     OLEObjCache& rObjCache = GetSdrGlobalData().GetOLEObjCache();
458     OReportController& rController = m_pParent->getSectionWindow()->getViewsWindow()->getView()->getReportView()->getController();
459     const sal_uLong nCount = rObjCache.Count();
460     for(sal_uLong i = 0 ; i< nCount;++i)
461     {
462         SdrOle2Obj* pObj = reinterpret_cast<SdrOle2Obj*>(rObjCache.GetObject(i));
463         if ( m_pParent->getPage() == pObj->GetPage() )
464         {
465             uno::Reference< embed::XEmbeddedObject > xObj = pObj->GetObjRef();
466             if ( xObj.is() && xObj->getCurrentState() == embed::EmbedStates::UI_ACTIVE )
467             {
468                 xObj->changeState( embed::EmbedStates::RUNNING );
469                 m_bUiActive = false;
470                 if ( m_bShowPropertyBrowser )
471                 {
472                     rController.executeChecked(SID_SHOW_PROPERTYBROWSER,uno::Sequence< beans::PropertyValue >());
473                 }
474 
475                 if ( _bSelect )
476                 {
477                     SdrPageView* pPV = m_rView.GetSdrPageView();
478 		            m_rView.MarkObj(pObj, pPV);
479                 }
480             } // if ( xObj.is() && xObj->getCurrentState() == embed::EmbedStates::UI_ACTIVE )
481         }
482     } // for(sal_uLong i = 0 ; i< nCount;++i)
483 }
484 // -----------------------------------------------------------------------------
485 void DlgEdFunc::colorizeOverlappedObject(SdrObject* _pOverlappedObj)
486 {
487 	OObjectBase* pObj = dynamic_cast<OObjectBase*>(_pOverlappedObj);
488 	if ( pObj )
489 	{
490         uno::Reference<report::XReportComponent> xComponent = pObj->getReportComponent();
491         if (xComponent.is() && xComponent != m_xOverlappingObj)
492         {
493 	        OReportModel* pRptModel = static_cast<OReportModel*>(_pOverlappedObj->GetModel());
494 		    if ( pRptModel )
495 			{
496 				OXUndoEnvironment::OUndoEnvLock aLock(pRptModel->GetUndoEnv());
497 
498 				// uncolorize an old object, if there is one
499 				unColorizeOverlappedObj();
500 
501 			    m_nOldColor = lcl_setColorOfObject(xComponent, m_nOverlappedControlColor);
502 				m_xOverlappingObj = xComponent;
503 				m_pOverlappingObj = _pOverlappedObj;
504 			}
505         }
506     }
507 }
508 // -----------------------------------------------------------------------------
509 void DlgEdFunc::unColorizeOverlappedObj()
510 {
511 	// uncolorize an old object, if there is one
512     if (m_xOverlappingObj.is())
513     {
514 		OReportModel* pRptModel = static_cast<OReportModel*>(m_pOverlappingObj->GetModel());
515 	    if ( pRptModel )
516 		{
517 			OXUndoEnvironment::OUndoEnvLock aLock(pRptModel->GetUndoEnv());
518 
519 			lcl_setColorOfObject(m_xOverlappingObj, m_nOldColor);
520 		    m_xOverlappingObj = NULL;
521 			m_pOverlappingObj = NULL;
522 		}
523     }
524 }
525 // -----------------------------------------------------------------------------
526 bool DlgEdFunc::isOverlapping(const MouseEvent& rMEvt)
527 {
528     bool bOverlapping = false;
529     SdrViewEvent aVEvt;
530 	bOverlapping = m_rView.PickAnything(rMEvt, SDRMOUSEBUTTONUP, aVEvt) != SDRHIT_NONE;
531 	if (bOverlapping && aVEvt.pObj)
532 	{
533 		colorizeOverlappedObject(aVEvt.pObj);
534 	}
535     else
536     {
537 		unColorizeOverlappedObj();
538     }
539 
540     return bOverlapping;
541 }
542 // -----------------------------------------------------------------------------
543 void DlgEdFunc::checkMovementAllowed(const MouseEvent& rMEvt)
544 {
545     if ( m_pParent->getSectionWindow()->getViewsWindow()->IsDragObj() )
546 	{
547         if ( isRectangleHit(rMEvt) )
548         {
549             // there is an other component under use, break action
550             m_pParent->getSectionWindow()->getViewsWindow()->BrkAction();
551         }
552 		// object was dragged
553         Point aPnt( m_pParent->PixelToLogic( rMEvt.GetPosPixel() ) );
554 		if (m_bSelectionMode)
555 		{
556 			m_pParent->getSectionWindow()->getViewsWindow()->EndAction();
557 		}
558 		else
559 		{
560 			bool bControlKeyPressed = rMEvt.IsMod1();
561 			// Don't allow points smaller 0
562 			if (bControlKeyPressed && (aPnt.Y() < 0))
563 			{
564 				aPnt.Y() = 0;
565 			}
566             if (m_rView.IsDragResize())
567             {
568                 // we resize the object don't resize to above sections
569                 if ( aPnt.Y() < 0 )
570                 {
571                     aPnt.Y() = 0;
572                 }
573             }
574             m_pParent->getSectionWindow()->getViewsWindow()->EndDragObj( bControlKeyPressed, &m_rView, aPnt );
575 		}
576 		m_pParent->getSectionWindow()->getViewsWindow()->ForceMarkedToAnotherPage();
577         m_pParent->Invalidate(INVALIDATE_CHILDREN);
578 	}
579     else
580 		m_pParent->getSectionWindow()->getViewsWindow()->EndAction();
581 }
582 // -----------------------------------------------------------------------------
583 bool DlgEdFunc::isOnlyCustomShapeMarked()
584 {
585 	bool bReturn = true;
586 	const SdrMarkList& rMarkList = m_rView.GetMarkedObjectList();
587     for (sal_uInt32 i =  0; i < rMarkList.GetMarkCount();++i )
588     {
589         SdrMark* pMark = rMarkList.GetMark(i);
590         // bCheck = dynamic_cast<OUnoObject*>(pMark->GetMarkedSdrObj()) != NULL;
591         SdrObject* pObj = pMark->GetMarkedSdrObj();
592 		if (pObj->GetObjIdentifier() != OBJ_CUSTOMSHAPE)
593 		{
594 			// we found an object in the marked objects, which is not a custom shape.
595 			bReturn = false;
596 			break;
597 		}
598 	}
599 	return bReturn;
600 }
601 // -----------------------------------------------------------------------------
602 bool DlgEdFunc::isRectangleHit(const MouseEvent& rMEvt)
603 {
604 	if (isOnlyCustomShapeMarked())
605 	{
606 		return false;
607 	}
608 
609 	SdrViewEvent aVEvt;
610 	const SdrHitKind eHit = m_rView.PickAnything(rMEvt, SDRMOUSEMOVE, aVEvt);
611     bool bIsSetPoint = (eHit == SDRHIT_UNMARKEDOBJECT);
612     if ( !bIsSetPoint )
613     {
614         // no drag rect, we have to check every single select rect
615         //const Rectangle& rRect = m_rView.GetDragStat().GetActionRect();
616         const SdrDragStat& rDragStat = m_rView.GetDragStat();
617 		if (rDragStat.GetDragMethod() != NULL)
618 		{
619             SdrObjListIter aIter(*m_pParent->getPage(),IM_DEEPNOGROUPS);
620             SdrObject* pObjIter = NULL;
621             // loop through all marked objects and check if there new rect overlapps an old one.
622             while( (pObjIter = aIter.Next()) != NULL && !bIsSetPoint)
623             {
624                 if ( m_rView.IsObjMarked(pObjIter)
625                      && (dynamic_cast<OUnoObject*>(pObjIter) != NULL || dynamic_cast<OOle2Obj*>(pObjIter) != NULL) )
626                 {
627                     Rectangle aNewRect = pObjIter->GetLastBoundRect();
628                     long nDx = rDragStat.IsHorFixed() ? 0 : rDragStat.GetDX();
629                     long nDy = rDragStat.IsVerFixed() ? 0 : rDragStat.GetDY();
630                     if ( (nDx + aNewRect.Left()) < 0 )
631                         nDx = -aNewRect.Left();
632                     if ( (nDy + aNewRect.Top()) < 0 )
633                         nDy = -aNewRect.Top();
634 
635 					if ( rDragStat.GetDragMethod()->getMoveOnly() )
636                         aNewRect.Move(nDx,nDy);
637                     else
638                         ::ResizeRect(aNewRect,rDragStat.GetRef1(),rDragStat.GetXFact(),rDragStat.GetYFact());
639 
640 
641 					SdrObject* pObjOverlapped = isOver(aNewRect,*m_pParent->getPage(),m_rView,false,pObjIter, ISOVER_IGNORE_CUSTOMSHAPES);
642 					bIsSetPoint = pObjOverlapped ? true : false;
643 					if (pObjOverlapped && !m_bSelectionMode)
644 					{
645 						colorizeOverlappedObject(pObjOverlapped);
646                     }
647                 }
648             }
649         }
650     }
651 	else if ( aVEvt.pObj && (aVEvt.pObj->GetObjIdentifier() != OBJ_CUSTOMSHAPE) && !m_bSelectionMode)
652 	{
653 		colorizeOverlappedObject(aVEvt.pObj);
654 	}
655     else
656         bIsSetPoint = false;
657     return bIsSetPoint;
658 }
659 // -----------------------------------------------------------------------------
660 bool DlgEdFunc::setMovementPointer(const MouseEvent& rMEvt)
661 {
662     bool bIsSetPoint = isRectangleHit(rMEvt);
663     if ( bIsSetPoint )
664         m_pParent->SetPointer( Pointer(POINTER_NOTALLOWED));
665 	else
666 	{
667 		bool bCtrlKey = rMEvt.IsMod1();
668 		(void)bCtrlKey;
669 		if (bCtrlKey)
670 		{
671 	        m_pParent->SetPointer( Pointer(POINTER_MOVEDATALINK ));
672 			bIsSetPoint = true;
673 		}
674 	}
675     return bIsSetPoint;
676 }
677 //----------------------------------------------------------------------------
678 
679 DlgEdFuncInsert::DlgEdFuncInsert( OReportSection* _pParent ) :
680 	DlgEdFunc( _pParent )
681 {
682 	m_rView.SetCreateMode( sal_True );
683 }
684 
685 //----------------------------------------------------------------------------
686 
687 DlgEdFuncInsert::~DlgEdFuncInsert()
688 {
689 	m_rView.SetEditMode( sal_True );
690 }
691 
692 //----------------------------------------------------------------------------
693 
694 sal_Bool DlgEdFuncInsert::MouseButtonDown( const MouseEvent& rMEvt )
695 {
696     if ( DlgEdFunc::MouseButtonDown(rMEvt) )
697         return sal_True;
698 
699     SdrViewEvent aVEvt;
700     sal_Int16 nId = m_rView.GetCurrentObjIdentifier();
701 
702 	const SdrHitKind eHit = m_rView.PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);
703 
704 // eHit == SDRHIT_UNMARKEDOBJECT under the mouse cursor is a unmarked object
705 
706     if (eHit == SDRHIT_UNMARKEDOBJECT &&
707         nId != OBJ_CUSTOMSHAPE)
708     {
709         // there is an object under the mouse cursor, but not a customshape
710         // rtl::OUString suWasN = m_rView.getInsertObjString();
711         // rtl::OUString suWasN2 = m_pParent->getSectionWindow()->getViewsWindow()->GetInsertObjString();
712 
713         m_pParent->getSectionWindow()->getViewsWindow()->BrkAction();
714         return sal_False;
715     }
716 
717     if( eHit != SDRHIT_UNMARKEDOBJECT || nId == OBJ_CUSTOMSHAPE)
718     {
719 	    // if no action, create object
720 	    if ( !m_pParent->getSectionWindow()->getViewsWindow()->IsAction() )
721         {
722             deactivateOle(true);
723             if ( m_pParent->getSectionWindow()->getViewsWindow()->HasSelection() )
724                 m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(&m_rView);
725 		    m_rView.BegCreateObj(m_aMDPos);
726             m_pParent->getSectionWindow()->getViewsWindow()->createDefault();
727         }
728     }
729     else
730     {
731         if( !rMEvt.IsShift() )
732         {
733             // shift key pressed?
734 			m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(NULL);
735         }
736 		m_pParent->getSectionWindow()->getViewsWindow()->BegMarkObj( m_aMDPos,&m_rView );
737     }
738 
739 	return sal_True;
740 }
741 
742 //----------------------------------------------------------------------------
743 sal_Bool DlgEdFuncInsert::MouseButtonUp( const MouseEvent& rMEvt )
744 {
745 	if ( DlgEdFunc::MouseButtonUp( rMEvt ) )
746         return sal_True;
747 
748 	const Point	aPos( m_pParent->PixelToLogic( rMEvt.GetPosPixel() ) );
749 	const sal_uInt16 nHitLog = sal_uInt16 ( m_pParent->PixelToLogic(Size(3,0)).Width() );
750 
751     sal_Bool bReturn = sal_True;
752 	// object creation active?
753 	if ( m_rView.IsCreateObj() )
754 	{
755         if ( isOver(m_rView.GetCreateObj(),*m_pParent->getPage(),m_rView) )
756         {
757             m_pParent->getSectionWindow()->getViewsWindow()->BrkAction();
758             // BrkAction disables the create mode
759             m_rView.SetCreateMode( sal_True );
760             return sal_True;
761         }
762 
763 		m_rView.EndCreateObj(SDRCREATE_FORCEEND);
764 
765 		if ( !m_rView.AreObjectsMarked() )
766 		{
767 			m_rView.MarkObj(aPos, nHitLog);
768 		}
769 
770 		bReturn = m_rView.AreObjectsMarked();
771         if ( bReturn )
772         {
773             OReportController& rController = m_pParent->getSectionWindow()->getViewsWindow()->getView()->getReportView()->getController();
774             const SdrMarkList& rMarkList = m_rView.GetMarkedObjectList();
775             for (sal_uInt32 i =  0; i < rMarkList.GetMarkCount();++i )
776             {
777                 SdrMark* pMark = rMarkList.GetMark(i);
778                 // bCheck = dynamic_cast<OUnoObject*>(pMark->GetMarkedSdrObj()) != NULL;
779                 OOle2Obj* pObj = dynamic_cast<OOle2Obj*>(pMark->GetMarkedSdrObj());
780 		        if ( pObj && !pObj->IsEmpty() )
781                 {
782                     pObj->initializeChart(rController.getModel());
783                 }
784             }
785         }
786 	}
787 	else
788         checkMovementAllowed(rMEvt);
789 
790 	if ( !m_rView.AreObjectsMarked() &&
791 		 Abs(m_aMDPos.X() - aPos.X()) < nHitLog &&
792 		 Abs(m_aMDPos.Y() - aPos.Y()) < nHitLog &&
793 		 !rMEvt.IsShift() && !rMEvt.IsMod2() )
794 	{
795 		SdrPageView* pPV = m_rView.GetSdrPageView();
796 		SdrViewEvent aVEvt;
797 		m_rView.PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);
798 		m_rView.MarkObj(aVEvt.pRootObj, pPV);
799 	} // ift() && !rMEvt.IsMod2() )
800     checkTwoCklicks(rMEvt);
801     m_pParent->getSectionWindow()->getViewsWindow()->getView()->getReportView()->UpdatePropertyBrowserDelayed(m_rView);
802     return bReturn;
803 }
804 
805 //----------------------------------------------------------------------------
806 
807 sal_Bool DlgEdFuncInsert::MouseMove( const MouseEvent& rMEvt )
808 {
809     if ( DlgEdFunc::MouseMove(rMEvt ) )
810         return sal_True;
811 	Point	aPos( m_pParent->PixelToLogic( rMEvt.GetPosPixel() ) );
812 
813     if ( m_rView.IsCreateObj() )
814 	{
815         m_rView.SetOrtho(SdrObjCustomShape::doConstructOrthogonal(m_rView.getReportSection()->getSectionWindow()->getViewsWindow()->getShapeType()) ? !rMEvt.IsShift() : rMEvt.IsShift());
816 		m_rView.SetAngleSnapEnabled(rMEvt.IsShift());
817     }
818 
819     bool bIsSetPoint = false;
820 	if ( m_rView.IsAction() )
821 	{
822 		if ( m_rView.IsDragResize() )
823 		{
824 		    // we resize the object don't resize to above sections
825 		    if ( aPos.Y() < 0 )
826 		    {
827         		aPos.Y() = 0;
828 		    }
829 		}
830         bIsSetPoint = setMovementPointer(rMEvt);
831 		ForceScroll(aPos);
832         m_pParent->getSectionWindow()->getViewsWindow()->MovAction(aPos,&m_rView, m_rView.GetDragMethod() == NULL, false);
833 	}
834 
835     //if ( isOver(m_rView.GetCreateObj(),*m_pParent->getPage(),*m_pView) )
836     //    m_pParent->SetPointer( Pointer(POINTER_NOTALLOWED));
837     //else
838     if ( !bIsSetPoint )
839 	    m_pParent->SetPointer( m_rView.GetPreferedPointer( aPos, m_pParent) );
840 
841 	return sal_True;
842 }
843 
844 //----------------------------------------------------------------------------
845 
846 DlgEdFuncSelect::DlgEdFuncSelect( OReportSection* _pParent ) :
847 	DlgEdFunc( _pParent )
848 {
849 }
850 
851 //----------------------------------------------------------------------------
852 
853 DlgEdFuncSelect::~DlgEdFuncSelect()
854 {
855 }
856 
857 //----------------------------------------------------------------------------
858 
859 sal_Bool DlgEdFuncSelect::MouseButtonDown( const MouseEvent& rMEvt )
860 {
861 	m_bSelectionMode = false;
862     if ( DlgEdFunc::MouseButtonDown(rMEvt) )
863         return sal_True;
864 
865     SdrViewEvent aVEvt;
866 	const SdrHitKind eHit = m_rView.PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);
867     if( eHit == SDRHIT_UNMARKEDOBJECT )
868 	{
869 		// if not multi selection, unmark all
870 		if ( !rMEvt.IsShift() )
871 			m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(NULL);
872 
873 		if ( m_rView.MarkObj(m_aMDPos) && rMEvt.IsLeft() )
874 		{
875 			// drag object
876 			m_pParent->getSectionWindow()->getViewsWindow()->BegDragObj(m_aMDPos, m_rView.PickHandle(m_aMDPos), &m_rView);
877 		}
878 		else
879 		{
880 			// select object
881 			m_pParent->getSectionWindow()->getViewsWindow()->BegMarkObj(m_aMDPos,&m_rView);
882 		}
883 	}
884     else
885     {
886         if( !rMEvt.IsShift() )
887             m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(NULL);
888 			//m_rView.UnmarkAll();
889 
890         if ( rMEvt.GetClicks() == 1 )
891 		{
892 			m_bSelectionMode = true;
893 		    m_pParent->getSectionWindow()->getViewsWindow()->BegMarkObj( m_aMDPos ,&m_rView);
894 		}
895         else
896         {
897             m_rView.SdrBeginTextEdit( aVEvt.pRootObj,m_rView.GetSdrPageView(),m_pParent,sal_False );
898         }
899     }
900 
901 	return sal_True;
902 }
903 
904 //----------------------------------------------------------------------------
905 
906 sal_Bool DlgEdFuncSelect::MouseButtonUp( const MouseEvent& rMEvt )
907 {
908 	if ( DlgEdFunc::MouseButtonUp( rMEvt ) )
909         return sal_True;
910 
911 	// get view from parent
912 	const Point aPnt( m_pParent->PixelToLogic( rMEvt.GetPosPixel() ) );
913 
914 	if ( rMEvt.IsLeft() )                     // left mousebutton pressed
915         checkMovementAllowed(rMEvt);
916 
917     m_pParent->getSectionWindow()->getViewsWindow()->EndAction();
918     checkTwoCklicks(rMEvt);
919 
920 	m_pParent->SetPointer( m_rView.GetPreferedPointer( aPnt, m_pParent) );
921 
922     if ( !m_bUiActive )
923     	m_pParent->getSectionWindow()->getViewsWindow()->getView()->getReportView()->UpdatePropertyBrowserDelayed(m_rView);
924 	m_bSelectionMode = false;
925 	return sal_True;
926 }
927 
928 //----------------------------------------------------------------------------
929 
930 sal_Bool DlgEdFuncSelect::MouseMove( const MouseEvent& rMEvt )
931 {
932     if ( DlgEdFunc::MouseMove(rMEvt ) )
933         return sal_True;
934 
935 	Point aPnt( m_pParent->PixelToLogic( rMEvt.GetPosPixel() ) );
936     bool bIsSetPoint = false;
937 
938 	if ( m_rView.IsAction() ) // Drag Mode
939 	{
940         bIsSetPoint = setMovementPointer(rMEvt);
941 		ForceScroll(aPnt);
942 		if (m_rView.GetDragMethod()==NULL)
943 		{
944             // create a selection
945 			m_pParent->getSectionWindow()->getViewsWindow()->MovAction(aPnt, &m_rView, true, false);
946 		}
947 		else
948 		{
949             if ( m_rView.IsDragResize() )
950             {
951                 // we resize the object don't resize to above sections
952                 if ( aPnt.Y() < 0 )
953                 {
954                     aPnt.Y() = 0;
955                 }
956                 // grow section if it is under the current section
957 //                else
958 //                {
959 //                    const Size& aSectionSize = m_rView->GetSizePixel();
960 //                    if ( aPnt.Y() > aSectionSize.Height() )
961 //                    {
962 //                        aPnt.Y() = aSectionSize.Height();
963 //                    }
964 //                }
965             }
966             // drag or resize an object
967             bool bControlKey = rMEvt.IsMod1();
968 			m_pParent->getSectionWindow()->getViewsWindow()->MovAction(aPnt, &m_rView, false, bControlKey);
969 		}
970 	}
971 
972     if ( !bIsSetPoint )
973     {
974         m_pParent->SetPointer( m_rView.GetPreferedPointer( aPnt, m_pParent) );
975 
976 		// restore color
977 		unColorizeOverlappedObj();
978     }
979 
980 	return sal_True;
981 }
982 // -----------------------------------------------------------------------------
983 //void DlgEdFuncSelect::SetInEditMode(SdrTextObj* _pTextObj,const MouseEvent& rMEvt, sal_Bool bQuickDrag)
984 //{
985 //
986 //	SdrPageView* pPV = m_rView.GetSdrPageView();
987 //	if( _pTextObj && _pTextObj->GetPage() == pPV->GetPage() )
988 //	{
989 //		m_rView.SetCurrentObj(OBJ_TEXT);
990 //    	m_rView.SetEditMode(SDREDITMODE_EDIT);
991 //
992 //		sal_Bool bEmptyOutliner = sal_False;
993 //
994 //		if (!_pTextObj->GetOutlinerParaObject() && m_rView.GetTextEditOutliner())
995 //		{
996 //			::SdrOutliner* pOutl = m_rView.GetTextEditOutliner();
997 //			sal_uLong nParaAnz = pOutl->GetParagraphCount();
998 //			Paragraph* p1stPara = pOutl->GetParagraph( 0 );
999 //
1000 //			if (nParaAnz==1 && p1stPara)
1001 //			{
1002 //				// Bei nur einem Pararaph
1003 //				if (pOutl->GetText(p1stPara).Len() == 0)
1004 //				{
1005 //					bEmptyOutliner = sal_True;
1006 //				}
1007 //			}
1008 //		}
1009 //
1010 //		if (_pTextObj != m_rView.GetTextEditObject() || bEmptyOutliner)
1011 //		{
1012 //			sal_uInt32 nInv = _pTextObj->GetObjInventor();
1013 //			sal_uInt16 nSdrObjKind = _pTextObj->GetObjIdentifier();
1014 //
1015 //			if (nInv == SdrInventor && _pTextObj->HasTextEdit() &&
1016 //				(nSdrObjKind == OBJ_TEXT ||
1017 //			 	nSdrObjKind == OBJ_TITLETEXT ||
1018 //			 	nSdrObjKind == OBJ_OUTLINETEXT ||
1019 //			 	(_pTextObj->ISA(SdrTextObj) && !_pTextObj->IsEmptyPresObj())))
1020 //			{
1021 //				// Neuen Outliner machen (gehoert der SdrObjEditView)
1022 //                SdrModel* pModel = _pTextObj->GetModel();
1023 //                SdrOutliner* pOutl = SdrMakeOutliner( OUTLINERMODE_OUTLINEOBJECT, pModel );
1024 //				pOutl->SetMinDepth(0);
1025 //				pOutl->SetStyleSheetPool((SfxStyleSheetPool*) pModel->GetStyleSheetPool());
1026 //				//pOutl->SetCalcFieldValueHdl(LINK(SD_MOD(), SdModule, CalcFieldValueHdl));
1027 //				sal_uLong nCntrl = pOutl->GetControlWord();
1028 //				nCntrl |= EE_CNTRL_ALLOWBIGOBJS;
1029 //				nCntrl |= EE_CNTRL_URLSFXEXECUTE;
1030 //				nCntrl |= EE_CNTRL_MARKFIELDS;
1031 //				nCntrl |= EE_CNTRL_AUTOCORRECT;
1032 //
1033 //				nCntrl &= ~EE_CNTRL_ULSPACESUMMATION;
1034 //				//if ( pModel->IsSummationOfParagraphs() )
1035 //				//    nCntrl |= EE_CNTRL_ULSPACESUMMATION;
1036 //
1037 //				//SetSpellOptions( nCntrl );
1038 //
1039 //				pOutl->SetControlWord(nCntrl);
1040 //
1041 //                uno::Reference< linguistic2::XSpellChecker1 > xSpellChecker( LinguMgr::GetSpellChecker() );
1042 //	            if ( xSpellChecker.is() )
1043 //		            pOutl->SetSpeller( xSpellChecker );
1044 //
1045 //                uno::Reference< linguistic2::XHyphenator > xHyphenator( LinguMgr::GetHyphenator() );
1046 //	            if( xHyphenator.is() )
1047 //		            pOutl->SetHyphenator( xHyphenator );
1048 //
1049 //				pOutl->SetDefaultLanguage( Application::GetSettings().GetLanguage() );
1050 //
1051 //				// in einem Gliederungstext darf nicht auf die 0-te
1052 //				// Ebene ausgerueckt werden
1053 //				if (_pTextObj->GetObjInventor() == SdrInventor &&
1054 //					_pTextObj->GetObjIdentifier() == OBJ_OUTLINETEXT)
1055 //				{
1056 //					pOutl->SetMinDepth(1);
1057 //				}
1058 //
1059 //				if (bEmptyOutliner)
1060 //				{
1061 //					m_rView.SdrEndTextEdit(sal_True);
1062 //				}
1063 //
1064 //				if( _pTextObj )
1065 //				{
1066 //					OutlinerParaObject* pOPO = _pTextObj->GetOutlinerParaObject();
1067 //					if( ( pOPO && pOPO->IsVertical() ) /*||
1068 //						nSlotId == SID_ATTR_CHAR_VERTICAL ||
1069 //						nSlotId == SID_TEXT_FITTOSIZE_VERTICAL */)
1070 //						pOutl->SetVertical( sal_True );
1071 //
1072 //
1073 //					if (m_rView.SdrBeginTextEdit(_pTextObj, pPV, pParent, sal_True, pOutl) && _pTextObj->GetObjInventor() == SdrInventor)
1074 //					{
1075 //						//bFirstObjCreated = sal_True;
1076 //						//DeleteDefaultText();
1077 //
1078 //						OutlinerView* pOLV = m_rView.GetTextEditOutlinerView();
1079 //
1080 //						nSdrObjKind = _pTextObj->GetObjIdentifier();
1081 //
1082 //						SdrViewEvent aVEvt;
1083 //						SdrHitKind eHit = m_rView.PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);
1084 //
1085 //						if (eHit == SDRHIT_TEXTEDIT)
1086 //						{
1087 //							// Text getroffen
1088 //							if (nSdrObjKind == OBJ_TEXT ||
1089 //								nSdrObjKind == OBJ_TITLETEXT ||
1090 //								nSdrObjKind == OBJ_OUTLINETEXT ||
1091 //								//nSlotId == SID_TEXTEDIT ||
1092 //								!bQuickDrag)
1093 //							{
1094 //								pOLV->MouseButtonDown(rMEvt);
1095 //								pOLV->MouseMove(rMEvt);
1096 //								pOLV->MouseButtonUp(rMEvt);
1097 //							}
1098 //
1099 //							if ( bQuickDrag && _pTextObj->GetOutlinerParaObject())
1100 //							{
1101 //								pOLV->MouseButtonDown(rMEvt);
1102 //							}
1103 //						}
1104 //						else
1105 //						{
1106 //							// #98198# Move cursor to end of text
1107 //							ESelection aNewSelection(EE_PARA_NOT_FOUND, EE_INDEX_NOT_FOUND, EE_PARA_NOT_FOUND, EE_INDEX_NOT_FOUND);
1108 //							pOLV->SetSelection(aNewSelection);
1109 //						}
1110 //					}
1111 //					else
1112 //					{
1113 //						//RestoreDefaultText();
1114 //					}
1115 //				}
1116 //			}
1117 //		}
1118 //	}
1119 //	else
1120 //		_pTextObj = NULL;
1121 //}
1122 
1123 
1124 //----------------------------------------------------------------------------
1125 }
1126