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

Generated by: LCOV version 1.10