summaryrefslogtreecommitdiff
path: root/reportdesign/source/ui/report/dlgedfunc.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'reportdesign/source/ui/report/dlgedfunc.cxx')
-rw-r--r--reportdesign/source/ui/report/dlgedfunc.cxx1119
1 files changed, 1119 insertions, 0 deletions
diff --git a/reportdesign/source/ui/report/dlgedfunc.cxx b/reportdesign/source/ui/report/dlgedfunc.cxx
new file mode 100644
index 000000000000..1535ce7d6ee1
--- /dev/null
+++ b/reportdesign/source/ui/report/dlgedfunc.cxx
@@ -0,0 +1,1119 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#include "precompiled_reportdesign.hxx"
+#include <vcl/scrbar.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/seleng.hxx>
+#include <com/sun/star/linguistic2/XSpellChecker1.hpp>
+#include <com/sun/star/embed/EmbedStates.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+
+#include <svx/svdview.hxx>
+#include <svx/svdpagv.hxx>
+#include <editeng/outlobj.hxx>
+#include <editeng/unolingu.hxx>
+#include <svx/svdetc.hxx>
+#include <editeng/editstat.hxx>
+#include <svx/svdoutl.hxx>
+#include <svx/svddrgmt.hxx>
+#include <svx/svdoashp.hxx>
+#include <svx/svxids.hrc>
+#include <svx/svditer.hxx>
+
+#include <toolkit/helper/vclunohelper.hxx>
+
+#include "dlgedfunc.hxx"
+#include "ReportSection.hxx"
+#include "DesignView.hxx"
+#include "ReportController.hxx"
+#include "SectionView.hxx"
+#include "ViewsWindow.hxx"
+#include "ReportWindow.hxx"
+#include "RptObject.hxx"
+#include "ScrollHelper.hxx"
+
+#include "ReportRuler.hxx"
+#include "UITools.hxx"
+
+#include <uistrings.hrc>
+#include "UndoEnv.hxx"
+#include <RptModel.hxx>
+#include <tools/diagnose_ex.h>
+
+#define DEFAUL_MOVE_SIZE 100
+namespace rptui
+{
+using namespace ::com::sun::star;
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+
+IMPL_LINK( DlgEdFunc, ScrollTimeout, Timer *, )
+{
+ ForceScroll( m_pParent->PixelToLogic( m_pParent->GetPointerPosPixel() ) );
+ return 0;
+}
+
+//----------------------------------------------------------------------------
+
+void DlgEdFunc::ForceScroll( const Point& rPos )
+{
+ aScrollTimer.Stop();
+
+ OReportWindow* pReportWindow = m_pParent->getSectionWindow()->getViewsWindow()->getView();
+ OScrollWindowHelper* pScrollWindow = pReportWindow->getScrollWindow();
+
+ Size aOut = pReportWindow->GetOutputSizePixel();
+ Fraction aStartWidth(long(REPORT_STARTMARKER_WIDTH));
+ aStartWidth *= m_pParent->GetMapMode().GetScaleX();
+
+ aOut.Width() -= (long)aStartWidth;
+
+ Rectangle aOutRect( pScrollWindow->getThumbPos(), aOut );
+ aOutRect = m_pParent->PixelToLogic( aOutRect );
+ //Rectangle aWorkArea = m_pParent->getView()->GetWorkArea();
+ Point aGcc3WorkaroundTemporary;
+ Rectangle aWorkArea(aGcc3WorkaroundTemporary,pScrollWindow->getTotalSize());
+ aWorkArea.Right() -= (long)aStartWidth;
+ aWorkArea = pScrollWindow->PixelToLogic( aWorkArea );
+ if( !aOutRect.IsInside( rPos ) && aWorkArea.IsInside( rPos ) )
+ {
+ ScrollBar* pHScroll = pScrollWindow->GetHScroll();
+ ScrollBar* pVScroll = pScrollWindow->GetVScroll();
+ ScrollType eH = SCROLL_LINEDOWN,eV = SCROLL_LINEDOWN;
+ if( rPos.X() < aOutRect.Left() )
+ eH = SCROLL_LINEUP;
+ else if( rPos.X() <= aOutRect.Right() )
+ eH = SCROLL_DONTKNOW;
+
+ if( rPos.Y() < aOutRect.Top() )
+ eV = SCROLL_LINEUP;
+ else if( rPos.Y() <= aOutRect.Bottom() )
+ eV = SCROLL_DONTKNOW;
+
+ pHScroll->DoScrollAction(eH);
+ pVScroll->DoScrollAction(eV);
+ }
+
+ aScrollTimer.Start();
+}
+
+//----------------------------------------------------------------------------
+
+DlgEdFunc::DlgEdFunc( OReportSection* _pParent )
+:m_pParent(_pParent),
+ m_rView(_pParent->getSectionView()),
+ m_xOverlappingObj(NULL),
+ m_pOverlappingObj(NULL),
+ m_bSelectionMode(false),
+ m_bUiActive(false),
+ m_bShowPropertyBrowser(false)
+{
+ // m_pParent = _pParent;
+ aScrollTimer.SetTimeoutHdl( LINK( this, DlgEdFunc, ScrollTimeout ) );
+ m_rView.SetActualWin( m_pParent);
+ aScrollTimer.SetTimeout( SELENG_AUTOREPEAT_INTERVAL );
+}
+
+//----------------------------------------------------------------------------
+void DlgEdFunc::setOverlappedControlColor(sal_Int32 _nColor)
+{
+ m_nOverlappedControlColor = _nColor;
+}
+// -----------------------------------------------------------------------------
+sal_Int32 lcl_setColorOfObject(uno::Reference< uno::XInterface > _xObj, long _nColorTRGB)
+{
+ sal_Int32 nBackColor = 0;
+ try
+ {
+ uno::Reference<report::XReportComponent> xComponent(_xObj, uno::UNO_QUERY_THROW);
+ // NOT NEED if UNO_QUERY_THROW:
+ // if (xComponent.is())
+ // {
+ uno::Reference< beans::XPropertySet > xProp(xComponent, uno::UNO_QUERY_THROW);
+ // if (xProp.is())
+ // {
+ // ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ControlBackground"))
+ // is PROPERTY_CONTROLBACKGROUND
+ uno::Any aAny = xProp->getPropertyValue(PROPERTY_CONTROLBACKGROUND);
+ if (aAny.hasValue())
+ {
+ aAny >>= nBackColor;
+ // try to set background color at the ReportComponent
+ uno::Any aBlackColorAny = uno::makeAny(_nColorTRGB);
+ xProp->setPropertyValue(PROPERTY_CONTROLBACKGROUND, aBlackColorAny);
+ }
+ // aCopies.push_back(xComponent->createClone());
+ }
+ catch(uno::Exception&)
+ {
+ // bit my shiny metal as!
+ // OSL_ENSURE(0,"Can't copy report elements!");
+ }
+ return nBackColor;
+}
+// -----------------------------------------------------------------------------
+DlgEdFunc::~DlgEdFunc()
+{
+ unColorizeOverlappedObj();
+ aScrollTimer.Stop();
+}
+
+//----------------------------------------------------------------------------
+
+BOOL DlgEdFunc::MouseButtonDown( const MouseEvent& rMEvt )
+{
+ m_aMDPos = m_pParent->PixelToLogic( rMEvt.GetPosPixel() );
+ m_pParent->GrabFocus();
+ BOOL bHandled = FALSE;
+ if ( rMEvt.IsLeft() )
+ {
+ if ( rMEvt.GetClicks() > 1 )
+ {
+ // show property browser
+ if ( m_pParent->GetMode() != RPTUI_READONLY )
+ {
+ uno::Sequence<beans::PropertyValue> aArgs(1);
+ aArgs[0].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ShowProperties"));
+ aArgs[0].Value <<= sal_True;
+ m_pParent->getSectionWindow()->getViewsWindow()->getView()->getReportView()->getController().executeUnChecked(SID_SHOW_PROPERTYBROWSER,aArgs);
+ m_pParent->getSectionWindow()->getViewsWindow()->getView()->getReportView()->UpdatePropertyBrowserDelayed(m_rView);
+ // TODO character in shapes
+ // SdrViewEvent aVEvt;
+ // m_rView.PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);
+ // if ( aVEvt.pRootObj && aVEvt.pRootObj->ISA(SdrTextObj) )
+ // SetInEditMode(static_cast<SdrTextObj *>(aVEvt.pRootObj),rMEvt, FALSE);
+ bHandled = TRUE;
+ }
+ }
+ else
+ {
+ SdrHdl* pHdl = m_rView.PickHandle(m_aMDPos);
+ //m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(m_pView);
+
+ // if selected object was hit, drag object
+ if ( pHdl!=NULL || m_rView.IsMarkedHit(m_aMDPos) )
+ {
+ bHandled = TRUE;
+ m_pParent->CaptureMouse();
+ m_pParent->getSectionWindow()->getViewsWindow()->BegDragObj(m_aMDPos, pHdl,&m_rView);
+ }
+ }
+ }
+ else if ( rMEvt.IsRight() && !rMEvt.IsLeft() && rMEvt.GetClicks() == 1 ) // mark object when context menu was selected
+ {
+ SdrPageView* pPV = m_rView.GetSdrPageView();
+ SdrViewEvent aVEvt;
+ if ( m_rView.PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt) != SDRHIT_MARKEDOBJECT && !rMEvt.IsShift() )
+ m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(NULL);
+ if ( aVEvt.pRootObj )
+ m_rView.MarkObj(aVEvt.pRootObj, pPV);
+ else
+ m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(NULL);
+
+ bHandled = TRUE;
+ }
+ else if( !rMEvt.IsLeft() )
+ bHandled = TRUE;
+ if ( !bHandled )
+ m_pParent->CaptureMouse();
+ return bHandled;
+}
+
+//----------------------------------------------------------------------------
+
+BOOL DlgEdFunc::MouseButtonUp( const MouseEvent& /*rMEvt*/ )
+{
+ BOOL bHandled = FALSE;
+ m_pParent->getSectionWindow()->getViewsWindow()->stopScrollTimer();
+ return bHandled;
+}
+// -----------------------------------------------------------------------------
+void DlgEdFunc::checkTwoCklicks(const MouseEvent& rMEvt)
+{
+ deactivateOle();
+
+ const USHORT nClicks = rMEvt.GetClicks();
+ if ( nClicks == 2 && rMEvt.IsLeft() )
+ {
+ if ( m_rView.AreObjectsMarked() )
+ {
+ const SdrMarkList& rMarkList = m_rView.GetMarkedObjectList();
+ if (rMarkList.GetMarkCount() == 1)
+ {
+ const SdrMark* pMark = rMarkList.GetMark(0);
+ SdrObject* pObj = pMark->GetMarkedSdrObj();
+ activateOle(pObj);
+ } // if (rMarkList.GetMarkCount() == 1)
+ } // if ( pView->AreObjectsMarked() )
+ }
+}
+// -----------------------------------------------------------------------------
+void DlgEdFunc::stopScrollTimer()
+{
+ unColorizeOverlappedObj();
+ aScrollTimer.Stop();
+ if ( m_pParent->IsMouseCaptured() )
+ m_pParent->ReleaseMouse();
+}
+//----------------------------------------------------------------------------
+
+BOOL DlgEdFunc::MouseMove( const MouseEvent& /*rMEvt*/ )
+{
+ return FALSE;
+}
+//------------------------------------------------------------------------------
+sal_Bool DlgEdFunc::handleKeyEvent(const KeyEvent& _rEvent)
+{
+ BOOL bReturn = FALSE;
+
+ if ( !m_bUiActive )
+ {
+ const KeyCode& rCode = _rEvent.GetKeyCode();
+ USHORT nCode = rCode.GetCode();
+
+ switch ( nCode )
+ {
+ case KEY_ESCAPE:
+ {
+ if ( m_pParent->getSectionWindow()->getViewsWindow()->IsAction() )
+ {
+ m_pParent->getSectionWindow()->getViewsWindow()->BrkAction();
+ bReturn = TRUE;
+ }
+ else if ( m_rView.IsTextEdit() )
+ {
+ m_rView.SdrEndTextEdit();
+ bReturn = TRUE;
+ }
+ else if ( m_rView.AreObjectsMarked() )
+ {
+ const SdrHdlList& rHdlList = m_rView.GetHdlList();
+ SdrHdl* pHdl = rHdlList.GetFocusHdl();
+ if ( pHdl )
+ ((SdrHdlList&)rHdlList).ResetFocusHdl();
+ else
+ m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(NULL);
+ //m_rView.UnmarkAll();
+
+ deactivateOle(true);
+ bReturn = FALSE;
+ }
+ else
+ {
+ deactivateOle(true);
+ }
+ }
+ break;
+ case KEY_TAB:
+ {
+ if ( !rCode.IsMod1() && !rCode.IsMod2() )
+ {
+ // mark next object
+ if ( !m_rView.MarkNextObj( !rCode.IsShift() ) )
+ {
+ // if no next object, mark first/last
+ m_rView.UnmarkAllObj();
+ m_rView.MarkNextObj( !rCode.IsShift() );
+ }
+
+ if ( m_rView.AreObjectsMarked() )
+ m_rView.MakeVisible( m_rView.GetAllMarkedRect(), *m_pParent);
+
+ bReturn = TRUE;
+ }
+ else if ( rCode.IsMod1() && rCode.IsMod2())
+ {
+ // selected handle
+ const SdrHdlList& rHdlList = m_rView.GetHdlList();
+ ((SdrHdlList&)rHdlList).TravelFocusHdl( !rCode.IsShift() );
+
+ // guarantee visibility of focused handle
+ SdrHdl* pHdl = rHdlList.GetFocusHdl();
+ if ( pHdl )
+ {
+ Point aHdlPosition( pHdl->GetPos() );
+ Rectangle aVisRect( aHdlPosition - Point( DEFAUL_MOVE_SIZE, DEFAUL_MOVE_SIZE ), Size( 200, 200 ) );
+ m_rView.MakeVisible( aVisRect, *m_pParent);
+ }
+
+ bReturn = TRUE;
+ }
+ }
+ break;
+ case KEY_UP:
+ case KEY_DOWN:
+ case KEY_LEFT:
+ case KEY_RIGHT:
+ {
+ m_pParent->getSectionWindow()->getViewsWindow()->handleKey(rCode);
+ bReturn = TRUE;
+ }
+ break;
+ case KEY_RETURN:
+ if ( !rCode.IsMod1() )
+ {
+ const SdrMarkList& rMarkList = m_rView.GetMarkedObjectList();
+ if ( rMarkList.GetMarkCount() == 1 )
+ {
+ SdrObject* pObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj();
+ activateOle(pObj);
+ }
+ }
+ break;
+ case KEY_DELETE:
+ if ( !rCode.IsMod1() && !rCode.IsMod2() )
+ {
+ bReturn = TRUE;
+ break;
+ } // if ( !rCode.IsMod1() && !rCode.IsMod2() )
+ // run through
+ default:
+ {
+ bReturn = m_rView.KeyInput(_rEvent, m_pParent);
+ }
+ break;
+ }
+ }
+
+ if ( bReturn && m_pParent->IsMouseCaptured() )
+ m_pParent->ReleaseMouse();
+
+ return bReturn;
+}
+// -----------------------------------------------------------------------------
+void DlgEdFunc::activateOle(SdrObject* _pObj)
+{
+ if ( _pObj )
+ {
+ const UINT16 nSdrObjKind = _pObj->GetObjIdentifier();
+ //
+ // OLE: activate
+ //
+ if (nSdrObjKind == OBJ_OLE2)
+ {
+ bool bIsInplaceOle = false;
+ if (!bIsInplaceOle)
+ {
+ SdrOle2Obj* pOleObj = dynamic_cast<SdrOle2Obj*>(_pObj);
+ if ( pOleObj->GetObjRef().is() )
+ {
+ if (m_rView.IsTextEdit())
+ {
+ m_rView.SdrEndTextEdit();
+ }
+
+ pOleObj->AddOwnLightClient();
+ pOleObj->SetWindow(VCLUnoHelper::GetInterface(m_pParent));
+ try
+ {
+ pOleObj->GetObjRef()->changeState( embed::EmbedStates::UI_ACTIVE );
+ m_bUiActive = true;
+ OReportController& rController = m_pParent->getSectionWindow()->getViewsWindow()->getView()->getReportView()->getController();
+ m_bShowPropertyBrowser = rController.isCommandChecked(SID_SHOW_PROPERTYBROWSER);
+ if ( m_bShowPropertyBrowser )
+ rController.executeChecked(SID_SHOW_PROPERTYBROWSER,uno::Sequence< beans::PropertyValue >());
+ }
+ catch( uno::Exception& )
+ {
+ DBG_UNHANDLED_EXCEPTION();
+ }
+ }
+ }
+ } // if (nSdrObjKind == OBJ_OLE2)
+ } // if ( _pObj )
+}
+// -----------------------------------------------------------------------------
+void DlgEdFunc::deactivateOle(bool _bSelect)
+{
+ OLEObjCache& rObjCache = GetSdrGlobalData().GetOLEObjCache();
+ const ULONG nCount = rObjCache.Count();
+ for(ULONG i = 0 ; i< nCount;++i)
+ {
+ SdrOle2Obj* pObj = reinterpret_cast<SdrOle2Obj*>(rObjCache.GetObject(i));
+ if ( m_pParent->getPage() == pObj->GetPage() )
+ {
+ uno::Reference< embed::XEmbeddedObject > xObj = pObj->GetObjRef();
+ if ( xObj.is() && xObj->getCurrentState() == embed::EmbedStates::UI_ACTIVE )
+ {
+ xObj->changeState( embed::EmbedStates::RUNNING );
+ m_bUiActive = false;
+ if ( m_bShowPropertyBrowser )
+ {
+ OReportController& rController = m_pParent->getSectionWindow()->getViewsWindow()->getView()->getReportView()->getController();
+ rController.executeChecked(SID_SHOW_PROPERTYBROWSER,uno::Sequence< beans::PropertyValue >());
+ }
+
+ if ( _bSelect )
+ {
+ SdrPageView* pPV = m_rView.GetSdrPageView();
+ m_rView.MarkObj(pObj, pPV);
+ }
+ } // if ( xObj.is() && xObj->getCurrentState() == embed::EmbedStates::UI_ACTIVE )
+ }
+ } // for(ULONG i = 0 ; i< nCount;++i)
+}
+// -----------------------------------------------------------------------------
+void DlgEdFunc::colorizeOverlappedObject(SdrObject* _pOverlappedObj)
+{
+ OObjectBase* pObj = dynamic_cast<OObjectBase*>(_pOverlappedObj);
+ if ( pObj )
+ {
+ uno::Reference<report::XReportComponent> xComponent = pObj->getReportComponent();
+ if (xComponent.is() && xComponent != m_xOverlappingObj)
+ {
+ OReportModel* pRptModel = static_cast<OReportModel*>(_pOverlappedObj->GetModel());
+ if ( pRptModel )
+ {
+ OXUndoEnvironment::OUndoEnvLock aLock(pRptModel->GetUndoEnv());
+
+ // uncolorize an old object, if there is one
+ unColorizeOverlappedObj();
+
+ m_nOldColor = lcl_setColorOfObject(xComponent, m_nOverlappedControlColor);
+ m_xOverlappingObj = xComponent;
+ m_pOverlappingObj = _pOverlappedObj;
+ }
+ }
+ }
+}
+// -----------------------------------------------------------------------------
+void DlgEdFunc::unColorizeOverlappedObj()
+{
+ // uncolorize an old object, if there is one
+ if (m_xOverlappingObj.is())
+ {
+ OReportModel* pRptModel = static_cast<OReportModel*>(m_pOverlappingObj->GetModel());
+ if ( pRptModel )
+ {
+ OXUndoEnvironment::OUndoEnvLock aLock(pRptModel->GetUndoEnv());
+
+ lcl_setColorOfObject(m_xOverlappingObj, m_nOldColor);
+ m_xOverlappingObj = NULL;
+ m_pOverlappingObj = NULL;
+ }
+ }
+}
+// -----------------------------------------------------------------------------
+bool DlgEdFunc::isOverlapping(const MouseEvent& rMEvt)
+{
+ bool bOverlapping = false;
+ SdrViewEvent aVEvt;
+ bOverlapping = m_rView.PickAnything(rMEvt, SDRMOUSEBUTTONUP, aVEvt) != SDRHIT_NONE;
+ if (bOverlapping && aVEvt.pObj)
+ {
+ colorizeOverlappedObject(aVEvt.pObj);
+ }
+ else
+ {
+ unColorizeOverlappedObj();
+ }
+
+ return bOverlapping;
+}
+// -----------------------------------------------------------------------------
+void DlgEdFunc::checkMovementAllowed(const MouseEvent& rMEvt)
+{
+ if ( m_pParent->getSectionWindow()->getViewsWindow()->IsDragObj() )
+ {
+ if ( isRectangleHit(rMEvt) )
+ {
+ // there is an other component under use, break action
+ m_pParent->getSectionWindow()->getViewsWindow()->BrkAction();
+ }
+ // object was dragged
+ Point aPnt( m_pParent->PixelToLogic( rMEvt.GetPosPixel() ) );
+ if (m_bSelectionMode)
+ {
+ m_pParent->getSectionWindow()->getViewsWindow()->EndAction();
+ }
+ else
+ {
+ bool bControlKeyPressed = rMEvt.IsMod1();
+ // Don't allow points smaller 0
+ if (bControlKeyPressed && (aPnt.Y() < 0))
+ {
+ aPnt.Y() = 0;
+ }
+ if (m_rView.IsDragResize())
+ {
+ // we resize the object don't resize to above sections
+ if ( aPnt.Y() < 0 )
+ {
+ aPnt.Y() = 0;
+ }
+ }
+ m_pParent->getSectionWindow()->getViewsWindow()->EndDragObj( bControlKeyPressed, &m_rView, aPnt );
+ }
+ m_pParent->getSectionWindow()->getViewsWindow()->ForceMarkedToAnotherPage();
+ m_pParent->Invalidate(INVALIDATE_CHILDREN);
+ }
+ else
+ m_pParent->getSectionWindow()->getViewsWindow()->EndAction();
+}
+// -----------------------------------------------------------------------------
+bool DlgEdFunc::isOnlyCustomShapeMarked()
+{
+ bool bReturn = true;
+ const SdrMarkList& rMarkList = m_rView.GetMarkedObjectList();
+ for (sal_uInt32 i = 0; i < rMarkList.GetMarkCount();++i )
+ {
+ SdrMark* pMark = rMarkList.GetMark(i);
+ // bCheck = dynamic_cast<OUnoObject*>(pMark->GetMarkedSdrObj()) != NULL;
+ SdrObject* pObj = pMark->GetMarkedSdrObj();
+ if (pObj->GetObjIdentifier() != OBJ_CUSTOMSHAPE)
+ {
+ // we found an object in the marked objects, which is not a custom shape.
+ bReturn = false;
+ break;
+ }
+ }
+ return bReturn;
+}
+// -----------------------------------------------------------------------------
+bool DlgEdFunc::isRectangleHit(const MouseEvent& rMEvt)
+{
+ if (isOnlyCustomShapeMarked())
+ {
+ return false;
+ }
+
+ SdrViewEvent aVEvt;
+ const SdrHitKind eHit = m_rView.PickAnything(rMEvt, SDRMOUSEMOVE, aVEvt);
+ bool bIsSetPoint = (eHit == SDRHIT_UNMARKEDOBJECT);
+ if ( !bIsSetPoint )
+ {
+ // no drag rect, we have to check every single select rect
+ //const Rectangle& rRect = m_rView.GetDragStat().GetActionRect();
+ const SdrDragStat& rDragStat = m_rView.GetDragStat();
+ if (rDragStat.GetDragMethod() != NULL)
+ {
+ SdrObjListIter aIter(*m_pParent->getPage(),IM_DEEPNOGROUPS);
+ SdrObject* pObjIter = NULL;
+ // loop through all marked objects and check if there new rect overlapps an old one.
+ while( (pObjIter = aIter.Next()) != NULL && !bIsSetPoint)
+ {
+ if ( m_rView.IsObjMarked(pObjIter)
+ && dynamic_cast<OUnoObject*>(pObjIter) != NULL )
+ {
+ Rectangle aNewRect = pObjIter->GetLastBoundRect();
+ long nDx = rDragStat.IsHorFixed() ? 0 : rDragStat.GetDX();
+ long nDy = rDragStat.IsVerFixed() ? 0 : rDragStat.GetDY();
+ if ( (nDx + aNewRect.Left()) < 0 )
+ nDx = -aNewRect.Left();
+ if ( (nDy + aNewRect.Top()) < 0 )
+ nDy = -aNewRect.Top();
+
+ if ( rDragStat.GetDragMethod()->getMoveOnly() )
+ aNewRect.Move(nDx,nDy);
+ else
+ ::ResizeRect(aNewRect,rDragStat.GetRef1(),rDragStat.GetXFact(),rDragStat.GetYFact());
+
+
+ SdrObject* pObjOverlapped = isOver(aNewRect,*m_pParent->getPage(),m_rView,false,pObjIter, ISOVER_IGNORE_CUSTOMSHAPES);
+ bIsSetPoint = pObjOverlapped ? true : false;
+ if (pObjOverlapped && !m_bSelectionMode)
+ {
+ colorizeOverlappedObject(pObjOverlapped);
+ }
+ }
+ }
+ }
+ }
+ else if ( aVEvt.pObj && !m_bSelectionMode)
+ {
+ colorizeOverlappedObject(aVEvt.pObj);
+ }
+ return bIsSetPoint;
+}
+// -----------------------------------------------------------------------------
+bool DlgEdFunc::setMovementPointer(const MouseEvent& rMEvt)
+{
+ bool bIsSetPoint = isRectangleHit(rMEvt);
+ if ( bIsSetPoint )
+ m_pParent->SetPointer( Pointer(POINTER_NOTALLOWED));
+ else
+ {
+ bool bCtrlKey = rMEvt.IsMod1();
+ (void)bCtrlKey;
+ if (bCtrlKey)
+ {
+ m_pParent->SetPointer( Pointer(POINTER_MOVEDATALINK ));
+ bIsSetPoint = true;
+ }
+ }
+ return bIsSetPoint;
+}
+//----------------------------------------------------------------------------
+
+DlgEdFuncInsert::DlgEdFuncInsert( OReportSection* _pParent ) :
+ DlgEdFunc( _pParent )
+{
+ m_rView.SetCreateMode( TRUE );
+}
+
+//----------------------------------------------------------------------------
+
+DlgEdFuncInsert::~DlgEdFuncInsert()
+{
+ m_rView.SetEditMode( TRUE );
+}
+
+//----------------------------------------------------------------------------
+
+BOOL DlgEdFuncInsert::MouseButtonDown( const MouseEvent& rMEvt )
+{
+ if ( DlgEdFunc::MouseButtonDown(rMEvt) )
+ return TRUE;
+
+ SdrViewEvent aVEvt;
+ sal_Int16 nId = m_rView.GetCurrentObjIdentifier();
+
+ const SdrHitKind eHit = m_rView.PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);
+
+// eHit == SDRHIT_UNMARKEDOBJECT under the mouse cursor is a unmarked object
+
+ if (eHit == SDRHIT_UNMARKEDOBJECT &&
+ nId != OBJ_CUSTOMSHAPE)
+ {
+ // there is an object under the mouse cursor, but not a customshape
+ // rtl::OUString suWasN = m_rView.getInsertObjString();
+ // rtl::OUString suWasN2 = m_pParent->getSectionWindow()->getViewsWindow()->GetInsertObjString();
+
+ m_pParent->getSectionWindow()->getViewsWindow()->BrkAction();
+ return FALSE;
+ }
+
+ if( eHit != SDRHIT_UNMARKEDOBJECT || nId == OBJ_CUSTOMSHAPE)
+ {
+ // if no action, create object
+ if ( !m_pParent->getSectionWindow()->getViewsWindow()->IsAction() )
+ {
+ deactivateOle(true);
+ if ( m_pParent->getSectionWindow()->getViewsWindow()->HasSelection() )
+ m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(&m_rView);
+ m_rView.BegCreateObj(m_aMDPos);
+ m_pParent->getSectionWindow()->getViewsWindow()->createDefault();
+ }
+ }
+ else
+ {
+ if( !rMEvt.IsShift() )
+ {
+ // shift key pressed?
+ m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(NULL);
+ }
+ m_pParent->getSectionWindow()->getViewsWindow()->BegMarkObj( m_aMDPos,&m_rView );
+ }
+
+ return TRUE;
+}
+
+//----------------------------------------------------------------------------
+BOOL DlgEdFuncInsert::MouseButtonUp( const MouseEvent& rMEvt )
+{
+ if ( DlgEdFunc::MouseButtonUp( rMEvt ) )
+ return TRUE;
+
+ const Point aPos( m_pParent->PixelToLogic( rMEvt.GetPosPixel() ) );
+ const USHORT nHitLog = USHORT ( m_pParent->PixelToLogic(Size(3,0)).Width() );
+
+ BOOL bReturn = TRUE;
+ // object creation active?
+ if ( m_rView.IsCreateObj() )
+ {
+ if ( isOver(m_rView.GetCreateObj(),*m_pParent->getPage(),m_rView) )
+ {
+ m_pParent->getSectionWindow()->getViewsWindow()->BrkAction();
+ // BrkAction disables the create mode
+ m_rView.SetCreateMode( TRUE );
+ return TRUE;
+ }
+
+ m_rView.EndCreateObj(SDRCREATE_FORCEEND);
+
+ if ( !m_rView.AreObjectsMarked() )
+ {
+ m_rView.MarkObj(aPos, nHitLog);
+ }
+
+ bReturn = m_rView.AreObjectsMarked();
+ if ( bReturn )
+ {
+ OReportController& rController = m_pParent->getSectionWindow()->getViewsWindow()->getView()->getReportView()->getController();
+ const SdrMarkList& rMarkList = m_rView.GetMarkedObjectList();
+ for (sal_uInt32 i = 0; i < rMarkList.GetMarkCount();++i )
+ {
+ SdrMark* pMark = rMarkList.GetMark(i);
+ // bCheck = dynamic_cast<OUnoObject*>(pMark->GetMarkedSdrObj()) != NULL;
+ OOle2Obj* pObj = dynamic_cast<OOle2Obj*>(pMark->GetMarkedSdrObj());
+ if ( pObj && !pObj->IsEmpty() )
+ {
+ pObj->initializeChart(rController.getModel());
+ }
+ }
+ }
+ }
+ else
+ checkMovementAllowed(rMEvt);
+
+ if ( !m_rView.AreObjectsMarked() &&
+ Abs(m_aMDPos.X() - aPos.X()) < nHitLog &&
+ Abs(m_aMDPos.Y() - aPos.Y()) < nHitLog &&
+ !rMEvt.IsShift() && !rMEvt.IsMod2() )
+ {
+ SdrPageView* pPV = m_rView.GetSdrPageView();
+ SdrViewEvent aVEvt;
+ m_rView.PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);
+ m_rView.MarkObj(aVEvt.pRootObj, pPV);
+ } // ift() && !rMEvt.IsMod2() )
+ checkTwoCklicks(rMEvt);
+ m_pParent->getSectionWindow()->getViewsWindow()->getView()->getReportView()->UpdatePropertyBrowserDelayed(m_rView);
+ return bReturn;
+}
+
+//----------------------------------------------------------------------------
+
+BOOL DlgEdFuncInsert::MouseMove( const MouseEvent& rMEvt )
+{
+ if ( DlgEdFunc::MouseMove(rMEvt ) )
+ return TRUE;
+ Point aPos( m_pParent->PixelToLogic( rMEvt.GetPosPixel() ) );
+
+ if ( m_rView.IsCreateObj() )
+ {
+ m_rView.SetOrtho(SdrObjCustomShape::doConstructOrthogonal(m_rView.getReportSection()->getSectionWindow()->getViewsWindow()->getShapeType()) ? !rMEvt.IsShift() : rMEvt.IsShift());
+ m_rView.SetAngleSnapEnabled(rMEvt.IsShift());
+ }
+
+ bool bIsSetPoint = false;
+ if ( m_rView.IsAction() )
+ {
+ if ( m_rView.IsDragResize() )
+ {
+ // we resize the object don't resize to above sections
+ if ( aPos.Y() < 0 )
+ {
+ aPos.Y() = 0;
+ }
+ }
+ bIsSetPoint = setMovementPointer(rMEvt);
+ ForceScroll(aPos);
+ m_pParent->getSectionWindow()->getViewsWindow()->MovAction(aPos,&m_rView, m_rView.GetDragMethod() == NULL, false);
+ }
+
+ //if ( isOver(m_rView.GetCreateObj(),*m_pParent->getPage(),*m_pView) )
+ // m_pParent->SetPointer( Pointer(POINTER_NOTALLOWED));
+ //else
+ if ( !bIsSetPoint )
+ m_pParent->SetPointer( m_rView.GetPreferedPointer( aPos, m_pParent) );
+
+ return TRUE;
+}
+
+//----------------------------------------------------------------------------
+
+DlgEdFuncSelect::DlgEdFuncSelect( OReportSection* _pParent ) :
+ DlgEdFunc( _pParent )
+{
+}
+
+//----------------------------------------------------------------------------
+
+DlgEdFuncSelect::~DlgEdFuncSelect()
+{
+}
+
+//----------------------------------------------------------------------------
+
+BOOL DlgEdFuncSelect::MouseButtonDown( const MouseEvent& rMEvt )
+{
+ m_bSelectionMode = false;
+ if ( DlgEdFunc::MouseButtonDown(rMEvt) )
+ return TRUE;
+
+ SdrViewEvent aVEvt;
+ const SdrHitKind eHit = m_rView.PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);
+ if( eHit == SDRHIT_UNMARKEDOBJECT )
+ {
+ // if not multi selection, unmark all
+ if ( !rMEvt.IsShift() )
+ m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(NULL);
+
+ if ( m_rView.MarkObj(m_aMDPos) && rMEvt.IsLeft() )
+ {
+ // drag object
+ m_pParent->getSectionWindow()->getViewsWindow()->BegDragObj(m_aMDPos, m_rView.PickHandle(m_aMDPos), &m_rView);
+ }
+ else
+ {
+ // select object
+ m_pParent->getSectionWindow()->getViewsWindow()->BegMarkObj(m_aMDPos,&m_rView);
+ }
+ }
+ else
+ {
+ if( !rMEvt.IsShift() )
+ m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(NULL);
+ //m_rView.UnmarkAll();
+
+ if ( rMEvt.GetClicks() == 1 )
+ {
+ m_bSelectionMode = true;
+ m_pParent->getSectionWindow()->getViewsWindow()->BegMarkObj( m_aMDPos ,&m_rView);
+ }
+ else
+ {
+ m_rView.SdrBeginTextEdit( aVEvt.pRootObj,m_rView.GetSdrPageView(),m_pParent,sal_False );
+ }
+ }
+
+ return TRUE;
+}
+
+//----------------------------------------------------------------------------
+
+BOOL DlgEdFuncSelect::MouseButtonUp( const MouseEvent& rMEvt )
+{
+ if ( DlgEdFunc::MouseButtonUp( rMEvt ) )
+ return TRUE;
+
+ // get view from parent
+ const Point aPnt( m_pParent->PixelToLogic( rMEvt.GetPosPixel() ) );
+
+ if ( rMEvt.IsLeft() ) // left mousebutton pressed
+ checkMovementAllowed(rMEvt);
+
+ m_pParent->getSectionWindow()->getViewsWindow()->EndAction();
+ checkTwoCklicks(rMEvt);
+
+ m_pParent->SetPointer( m_rView.GetPreferedPointer( aPnt, m_pParent) );
+
+ if ( !m_bUiActive )
+ m_pParent->getSectionWindow()->getViewsWindow()->getView()->getReportView()->UpdatePropertyBrowserDelayed(m_rView);
+ m_bSelectionMode = false;
+ return TRUE;
+}
+
+//----------------------------------------------------------------------------
+
+BOOL DlgEdFuncSelect::MouseMove( const MouseEvent& rMEvt )
+{
+ if ( DlgEdFunc::MouseMove(rMEvt ) )
+ return TRUE;
+
+ Point aPnt( m_pParent->PixelToLogic( rMEvt.GetPosPixel() ) );
+ bool bIsSetPoint = false;
+
+ if ( m_rView.IsAction() ) // Drag Mode
+ {
+ bIsSetPoint = setMovementPointer(rMEvt);
+ ForceScroll(aPnt);
+ if (m_rView.GetDragMethod()==NULL)
+ {
+ // create a selection
+ m_pParent->getSectionWindow()->getViewsWindow()->MovAction(aPnt, &m_rView, true, false);
+ }
+ else
+ {
+ if ( m_rView.IsDragResize() )
+ {
+ // we resize the object don't resize to above sections
+ if ( aPnt.Y() < 0 )
+ {
+ aPnt.Y() = 0;
+ }
+ // grow section if it is under the current section
+// else
+// {
+// const Size& aSectionSize = m_rView->GetSizePixel();
+// if ( aPnt.Y() > aSectionSize.Height() )
+// {
+// aPnt.Y() = aSectionSize.Height();
+// }
+// }
+ }
+ // drag or resize an object
+ bool bControlKey = rMEvt.IsMod1();
+ m_pParent->getSectionWindow()->getViewsWindow()->MovAction(aPnt, &m_rView, false, bControlKey);
+ }
+ }
+
+ if ( !bIsSetPoint )
+ {
+ m_pParent->SetPointer( m_rView.GetPreferedPointer( aPnt, m_pParent) );
+
+ // restore color
+ unColorizeOverlappedObj();
+ }
+
+ return TRUE;
+}
+// -----------------------------------------------------------------------------
+//void DlgEdFuncSelect::SetInEditMode(SdrTextObj* _pTextObj,const MouseEvent& rMEvt, BOOL bQuickDrag)
+//{
+//
+// SdrPageView* pPV = m_rView.GetSdrPageView();
+// if( _pTextObj && _pTextObj->GetPage() == pPV->GetPage() )
+// {
+// m_rView.SetCurrentObj(OBJ_TEXT);
+// m_rView.SetEditMode(SDREDITMODE_EDIT);
+//
+// BOOL bEmptyOutliner = FALSE;
+//
+// if (!_pTextObj->GetOutlinerParaObject() && m_rView.GetTextEditOutliner())
+// {
+// ::SdrOutliner* pOutl = m_rView.GetTextEditOutliner();
+// ULONG nParaAnz = pOutl->GetParagraphCount();
+// Paragraph* p1stPara = pOutl->GetParagraph( 0 );
+//
+// if (nParaAnz==1 && p1stPara)
+// {
+// // Bei nur einem Pararaph
+// if (pOutl->GetText(p1stPara).Len() == 0)
+// {
+// bEmptyOutliner = TRUE;
+// }
+// }
+// }
+//
+// if (_pTextObj != m_rView.GetTextEditObject() || bEmptyOutliner)
+// {
+// UINT32 nInv = _pTextObj->GetObjInventor();
+// UINT16 nSdrObjKind = _pTextObj->GetObjIdentifier();
+//
+// if (nInv == SdrInventor && _pTextObj->HasTextEdit() &&
+// (nSdrObjKind == OBJ_TEXT ||
+// nSdrObjKind == OBJ_TITLETEXT ||
+// nSdrObjKind == OBJ_OUTLINETEXT ||
+// (_pTextObj->ISA(SdrTextObj) && !_pTextObj->IsEmptyPresObj())))
+// {
+// // Neuen Outliner machen (gehoert der SdrObjEditView)
+// SdrModel* pModel = _pTextObj->GetModel();
+// SdrOutliner* pOutl = SdrMakeOutliner( OUTLINERMODE_OUTLINEOBJECT, pModel );
+// pOutl->SetMinDepth(0);
+// pOutl->SetStyleSheetPool((SfxStyleSheetPool*) pModel->GetStyleSheetPool());
+// //pOutl->SetCalcFieldValueHdl(LINK(SD_MOD(), SdModule, CalcFieldValueHdl));
+// ULONG nCntrl = pOutl->GetControlWord();
+// nCntrl |= EE_CNTRL_ALLOWBIGOBJS;
+// nCntrl |= EE_CNTRL_URLSFXEXECUTE;
+// nCntrl |= EE_CNTRL_MARKFIELDS;
+// nCntrl |= EE_CNTRL_AUTOCORRECT;
+//
+// nCntrl &= ~EE_CNTRL_ULSPACESUMMATION;
+// //if ( pModel->IsSummationOfParagraphs() )
+// // nCntrl |= EE_CNTRL_ULSPACESUMMATION;
+//
+// //SetSpellOptions( nCntrl );
+//
+// pOutl->SetControlWord(nCntrl);
+//
+// uno::Reference< linguistic2::XSpellChecker1 > xSpellChecker( LinguMgr::GetSpellChecker() );
+// if ( xSpellChecker.is() )
+// pOutl->SetSpeller( xSpellChecker );
+//
+// uno::Reference< linguistic2::XHyphenator > xHyphenator( LinguMgr::GetHyphenator() );
+// if( xHyphenator.is() )
+// pOutl->SetHyphenator( xHyphenator );
+//
+// pOutl->SetDefaultLanguage( Application::GetSettings().GetLanguage() );
+//
+// // in einem Gliederungstext darf nicht auf die 0-te
+// // Ebene ausgerueckt werden
+// if (_pTextObj->GetObjInventor() == SdrInventor &&
+// _pTextObj->GetObjIdentifier() == OBJ_OUTLINETEXT)
+// {
+// pOutl->SetMinDepth(1);
+// }
+//
+// if (bEmptyOutliner)
+// {
+// m_rView.SdrEndTextEdit(sal_True);
+// }
+//
+// if( _pTextObj )
+// {
+// OutlinerParaObject* pOPO = _pTextObj->GetOutlinerParaObject();
+// if( ( pOPO && pOPO->IsVertical() ) /*||
+// nSlotId == SID_ATTR_CHAR_VERTICAL ||
+// nSlotId == SID_TEXT_FITTOSIZE_VERTICAL */)
+// pOutl->SetVertical( TRUE );
+//
+//
+// if (m_rView.SdrBeginTextEdit(_pTextObj, pPV, pParent, sal_True, pOutl) && _pTextObj->GetObjInventor() == SdrInventor)
+// {
+// //bFirstObjCreated = TRUE;
+// //DeleteDefaultText();
+//
+// OutlinerView* pOLV = m_rView.GetTextEditOutlinerView();
+//
+// nSdrObjKind = _pTextObj->GetObjIdentifier();
+//
+// SdrViewEvent aVEvt;
+// SdrHitKind eHit = m_rView.PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);
+//
+// if (eHit == SDRHIT_TEXTEDIT)
+// {
+// // Text getroffen
+// if (nSdrObjKind == OBJ_TEXT ||
+// nSdrObjKind == OBJ_TITLETEXT ||
+// nSdrObjKind == OBJ_OUTLINETEXT ||
+// //nSlotId == SID_TEXTEDIT ||
+// !bQuickDrag)
+// {
+// pOLV->MouseButtonDown(rMEvt);
+// pOLV->MouseMove(rMEvt);
+// pOLV->MouseButtonUp(rMEvt);
+// }
+//
+// if ( bQuickDrag && _pTextObj->GetOutlinerParaObject())
+// {
+// pOLV->MouseButtonDown(rMEvt);
+// }
+// }
+// else
+// {
+// // #98198# Move cursor to end of text
+// ESelection aNewSelection(EE_PARA_NOT_FOUND, EE_INDEX_NOT_FOUND, EE_PARA_NOT_FOUND, EE_INDEX_NOT_FOUND);
+// pOLV->SetSelection(aNewSelection);
+// }
+// }
+// else
+// {
+// //RestoreDefaultText();
+// }
+// }
+// }
+// }
+// }
+// else
+// _pTextObj = NULL;
+//}
+
+
+//----------------------------------------------------------------------------
+}