LCOV - code coverage report
Current view: top level - reportdesign/source/ui/report - ViewsWindow.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 1 997 0.1 %
Date: 2015-06-13 12:38:46 Functions: 2 71 2.8 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include "ViewsWindow.hxx"
      21             : #include "ScrollHelper.hxx"
      22             : #include "UndoActions.hxx"
      23             : #include "ReportWindow.hxx"
      24             : #include "DesignView.hxx"
      25             : #include <svtools/colorcfg.hxx>
      26             : #include "ReportController.hxx"
      27             : #include "UITools.hxx"
      28             : #include "RptDef.hxx"
      29             : #include "RptResId.hrc"
      30             : #include "SectionView.hxx"
      31             : #include "ReportSection.hxx"
      32             : #include "uistrings.hrc"
      33             : #include "rptui_slotid.hrc"
      34             : #include "dlgedclip.hxx"
      35             : #include "ColorChanger.hxx"
      36             : #include "RptObject.hxx"
      37             : #include "ModuleHelper.hxx"
      38             : #include "EndMarker.hxx"
      39             : #include <svx/svdpagv.hxx>
      40             : #include <svx/unoshape.hxx>
      41             : #include <vcl/svapp.hxx>
      42             : #include <vcl/settings.hxx>
      43             : 
      44             : #include <boost/bind.hpp>
      45             : 
      46             : #include "helpids.hrc"
      47             : #include <svx/svdundo.hxx>
      48             : #include <toolkit/helper/convert.hxx>
      49             : #include <algorithm>
      50             : #include <cstdlib>
      51             : #include <numeric>
      52             : #include <o3tl/compat_functional.hxx>
      53             : 
      54             : namespace rptui
      55             : {
      56             : #define DEFAUL_MOVE_SIZE    100
      57             : 
      58             : using namespace ::com::sun::star;
      59             : using namespace ::comphelper;
      60             : 
      61           0 : bool lcl_getNewRectSize(const Rectangle& _aObjRect,long& _nXMov, long& _nYMov,SdrObject* _pObj,SdrView* _pView,sal_Int32 _nControlModification, bool _bBoundRects)
      62             : {
      63           0 :     bool bMoveAllowed = _nXMov != 0 || _nYMov != 0;
      64           0 :     if ( bMoveAllowed )
      65             :     {
      66           0 :         Rectangle aNewRect = _aObjRect;
      67           0 :         SdrObject* pOverlappedObj = NULL;
      68           0 :         do
      69             :         {
      70           0 :             aNewRect = _aObjRect;
      71           0 :             switch(_nControlModification)
      72             :             {
      73             :                 case ControlModification::HEIGHT_GREATEST:
      74             :                 case ControlModification::WIDTH_GREATEST:
      75           0 :                     aNewRect.setWidth(_nXMov);
      76           0 :                     aNewRect.setHeight(_nYMov);
      77           0 :                     break;
      78             :                 default:
      79           0 :                     aNewRect.Move(_nXMov,_nYMov);
      80           0 :                     break;
      81             :             }
      82           0 :             if (dynamic_cast<OUnoObject*>(_pObj) != NULL || dynamic_cast<OOle2Obj*>(_pObj) != NULL)
      83             :             {
      84           0 :                 pOverlappedObj = isOver(aNewRect,*_pObj->GetPage(),*_pView,true,_pObj);
      85           0 :                 if ( pOverlappedObj && _pObj != pOverlappedObj )
      86             :                 {
      87           0 :                     Rectangle aOverlappingRect = (_bBoundRects ? pOverlappedObj->GetCurrentBoundRect() : pOverlappedObj->GetSnapRect());
      88           0 :                     sal_Int32 nXTemp = _nXMov;
      89           0 :                     sal_Int32 nYTemp = _nYMov;
      90           0 :                     switch(_nControlModification)
      91             :                     {
      92             :                         case ControlModification::LEFT:
      93           0 :                             nXTemp += aOverlappingRect.Right() - aNewRect.Left();
      94           0 :                             bMoveAllowed = _nXMov != nXTemp;
      95           0 :                             break;
      96             :                         case ControlModification::RIGHT:
      97           0 :                             nXTemp += aOverlappingRect.Left() - aNewRect.Right();
      98           0 :                             bMoveAllowed = _nXMov != nXTemp;
      99           0 :                             break;
     100             :                         case ControlModification::TOP:
     101           0 :                             nYTemp += aOverlappingRect.Bottom() - aNewRect.Top();
     102           0 :                             bMoveAllowed = _nYMov != nYTemp;
     103           0 :                             break;
     104             :                         case ControlModification::BOTTOM:
     105           0 :                             nYTemp += aOverlappingRect.Top() - aNewRect.Bottom();
     106           0 :                             bMoveAllowed = _nYMov != nYTemp;
     107           0 :                             break;
     108             :                         case ControlModification::CENTER_HORIZONTAL:
     109           0 :                             if ( _aObjRect.Left() < aOverlappingRect.Left() )
     110           0 :                                 nXTemp += aOverlappingRect.Left() - aNewRect.Left() - aNewRect.getWidth();
     111             :                             else
     112           0 :                                 nXTemp += aOverlappingRect.Right() - aNewRect.Left();
     113           0 :                             bMoveAllowed = _nXMov != nXTemp;
     114           0 :                             break;
     115             :                         case ControlModification::CENTER_VERTICAL:
     116           0 :                             if ( _aObjRect.Top() < aOverlappingRect.Top() )
     117           0 :                                 nYTemp += aOverlappingRect.Top() - aNewRect.Top() - aNewRect.getHeight();
     118             :                             else
     119           0 :                                 nYTemp += aOverlappingRect.Bottom() - aNewRect.Top();
     120           0 :                             bMoveAllowed = _nYMov != nYTemp;
     121           0 :                             break;
     122             :                         case ControlModification::HEIGHT_GREATEST:
     123             :                         case ControlModification::WIDTH_GREATEST:
     124             :                             {
     125           0 :                                 Rectangle aIntersectionRect = aNewRect.GetIntersection(aOverlappingRect);
     126           0 :                                 if ( !aIntersectionRect.IsEmpty() )
     127             :                                 {
     128           0 :                                     if ( _nControlModification == ControlModification::WIDTH_GREATEST )
     129             :                                     {
     130           0 :                                         if ( aNewRect.Left() < aIntersectionRect.Left() )
     131             :                                         {
     132           0 :                                             aNewRect.Right() = aIntersectionRect.Left();
     133             :                                         }
     134           0 :                                         else if ( aNewRect.Left() < aIntersectionRect.Right() )
     135             :                                         {
     136           0 :                                             aNewRect.Left() = aIntersectionRect.Right();
     137             :                                         }
     138             :                                     }
     139           0 :                                     else if ( _nControlModification == ControlModification::HEIGHT_GREATEST )
     140             :                                     {
     141           0 :                                         if ( aNewRect.Top() < aIntersectionRect.Top() )
     142             :                                         {
     143           0 :                                             aNewRect.Bottom() = aIntersectionRect.Top();
     144             :                                         }
     145           0 :                                         else if ( aNewRect.Top() < aIntersectionRect.Bottom() )
     146             :                                         {
     147           0 :                                             aNewRect.Top() = aIntersectionRect.Bottom();
     148             :                                         }
     149             :                                     }
     150           0 :                                     nYTemp = aNewRect.getHeight();
     151           0 :                                     bMoveAllowed = _nYMov != nYTemp;
     152           0 :                                     nXTemp = aNewRect.getWidth();
     153           0 :                                     bMoveAllowed = bMoveAllowed && _nXMov != nXTemp;
     154             :                                 }
     155             :                             }
     156           0 :                             break;
     157             :                         default:
     158           0 :                             break;
     159             :                     }
     160             : 
     161           0 :                     _nXMov = nXTemp;
     162           0 :                     _nYMov = nYTemp;
     163             :                 }
     164             :                 else
     165           0 :                     pOverlappedObj = NULL;
     166             :             }
     167             :         }
     168           0 :         while ( pOverlappedObj && bMoveAllowed );
     169             :     }
     170           0 :     return bMoveAllowed;
     171             : }
     172             : 
     173             : 
     174           0 : OViewsWindow::OViewsWindow( OReportWindow* _pReportWindow)
     175             :     : Window( _pReportWindow,WB_DIALOGCONTROL)
     176             :     , m_pParent(_pReportWindow)
     177           0 :     , m_bInUnmark(false)
     178             : {
     179           0 :     SetPaintTransparent(true);
     180           0 :     SetUniqueId(UID_RPT_VIEWSWINDOW);
     181           0 :     SetMapMode(MapMode(MAP_100TH_MM));
     182           0 :     m_aColorConfig.AddListener(this);
     183           0 :     ImplInitSettings();
     184           0 : }
     185             : 
     186           0 : OViewsWindow::~OViewsWindow()
     187             : {
     188           0 :     disposeOnce();
     189           0 : }
     190             : 
     191           0 : void OViewsWindow::dispose()
     192             : {
     193           0 :     m_aColorConfig.RemoveListener(this);
     194           0 :     for (auto i = m_aSections.begin(); i != m_aSections.end(); ++i)
     195           0 :         i->disposeAndClear();
     196           0 :     m_aSections.clear();
     197           0 :     m_pParent.clear();
     198           0 :     vcl::Window::dispose();
     199           0 : }
     200             : 
     201           0 : void OViewsWindow::impl_resizeSectionWindow(OSectionWindow& _rSectionWindow,Point& _rStartPoint,bool _bSet)
     202             : {
     203           0 :     const uno::Reference< report::XSection> xSection = _rSectionWindow.getReportSection().getSection();
     204             : 
     205           0 :     Size aSectionSize = _rSectionWindow.LogicToPixel( Size( 0,xSection->getHeight() ) );
     206           0 :     aSectionSize.Width() = getView()->GetTotalWidth();
     207             : 
     208           0 :     const sal_Int32 nMinHeight = _rSectionWindow.getStartMarker().getMinHeight();
     209           0 :     if ( _rSectionWindow.getStartMarker().isCollapsed() || nMinHeight > aSectionSize.Height() )
     210             :     {
     211           0 :         aSectionSize.Height() = nMinHeight;
     212             :     }
     213           0 :     const StyleSettings& rSettings = GetSettings().GetStyleSettings();
     214           0 :     aSectionSize.Height() += (long)(rSettings.GetSplitSize() * (double)_rSectionWindow.GetMapMode().GetScaleY());
     215             : 
     216           0 :     if ( _bSet )
     217           0 :         _rSectionWindow.SetPosSizePixel(_rStartPoint,aSectionSize);
     218             : 
     219           0 :     _rStartPoint.Y() += aSectionSize.Height();
     220           0 : }
     221             : 
     222             : 
     223           0 : void OViewsWindow::resize(const OSectionWindow& _rSectionWindow)
     224             : {
     225           0 :     bool bSet = false;
     226           0 :     Point aStartPoint;
     227           0 :     TSectionsMap::iterator aIter = m_aSections.begin();
     228           0 :     TSectionsMap::iterator aEnd = m_aSections.end();
     229           0 :     for (;aIter != aEnd ; ++aIter)
     230             :     {
     231           0 :         OSectionWindow* pSectionWindow = (*aIter);
     232           0 :         if ( pSectionWindow == &_rSectionWindow )
     233             :         {
     234           0 :             aStartPoint = pSectionWindow->GetPosPixel();
     235           0 :             bSet = true;
     236             :         }
     237             : 
     238           0 :         if ( bSet )
     239             :         {
     240           0 :             impl_resizeSectionWindow(*pSectionWindow,aStartPoint,bSet);
     241           0 :             static const InvalidateFlags nIn = InvalidateFlags::Update | InvalidateFlags::Transparent;
     242           0 :             pSectionWindow->getStartMarker().Invalidate( nIn ); // InvalidateFlags::NoErase |InvalidateFlags::NoChildren| InvalidateFlags::Transparent
     243           0 :             pSectionWindow->getEndMarker().Invalidate( nIn );
     244             :         }
     245             :     }
     246           0 :     m_pParent->notifySizeChanged();
     247           0 : }
     248             : 
     249           0 : void OViewsWindow::Resize()
     250             : {
     251           0 :     Window::Resize();
     252           0 :     if ( !m_aSections.empty() )
     253             :     {
     254           0 :         const Point aOffset(m_pParent->getThumbPos());
     255           0 :         Point aStartPoint(0,-aOffset.Y());
     256           0 :         TSectionsMap::iterator aIter = m_aSections.begin();
     257           0 :         TSectionsMap::iterator aEnd = m_aSections.end();
     258           0 :         for (;aIter != aEnd ; ++aIter)
     259             :         {
     260           0 :             OSectionWindow* pSectionWindow = (*aIter);
     261           0 :             impl_resizeSectionWindow(*pSectionWindow,aStartPoint,true);
     262             :         }
     263             :     }
     264           0 : }
     265             : 
     266           0 : void OViewsWindow::Paint(vcl::RenderContext& rRenderContext, const Rectangle& rRect)
     267             : {
     268           0 :     Window::Paint(rRenderContext, rRect);
     269             : 
     270           0 :     rRenderContext.SetBackground();
     271           0 :     rRenderContext.SetFillColor(Application::GetSettings().GetStyleSettings().GetDialogColor());
     272           0 :     rRenderContext.SetTextFillColor(Application::GetSettings().GetStyleSettings().GetDialogColor());
     273             : 
     274           0 :     Size aOut = rRenderContext.GetOutputSizePixel();
     275           0 :     Fraction aStartWidth(long(REPORT_STARTMARKER_WIDTH));
     276           0 :     aStartWidth *= rRenderContext.GetMapMode().GetScaleX();
     277             : 
     278           0 :     aOut.Width() -= long(aStartWidth);
     279           0 :     aOut = rRenderContext.PixelToLogic(aOut);
     280             : 
     281           0 :     Rectangle aRect(rRenderContext.PixelToLogic(Point(aStartWidth,0)), aOut);
     282           0 :     Wallpaper aWall(m_aColorConfig.GetColorValue(::svtools::APPBACKGROUND).nColor);
     283           0 :     rRenderContext.DrawWallpaper(aRect, aWall);
     284           0 : }
     285             : 
     286           0 : void OViewsWindow::ImplInitSettings()
     287             : {
     288           0 :     EnableChildTransparentMode(true);
     289           0 : }
     290             : 
     291           0 : void OViewsWindow::DataChanged( const DataChangedEvent& rDCEvt )
     292             : {
     293           0 :     Window::DataChanged( rDCEvt );
     294             : 
     295           0 :     if ( (rDCEvt.GetType() == DataChangedEventType::SETTINGS) &&
     296           0 :          (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) )
     297             :     {
     298           0 :         ImplInitSettings();
     299           0 :         Invalidate();
     300             :     }
     301           0 : }
     302             : 
     303           0 : void OViewsWindow::addSection(const uno::Reference< report::XSection >& _xSection,const OUString& _sColorEntry,sal_uInt16 _nPosition)
     304             : {
     305           0 :     VclPtrInstance<OSectionWindow> pSectionWindow(this,_xSection,_sColorEntry);
     306           0 :     m_aSections.insert(getIteratorAtPos(_nPosition) , TSectionsMap::value_type(pSectionWindow));
     307           0 :     m_pParent->setMarked(&pSectionWindow->getReportSection().getSectionView(),m_aSections.size() == 1);
     308           0 :     Resize();
     309           0 : }
     310             : 
     311           0 : void OViewsWindow::removeSection(sal_uInt16 _nPosition)
     312             : {
     313           0 :     if ( _nPosition < m_aSections.size() )
     314             :     {
     315           0 :         TSectionsMap::iterator aPos = getIteratorAtPos(_nPosition);
     316           0 :         TSectionsMap::iterator aNew = getIteratorAtPos(_nPosition == 0 ? _nPosition+1: _nPosition - 1);
     317             : 
     318           0 :         m_pParent->getReportView()->UpdatePropertyBrowserDelayed((*aNew)->getReportSection().getSectionView());
     319             : 
     320           0 :         aPos->disposeAndClear();;
     321           0 :         m_aSections.erase(aPos);
     322           0 :         Resize();
     323             :     }
     324           0 : }
     325             : 
     326           0 : void OViewsWindow::toggleGrid(bool _bVisible)
     327             : {
     328             :     ::std::for_each(m_aSections.begin(),m_aSections.end(),
     329           0 :         ::o3tl::compose1(::boost::bind(&OReportSection::SetGridVisible,_1,_bVisible),TReportPairHelper()));
     330             :     ::std::for_each(m_aSections.begin(),m_aSections.end(),
     331           0 :         ::o3tl::compose1(::boost::bind(&OReportSection::Window::Invalidate,_1,InvalidateFlags::NoErase),TReportPairHelper()));
     332           0 : }
     333             : 
     334           0 : sal_Int32 OViewsWindow::getTotalHeight() const
     335             : {
     336           0 :     sal_Int32 nHeight = 0;
     337           0 :     TSectionsMap::const_iterator aIter = m_aSections.begin();
     338           0 :     TSectionsMap::const_iterator aEnd = m_aSections.end();
     339           0 :     for (;aIter != aEnd ; ++aIter)
     340             :     {
     341           0 :         nHeight += (*aIter)->GetSizePixel().Height();
     342             :     }
     343           0 :     return nHeight;
     344             : }
     345             : 
     346           0 : sal_uInt16 OViewsWindow::getSectionCount() const
     347             : {
     348           0 :     return static_cast<sal_uInt16>(m_aSections.size());
     349             : }
     350             : 
     351           0 : void OViewsWindow::SetInsertObj( sal_uInt16 eObj,const OUString& _sShapeType )
     352             : {
     353           0 :     TSectionsMap::iterator aIter = m_aSections.begin();
     354           0 :     TSectionsMap::iterator aEnd = m_aSections.end();
     355           0 :     for (;aIter != aEnd ; ++aIter)
     356           0 :         (*aIter)->getReportSection().getSectionView().SetCurrentObj( eObj, ReportInventor );
     357             : 
     358           0 :     m_sShapeType = _sShapeType;
     359           0 : }
     360             : 
     361             : 
     362             : 
     363           0 : void OViewsWindow::SetMode( DlgEdMode eNewMode )
     364             : {
     365             :     ::std::for_each(m_aSections.begin(),m_aSections.end(),
     366           0 :         ::o3tl::compose1(::boost::bind(&OReportSection::SetMode,_1,eNewMode),TReportPairHelper()));
     367           0 : }
     368             : 
     369           0 : bool OViewsWindow::HasSelection() const
     370             : {
     371           0 :     TSectionsMap::const_iterator aIter = m_aSections.begin();
     372           0 :     TSectionsMap::const_iterator aEnd = m_aSections.end();
     373           0 :     for (;aIter != aEnd && !(*aIter)->getReportSection().getSectionView().AreObjectsMarked(); ++aIter)
     374             :         ;
     375           0 :     return aIter != aEnd;
     376             : }
     377             : 
     378           0 : void OViewsWindow::Delete()
     379             : {
     380           0 :     m_bInUnmark = true;
     381             :     ::std::for_each(m_aSections.begin(),m_aSections.end(),
     382           0 :         ::o3tl::compose1(::boost::mem_fn(&OReportSection::Delete),TReportPairHelper()));
     383           0 :     m_bInUnmark = false;
     384           0 : }
     385             : 
     386           0 : void OViewsWindow::Copy()
     387             : {
     388           0 :     uno::Sequence< beans::NamedValue > aAllreadyCopiedObjects;
     389             :     ::std::for_each(m_aSections.begin(),m_aSections.end(),
     390           0 :         ::o3tl::compose1(::boost::bind(&OReportSection::Copy,_1,::boost::ref(aAllreadyCopiedObjects)),TReportPairHelper()));
     391             : 
     392           0 :     OReportExchange* pCopy = new OReportExchange(aAllreadyCopiedObjects);
     393           0 :     uno::Reference< datatransfer::XTransferable> aEnsureDelete = pCopy;
     394           0 :     pCopy->CopyToClipboard(this);
     395           0 : }
     396             : 
     397           0 : void OViewsWindow::Paste()
     398             : {
     399           0 :     TransferableDataHelper aTransferData(TransferableDataHelper::CreateFromSystemClipboard(this));
     400           0 :     OReportExchange::TSectionElements aCopies = OReportExchange::extractCopies(aTransferData);
     401           0 :     if ( aCopies.getLength() > 1 )
     402             :         ::std::for_each(m_aSections.begin(),m_aSections.end(),
     403           0 :             ::o3tl::compose1(::boost::bind(&OReportSection::Paste,_1,aCopies,false),TReportPairHelper()));
     404             :     else
     405             :     {
     406           0 :         OSectionWindow*  pMarkedSection = getMarkedSection();
     407           0 :         if ( pMarkedSection )
     408           0 :             pMarkedSection->getReportSection().Paste(aCopies,true);
     409           0 :     }
     410           0 : }
     411             : 
     412           0 : OSectionWindow* OViewsWindow::getSectionWindow(const uno::Reference< report::XSection>& _xSection) const
     413             : {
     414             :     OSL_ENSURE(_xSection.is(),"Section is NULL!");
     415             : 
     416           0 :     OSectionWindow* pSectionWindow = NULL;
     417           0 :     TSectionsMap::const_iterator aIter = m_aSections.begin();
     418           0 :     TSectionsMap::const_iterator aEnd = m_aSections.end();
     419           0 :     for (; aIter != aEnd ; ++aIter)
     420             :     {
     421           0 :         if ((*aIter)->getReportSection().getSection() == _xSection)
     422             :         {
     423           0 :             pSectionWindow = (*aIter);
     424           0 :             break;
     425             :         }
     426             :     }
     427             : 
     428           0 :     return pSectionWindow;
     429             : }
     430             : 
     431             : 
     432           0 : OSectionWindow* OViewsWindow::getMarkedSection(NearSectionAccess nsa) const
     433             : {
     434           0 :     OSectionWindow* pRet = NULL;
     435           0 :     TSectionsMap::const_iterator aIter = m_aSections.begin();
     436           0 :     TSectionsMap::const_iterator aEnd = m_aSections.end();
     437           0 :     sal_uInt32 nCurrentPosition = 0;
     438           0 :     for (; aIter != aEnd ; ++aIter)
     439             :     {
     440           0 :         if ( (*aIter)->getStartMarker().isMarked() )
     441             :         {
     442           0 :             if (nsa == CURRENT)
     443             :             {
     444           0 :                 pRet = (*aIter);
     445           0 :                 break;
     446             :             }
     447           0 :             else if ( nsa == PREVIOUS )
     448             :             {
     449           0 :                 if (nCurrentPosition > 0)
     450             :                 {
     451           0 :                     pRet = (*(--aIter));
     452           0 :                     if (pRet == 0)
     453             :                     {
     454           0 :                         pRet = (*m_aSections.begin());
     455             :                     }
     456             :                 }
     457             :                 else
     458             :                 {
     459             :                     // if we are out of bounds return the first one
     460           0 :                     pRet = (*m_aSections.begin());
     461             :                 }
     462           0 :                 break;
     463             :             }
     464           0 :             else if ( nsa == POST )
     465             :             {
     466           0 :                 sal_uInt32 nSize = m_aSections.size();
     467           0 :                 if ((nCurrentPosition + 1) < nSize)
     468             :                 {
     469           0 :                     pRet = *(++aIter);
     470           0 :                     if (pRet == 0)
     471             :                     {
     472           0 :                         pRet = (*(--aEnd));
     473             :                     }
     474             :                 }
     475             :                 else
     476             :                 {
     477             :                     // if we are out of bounds return the last one
     478           0 :                     pRet = (*(--aEnd));
     479             :                 }
     480           0 :                 break;
     481             :             }
     482             :         }
     483           0 :         ++nCurrentPosition;
     484             :     }
     485             : 
     486           0 :     return pRet;
     487             : }
     488             : 
     489           0 : void OViewsWindow::markSection(const sal_uInt16 _nPos)
     490             : {
     491           0 :     if ( _nPos < m_aSections.size() )
     492           0 :         m_pParent->setMarked(m_aSections[_nPos]->getReportSection().getSection(),true);
     493           0 : }
     494             : 
     495           0 : bool OViewsWindow::IsPasteAllowed() const
     496             : {
     497           0 :     TransferableDataHelper aTransferData( TransferableDataHelper::CreateFromSystemClipboard( const_cast< OViewsWindow* >( this ) ) );
     498           0 :     return aTransferData.HasFormat(OReportExchange::getDescriptorFormatId());
     499             : }
     500             : 
     501           0 : void OViewsWindow::SelectAll(const sal_uInt16 _nObjectType)
     502             : {
     503           0 :     m_bInUnmark = true;
     504             :     ::std::for_each(m_aSections.begin(),m_aSections.end(),
     505           0 :         ::o3tl::compose1(::boost::bind(::boost::mem_fn(&OReportSection::SelectAll),_1,_nObjectType),TReportPairHelper()));
     506           0 :     m_bInUnmark = false;
     507           0 : }
     508             : 
     509           0 : void OViewsWindow::unmarkAllObjects(OSectionView* _pSectionView)
     510             : {
     511           0 :     if ( !m_bInUnmark )
     512             :     {
     513           0 :         m_bInUnmark = true;
     514           0 :         TSectionsMap::iterator aIter = m_aSections.begin();
     515           0 :         TSectionsMap::iterator aEnd = m_aSections.end();
     516           0 :         for (; aIter != aEnd ; ++aIter)
     517             :         {
     518           0 :             if ( &(*aIter)->getReportSection().getSectionView() != _pSectionView )
     519             :             {
     520           0 :                 (*aIter)->getReportSection().deactivateOle();
     521           0 :                 (*aIter)->getReportSection().getSectionView().UnmarkAllObj();
     522             :             }
     523             :         }
     524           0 :         m_bInUnmark = false;
     525             :     }
     526           0 : }
     527             : 
     528           0 : void OViewsWindow::ConfigurationChanged( utl::ConfigurationBroadcaster*, sal_uInt32)
     529             : {
     530           0 :     ImplInitSettings();
     531           0 :     Invalidate();
     532           0 : }
     533             : 
     534           0 : void OViewsWindow::MouseButtonDown( const MouseEvent& rMEvt )
     535             : {
     536           0 :     if ( rMEvt.IsLeft() )
     537             :     {
     538           0 :         GrabFocus();
     539           0 :         const uno::Sequence< beans::PropertyValue> aArgs;
     540           0 :         getView()->getReportView()->getController().executeChecked(SID_SELECT_REPORT,aArgs);
     541             :     }
     542           0 :     Window::MouseButtonDown(rMEvt);
     543           0 : }
     544             : 
     545           0 : void OViewsWindow::showRuler(bool _bShow)
     546             : {
     547             :     ::std::for_each(m_aSections.begin(),m_aSections.end(),
     548           0 :         ::o3tl::compose1(::boost::bind(&OStartMarker::showRuler,_1,_bShow),TStartMarkerHelper()));
     549             :     ::std::for_each(m_aSections.begin(),m_aSections.end(),
     550           0 :         ::o3tl::compose1(::boost::bind(&OStartMarker::Window::Invalidate, _1, InvalidateFlags::NoErase), TStartMarkerHelper()));
     551           0 : }
     552             : 
     553           0 : void OViewsWindow::MouseButtonUp( const MouseEvent& rMEvt )
     554             : {
     555           0 :     if ( rMEvt.IsLeft() )
     556             :     {
     557           0 :         TSectionsMap::iterator aIter = m_aSections.begin();
     558           0 :         TSectionsMap::iterator aEnd = m_aSections.end();
     559           0 :         for (;aIter != aEnd ; ++aIter)
     560             :         {
     561           0 :             if ( (*aIter)->getReportSection().getSectionView().AreObjectsMarked() )
     562             :             {
     563           0 :                 (*aIter)->getReportSection().MouseButtonUp(rMEvt);
     564           0 :                 break;
     565             :             }
     566             :         }
     567             : 
     568             :         // remove special insert mode
     569           0 :         for (aIter = m_aSections.begin();aIter != aEnd ; ++aIter)
     570             :         {
     571           0 :             (*aIter)->getReportSection().getPage()->resetSpecialMode();
     572             :         }
     573             :     }
     574           0 : }
     575             : 
     576           0 : bool OViewsWindow::handleKeyEvent(const KeyEvent& _rEvent)
     577             : {
     578           0 :     bool bRet = false;
     579           0 :     TSectionsMap::iterator aIter = m_aSections.begin();
     580           0 :     TSectionsMap::iterator aEnd = m_aSections.end();
     581           0 :     for (;aIter != aEnd ; ++aIter)
     582             :     {
     583           0 :         if ( (*aIter)->getStartMarker().isMarked() )
     584             :         {
     585           0 :             bRet = (*aIter)->getReportSection().handleKeyEvent(_rEvent);
     586             :         }
     587             :     }
     588           0 :     return bRet;
     589             : }
     590             : 
     591           0 : OViewsWindow::TSectionsMap::iterator OViewsWindow::getIteratorAtPos(sal_uInt16 _nPos)
     592             : {
     593           0 :     TSectionsMap::iterator aRet = m_aSections.end();
     594           0 :     if ( _nPos < m_aSections.size() )
     595           0 :         aRet = m_aSections.begin() + _nPos;
     596           0 :     return aRet;
     597             : }
     598             : 
     599           0 : void OViewsWindow::setMarked(OSectionView* _pSectionView, bool _bMark)
     600             : {
     601             :     OSL_ENSURE(_pSectionView != NULL,"SectionView is NULL!");
     602           0 :     if ( _pSectionView )
     603           0 :         setMarked(_pSectionView->getReportSection()->getSection(),_bMark);
     604           0 : }
     605             : 
     606           0 : void OViewsWindow::setMarked(const uno::Reference< report::XSection>& _xSection, bool _bMark)
     607             : {
     608           0 :     TSectionsMap::iterator aIter = m_aSections.begin();
     609           0 :     TSectionsMap::iterator aEnd = m_aSections.end();
     610           0 :     for (; aIter != aEnd ; ++aIter)
     611             :     {
     612           0 :         if ( (*aIter)->getReportSection().getSection() != _xSection )
     613             :         {
     614           0 :             (*aIter)->setMarked(false);
     615             :         }
     616           0 :         else if ( (*aIter)->getStartMarker().isMarked() != _bMark )
     617             :         {
     618           0 :             (*aIter)->setMarked(_bMark);
     619             :         }
     620             :     }
     621           0 : }
     622             : 
     623           0 : void OViewsWindow::setMarked(const uno::Sequence< uno::Reference< report::XReportComponent> >& _aShapes, bool _bMark)
     624             : {
     625           0 :     bool bFirst = true;
     626           0 :     const uno::Reference< report::XReportComponent>* pIter = _aShapes.getConstArray();
     627           0 :     const uno::Reference< report::XReportComponent>* pEnd  = pIter + _aShapes.getLength();
     628           0 :     for(;pIter != pEnd;++pIter)
     629             :     {
     630           0 :         const uno::Reference< report::XSection> xSection = (*pIter)->getSection();
     631           0 :         if ( xSection.is() )
     632             :         {
     633           0 :             if ( bFirst )
     634             :             {
     635           0 :                 bFirst = false;
     636           0 :                 m_pParent->setMarked(xSection,_bMark);
     637             :             }
     638           0 :             OSectionWindow* pSectionWindow = getSectionWindow(xSection);
     639           0 :             if ( pSectionWindow )
     640             :             {
     641           0 :                 SvxShape* pShape = SvxShape::getImplementation( *pIter );
     642           0 :                 SdrObject* pObject = pShape ? pShape->GetSdrObject() : NULL;
     643             :                 OSL_ENSURE( pObject, "OViewsWindow::setMarked: no SdrObject for the shape!" );
     644           0 :                 if ( pObject )
     645           0 :                     pSectionWindow->getReportSection().getSectionView().MarkObj( pObject, pSectionWindow->getReportSection().getSectionView().GetSdrPageView(), !_bMark );
     646             :             }
     647             :         }
     648           0 :     }
     649           0 : }
     650             : 
     651           0 : void OViewsWindow::collectRectangles(TRectangleMap& _rSortRectangles,  bool _bBoundRects)
     652             : {
     653           0 :     TSectionsMap::iterator aIter = m_aSections.begin();
     654           0 :     TSectionsMap::iterator aEnd = m_aSections.end();
     655           0 :     for (aIter = m_aSections.begin();aIter != aEnd ; ++aIter)
     656             :     {
     657           0 :         OSectionView& rView = (*aIter)->getReportSection().getSectionView();
     658           0 :         if ( rView.AreObjectsMarked() )
     659             :         {
     660           0 :             rView.SortMarkedObjects();
     661           0 :             const size_t nCount = rView.GetMarkedObjectCount();
     662           0 :             for (size_t i=0; i < nCount; ++i)
     663             :             {
     664           0 :                 const SdrMark* pM = rView.GetSdrMarkByIndex(i);
     665           0 :                 SdrObject* pObj = pM->GetMarkedSdrObj();
     666           0 :                 Rectangle aObjRect(_bBoundRects ? pObj->GetCurrentBoundRect() : pObj->GetSnapRect());
     667           0 :                 _rSortRectangles.insert(TRectangleMap::value_type(aObjRect,TRectangleMap::mapped_type(pObj,&rView)));
     668             :             }
     669             :         }
     670             :     }
     671           0 : }
     672             : 
     673           0 : void OViewsWindow::collectBoundResizeRect(const TRectangleMap& _rSortRectangles,sal_Int32 _nControlModification,bool _bAlignAtSection, bool _bBoundRects,Rectangle& _rBound,Rectangle& _rResize)
     674             : {
     675           0 :     bool bOnlyOnce = false;
     676           0 :     TRectangleMap::const_iterator aRectIter = _rSortRectangles.begin();
     677           0 :     TRectangleMap::const_iterator aRectEnd = _rSortRectangles.end();
     678           0 :     for (;aRectIter != aRectEnd ; ++aRectIter)
     679             :     {
     680           0 :         Rectangle aObjRect = aRectIter->first;
     681           0 :         if ( _rResize.IsEmpty() )
     682           0 :             _rResize = aObjRect;
     683           0 :         switch(_nControlModification)
     684             :         {
     685             :             case ControlModification::WIDTH_SMALLEST:
     686           0 :                 if ( _rResize.getWidth() > aObjRect.getWidth() )
     687           0 :                     _rResize = aObjRect;
     688           0 :                 break;
     689             :             case ControlModification::HEIGHT_SMALLEST:
     690           0 :                 if ( _rResize.getHeight() > aObjRect.getHeight() )
     691           0 :                     _rResize = aObjRect;
     692           0 :                 break;
     693             :             case ControlModification::WIDTH_GREATEST:
     694           0 :                 if ( _rResize.getWidth() < aObjRect.getWidth() )
     695           0 :                     _rResize = aObjRect;
     696           0 :                 break;
     697             :             case ControlModification::HEIGHT_GREATEST:
     698           0 :                 if ( _rResize.getHeight() < aObjRect.getHeight() )
     699           0 :                     _rResize = aObjRect;
     700           0 :                 break;
     701             :         }
     702             : 
     703           0 :         SdrObjTransformInfoRec aInfo;
     704           0 :         const SdrObject* pObj =  aRectIter->second.first;
     705           0 :         pObj->TakeObjInfo(aInfo);
     706           0 :         bool bHasFixed = !aInfo.bMoveAllowed || pObj->IsMoveProtect();
     707           0 :         if ( bHasFixed )
     708           0 :             _rBound.Union(aObjRect);
     709             :         else
     710             :         {
     711           0 :             if ( _bAlignAtSection || _rSortRectangles.size() == 1 )
     712             :             { // einzelnes Obj an der Seite ausrichten
     713           0 :                 if ( ! bOnlyOnce )
     714             :                 {
     715           0 :                     bOnlyOnce = true;
     716           0 :                     OReportSection* pReportSection = aRectIter->second.second->getReportSection();
     717           0 :                     const uno::Reference< report::XSection> xSection = pReportSection->getSection();
     718             :                     try
     719             :                     {
     720           0 :                         uno::Reference<report::XReportDefinition> xReportDefinition = xSection->getReportDefinition();
     721           0 :                         _rBound.Union(Rectangle(getStyleProperty<sal_Int32>(xReportDefinition,PROPERTY_LEFTMARGIN),0,
     722           0 :                                             getStyleProperty<awt::Size>(xReportDefinition,PROPERTY_PAPERSIZE).Width  - getStyleProperty<sal_Int32>(xReportDefinition,PROPERTY_RIGHTMARGIN),
     723           0 :                                             xSection->getHeight()));
     724             :                     }
     725           0 :                     catch(const uno::Exception &){}
     726             :                 }
     727             :             }
     728             :             else
     729             :             {
     730           0 :                 if (_bBoundRects)
     731           0 :                     _rBound.Union(aRectIter->second.second->GetMarkedObjBoundRect());
     732             :                 else
     733           0 :                     _rBound.Union(aRectIter->second.second->GetMarkedObjRect());
     734             :             }
     735             :         }
     736             :     }
     737           0 : }
     738             : 
     739           0 : void OViewsWindow::alignMarkedObjects(sal_Int32 _nControlModification,bool _bAlignAtSection, bool _bBoundRects)
     740             : {
     741           0 :     if ( _nControlModification == ControlModification::NONE )
     742           0 :         return;
     743             : 
     744           0 :     Point aRefPoint;
     745           0 :     RectangleLess::CompareMode eCompareMode = RectangleLess::POS_LEFT;
     746           0 :     switch (_nControlModification)
     747             :     {
     748           0 :         case ControlModification::TOP   : eCompareMode = RectangleLess::POS_UPPER; break;
     749           0 :         case ControlModification::BOTTOM: eCompareMode = RectangleLess::POS_DOWN; break;
     750           0 :         case ControlModification::LEFT  : eCompareMode = RectangleLess::POS_LEFT; break;
     751           0 :         case ControlModification::RIGHT : eCompareMode = RectangleLess::POS_RIGHT; break;
     752             :         case ControlModification::CENTER_HORIZONTAL :
     753             :         case ControlModification::CENTER_VERTICAL :
     754             :             {
     755           0 :                 eCompareMode = (ControlModification::CENTER_VERTICAL == _nControlModification) ?  RectangleLess::POS_CENTER_VERTICAL :  RectangleLess::POS_CENTER_HORIZONTAL;
     756           0 :                 uno::Reference<report::XSection> xSection = (*m_aSections.begin())->getReportSection().getSection();
     757           0 :                 uno::Reference<report::XReportDefinition> xReportDefinition = xSection->getReportDefinition();
     758           0 :                 aRefPoint = Rectangle(getStyleProperty<sal_Int32>(xReportDefinition,PROPERTY_LEFTMARGIN),0,
     759           0 :                                         getStyleProperty<awt::Size>(xReportDefinition,PROPERTY_PAPERSIZE).Width  - getStyleProperty<sal_Int32>(xReportDefinition,PROPERTY_RIGHTMARGIN),
     760           0 :                                         xSection->getHeight()).Center();
     761             :             }
     762           0 :             break;
     763           0 :         default: break;
     764             :     }
     765           0 :     RectangleLess aCompare(eCompareMode,aRefPoint);
     766           0 :     TRectangleMap aSortRectangles(aCompare);
     767           0 :     collectRectangles(aSortRectangles,_bBoundRects);
     768             : 
     769           0 :     Rectangle aBound;
     770           0 :     Rectangle aResize;
     771           0 :     collectBoundResizeRect(aSortRectangles,_nControlModification,_bAlignAtSection,_bBoundRects,aBound,aResize);
     772             : 
     773           0 :     bool bMove = true;
     774             : 
     775           0 :     ::std::mem_fun_t<long&,Rectangle> aGetFun       = ::std::mem_fun<long&,Rectangle>(&Rectangle::Bottom);
     776           0 :     ::std::mem_fun_t<long&,Rectangle> aRefFun       = ::std::mem_fun<long&,Rectangle>(&Rectangle::Top);
     777           0 :     TRectangleMap::iterator aRectIter = aSortRectangles.begin();
     778           0 :     TRectangleMap::iterator aRectEnd = aSortRectangles.end();
     779           0 :     for (;aRectIter != aRectEnd ; ++aRectIter)
     780             :     {
     781           0 :         Rectangle aObjRect = aRectIter->first;
     782           0 :         SdrObject* pObj = aRectIter->second.first;
     783           0 :         SdrView* pView = aRectIter->second.second;
     784           0 :         Point aCenter(aBound.Center());
     785           0 :         SdrObjTransformInfoRec aInfo;
     786           0 :         pObj->TakeObjInfo(aInfo);
     787           0 :         if (aInfo.bMoveAllowed && !pObj->IsMoveProtect())
     788             :         {
     789           0 :             long nXMov = 0;
     790           0 :             long nYMov = 0;
     791           0 :             long* pValue = &nXMov;
     792           0 :             switch(_nControlModification)
     793             :             {
     794             :                 case ControlModification::TOP   :
     795           0 :                     aGetFun  = ::std::mem_fun<long&,Rectangle>(&Rectangle::Top);
     796           0 :                     aRefFun  = ::std::mem_fun<long&,Rectangle>(&Rectangle::Bottom);
     797           0 :                     pValue = &nYMov;
     798           0 :                     break;
     799             :                 case ControlModification::BOTTOM:
     800             :                     // defaults are already set
     801           0 :                     pValue = &nYMov;
     802           0 :                     break;
     803             :                 case ControlModification::CENTER_VERTICAL:
     804           0 :                     nYMov = aCenter.Y() - aObjRect.Center().Y();
     805           0 :                     pValue = &nYMov;
     806           0 :                     bMove = false;
     807           0 :                     break;
     808             :                 case ControlModification::RIGHT :
     809           0 :                     aGetFun  = ::std::mem_fun<long&,Rectangle>(&Rectangle::Right);
     810           0 :                     aRefFun  = ::std::mem_fun<long&,Rectangle>(&Rectangle::Left);
     811           0 :                     break;
     812             :                 case ControlModification::CENTER_HORIZONTAL:
     813           0 :                     nXMov = aCenter.X() - aObjRect.Center().X();
     814           0 :                     bMove = false;
     815           0 :                     break;
     816             :                 case ControlModification::LEFT  :
     817           0 :                     aGetFun  = ::std::mem_fun<long&,Rectangle>(&Rectangle::Left);
     818           0 :                     aRefFun  = ::std::mem_fun<long&,Rectangle>(&Rectangle::Right);
     819           0 :                     break;
     820             :                 default:
     821           0 :                     bMove = false;
     822           0 :                     break;
     823             :             }
     824           0 :             if ( bMove )
     825             :             {
     826           0 :                 Rectangle aTest = aObjRect;
     827           0 :                 aGetFun(&aTest) = aGetFun(&aBound);
     828           0 :                 TRectangleMap::iterator aInterSectRectIter = aSortRectangles.begin();
     829           0 :                 for (; aInterSectRectIter != aRectIter; ++aInterSectRectIter)
     830             :                 {
     831           0 :                     if ( pView == aInterSectRectIter->second.second && (dynamic_cast<OUnoObject*>(aInterSectRectIter->second.first) || dynamic_cast<OOle2Obj*>(aInterSectRectIter->second.first)))
     832             :                     {
     833           0 :                         SdrObject* pPreviousObj = aInterSectRectIter->second.first;
     834           0 :                         Rectangle aIntersectRect = aTest.GetIntersection(_bBoundRects ? pPreviousObj->GetCurrentBoundRect() : pPreviousObj->GetSnapRect());
     835           0 :                         if ( !aIntersectRect.IsEmpty() && (aIntersectRect.Left() != aIntersectRect.Right() && aIntersectRect.Top() != aIntersectRect.Bottom() ) )
     836             :                         {
     837           0 :                             *pValue = aRefFun(&aIntersectRect) - aGetFun(&aObjRect);
     838           0 :                             break;
     839             :                         }
     840             :                     }
     841             :                 }
     842           0 :                 if ( aInterSectRectIter == aRectIter )
     843           0 :                     *pValue = aGetFun(&aBound) - aGetFun(&aObjRect);
     844             :             }
     845             : 
     846           0 :             if ( lcl_getNewRectSize(aObjRect,nXMov,nYMov,pObj,pView,_nControlModification,_bBoundRects) )
     847             :             {
     848           0 :                 const Size aSize(nXMov,nYMov);
     849           0 :                 pView->AddUndo(pView->GetModel()->GetSdrUndoFactory().CreateUndoMoveObject(*pObj,aSize));
     850           0 :                 pObj->Move(aSize);
     851           0 :                 aObjRect = (_bBoundRects ? pObj->GetCurrentBoundRect() : pObj->GetSnapRect());
     852             :             }
     853             : 
     854             :             // resizing control
     855           0 :             if ( !aResize.IsEmpty() && aObjRect != aResize )
     856             :             {
     857           0 :                 nXMov = aResize.getWidth();
     858           0 :                 nYMov = aResize.getHeight();
     859           0 :                 switch(_nControlModification)
     860             :                 {
     861             :                     case ControlModification::WIDTH_GREATEST:
     862             :                     case ControlModification::HEIGHT_GREATEST:
     863           0 :                         if ( _nControlModification == ControlModification::HEIGHT_GREATEST )
     864           0 :                             nXMov = aObjRect.getWidth();
     865           0 :                         else if ( _nControlModification == ControlModification::WIDTH_GREATEST )
     866           0 :                             nYMov = aObjRect.getHeight();
     867           0 :                         lcl_getNewRectSize(aObjRect,nXMov,nYMov,pObj,pView,_nControlModification,_bBoundRects);
     868             :                         // run through
     869             :                     case ControlModification::WIDTH_SMALLEST:
     870             :                     case ControlModification::HEIGHT_SMALLEST:
     871           0 :                         pView->AddUndo( pView->GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*pObj));
     872             :                         {
     873           0 :                             OObjectBase* pObjBase = dynamic_cast<OObjectBase*>(pObj);
     874             :                             OSL_ENSURE(pObjBase,"Where comes this object from?");
     875           0 :                             if ( pObjBase )
     876             :                             {
     877           0 :                                 if ( _nControlModification == ControlModification::WIDTH_SMALLEST || _nControlModification == ControlModification::WIDTH_GREATEST )
     878           0 :                                     pObjBase->getReportComponent()->setSize(awt::Size(nXMov,aObjRect.getHeight()));
     879           0 :                                 else if ( _nControlModification == ControlModification::HEIGHT_GREATEST || _nControlModification == ControlModification::HEIGHT_SMALLEST )
     880           0 :                                     pObjBase->getReportComponent()->setSize(awt::Size(aObjRect.getWidth(),nYMov));
     881             :                             }
     882             :                         }
     883           0 :                         break;
     884             :                     default:
     885           0 :                         break;
     886             :                 }
     887             :             }
     888             :         }
     889           0 :         pView->AdjustMarkHdl();
     890           0 :     }
     891             : }
     892             : 
     893           0 : void OViewsWindow::createDefault()
     894             : {
     895           0 :     OSectionWindow* pMarkedSection = getMarkedSection();
     896           0 :     if ( pMarkedSection )
     897           0 :         pMarkedSection->getReportSection().createDefault(m_sShapeType);
     898           0 : }
     899             : 
     900           0 : void OViewsWindow::setGridSnap(bool bOn)
     901             : {
     902           0 :     TSectionsMap::iterator aIter = m_aSections.begin();
     903           0 :     TSectionsMap::iterator aEnd = m_aSections.end();
     904           0 :     for (; aIter != aEnd ; ++aIter)
     905             :     {
     906           0 :         (*aIter)->getReportSection().getSectionView().SetGridSnap(bOn);
     907           0 :         (*aIter)->getReportSection().Invalidate(InvalidateFlags::NONE);
     908             :     }
     909           0 : }
     910             : 
     911           0 : void OViewsWindow::setDragStripes(bool bOn)
     912             : {
     913           0 :     TSectionsMap::iterator aIter = m_aSections.begin();
     914           0 :     TSectionsMap::iterator aEnd = m_aSections.end();
     915           0 :     for (; aIter != aEnd ; ++aIter)
     916           0 :         (*aIter)->getReportSection().getSectionView().SetDragStripes(bOn);
     917           0 : }
     918             : 
     919           0 : sal_uInt16 OViewsWindow::getPosition(const OSectionWindow* _pSectionWindow) const
     920             : {
     921           0 :     TSectionsMap::const_iterator aIter = m_aSections.begin();
     922           0 :     TSectionsMap::const_iterator aEnd = m_aSections.end();
     923           0 :     sal_uInt16 nPosition = 0;
     924           0 :     for (; aIter != aEnd ; ++aIter)
     925             :     {
     926           0 :         if ( _pSectionWindow == (*aIter).get() )
     927             :         {
     928           0 :             break;
     929             :         }
     930           0 :         ++nPosition;
     931             :     }
     932           0 :     return nPosition;
     933             : }
     934             : 
     935           0 : OSectionWindow* OViewsWindow::getSectionWindow(const sal_uInt16 _nPos) const
     936             : {
     937           0 :     OSectionWindow* aReturn = NULL;
     938             : 
     939           0 :     if ( _nPos < m_aSections.size() )
     940           0 :         aReturn = m_aSections[_nPos];
     941             : 
     942           0 :     return aReturn;
     943             : }
     944             : 
     945             : namespace
     946             : {
     947             :     enum SectionViewAction
     948             :     {
     949             :         eEndDragObj,
     950             :         eEndAction,
     951             :         eForceToAnotherPage,
     952             :         eBreakAction
     953             :     };
     954             :     class ApplySectionViewAction : public ::std::unary_function< OViewsWindow::TSectionsMap::value_type, void >
     955             :     {
     956             :     private:
     957             :         SectionViewAction   m_eAction;
     958             :         bool                m_bCopy;
     959             : 
     960             :     public:
     961           0 :         ApplySectionViewAction(bool _bCopy)
     962             :             : m_eAction(eEndDragObj)
     963           0 :             , m_bCopy(_bCopy)
     964             :         {
     965           0 :         }
     966             : 
     967           0 :         ApplySectionViewAction(SectionViewAction _eAction = eEndAction)
     968             :             : m_eAction(_eAction)
     969           0 :             , m_bCopy(false)
     970             :         {
     971           0 :         }
     972             : 
     973           0 :         void operator() ( const OViewsWindow::TSectionsMap::value_type& _rhs )
     974             :         {
     975           0 :             OSectionView& rView( _rhs->getReportSection().getSectionView() );
     976           0 :             switch ( m_eAction )
     977             :             {
     978             :             case eEndDragObj:
     979           0 :                 rView.EndDragObj( m_bCopy  );
     980           0 :                 break;
     981             :             case eEndAction:
     982           0 :                 if ( rView.IsAction() )
     983           0 :                     rView.EndAction (      );
     984           0 :                 break;
     985             :             case eForceToAnotherPage:
     986           0 :                 rView.ForceMarkedToAnotherPage();
     987           0 :                 break;
     988             :             case eBreakAction:
     989           0 :                 if ( rView.IsAction() )
     990           0 :                     rView.BrkAction (      );
     991           0 :                 break;
     992             :                 // default:
     993             : 
     994             :             }
     995           0 :         }
     996             :     };
     997             : }
     998             : 
     999           0 : void OViewsWindow::BrkAction()
    1000             : {
    1001           0 :     EndDragObj_removeInvisibleObjects();
    1002           0 :     ::std::for_each( m_aSections.begin(), m_aSections.end(), ApplySectionViewAction(eBreakAction) );
    1003           0 : }
    1004             : 
    1005           0 : void OViewsWindow::BegDragObj_createInvisibleObjectAtPosition(const Rectangle& _aRect, const OSectionView& _rSection)
    1006             : {
    1007           0 :     TSectionsMap::iterator aIter = m_aSections.begin();
    1008           0 :     TSectionsMap::iterator aEnd = m_aSections.end();
    1009           0 :     Point aNewPos(0,0);
    1010             : 
    1011           0 :     for (; aIter != aEnd; ++aIter)
    1012             :     {
    1013           0 :         OReportSection& rReportSection = (*aIter)->getReportSection();
    1014           0 :         rReportSection.getPage()->setSpecialMode();
    1015           0 :         OSectionView& rView = rReportSection.getSectionView();
    1016             : 
    1017           0 :         if ( &rView != &_rSection )
    1018             :         {
    1019           0 :             SdrObject *pNewObj = new SdrUnoObj(OUString("com.sun.star.form.component.FixedText"));
    1020           0 :             pNewObj->SetLogicRect(_aRect);
    1021             : 
    1022           0 :             pNewObj->Move(Size(0, aNewPos.Y()));
    1023           0 :             bool bChanged = rView.GetModel()->IsChanged();
    1024           0 :             rReportSection.getPage()->InsertObject(pNewObj);
    1025           0 :             rView.GetModel()->SetChanged(bChanged);
    1026           0 :             m_aBegDragTempList.push_back(pNewObj);
    1027             : 
    1028           0 :             rView.MarkObj( pNewObj, rView.GetSdrPageView() );
    1029             :         }
    1030           0 :         const long nSectionHeight = rReportSection.PixelToLogic(rReportSection.GetOutputSizePixel()).Height();
    1031           0 :         aNewPos.Y() -= nSectionHeight;
    1032             :     }
    1033           0 : }
    1034             : 
    1035           0 : bool OViewsWindow::isObjectInMyTempList(SdrObject *_pObj)
    1036             : {
    1037           0 :     return ::std::find(m_aBegDragTempList.begin(),m_aBegDragTempList.end(),_pObj) != m_aBegDragTempList.end();
    1038             : }
    1039             : 
    1040             : 
    1041           0 : void OViewsWindow::BegDragObj(const Point& _aPnt, SdrHdl* _pHdl,const OSectionView* _pSection)
    1042             : {
    1043             :     SAL_INFO(
    1044             :         "reportdesign", "Clickpoint X:" << _aPnt.X() << " Y:" << _aPnt.Y());
    1045             : 
    1046           0 :     m_aBegDragTempList.clear();
    1047             : 
    1048             :     // Calculate the absolute clickpoint in the views
    1049           0 :     Point aAbsolutePnt = _aPnt;
    1050           0 :     TSectionsMap::iterator aIter = m_aSections.begin();
    1051           0 :     TSectionsMap::iterator aEnd = m_aSections.end();
    1052           0 :     for (; aIter != aEnd; ++aIter)
    1053             :     {
    1054           0 :         OReportSection& rReportSection = (*aIter)->getReportSection();
    1055           0 :         OSectionView* pView = &rReportSection.getSectionView();
    1056           0 :         if (pView == _pSection)
    1057           0 :             break;
    1058           0 :         const long nSectionHeight = rReportSection.PixelToLogic(rReportSection.GetOutputSizePixel()).Height();
    1059           0 :         aAbsolutePnt.Y() +=  nSectionHeight;
    1060             :     }
    1061           0 :     m_aDragDelta = Point(SAL_MAX_INT32, SAL_MAX_INT32);
    1062             :     SAL_INFO(
    1063             :         "reportdesign",
    1064             :         "Absolute X:" << aAbsolutePnt.X() << " Y:" << aAbsolutePnt.Y());
    1065             : 
    1066             :     // Create drag lines over all viewable Views
    1067             :     // Therefore we need to identify the marked objects
    1068             :     // and create temporary objects on all other views at the same position
    1069             :     // relative to its occurrence.
    1070             : 
    1071             :     OSL_TRACE("BegDragObj createInvisible Objects" );
    1072           0 :     int nViewCount = 0;
    1073           0 :     Point aNewObjPos(0,0);
    1074           0 :     Point aLeftTop = Point(SAL_MAX_INT32, SAL_MAX_INT32);
    1075           0 :     for (aIter = m_aSections.begin(); aIter != aEnd; ++aIter)
    1076             :     {
    1077           0 :         OReportSection& rReportSection = (*aIter)->getReportSection();
    1078             : 
    1079           0 :         OSectionView& rView = rReportSection.getSectionView();
    1080             : 
    1081           0 :         if ( rView.AreObjectsMarked() )
    1082             :         {
    1083           0 :             const size_t nCount = rView.GetMarkedObjectCount();
    1084           0 :             for (size_t i=0; i < nCount; ++i)
    1085             :             {
    1086           0 :                 const SdrMark* pM = rView.GetSdrMarkByIndex(i);
    1087           0 :                 SdrObject* pObj = pM->GetMarkedSdrObj();
    1088           0 :                 if (!isObjectInMyTempList(pObj))
    1089             :                 {
    1090           0 :                     Rectangle aRect( pObj->GetCurrentBoundRect() );
    1091           0 :                     aRect.Move(0, aNewObjPos.Y());
    1092             : 
    1093           0 :                     aLeftTop.X() = ::std::min( aRect.Left(), aLeftTop.X() );
    1094           0 :                     aLeftTop.Y() = ::std::min( aRect.Top(), aLeftTop.Y() );
    1095             : 
    1096             :                     SAL_INFO(
    1097             :                         "reportdesign",
    1098             :                         "createInvisible X:" << aRect.Left() << " Y:"
    1099             :                             << aRect.Top() << " on View #" << nViewCount);
    1100             : 
    1101           0 :                     BegDragObj_createInvisibleObjectAtPosition(aRect, rView);
    1102             :                 }
    1103             :             }
    1104             :         }
    1105           0 :         ++nViewCount;
    1106           0 :         Rectangle aClipRect = rView.GetWorkArea();
    1107           0 :         aClipRect.Top() = -aNewObjPos.Y();
    1108           0 :         rView.SetWorkArea( aClipRect );
    1109             : 
    1110           0 :         const long nSectionHeight = rReportSection.PixelToLogic(rReportSection.GetOutputSizePixel()).Height();
    1111           0 :         aNewObjPos.Y() += nSectionHeight;
    1112             :     }
    1113             : 
    1114           0 :     const sal_Int32 nDeltaX = std::abs(aLeftTop.X() - aAbsolutePnt.X());
    1115           0 :     const sal_Int32 nDeltaY = std::abs(aLeftTop.Y() - aAbsolutePnt.Y());
    1116           0 :     m_aDragDelta.X() = nDeltaX;
    1117           0 :     m_aDragDelta.Y() = nDeltaY;
    1118             : 
    1119           0 :     Point aNewPos = aAbsolutePnt;
    1120             : 
    1121           0 :     const short nDrgLog = static_cast<short>(PixelToLogic(Size(3,0)).Width());
    1122           0 :     nViewCount = 0;
    1123           0 :     for (aIter = m_aSections.begin(); aIter != aEnd; ++aIter)
    1124             :     {
    1125           0 :         OReportSection& rReportSection = (*aIter)->getReportSection();
    1126             : 
    1127           0 :         SdrHdl* pHdl = _pHdl;
    1128           0 :         if ( pHdl )
    1129             :         {
    1130           0 :             if ( &rReportSection.getSectionView() != _pSection )
    1131             :             {
    1132           0 :                 const SdrHdlList& rHdlList = rReportSection.getSectionView().GetHdlList();
    1133           0 :                 pHdl = rHdlList.GetHdl(_pHdl->GetKind());
    1134             :             }
    1135             :         }
    1136             :         SAL_INFO(
    1137             :             "reportdesign",
    1138             :             "X:" << aNewPos.X() << " Y:" << aNewPos.Y() << " on View#"
    1139             :                 << nViewCount++);
    1140           0 :         rReportSection.getSectionView().BegDragObj(aNewPos, nullptr, pHdl, nDrgLog, NULL);
    1141             : 
    1142           0 :         const long nSectionHeight = rReportSection.PixelToLogic(rReportSection.GetOutputSizePixel()).Height();
    1143           0 :         aNewPos.Y() -= nSectionHeight;
    1144             :     }
    1145           0 : }
    1146             : 
    1147             : 
    1148           0 : void OViewsWindow::ForceMarkedToAnotherPage()
    1149             : {
    1150           0 :     ::std::for_each( m_aSections.begin(), m_aSections.end(), ApplySectionViewAction(eForceToAnotherPage ) );
    1151           0 : }
    1152             : 
    1153           0 : void OViewsWindow::BegMarkObj(const Point& _aPnt,const OSectionView* _pSection)
    1154             : {
    1155           0 :     bool bAdd = true;
    1156           0 :     Point aNewPos = _aPnt;
    1157             : 
    1158           0 :     TSectionsMap::iterator aIter = m_aSections.begin();
    1159           0 :     TSectionsMap::iterator aEnd = m_aSections.end();
    1160           0 :     long nLastSectionHeight = 0;
    1161           0 :     for (; aIter != aEnd; ++aIter)
    1162             :     {
    1163           0 :         OReportSection& rReportSection = (*aIter)->getReportSection();
    1164           0 :         if ( &rReportSection.getSectionView() == _pSection )
    1165             :         {
    1166           0 :             bAdd = false;
    1167           0 :             aNewPos = _aPnt; // 2,2
    1168             :         }
    1169           0 :         else if ( bAdd )
    1170             :         {
    1171           0 :             const long nSectionHeight = rReportSection.PixelToLogic(rReportSection.GetOutputSizePixel()).Height();
    1172           0 :             aNewPos.Y() += nSectionHeight;
    1173             :         }
    1174             :         else
    1175             :         {
    1176           0 :             aNewPos.Y() -= nLastSectionHeight;
    1177             :         }
    1178           0 :         rReportSection.getSectionView().BegMarkObj ( aNewPos );
    1179           0 :         nLastSectionHeight = rReportSection.PixelToLogic(rReportSection.GetOutputSizePixel()).Height();
    1180             :     }
    1181           0 : }
    1182             : 
    1183           0 : OSectionView* OViewsWindow::getSectionRelativeToPosition(const OSectionView* _pSection,Point& _rPnt)
    1184             : {
    1185           0 :     OSectionView* pSection = NULL;
    1186           0 :     sal_Int32 nCount = 0;
    1187           0 :     TSectionsMap::iterator aIter = m_aSections.begin();
    1188           0 :     const TSectionsMap::iterator aEnd = m_aSections.end();
    1189           0 :     for (; aIter != aEnd ; ++aIter,++nCount)
    1190             :     {
    1191           0 :         OReportSection& rReportSection = (*aIter)->getReportSection();
    1192           0 :         if ( &rReportSection.getSectionView() == _pSection)
    1193           0 :             break;
    1194             :     }
    1195             :     OSL_ENSURE(aIter != aEnd,"This can never happen!");
    1196           0 :     if ( _rPnt.Y() < 0 )
    1197             :     {
    1198           0 :         if ( nCount )
    1199           0 :             --aIter;
    1200           0 :         for (; nCount && (_rPnt.Y() < 0); --nCount)
    1201             :         {
    1202           0 :             OReportSection& rReportSection = (*aIter)->getReportSection();
    1203           0 :             const sal_Int32 nHeight = rReportSection.PixelToLogic(rReportSection.GetOutputSizePixel()).Height();
    1204           0 :             _rPnt.Y() += nHeight;
    1205           0 :             if ( (nCount -1) > 0 && (_rPnt.Y() < 0) )
    1206           0 :                 --aIter;
    1207             :         }
    1208           0 :         if ( nCount == 0 )
    1209           0 :             pSection = &(*m_aSections.begin())->getReportSection().getSectionView();
    1210             :         else
    1211           0 :             pSection = &(*aIter)->getReportSection().getSectionView();
    1212             :     }
    1213             :     else
    1214             :     {
    1215           0 :         for (; aIter != aEnd; ++aIter)
    1216             :         {
    1217           0 :             OReportSection& rReportSection = (*aIter)->getReportSection();
    1218           0 :             const long nHeight = rReportSection.PixelToLogic(rReportSection.GetOutputSizePixel()).Height();
    1219           0 :             if ( (_rPnt.Y() - nHeight) < 0  )
    1220           0 :                 break;
    1221           0 :             _rPnt.Y() -= nHeight;
    1222             :         }
    1223           0 :         if ( aIter != aEnd )
    1224           0 :             pSection = &(*aIter)->getReportSection().getSectionView();
    1225             :         else
    1226           0 :             pSection = &(*(aEnd-1))->getReportSection().getSectionView();
    1227             :     }
    1228             : 
    1229           0 :     return pSection;
    1230             : }
    1231             : 
    1232           0 : void OViewsWindow::EndDragObj_removeInvisibleObjects()
    1233             : {
    1234           0 :     TSectionsMap::iterator aIter = m_aSections.begin();
    1235           0 :     TSectionsMap::iterator aEnd = m_aSections.end();
    1236             : 
    1237           0 :     for (; aIter != aEnd; ++aIter)
    1238             :     {
    1239           0 :         OReportSection& rReportSection = (*aIter)->getReportSection();
    1240           0 :         rReportSection.getPage()->resetSpecialMode();
    1241             :     }
    1242           0 : }
    1243             : 
    1244           0 : void OViewsWindow::EndDragObj(bool _bControlKeyPressed, const OSectionView* _pSection, const Point& _aPnt)
    1245             : {
    1246           0 :     const OUString sUndoAction = ModuleRes(RID_STR_UNDO_CHANGEPOSITION);
    1247           0 :     const UndoContext aUndoContext( getView()->getReportView()->getController().getUndoManager(), sUndoAction );
    1248             : 
    1249           0 :     Point aNewPos = _aPnt;
    1250           0 :     OSectionView* pInSection = getSectionRelativeToPosition(_pSection, aNewPos);
    1251           0 :     if (!_bControlKeyPressed &&
    1252           0 :         _pSection && !_pSection->IsDragResize() && /* Not in resize mode */
    1253             :         _pSection != pInSection)
    1254             :     {
    1255           0 :         EndDragObj_removeInvisibleObjects();
    1256             : 
    1257             :         // we need to manipulate the current clickpoint, we subtract the old delta from BeginDrag
    1258           0 :         aNewPos -= m_aDragDelta;
    1259             : 
    1260           0 :         uno::Sequence< beans::NamedValue > aAllreadyCopiedObjects;
    1261           0 :         TSectionsMap::iterator aIter = m_aSections.begin();
    1262           0 :         const TSectionsMap::iterator aEnd = m_aSections.end();
    1263           0 :         for (; aIter != aEnd; ++aIter)
    1264             :         {
    1265           0 :             OReportSection& rReportSection = (*aIter)->getReportSection();
    1266           0 :             if ( pInSection != &rReportSection.getSectionView() )
    1267             :             {
    1268           0 :                 rReportSection.getSectionView().BrkAction();
    1269           0 :                 rReportSection.Copy(aAllreadyCopiedObjects,true);
    1270             :             }
    1271             :             else
    1272           0 :                 pInSection->EndDragObj(false);
    1273             :         }
    1274             : 
    1275           0 :         if ( aAllreadyCopiedObjects.getLength() )
    1276             :         {
    1277           0 :             beans::NamedValue* pIter = aAllreadyCopiedObjects.getArray();
    1278           0 :             const beans::NamedValue* pEnd = pIter + aAllreadyCopiedObjects.getLength();
    1279             :             try
    1280             :             {
    1281           0 :                 uno::Reference<report::XReportDefinition> xReportDefinition = getView()->getReportView()->getController().getReportDefinition();
    1282           0 :                 const sal_Int32 nLeftMargin  = getStyleProperty<sal_Int32>(xReportDefinition,PROPERTY_LEFTMARGIN);
    1283           0 :                 const sal_Int32 nRightMargin = getStyleProperty<sal_Int32>(xReportDefinition,PROPERTY_RIGHTMARGIN);
    1284           0 :                 const sal_Int32 nPaperWidth  = getStyleProperty<awt::Size>(xReportDefinition,PROPERTY_PAPERSIZE).Width;
    1285             : 
    1286           0 :                 if ( aNewPos.X() < nLeftMargin )
    1287           0 :                     aNewPos.X() = nLeftMargin;
    1288           0 :                 if ( aNewPos.Y() < 0 )
    1289           0 :                     aNewPos.Y() = 0;
    1290             : 
    1291           0 :                 Point aPrevious;
    1292           0 :                 for (; pIter != pEnd; ++pIter)
    1293             :                 {
    1294           0 :                     uno::Sequence< uno::Reference<report::XReportComponent> > aClones;
    1295           0 :                     pIter->Value >>= aClones;
    1296           0 :                     uno::Reference<report::XReportComponent>* pColIter = aClones.getArray();
    1297           0 :                     const uno::Reference<report::XReportComponent>* pColEnd = pColIter + aClones.getLength();
    1298             : 
    1299             :                     // move the cloned Components to new positions
    1300           0 :                     for (; pColIter != pColEnd; ++pColIter)
    1301             :                     {
    1302           0 :                         uno::Reference< report::XReportComponent> xRC(*pColIter);
    1303           0 :                         aPrevious = VCLPoint(xRC->getPosition());
    1304           0 :                         awt::Size aSize = xRC->getSize();
    1305             : 
    1306           0 :                         if ( aNewPos.X() < nLeftMargin )
    1307             :                         {
    1308           0 :                             aNewPos.X() = nLeftMargin;
    1309             :                         }
    1310           0 :                         else if ( (aNewPos.X() + aSize.Width) > (nPaperWidth - nRightMargin) )
    1311             :                         {
    1312           0 :                             aNewPos.X() = nPaperWidth - nRightMargin - aSize.Width;
    1313             :                         }
    1314           0 :                         if ( aNewPos.Y() < 0 )
    1315             :                         {
    1316           0 :                             aNewPos.Y() = 0;
    1317             :                         }
    1318           0 :                         if ( aNewPos.X() < 0 )
    1319             :                         {
    1320           0 :                             aSize.Width += aNewPos.X();
    1321           0 :                             aNewPos.X()= 0;
    1322           0 :                             xRC->setSize(aSize);
    1323             :                         }
    1324           0 :                         xRC->setPosition(AWTPoint(aNewPos));
    1325           0 :                         if ( (pColIter+1) != pColEnd )
    1326             :                         {
    1327             :                             // bring aNewPos to the position of the next object
    1328           0 :                             uno::Reference< report::XReportComponent> xRCNext(*(pColIter + 1),uno::UNO_QUERY);
    1329           0 :                             Point aNextPosition = VCLPoint(xRCNext->getPosition());
    1330           0 :                             aNewPos += (aNextPosition - aPrevious);
    1331             :                         }
    1332           0 :                     }
    1333           0 :                 }
    1334             :             }
    1335           0 :             catch(uno::Exception&)
    1336             :             {
    1337             :             }
    1338           0 :             pInSection->getReportSection()->Paste(aAllreadyCopiedObjects,true);
    1339           0 :         }
    1340             :     }
    1341             :     else
    1342             :     {
    1343           0 :         ::std::for_each( m_aSections.begin(), m_aSections.end(), ApplySectionViewAction( false ) );
    1344           0 :         EndDragObj_removeInvisibleObjects();
    1345             :     }
    1346           0 :     m_aDragDelta = Point(SAL_MAX_INT32, SAL_MAX_INT32);
    1347           0 : }
    1348             : 
    1349           0 : void OViewsWindow::EndAction()
    1350             : {
    1351           0 :     ::std::for_each( m_aSections.begin(), m_aSections.end(), ApplySectionViewAction() );
    1352           0 : }
    1353             : 
    1354           0 : void OViewsWindow::MovAction(const Point& _aPnt,const OSectionView* _pSection,bool _bMove, bool _bControlKeySet)
    1355             : {
    1356             :     (void)_bMove;
    1357             : 
    1358           0 :     Point aRealMousePos = _aPnt;
    1359           0 :     Point aCurrentSectionPos;
    1360             :     SAL_INFO(
    1361             :         "reportdesign",
    1362             :         "X:" << aRealMousePos.X() << " Y:" << aRealMousePos.Y());
    1363             : 
    1364           0 :     Point aHdlPos;
    1365           0 :     SdrHdl* pHdl = _pSection->GetDragHdl();
    1366           0 :     if ( pHdl )
    1367             :     {
    1368           0 :         aHdlPos = pHdl->GetPos();
    1369             :     }
    1370             : 
    1371           0 :     TSectionsMap::iterator aIter;
    1372           0 :     TSectionsMap::iterator aEnd = m_aSections.end();
    1373             : 
    1374           0 :     for (aIter = m_aSections.begin(); aIter != aEnd; ++aIter)
    1375             :     {
    1376           0 :         OReportSection& rReportSection = (*aIter)->getReportSection();
    1377           0 :         if ( &rReportSection.getSectionView() == _pSection )
    1378           0 :             break;
    1379           0 :         const long nSectionHeight = (*aIter)->PixelToLogic(rReportSection.GetOutputSizePixel()).Height();
    1380           0 :         aCurrentSectionPos.Y() += nSectionHeight;
    1381             :     }
    1382           0 :     aRealMousePos += aCurrentSectionPos;
    1383             : 
    1384             :     // If control key is pressed the work area is limited to the section with the current selection.
    1385           0 :     Point aPosForWorkArea(0,0);
    1386           0 :     for (aIter = m_aSections.begin(); aIter != aEnd; ++aIter)
    1387             :     {
    1388           0 :         OReportSection& rReportSection = (*aIter)->getReportSection();
    1389           0 :         OSectionView& rView = rReportSection.getSectionView();
    1390           0 :         const long nSectionHeight = (*aIter)->PixelToLogic((*aIter)->GetOutputSizePixel()).Height();
    1391             : 
    1392           0 :         if (_bControlKeySet)
    1393             :         {
    1394           0 :             Rectangle aClipRect = rView.GetWorkArea();
    1395           0 :             aClipRect.Top() = aCurrentSectionPos.Y() - aPosForWorkArea.Y();
    1396           0 :             aClipRect.Bottom() = aClipRect.Top() + nSectionHeight;
    1397           0 :             rView.SetWorkArea( aClipRect );
    1398             :         }
    1399             :         else
    1400             :         {
    1401           0 :             Rectangle aClipRect = rView.GetWorkArea();
    1402           0 :             aClipRect.Top() = -aPosForWorkArea.Y();
    1403           0 :             rView.SetWorkArea( aClipRect );
    1404             :         }
    1405           0 :         aPosForWorkArea.Y() += nSectionHeight;
    1406             :     }
    1407             : 
    1408             : 
    1409           0 :     for (aIter = m_aSections.begin(); aIter != aEnd; ++aIter)
    1410             :     {
    1411           0 :         OReportSection& rReportSection = (*aIter)->getReportSection();
    1412           0 :         SdrHdl* pCurrentHdl = rReportSection.getSectionView().GetDragHdl();
    1413           0 :         if ( pCurrentHdl )
    1414             :         {
    1415           0 :             if ( aRealMousePos.Y() > 0 )
    1416           0 :                 aRealMousePos = _aPnt + pCurrentHdl->GetPos() - aHdlPos;
    1417             :         }
    1418           0 :         rReportSection.getSectionView().MovAction ( aRealMousePos );
    1419           0 :         const long nSectionHeight = (*aIter)->PixelToLogic((*aIter)->GetOutputSizePixel()).Height();
    1420           0 :         aRealMousePos.Y() -= nSectionHeight;
    1421             :     }
    1422           0 : }
    1423             : 
    1424           0 : bool OViewsWindow::IsAction() const
    1425             : {
    1426           0 :     bool bAction = false;
    1427           0 :     TSectionsMap::const_iterator aIter = m_aSections.begin();
    1428           0 :     TSectionsMap::const_iterator aEnd = m_aSections.end();
    1429           0 :     for (; !bAction && aIter != aEnd; ++aIter)
    1430           0 :         bAction = (*aIter)->getReportSection().getSectionView().IsAction();
    1431           0 :     return bAction;
    1432             : }
    1433             : 
    1434           0 : bool OViewsWindow::IsDragObj() const
    1435             : {
    1436           0 :     bool bAction = false;
    1437           0 :     TSectionsMap::const_iterator aIter = m_aSections.begin();
    1438           0 :     TSectionsMap::const_iterator aEnd = m_aSections.end();
    1439           0 :     for (; !bAction && aIter != aEnd; ++aIter)
    1440           0 :         bAction = (*aIter)->getReportSection().getSectionView().IsAction();
    1441           0 :     return bAction;
    1442             : }
    1443             : 
    1444           0 : sal_uInt32 OViewsWindow::getMarkedObjectCount() const
    1445             : {
    1446           0 :     sal_uInt32 nCount = 0;
    1447           0 :     TSectionsMap::const_iterator aIter = m_aSections.begin();
    1448           0 :     TSectionsMap::const_iterator aEnd = m_aSections.end();
    1449           0 :     for (; aIter != aEnd; ++aIter)
    1450           0 :         nCount += static_cast<sal_uInt32>((*aIter)->getReportSection().getSectionView().GetMarkedObjectCount());
    1451           0 :     return nCount;
    1452             : }
    1453             : 
    1454           0 : void OViewsWindow::handleKey(const vcl::KeyCode& _rCode)
    1455             : {
    1456           0 :     const sal_uInt16 nCode = _rCode.GetCode();
    1457           0 :     if ( _rCode.IsMod1() )
    1458             :     {
    1459             :         // scroll page
    1460           0 :         OScrollWindowHelper* pScrollWindow = getView()->getScrollWindow();
    1461           0 :         ScrollBar& rScrollBar = ( nCode == KEY_LEFT || nCode == KEY_RIGHT ) ? pScrollWindow->GetHScroll() : pScrollWindow->GetVScroll();
    1462           0 :         if ( rScrollBar.IsVisible() )
    1463           0 :             rScrollBar.DoScrollAction(( nCode == KEY_RIGHT || nCode == KEY_UP ) ? SCROLL_LINEUP : SCROLL_LINEDOWN );
    1464           0 :         return;
    1465             :     }
    1466           0 :     TSectionsMap::const_iterator aIter = m_aSections.begin();
    1467           0 :     TSectionsMap::const_iterator aEnd = m_aSections.end();
    1468           0 :     for (; aIter != aEnd; ++aIter)
    1469             :     {
    1470           0 :         OReportSection& rReportSection = (*aIter)->getReportSection();
    1471           0 :         long nX = 0;
    1472           0 :         long nY = 0;
    1473             : 
    1474           0 :         if ( nCode == KEY_UP )
    1475           0 :             nY = -1;
    1476           0 :         else if ( nCode == KEY_DOWN )
    1477           0 :             nY =  1;
    1478           0 :         else if ( nCode == KEY_LEFT )
    1479           0 :             nX = -1;
    1480           0 :         else if ( nCode == KEY_RIGHT )
    1481           0 :             nX =  1;
    1482             : 
    1483           0 :         if ( rReportSection.getSectionView().AreObjectsMarked() )
    1484             :         {
    1485           0 :             if ( _rCode.IsMod2() )
    1486             :             {
    1487             :                 // move in 1 pixel distance
    1488           0 :                 const Size aPixelSize = rReportSection.PixelToLogic( Size( 1, 1 ) );
    1489           0 :                 nX *= aPixelSize.Width();
    1490           0 :                 nY *= aPixelSize.Height();
    1491             :             }
    1492             :             else
    1493             :             {
    1494             :                 // move in 1 mm distance
    1495           0 :                 nX *= DEFAUL_MOVE_SIZE;
    1496           0 :                 nY *= DEFAUL_MOVE_SIZE;
    1497             :             }
    1498             : 
    1499           0 :             OSectionView& rView = rReportSection.getSectionView();
    1500           0 :             const SdrHdlList& rHdlList = rView.GetHdlList();
    1501           0 :             SdrHdl* pHdl = rHdlList.GetFocusHdl();
    1502             : 
    1503           0 :             if ( pHdl == 0 )
    1504             :             {
    1505             :                 // no handle selected
    1506           0 :                 if ( rView.IsMoveAllowed() )
    1507             :                 {
    1508             :                     // restrict movement to work area
    1509           0 :                     Rectangle rWorkArea = rView.GetWorkArea();
    1510           0 :                     rWorkArea.Right()++;
    1511             : 
    1512           0 :                     if ( !rWorkArea.IsEmpty() )
    1513             :                     {
    1514           0 :                         if ( rWorkArea.Top() < 0 )
    1515           0 :                             rWorkArea.Top() = 0;
    1516           0 :                         Rectangle aMarkRect( rView.GetMarkedObjRect() );
    1517           0 :                         aMarkRect.Move( nX, nY );
    1518             : 
    1519           0 :                         if ( !rWorkArea.IsInside( aMarkRect ) )
    1520             :                         {
    1521           0 :                             if ( aMarkRect.Left() < rWorkArea.Left() )
    1522           0 :                                 nX += rWorkArea.Left() - aMarkRect.Left();
    1523             : 
    1524           0 :                             if ( aMarkRect.Right() > rWorkArea.Right() )
    1525           0 :                                 nX -= aMarkRect.Right() - rWorkArea.Right();
    1526             : 
    1527           0 :                             if ( aMarkRect.Top() < rWorkArea.Top() )
    1528           0 :                                 nY += rWorkArea.Top() - aMarkRect.Top();
    1529             : 
    1530           0 :                             if ( aMarkRect.Bottom() > rWorkArea.Bottom() )
    1531           0 :                                 nY -= aMarkRect.Bottom() - rWorkArea.Bottom();
    1532             :                         }
    1533           0 :                         bool bCheck = false;
    1534           0 :                         const SdrMarkList& rMarkList = rView.GetMarkedObjectList();
    1535           0 :                         for (size_t i = 0; !bCheck && i < rMarkList.GetMarkCount(); ++i )
    1536             :                         {
    1537           0 :                             SdrMark* pMark = rMarkList.GetMark(i);
    1538           0 :                             bCheck = dynamic_cast<OUnoObject*>(pMark->GetMarkedSdrObj()) != NULL|| dynamic_cast<OOle2Obj*>(pMark->GetMarkedSdrObj());
    1539             :                         }
    1540             : 
    1541             : 
    1542           0 :                         if ( bCheck )
    1543             :                         {
    1544           0 :                             SdrObject* pOverlapped = isOver(aMarkRect,*rReportSection.getPage(),rView);
    1545           0 :                             if ( pOverlapped )
    1546             :                             {
    1547           0 :                                 do
    1548             :                                 {
    1549           0 :                                     Rectangle aOver = pOverlapped->GetLastBoundRect();
    1550           0 :                                     Point aPos;
    1551           0 :                                     if ( nCode == KEY_UP )
    1552             :                                     {
    1553           0 :                                         aPos.X() = aMarkRect.Left();
    1554           0 :                                         aPos.Y() = aOver.Top() - aMarkRect.getHeight();
    1555           0 :                                         nY += (aPos.Y() - aMarkRect.Top());
    1556             :                                     }
    1557           0 :                                     else if ( nCode == KEY_DOWN )
    1558             :                                     {
    1559           0 :                                         aPos.X() = aMarkRect.Left();
    1560           0 :                                         aPos.Y() = aOver.Bottom();
    1561           0 :                                         nY += (aPos.Y() - aMarkRect.Top());
    1562             :                                     }
    1563           0 :                                     else if ( nCode == KEY_LEFT )
    1564             :                                     {
    1565           0 :                                         aPos.X() = aOver.Left() - aMarkRect.getWidth();
    1566           0 :                                         aPos.Y() = aMarkRect.Top();
    1567           0 :                                         nX += (aPos.X() - aMarkRect.Left());
    1568             :                                     }
    1569           0 :                                     else if ( nCode == KEY_RIGHT )
    1570             :                                     {
    1571           0 :                                         aPos.X() = aOver.Right();
    1572           0 :                                         aPos.Y() = aMarkRect.Top();
    1573           0 :                                         nX += (aPos.X() - aMarkRect.Left());
    1574             :                                     }
    1575             : 
    1576           0 :                                     aMarkRect.SetPos(aPos);
    1577           0 :                                     if ( !rWorkArea.IsInside( aMarkRect ) )
    1578             :                                     {
    1579           0 :                                         break;
    1580             :                                     }
    1581           0 :                                     pOverlapped = isOver(aMarkRect,*rReportSection.getPage(),rView);
    1582             :                                 }
    1583             :                                 while(pOverlapped != NULL);
    1584           0 :                                 if (pOverlapped != NULL)
    1585           0 :                                     break;
    1586             :                             }
    1587             :                         }
    1588             :                     }
    1589             : 
    1590           0 :                     if ( nX != 0 || nY != 0 )
    1591             :                     {
    1592           0 :                         rView.MoveAllMarked( Size( nX, nY ) );
    1593           0 :                         rView.MakeVisible( rView.GetAllMarkedRect(), rReportSection);
    1594             :                     }
    1595             :                 }
    1596             :             }
    1597             :             else
    1598             :             {
    1599             :                 // move the handle
    1600           0 :                 if ( pHdl && ( nX || nY ) )
    1601             :                 {
    1602           0 :                     const Point aStartPoint( pHdl->GetPos() );
    1603           0 :                     const Point aEndPoint( pHdl->GetPos() + Point( nX, nY ) );
    1604           0 :                     const SdrDragStat& rDragStat = rView.GetDragStat();
    1605             : 
    1606             :                     // start dragging
    1607           0 :                     rView.BegDragObj( aStartPoint, 0, pHdl, 0 );
    1608             : 
    1609           0 :                     if ( rView.IsDragObj() )
    1610             :                     {
    1611           0 :                         const bool bWasNoSnap = rDragStat.IsNoSnap();
    1612           0 :                         const bool bWasSnapEnabled = rView.IsSnapEnabled();
    1613             : 
    1614             :                         // switch snapping off
    1615           0 :                         if ( !bWasNoSnap )
    1616           0 :                             ((SdrDragStat&)rDragStat).SetNoSnap( true );
    1617           0 :                         if ( bWasSnapEnabled )
    1618           0 :                             rView.SetSnapEnabled( false );
    1619             : 
    1620           0 :                         Rectangle aNewRect;
    1621           0 :                         bool bCheck = false;
    1622           0 :                         const SdrMarkList& rMarkList = rView.GetMarkedObjectList();
    1623           0 :                         for (size_t i = 0; !bCheck && i < rMarkList.GetMarkCount(); ++i )
    1624             :                         {
    1625           0 :                             SdrMark* pMark = rMarkList.GetMark(i);
    1626           0 :                             bCheck = dynamic_cast<OUnoObject*>(pMark->GetMarkedSdrObj()) != NULL || dynamic_cast<OOle2Obj*>(pMark->GetMarkedSdrObj()) != NULL;
    1627           0 :                             if ( bCheck )
    1628           0 :                                 aNewRect.Union(pMark->GetMarkedSdrObj()->GetLastBoundRect());
    1629             :                         }
    1630             : 
    1631           0 :                         switch(pHdl->GetKind())
    1632             :                         {
    1633             :                             case HDL_LEFT:
    1634             :                             case HDL_UPLFT:
    1635             :                             case HDL_LWLFT:
    1636             :                             case HDL_UPPER:
    1637           0 :                                 aNewRect.Left() += nX;
    1638           0 :                                 aNewRect.Top()  += nY;
    1639           0 :                                 break;
    1640             :                             case HDL_UPRGT:
    1641             :                             case HDL_RIGHT:
    1642             :                             case HDL_LWRGT:
    1643             :                             case HDL_LOWER:
    1644           0 :                                 aNewRect.setWidth(aNewRect.getWidth() + nX);
    1645           0 :                                 aNewRect.setHeight(aNewRect.getHeight() + nY);
    1646           0 :                                 break;
    1647             :                             default:
    1648           0 :                                 break;
    1649             :                         }
    1650           0 :                         if ( !(bCheck && isOver(aNewRect,*rReportSection.getPage(),rView)) )
    1651           0 :                             rView.MovAction(aEndPoint);
    1652           0 :                         rView.EndDragObj();
    1653             : 
    1654             :                         // restore snap
    1655           0 :                         if ( !bWasNoSnap )
    1656           0 :                             ((SdrDragStat&)rDragStat).SetNoSnap( bWasNoSnap );
    1657           0 :                         if ( bWasSnapEnabled )
    1658           0 :                             rView.SetSnapEnabled( bWasSnapEnabled );
    1659             :                     }
    1660             : 
    1661             :                     // make moved handle visible
    1662           0 :                     const Rectangle aVisRect( aEndPoint - Point( DEFAUL_MOVE_SIZE, DEFAUL_MOVE_SIZE ), Size( 200, 200 ) );
    1663           0 :                     rView.MakeVisible( aVisRect, rReportSection);
    1664             :                 }
    1665             :             }
    1666           0 :             rView.AdjustMarkHdl();
    1667             :         }
    1668             :     }
    1669             : }
    1670             : 
    1671           0 : void OViewsWindow::stopScrollTimer()
    1672             : {
    1673             :     ::std::for_each(m_aSections.begin(),m_aSections.end(),
    1674           0 :         ::o3tl::compose1(::boost::mem_fn(&OReportSection::stopScrollTimer),TReportPairHelper()));
    1675           0 : }
    1676             : 
    1677           0 : void OViewsWindow::fillCollapsedSections(::std::vector<sal_uInt16>& _rCollapsedPositions) const
    1678             : {
    1679           0 :     TSectionsMap::const_iterator aIter = m_aSections.begin();
    1680           0 :     TSectionsMap::const_iterator aEnd = m_aSections.end();
    1681           0 :     for (sal_uInt16 i = 0;aIter != aEnd ; ++aIter,++i)
    1682             :     {
    1683           0 :         if ( (*aIter)->getStartMarker().isCollapsed() )
    1684           0 :             _rCollapsedPositions.push_back(i);
    1685             :     }
    1686           0 : }
    1687             : 
    1688           0 : void OViewsWindow::collapseSections(const uno::Sequence< beans::PropertyValue>& _aCollpasedSections)
    1689             : {
    1690           0 :     const beans::PropertyValue* pIter = _aCollpasedSections.getConstArray();
    1691           0 :     const beans::PropertyValue* pEnd = pIter + _aCollpasedSections.getLength();
    1692           0 :     for (; pIter != pEnd; ++pIter)
    1693             :     {
    1694           0 :         sal_uInt16 nPos = sal_uInt16(-1);
    1695           0 :         if ( (pIter->Value >>= nPos) && nPos < m_aSections.size() )
    1696             :         {
    1697           0 :             m_aSections[nPos]->setCollapsed(true);
    1698             :         }
    1699             :     }
    1700           0 : }
    1701             : 
    1702           0 : void OViewsWindow::zoom(const Fraction& _aZoom)
    1703             : {
    1704           0 :     const MapMode& aMapMode = GetMapMode();
    1705             : 
    1706           0 :     Fraction aStartWidth(long(REPORT_STARTMARKER_WIDTH));
    1707           0 :     if ( _aZoom < aMapMode.GetScaleX() )
    1708           0 :         aStartWidth *= aMapMode.GetScaleX();
    1709             :     else
    1710           0 :         aStartWidth *= _aZoom;
    1711             : 
    1712           0 :     setZoomFactor(_aZoom,*this);
    1713             : 
    1714           0 :     TSectionsMap::iterator aIter = m_aSections.begin();
    1715           0 :     TSectionsMap::iterator aEnd = m_aSections.end();
    1716           0 :     for (;aIter != aEnd ; ++aIter)
    1717             :     {
    1718           0 :         (*aIter)->zoom(_aZoom);
    1719             :     }
    1720             : 
    1721           0 :     Resize();
    1722             : 
    1723           0 :     Size aOut = GetOutputSizePixel();
    1724           0 :     aOut.Width() = aStartWidth;
    1725           0 :     aOut = PixelToLogic(aOut);
    1726             : 
    1727           0 :     Rectangle aRect(PixelToLogic(Point(0,0)),aOut);
    1728           0 :     Invalidate(aRect, InvalidateFlags::NoChildren);
    1729           0 : }
    1730             : 
    1731           0 : void OViewsWindow::scrollChildren(const Point& _aThumbPos)
    1732             : {
    1733           0 :     const Point aPos(PixelToLogic(_aThumbPos));
    1734             :     {
    1735           0 :         MapMode aMapMode = GetMapMode();
    1736           0 :         const Point aOld = aMapMode.GetOrigin();
    1737           0 :         aMapMode.SetOrigin(m_pParent->GetMapMode().GetOrigin());
    1738             : 
    1739           0 :         const Point aPosY(m_pParent->PixelToLogic(_aThumbPos,aMapMode));
    1740             : 
    1741           0 :         aMapMode.SetOrigin( Point(aOld.X() , - aPosY.Y()));
    1742           0 :         SetMapMode( aMapMode );
    1743           0 :         Scroll(0, -( aOld.Y() + aPosY.Y()),ScrollFlags::Children);
    1744             :     }
    1745             : 
    1746           0 :     TSectionsMap::iterator aIter = m_aSections.begin();
    1747           0 :     TSectionsMap::iterator aEnd = m_aSections.end();
    1748           0 :     for (;aIter != aEnd ; ++aIter)
    1749             :     {
    1750           0 :         (*aIter)->scrollChildren(aPos.X());
    1751             :     }
    1752           0 : }
    1753             : 
    1754           0 : void OViewsWindow::fillControlModelSelection(::std::vector< uno::Reference< uno::XInterface > >& _rSelection) const
    1755             : {
    1756           0 :     TSectionsMap::const_iterator aIter = m_aSections.begin();
    1757           0 :     TSectionsMap::const_iterator aEnd = m_aSections.end();
    1758           0 :     for(;aIter != aEnd; ++aIter)
    1759             :     {
    1760           0 :         (*aIter)->getReportSection().fillControlModelSelection(_rSelection);
    1761             :     }
    1762           0 : }
    1763             : 
    1764           3 : } // rptui
    1765             : 
    1766             : 
    1767             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11