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