lok: vcl: fix multiple floatwin removal case more robustly.
[LibreOffice.git] / reportdesign / source / ui / report / dlgedfunc.cxx
blob58a71a4bddcd2e031b65763ee81afc982e902c13
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
19 #include <vcl/scrbar.hxx>
20 #include <vcl/svapp.hxx>
21 #include <vcl/seleng.hxx>
22 #include <com/sun/star/embed/EmbedStates.hpp>
23 #include <com/sun/star/embed/XEmbeddedObject.hpp>
24 #include <com/sun/star/beans/XPropertySet.hpp>
26 #include <svx/svdview.hxx>
27 #include <svx/svdpagv.hxx>
28 #include <editeng/outlobj.hxx>
29 #include <editeng/unolingu.hxx>
30 #include <svx/svdetc.hxx>
31 #include <editeng/editstat.hxx>
32 #include <svx/svdoutl.hxx>
33 #include <svx/svddrgmt.hxx>
34 #include <svx/svdoashp.hxx>
35 #include <svx/svxids.hrc>
36 #include <svx/svditer.hxx>
38 #include <toolkit/helper/vclunohelper.hxx>
40 #include <dlgedfunc.hxx>
41 #include <ReportSection.hxx>
42 #include <DesignView.hxx>
43 #include <ReportController.hxx>
44 #include <SectionView.hxx>
45 #include <ViewsWindow.hxx>
46 #include <ReportWindow.hxx>
47 #include <RptObject.hxx>
48 #include <ScrollHelper.hxx>
49 #include <UITools.hxx>
51 #include <strings.hxx>
52 #include <UndoEnv.hxx>
53 #include <RptModel.hxx>
54 #include <comphelper/propertysequence.hxx>
55 #include <tools/diagnose_ex.h>
57 #define DEFAUL_MOVE_SIZE 100
58 namespace rptui
60 using namespace ::com::sun::star;
63 IMPL_LINK_NOARG( DlgEdFunc, ScrollTimeout, Timer *, void )
65 ForceScroll( m_pParent->PixelToLogic( m_pParent->GetPointerPosPixel() ) );
69 void DlgEdFunc::ForceScroll( const Point& rPos )
71 aScrollTimer.Stop();
73 OReportWindow* pReportWindow = m_pParent->getSectionWindow()->getViewsWindow()->getView();
74 OScrollWindowHelper* pScrollWindow = pReportWindow->getScrollWindow();
76 Size aOut = pReportWindow->GetOutputSizePixel();
77 Fraction aStartWidth(long(REPORT_STARTMARKER_WIDTH));
78 aStartWidth *= m_pParent->GetMapMode().GetScaleX();
80 aOut.AdjustWidth( -static_cast<long>(aStartWidth) );
81 aOut.setHeight( m_pParent->GetOutputSizePixel().Height() );
83 Point aPos = pScrollWindow->getThumbPos();
84 aPos.setX( aPos.X() * 0.5 );
85 aPos.setY( aPos.Y() * 0.5 );
86 tools::Rectangle aOutRect( aPos, aOut );
87 aOutRect = m_pParent->PixelToLogic( aOutRect );
88 tools::Rectangle aWorkArea(Point(), pScrollWindow->getTotalSize());
89 aWorkArea.AdjustRight( -static_cast<long>(aStartWidth) );
90 aWorkArea = pScrollWindow->PixelToLogic( aWorkArea );
91 if( !aOutRect.IsInside( rPos ) && aWorkArea.IsInside( rPos ) )
93 ScrollBar& rHScroll = pScrollWindow->GetHScroll();
94 ScrollBar& rVScroll = pScrollWindow->GetVScroll();
95 ScrollType eH = ScrollType::LineDown,eV = ScrollType::LineDown;
96 if( rPos.X() < aOutRect.Left() )
97 eH = ScrollType::LineUp;
98 else if( rPos.X() <= aOutRect.Right() )
99 eH = ScrollType::DontKnow;
101 if( rPos.Y() < aOutRect.Top() )
102 eV = ScrollType::LineUp;
103 else if( rPos.Y() <= aOutRect.Bottom() )
104 eV = ScrollType::DontKnow;
106 rHScroll.DoScrollAction(eH);
107 rVScroll.DoScrollAction(eV);
110 aScrollTimer.Start();
113 DlgEdFunc::DlgEdFunc( OReportSection* _pParent )
114 : m_pParent(_pParent)
115 , m_rView(_pParent->getSectionView())
116 , m_pOverlappingObj(nullptr)
117 , m_nOverlappedControlColor(0)
118 , m_nOldColor(0)
119 , m_bSelectionMode(false)
120 , m_bUiActive(false)
121 , m_bShowPropertyBrowser(false)
123 aScrollTimer.SetInvokeHandler( LINK( this, DlgEdFunc, ScrollTimeout ) );
124 m_rView.SetActualWin( m_pParent);
125 aScrollTimer.SetTimeout( SELENG_AUTOREPEAT_INTERVAL );
128 void DlgEdFunc::setOverlappedControlColor(Color _nColor)
130 m_nOverlappedControlColor = _nColor;
133 static Color lcl_setColorOfObject(const uno::Reference< uno::XInterface >& _xObj, Color _nColorTRGB)
135 Color nBackColor;
138 uno::Reference<report::XReportComponent> xComponent(_xObj, uno::UNO_QUERY_THROW);
139 uno::Reference< beans::XPropertySet > xProp(xComponent, uno::UNO_QUERY_THROW);
140 uno::Any aAny = xProp->getPropertyValue(PROPERTY_CONTROLBACKGROUND);
141 if (aAny.hasValue())
143 aAny >>= nBackColor;
144 // try to set background color at the ReportComponent
145 uno::Any aBlackColorAny = uno::makeAny(_nColorTRGB);
146 xProp->setPropertyValue(PROPERTY_CONTROLBACKGROUND, aBlackColorAny);
149 catch(uno::Exception&)
152 return nBackColor;
155 DlgEdFunc::~DlgEdFunc()
157 unColorizeOverlappedObj();
158 aScrollTimer.Stop();
162 bool DlgEdFunc::MouseButtonDown( const MouseEvent& rMEvt )
164 m_aMDPos = m_pParent->PixelToLogic( rMEvt.GetPosPixel() );
165 m_pParent->GrabFocus();
166 bool bHandled = false;
167 if ( rMEvt.IsLeft() )
169 if ( rMEvt.GetClicks() > 1 )
171 // show property browser
172 uno::Sequence<beans::PropertyValue> aArgs( comphelper::InitPropertySequence({
173 { "ShowProperties", uno::Any(true) }
174 }));
175 m_pParent->getSectionWindow()->getViewsWindow()->getView()->getReportView()->getController().executeUnChecked(SID_SHOW_PROPERTYBROWSER,aArgs);
176 m_pParent->getSectionWindow()->getViewsWindow()->getView()->getReportView()->UpdatePropertyBrowserDelayed(m_rView);
177 // TODO character in shapes
178 // SdrViewEvent aVEvt;
179 // m_rView.PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt);
180 // if ( aVEvt.pRootObj && aVEvt.pRootObj->ISA(SdrTextObj) )
181 // SetInEditMode(static_cast<SdrTextObj *>(aVEvt.pRootObj),rMEvt, sal_False);
182 bHandled = true;
184 else
186 SdrHdl* pHdl = m_rView.PickHandle(m_aMDPos);
188 // if selected object was hit, drag object
189 if ( pHdl!=nullptr || m_rView.IsMarkedHit(m_aMDPos) )
191 bHandled = true;
192 m_pParent->CaptureMouse();
193 m_pParent->getSectionWindow()->getViewsWindow()->BegDragObj(m_aMDPos, pHdl,&m_rView);
197 else if ( rMEvt.IsRight() && !rMEvt.IsLeft() && rMEvt.GetClicks() == 1 ) // mark object when context menu was selected
199 SdrPageView* pPV = m_rView.GetSdrPageView();
200 SdrViewEvent aVEvt;
201 if ( m_rView.PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt) != SdrHitKind::MarkedObject && !rMEvt.IsShift() )
202 m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(nullptr);
203 if ( aVEvt.pRootObj )
204 m_rView.MarkObj(aVEvt.pRootObj, pPV);
205 else
206 m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(nullptr);
208 bHandled = true;
210 else if( !rMEvt.IsLeft() )
211 bHandled = true;
212 if ( !bHandled )
213 m_pParent->CaptureMouse();
214 return bHandled;
218 bool DlgEdFunc::MouseButtonUp( const MouseEvent& /*rMEvt*/ )
220 m_pParent->getSectionWindow()->getViewsWindow()->stopScrollTimer();
221 return false;
224 void DlgEdFunc::checkTwoCklicks(const MouseEvent& rMEvt)
226 deactivateOle();
228 const sal_uInt16 nClicks = rMEvt.GetClicks();
229 if ( nClicks == 2 && rMEvt.IsLeft() )
231 if ( m_rView.AreObjectsMarked() )
233 const SdrMarkList& rMarkList = m_rView.GetMarkedObjectList();
234 if (rMarkList.GetMarkCount() == 1)
236 const SdrMark* pMark = rMarkList.GetMark(0);
237 SdrObject* pObj = pMark->GetMarkedSdrObj();
238 activateOle(pObj);
244 void DlgEdFunc::stopScrollTimer()
246 unColorizeOverlappedObj();
247 aScrollTimer.Stop();
248 if ( m_pParent->IsMouseCaptured() )
249 m_pParent->ReleaseMouse();
253 bool DlgEdFunc::MouseMove( const MouseEvent& /*rMEvt*/ )
255 return false;
258 bool DlgEdFunc::handleKeyEvent(const KeyEvent& _rEvent)
260 bool bReturn = false;
262 if ( !m_bUiActive )
264 const vcl::KeyCode& rCode = _rEvent.GetKeyCode();
265 sal_uInt16 nCode = rCode.GetCode();
267 switch ( nCode )
269 case KEY_ESCAPE:
271 if ( m_pParent->getSectionWindow()->getViewsWindow()->IsAction() )
273 m_pParent->getSectionWindow()->getViewsWindow()->BrkAction();
274 bReturn = true;
276 else if ( m_rView.IsTextEdit() )
278 m_rView.SdrEndTextEdit();
279 bReturn = true;
281 else if ( m_rView.AreObjectsMarked() )
283 const SdrHdlList& rHdlList = m_rView.GetHdlList();
284 SdrHdl* pHdl = rHdlList.GetFocusHdl();
285 if ( pHdl )
286 const_cast<SdrHdlList&>(rHdlList).ResetFocusHdl();
287 else
288 m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(nullptr);
290 deactivateOle(true);
291 bReturn = false;
293 else
295 deactivateOle(true);
298 break;
299 case KEY_TAB:
301 if ( !rCode.IsMod1() && !rCode.IsMod2() )
303 // mark next object
304 if ( !m_rView.MarkNextObj( !rCode.IsShift() ) )
306 // if no next object, mark first/last
307 m_rView.UnmarkAllObj();
308 m_rView.MarkNextObj( !rCode.IsShift() );
311 if ( m_rView.AreObjectsMarked() )
312 m_rView.MakeVisible( m_rView.GetAllMarkedRect(), *m_pParent);
314 bReturn = true;
316 else if ( rCode.IsMod1() && rCode.IsMod2())
318 // selected handle
319 const SdrHdlList& rHdlList = m_rView.GetHdlList();
320 const_cast<SdrHdlList&>(rHdlList).TravelFocusHdl( !rCode.IsShift() );
322 // guarantee visibility of focused handle
323 SdrHdl* pHdl = rHdlList.GetFocusHdl();
324 if ( pHdl )
326 Point aHdlPosition( pHdl->GetPos() );
327 tools::Rectangle aVisRect( aHdlPosition - Point( DEFAUL_MOVE_SIZE, DEFAUL_MOVE_SIZE ), Size( 200, 200 ) );
328 m_rView.MakeVisible( aVisRect, *m_pParent);
331 bReturn = true;
334 break;
335 case KEY_UP:
336 case KEY_DOWN:
337 case KEY_LEFT:
338 case KEY_RIGHT:
340 m_pParent->getSectionWindow()->getViewsWindow()->handleKey(rCode);
341 bReturn = true;
343 break;
344 case KEY_RETURN:
345 if ( !rCode.IsMod1() )
347 const SdrMarkList& rMarkList = m_rView.GetMarkedObjectList();
348 if ( rMarkList.GetMarkCount() == 1 )
350 SdrObject* pObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj();
351 activateOle(pObj);
354 break;
355 case KEY_DELETE:
356 if ( !rCode.IsMod1() && !rCode.IsMod2() )
358 bReturn = true;
359 break;
361 SAL_FALLTHROUGH;
362 default:
364 bReturn = m_rView.KeyInput(_rEvent, m_pParent);
366 break;
370 if ( bReturn && m_pParent->IsMouseCaptured() )
371 m_pParent->ReleaseMouse();
373 return bReturn;
376 void DlgEdFunc::activateOle(SdrObject* _pObj)
378 if ( _pObj )
380 const sal_uInt16 nSdrObjKind = _pObj->GetObjIdentifier();
382 // OLE: activate
384 if (nSdrObjKind == OBJ_OLE2)
386 SdrOle2Obj* pOleObj = dynamic_cast<SdrOle2Obj*>(_pObj);
387 if (pOleObj && pOleObj->GetObjRef().is())
389 if (m_rView.IsTextEdit())
391 m_rView.SdrEndTextEdit();
394 pOleObj->AddOwnLightClient();
395 pOleObj->SetWindow(VCLUnoHelper::GetInterface(m_pParent));
398 pOleObj->GetObjRef()->changeState( embed::EmbedStates::UI_ACTIVE );
399 m_bUiActive = true;
400 OReportController& rController = m_pParent->getSectionWindow()->getViewsWindow()->getView()->getReportView()->getController();
401 m_bShowPropertyBrowser = rController.isCommandChecked(SID_SHOW_PROPERTYBROWSER);
402 if ( m_bShowPropertyBrowser )
403 rController.executeChecked(SID_SHOW_PROPERTYBROWSER,uno::Sequence< beans::PropertyValue >());
405 catch( uno::Exception& )
407 DBG_UNHANDLED_EXCEPTION("reportdesign");
414 void DlgEdFunc::deactivateOle(bool _bSelect)
416 OLEObjCache& rObjCache = GetSdrGlobalData().GetOLEObjCache();
417 OReportController& rController = m_pParent->getSectionWindow()->getViewsWindow()->getView()->getReportView()->getController();
418 const sal_uLong nCount = rObjCache.size();
419 for(sal_uLong i = 0 ; i< nCount;++i)
421 SdrOle2Obj* pObj = rObjCache[i];
422 if ( m_pParent->getPage() == pObj->getSdrPageFromSdrObject() )
424 uno::Reference< embed::XEmbeddedObject > xObj = pObj->GetObjRef();
425 if ( xObj.is() && xObj->getCurrentState() == embed::EmbedStates::UI_ACTIVE )
427 xObj->changeState( embed::EmbedStates::RUNNING );
428 m_bUiActive = false;
429 if ( m_bShowPropertyBrowser )
431 rController.executeChecked(SID_SHOW_PROPERTYBROWSER,uno::Sequence< beans::PropertyValue >());
434 if ( _bSelect )
436 SdrPageView* pPV = m_rView.GetSdrPageView();
437 m_rView.MarkObj(pObj, pPV);
444 void DlgEdFunc::colorizeOverlappedObject(SdrObject* _pOverlappedObj)
446 OObjectBase* pObj = dynamic_cast<OObjectBase*>(_pOverlappedObj);
447 if ( pObj )
449 const uno::Reference<report::XReportComponent>& xComponent = pObj->getReportComponent();
450 if (xComponent.is() && xComponent != m_xOverlappingObj)
452 OReportModel& rRptModel(static_cast< OReportModel& >(_pOverlappedObj->getSdrModelFromSdrObject()));
453 OXUndoEnvironment::OUndoEnvLock aLock(rRptModel.GetUndoEnv());
455 // uncolorize an old object, if there is one
456 unColorizeOverlappedObj();
458 m_nOldColor = lcl_setColorOfObject(xComponent, m_nOverlappedControlColor);
459 m_xOverlappingObj = xComponent;
460 m_pOverlappingObj = _pOverlappedObj;
465 void DlgEdFunc::unColorizeOverlappedObj()
467 // uncolorize an old object, if there is one
468 if (m_xOverlappingObj.is())
470 OReportModel& rRptModel(static_cast< OReportModel& >(m_pOverlappingObj->getSdrModelFromSdrObject()));
471 OXUndoEnvironment::OUndoEnvLock aLock(rRptModel.GetUndoEnv());
473 lcl_setColorOfObject(m_xOverlappingObj, m_nOldColor);
474 m_xOverlappingObj = nullptr;
475 m_pOverlappingObj = nullptr;
479 bool DlgEdFunc::isOverlapping(const MouseEvent& rMEvt)
481 SdrViewEvent aVEvt;
482 bool bOverlapping = m_rView.PickAnything(rMEvt, SdrMouseEventKind::BUTTONUP, aVEvt) != SdrHitKind::NONE;
483 if (bOverlapping && aVEvt.pObj)
485 colorizeOverlappedObject(aVEvt.pObj);
487 else
489 unColorizeOverlappedObj();
492 return bOverlapping;
495 void DlgEdFunc::checkMovementAllowed(const MouseEvent& rMEvt)
497 if ( m_pParent->getSectionWindow()->getViewsWindow()->IsDragObj() )
499 if ( isRectangleHit(rMEvt) )
501 // there is another component under use, break action
502 m_pParent->getSectionWindow()->getViewsWindow()->BrkAction();
504 // object was dragged
505 Point aPnt( m_pParent->PixelToLogic( rMEvt.GetPosPixel() ) );
506 if (m_bSelectionMode)
508 m_pParent->getSectionWindow()->getViewsWindow()->EndAction();
510 else
512 bool bControlKeyPressed = rMEvt.IsMod1();
513 // Don't allow points smaller 0
514 if (bControlKeyPressed && (aPnt.Y() < 0))
516 aPnt.setY( 0 );
518 if (m_rView.IsDragResize())
520 // we resize the object don't resize to above sections
521 if ( aPnt.Y() < 0 )
523 aPnt.setY( 0 );
526 m_pParent->getSectionWindow()->getViewsWindow()->EndDragObj( bControlKeyPressed, &m_rView, aPnt );
528 m_pParent->getSectionWindow()->getViewsWindow()->ForceMarkedToAnotherPage();
529 m_pParent->Invalidate(InvalidateFlags::Children);
531 else
532 m_pParent->getSectionWindow()->getViewsWindow()->EndAction();
535 bool DlgEdFunc::isOnlyCustomShapeMarked()
537 bool bReturn = true;
538 const SdrMarkList& rMarkList = m_rView.GetMarkedObjectList();
539 for (size_t i = 0; i < rMarkList.GetMarkCount(); ++i )
541 SdrMark* pMark = rMarkList.GetMark(i);
542 SdrObject* pObj = pMark->GetMarkedSdrObj();
543 if (pObj->GetObjIdentifier() != OBJ_CUSTOMSHAPE)
545 // we found an object in the marked objects, which is not a custom shape.
546 bReturn = false;
547 break;
550 return bReturn;
553 bool DlgEdFunc::isRectangleHit(const MouseEvent& rMEvt)
555 if (isOnlyCustomShapeMarked())
557 return false;
560 SdrViewEvent aVEvt;
561 const SdrHitKind eHit = m_rView.PickAnything(rMEvt, SdrMouseEventKind::MOVE, aVEvt);
562 bool bIsSetPoint = (eHit == SdrHitKind::UnmarkedObject);
563 if ( !bIsSetPoint )
565 // no drag rect, we have to check every single select rect
566 const SdrDragStat& rDragStat = m_rView.GetDragStat();
567 if (rDragStat.GetDragMethod() != nullptr)
569 SdrObjListIter aIter(m_pParent->getPage(),SdrIterMode::DeepNoGroups);
570 SdrObject* pObjIter = nullptr;
571 // loop through all marked objects and check if there new rect overlapps an old one.
572 while( (pObjIter = aIter.Next()) != nullptr && !bIsSetPoint)
574 if ( m_rView.IsObjMarked(pObjIter)
575 && (dynamic_cast<OUnoObject*>(pObjIter) != nullptr || dynamic_cast<OOle2Obj*>(pObjIter) != nullptr) )
577 tools::Rectangle aNewRect = pObjIter->GetLastBoundRect();
578 long nDx = rDragStat.IsHorFixed() ? 0 : rDragStat.GetDX();
579 long nDy = rDragStat.IsVerFixed() ? 0 : rDragStat.GetDY();
580 if ( (nDx + aNewRect.Left()) < 0 )
581 nDx = -aNewRect.Left();
582 if ( (nDy + aNewRect.Top()) < 0 )
583 nDy = -aNewRect.Top();
585 if ( rDragStat.GetDragMethod()->getMoveOnly() )
586 aNewRect.Move(nDx,nDy);
587 else
588 ::ResizeRect(aNewRect,rDragStat.GetRef1(),rDragStat.GetXFact(),rDragStat.GetYFact());
591 SdrObject* pObjOverlapped = isOver(aNewRect,*m_pParent->getPage(),m_rView,false,pObjIter, ISOVER_IGNORE_CUSTOMSHAPES);
592 bIsSetPoint = pObjOverlapped != nullptr;
593 if (pObjOverlapped && !m_bSelectionMode)
595 colorizeOverlappedObject(pObjOverlapped);
601 else if ( aVEvt.pObj && (aVEvt.pObj->GetObjIdentifier() != OBJ_CUSTOMSHAPE) && !m_bSelectionMode)
603 colorizeOverlappedObject(aVEvt.pObj);
605 else
606 bIsSetPoint = false;
607 return bIsSetPoint;
610 bool DlgEdFunc::setMovementPointer(const MouseEvent& rMEvt)
612 bool bIsSetPoint = isRectangleHit(rMEvt);
613 if ( bIsSetPoint )
614 m_pParent->SetPointer( Pointer(PointerStyle::NotAllowed));
615 else
617 bool bCtrlKey = rMEvt.IsMod1();
618 if (bCtrlKey)
620 m_pParent->SetPointer( Pointer(PointerStyle::MoveDataLink ));
621 bIsSetPoint = true;
624 return bIsSetPoint;
628 DlgEdFuncInsert::DlgEdFuncInsert( OReportSection* _pParent ) :
629 DlgEdFunc( _pParent )
631 m_rView.SetCreateMode();
635 DlgEdFuncInsert::~DlgEdFuncInsert()
637 m_rView.SetEditMode();
641 bool DlgEdFuncInsert::MouseButtonDown( const MouseEvent& rMEvt )
643 if ( DlgEdFunc::MouseButtonDown(rMEvt) )
644 return true;
646 SdrViewEvent aVEvt;
647 sal_Int16 nId = m_rView.GetCurrentObjIdentifier();
649 const SdrHitKind eHit = m_rView.PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt);
651 if (eHit == SdrHitKind::UnmarkedObject && nId != OBJ_CUSTOMSHAPE)
653 // there is an object under the mouse cursor, but not a customshape
654 m_pParent->getSectionWindow()->getViewsWindow()->BrkAction();
655 return false;
658 // if no action, create object
659 if (!m_pParent->getSectionWindow()->getViewsWindow()->IsAction())
661 deactivateOle(true);
662 if ( m_pParent->getSectionWindow()->getViewsWindow()->HasSelection() )
663 m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(&m_rView);
664 m_rView.BegCreateObj(m_aMDPos);
665 m_pParent->getSectionWindow()->getViewsWindow()->createDefault();
668 return true;
672 bool DlgEdFuncInsert::MouseButtonUp( const MouseEvent& rMEvt )
674 if ( DlgEdFunc::MouseButtonUp( rMEvt ) )
675 return true;
677 const Point aPos( m_pParent->PixelToLogic( rMEvt.GetPosPixel() ) );
678 const sal_uInt16 nHitLog = sal_uInt16 ( m_pParent->PixelToLogic(Size(3,0)).Width() );
680 bool bReturn = true;
681 // object creation active?
682 if ( m_rView.IsCreateObj() )
684 if ( isOver(m_rView.GetCreateObj(),*m_pParent->getPage(),m_rView) )
686 m_pParent->getSectionWindow()->getViewsWindow()->BrkAction();
687 // BrkAction disables the create mode
688 m_rView.SetCreateMode();
689 return true;
692 m_rView.EndCreateObj(SdrCreateCmd::ForceEnd);
694 if ( !m_rView.AreObjectsMarked() )
696 m_rView.MarkObj(aPos, nHitLog);
699 bReturn = m_rView.AreObjectsMarked();
700 if ( bReturn )
702 OReportController& rController = m_pParent->getSectionWindow()->getViewsWindow()->getView()->getReportView()->getController();
703 const SdrMarkList& rMarkList = m_rView.GetMarkedObjectList();
704 for (size_t i = 0; i < rMarkList.GetMarkCount(); ++i )
706 SdrMark* pMark = rMarkList.GetMark(i);
707 OOle2Obj* pObj = dynamic_cast<OOle2Obj*>(pMark->GetMarkedSdrObj());
708 if ( pObj && !pObj->IsEmpty() )
710 pObj->initializeChart(rController.getModel());
715 else
716 checkMovementAllowed(rMEvt);
718 if ( !m_rView.AreObjectsMarked() &&
719 std::abs(m_aMDPos.X() - aPos.X()) < nHitLog &&
720 std::abs(m_aMDPos.Y() - aPos.Y()) < nHitLog &&
721 !rMEvt.IsShift() && !rMEvt.IsMod2() )
723 SdrPageView* pPV = m_rView.GetSdrPageView();
724 SdrViewEvent aVEvt;
725 m_rView.PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt);
726 m_rView.MarkObj(aVEvt.pRootObj, pPV);
728 checkTwoCklicks(rMEvt);
729 m_pParent->getSectionWindow()->getViewsWindow()->getView()->getReportView()->UpdatePropertyBrowserDelayed(m_rView);
730 return bReturn;
734 bool DlgEdFuncInsert::MouseMove( const MouseEvent& rMEvt )
736 if ( DlgEdFunc::MouseMove(rMEvt ) )
737 return true;
738 Point aPos( m_pParent->PixelToLogic( rMEvt.GetPosPixel() ) );
740 if ( m_rView.IsCreateObj() )
742 m_rView.SetOrtho(SdrObjCustomShape::doConstructOrthogonal(m_rView.getReportSection()->getSectionWindow()->getViewsWindow()->getShapeType()) ? !rMEvt.IsShift() : rMEvt.IsShift());
743 m_rView.SetAngleSnapEnabled(rMEvt.IsShift());
746 bool bIsSetPoint = false;
747 if ( m_rView.IsAction() )
749 if ( m_rView.IsDragResize() )
751 // we resize the object don't resize to above sections
752 if ( aPos.Y() < 0 )
754 aPos.setY( 0 );
757 bIsSetPoint = setMovementPointer(rMEvt);
758 ForceScroll(aPos);
759 m_pParent->getSectionWindow()->getViewsWindow()->MovAction(aPos,&m_rView, false);
762 if ( !bIsSetPoint )
763 m_pParent->SetPointer( m_rView.GetPreferredPointer( aPos, m_pParent) );
765 return true;
769 DlgEdFuncSelect::DlgEdFuncSelect( OReportSection* _pParent ) :
770 DlgEdFunc( _pParent )
775 DlgEdFuncSelect::~DlgEdFuncSelect()
780 bool DlgEdFuncSelect::MouseButtonDown( const MouseEvent& rMEvt )
782 m_bSelectionMode = false;
783 if ( DlgEdFunc::MouseButtonDown(rMEvt) )
784 return true;
786 SdrViewEvent aVEvt;
787 const SdrHitKind eHit = m_rView.PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt);
788 if( eHit == SdrHitKind::UnmarkedObject )
790 // if not multi selection, unmark all
791 if ( !rMEvt.IsShift() )
792 m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(nullptr);
794 if ( m_rView.MarkObj(m_aMDPos) && rMEvt.IsLeft() )
796 // drag object
797 m_pParent->getSectionWindow()->getViewsWindow()->BegDragObj(m_aMDPos, m_rView.PickHandle(m_aMDPos), &m_rView);
799 else
801 // select object
802 m_pParent->getSectionWindow()->getViewsWindow()->BegMarkObj(m_aMDPos,&m_rView);
805 else
807 if( !rMEvt.IsShift() )
808 m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(nullptr);
810 if ( rMEvt.GetClicks() == 1 )
812 m_bSelectionMode = true;
813 m_pParent->getSectionWindow()->getViewsWindow()->BegMarkObj( m_aMDPos ,&m_rView);
815 else
817 m_rView.SdrBeginTextEdit( aVEvt.pRootObj,m_rView.GetSdrPageView(),m_pParent );
821 return true;
825 bool DlgEdFuncSelect::MouseButtonUp( const MouseEvent& rMEvt )
827 if ( DlgEdFunc::MouseButtonUp( rMEvt ) )
828 return true;
830 // get view from parent
831 const Point aPnt( m_pParent->PixelToLogic( rMEvt.GetPosPixel() ) );
833 if ( rMEvt.IsLeft() ) // left mousebutton pressed
834 checkMovementAllowed(rMEvt);
836 m_pParent->getSectionWindow()->getViewsWindow()->EndAction();
837 checkTwoCklicks(rMEvt);
839 m_pParent->SetPointer( m_rView.GetPreferredPointer( aPnt, m_pParent) );
841 if ( !m_bUiActive )
842 m_pParent->getSectionWindow()->getViewsWindow()->getView()->getReportView()->UpdatePropertyBrowserDelayed(m_rView);
843 m_bSelectionMode = false;
844 return true;
848 bool DlgEdFuncSelect::MouseMove( const MouseEvent& rMEvt )
850 if ( DlgEdFunc::MouseMove(rMEvt ) )
851 return true;
853 Point aPnt( m_pParent->PixelToLogic( rMEvt.GetPosPixel() ) );
854 bool bIsSetPoint = false;
856 if ( m_rView.IsAction() ) // Drag Mode
858 bIsSetPoint = setMovementPointer(rMEvt);
859 ForceScroll(aPnt);
860 if (m_rView.GetDragMethod()==nullptr)
862 // create a selection
863 m_pParent->getSectionWindow()->getViewsWindow()->MovAction(aPnt, &m_rView, false);
865 else
867 if ( m_rView.IsDragResize() )
869 // we resize the object don't resize to above sections
870 if ( aPnt.Y() < 0 )
872 aPnt.setY( 0 );
875 // drag or resize an object
876 bool bControlKey = rMEvt.IsMod1();
877 m_pParent->getSectionWindow()->getViewsWindow()->MovAction(aPnt, &m_rView, bControlKey);
881 if ( !bIsSetPoint )
883 m_pParent->SetPointer( m_rView.GetPreferredPointer( aPnt, m_pParent) );
885 // restore color
886 unColorizeOverlappedObj();
889 return true;
895 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */