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

Generated by: LCOV version 1.10