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