Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
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/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
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 .
18 : */
19 : #include <vcl/scrbar.hxx>
20 : #include <vcl/svapp.hxx>
21 : #include <vcl/seleng.hxx>
22 : #include <com/sun/star/linguistic2/XSpellChecker1.hpp>
23 : #include <com/sun/star/embed/EmbedStates.hpp>
24 : #include <com/sun/star/embed/XEmbeddedObject.hpp>
25 : #include <com/sun/star/beans/XPropertySet.hpp>
26 :
27 : #include <svx/svdview.hxx>
28 : #include <svx/svdpagv.hxx>
29 : #include <editeng/outlobj.hxx>
30 : #include <editeng/unolingu.hxx>
31 : #include <svx/svdetc.hxx>
32 : #include <editeng/editstat.hxx>
33 : #include <svx/svdoutl.hxx>
34 : #include <svx/svddrgmt.hxx>
35 : #include <svx/svdoashp.hxx>
36 : #include <svx/svxids.hrc>
37 : #include <svx/svditer.hxx>
38 :
39 : #include <toolkit/helper/vclunohelper.hxx>
40 :
41 : #include "dlgedfunc.hxx"
42 : #include "ReportSection.hxx"
43 : #include "DesignView.hxx"
44 : #include "ReportController.hxx"
45 : #include "SectionView.hxx"
46 : #include "ViewsWindow.hxx"
47 : #include "ReportWindow.hxx"
48 : #include "RptObject.hxx"
49 : #include "ScrollHelper.hxx"
50 : #include "UITools.hxx"
51 :
52 : #include <uistrings.hrc>
53 : #include "UndoEnv.hxx"
54 : #include <RptModel.hxx>
55 : #include <tools/diagnose_ex.h>
56 :
57 : #define DEFAUL_MOVE_SIZE 100
58 : namespace rptui
59 : {
60 : using namespace ::com::sun::star;
61 :
62 :
63 :
64 :
65 0 : IMPL_LINK_NOARG_TYPED( DlgEdFunc, ScrollTimeout, Timer *, void )
66 : {
67 0 : ForceScroll( m_pParent->PixelToLogic( m_pParent->GetPointerPosPixel() ) );
68 0 : }
69 :
70 :
71 :
72 0 : void DlgEdFunc::ForceScroll( const Point& rPos )
73 : {
74 0 : aScrollTimer.Stop();
75 :
76 0 : OReportWindow* pReportWindow = m_pParent->getSectionWindow()->getViewsWindow()->getView();
77 0 : OScrollWindowHelper* pScrollWindow = pReportWindow->getScrollWindow();
78 :
79 0 : Size aOut = pReportWindow->GetOutputSizePixel();
80 0 : Fraction aStartWidth(long(REPORT_STARTMARKER_WIDTH));
81 0 : aStartWidth *= m_pParent->GetMapMode().GetScaleX();
82 :
83 0 : aOut.Width() -= (long)aStartWidth;
84 0 : aOut.Height() = m_pParent->GetOutputSizePixel().Height();
85 :
86 0 : Point aPos = pScrollWindow->getThumbPos();
87 0 : aPos.X() *= 0.5;
88 0 : aPos.Y() *= 0.5;
89 0 : Rectangle aOutRect( aPos, aOut );
90 0 : aOutRect = m_pParent->PixelToLogic( aOutRect );
91 0 : Rectangle aWorkArea(Point(), pScrollWindow->getTotalSize());
92 0 : aWorkArea.Right() -= (long)aStartWidth;
93 0 : aWorkArea = pScrollWindow->PixelToLogic( aWorkArea );
94 0 : if( !aOutRect.IsInside( rPos ) && aWorkArea.IsInside( rPos ) )
95 : {
96 0 : ScrollBar& rHScroll = pScrollWindow->GetHScroll();
97 0 : ScrollBar& rVScroll = pScrollWindow->GetVScroll();
98 0 : ScrollType eH = SCROLL_LINEDOWN,eV = SCROLL_LINEDOWN;
99 0 : if( rPos.X() < aOutRect.Left() )
100 0 : eH = SCROLL_LINEUP;
101 0 : else if( rPos.X() <= aOutRect.Right() )
102 0 : eH = SCROLL_DONTKNOW;
103 :
104 0 : if( rPos.Y() < aOutRect.Top() )
105 0 : eV = SCROLL_LINEUP;
106 0 : else if( rPos.Y() <= aOutRect.Bottom() )
107 0 : eV = SCROLL_DONTKNOW;
108 :
109 0 : rHScroll.DoScrollAction(eH);
110 0 : rVScroll.DoScrollAction(eV);
111 : }
112 :
113 0 : aScrollTimer.Start();
114 0 : }
115 :
116 0 : DlgEdFunc::DlgEdFunc( OReportSection* _pParent )
117 : : m_pParent(_pParent)
118 0 : , m_rView(_pParent->getSectionView())
119 : , m_xOverlappingObj(NULL)
120 : , m_pOverlappingObj(NULL)
121 : , m_nOverlappedControlColor(0)
122 : , m_nOldColor(0)
123 : , m_bSelectionMode(false)
124 : , m_bUiActive(false)
125 0 : , m_bShowPropertyBrowser(false)
126 : {
127 0 : aScrollTimer.SetTimeoutHdl( LINK( this, DlgEdFunc, ScrollTimeout ) );
128 0 : m_rView.SetActualWin( m_pParent);
129 0 : aScrollTimer.SetTimeout( SELENG_AUTOREPEAT_INTERVAL );
130 0 : }
131 :
132 0 : void DlgEdFunc::setOverlappedControlColor(sal_Int32 _nColor)
133 : {
134 0 : m_nOverlappedControlColor = _nColor;
135 0 : }
136 :
137 0 : sal_Int32 lcl_setColorOfObject(uno::Reference< uno::XInterface > _xObj, long _nColorTRGB)
138 : {
139 0 : sal_Int32 nBackColor = 0;
140 : try
141 : {
142 0 : uno::Reference<report::XReportComponent> xComponent(_xObj, uno::UNO_QUERY_THROW);
143 0 : uno::Reference< beans::XPropertySet > xProp(xComponent, uno::UNO_QUERY_THROW);
144 0 : uno::Any aAny = xProp->getPropertyValue(PROPERTY_CONTROLBACKGROUND);
145 0 : if (aAny.hasValue())
146 : {
147 0 : aAny >>= nBackColor;
148 : // try to set background color at the ReportComponent
149 0 : uno::Any aBlackColorAny = uno::makeAny(_nColorTRGB);
150 0 : xProp->setPropertyValue(PROPERTY_CONTROLBACKGROUND, aBlackColorAny);
151 0 : }
152 : }
153 0 : catch(uno::Exception&)
154 : {
155 : }
156 0 : return nBackColor;
157 : }
158 :
159 0 : DlgEdFunc::~DlgEdFunc()
160 : {
161 0 : unColorizeOverlappedObj();
162 0 : aScrollTimer.Stop();
163 0 : }
164 :
165 :
166 :
167 0 : bool DlgEdFunc::MouseButtonDown( const MouseEvent& rMEvt )
168 : {
169 0 : m_aMDPos = m_pParent->PixelToLogic( rMEvt.GetPosPixel() );
170 0 : m_pParent->GrabFocus();
171 0 : bool bHandled = false;
172 0 : if ( rMEvt.IsLeft() )
173 : {
174 0 : if ( rMEvt.GetClicks() > 1 )
175 : {
176 : // show property browser
177 0 : if ( m_pParent->GetMode() != RPTUI_READONLY )
178 : {
179 0 : uno::Sequence<beans::PropertyValue> aArgs(1);
180 0 : aArgs[0].Name = "ShowProperties";
181 0 : aArgs[0].Value <<= sal_True;
182 0 : m_pParent->getSectionWindow()->getViewsWindow()->getView()->getReportView()->getController().executeUnChecked(SID_SHOW_PROPERTYBROWSER,aArgs);
183 0 : m_pParent->getSectionWindow()->getViewsWindow()->getView()->getReportView()->UpdatePropertyBrowserDelayed(m_rView);
184 : // TODO character in shapes
185 : // SdrViewEvent aVEvt;
186 : // m_rView.PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt);
187 : // if ( aVEvt.pRootObj && aVEvt.pRootObj->ISA(SdrTextObj) )
188 : // SetInEditMode(static_cast<SdrTextObj *>(aVEvt.pRootObj),rMEvt, sal_False);
189 0 : bHandled = true;
190 : }
191 : }
192 : else
193 : {
194 0 : SdrHdl* pHdl = m_rView.PickHandle(m_aMDPos);
195 :
196 : // if selected object was hit, drag object
197 0 : if ( pHdl!=NULL || m_rView.IsMarkedHit(m_aMDPos) )
198 : {
199 0 : bHandled = true;
200 0 : m_pParent->CaptureMouse();
201 0 : m_pParent->getSectionWindow()->getViewsWindow()->BegDragObj(m_aMDPos, pHdl,&m_rView);
202 : }
203 : }
204 : }
205 0 : else if ( rMEvt.IsRight() && !rMEvt.IsLeft() && rMEvt.GetClicks() == 1 ) // mark object when context menu was selected
206 : {
207 0 : SdrPageView* pPV = m_rView.GetSdrPageView();
208 0 : SdrViewEvent aVEvt;
209 0 : if ( m_rView.PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt) != SDRHIT_MARKEDOBJECT && !rMEvt.IsShift() )
210 0 : m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(NULL);
211 0 : if ( aVEvt.pRootObj )
212 0 : m_rView.MarkObj(aVEvt.pRootObj, pPV);
213 : else
214 0 : m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(NULL);
215 :
216 0 : bHandled = true;
217 : }
218 0 : else if( !rMEvt.IsLeft() )
219 0 : bHandled = true;
220 0 : if ( !bHandled )
221 0 : m_pParent->CaptureMouse();
222 0 : return bHandled;
223 : }
224 :
225 :
226 :
227 0 : bool DlgEdFunc::MouseButtonUp( const MouseEvent& /*rMEvt*/ )
228 : {
229 0 : bool bHandled = false;
230 0 : m_pParent->getSectionWindow()->getViewsWindow()->stopScrollTimer();
231 0 : return bHandled;
232 : }
233 :
234 0 : void DlgEdFunc::checkTwoCklicks(const MouseEvent& rMEvt)
235 : {
236 0 : deactivateOle();
237 :
238 0 : const sal_uInt16 nClicks = rMEvt.GetClicks();
239 0 : if ( nClicks == 2 && rMEvt.IsLeft() )
240 : {
241 0 : if ( m_rView.AreObjectsMarked() )
242 : {
243 0 : const SdrMarkList& rMarkList = m_rView.GetMarkedObjectList();
244 0 : if (rMarkList.GetMarkCount() == 1)
245 : {
246 0 : const SdrMark* pMark = rMarkList.GetMark(0);
247 0 : SdrObject* pObj = pMark->GetMarkedSdrObj();
248 0 : activateOle(pObj);
249 : }
250 : }
251 : }
252 0 : }
253 :
254 0 : void DlgEdFunc::stopScrollTimer()
255 : {
256 0 : unColorizeOverlappedObj();
257 0 : aScrollTimer.Stop();
258 0 : if ( m_pParent->IsMouseCaptured() )
259 0 : m_pParent->ReleaseMouse();
260 0 : }
261 :
262 :
263 0 : bool DlgEdFunc::MouseMove( const MouseEvent& /*rMEvt*/ )
264 : {
265 0 : return false;
266 : }
267 :
268 0 : bool DlgEdFunc::handleKeyEvent(const KeyEvent& _rEvent)
269 : {
270 0 : bool bReturn = false;
271 :
272 0 : if ( !m_bUiActive )
273 : {
274 0 : const vcl::KeyCode& rCode = _rEvent.GetKeyCode();
275 0 : sal_uInt16 nCode = rCode.GetCode();
276 :
277 0 : switch ( nCode )
278 : {
279 : case KEY_ESCAPE:
280 : {
281 0 : if ( m_pParent->getSectionWindow()->getViewsWindow()->IsAction() )
282 : {
283 0 : m_pParent->getSectionWindow()->getViewsWindow()->BrkAction();
284 0 : bReturn = true;
285 : }
286 0 : else if ( m_rView.IsTextEdit() )
287 : {
288 0 : m_rView.SdrEndTextEdit();
289 0 : bReturn = true;
290 : }
291 0 : else if ( m_rView.AreObjectsMarked() )
292 : {
293 0 : const SdrHdlList& rHdlList = m_rView.GetHdlList();
294 0 : SdrHdl* pHdl = rHdlList.GetFocusHdl();
295 0 : if ( pHdl )
296 0 : ((SdrHdlList&)rHdlList).ResetFocusHdl();
297 : else
298 0 : m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(NULL);
299 :
300 0 : deactivateOle(true);
301 0 : bReturn = false;
302 : }
303 : else
304 : {
305 0 : deactivateOle(true);
306 : }
307 : }
308 0 : break;
309 : case KEY_TAB:
310 : {
311 0 : if ( !rCode.IsMod1() && !rCode.IsMod2() )
312 : {
313 : // mark next object
314 0 : if ( !m_rView.MarkNextObj( !rCode.IsShift() ) )
315 : {
316 : // if no next object, mark first/last
317 0 : m_rView.UnmarkAllObj();
318 0 : m_rView.MarkNextObj( !rCode.IsShift() );
319 : }
320 :
321 0 : if ( m_rView.AreObjectsMarked() )
322 0 : m_rView.MakeVisible( m_rView.GetAllMarkedRect(), *m_pParent);
323 :
324 0 : bReturn = true;
325 : }
326 0 : else if ( rCode.IsMod1() && rCode.IsMod2())
327 : {
328 : // selected handle
329 0 : const SdrHdlList& rHdlList = m_rView.GetHdlList();
330 0 : ((SdrHdlList&)rHdlList).TravelFocusHdl( !rCode.IsShift() );
331 :
332 : // guarantee visibility of focused handle
333 0 : SdrHdl* pHdl = rHdlList.GetFocusHdl();
334 0 : if ( pHdl )
335 : {
336 0 : Point aHdlPosition( pHdl->GetPos() );
337 0 : Rectangle aVisRect( aHdlPosition - Point( DEFAUL_MOVE_SIZE, DEFAUL_MOVE_SIZE ), Size( 200, 200 ) );
338 0 : m_rView.MakeVisible( aVisRect, *m_pParent);
339 : }
340 :
341 0 : bReturn = true;
342 : }
343 : }
344 0 : break;
345 : case KEY_UP:
346 : case KEY_DOWN:
347 : case KEY_LEFT:
348 : case KEY_RIGHT:
349 : {
350 0 : m_pParent->getSectionWindow()->getViewsWindow()->handleKey(rCode);
351 0 : bReturn = true;
352 : }
353 0 : break;
354 : case KEY_RETURN:
355 0 : if ( !rCode.IsMod1() )
356 : {
357 0 : const SdrMarkList& rMarkList = m_rView.GetMarkedObjectList();
358 0 : if ( rMarkList.GetMarkCount() == 1 )
359 : {
360 0 : SdrObject* pObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj();
361 0 : activateOle(pObj);
362 : }
363 : }
364 0 : break;
365 : case KEY_DELETE:
366 0 : if ( !rCode.IsMod1() && !rCode.IsMod2() )
367 : {
368 0 : bReturn = true;
369 0 : break;
370 : }
371 : // run through
372 : default:
373 : {
374 0 : bReturn = m_rView.KeyInput(_rEvent, m_pParent);
375 : }
376 0 : break;
377 : }
378 : }
379 :
380 0 : if ( bReturn && m_pParent->IsMouseCaptured() )
381 0 : m_pParent->ReleaseMouse();
382 :
383 0 : return bReturn;
384 : }
385 :
386 0 : void DlgEdFunc::activateOle(SdrObject* _pObj)
387 : {
388 0 : if ( _pObj )
389 : {
390 0 : const sal_uInt16 nSdrObjKind = _pObj->GetObjIdentifier();
391 :
392 : // OLE: activate
393 :
394 0 : if (nSdrObjKind == OBJ_OLE2)
395 : {
396 0 : bool bIsInplaceOle = false;
397 0 : if (!bIsInplaceOle)
398 : {
399 0 : SdrOle2Obj* pOleObj = dynamic_cast<SdrOle2Obj*>(_pObj);
400 0 : if (pOleObj && pOleObj->GetObjRef().is())
401 : {
402 0 : if (m_rView.IsTextEdit())
403 : {
404 0 : m_rView.SdrEndTextEdit();
405 : }
406 :
407 0 : pOleObj->AddOwnLightClient();
408 0 : pOleObj->SetWindow(VCLUnoHelper::GetInterface(m_pParent));
409 : try
410 : {
411 0 : pOleObj->GetObjRef()->changeState( embed::EmbedStates::UI_ACTIVE );
412 0 : m_bUiActive = true;
413 0 : OReportController& rController = m_pParent->getSectionWindow()->getViewsWindow()->getView()->getReportView()->getController();
414 0 : m_bShowPropertyBrowser = rController.isCommandChecked(SID_SHOW_PROPERTYBROWSER);
415 0 : if ( m_bShowPropertyBrowser )
416 0 : rController.executeChecked(SID_SHOW_PROPERTYBROWSER,uno::Sequence< beans::PropertyValue >());
417 : }
418 0 : catch( uno::Exception& )
419 : {
420 : DBG_UNHANDLED_EXCEPTION();
421 : }
422 : }
423 : }
424 : }
425 : }
426 0 : }
427 :
428 0 : void DlgEdFunc::deactivateOle(bool _bSelect)
429 : {
430 0 : OLEObjCache& rObjCache = GetSdrGlobalData().GetOLEObjCache();
431 0 : OReportController& rController = m_pParent->getSectionWindow()->getViewsWindow()->getView()->getReportView()->getController();
432 0 : const sal_uLong nCount = rObjCache.size();
433 0 : for(sal_uLong i = 0 ; i< nCount;++i)
434 : {
435 0 : SdrOle2Obj* pObj = rObjCache[i];
436 0 : if ( m_pParent->getPage() == pObj->GetPage() )
437 : {
438 0 : uno::Reference< embed::XEmbeddedObject > xObj = pObj->GetObjRef();
439 0 : if ( xObj.is() && xObj->getCurrentState() == embed::EmbedStates::UI_ACTIVE )
440 : {
441 0 : xObj->changeState( embed::EmbedStates::RUNNING );
442 0 : m_bUiActive = false;
443 0 : if ( m_bShowPropertyBrowser )
444 : {
445 0 : rController.executeChecked(SID_SHOW_PROPERTYBROWSER,uno::Sequence< beans::PropertyValue >());
446 : }
447 :
448 0 : if ( _bSelect )
449 : {
450 0 : SdrPageView* pPV = m_rView.GetSdrPageView();
451 0 : m_rView.MarkObj(pObj, pPV);
452 : }
453 0 : }
454 : }
455 : }
456 0 : }
457 :
458 0 : void DlgEdFunc::colorizeOverlappedObject(SdrObject* _pOverlappedObj)
459 : {
460 0 : OObjectBase* pObj = dynamic_cast<OObjectBase*>(_pOverlappedObj);
461 0 : if ( pObj )
462 : {
463 0 : uno::Reference<report::XReportComponent> xComponent = pObj->getReportComponent();
464 0 : if (xComponent.is() && xComponent != m_xOverlappingObj)
465 : {
466 0 : OReportModel* pRptModel = static_cast<OReportModel*>(_pOverlappedObj->GetModel());
467 0 : if ( pRptModel )
468 : {
469 0 : OXUndoEnvironment::OUndoEnvLock aLock(pRptModel->GetUndoEnv());
470 :
471 : // uncolorize an old object, if there is one
472 0 : unColorizeOverlappedObj();
473 :
474 0 : m_nOldColor = lcl_setColorOfObject(xComponent, m_nOverlappedControlColor);
475 0 : m_xOverlappingObj = xComponent;
476 0 : m_pOverlappingObj = _pOverlappedObj;
477 : }
478 0 : }
479 : }
480 0 : }
481 :
482 0 : void DlgEdFunc::unColorizeOverlappedObj()
483 : {
484 : // uncolorize an old object, if there is one
485 0 : if (m_xOverlappingObj.is())
486 : {
487 0 : OReportModel* pRptModel = static_cast<OReportModel*>(m_pOverlappingObj->GetModel());
488 0 : if ( pRptModel )
489 : {
490 0 : OXUndoEnvironment::OUndoEnvLock aLock(pRptModel->GetUndoEnv());
491 :
492 0 : lcl_setColorOfObject(m_xOverlappingObj, m_nOldColor);
493 0 : m_xOverlappingObj = NULL;
494 0 : m_pOverlappingObj = NULL;
495 : }
496 : }
497 0 : }
498 :
499 0 : bool DlgEdFunc::isOverlapping(const MouseEvent& rMEvt)
500 : {
501 0 : SdrViewEvent aVEvt;
502 0 : bool bOverlapping = m_rView.PickAnything(rMEvt, SdrMouseEventKind::BUTTONUP, aVEvt) != SDRHIT_NONE;
503 0 : if (bOverlapping && aVEvt.pObj)
504 : {
505 0 : colorizeOverlappedObject(aVEvt.pObj);
506 : }
507 : else
508 : {
509 0 : unColorizeOverlappedObj();
510 : }
511 :
512 0 : return bOverlapping;
513 : }
514 :
515 0 : void DlgEdFunc::checkMovementAllowed(const MouseEvent& rMEvt)
516 : {
517 0 : if ( m_pParent->getSectionWindow()->getViewsWindow()->IsDragObj() )
518 : {
519 0 : if ( isRectangleHit(rMEvt) )
520 : {
521 : // there is an other component under use, break action
522 0 : m_pParent->getSectionWindow()->getViewsWindow()->BrkAction();
523 : }
524 : // object was dragged
525 0 : Point aPnt( m_pParent->PixelToLogic( rMEvt.GetPosPixel() ) );
526 0 : if (m_bSelectionMode)
527 : {
528 0 : m_pParent->getSectionWindow()->getViewsWindow()->EndAction();
529 : }
530 : else
531 : {
532 0 : bool bControlKeyPressed = rMEvt.IsMod1();
533 : // Don't allow points smaller 0
534 0 : if (bControlKeyPressed && (aPnt.Y() < 0))
535 : {
536 0 : aPnt.Y() = 0;
537 : }
538 0 : if (m_rView.IsDragResize())
539 : {
540 : // we resize the object don't resize to above sections
541 0 : if ( aPnt.Y() < 0 )
542 : {
543 0 : aPnt.Y() = 0;
544 : }
545 : }
546 0 : m_pParent->getSectionWindow()->getViewsWindow()->EndDragObj( bControlKeyPressed, &m_rView, aPnt );
547 : }
548 0 : m_pParent->getSectionWindow()->getViewsWindow()->ForceMarkedToAnotherPage();
549 0 : m_pParent->Invalidate(InvalidateFlags::Children);
550 : }
551 : else
552 0 : m_pParent->getSectionWindow()->getViewsWindow()->EndAction();
553 0 : }
554 :
555 0 : bool DlgEdFunc::isOnlyCustomShapeMarked()
556 : {
557 0 : bool bReturn = true;
558 0 : const SdrMarkList& rMarkList = m_rView.GetMarkedObjectList();
559 0 : for (size_t i = 0; i < rMarkList.GetMarkCount(); ++i )
560 : {
561 0 : SdrMark* pMark = rMarkList.GetMark(i);
562 0 : SdrObject* pObj = pMark->GetMarkedSdrObj();
563 0 : if (pObj->GetObjIdentifier() != OBJ_CUSTOMSHAPE)
564 : {
565 : // we found an object in the marked objects, which is not a custom shape.
566 0 : bReturn = false;
567 0 : break;
568 : }
569 : }
570 0 : return bReturn;
571 : }
572 :
573 0 : bool DlgEdFunc::isRectangleHit(const MouseEvent& rMEvt)
574 : {
575 0 : if (isOnlyCustomShapeMarked())
576 : {
577 0 : return false;
578 : }
579 :
580 0 : SdrViewEvent aVEvt;
581 0 : const SdrHitKind eHit = m_rView.PickAnything(rMEvt, SdrMouseEventKind::MOVE, aVEvt);
582 0 : bool bIsSetPoint = (eHit == SDRHIT_UNMARKEDOBJECT);
583 0 : if ( !bIsSetPoint )
584 : {
585 : // no drag rect, we have to check every single select rect
586 0 : const SdrDragStat& rDragStat = m_rView.GetDragStat();
587 0 : if (rDragStat.GetDragMethod() != NULL)
588 : {
589 0 : SdrObjListIter aIter(*m_pParent->getPage(),IM_DEEPNOGROUPS);
590 0 : SdrObject* pObjIter = NULL;
591 : // loop through all marked objects and check if there new rect overlapps an old one.
592 0 : while( (pObjIter = aIter.Next()) != NULL && !bIsSetPoint)
593 : {
594 0 : if ( m_rView.IsObjMarked(pObjIter)
595 0 : && (dynamic_cast<OUnoObject*>(pObjIter) != NULL || dynamic_cast<OOle2Obj*>(pObjIter) != NULL) )
596 : {
597 0 : Rectangle aNewRect = pObjIter->GetLastBoundRect();
598 0 : long nDx = rDragStat.IsHorFixed() ? 0 : rDragStat.GetDX();
599 0 : long nDy = rDragStat.IsVerFixed() ? 0 : rDragStat.GetDY();
600 0 : if ( (nDx + aNewRect.Left()) < 0 )
601 0 : nDx = -aNewRect.Left();
602 0 : if ( (nDy + aNewRect.Top()) < 0 )
603 0 : nDy = -aNewRect.Top();
604 :
605 0 : if ( rDragStat.GetDragMethod()->getMoveOnly() )
606 0 : aNewRect.Move(nDx,nDy);
607 : else
608 0 : ::ResizeRect(aNewRect,rDragStat.GetRef1(),rDragStat.GetXFact(),rDragStat.GetYFact());
609 :
610 :
611 0 : SdrObject* pObjOverlapped = isOver(aNewRect,*m_pParent->getPage(),m_rView,false,pObjIter, ISOVER_IGNORE_CUSTOMSHAPES);
612 0 : bIsSetPoint = pObjOverlapped != nullptr;
613 0 : if (pObjOverlapped && !m_bSelectionMode)
614 : {
615 0 : colorizeOverlappedObject(pObjOverlapped);
616 : }
617 : }
618 0 : }
619 : }
620 : }
621 0 : else if ( aVEvt.pObj && (aVEvt.pObj->GetObjIdentifier() != OBJ_CUSTOMSHAPE) && !m_bSelectionMode)
622 : {
623 0 : colorizeOverlappedObject(aVEvt.pObj);
624 : }
625 : else
626 0 : bIsSetPoint = false;
627 0 : return bIsSetPoint;
628 : }
629 :
630 0 : bool DlgEdFunc::setMovementPointer(const MouseEvent& rMEvt)
631 : {
632 0 : bool bIsSetPoint = isRectangleHit(rMEvt);
633 0 : if ( bIsSetPoint )
634 0 : m_pParent->SetPointer( Pointer(PointerStyle::NotAllowed));
635 : else
636 : {
637 0 : bool bCtrlKey = rMEvt.IsMod1();
638 : (void)bCtrlKey;
639 0 : if (bCtrlKey)
640 : {
641 0 : m_pParent->SetPointer( Pointer(PointerStyle::MoveDataLink ));
642 0 : bIsSetPoint = true;
643 : }
644 : }
645 0 : return bIsSetPoint;
646 : }
647 :
648 :
649 0 : DlgEdFuncInsert::DlgEdFuncInsert( OReportSection* _pParent ) :
650 0 : DlgEdFunc( _pParent )
651 : {
652 0 : m_rView.SetCreateMode( true );
653 0 : }
654 :
655 :
656 :
657 0 : DlgEdFuncInsert::~DlgEdFuncInsert()
658 : {
659 0 : m_rView.SetEditMode( true );
660 0 : }
661 :
662 :
663 :
664 0 : bool DlgEdFuncInsert::MouseButtonDown( const MouseEvent& rMEvt )
665 : {
666 0 : if ( DlgEdFunc::MouseButtonDown(rMEvt) )
667 0 : return true;
668 :
669 0 : SdrViewEvent aVEvt;
670 0 : sal_Int16 nId = m_rView.GetCurrentObjIdentifier();
671 :
672 0 : const SdrHitKind eHit = m_rView.PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt);
673 :
674 0 : if (eHit == SDRHIT_UNMARKEDOBJECT && nId != OBJ_CUSTOMSHAPE)
675 : {
676 : // there is an object under the mouse cursor, but not a customshape
677 0 : m_pParent->getSectionWindow()->getViewsWindow()->BrkAction();
678 0 : return false;
679 : }
680 :
681 : // if no action, create object
682 0 : if (!m_pParent->getSectionWindow()->getViewsWindow()->IsAction())
683 : {
684 0 : deactivateOle(true);
685 0 : if ( m_pParent->getSectionWindow()->getViewsWindow()->HasSelection() )
686 0 : m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(&m_rView);
687 0 : m_rView.BegCreateObj(m_aMDPos);
688 0 : m_pParent->getSectionWindow()->getViewsWindow()->createDefault();
689 : }
690 :
691 0 : return true;
692 : }
693 :
694 :
695 0 : bool DlgEdFuncInsert::MouseButtonUp( const MouseEvent& rMEvt )
696 : {
697 0 : if ( DlgEdFunc::MouseButtonUp( rMEvt ) )
698 0 : return true;
699 :
700 0 : const Point aPos( m_pParent->PixelToLogic( rMEvt.GetPosPixel() ) );
701 0 : const sal_uInt16 nHitLog = sal_uInt16 ( m_pParent->PixelToLogic(Size(3,0)).Width() );
702 :
703 0 : bool bReturn = true;
704 : // object creation active?
705 0 : if ( m_rView.IsCreateObj() )
706 : {
707 0 : if ( isOver(m_rView.GetCreateObj(),*m_pParent->getPage(),m_rView) )
708 : {
709 0 : m_pParent->getSectionWindow()->getViewsWindow()->BrkAction();
710 : // BrkAction disables the create mode
711 0 : m_rView.SetCreateMode( true );
712 0 : return true;
713 : }
714 :
715 0 : m_rView.EndCreateObj(SDRCREATE_FORCEEND);
716 :
717 0 : if ( !m_rView.AreObjectsMarked() )
718 : {
719 0 : m_rView.MarkObj(aPos, nHitLog);
720 : }
721 :
722 0 : bReturn = m_rView.AreObjectsMarked();
723 0 : if ( bReturn )
724 : {
725 0 : OReportController& rController = m_pParent->getSectionWindow()->getViewsWindow()->getView()->getReportView()->getController();
726 0 : const SdrMarkList& rMarkList = m_rView.GetMarkedObjectList();
727 0 : for (size_t i = 0; i < rMarkList.GetMarkCount(); ++i )
728 : {
729 0 : SdrMark* pMark = rMarkList.GetMark(i);
730 0 : OOle2Obj* pObj = dynamic_cast<OOle2Obj*>(pMark->GetMarkedSdrObj());
731 0 : if ( pObj && !pObj->IsEmpty() )
732 : {
733 0 : pObj->initializeChart(rController.getModel());
734 : }
735 : }
736 : }
737 : }
738 : else
739 0 : checkMovementAllowed(rMEvt);
740 :
741 0 : if ( !m_rView.AreObjectsMarked() &&
742 0 : std::abs(m_aMDPos.X() - aPos.X()) < nHitLog &&
743 0 : std::abs(m_aMDPos.Y() - aPos.Y()) < nHitLog &&
744 0 : !rMEvt.IsShift() && !rMEvt.IsMod2() )
745 : {
746 0 : SdrPageView* pPV = m_rView.GetSdrPageView();
747 0 : SdrViewEvent aVEvt;
748 0 : m_rView.PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt);
749 0 : m_rView.MarkObj(aVEvt.pRootObj, pPV);
750 : }
751 0 : checkTwoCklicks(rMEvt);
752 0 : m_pParent->getSectionWindow()->getViewsWindow()->getView()->getReportView()->UpdatePropertyBrowserDelayed(m_rView);
753 0 : return bReturn;
754 : }
755 :
756 :
757 :
758 0 : bool DlgEdFuncInsert::MouseMove( const MouseEvent& rMEvt )
759 : {
760 0 : if ( DlgEdFunc::MouseMove(rMEvt ) )
761 0 : return true;
762 0 : Point aPos( m_pParent->PixelToLogic( rMEvt.GetPosPixel() ) );
763 :
764 0 : if ( m_rView.IsCreateObj() )
765 : {
766 0 : m_rView.SetOrtho(SdrObjCustomShape::doConstructOrthogonal(m_rView.getReportSection()->getSectionWindow()->getViewsWindow()->getShapeType()) ? !rMEvt.IsShift() : rMEvt.IsShift());
767 0 : m_rView.SetAngleSnapEnabled(rMEvt.IsShift());
768 : }
769 :
770 0 : bool bIsSetPoint = false;
771 0 : if ( m_rView.IsAction() )
772 : {
773 0 : if ( m_rView.IsDragResize() )
774 : {
775 : // we resize the object don't resize to above sections
776 0 : if ( aPos.Y() < 0 )
777 : {
778 0 : aPos.Y() = 0;
779 : }
780 : }
781 0 : bIsSetPoint = setMovementPointer(rMEvt);
782 0 : ForceScroll(aPos);
783 0 : m_pParent->getSectionWindow()->getViewsWindow()->MovAction(aPos,&m_rView, m_rView.GetDragMethod() == NULL, false);
784 : }
785 :
786 0 : if ( !bIsSetPoint )
787 0 : m_pParent->SetPointer( m_rView.GetPreferredPointer( aPos, m_pParent) );
788 :
789 0 : return true;
790 : }
791 :
792 :
793 :
794 0 : DlgEdFuncSelect::DlgEdFuncSelect( OReportSection* _pParent ) :
795 0 : DlgEdFunc( _pParent )
796 : {
797 0 : }
798 :
799 :
800 :
801 0 : DlgEdFuncSelect::~DlgEdFuncSelect()
802 : {
803 0 : }
804 :
805 :
806 :
807 0 : bool DlgEdFuncSelect::MouseButtonDown( const MouseEvent& rMEvt )
808 : {
809 0 : m_bSelectionMode = false;
810 0 : if ( DlgEdFunc::MouseButtonDown(rMEvt) )
811 0 : return true;
812 :
813 0 : SdrViewEvent aVEvt;
814 0 : const SdrHitKind eHit = m_rView.PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt);
815 0 : if( eHit == SDRHIT_UNMARKEDOBJECT )
816 : {
817 : // if not multi selection, unmark all
818 0 : if ( !rMEvt.IsShift() )
819 0 : m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(NULL);
820 :
821 0 : if ( m_rView.MarkObj(m_aMDPos) && rMEvt.IsLeft() )
822 : {
823 : // drag object
824 0 : m_pParent->getSectionWindow()->getViewsWindow()->BegDragObj(m_aMDPos, m_rView.PickHandle(m_aMDPos), &m_rView);
825 : }
826 : else
827 : {
828 : // select object
829 0 : m_pParent->getSectionWindow()->getViewsWindow()->BegMarkObj(m_aMDPos,&m_rView);
830 : }
831 : }
832 : else
833 : {
834 0 : if( !rMEvt.IsShift() )
835 0 : m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(NULL);
836 :
837 0 : if ( rMEvt.GetClicks() == 1 )
838 : {
839 0 : m_bSelectionMode = true;
840 0 : m_pParent->getSectionWindow()->getViewsWindow()->BegMarkObj( m_aMDPos ,&m_rView);
841 : }
842 : else
843 : {
844 0 : m_rView.SdrBeginTextEdit( aVEvt.pRootObj,m_rView.GetSdrPageView(),m_pParent, false );
845 : }
846 : }
847 :
848 0 : return true;
849 : }
850 :
851 :
852 :
853 0 : bool DlgEdFuncSelect::MouseButtonUp( const MouseEvent& rMEvt )
854 : {
855 0 : if ( DlgEdFunc::MouseButtonUp( rMEvt ) )
856 0 : return true;
857 :
858 : // get view from parent
859 0 : const Point aPnt( m_pParent->PixelToLogic( rMEvt.GetPosPixel() ) );
860 :
861 0 : if ( rMEvt.IsLeft() ) // left mousebutton pressed
862 0 : checkMovementAllowed(rMEvt);
863 :
864 0 : m_pParent->getSectionWindow()->getViewsWindow()->EndAction();
865 0 : checkTwoCklicks(rMEvt);
866 :
867 0 : m_pParent->SetPointer( m_rView.GetPreferredPointer( aPnt, m_pParent) );
868 :
869 0 : if ( !m_bUiActive )
870 0 : m_pParent->getSectionWindow()->getViewsWindow()->getView()->getReportView()->UpdatePropertyBrowserDelayed(m_rView);
871 0 : m_bSelectionMode = false;
872 0 : return true;
873 : }
874 :
875 :
876 :
877 0 : bool DlgEdFuncSelect::MouseMove( const MouseEvent& rMEvt )
878 : {
879 0 : if ( DlgEdFunc::MouseMove(rMEvt ) )
880 0 : return true;
881 :
882 0 : Point aPnt( m_pParent->PixelToLogic( rMEvt.GetPosPixel() ) );
883 0 : bool bIsSetPoint = false;
884 :
885 0 : if ( m_rView.IsAction() ) // Drag Mode
886 : {
887 0 : bIsSetPoint = setMovementPointer(rMEvt);
888 0 : ForceScroll(aPnt);
889 0 : if (m_rView.GetDragMethod()==NULL)
890 : {
891 : // create a selection
892 0 : m_pParent->getSectionWindow()->getViewsWindow()->MovAction(aPnt, &m_rView, true, false);
893 : }
894 : else
895 : {
896 0 : if ( m_rView.IsDragResize() )
897 : {
898 : // we resize the object don't resize to above sections
899 0 : if ( aPnt.Y() < 0 )
900 : {
901 0 : aPnt.Y() = 0;
902 : }
903 : }
904 : // drag or resize an object
905 0 : bool bControlKey = rMEvt.IsMod1();
906 0 : m_pParent->getSectionWindow()->getViewsWindow()->MovAction(aPnt, &m_rView, false, bControlKey);
907 : }
908 : }
909 :
910 0 : if ( !bIsSetPoint )
911 : {
912 0 : m_pParent->SetPointer( m_rView.GetPreferredPointer( aPnt, m_pParent) );
913 :
914 : // restore color
915 0 : unColorizeOverlappedObj();
916 : }
917 :
918 0 : return true;
919 : }
920 :
921 :
922 3 : }
923 :
924 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|