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