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