906 lines
29 KiB
C++
906 lines
29 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*
|
|
* This file is part of the LibreOffice project.
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*
|
|
* This file incorporates work covered by the following license notice:
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed
|
|
* with this work for additional information regarding copyright
|
|
* ownership. The ASF licenses this file to you under the Apache
|
|
* License, Version 2.0 (the "License"); you may not use this file
|
|
* except in compliance with the License. You may obtain a copy of
|
|
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
|
*/
|
|
#include <vcl/seleng.hxx>
|
|
#include <vcl/ptrstyle.hxx>
|
|
#include <com/sun/star/embed/EmbedStates.hpp>
|
|
#include <com/sun/star/embed/XEmbeddedObject.hpp>
|
|
#include <com/sun/star/beans/XPropertySet.hpp>
|
|
|
|
#include <svx/svdview.hxx>
|
|
#include <svx/svdpagv.hxx>
|
|
#include <svx/svdetc.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 <UITools.hxx>
|
|
|
|
#include <strings.hxx>
|
|
#include <UndoEnv.hxx>
|
|
#include <RptModel.hxx>
|
|
#include <comphelper/propertysequence.hxx>
|
|
#include <comphelper/diagnose_ex.hxx>
|
|
|
|
#define DEFAUL_MOVE_SIZE 100
|
|
namespace rptui
|
|
{
|
|
using namespace ::com::sun::star;
|
|
|
|
|
|
IMPL_LINK_NOARG( DlgEdFunc, ScrollTimeout, Timer *, void )
|
|
{
|
|
ForceScroll( m_pParent->PixelToLogic( m_pParent->GetPointerPosPixel() ) );
|
|
}
|
|
|
|
|
|
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(tools::Long(REPORT_STARTMARKER_WIDTH));
|
|
aStartWidth *= m_pParent->GetMapMode().GetScaleX();
|
|
|
|
aOut.AdjustWidth( -static_cast<tools::Long>(aStartWidth) );
|
|
aOut.setHeight( m_pParent->GetOutputSizePixel().Height() );
|
|
|
|
Point aPos = pScrollWindow->getThumbPos();
|
|
aPos.setX( aPos.X() * 0.5 );
|
|
aPos.setY( aPos.Y() * 0.5 );
|
|
tools::Rectangle aOutRect( aPos, aOut );
|
|
aOutRect = m_pParent->PixelToLogic( aOutRect );
|
|
tools::Rectangle aWorkArea(Point(), pScrollWindow->getTotalSize());
|
|
aWorkArea.AdjustRight( -static_cast<tools::Long>(aStartWidth) );
|
|
aWorkArea = pScrollWindow->PixelToLogic( aWorkArea );
|
|
if( !aOutRect.Contains( rPos ) && aWorkArea.Contains( rPos ) )
|
|
{
|
|
ScrollAdaptor& rHScroll = pScrollWindow->GetHScroll();
|
|
ScrollAdaptor& rVScroll = pScrollWindow->GetVScroll();
|
|
ScrollType eH = ScrollType::LineDown,eV = ScrollType::LineDown;
|
|
if( rPos.X() < aOutRect.Left() )
|
|
eH = ScrollType::LineUp;
|
|
else if( rPos.X() <= aOutRect.Right() )
|
|
eH = ScrollType::DontKnow;
|
|
|
|
if( rPos.Y() < aOutRect.Top() )
|
|
eV = ScrollType::LineUp;
|
|
else if( rPos.Y() <= aOutRect.Bottom() )
|
|
eV = ScrollType::DontKnow;
|
|
|
|
if (eH != ScrollType::DontKnow)
|
|
{
|
|
auto nCurrentPos = rHScroll.GetThumbPos();
|
|
auto nLineSize = rHScroll.GetLineSize();
|
|
assert(eH == ScrollType::LineUp || eH == ScrollType::LineDown);
|
|
rHScroll.DoScroll(eH == ScrollType::LineUp ? (nCurrentPos - nLineSize) : (nCurrentPos + nLineSize));
|
|
}
|
|
|
|
if (eV != ScrollType::DontKnow)
|
|
{
|
|
auto nCurrentPos = rVScroll.GetThumbPos();
|
|
auto nLineSize = rVScroll.GetLineSize();
|
|
assert(eV == ScrollType::LineUp || eV == ScrollType::LineDown);
|
|
rVScroll.DoScroll(eV == ScrollType::LineUp ? (nCurrentPos - nLineSize) : (nCurrentPos + nLineSize));
|
|
}
|
|
}
|
|
|
|
aScrollTimer.Start();
|
|
}
|
|
|
|
DlgEdFunc::DlgEdFunc( OReportSection* _pParent )
|
|
: m_pParent(_pParent)
|
|
, m_rView(_pParent->getSectionView())
|
|
, aScrollTimer("reportdesign DlgEdFunc aScrollTimer")
|
|
, m_pOverlappingObj(nullptr)
|
|
, m_nOverlappedControlColor(0)
|
|
, m_nOldColor(0)
|
|
, m_bSelectionMode(false)
|
|
, m_bUiActive(false)
|
|
, m_bShowPropertyBrowser(false)
|
|
{
|
|
aScrollTimer.SetInvokeHandler( LINK( this, DlgEdFunc, ScrollTimeout ) );
|
|
m_rView.SetActualWin( m_pParent->GetOutDev() );
|
|
aScrollTimer.SetTimeout( SELENG_AUTOREPEAT_INTERVAL );
|
|
}
|
|
|
|
void DlgEdFunc::setOverlappedControlColor(Color _nColor)
|
|
{
|
|
m_nOverlappedControlColor = _nColor;
|
|
}
|
|
|
|
static Color lcl_setColorOfObject(const uno::Reference< uno::XInterface >& _xObj, Color _nColorTRGB)
|
|
{
|
|
Color nBackColor;
|
|
try
|
|
{
|
|
uno::Reference<report::XReportComponent> xComponent(_xObj, uno::UNO_QUERY_THROW);
|
|
uno::Reference< beans::XPropertySet > xProp(xComponent, uno::UNO_QUERY_THROW);
|
|
uno::Any aAny = xProp->getPropertyValue(PROPERTY_CONTROLBACKGROUND);
|
|
if (aAny.hasValue())
|
|
{
|
|
aAny >>= nBackColor;
|
|
// try to set background color at the ReportComponent
|
|
uno::Any aBlackColorAny(_nColorTRGB);
|
|
xProp->setPropertyValue(PROPERTY_CONTROLBACKGROUND, aBlackColorAny);
|
|
}
|
|
}
|
|
catch(uno::Exception&)
|
|
{
|
|
}
|
|
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
|
|
uno::Sequence<beans::PropertyValue> aArgs( comphelper::InitPropertySequence({
|
|
{ "ShowProperties", uno::Any(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, SdrMouseEventKind::BUTTONDOWN, aVEvt);
|
|
// if ( aVEvt.mpRootObj && aVEvt.pRootObj->ISA(SdrTextObj) )
|
|
// SetInEditMode(static_cast<SdrTextObj *>(aVEvt.mpRootObj),rMEvt, sal_False);
|
|
bHandled = true;
|
|
}
|
|
else
|
|
{
|
|
SdrHdl* pHdl = m_rView.PickHandle(m_aMDPos);
|
|
|
|
// if selected object was hit, drag object
|
|
if ( pHdl!=nullptr || 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, SdrMouseEventKind::BUTTONDOWN, aVEvt) != SdrHitKind::MarkedObject && !rMEvt.IsShift() )
|
|
m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(nullptr);
|
|
if ( aVEvt.mpRootObj )
|
|
m_rView.MarkObj(aVEvt.mpRootObj, pPV);
|
|
else
|
|
m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(nullptr);
|
|
|
|
bHandled = true;
|
|
}
|
|
else if( !rMEvt.IsLeft() )
|
|
bHandled = true;
|
|
if ( !bHandled )
|
|
m_pParent->CaptureMouse();
|
|
return bHandled;
|
|
}
|
|
|
|
|
|
bool DlgEdFunc::MouseButtonUp( const MouseEvent& /*rMEvt*/ )
|
|
{
|
|
m_pParent->getSectionWindow()->getViewsWindow()->stopScrollTimer();
|
|
return false;
|
|
}
|
|
|
|
void DlgEdFunc::checkTwoClicks(const MouseEvent& rMEvt)
|
|
{
|
|
deactivateOle();
|
|
|
|
const sal_uInt16 nClicks = rMEvt.GetClicks();
|
|
if ( !(nClicks == 2 && rMEvt.IsLeft()) )
|
|
return;
|
|
|
|
if ( m_rView.GetMarkedObjectList().GetMarkCount() != 0 )
|
|
{
|
|
const SdrMarkList& rMarkList = m_rView.GetMarkedObjectList();
|
|
if (rMarkList.GetMarkCount() == 1)
|
|
{
|
|
const SdrMark* pMark = rMarkList.GetMark(0);
|
|
SdrObject* pObj = pMark->GetMarkedSdrObj();
|
|
activateOle(pObj);
|
|
}
|
|
}
|
|
}
|
|
|
|
void DlgEdFunc::stopScrollTimer()
|
|
{
|
|
unColorizeOverlappedObj();
|
|
aScrollTimer.Stop();
|
|
if ( m_pParent->IsMouseCaptured() )
|
|
m_pParent->ReleaseMouse();
|
|
}
|
|
|
|
|
|
bool DlgEdFunc::MouseMove( const MouseEvent& /*rMEvt*/ )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
bool DlgEdFunc::handleKeyEvent(const KeyEvent& _rEvent)
|
|
{
|
|
bool bReturn = false;
|
|
|
|
if ( !m_bUiActive )
|
|
{
|
|
const vcl::KeyCode& rCode = _rEvent.GetKeyCode();
|
|
sal_uInt16 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.GetMarkedObjectList().GetMarkCount() != 0 )
|
|
{
|
|
const SdrHdlList& rHdlList = m_rView.GetHdlList();
|
|
SdrHdl* pHdl = rHdlList.GetFocusHdl();
|
|
if ( pHdl )
|
|
const_cast<SdrHdlList&>(rHdlList).ResetFocusHdl();
|
|
else
|
|
m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(nullptr);
|
|
|
|
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.GetMarkedObjectList().GetMarkCount() != 0 )
|
|
m_rView.MakeVisible( m_rView.GetAllMarkedRect(), *m_pParent);
|
|
|
|
bReturn = true;
|
|
}
|
|
else if ( rCode.IsMod1() && rCode.IsMod2())
|
|
{
|
|
// selected handle
|
|
const SdrHdlList& rHdlList = m_rView.GetHdlList();
|
|
const_cast<SdrHdlList&>(rHdlList).TravelFocusHdl( !rCode.IsShift() );
|
|
|
|
// guarantee visibility of focused handle
|
|
SdrHdl* pHdl = rHdlList.GetFocusHdl();
|
|
if ( pHdl )
|
|
{
|
|
Point aHdlPosition( pHdl->GetPos() );
|
|
tools::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;
|
|
}
|
|
[[fallthrough]];
|
|
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 )
|
|
return;
|
|
|
|
const SdrObjKind nSdrObjKind = _pObj->GetObjIdentifier();
|
|
|
|
// OLE: activate
|
|
|
|
if (nSdrObjKind != SdrObjKind::OLE2)
|
|
return;
|
|
|
|
SdrOle2Obj* pOleObj = dynamic_cast<SdrOle2Obj*>(_pObj);
|
|
if (!(pOleObj && pOleObj->GetObjRef().is()))
|
|
return;
|
|
|
|
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("reportdesign");
|
|
}
|
|
}
|
|
|
|
void DlgEdFunc::deactivateOle(bool _bSelect)
|
|
{
|
|
OLEObjCache& rObjCache = GetSdrGlobalData().GetOLEObjCache();
|
|
OReportController& rController = m_pParent->getSectionWindow()->getViewsWindow()->getView()->getReportView()->getController();
|
|
const size_t nCount = rObjCache.size();
|
|
for(size_t i = 0 ; i < nCount;++i)
|
|
{
|
|
SdrOle2Obj* pObj = rObjCache[i];
|
|
if ( m_pParent->getPage() == pObj->getSdrPageFromSdrObject() )
|
|
{
|
|
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 )
|
|
{
|
|
rController.executeChecked(SID_SHOW_PROPERTYBROWSER,uno::Sequence< beans::PropertyValue >());
|
|
}
|
|
|
|
if ( _bSelect )
|
|
{
|
|
SdrPageView* pPV = m_rView.GetSdrPageView();
|
|
m_rView.MarkObj(pObj, pPV);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void DlgEdFunc::colorizeOverlappedObject(SdrObject* _pOverlappedObj)
|
|
{
|
|
OObjectBase* pObj = dynamic_cast<OObjectBase*>(_pOverlappedObj);
|
|
if ( !pObj )
|
|
return;
|
|
|
|
const uno::Reference<report::XReportComponent>& xComponent = pObj->getReportComponent();
|
|
if (xComponent.is() && xComponent != m_xOverlappingObj)
|
|
{
|
|
OReportModel& rRptModel(static_cast< OReportModel& >(_pOverlappedObj->getSdrModelFromSdrObject()));
|
|
OXUndoEnvironment::OUndoEnvLock aLock(rRptModel.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& rRptModel(static_cast< OReportModel& >(m_pOverlappingObj->getSdrModelFromSdrObject()));
|
|
OXUndoEnvironment::OUndoEnvLock aLock(rRptModel.GetUndoEnv());
|
|
|
|
lcl_setColorOfObject(m_xOverlappingObj, m_nOldColor);
|
|
m_xOverlappingObj = nullptr;
|
|
m_pOverlappingObj = nullptr;
|
|
}
|
|
}
|
|
|
|
bool DlgEdFunc::isOverlapping(const MouseEvent& rMEvt)
|
|
{
|
|
SdrViewEvent aVEvt;
|
|
bool bOverlapping = m_rView.PickAnything(rMEvt, SdrMouseEventKind::BUTTONUP, aVEvt) != SdrHitKind::NONE;
|
|
if (bOverlapping && aVEvt.mpObj)
|
|
{
|
|
colorizeOverlappedObject(aVEvt.mpObj);
|
|
}
|
|
else
|
|
{
|
|
unColorizeOverlappedObj();
|
|
}
|
|
|
|
return bOverlapping;
|
|
}
|
|
|
|
void DlgEdFunc::checkMovementAllowed(const MouseEvent& rMEvt)
|
|
{
|
|
if ( m_pParent->getSectionWindow()->getViewsWindow()->IsDragObj() )
|
|
{
|
|
if ( isRectangleHit(rMEvt) )
|
|
{
|
|
// there is another 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.setY( 0 );
|
|
}
|
|
if (m_rView.IsDragResize())
|
|
{
|
|
// we resize the object don't resize to above sections
|
|
if ( aPnt.Y() < 0 )
|
|
{
|
|
aPnt.setY( 0 );
|
|
}
|
|
}
|
|
m_pParent->getSectionWindow()->getViewsWindow()->EndDragObj( bControlKeyPressed, &m_rView, aPnt );
|
|
}
|
|
m_pParent->getSectionWindow()->getViewsWindow()->ForceMarkedToAnotherPage();
|
|
m_pParent->Invalidate(InvalidateFlags::Children);
|
|
}
|
|
else
|
|
m_pParent->getSectionWindow()->getViewsWindow()->EndAction();
|
|
}
|
|
|
|
bool DlgEdFunc::isOnlyCustomShapeMarked() const
|
|
{
|
|
bool bReturn = true;
|
|
const SdrMarkList& rMarkList = m_rView.GetMarkedObjectList();
|
|
for (size_t i = 0; i < rMarkList.GetMarkCount(); ++i )
|
|
{
|
|
SdrMark* pMark = rMarkList.GetMark(i);
|
|
SdrObject* pObj = pMark->GetMarkedSdrObj();
|
|
if (pObj->GetObjIdentifier() != SdrObjKind::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, SdrMouseEventKind::MOVE, aVEvt);
|
|
bool bIsSetPoint = (eHit == SdrHitKind::UnmarkedObject);
|
|
if ( !bIsSetPoint )
|
|
{
|
|
// no drag rect, we have to check every single select rect
|
|
const SdrDragStat& rDragStat = m_rView.GetDragStat();
|
|
if (rDragStat.GetDragMethod() != nullptr)
|
|
{
|
|
SdrObjListIter aIter(m_pParent->getPage(),SdrIterMode::DeepNoGroups);
|
|
// loop through all marked objects and check if there new rect overlapps an old one.
|
|
for (;;)
|
|
{
|
|
SdrObject* pObjIter = aIter.Next();
|
|
if( !pObjIter || bIsSetPoint)
|
|
break;
|
|
if ( m_rView.IsObjMarked(pObjIter)
|
|
&& (dynamic_cast<OUnoObject*>(pObjIter) != nullptr || dynamic_cast<OOle2Obj*>(pObjIter) != nullptr) )
|
|
{
|
|
tools::Rectangle aNewRect = pObjIter->GetLastBoundRect();
|
|
tools::Long nDx = rDragStat.IsHorFixed() ? 0 : rDragStat.GetDX();
|
|
tools::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 != nullptr;
|
|
if (pObjOverlapped && !m_bSelectionMode)
|
|
{
|
|
colorizeOverlappedObject(pObjOverlapped);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if (aVEvt.mpObj && (aVEvt.mpObj->GetObjIdentifier() != SdrObjKind::CustomShape) && !m_bSelectionMode)
|
|
{
|
|
colorizeOverlappedObject(aVEvt.mpObj);
|
|
}
|
|
else
|
|
bIsSetPoint = false;
|
|
return bIsSetPoint;
|
|
}
|
|
|
|
bool DlgEdFunc::setMovementPointer(const MouseEvent& rMEvt)
|
|
{
|
|
bool bIsSetPoint = isRectangleHit(rMEvt);
|
|
if ( bIsSetPoint )
|
|
m_pParent->SetPointer( PointerStyle::NotAllowed );
|
|
else
|
|
{
|
|
bool bCtrlKey = rMEvt.IsMod1();
|
|
if (bCtrlKey)
|
|
{
|
|
m_pParent->SetPointer( PointerStyle::MoveDataLink );
|
|
bIsSetPoint = true;
|
|
}
|
|
}
|
|
return bIsSetPoint;
|
|
}
|
|
|
|
|
|
DlgEdFuncInsert::DlgEdFuncInsert( OReportSection* _pParent ) :
|
|
DlgEdFunc( _pParent )
|
|
{
|
|
m_rView.SetCreateMode();
|
|
}
|
|
|
|
|
|
DlgEdFuncInsert::~DlgEdFuncInsert()
|
|
{
|
|
m_rView.SetEditMode();
|
|
}
|
|
|
|
|
|
bool DlgEdFuncInsert::MouseButtonDown( const MouseEvent& rMEvt )
|
|
{
|
|
if ( DlgEdFunc::MouseButtonDown(rMEvt) )
|
|
return true;
|
|
|
|
SdrViewEvent aVEvt;
|
|
SdrObjKind nId = m_rView.GetCurrentObjIdentifier();
|
|
|
|
const SdrHitKind eHit = m_rView.PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt);
|
|
|
|
if (eHit == SdrHitKind::UnmarkedObject && nId != SdrObjKind::CustomShape)
|
|
{
|
|
// there is an object under the mouse cursor, but not a customshape
|
|
m_pParent->getSectionWindow()->getViewsWindow()->BrkAction();
|
|
return false;
|
|
}
|
|
|
|
// 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();
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
bool DlgEdFuncInsert::MouseButtonUp( const MouseEvent& rMEvt )
|
|
{
|
|
if ( DlgEdFunc::MouseButtonUp( rMEvt ) )
|
|
return true;
|
|
|
|
const Point aPos( m_pParent->PixelToLogic( rMEvt.GetPosPixel() ) );
|
|
const sal_uInt16 nHitLog = sal_uInt16 ( 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();
|
|
return true;
|
|
}
|
|
|
|
m_rView.EndCreateObj(SdrCreateCmd::ForceEnd);
|
|
|
|
if ( m_rView.GetMarkedObjectList().GetMarkCount() == 0 )
|
|
{
|
|
m_rView.MarkObj(aPos, nHitLog);
|
|
}
|
|
|
|
bReturn = m_rView.GetMarkedObjectList().GetMarkCount() != 0;
|
|
if ( bReturn )
|
|
{
|
|
OReportController& rController = m_pParent->getSectionWindow()->getViewsWindow()->getView()->getReportView()->getController();
|
|
const SdrMarkList& rMarkList = m_rView.GetMarkedObjectList();
|
|
for (size_t i = 0; i < rMarkList.GetMarkCount(); ++i )
|
|
{
|
|
SdrMark* pMark = rMarkList.GetMark(i);
|
|
OOle2Obj* pObj = dynamic_cast<OOle2Obj*>(pMark->GetMarkedSdrObj());
|
|
if ( pObj && !pObj->IsEmpty() )
|
|
{
|
|
pObj->initializeChart(rController.getModel());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
checkMovementAllowed(rMEvt);
|
|
|
|
if ( m_rView.GetMarkedObjectList().GetMarkCount() == 0 &&
|
|
std::abs(m_aMDPos.X() - aPos.X()) < nHitLog &&
|
|
std::abs(m_aMDPos.Y() - aPos.Y()) < nHitLog &&
|
|
!rMEvt.IsShift() && !rMEvt.IsMod2() )
|
|
{
|
|
SdrPageView* pPV = m_rView.GetSdrPageView();
|
|
SdrViewEvent aVEvt;
|
|
m_rView.PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt);
|
|
m_rView.MarkObj(aVEvt.mpRootObj, pPV);
|
|
}
|
|
checkTwoClicks(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.setY( 0 );
|
|
}
|
|
}
|
|
bIsSetPoint = setMovementPointer(rMEvt);
|
|
ForceScroll(aPos);
|
|
m_pParent->getSectionWindow()->getViewsWindow()->MovAction(aPos,&m_rView, false);
|
|
}
|
|
|
|
if ( !bIsSetPoint )
|
|
m_pParent->SetPointer( m_rView.GetPreferredPointer( aPos, m_pParent->GetOutDev()) );
|
|
|
|
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, SdrMouseEventKind::BUTTONDOWN, aVEvt);
|
|
if( eHit == SdrHitKind::UnmarkedObject )
|
|
{
|
|
// if not multi selection, unmark all
|
|
if ( !rMEvt.IsShift() )
|
|
m_pParent->getSectionWindow()->getViewsWindow()->unmarkAllObjects(nullptr);
|
|
|
|
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(nullptr);
|
|
|
|
if ( rMEvt.GetClicks() == 1 )
|
|
{
|
|
m_bSelectionMode = true;
|
|
m_pParent->getSectionWindow()->getViewsWindow()->BegMarkObj( m_aMDPos ,&m_rView);
|
|
}
|
|
else
|
|
{
|
|
m_rView.SdrBeginTextEdit( aVEvt.mpRootObj,m_rView.GetSdrPageView(),m_pParent );
|
|
}
|
|
}
|
|
|
|
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();
|
|
checkTwoClicks(rMEvt);
|
|
|
|
m_pParent->SetPointer( m_rView.GetPreferredPointer( aPnt, m_pParent->GetOutDev() ) );
|
|
|
|
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()==nullptr)
|
|
{
|
|
// create a selection
|
|
m_pParent->getSectionWindow()->getViewsWindow()->MovAction(aPnt, &m_rView, false);
|
|
}
|
|
else
|
|
{
|
|
if ( m_rView.IsDragResize() )
|
|
{
|
|
// we resize the object don't resize to above sections
|
|
if ( aPnt.Y() < 0 )
|
|
{
|
|
aPnt.setY( 0 );
|
|
}
|
|
}
|
|
// drag or resize an object
|
|
bool bControlKey = rMEvt.IsMod1();
|
|
m_pParent->getSectionWindow()->getViewsWindow()->MovAction(aPnt, &m_rView, bControlKey);
|
|
}
|
|
}
|
|
|
|
if ( !bIsSetPoint )
|
|
{
|
|
m_pParent->SetPointer( m_rView.GetPreferredPointer( aPnt, m_pParent->GetOutDev() ) );
|
|
|
|
// restore color
|
|
unColorizeOverlappedObj();
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|