diff options
Diffstat (limited to 'reportdesign/source/ui/report/ViewsWindow.cxx')
-rw-r--r-- | reportdesign/source/ui/report/ViewsWindow.cxx | 1779 |
1 files changed, 0 insertions, 1779 deletions
diff --git a/reportdesign/source/ui/report/ViewsWindow.cxx b/reportdesign/source/ui/report/ViewsWindow.cxx deleted file mode 100644 index 04169d1a7..000000000 --- a/reportdesign/source/ui/report/ViewsWindow.cxx +++ /dev/null @@ -1,1779 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * 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_rptui.hxx" - -#include "ViewsWindow.hxx" -#include "ScrollHelper.hxx" -#include "UndoActions.hxx" -#include "ReportWindow.hxx" -#include "DesignView.hxx" -#include <svtools/colorcfg.hxx> -#include "ReportController.hxx" -#include "UITools.hxx" -#include "RptDef.hxx" -#include "RptResId.hrc" -#include "SectionView.hxx" -#include "ReportSection.hxx" -#include "uistrings.hrc" -#include "rptui_slotid.hrc" -#include "dlgedclip.hxx" -#include "ColorChanger.hxx" -#include "RptObject.hxx" -#include "RptObject.hxx" -#include "ModuleHelper.hxx" -#include "EndMarker.hxx" -#include <svx/svdpagv.hxx> -#include <svx/unoshape.hxx> -#include <vcl/svapp.hxx> -#include <boost/bind.hpp> - -#include "helpids.hrc" -#include <svx/svdundo.hxx> -#include <toolkit/helper/convert.hxx> -#include <algorithm> -#include <numeric> -#include <o3tl/compat_functional.hxx> - -namespace rptui -{ -#define DEFAUL_MOVE_SIZE 100 - -using namespace ::com::sun::star; -using namespace ::comphelper; -// ----------------------------------------------------------------------------- -bool lcl_getNewRectSize(const Rectangle& _aObjRect,long& _nXMov, long& _nYMov,SdrObject* _pObj,SdrView* _pView,sal_Int32 _nControlModification, bool _bBoundRects) -{ - bool bMoveAllowed = _nXMov != 0 || _nYMov != 0; - if ( bMoveAllowed ) - { - Rectangle aNewRect = _aObjRect; - SdrObject* pOverlappedObj = NULL; - do - { - aNewRect = _aObjRect; - switch(_nControlModification) - { - case ControlModification::HEIGHT_GREATEST: - case ControlModification::WIDTH_GREATEST: - aNewRect.setWidth(_nXMov); - aNewRect.setHeight(_nYMov); - break; - default: - aNewRect.Move(_nXMov,_nYMov); - break; - } - if (dynamic_cast<OUnoObject*>(_pObj) != NULL || dynamic_cast<OOle2Obj*>(_pObj) != NULL) - { - pOverlappedObj = isOver(aNewRect,*_pObj->GetPage(),*_pView,true,_pObj); - if ( pOverlappedObj && _pObj != pOverlappedObj ) - { - Rectangle aOverlappingRect = (_bBoundRects ? pOverlappedObj->GetCurrentBoundRect() : pOverlappedObj->GetSnapRect()); - sal_Int32 nXTemp = _nXMov; - sal_Int32 nYTemp = _nYMov; - switch(_nControlModification) - { - case ControlModification::LEFT: - nXTemp += aOverlappingRect.Right() - aNewRect.Left(); - bMoveAllowed = _nXMov != nXTemp; - break; - case ControlModification::RIGHT: - nXTemp += aOverlappingRect.Left() - aNewRect.Right(); - bMoveAllowed = _nXMov != nXTemp; - break; - case ControlModification::TOP: - nYTemp += aOverlappingRect.Bottom() - aNewRect.Top(); - bMoveAllowed = _nYMov != nYTemp; - break; - case ControlModification::BOTTOM: - nYTemp += aOverlappingRect.Top() - aNewRect.Bottom(); - bMoveAllowed = _nYMov != nYTemp; - break; - case ControlModification::CENTER_HORIZONTAL: - if ( _aObjRect.Left() < aOverlappingRect.Left() ) - nXTemp += aOverlappingRect.Left() - aNewRect.Left() - aNewRect.getWidth(); - else - nXTemp += aOverlappingRect.Right() - aNewRect.Left(); - bMoveAllowed = _nXMov != nXTemp; - break; - case ControlModification::CENTER_VERTICAL: - if ( _aObjRect.Top() < aOverlappingRect.Top() ) - nYTemp += aOverlappingRect.Top() - aNewRect.Top() - aNewRect.getHeight(); - else - nYTemp += aOverlappingRect.Bottom() - aNewRect.Top(); - bMoveAllowed = _nYMov != nYTemp; - break; - case ControlModification::HEIGHT_GREATEST: - case ControlModification::WIDTH_GREATEST: - { - Rectangle aIntersectionRect = aNewRect.GetIntersection(aOverlappingRect); - if ( !aIntersectionRect.IsEmpty() ) - { - if ( _nControlModification == ControlModification::WIDTH_GREATEST ) - { - if ( aNewRect.Left() < aIntersectionRect.Left() ) - { - aNewRect.Right() = aIntersectionRect.Left(); - } - else if ( aNewRect.Left() < aIntersectionRect.Right() ) - { - aNewRect.Left() = aIntersectionRect.Right(); - } - } - else if ( _nControlModification == ControlModification::HEIGHT_GREATEST ) - { - if ( aNewRect.Top() < aIntersectionRect.Top() ) - { - aNewRect.Bottom() = aIntersectionRect.Top(); - } - else if ( aNewRect.Top() < aIntersectionRect.Bottom() ) - { - aNewRect.Top() = aIntersectionRect.Bottom(); - } - } - nYTemp = aNewRect.getHeight(); - bMoveAllowed = _nYMov != nYTemp; - nXTemp = aNewRect.getWidth(); - bMoveAllowed = bMoveAllowed && _nXMov != nXTemp; - } - } - break; - default: - break; - } - - _nXMov = nXTemp; - _nYMov = nYTemp; - } - else - pOverlappedObj = NULL; - } - } - while ( pOverlappedObj && bMoveAllowed ); - } - return bMoveAllowed; -} -// ----------------------------------------------------------------------------- - -DBG_NAME( rpt_OViewsWindow ); -OViewsWindow::OViewsWindow( OReportWindow* _pReportWindow) -: Window( _pReportWindow,WB_DIALOGCONTROL) -,m_pParent(_pReportWindow) -,m_bInUnmark(sal_False) -{ - DBG_CTOR( rpt_OViewsWindow,NULL); - SetPaintTransparent(sal_True); - SetUniqueId(UID_RPT_VIEWSWINDOW); - SetMapMode( MapMode( MAP_100TH_MM ) ); - m_aColorConfig.AddListener(this); - ImplInitSettings(); -} -// ----------------------------------------------------------------------------- -OViewsWindow::~OViewsWindow() -{ - m_aColorConfig.RemoveListener(this); - m_aSections.clear(); - - DBG_DTOR( rpt_OViewsWindow,NULL); -} -// ----------------------------------------------------------------------------- -void OViewsWindow::initialize() -{ - -} -// ----------------------------------------------------------------------------- -void OViewsWindow::impl_resizeSectionWindow(OSectionWindow& _rSectionWindow,Point& _rStartPoint,bool _bSet) -{ - const uno::Reference< report::XSection> xSection = _rSectionWindow.getReportSection().getSection(); - - Size aSectionSize = _rSectionWindow.LogicToPixel( Size( 0,xSection->getHeight() ) ); - aSectionSize.Width() = getView()->GetTotalWidth(); - - const sal_Int32 nMinHeight = _rSectionWindow.getStartMarker().getMinHeight(); - if ( _rSectionWindow.getStartMarker().isCollapsed() || nMinHeight > aSectionSize.Height() ) - { - aSectionSize.Height() = nMinHeight; - } - const StyleSettings& rSettings = GetSettings().GetStyleSettings(); - aSectionSize.Height() += (long)(rSettings.GetSplitSize() * (double)_rSectionWindow.GetMapMode().GetScaleY()); - - if ( _bSet ) - _rSectionWindow.SetPosSizePixel(_rStartPoint,aSectionSize); - - _rStartPoint.Y() += aSectionSize.Height(); -} - -// ----------------------------------------------------------------------------- -void OViewsWindow::resize(const OSectionWindow& _rSectionWindow) -{ - bool bSet = false; - Point aStartPoint; - TSectionsMap::iterator aIter = m_aSections.begin(); - TSectionsMap::iterator aEnd = m_aSections.end(); - for (;aIter != aEnd ; ++aIter) - { - const ::boost::shared_ptr<OSectionWindow> pSectionWindow = (*aIter); - if ( pSectionWindow.get() == &_rSectionWindow ) - { - aStartPoint = pSectionWindow->GetPosPixel(); - bSet = true; - } - - if ( bSet ) - { - impl_resizeSectionWindow(*pSectionWindow.get(),aStartPoint,bSet); - static sal_Int32 nIn = INVALIDATE_UPDATE | INVALIDATE_TRANSPARENT; - pSectionWindow->getStartMarker().Invalidate( nIn ); // INVALIDATE_NOERASE |INVALIDATE_NOCHILDREN| INVALIDATE_TRANSPARENT - pSectionWindow->getEndMarker().Invalidate( nIn ); - } - } - Fraction aStartWidth(long(REPORT_STARTMARKER_WIDTH)); - aStartWidth *= GetMapMode().GetScaleX(); - Size aOut = GetOutputSizePixel(); - aOut.Width() = aStartWidth; - aOut = PixelToLogic(aOut); - m_pParent->notifySizeChanged(); - - Rectangle aRect(PixelToLogic(Point(0,0)),aOut); -} -//------------------------------------------------------------------------------ -void OViewsWindow::Resize() -{ - Window::Resize(); - if ( !m_aSections.empty() ) - { - const Point aOffset(m_pParent->getThumbPos()); - Point aStartPoint(0,-aOffset.Y()); - TSectionsMap::iterator aIter = m_aSections.begin(); - TSectionsMap::iterator aEnd = m_aSections.end(); - for (;aIter != aEnd ; ++aIter) - { - const ::boost::shared_ptr<OSectionWindow> pSectionWindow = (*aIter); - impl_resizeSectionWindow(*pSectionWindow.get(),aStartPoint,true); - } - } -} -// ----------------------------------------------------------------------------- -void OViewsWindow::Paint( const Rectangle& rRect ) -{ - Window::Paint( rRect ); - - Size aOut = GetOutputSizePixel(); - Fraction aStartWidth(long(REPORT_STARTMARKER_WIDTH)); - aStartWidth *= GetMapMode().GetScaleX(); - - aOut.Width() -= (long)aStartWidth; - aOut = PixelToLogic(aOut); - - Rectangle aRect(PixelToLogic(Point(aStartWidth,0)),aOut); - Wallpaper aWall( m_aColorConfig.GetColorValue(::svtools::APPBACKGROUND).nColor ); - DrawWallpaper(aRect,aWall); -} -//------------------------------------------------------------------------------ -void OViewsWindow::ImplInitSettings() -{ - EnableChildTransparentMode( sal_True ); - SetBackground( ); - SetFillColor( Application::GetSettings().GetStyleSettings().GetDialogColor() ); - SetTextFillColor( Application::GetSettings().GetStyleSettings().GetDialogColor() ); -} -//----------------------------------------------------------------------------- -void OViewsWindow::DataChanged( const DataChangedEvent& rDCEvt ) -{ - Window::DataChanged( rDCEvt ); - - if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && - (rDCEvt.GetFlags() & SETTINGS_STYLE) ) - { - ImplInitSettings(); - Invalidate(); - } -} -//---------------------------------------------------------------------------- -void OViewsWindow::addSection(const uno::Reference< report::XSection >& _xSection,const ::rtl::OUString& _sColorEntry,sal_uInt16 _nPosition) -{ - ::boost::shared_ptr<OSectionWindow> pSectionWindow( new OSectionWindow(this,_xSection,_sColorEntry) ); - m_aSections.insert(getIteratorAtPos(_nPosition) , TSectionsMap::value_type(pSectionWindow)); - m_pParent->setMarked(&pSectionWindow->getReportSection().getSectionView(),m_aSections.size() == 1); - Resize(); -} -//---------------------------------------------------------------------------- -void OViewsWindow::removeSection(sal_uInt16 _nPosition) -{ - if ( _nPosition < m_aSections.size() ) - { - TSectionsMap::iterator aPos = getIteratorAtPos(_nPosition); - TSectionsMap::iterator aNew = getIteratorAtPos(_nPosition == 0 ? _nPosition+1: _nPosition - 1); - - m_pParent->getReportView()->UpdatePropertyBrowserDelayed((*aNew)->getReportSection().getSectionView()); - - m_aSections.erase(aPos); - Resize(); - } -} -//------------------------------------------------------------------------------ -void OViewsWindow::toggleGrid(sal_Bool _bVisible) -{ - ::std::for_each(m_aSections.begin(),m_aSections.end(), - ::o3tl::compose1(::boost::bind(&OReportSection::SetGridVisible,_1,_bVisible),TReportPairHelper())); - ::std::for_each(m_aSections.begin(),m_aSections.end(), - ::o3tl::compose1(::boost::bind(&OReportSection::Window::Invalidate,_1,INVALIDATE_NOERASE),TReportPairHelper())); -} -//------------------------------------------------------------------------------ -sal_Int32 OViewsWindow::getTotalHeight() const -{ - sal_Int32 nHeight = 0; - TSectionsMap::const_iterator aIter = m_aSections.begin(); - TSectionsMap::const_iterator aEnd = m_aSections.end(); - for (;aIter != aEnd ; ++aIter) - { - nHeight += (*aIter)->GetSizePixel().Height(); - } - return nHeight; -} -//---------------------------------------------------------------------------- -sal_uInt16 OViewsWindow::getSectionCount() const -{ - return static_cast<sal_uInt16>(m_aSections.size()); -} -//---------------------------------------------------------------------------- -void OViewsWindow::SetInsertObj( sal_uInt16 eObj,const ::rtl::OUString& _sShapeType ) -{ - TSectionsMap::iterator aIter = m_aSections.begin(); - TSectionsMap::iterator aEnd = m_aSections.end(); - for (;aIter != aEnd ; ++aIter) - (*aIter)->getReportSection().getSectionView().SetCurrentObj( eObj, ReportInventor ); - - m_sShapeType = _sShapeType; -} -//---------------------------------------------------------------------------- -rtl::OUString OViewsWindow::GetInsertObjString() const -{ - return m_sShapeType; -} - -//------------------------------------------------------------------------------ -void OViewsWindow::SetMode( DlgEdMode eNewMode ) -{ - ::std::for_each(m_aSections.begin(),m_aSections.end(), - ::o3tl::compose1(::boost::bind(&OReportSection::SetMode,_1,eNewMode),TReportPairHelper())); -} -//---------------------------------------------------------------------------- -sal_Bool OViewsWindow::HasSelection() const -{ - TSectionsMap::const_iterator aIter = m_aSections.begin(); - TSectionsMap::const_iterator aEnd = m_aSections.end(); - for (;aIter != aEnd && !(*aIter)->getReportSection().getSectionView().AreObjectsMarked(); ++aIter) - ; - return aIter != aEnd; -} -//---------------------------------------------------------------------------- -void OViewsWindow::Delete() -{ - m_bInUnmark = sal_True; - ::std::for_each(m_aSections.begin(),m_aSections.end(), - ::o3tl::compose1(::boost::mem_fn(&OReportSection::Delete),TReportPairHelper())); - m_bInUnmark = sal_False; -} -//---------------------------------------------------------------------------- -void OViewsWindow::Copy() -{ - uno::Sequence< beans::NamedValue > aAllreadyCopiedObjects; - ::std::for_each(m_aSections.begin(),m_aSections.end(), - ::o3tl::compose1(::boost::bind(&OReportSection::Copy,_1,::boost::ref(aAllreadyCopiedObjects)),TReportPairHelper())); - - OReportExchange* pCopy = new OReportExchange(aAllreadyCopiedObjects); - uno::Reference< datatransfer::XTransferable> aEnsureDelete = pCopy; - pCopy->CopyToClipboard(this); -} -//---------------------------------------------------------------------------- -void OViewsWindow::Paste() -{ - TransferableDataHelper aTransferData(TransferableDataHelper::CreateFromSystemClipboard(this)); - OReportExchange::TSectionElements aCopies = OReportExchange::extractCopies(aTransferData); - if ( aCopies.getLength() > 1 ) - ::std::for_each(m_aSections.begin(),m_aSections.end(), - ::o3tl::compose1(::boost::bind(&OReportSection::Paste,_1,aCopies,false),TReportPairHelper())); - else - { - ::boost::shared_ptr<OSectionWindow> pMarkedSection = getMarkedSection(); - if ( pMarkedSection ) - pMarkedSection->getReportSection().Paste(aCopies,true); - } -} -// --------------------------------------------------------------------------- -::boost::shared_ptr<OSectionWindow> OViewsWindow::getSectionWindow(const uno::Reference< report::XSection>& _xSection) const -{ - OSL_ENSURE(_xSection.is(),"Section is NULL!"); - - ::boost::shared_ptr<OSectionWindow> pSectionWindow; - TSectionsMap::const_iterator aIter = m_aSections.begin(); - TSectionsMap::const_iterator aEnd = m_aSections.end(); - for (; aIter != aEnd ; ++aIter) - { - if ((*aIter)->getReportSection().getSection() == _xSection) - { - pSectionWindow = (*aIter); - break; - } - } - - return pSectionWindow; -} - -//---------------------------------------------------------------------------- -::boost::shared_ptr<OSectionWindow> OViewsWindow::getMarkedSection(NearSectionAccess nsa) const -{ - ::boost::shared_ptr<OSectionWindow> pRet; - TSectionsMap::const_iterator aIter = m_aSections.begin(); - TSectionsMap::const_iterator aEnd = m_aSections.end(); - sal_uInt32 nCurrentPosition = 0; - for (; aIter != aEnd ; ++aIter) - { - if ( (*aIter)->getStartMarker().isMarked() ) - { - if (nsa == CURRENT) - { - pRet = (*aIter); - break; - } - else if ( nsa == PREVIOUS ) - { - if (nCurrentPosition > 0) - { - pRet = (*(--aIter)); - if (pRet == NULL) - { - pRet = (*m_aSections.begin()); - } - } - else - { - // if we are out of bounds return the first one - pRet = (*m_aSections.begin()); - } - break; - } - else if ( nsa == POST ) - { - sal_uInt32 nSize = m_aSections.size(); - if ((nCurrentPosition + 1) < nSize) - { - pRet = *(++aIter); - if (pRet == NULL) - { - pRet = (*(--aEnd)); - } - } - else - { - // if we are out of bounds return the last one - pRet = (*(--aEnd)); - } - break; - } - } - ++nCurrentPosition; - } - - return pRet; -} -// ------------------------------------------------------------------------- -void OViewsWindow::markSection(const sal_uInt16 _nPos) -{ - if ( _nPos < m_aSections.size() ) - m_pParent->setMarked(m_aSections[_nPos]->getReportSection().getSection(),sal_True); -} -//---------------------------------------------------------------------------- -sal_Bool OViewsWindow::IsPasteAllowed() const -{ - TransferableDataHelper aTransferData( TransferableDataHelper::CreateFromSystemClipboard( const_cast< OViewsWindow* >( this ) ) ); - return aTransferData.HasFormat(OReportExchange::getDescriptorFormatId()); -} -//----------------------------------------------------------------------------- -void OViewsWindow::SelectAll(const sal_uInt16 _nObjectType) -{ - m_bInUnmark = sal_True; - ::std::for_each(m_aSections.begin(),m_aSections.end(), - ::o3tl::compose1(::boost::bind(::boost::mem_fn(&OReportSection::SelectAll),_1,_nObjectType),TReportPairHelper())); - m_bInUnmark = sal_False; -} -//----------------------------------------------------------------------------- -void OViewsWindow::unmarkAllObjects(OSectionView* _pSectionView) -{ - if ( !m_bInUnmark ) - { - m_bInUnmark = sal_True; - TSectionsMap::iterator aIter = m_aSections.begin(); - TSectionsMap::iterator aEnd = m_aSections.end(); - for (; aIter != aEnd ; ++aIter) - { - if ( &(*aIter)->getReportSection().getSectionView() != _pSectionView ) - { - (*aIter)->getReportSection().deactivateOle(); - (*aIter)->getReportSection().getSectionView().UnmarkAllObj(); - } - } - m_bInUnmark = sal_False; - } -} -// ----------------------------------------------------------------------- -void OViewsWindow::ConfigurationChanged( utl::ConfigurationBroadcaster*, sal_uInt32) -{ - ImplInitSettings(); - Invalidate(); -} -// ----------------------------------------------------------------------------- -void OViewsWindow::MouseButtonDown( const MouseEvent& rMEvt ) -{ - if ( rMEvt.IsLeft() ) - { - GrabFocus(); - const uno::Sequence< beans::PropertyValue> aArgs; - getView()->getReportView()->getController().executeChecked(SID_SELECT_REPORT,aArgs); - } - Window::MouseButtonDown(rMEvt); -} -//---------------------------------------------------------------------------- -void OViewsWindow::showRuler(sal_Bool _bShow) -{ - ::std::for_each(m_aSections.begin(),m_aSections.end(), - ::o3tl::compose1(::boost::bind(&OStartMarker::showRuler,_1,_bShow),TStartMarkerHelper())); - ::std::for_each(m_aSections.begin(),m_aSections.end(), - ::o3tl::compose1(::boost::bind(&OStartMarker::Window::Invalidate, _1, sal_uInt16(INVALIDATE_NOERASE)), TStartMarkerHelper())); -} -//---------------------------------------------------------------------------- -void OViewsWindow::MouseButtonUp( const MouseEvent& rMEvt ) -{ - if ( rMEvt.IsLeft() ) - { - TSectionsMap::iterator aIter = m_aSections.begin(); - TSectionsMap::iterator aEnd = m_aSections.end(); - for (;aIter != aEnd ; ++aIter) - { - if ( (*aIter)->getReportSection().getSectionView().AreObjectsMarked() ) - { - (*aIter)->getReportSection().MouseButtonUp(rMEvt); - break; - } - } - - // remove special insert mode - for (aIter = m_aSections.begin();aIter != aEnd ; ++aIter) - { - (*aIter)->getReportSection().getPage()->resetSpecialMode(); - } - } -} -//------------------------------------------------------------------------------ -sal_Bool OViewsWindow::handleKeyEvent(const KeyEvent& _rEvent) -{ - sal_Bool bRet = sal_False; - TSectionsMap::iterator aIter = m_aSections.begin(); - TSectionsMap::iterator aEnd = m_aSections.end(); - for (;aIter != aEnd ; ++aIter) - { - if ( (*aIter)->getStartMarker().isMarked() ) - { - bRet = (*aIter)->getReportSection().handleKeyEvent(_rEvent); - } - } - return bRet; -} -//---------------------------------------------------------------------------- -OViewsWindow::TSectionsMap::iterator OViewsWindow::getIteratorAtPos(sal_uInt16 _nPos) -{ - TSectionsMap::iterator aRet = m_aSections.end(); - if ( _nPos < m_aSections.size() ) - aRet = m_aSections.begin() + _nPos; - return aRet; -} -//------------------------------------------------------------------------ -void OViewsWindow::setMarked(OSectionView* _pSectionView,sal_Bool _bMark) -{ - OSL_ENSURE(_pSectionView != NULL,"SectionView is NULL!"); - if ( _pSectionView ) - setMarked(_pSectionView->getReportSection()->getSection(),_bMark); -} -//------------------------------------------------------------------------ -void OViewsWindow::setMarked(const uno::Reference< report::XSection>& _xSection,sal_Bool _bMark) -{ - TSectionsMap::iterator aIter = m_aSections.begin(); - TSectionsMap::iterator aEnd = m_aSections.end(); - for (; aIter != aEnd ; ++aIter) - { - if ( (*aIter)->getReportSection().getSection() != _xSection ) - { - (*aIter)->setMarked(sal_False); - } - else if ( (*aIter)->getStartMarker().isMarked() != _bMark ) - { - (*aIter)->setMarked(_bMark); - } - } -} -//------------------------------------------------------------------------ -void OViewsWindow::setMarked(const uno::Sequence< uno::Reference< report::XReportComponent> >& _aShapes,sal_Bool _bMark) -{ - bool bFirst = true; - const uno::Reference< report::XReportComponent>* pIter = _aShapes.getConstArray(); - const uno::Reference< report::XReportComponent>* pEnd = pIter + _aShapes.getLength(); - for(;pIter != pEnd;++pIter) - { - const uno::Reference< report::XSection> xSection = (*pIter)->getSection(); - if ( xSection.is() ) - { - if ( bFirst ) - { - bFirst = false; - m_pParent->setMarked(xSection,_bMark); - } - ::boost::shared_ptr<OSectionWindow> pSectionWindow = getSectionWindow(xSection); - if ( pSectionWindow ) - { - SvxShape* pShape = SvxShape::getImplementation( *pIter ); - SdrObject* pObject = pShape ? pShape->GetSdrObject() : NULL; - OSL_ENSURE( pObject, "OViewsWindow::setMarked: no SdrObject for the shape!" ); - if ( pObject ) - pSectionWindow->getReportSection().getSectionView().MarkObj( pObject, pSectionWindow->getReportSection().getSectionView().GetSdrPageView(), !_bMark ); - } - } - } -} -// ----------------------------------------------------------------------------- -void OViewsWindow::collectRectangles(TRectangleMap& _rSortRectangles, bool _bBoundRects) -{ - TSectionsMap::iterator aIter = m_aSections.begin(); - TSectionsMap::iterator aEnd = m_aSections.end(); - for (aIter = m_aSections.begin();aIter != aEnd ; ++aIter) - { - OSectionView& rView = (*aIter)->getReportSection().getSectionView(); - if ( rView.AreObjectsMarked() ) - { - rView.SortMarkedObjects(); - const sal_uInt32 nCount = rView.GetMarkedObjectCount(); - for (sal_uInt32 i=0; i < nCount; ++i) - { - const SdrMark* pM = rView.GetSdrMarkByIndex(i); - SdrObject* pObj = pM->GetMarkedSdrObj(); - Rectangle aObjRect(_bBoundRects ? pObj->GetCurrentBoundRect() : pObj->GetSnapRect()); - _rSortRectangles.insert(TRectangleMap::value_type(aObjRect,TRectangleMap::mapped_type(pObj,&rView))); - } - } - } -} -// ----------------------------------------------------------------------------- -void OViewsWindow::collectBoundResizeRect(const TRectangleMap& _rSortRectangles,sal_Int32 _nControlModification,bool _bAlignAtSection, bool _bBoundRects,Rectangle& _rBound,Rectangle& _rResize) -{ - bool bOnlyOnce = false; - TRectangleMap::const_iterator aRectIter = _rSortRectangles.begin(); - TRectangleMap::const_iterator aRectEnd = _rSortRectangles.end(); - for (;aRectIter != aRectEnd ; ++aRectIter) - { - Rectangle aObjRect = aRectIter->first; - if ( _rResize.IsEmpty() ) - _rResize = aObjRect; - switch(_nControlModification) - { - case ControlModification::WIDTH_SMALLEST: - if ( _rResize.getWidth() > aObjRect.getWidth() ) - _rResize = aObjRect; - break; - case ControlModification::HEIGHT_SMALLEST: - if ( _rResize.getHeight() > aObjRect.getHeight() ) - _rResize = aObjRect; - break; - case ControlModification::WIDTH_GREATEST: - if ( _rResize.getWidth() < aObjRect.getWidth() ) - _rResize = aObjRect; - break; - case ControlModification::HEIGHT_GREATEST: - if ( _rResize.getHeight() < aObjRect.getHeight() ) - _rResize = aObjRect; - break; - } - - SdrObjTransformInfoRec aInfo; - const SdrObject* pObj = aRectIter->second.first; - pObj->TakeObjInfo(aInfo); - sal_Bool bHasFixed = !aInfo.bMoveAllowed || pObj->IsMoveProtect(); - if ( bHasFixed ) - _rBound.Union(aObjRect); - else - { - if ( _bAlignAtSection || _rSortRectangles.size() == 1 ) - { // einzelnes Obj an der Seite ausrichten - if ( ! bOnlyOnce ) - { - bOnlyOnce = true; - OReportSection* pReportSection = aRectIter->second.second->getReportSection(); - const uno::Reference< report::XSection> xSection = pReportSection->getSection(); - try - { - uno::Reference<report::XReportDefinition> xReportDefinition = xSection->getReportDefinition(); - _rBound.Union(Rectangle(getStyleProperty<sal_Int32>(xReportDefinition,PROPERTY_LEFTMARGIN),0, - getStyleProperty<awt::Size>(xReportDefinition,PROPERTY_PAPERSIZE).Width - getStyleProperty<sal_Int32>(xReportDefinition,PROPERTY_RIGHTMARGIN), - xSection->getHeight())); - } - catch(uno::Exception){} - } - } - else - { - if (_bBoundRects) - _rBound.Union(aRectIter->second.second->GetMarkedObjBoundRect()); - else - _rBound.Union(aRectIter->second.second->GetMarkedObjRect()); - } - } - } -} -// ----------------------------------------------------------------------------- -void OViewsWindow::alignMarkedObjects(sal_Int32 _nControlModification,bool _bAlignAtSection, bool _bBoundRects) -{ - if ( _nControlModification == ControlModification::NONE ) - return; - - Point aRefPoint; - RectangleLess::CompareMode eCompareMode = RectangleLess::POS_LEFT; - switch (_nControlModification) - { - case ControlModification::TOP : eCompareMode = RectangleLess::POS_UPPER; break; - case ControlModification::BOTTOM: eCompareMode = RectangleLess::POS_DOWN; break; - case ControlModification::LEFT : eCompareMode = RectangleLess::POS_LEFT; break; - case ControlModification::RIGHT : eCompareMode = RectangleLess::POS_RIGHT; break; - case ControlModification::CENTER_HORIZONTAL : - case ControlModification::CENTER_VERTICAL : - { - eCompareMode = (ControlModification::CENTER_VERTICAL == _nControlModification) ? RectangleLess::POS_CENTER_VERTICAL : RectangleLess::POS_CENTER_HORIZONTAL; - uno::Reference<report::XSection> xSection = (*m_aSections.begin())->getReportSection().getSection(); - uno::Reference<report::XReportDefinition> xReportDefinition = xSection->getReportDefinition(); - aRefPoint = Rectangle(getStyleProperty<sal_Int32>(xReportDefinition,PROPERTY_LEFTMARGIN),0, - getStyleProperty<awt::Size>(xReportDefinition,PROPERTY_PAPERSIZE).Width - getStyleProperty<sal_Int32>(xReportDefinition,PROPERTY_RIGHTMARGIN), - xSection->getHeight()).Center(); - } - break; - default: break; - } - RectangleLess aCompare(eCompareMode,aRefPoint); - TRectangleMap aSortRectangles(aCompare); - collectRectangles(aSortRectangles,_bBoundRects); - - Rectangle aBound; - Rectangle aResize; - collectBoundResizeRect(aSortRectangles,_nControlModification,_bAlignAtSection,_bBoundRects,aBound,aResize); - - bool bMove = true; - - ::std::mem_fun_t<long&,Rectangle> aGetFun = ::std::mem_fun<long&,Rectangle>(&Rectangle::Bottom); - ::std::mem_fun_t<long&,Rectangle> aRefFun = ::std::mem_fun<long&,Rectangle>(&Rectangle::Top); - TRectangleMap::iterator aRectIter = aSortRectangles.begin(); - TRectangleMap::iterator aRectEnd = aSortRectangles.end(); - for (;aRectIter != aRectEnd ; ++aRectIter) - { - Rectangle aObjRect = aRectIter->first; - SdrObject* pObj = aRectIter->second.first; - SdrView* pView = aRectIter->second.second; - Point aCenter(aBound.Center()); - SdrObjTransformInfoRec aInfo; - pObj->TakeObjInfo(aInfo); - if (aInfo.bMoveAllowed && !pObj->IsMoveProtect()) - { - long nXMov = 0; - long nYMov = 0; - long* pValue = &nXMov; - switch(_nControlModification) - { - case ControlModification::TOP : - aGetFun = ::std::mem_fun<long&,Rectangle>(&Rectangle::Top); - aRefFun = ::std::mem_fun<long&,Rectangle>(&Rectangle::Bottom); - pValue = &nYMov; - break; - case ControlModification::BOTTOM: - // defaults are already set - pValue = &nYMov; - break; - case ControlModification::CENTER_VERTICAL: - nYMov = aCenter.Y() - aObjRect.Center().Y(); - pValue = &nYMov; - bMove = false; - break; - case ControlModification::RIGHT : - aGetFun = ::std::mem_fun<long&,Rectangle>(&Rectangle::Right); - aRefFun = ::std::mem_fun<long&,Rectangle>(&Rectangle::Left); - break; - case ControlModification::CENTER_HORIZONTAL: - nXMov = aCenter.X() - aObjRect.Center().X(); - bMove = false; - break; - case ControlModification::LEFT : - aGetFun = ::std::mem_fun<long&,Rectangle>(&Rectangle::Left); - aRefFun = ::std::mem_fun<long&,Rectangle>(&Rectangle::Right); - break; - default: - bMove = false; - break; - } - if ( bMove ) - { - Rectangle aTest = aObjRect; - aGetFun(&aTest) = aGetFun(&aBound); - TRectangleMap::iterator aInterSectRectIter = aSortRectangles.begin(); - for (; aInterSectRectIter != aRectIter; ++aInterSectRectIter) - { - if ( pView == aInterSectRectIter->second.second && (dynamic_cast<OUnoObject*>(aInterSectRectIter->second.first) || dynamic_cast<OOle2Obj*>(aInterSectRectIter->second.first))) - { - SdrObject* pPreviousObj = aInterSectRectIter->second.first; - Rectangle aIntersectRect = aTest.GetIntersection(_bBoundRects ? pPreviousObj->GetCurrentBoundRect() : pPreviousObj->GetSnapRect()); - if ( !aIntersectRect.IsEmpty() && (aIntersectRect.Left() != aIntersectRect.Right() && aIntersectRect.Top() != aIntersectRect.Bottom() ) ) - { - *pValue = aRefFun(&aIntersectRect) - aGetFun(&aObjRect); - break; - } - } - } - if ( aInterSectRectIter == aRectIter ) - *pValue = aGetFun(&aBound) - aGetFun(&aObjRect); - } - - if ( lcl_getNewRectSize(aObjRect,nXMov,nYMov,pObj,pView,_nControlModification,_bBoundRects) ) - { - const Size aSize(nXMov,nYMov); - pView->AddUndo(pView->GetModel()->GetSdrUndoFactory().CreateUndoMoveObject(*pObj,aSize)); - pObj->Move(aSize); - aObjRect = (_bBoundRects ? pObj->GetCurrentBoundRect() : pObj->GetSnapRect()); - } - - // resizing control - if ( !aResize.IsEmpty() && aObjRect != aResize ) - { - nXMov = aResize.getWidth(); - nYMov = aResize.getHeight(); - switch(_nControlModification) - { - case ControlModification::WIDTH_GREATEST: - case ControlModification::HEIGHT_GREATEST: - if ( _nControlModification == ControlModification::HEIGHT_GREATEST ) - nXMov = aObjRect.getWidth(); - else if ( _nControlModification == ControlModification::WIDTH_GREATEST ) - nYMov = aObjRect.getHeight(); - lcl_getNewRectSize(aObjRect,nXMov,nYMov,pObj,pView,_nControlModification,_bBoundRects); - // run through - case ControlModification::WIDTH_SMALLEST: - case ControlModification::HEIGHT_SMALLEST: - pView->AddUndo( pView->GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*pObj)); - { - OObjectBase* pObjBase = dynamic_cast<OObjectBase*>(pObj); - OSL_ENSURE(pObjBase,"Where comes this object from?"); - if ( pObjBase ) - { - if ( _nControlModification == ControlModification::WIDTH_SMALLEST || _nControlModification == ControlModification::WIDTH_GREATEST ) - pObjBase->getReportComponent()->setSize(awt::Size(nXMov,aObjRect.getHeight())); - else if ( _nControlModification == ControlModification::HEIGHT_GREATEST || _nControlModification == ControlModification::HEIGHT_SMALLEST ) - pObjBase->getReportComponent()->setSize(awt::Size(aObjRect.getWidth(),nYMov)); - } - } - break; - default: - break; - } - } - } - pView->AdjustMarkHdl(); - } -} -// ----------------------------------------------------------------------------- -void OViewsWindow::createDefault() -{ - ::boost::shared_ptr<OSectionWindow> pMarkedSection = getMarkedSection(); - if ( pMarkedSection ) - pMarkedSection->getReportSection().createDefault(m_sShapeType); -} -// ----------------------------------------------------------------------------- -void OViewsWindow::setGridSnap(sal_Bool bOn) -{ - TSectionsMap::iterator aIter = m_aSections.begin(); - TSectionsMap::iterator aEnd = m_aSections.end(); - for (; aIter != aEnd ; ++aIter) - { - (*aIter)->getReportSection().getSectionView().SetGridSnap(bOn); - static sal_Int32 nIn = 0; - (*aIter)->getReportSection().Invalidate(nIn); - } -} -// ----------------------------------------------------------------------------- -void OViewsWindow::setDragStripes(sal_Bool bOn) -{ - TSectionsMap::iterator aIter = m_aSections.begin(); - TSectionsMap::iterator aEnd = m_aSections.end(); - for (; aIter != aEnd ; ++aIter) - (*aIter)->getReportSection().getSectionView().SetDragStripes(bOn); -} -// ----------------------------------------------------------------------------- -sal_uInt16 OViewsWindow::getPosition(const OSectionWindow* _pSectionWindow) const -{ - TSectionsMap::const_iterator aIter = m_aSections.begin(); - TSectionsMap::const_iterator aEnd = m_aSections.end(); - sal_uInt16 nPosition = 0; - for (; aIter != aEnd ; ++aIter) - { - if ( _pSectionWindow == (*aIter).get() ) - { - break; - } - ++nPosition; - } - return nPosition; -} -// ----------------------------------------------------------------------------- -::boost::shared_ptr<OSectionWindow> OViewsWindow::getSectionWindow(const sal_uInt16 _nPos) const -{ - ::boost::shared_ptr<OSectionWindow> aReturn; - - if ( _nPos < m_aSections.size() ) - aReturn = m_aSections[_nPos]; - - return aReturn; -} -// ----------------------------------------------------------------------------- -namespace -{ - enum SectionViewAction - { - eEndDragObj, - eEndAction, - eMoveAction, - eMarkAction, - eForceToAnotherPage, - eBreakAction - }; - class ApplySectionViewAction : public ::std::unary_function< OViewsWindow::TSectionsMap::value_type, void > - { - private: - SectionViewAction m_eAction; - sal_Bool m_bCopy; - Point m_aPoint; - - public: - ApplySectionViewAction( sal_Bool _bCopy ) : m_eAction( eEndDragObj ), m_bCopy( _bCopy ) { } - ApplySectionViewAction(SectionViewAction _eAction = eEndAction ) : m_eAction( _eAction ) { } - ApplySectionViewAction( const Point& _rPoint, SectionViewAction _eAction = eMoveAction ) : m_eAction( _eAction ), m_bCopy( sal_False ), m_aPoint( _rPoint ) { } - - void operator() ( const OViewsWindow::TSectionsMap::value_type& _rhs ) - { - OSectionView& rView( _rhs->getReportSection().getSectionView() ); - switch ( m_eAction ) - { - case eEndDragObj: - rView.EndDragObj( m_bCopy ); - break; - case eEndAction: - if ( rView.IsAction() ) - rView.EndAction ( ); - break; - case eMoveAction: - rView.MovAction ( m_aPoint ); - break; - case eMarkAction: - rView.BegMarkObj ( m_aPoint ); - break; - case eForceToAnotherPage: - rView.ForceMarkedToAnotherPage(); - break; - case eBreakAction: - if ( rView.IsAction() ) - rView.BrkAction ( ); - break; - // default: - - } - } - }; -} -// ----------------------------------------------------------------------------- -void OViewsWindow::BrkAction() -{ - EndDragObj_removeInvisibleObjects(); - ::std::for_each( m_aSections.begin(), m_aSections.end(), ApplySectionViewAction(eBreakAction) ); -} -// ----------------------------------------------------------------------------- -void OViewsWindow::BegDragObj_createInvisibleObjectAtPosition(const Rectangle& _aRect, const OSectionView& _rSection) -{ - TSectionsMap::iterator aIter = m_aSections.begin(); - TSectionsMap::iterator aEnd = m_aSections.end(); - Point aNewPos(0,0); - - for (; aIter != aEnd; ++aIter) - { - OReportSection& rReportSection = (*aIter)->getReportSection(); - rReportSection.getPage()->setSpecialMode(); - OSectionView& rView = rReportSection.getSectionView(); - - if ( &rView != &_rSection ) - { - SdrObject *pNewObj = new SdrUnoObj(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.form.component.FixedText"))); - if (pNewObj) - { - pNewObj->SetLogicRect(_aRect); - - pNewObj->Move(Size(0, aNewPos.Y())); - sal_Bool bChanged = rView.GetModel()->IsChanged(); - rReportSection.getPage()->InsertObject(pNewObj); - rView.GetModel()->SetChanged(bChanged); - m_aBegDragTempList.push_back(pNewObj); - - rView.MarkObj( pNewObj, rView.GetSdrPageView() ); - } - } - const long nSectionHeight = rReportSection.PixelToLogic(rReportSection.GetOutputSizePixel()).Height(); - aNewPos.Y() -= nSectionHeight; - } -} -// ----------------------------------------------------------------------------- -bool OViewsWindow::isObjectInMyTempList(SdrObject *_pObj) -{ - return ::std::find(m_aBegDragTempList.begin(),m_aBegDragTempList.end(),_pObj) != m_aBegDragTempList.end(); -} - -// ----------------------------------------------------------------------------- -void OViewsWindow::BegDragObj(const Point& _aPnt, SdrHdl* _pHdl,const OSectionView* _pSection) -{ - OSL_TRACE("BegDragObj Clickpoint X:%d Y:%d\n", _aPnt.X(), _aPnt.Y() ); - - m_aBegDragTempList.clear(); - - // Calculate the absolute clickpoint in the views - Point aAbsolutePnt = _aPnt; - TSectionsMap::iterator aIter = m_aSections.begin(); - TSectionsMap::iterator aEnd = m_aSections.end(); - for (; aIter != aEnd; ++aIter) - { - OReportSection& rReportSection = (*aIter)->getReportSection(); - OSectionView* pView = &rReportSection.getSectionView(); - if (pView == _pSection) - break; - const long nSectionHeight = rReportSection.PixelToLogic(rReportSection.GetOutputSizePixel()).Height(); - aAbsolutePnt.Y() += nSectionHeight; - } - m_aDragDelta = Point(SAL_MAX_INT32, SAL_MAX_INT32); - OSL_TRACE("BegDragObj Absolute X:%d Y:%d\n", aAbsolutePnt.X(), aAbsolutePnt.Y() ); - - // Create drag lines over all viewable Views - // Therefore we need to identify the marked objects - // and create temporary objects on all other views at the same position - // relative to its occurrence. - - OSL_TRACE("BegDragObj createInvisible Objects\n" ); - int nViewCount = 0; - Point aNewObjPos(0,0); - Point aLeftTop = Point(SAL_MAX_INT32, SAL_MAX_INT32); - for (aIter = m_aSections.begin(); aIter != aEnd; ++aIter) - { - OReportSection& rReportSection = (*aIter)->getReportSection(); - - OSectionView& rView = rReportSection.getSectionView(); - - if ( rView.AreObjectsMarked() ) - { - const sal_uInt32 nCount = rView.GetMarkedObjectCount(); - for (sal_uInt32 i=0; i < nCount; ++i) - { - const SdrMark* pM = rView.GetSdrMarkByIndex(i); - SdrObject* pObj = pM->GetMarkedSdrObj(); - if (!isObjectInMyTempList(pObj)) - { - Rectangle aRect( pObj->GetCurrentBoundRect() ); - aRect.Move(0, aNewObjPos.Y()); - - aLeftTop.X() = ::std::min( aRect.Left(), aLeftTop.X() ); - aLeftTop.Y() = ::std::min( aRect.Top(), aLeftTop.Y() ); - - OSL_TRACE("BegDragObj createInvisible X:%d Y:%d on View #%d\n", aRect.Left(), aRect.Top(), nViewCount ); - - BegDragObj_createInvisibleObjectAtPosition(aRect, rView); - } - } - } - ++nViewCount; - Rectangle aClipRect = rView.GetWorkArea(); - aClipRect.Top() = -aNewObjPos.Y(); - rView.SetWorkArea( aClipRect ); - - const long nSectionHeight = rReportSection.PixelToLogic(rReportSection.GetOutputSizePixel()).Height(); - aNewObjPos.Y() += nSectionHeight; - } - - const sal_Int32 nDeltaX = abs(aLeftTop.X() - aAbsolutePnt.X()); - const sal_Int32 nDeltaY = abs(aLeftTop.Y() - aAbsolutePnt.Y()); - m_aDragDelta.X() = nDeltaX; - m_aDragDelta.Y() = nDeltaY; - - Point aNewPos = aAbsolutePnt; - - const short nDrgLog = static_cast<short>(PixelToLogic(Size(3,0)).Width()); - nViewCount = 0; - for (aIter = m_aSections.begin(); aIter != aEnd; ++aIter) - { - OReportSection& rReportSection = (*aIter)->getReportSection(); - - SdrHdl* pHdl = _pHdl; - if ( pHdl ) - { - if ( &rReportSection.getSectionView() != _pSection ) - { - const SdrHdlList& rHdlList = rReportSection.getSectionView().GetHdlList(); - pHdl = rHdlList.GetHdl(_pHdl->GetKind()); - } - } - OSL_TRACE("BegDragObj X:%d Y:%d on View#%d\n", aNewPos.X(), aNewPos.Y(), nViewCount++ ); - rReportSection.getSectionView().BegDragObj(aNewPos, (OutputDevice*)NULL, pHdl, nDrgLog, NULL); - - const long nSectionHeight = rReportSection.PixelToLogic(rReportSection.GetOutputSizePixel()).Height(); - aNewPos.Y() -= nSectionHeight; - } -} - -// ----------------------------------------------------------------------------- -void OViewsWindow::ForceMarkedToAnotherPage() -{ - ::std::for_each( m_aSections.begin(), m_aSections.end(), ApplySectionViewAction(eForceToAnotherPage ) ); -} -// ----------------------------------------------------------------------------- -void OViewsWindow::BegMarkObj(const Point& _aPnt,const OSectionView* _pSection) -{ - bool bAdd = true; - Point aNewPos = _aPnt; - - TSectionsMap::iterator aIter = m_aSections.begin(); - TSectionsMap::iterator aEnd = m_aSections.end(); - long nLastSectionHeight = 0; - for (; aIter != aEnd; ++aIter) - { - OReportSection& rReportSection = (*aIter)->getReportSection(); - if ( &rReportSection.getSectionView() == _pSection ) - { - bAdd = false; - aNewPos = _aPnt; // 2,2 - } - else if ( bAdd ) - { - const long nSectionHeight = rReportSection.PixelToLogic(rReportSection.GetOutputSizePixel()).Height(); - aNewPos.Y() += nSectionHeight; - } - else - { - aNewPos.Y() -= nLastSectionHeight; - } - rReportSection.getSectionView().BegMarkObj ( aNewPos ); - nLastSectionHeight = rReportSection.PixelToLogic(rReportSection.GetOutputSizePixel()).Height(); - } -} -// ----------------------------------------------------------------------------- -OSectionView* OViewsWindow::getSectionRelativeToPosition(const OSectionView* _pSection,Point& _rPnt) -{ - OSectionView* pSection = NULL; - sal_Int32 nCount = 0; - TSectionsMap::iterator aIter = m_aSections.begin(); - const TSectionsMap::iterator aEnd = m_aSections.end(); - for (; aIter != aEnd ; ++aIter,++nCount) - { - OReportSection& rReportSection = (*aIter)->getReportSection(); - if ( &rReportSection.getSectionView() == _pSection) - break; - } - OSL_ENSURE(aIter != aEnd,"This can never happen!"); - if ( _rPnt.Y() < 0 ) - { - if ( nCount ) - --aIter; - for (; nCount && (_rPnt.Y() < 0); --nCount) - { - OReportSection& rReportSection = (*aIter)->getReportSection(); - const sal_Int32 nHeight = rReportSection.PixelToLogic(rReportSection.GetOutputSizePixel()).Height(); - _rPnt.Y() += nHeight; - if ( (nCount -1) > 0 && (_rPnt.Y() < 0) ) - --aIter; - } - if ( nCount == 0 ) - pSection = &(*m_aSections.begin())->getReportSection().getSectionView(); - else - pSection = &(*aIter)->getReportSection().getSectionView(); - } - else - { - for (; aIter != aEnd; ++aIter) - { - OReportSection& rReportSection = (*aIter)->getReportSection(); - const long nHeight = rReportSection.PixelToLogic(rReportSection.GetOutputSizePixel()).Height(); - if ( (_rPnt.Y() - nHeight) < 0 ) - break; - _rPnt.Y() -= nHeight; - } - if ( aIter != aEnd ) - pSection = &(*aIter)->getReportSection().getSectionView(); - else - pSection = &(*(aEnd-1))->getReportSection().getSectionView(); - } - - return pSection; -} -// ----------------------------------------------------------------------------- -void OViewsWindow::EndDragObj_removeInvisibleObjects() -{ - TSectionsMap::iterator aIter = m_aSections.begin(); - TSectionsMap::iterator aEnd = m_aSections.end(); - - for (; aIter != aEnd; ++aIter) - { - OReportSection& rReportSection = (*aIter)->getReportSection(); - rReportSection.getPage()->resetSpecialMode(); - } -} -// ----------------------------------------------------------------------------- -void OViewsWindow::EndDragObj(sal_Bool _bControlKeyPressed, const OSectionView* _pSection,const Point& _aPnt) -{ - const String sUndoAction = String((ModuleRes(RID_STR_UNDO_CHANGEPOSITION))); - const UndoContext aUndoContext( getView()->getReportView()->getController().getUndoManager(), sUndoAction ); - - Point aNewPos = _aPnt; - OSectionView* pInSection = getSectionRelativeToPosition(_pSection, aNewPos); - if (!_bControlKeyPressed && - (_pSection && ( _pSection->IsDragResize() == false ) ) && /* Not in resize mode */ - _pSection != pInSection) - { - EndDragObj_removeInvisibleObjects(); - - // we need to manipulate the current clickpoint, we substract the old delta from BeginDrag - aNewPos -= m_aDragDelta; - - uno::Sequence< beans::NamedValue > aAllreadyCopiedObjects; - TSectionsMap::iterator aIter = m_aSections.begin(); - const TSectionsMap::iterator aEnd = m_aSections.end(); - for (; aIter != aEnd; ++aIter) - { - OReportSection& rReportSection = (*aIter)->getReportSection(); - if ( pInSection != &rReportSection.getSectionView() ) - { - rReportSection.getSectionView().BrkAction(); - rReportSection.Copy(aAllreadyCopiedObjects,true); - } - else - pInSection->EndDragObj(sal_False); - } - - if ( aAllreadyCopiedObjects.getLength() ) - { - beans::NamedValue* pIter = aAllreadyCopiedObjects.getArray(); - const beans::NamedValue* pEnd = pIter + aAllreadyCopiedObjects.getLength(); - try - { - uno::Reference<report::XReportDefinition> xReportDefinition = getView()->getReportView()->getController().getReportDefinition(); - const sal_Int32 nLeftMargin = getStyleProperty<sal_Int32>(xReportDefinition,PROPERTY_LEFTMARGIN); - const sal_Int32 nRightMargin = getStyleProperty<sal_Int32>(xReportDefinition,PROPERTY_RIGHTMARGIN); - const sal_Int32 nPaperWidth = getStyleProperty<awt::Size>(xReportDefinition,PROPERTY_PAPERSIZE).Width; - - if ( aNewPos.X() < nLeftMargin ) - aNewPos.X() = nLeftMargin; - if ( aNewPos.Y() < 0 ) - aNewPos.Y() = 0; - - Point aPrevious; - for (; pIter != pEnd; ++pIter) - { - uno::Sequence< uno::Reference<report::XReportComponent> > aClones; - pIter->Value >>= aClones; - uno::Reference<report::XReportComponent>* pColIter = aClones.getArray(); - const uno::Reference<report::XReportComponent>* pColEnd = pColIter + aClones.getLength(); - - // move the cloned Components to new positions - for (; pColIter != pColEnd; ++pColIter) - { - uno::Reference< report::XReportComponent> xRC(*pColIter); - aPrevious = VCLPoint(xRC->getPosition()); - awt::Size aSize = xRC->getSize(); - - if ( aNewPos.X() < nLeftMargin ) - { - aNewPos.X() = nLeftMargin; - } - else if ( (aNewPos.X() + aSize.Width) > (nPaperWidth - nRightMargin) ) - { - aNewPos.X() = nPaperWidth - nRightMargin - aSize.Width; - } - if ( aNewPos.Y() < 0 ) - { - aNewPos.Y() = 0; - } - if ( aNewPos.X() < 0 ) - { - aSize.Width += aNewPos.X(); - aNewPos.X()= 0; - xRC->setSize(aSize); - } - xRC->setPosition(AWTPoint(aNewPos)); - if ( (pColIter+1) != pColEnd ) - { - // bring aNewPos to the position of the next object - uno::Reference< report::XReportComponent> xRCNext(*(pColIter + 1),uno::UNO_QUERY); - Point aNextPosition = VCLPoint(xRCNext->getPosition()); - aNewPos += (aNextPosition - aPrevious); - } - } - } - } - catch(uno::Exception&) - { - } - pInSection->getReportSection()->Paste(aAllreadyCopiedObjects,true); - } - } - else - { - ::std::for_each( m_aSections.begin(), m_aSections.end(), ApplySectionViewAction( sal_False ) ); - EndDragObj_removeInvisibleObjects(); - } - m_aDragDelta = Point(SAL_MAX_INT32, SAL_MAX_INT32); -} -// ----------------------------------------------------------------------------- -void OViewsWindow::EndAction() -{ - ::std::for_each( m_aSections.begin(), m_aSections.end(), ApplySectionViewAction() ); -} -// ----------------------------------------------------------------------------- -void OViewsWindow::MovAction(const Point& _aPnt,const OSectionView* _pSection,bool _bMove, bool _bControlKeySet) -{ - (void)_bMove; - - Point aRealMousePos = _aPnt; - Point aCurrentSectionPos; - OSL_TRACE("MovAction X:%d Y:%d\n", aRealMousePos.X(), aRealMousePos.Y() ); - - Point aHdlPos; - SdrHdl* pHdl = _pSection->GetDragHdl(); - if ( pHdl ) - { - aHdlPos = pHdl->GetPos(); - } - - TSectionsMap::iterator aIter; - TSectionsMap::iterator aEnd = m_aSections.end(); - - for (aIter = m_aSections.begin(); aIter != aEnd; ++aIter) - { - OReportSection& rReportSection = (*aIter)->getReportSection(); - if ( &rReportSection.getSectionView() == _pSection ) - break; - const long nSectionHeight = (*aIter)->PixelToLogic(rReportSection.GetOutputSizePixel()).Height(); - aCurrentSectionPos.Y() += nSectionHeight; - } - aRealMousePos += aCurrentSectionPos; - - // If control key is pressed the work area is limited to the section with the current selection. - Point aPosForWorkArea(0,0); - for (aIter = m_aSections.begin(); aIter != aEnd; ++aIter) - { - OReportSection& rReportSection = (*aIter)->getReportSection(); - OSectionView& rView = rReportSection.getSectionView(); - const long nSectionHeight = (*aIter)->PixelToLogic((*aIter)->GetOutputSizePixel()).Height(); - - if (_bControlKeySet) - { - Rectangle aClipRect = rView.GetWorkArea(); - aClipRect.Top() = aCurrentSectionPos.Y() - aPosForWorkArea.Y(); - aClipRect.Bottom() = aClipRect.Top() + nSectionHeight; - rView.SetWorkArea( aClipRect ); - } - else - { - Rectangle aClipRect = rView.GetWorkArea(); - aClipRect.Top() = -aPosForWorkArea.Y(); - rView.SetWorkArea( aClipRect ); - } - aPosForWorkArea.Y() += nSectionHeight; - } - - - for (aIter = m_aSections.begin(); aIter != aEnd; ++aIter) - { - OReportSection& rReportSection = (*aIter)->getReportSection(); - SdrHdl* pCurrentHdl = rReportSection.getSectionView().GetDragHdl(); - if ( pCurrentHdl ) - { - if ( aRealMousePos.Y() > 0 ) - aRealMousePos = _aPnt + pCurrentHdl->GetPos() - aHdlPos; - } - rReportSection.getSectionView().MovAction ( aRealMousePos ); - const long nSectionHeight = (*aIter)->PixelToLogic((*aIter)->GetOutputSizePixel()).Height(); - aRealMousePos.Y() -= nSectionHeight; - } -} -// ----------------------------------------------------------------------------- -sal_Bool OViewsWindow::IsAction() const -{ - sal_Bool bAction = sal_False; - TSectionsMap::const_iterator aIter = m_aSections.begin(); - TSectionsMap::const_iterator aEnd = m_aSections.end(); - for (; !bAction && aIter != aEnd; ++aIter) - bAction = (*aIter)->getReportSection().getSectionView().IsAction(); - return bAction; -} -// ----------------------------------------------------------------------------- -sal_Bool OViewsWindow::IsDragObj() const -{ - sal_Bool bAction = sal_False; - TSectionsMap::const_iterator aIter = m_aSections.begin(); - TSectionsMap::const_iterator aEnd = m_aSections.end(); - for (; !bAction && aIter != aEnd; ++aIter) - bAction = (*aIter)->getReportSection().getSectionView().IsAction(); - return bAction; -} -// ----------------------------------------------------------------------------- -sal_uInt32 OViewsWindow::getMarkedObjectCount() const -{ - sal_uInt32 nCount = 0; - TSectionsMap::const_iterator aIter = m_aSections.begin(); - TSectionsMap::const_iterator aEnd = m_aSections.end(); - for (; aIter != aEnd; ++aIter) - nCount += (*aIter)->getReportSection().getSectionView().GetMarkedObjectCount(); - return nCount; -} -// ----------------------------------------------------------------------------- -void OViewsWindow::handleKey(const KeyCode& _rCode) -{ - const sal_uInt16 nCode = _rCode.GetCode(); - if ( _rCode.IsMod1() ) - { - // scroll page - OScrollWindowHelper* pScrollWindow = getView()->getScrollWindow(); - ScrollBar* pScrollBar = ( nCode == KEY_LEFT || nCode == KEY_RIGHT ) ? pScrollWindow->GetHScroll() : pScrollWindow->GetVScroll(); - if ( pScrollBar && pScrollBar->IsVisible() ) - pScrollBar->DoScrollAction(( nCode == KEY_RIGHT || nCode == KEY_UP ) ? SCROLL_LINEUP : SCROLL_LINEDOWN ); - return; - } - TSectionsMap::const_iterator aIter = m_aSections.begin(); - TSectionsMap::const_iterator aEnd = m_aSections.end(); - for (; aIter != aEnd; ++aIter) - { - OReportSection& rReportSection = (*aIter)->getReportSection(); - long nX = 0; - long nY = 0; - - if ( nCode == KEY_UP ) - nY = -1; - else if ( nCode == KEY_DOWN ) - nY = 1; - else if ( nCode == KEY_LEFT ) - nX = -1; - else if ( nCode == KEY_RIGHT ) - nX = 1; - - if ( rReportSection.getSectionView().AreObjectsMarked() ) - { - if ( _rCode.IsMod2() ) - { - // move in 1 pixel distance - const Size aPixelSize = rReportSection.PixelToLogic( Size( 1, 1 ) ); - nX *= aPixelSize.Width(); - nY *= aPixelSize.Height(); - } - else - { - // move in 1 mm distance - nX *= DEFAUL_MOVE_SIZE; - nY *= DEFAUL_MOVE_SIZE; - } - - OSectionView& rView = rReportSection.getSectionView(); - const SdrHdlList& rHdlList = rView.GetHdlList(); - SdrHdl* pHdl = rHdlList.GetFocusHdl(); - - if ( pHdl == 0 ) - { - // no handle selected - if ( rView.IsMoveAllowed() ) - { - // restrict movement to work area - Rectangle rWorkArea = rView.GetWorkArea(); - rWorkArea.Right()++; - - if ( !rWorkArea.IsEmpty() ) - { - if ( rWorkArea.Top() < 0 ) - rWorkArea.Top() = 0; - Rectangle aMarkRect( rView.GetMarkedObjRect() ); - aMarkRect.Move( nX, nY ); - - if ( !rWorkArea.IsInside( aMarkRect ) ) - { - if ( aMarkRect.Left() < rWorkArea.Left() ) - nX += rWorkArea.Left() - aMarkRect.Left(); - - if ( aMarkRect.Right() > rWorkArea.Right() ) - nX -= aMarkRect.Right() - rWorkArea.Right(); - - if ( aMarkRect.Top() < rWorkArea.Top() ) - nY += rWorkArea.Top() - aMarkRect.Top(); - - if ( aMarkRect.Bottom() > rWorkArea.Bottom() ) - nY -= aMarkRect.Bottom() - rWorkArea.Bottom(); - } - bool bCheck = false; - const SdrMarkList& rMarkList = rView.GetMarkedObjectList(); - for (sal_uInt32 i = 0; !bCheck && i < rMarkList.GetMarkCount();++i ) - { - SdrMark* pMark = rMarkList.GetMark(i); - bCheck = dynamic_cast<OUnoObject*>(pMark->GetMarkedSdrObj()) != NULL|| dynamic_cast<OOle2Obj*>(pMark->GetMarkedSdrObj()); - } - - - if ( bCheck ) - { - SdrObject* pOverlapped = isOver(aMarkRect,*rReportSection.getPage(),rView); - if ( pOverlapped ) - { - do - { - Rectangle aOver = pOverlapped->GetLastBoundRect(); - Point aPos; - if ( nCode == KEY_UP ) - { - aPos.X() = aMarkRect.Left(); - aPos.Y() = aOver.Top() - aMarkRect.getHeight(); - nY += (aPos.Y() - aMarkRect.Top()); - } - else if ( nCode == KEY_DOWN ) - { - aPos.X() = aMarkRect.Left(); - aPos.Y() = aOver.Bottom(); - nY += (aPos.Y() - aMarkRect.Top()); - } - else if ( nCode == KEY_LEFT ) - { - aPos.X() = aOver.Left() - aMarkRect.getWidth(); - aPos.Y() = aMarkRect.Top(); - nX += (aPos.X() - aMarkRect.Left()); - } - else if ( nCode == KEY_RIGHT ) - { - aPos.X() = aOver.Right(); - aPos.Y() = aMarkRect.Top(); - nX += (aPos.X() - aMarkRect.Left()); - } - - aMarkRect.SetPos(aPos); - if ( !rWorkArea.IsInside( aMarkRect ) ) - { - break; - } - pOverlapped = isOver(aMarkRect,*rReportSection.getPage(),rView); - } - while(pOverlapped != NULL); - if (pOverlapped != NULL) - break; - } - } - } - - if ( nX != 0 || nY != 0 ) - { - rView.MoveAllMarked( Size( nX, nY ) ); - rView.MakeVisible( rView.GetAllMarkedRect(), rReportSection); - } - } - } - else - { - // move the handle - if ( pHdl && ( nX || nY ) ) - { - const Point aStartPoint( pHdl->GetPos() ); - const Point aEndPoint( pHdl->GetPos() + Point( nX, nY ) ); - const SdrDragStat& rDragStat = rView.GetDragStat(); - - // start dragging - rView.BegDragObj( aStartPoint, 0, pHdl, 0 ); - - if ( rView.IsDragObj() ) - { - const bool bWasNoSnap = rDragStat.IsNoSnap(); - const sal_Bool bWasSnapEnabled = rView.IsSnapEnabled(); - - // switch snapping off - if ( !bWasNoSnap ) - ((SdrDragStat&)rDragStat).SetNoSnap( sal_True ); - if ( bWasSnapEnabled ) - rView.SetSnapEnabled( sal_False ); - - Rectangle aNewRect; - bool bCheck = false; - const SdrMarkList& rMarkList = rView.GetMarkedObjectList(); - for (sal_uInt32 i = 0; !bCheck && i < rMarkList.GetMarkCount();++i ) - { - SdrMark* pMark = rMarkList.GetMark(i); - bCheck = dynamic_cast<OUnoObject*>(pMark->GetMarkedSdrObj()) != NULL || dynamic_cast<OOle2Obj*>(pMark->GetMarkedSdrObj()) != NULL; - if ( bCheck ) - aNewRect.Union(pMark->GetMarkedSdrObj()->GetLastBoundRect()); - } - - switch(pHdl->GetKind()) - { - case HDL_LEFT: - case HDL_UPLFT: - case HDL_LWLFT: - case HDL_UPPER: - aNewRect.Left() += nX; - aNewRect.Top() += nY; - break; - case HDL_UPRGT: - case HDL_RIGHT: - case HDL_LWRGT: - case HDL_LOWER: - aNewRect.setWidth(aNewRect.getWidth() + nX); - aNewRect.setHeight(aNewRect.getHeight() + nY); - break; - default: - break; - } - if ( !(bCheck && isOver(aNewRect,*rReportSection.getPage(),rView)) ) - rView.MovAction(aEndPoint); - rView.EndDragObj(); - - // restore snap - if ( !bWasNoSnap ) - ((SdrDragStat&)rDragStat).SetNoSnap( bWasNoSnap ); - if ( bWasSnapEnabled ) - rView.SetSnapEnabled( bWasSnapEnabled ); - } - - // make moved handle visible - const Rectangle aVisRect( aEndPoint - Point( DEFAUL_MOVE_SIZE, DEFAUL_MOVE_SIZE ), Size( 200, 200 ) ); - rView.MakeVisible( aVisRect, rReportSection); - } - } - rView.AdjustMarkHdl(); - } - } -} -// ----------------------------------------------------------------------------- -void OViewsWindow::stopScrollTimer() -{ - ::std::for_each(m_aSections.begin(),m_aSections.end(), - ::o3tl::compose1(::boost::mem_fn(&OReportSection::stopScrollTimer),TReportPairHelper())); -} -// ----------------------------------------------------------------------------- -void OViewsWindow::fillCollapsedSections(::std::vector<sal_uInt16>& _rCollapsedPositions) const -{ - TSectionsMap::const_iterator aIter = m_aSections.begin(); - TSectionsMap::const_iterator aEnd = m_aSections.end(); - for (sal_uInt16 i = 0;aIter != aEnd ; ++aIter,++i) - { - if ( (*aIter)->getStartMarker().isCollapsed() ) - _rCollapsedPositions.push_back(i); - } -} -// ----------------------------------------------------------------------------- -void OViewsWindow::collapseSections(const uno::Sequence< beans::PropertyValue>& _aCollpasedSections) -{ - const beans::PropertyValue* pIter = _aCollpasedSections.getConstArray(); - const beans::PropertyValue* pEnd = pIter + _aCollpasedSections.getLength(); - for (; pIter != pEnd; ++pIter) - { - sal_uInt16 nPos = sal_uInt16(-1); - if ( (pIter->Value >>= nPos) && nPos < m_aSections.size() ) - { - m_aSections[nPos]->setCollapsed(sal_True); - } - } -} -// ----------------------------------------------------------------------------- -void OViewsWindow::zoom(const Fraction& _aZoom) -{ - const MapMode& aMapMode = GetMapMode(); - - Fraction aStartWidth(long(REPORT_STARTMARKER_WIDTH)); - if ( _aZoom < aMapMode.GetScaleX() ) - aStartWidth *= aMapMode.GetScaleX(); - else - aStartWidth *= _aZoom; - - setZoomFactor(_aZoom,*this); - - TSectionsMap::iterator aIter = m_aSections.begin(); - TSectionsMap::iterator aEnd = m_aSections.end(); - for (;aIter != aEnd ; ++aIter) - { - (*aIter)->zoom(_aZoom); - } - - Resize(); - - Size aOut = GetOutputSizePixel(); - aOut.Width() = aStartWidth; - aOut = PixelToLogic(aOut); - - Rectangle aRect(PixelToLogic(Point(0,0)),aOut); - static sal_Int32 nIn = INVALIDATE_NOCHILDREN; - Invalidate(aRect,nIn); -} -//---------------------------------------------------------------------------- -void OViewsWindow::scrollChildren(const Point& _aThumbPos) -{ - const Point aPos(PixelToLogic(_aThumbPos)); - { - MapMode aMapMode = GetMapMode(); - const Point aOld = aMapMode.GetOrigin(); - aMapMode.SetOrigin(m_pParent->GetMapMode().GetOrigin()); - - const Point aPosY(m_pParent->PixelToLogic(_aThumbPos,aMapMode)); - - aMapMode.SetOrigin( Point(aOld.X() , - aPosY.Y())); - SetMapMode( aMapMode ); - Scroll(0, -( aOld.Y() + aPosY.Y()),SCROLL_CHILDREN); - } - - TSectionsMap::iterator aIter = m_aSections.begin(); - TSectionsMap::iterator aEnd = m_aSections.end(); - for (;aIter != aEnd ; ++aIter) - { - (*aIter)->scrollChildren(aPos.X()); - } -} -// ----------------------------------------------------------------------------- -void OViewsWindow::fillControlModelSelection(::std::vector< uno::Reference< uno::XInterface > >& _rSelection) const -{ - TSectionsMap::const_iterator aIter = m_aSections.begin(); - TSectionsMap::const_iterator aEnd = m_aSections.end(); - for(;aIter != aEnd; ++aIter) - { - (*aIter)->getReportSection().fillControlModelSelection(_rSelection); - } -} -//============================================================================== -} // rptui -//============================================================================== - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |