1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_sc.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir 32*cdf0e10cSrcweir 33*cdf0e10cSrcweir // INCLUDE --------------------------------------------------------------- 34*cdf0e10cSrcweir 35*cdf0e10cSrcweir #include "scitems.hxx" 36*cdf0e10cSrcweir #include <vcl/msgbox.hxx> 37*cdf0e10cSrcweir #include <vcl/sound.hxx> 38*cdf0e10cSrcweir 39*cdf0e10cSrcweir #include "gridwin.hxx" 40*cdf0e10cSrcweir #include "tabvwsh.hxx" 41*cdf0e10cSrcweir #include "docsh.hxx" 42*cdf0e10cSrcweir #include "viewdata.hxx" 43*cdf0e10cSrcweir #include "pivot.hxx" 44*cdf0e10cSrcweir //CHINA001 #include "pfiltdlg.hxx" 45*cdf0e10cSrcweir #include "uiitems.hxx" 46*cdf0e10cSrcweir #include "scresid.hxx" 47*cdf0e10cSrcweir #include "sc.hrc" 48*cdf0e10cSrcweir #include "globstr.hrc" 49*cdf0e10cSrcweir #include "pagedata.hxx" 50*cdf0e10cSrcweir #include "dpobject.hxx" 51*cdf0e10cSrcweir #include "dpsave.hxx" 52*cdf0e10cSrcweir #include "dpoutput.hxx" // ScDPPositionData 53*cdf0e10cSrcweir #include "dpshttab.hxx" 54*cdf0e10cSrcweir #include "dbdocfun.hxx" 55*cdf0e10cSrcweir #include "dpcontrol.hxx" 56*cdf0e10cSrcweir #include "dpcontrol.hrc" 57*cdf0e10cSrcweir #include "strload.hxx" 58*cdf0e10cSrcweir #include "userlist.hxx" 59*cdf0e10cSrcweir 60*cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldOrientation.hpp> 61*cdf0e10cSrcweir #include "scabstdlg.hxx" //CHINA001 62*cdf0e10cSrcweir 63*cdf0e10cSrcweir #include <vector> 64*cdf0e10cSrcweir #include <hash_map> 65*cdf0e10cSrcweir 66*cdf0e10cSrcweir using namespace com::sun::star; 67*cdf0e10cSrcweir using ::com::sun::star::sheet::DataPilotFieldOrientation; 68*cdf0e10cSrcweir using ::std::vector; 69*cdf0e10cSrcweir using ::std::auto_ptr; 70*cdf0e10cSrcweir using ::std::hash_map; 71*cdf0e10cSrcweir using ::rtl::OUString; 72*cdf0e10cSrcweir using ::rtl::OUStringHash; 73*cdf0e10cSrcweir 74*cdf0e10cSrcweir // STATIC DATA ----------------------------------------------------------- 75*cdf0e10cSrcweir 76*cdf0e10cSrcweir // ----------------------------------------------------------------------- 77*cdf0e10cSrcweir 78*cdf0e10cSrcweir DataPilotFieldOrientation ScGridWindow::GetDPFieldOrientation( SCCOL nCol, SCROW nRow ) const 79*cdf0e10cSrcweir { 80*cdf0e10cSrcweir using namespace ::com::sun::star::sheet; 81*cdf0e10cSrcweir 82*cdf0e10cSrcweir ScDocument* pDoc = pViewData->GetDocument(); 83*cdf0e10cSrcweir SCTAB nTab = pViewData->GetTabNo(); 84*cdf0e10cSrcweir ScDPObject* pDPObj = pDoc->GetDPAtCursor(nCol, nRow, nTab); 85*cdf0e10cSrcweir if (!pDPObj) 86*cdf0e10cSrcweir return DataPilotFieldOrientation_HIDDEN; 87*cdf0e10cSrcweir 88*cdf0e10cSrcweir sal_uInt16 nOrient = DataPilotFieldOrientation_HIDDEN; 89*cdf0e10cSrcweir 90*cdf0e10cSrcweir // Check for page field first. 91*cdf0e10cSrcweir if (nCol > 0) 92*cdf0e10cSrcweir { 93*cdf0e10cSrcweir // look for the dimension header left of the drop-down arrow 94*cdf0e10cSrcweir long nField = pDPObj->GetHeaderDim( ScAddress( nCol-1, nRow, nTab ), nOrient ); 95*cdf0e10cSrcweir if ( nField >= 0 && nOrient == DataPilotFieldOrientation_PAGE ) 96*cdf0e10cSrcweir { 97*cdf0e10cSrcweir sal_Bool bIsDataLayout = sal_False; 98*cdf0e10cSrcweir String aFieldName = pDPObj->GetDimName( nField, bIsDataLayout ); 99*cdf0e10cSrcweir if ( aFieldName.Len() && !bIsDataLayout ) 100*cdf0e10cSrcweir return DataPilotFieldOrientation_PAGE; 101*cdf0e10cSrcweir } 102*cdf0e10cSrcweir } 103*cdf0e10cSrcweir 104*cdf0e10cSrcweir nOrient = sheet::DataPilotFieldOrientation_HIDDEN; 105*cdf0e10cSrcweir 106*cdf0e10cSrcweir // Now, check for row/column field. 107*cdf0e10cSrcweir long nField = pDPObj->GetHeaderDim(ScAddress(nCol, nRow, nTab), nOrient); 108*cdf0e10cSrcweir if (nField >= 0 && (nOrient == DataPilotFieldOrientation_COLUMN || nOrient == DataPilotFieldOrientation_ROW) ) 109*cdf0e10cSrcweir { 110*cdf0e10cSrcweir sal_Bool bIsDataLayout = sal_False; 111*cdf0e10cSrcweir String aFieldName = pDPObj->GetDimName(nField, bIsDataLayout); 112*cdf0e10cSrcweir if (aFieldName.Len() && !bIsDataLayout) 113*cdf0e10cSrcweir return static_cast<DataPilotFieldOrientation>(nOrient); 114*cdf0e10cSrcweir } 115*cdf0e10cSrcweir 116*cdf0e10cSrcweir return DataPilotFieldOrientation_HIDDEN; 117*cdf0e10cSrcweir } 118*cdf0e10cSrcweir 119*cdf0e10cSrcweir // private method for mouse button handling 120*cdf0e10cSrcweir sal_Bool ScGridWindow::DoPageFieldSelection( SCCOL nCol, SCROW nRow ) 121*cdf0e10cSrcweir { 122*cdf0e10cSrcweir if (GetDPFieldOrientation( nCol, nRow ) == sheet::DataPilotFieldOrientation_PAGE) 123*cdf0e10cSrcweir { 124*cdf0e10cSrcweir LaunchPageFieldMenu( nCol, nRow ); 125*cdf0e10cSrcweir return sal_True; 126*cdf0e10cSrcweir } 127*cdf0e10cSrcweir return sal_False; 128*cdf0e10cSrcweir } 129*cdf0e10cSrcweir 130*cdf0e10cSrcweir bool ScGridWindow::DoAutoFilterButton( SCCOL nCol, SCROW nRow, const MouseEvent& rMEvt ) 131*cdf0e10cSrcweir { 132*cdf0e10cSrcweir ScDocument* pDoc = pViewData->GetDocument(); 133*cdf0e10cSrcweir SCTAB nTab = pViewData->GetTabNo(); 134*cdf0e10cSrcweir Point aScrPos = pViewData->GetScrPos(nCol, nRow, eWhich); 135*cdf0e10cSrcweir Point aDiffPix = rMEvt.GetPosPixel(); 136*cdf0e10cSrcweir 137*cdf0e10cSrcweir aDiffPix -= aScrPos; 138*cdf0e10cSrcweir sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nTab ); 139*cdf0e10cSrcweir if ( bLayoutRTL ) 140*cdf0e10cSrcweir aDiffPix.X() = -aDiffPix.X(); 141*cdf0e10cSrcweir 142*cdf0e10cSrcweir long nSizeX, nSizeY; 143*cdf0e10cSrcweir pViewData->GetMergeSizePixel( nCol, nRow, nSizeX, nSizeY ); 144*cdf0e10cSrcweir Size aScrSize(nSizeX-1, nSizeY-1); 145*cdf0e10cSrcweir 146*cdf0e10cSrcweir // Check if the mouse cursor is clicking on the popup arrow box. 147*cdf0e10cSrcweir mpFilterButton.reset(new ScDPFieldButton(this, &GetSettings().GetStyleSettings(), &pViewData->GetZoomX(), &pViewData->GetZoomY(), pDoc)); 148*cdf0e10cSrcweir mpFilterButton->setBoundingBox(aScrPos, aScrSize, bLayoutRTL); 149*cdf0e10cSrcweir mpFilterButton->setPopupLeft(bLayoutRTL); // #i114944# AutoFilter button is left-aligned in RTL 150*cdf0e10cSrcweir Point aPopupPos; 151*cdf0e10cSrcweir Size aPopupSize; 152*cdf0e10cSrcweir mpFilterButton->getPopupBoundingBox(aPopupPos, aPopupSize); 153*cdf0e10cSrcweir Rectangle aRec(aPopupPos, aPopupSize); 154*cdf0e10cSrcweir if (aRec.IsInside(rMEvt.GetPosPixel())) 155*cdf0e10cSrcweir { 156*cdf0e10cSrcweir if ( DoPageFieldSelection( nCol, nRow ) ) 157*cdf0e10cSrcweir return true; 158*cdf0e10cSrcweir 159*cdf0e10cSrcweir bool bFilterActive = IsAutoFilterActive(nCol, nRow, nTab); 160*cdf0e10cSrcweir mpFilterButton->setHasHiddenMember(bFilterActive); 161*cdf0e10cSrcweir mpFilterButton->setDrawBaseButton(false); 162*cdf0e10cSrcweir mpFilterButton->setDrawPopupButton(true); 163*cdf0e10cSrcweir mpFilterButton->setPopupPressed(true); 164*cdf0e10cSrcweir HideCursor(); 165*cdf0e10cSrcweir mpFilterButton->draw(); 166*cdf0e10cSrcweir ShowCursor(); 167*cdf0e10cSrcweir DoAutoFilterMenue(nCol, nRow, false); 168*cdf0e10cSrcweir return true; 169*cdf0e10cSrcweir } 170*cdf0e10cSrcweir 171*cdf0e10cSrcweir return false; 172*cdf0e10cSrcweir } 173*cdf0e10cSrcweir 174*cdf0e10cSrcweir void ScGridWindow::DoPushButton( SCCOL nCol, SCROW nRow, const MouseEvent& rMEvt ) 175*cdf0e10cSrcweir { 176*cdf0e10cSrcweir ScDocument* pDoc = pViewData->GetDocument(); 177*cdf0e10cSrcweir SCTAB nTab = pViewData->GetTabNo(); 178*cdf0e10cSrcweir 179*cdf0e10cSrcweir ScDPObject* pDPObj = pDoc->GetDPAtCursor(nCol, nRow, nTab); 180*cdf0e10cSrcweir 181*cdf0e10cSrcweir if (pDPObj) 182*cdf0e10cSrcweir { 183*cdf0e10cSrcweir sal_uInt16 nOrient = sheet::DataPilotFieldOrientation_HIDDEN; 184*cdf0e10cSrcweir ScAddress aPos( nCol, nRow, nTab ); 185*cdf0e10cSrcweir long nField = pDPObj->GetHeaderDim( aPos, nOrient ); 186*cdf0e10cSrcweir if ( nField >= 0 ) 187*cdf0e10cSrcweir { 188*cdf0e10cSrcweir bDPMouse = sal_True; 189*cdf0e10cSrcweir nDPField = nField; 190*cdf0e10cSrcweir pDragDPObj = pDPObj; 191*cdf0e10cSrcweir 192*cdf0e10cSrcweir if (DPTestFieldPopupArrow(rMEvt, aPos, pDPObj)) 193*cdf0e10cSrcweir { 194*cdf0e10cSrcweir // field name pop up menu has been launched. Don't activate 195*cdf0e10cSrcweir // field move. 196*cdf0e10cSrcweir bDPMouse = false; 197*cdf0e10cSrcweir return; 198*cdf0e10cSrcweir } 199*cdf0e10cSrcweir 200*cdf0e10cSrcweir DPTestMouse( rMEvt, sal_True ); 201*cdf0e10cSrcweir StartTracking(); 202*cdf0e10cSrcweir } 203*cdf0e10cSrcweir else if ( pDPObj->IsFilterButton(aPos) ) 204*cdf0e10cSrcweir { 205*cdf0e10cSrcweir ReleaseMouse(); // may have been captured in ButtonDown 206*cdf0e10cSrcweir 207*cdf0e10cSrcweir ScQueryParam aQueryParam; 208*cdf0e10cSrcweir SCTAB nSrcTab = 0; 209*cdf0e10cSrcweir const ScSheetSourceDesc* pDesc = pDPObj->GetSheetDesc(); 210*cdf0e10cSrcweir DBG_ASSERT(pDesc, "no sheet source for filter button"); 211*cdf0e10cSrcweir if (pDesc) 212*cdf0e10cSrcweir { 213*cdf0e10cSrcweir aQueryParam = pDesc->aQueryParam; 214*cdf0e10cSrcweir nSrcTab = pDesc->aSourceRange.aStart.Tab(); 215*cdf0e10cSrcweir } 216*cdf0e10cSrcweir 217*cdf0e10cSrcweir SfxItemSet aArgSet( pViewData->GetViewShell()->GetPool(), 218*cdf0e10cSrcweir SCITEM_QUERYDATA, SCITEM_QUERYDATA ); 219*cdf0e10cSrcweir aArgSet.Put( ScQueryItem( SCITEM_QUERYDATA, pViewData, &aQueryParam ) ); 220*cdf0e10cSrcweir 221*cdf0e10cSrcweir //CHINA001 ScPivotFilterDlg* pDlg = new ScPivotFilterDlg( 222*cdf0e10cSrcweir //CHINA001 pViewData->GetViewShell()->GetDialogParent(), 223*cdf0e10cSrcweir //CHINA001 aArgSet, nSrcTab ); 224*cdf0e10cSrcweir ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); 225*cdf0e10cSrcweir DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001 226*cdf0e10cSrcweir 227*cdf0e10cSrcweir AbstractScPivotFilterDlg* pDlg = pFact->CreateScPivotFilterDlg( pViewData->GetViewShell()->GetDialogParent(), 228*cdf0e10cSrcweir aArgSet, nSrcTab, 229*cdf0e10cSrcweir RID_SCDLG_PIVOTFILTER); 230*cdf0e10cSrcweir DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001 231*cdf0e10cSrcweir if ( pDlg->Execute() == RET_OK ) 232*cdf0e10cSrcweir { 233*cdf0e10cSrcweir ScSheetSourceDesc aNewDesc; 234*cdf0e10cSrcweir if (pDesc) 235*cdf0e10cSrcweir aNewDesc = *pDesc; 236*cdf0e10cSrcweir 237*cdf0e10cSrcweir const ScQueryItem& rQueryItem = pDlg->GetOutputItem(); 238*cdf0e10cSrcweir aNewDesc.aQueryParam = rQueryItem.GetQueryData(); 239*cdf0e10cSrcweir 240*cdf0e10cSrcweir ScDPObject aNewObj( *pDPObj ); 241*cdf0e10cSrcweir aNewObj.SetSheetDesc( aNewDesc ); 242*cdf0e10cSrcweir ScDBDocFunc aFunc( *pViewData->GetDocShell() ); 243*cdf0e10cSrcweir aFunc.DataPilotUpdate( pDPObj, &aNewObj, sal_True, sal_False ); 244*cdf0e10cSrcweir pViewData->GetView()->CursorPosChanged(); // shells may be switched 245*cdf0e10cSrcweir } 246*cdf0e10cSrcweir delete pDlg; 247*cdf0e10cSrcweir } 248*cdf0e10cSrcweir else 249*cdf0e10cSrcweir Sound::Beep(); 250*cdf0e10cSrcweir } 251*cdf0e10cSrcweir else 252*cdf0e10cSrcweir { 253*cdf0e10cSrcweir DBG_ERROR("Da is ja garnix"); 254*cdf0e10cSrcweir } 255*cdf0e10cSrcweir } 256*cdf0e10cSrcweir 257*cdf0e10cSrcweir // ----------------------------------------------------------------------- 258*cdf0e10cSrcweir // 259*cdf0e10cSrcweir // Data Pilot interaction 260*cdf0e10cSrcweir // 261*cdf0e10cSrcweir 262*cdf0e10cSrcweir void ScGridWindow::DPTestMouse( const MouseEvent& rMEvt, sal_Bool bMove ) 263*cdf0e10cSrcweir { 264*cdf0e10cSrcweir DBG_ASSERT(pDragDPObj, "pDragDPObj missing"); 265*cdf0e10cSrcweir 266*cdf0e10cSrcweir // scroll window if at edges 267*cdf0e10cSrcweir //! move this to separate method 268*cdf0e10cSrcweir 269*cdf0e10cSrcweir sal_Bool bTimer = sal_False; 270*cdf0e10cSrcweir Point aPixel = rMEvt.GetPosPixel(); 271*cdf0e10cSrcweir 272*cdf0e10cSrcweir SCsCOL nDx = 0; 273*cdf0e10cSrcweir SCsROW nDy = 0; 274*cdf0e10cSrcweir if ( aPixel.X() < 0 ) 275*cdf0e10cSrcweir nDx = -1; 276*cdf0e10cSrcweir if ( aPixel.Y() < 0 ) 277*cdf0e10cSrcweir nDy = -1; 278*cdf0e10cSrcweir Size aSize = GetOutputSizePixel(); 279*cdf0e10cSrcweir if ( aPixel.X() >= aSize.Width() ) 280*cdf0e10cSrcweir nDx = 1; 281*cdf0e10cSrcweir if ( aPixel.Y() >= aSize.Height() ) 282*cdf0e10cSrcweir nDy = 1; 283*cdf0e10cSrcweir if ( nDx != 0 || nDy != 0 ) 284*cdf0e10cSrcweir { 285*cdf0e10cSrcweir UpdateDragRect( sal_False, Rectangle() ); 286*cdf0e10cSrcweir 287*cdf0e10cSrcweir if ( nDx != 0) 288*cdf0e10cSrcweir pViewData->GetView()->ScrollX( nDx, WhichH(eWhich) ); 289*cdf0e10cSrcweir if ( nDy != 0 ) 290*cdf0e10cSrcweir pViewData->GetView()->ScrollY( nDy, WhichV(eWhich) ); 291*cdf0e10cSrcweir 292*cdf0e10cSrcweir bTimer = sal_True; 293*cdf0e10cSrcweir } 294*cdf0e10cSrcweir 295*cdf0e10cSrcweir // --- 296*cdf0e10cSrcweir 297*cdf0e10cSrcweir SCsCOL nPosX; 298*cdf0e10cSrcweir SCsROW nPosY; 299*cdf0e10cSrcweir pViewData->GetPosFromPixel( aPixel.X(), aPixel.Y(), eWhich, nPosX, nPosY ); 300*cdf0e10cSrcweir sal_Bool bMouseLeft; 301*cdf0e10cSrcweir sal_Bool bMouseTop; 302*cdf0e10cSrcweir pViewData->GetMouseQuadrant( aPixel, eWhich, nPosX, nPosY, bMouseLeft, bMouseTop ); 303*cdf0e10cSrcweir 304*cdf0e10cSrcweir ScAddress aPos( nPosX, nPosY, pViewData->GetTabNo() ); 305*cdf0e10cSrcweir 306*cdf0e10cSrcweir Rectangle aPosRect; 307*cdf0e10cSrcweir sal_uInt16 nOrient; 308*cdf0e10cSrcweir long nDimPos; 309*cdf0e10cSrcweir sal_Bool bHasRange = pDragDPObj->GetHeaderDrag( aPos, bMouseLeft, bMouseTop, nDPField, 310*cdf0e10cSrcweir aPosRect, nOrient, nDimPos ); 311*cdf0e10cSrcweir UpdateDragRect( bHasRange && bMove, aPosRect ); 312*cdf0e10cSrcweir 313*cdf0e10cSrcweir sal_Bool bIsDataLayout; 314*cdf0e10cSrcweir sal_Int32 nDimFlags = 0; 315*cdf0e10cSrcweir String aDimName = pDragDPObj->GetDimName( nDPField, bIsDataLayout, &nDimFlags ); 316*cdf0e10cSrcweir bool bAllowed = !bHasRange || ScDPObject::IsOrientationAllowed( nOrient, nDimFlags ); 317*cdf0e10cSrcweir 318*cdf0e10cSrcweir if (bMove) // set mouse pointer 319*cdf0e10cSrcweir { 320*cdf0e10cSrcweir PointerStyle ePointer = POINTER_PIVOT_DELETE; 321*cdf0e10cSrcweir if ( !bAllowed ) 322*cdf0e10cSrcweir ePointer = POINTER_NOTALLOWED; 323*cdf0e10cSrcweir else if ( bHasRange ) 324*cdf0e10cSrcweir switch (nOrient) 325*cdf0e10cSrcweir { 326*cdf0e10cSrcweir case sheet::DataPilotFieldOrientation_COLUMN: ePointer = POINTER_PIVOT_COL; break; 327*cdf0e10cSrcweir case sheet::DataPilotFieldOrientation_ROW: ePointer = POINTER_PIVOT_ROW; break; 328*cdf0e10cSrcweir case sheet::DataPilotFieldOrientation_PAGE: 329*cdf0e10cSrcweir case sheet::DataPilotFieldOrientation_DATA: ePointer = POINTER_PIVOT_FIELD; break; 330*cdf0e10cSrcweir } 331*cdf0e10cSrcweir SetPointer( ePointer ); 332*cdf0e10cSrcweir } 333*cdf0e10cSrcweir else // execute change 334*cdf0e10cSrcweir { 335*cdf0e10cSrcweir if (!bHasRange) 336*cdf0e10cSrcweir nOrient = sheet::DataPilotFieldOrientation_HIDDEN; 337*cdf0e10cSrcweir 338*cdf0e10cSrcweir if ( bIsDataLayout && ( nOrient != sheet::DataPilotFieldOrientation_COLUMN && 339*cdf0e10cSrcweir nOrient != sheet::DataPilotFieldOrientation_ROW ) ) 340*cdf0e10cSrcweir { 341*cdf0e10cSrcweir // removing data layout is not allowed 342*cdf0e10cSrcweir pViewData->GetView()->ErrorMessage(STR_PIVOT_MOVENOTALLOWED); 343*cdf0e10cSrcweir } 344*cdf0e10cSrcweir else if ( bAllowed ) 345*cdf0e10cSrcweir { 346*cdf0e10cSrcweir ScDPSaveData aSaveData( *pDragDPObj->GetSaveData() ); 347*cdf0e10cSrcweir 348*cdf0e10cSrcweir ScDPSaveDimension* pDim; 349*cdf0e10cSrcweir if ( bIsDataLayout ) 350*cdf0e10cSrcweir pDim = aSaveData.GetDataLayoutDimension(); 351*cdf0e10cSrcweir else 352*cdf0e10cSrcweir pDim = aSaveData.GetDimensionByName(aDimName); 353*cdf0e10cSrcweir pDim->SetOrientation( nOrient ); 354*cdf0e10cSrcweir aSaveData.SetPosition( pDim, nDimPos ); 355*cdf0e10cSrcweir 356*cdf0e10cSrcweir //! docfunc method with ScDPSaveData as argument? 357*cdf0e10cSrcweir 358*cdf0e10cSrcweir ScDPObject aNewObj( *pDragDPObj ); 359*cdf0e10cSrcweir aNewObj.SetSaveData( aSaveData ); 360*cdf0e10cSrcweir ScDBDocFunc aFunc( *pViewData->GetDocShell() ); 361*cdf0e10cSrcweir // when dragging fields, allow re-positioning (bAllowMove) 362*cdf0e10cSrcweir aFunc.DataPilotUpdate( pDragDPObj, &aNewObj, sal_True, sal_False, sal_True ); 363*cdf0e10cSrcweir pViewData->GetView()->CursorPosChanged(); // shells may be switched 364*cdf0e10cSrcweir } 365*cdf0e10cSrcweir } 366*cdf0e10cSrcweir 367*cdf0e10cSrcweir if (bTimer && bMove) 368*cdf0e10cSrcweir pViewData->GetView()->SetTimer( this, rMEvt ); // repeat event 369*cdf0e10cSrcweir else 370*cdf0e10cSrcweir pViewData->GetView()->ResetTimer(); 371*cdf0e10cSrcweir } 372*cdf0e10cSrcweir 373*cdf0e10cSrcweir bool ScGridWindow::DPTestFieldPopupArrow(const MouseEvent& rMEvt, const ScAddress& rPos, ScDPObject* pDPObj) 374*cdf0e10cSrcweir { 375*cdf0e10cSrcweir sal_Bool bLayoutRTL = pViewData->GetDocument()->IsLayoutRTL( pViewData->GetTabNo() ); 376*cdf0e10cSrcweir 377*cdf0e10cSrcweir // Get the geometry of the cell. 378*cdf0e10cSrcweir Point aScrPos = pViewData->GetScrPos(rPos.Col(), rPos.Row(), eWhich); 379*cdf0e10cSrcweir long nSizeX, nSizeY; 380*cdf0e10cSrcweir pViewData->GetMergeSizePixel(rPos.Col(), rPos.Row(), nSizeX, nSizeY); 381*cdf0e10cSrcweir Size aScrSize(nSizeX-1, nSizeY-1); 382*cdf0e10cSrcweir 383*cdf0e10cSrcweir // Check if the mouse cursor is clicking on the popup arrow box. 384*cdf0e10cSrcweir ScDPFieldButton aBtn(this, &GetSettings().GetStyleSettings()); 385*cdf0e10cSrcweir aBtn.setBoundingBox(aScrPos, aScrSize, bLayoutRTL); 386*cdf0e10cSrcweir aBtn.setPopupLeft(false); // DataPilot popup is always right-aligned for now 387*cdf0e10cSrcweir Point aPopupPos; 388*cdf0e10cSrcweir Size aPopupSize; 389*cdf0e10cSrcweir aBtn.getPopupBoundingBox(aPopupPos, aPopupSize); 390*cdf0e10cSrcweir Rectangle aRec(aPopupPos, aPopupSize); 391*cdf0e10cSrcweir if (aRec.IsInside(rMEvt.GetPosPixel())) 392*cdf0e10cSrcweir { 393*cdf0e10cSrcweir // Mouse cursor inside the popup arrow box. Launch the field menu. 394*cdf0e10cSrcweir DPLaunchFieldPopupMenu(OutputToScreenPixel(aScrPos), aScrSize, rPos, pDPObj); 395*cdf0e10cSrcweir return true; 396*cdf0e10cSrcweir } 397*cdf0e10cSrcweir 398*cdf0e10cSrcweir return false; 399*cdf0e10cSrcweir } 400*cdf0e10cSrcweir 401*cdf0e10cSrcweir namespace { 402*cdf0e10cSrcweir 403*cdf0e10cSrcweir struct DPFieldPopupData : public ScDPFieldPopupWindow::ExtendedData 404*cdf0e10cSrcweir { 405*cdf0e10cSrcweir ScPivotParam maDPParam; 406*cdf0e10cSrcweir ScDPObject* mpDPObj; 407*cdf0e10cSrcweir long mnDim; 408*cdf0e10cSrcweir }; 409*cdf0e10cSrcweir 410*cdf0e10cSrcweir class DPFieldPopupOKAction : public ScMenuFloatingWindow::Action 411*cdf0e10cSrcweir { 412*cdf0e10cSrcweir public: 413*cdf0e10cSrcweir explicit DPFieldPopupOKAction(ScGridWindow* p) : 414*cdf0e10cSrcweir mpGridWindow(p) {} 415*cdf0e10cSrcweir 416*cdf0e10cSrcweir virtual void execute() 417*cdf0e10cSrcweir { 418*cdf0e10cSrcweir mpGridWindow->UpdateDPFromFieldPopupMenu(); 419*cdf0e10cSrcweir } 420*cdf0e10cSrcweir private: 421*cdf0e10cSrcweir ScGridWindow* mpGridWindow; 422*cdf0e10cSrcweir }; 423*cdf0e10cSrcweir 424*cdf0e10cSrcweir class PopupSortAction : public ScMenuFloatingWindow::Action 425*cdf0e10cSrcweir { 426*cdf0e10cSrcweir public: 427*cdf0e10cSrcweir enum SortType { ASCENDING, DESCENDING, CUSTOM }; 428*cdf0e10cSrcweir 429*cdf0e10cSrcweir explicit PopupSortAction(const ScAddress& rPos, SortType eType, sal_uInt16 nUserListIndex, ScTabViewShell* pViewShell) : 430*cdf0e10cSrcweir maPos(rPos), meType(eType), mnUserListIndex(nUserListIndex), mpViewShell(pViewShell) {} 431*cdf0e10cSrcweir 432*cdf0e10cSrcweir virtual void execute() 433*cdf0e10cSrcweir { 434*cdf0e10cSrcweir switch (meType) 435*cdf0e10cSrcweir { 436*cdf0e10cSrcweir case ASCENDING: 437*cdf0e10cSrcweir mpViewShell->DataPilotSort(maPos, true); 438*cdf0e10cSrcweir break; 439*cdf0e10cSrcweir case DESCENDING: 440*cdf0e10cSrcweir mpViewShell->DataPilotSort(maPos, false); 441*cdf0e10cSrcweir break; 442*cdf0e10cSrcweir case CUSTOM: 443*cdf0e10cSrcweir mpViewShell->DataPilotSort(maPos, true, &mnUserListIndex); 444*cdf0e10cSrcweir break; 445*cdf0e10cSrcweir default: 446*cdf0e10cSrcweir ; 447*cdf0e10cSrcweir } 448*cdf0e10cSrcweir } 449*cdf0e10cSrcweir 450*cdf0e10cSrcweir private: 451*cdf0e10cSrcweir ScAddress maPos; 452*cdf0e10cSrcweir SortType meType; 453*cdf0e10cSrcweir sal_uInt16 mnUserListIndex; 454*cdf0e10cSrcweir ScTabViewShell* mpViewShell; 455*cdf0e10cSrcweir }; 456*cdf0e10cSrcweir 457*cdf0e10cSrcweir } 458*cdf0e10cSrcweir 459*cdf0e10cSrcweir bool lcl_GetLabelIndex( size_t& rLabelIndex, long nDimension, const ScDPLabelDataVector& rLabelArray ) 460*cdf0e10cSrcweir { 461*cdf0e10cSrcweir size_t n = rLabelArray.size(); 462*cdf0e10cSrcweir for (size_t i = 0; i < n; ++i) 463*cdf0e10cSrcweir if (static_cast<long>(rLabelArray[i].mnCol) == nDimension) 464*cdf0e10cSrcweir { 465*cdf0e10cSrcweir rLabelIndex = i; 466*cdf0e10cSrcweir return true; 467*cdf0e10cSrcweir } 468*cdf0e10cSrcweir return false; 469*cdf0e10cSrcweir } 470*cdf0e10cSrcweir 471*cdf0e10cSrcweir void ScGridWindow::DPLaunchFieldPopupMenu( 472*cdf0e10cSrcweir const Point& rScrPos, const Size& rScrSize, const ScAddress& rPos, ScDPObject* pDPObj) 473*cdf0e10cSrcweir { 474*cdf0e10cSrcweir // We need to get the list of field members. 475*cdf0e10cSrcweir auto_ptr<DPFieldPopupData> pDPData(new DPFieldPopupData); 476*cdf0e10cSrcweir pDPObj->FillLabelData(pDPData->maDPParam); 477*cdf0e10cSrcweir pDPData->mpDPObj = pDPObj; 478*cdf0e10cSrcweir 479*cdf0e10cSrcweir sal_uInt16 nOrient; 480*cdf0e10cSrcweir pDPData->mnDim = pDPObj->GetHeaderDim(rPos, nOrient); 481*cdf0e10cSrcweir 482*cdf0e10cSrcweir // #i116457# FillLabelData skips empty column names, so mnDim can't be used directly as index into maLabelArray. 483*cdf0e10cSrcweir size_t nLabelIndex = 0; 484*cdf0e10cSrcweir if (!lcl_GetLabelIndex( nLabelIndex, pDPData->mnDim, pDPData->maDPParam.maLabelArray )) 485*cdf0e10cSrcweir return; 486*cdf0e10cSrcweir 487*cdf0e10cSrcweir const ScDPLabelData& rLabelData = pDPData->maDPParam.maLabelArray[nLabelIndex]; 488*cdf0e10cSrcweir 489*cdf0e10cSrcweir mpDPFieldPopup.reset(new ScDPFieldPopupWindow(this, pViewData->GetDocument())); 490*cdf0e10cSrcweir mpDPFieldPopup->setName(OUString::createFromAscii("Pivot table field member popup")); 491*cdf0e10cSrcweir mpDPFieldPopup->setExtendedData(pDPData.release()); 492*cdf0e10cSrcweir mpDPFieldPopup->setOKAction(new DPFieldPopupOKAction(this)); 493*cdf0e10cSrcweir { 494*cdf0e10cSrcweir // Populate field members. 495*cdf0e10cSrcweir size_t n = rLabelData.maMembers.size(); 496*cdf0e10cSrcweir mpDPFieldPopup->setMemberSize(n); 497*cdf0e10cSrcweir for (size_t i = 0; i < n; ++i) 498*cdf0e10cSrcweir { 499*cdf0e10cSrcweir const ScDPLabelData::Member& rMem = rLabelData.maMembers[i]; 500*cdf0e10cSrcweir mpDPFieldPopup->addMember(rMem.getDisplayName(), rMem.mbVisible); 501*cdf0e10cSrcweir } 502*cdf0e10cSrcweir mpDPFieldPopup->initMembers(); 503*cdf0e10cSrcweir } 504*cdf0e10cSrcweir 505*cdf0e10cSrcweir vector<OUString> aUserSortNames; 506*cdf0e10cSrcweir ScUserList* pUserList = ScGlobal::GetUserList(); 507*cdf0e10cSrcweir if (pUserList) 508*cdf0e10cSrcweir { 509*cdf0e10cSrcweir sal_uInt16 n = pUserList->GetCount(); 510*cdf0e10cSrcweir aUserSortNames.reserve(n); 511*cdf0e10cSrcweir for (sal_uInt16 i = 0; i < n; ++i) 512*cdf0e10cSrcweir { 513*cdf0e10cSrcweir ScUserListData* pData = static_cast<ScUserListData*>((*pUserList)[i]); 514*cdf0e10cSrcweir aUserSortNames.push_back(pData->GetString()); 515*cdf0e10cSrcweir } 516*cdf0e10cSrcweir } 517*cdf0e10cSrcweir 518*cdf0e10cSrcweir // Populate the menus. 519*cdf0e10cSrcweir ScTabViewShell* pViewShell = pViewData->GetViewShell(); 520*cdf0e10cSrcweir mpDPFieldPopup->addMenuItem( 521*cdf0e10cSrcweir ScRscStrLoader(RID_POPUP_FILTER, STR_MENU_SORT_ASC).GetString(), true, 522*cdf0e10cSrcweir new PopupSortAction(rPos, PopupSortAction::ASCENDING, 0, pViewShell)); 523*cdf0e10cSrcweir mpDPFieldPopup->addMenuItem( 524*cdf0e10cSrcweir ScRscStrLoader(RID_POPUP_FILTER, STR_MENU_SORT_DESC).GetString(), true, 525*cdf0e10cSrcweir new PopupSortAction(rPos, PopupSortAction::DESCENDING, 0, pViewShell)); 526*cdf0e10cSrcweir ScMenuFloatingWindow* pSubMenu = mpDPFieldPopup->addSubMenuItem( 527*cdf0e10cSrcweir ScRscStrLoader(RID_POPUP_FILTER, STR_MENU_SORT_CUSTOM).GetString(), !aUserSortNames.empty()); 528*cdf0e10cSrcweir 529*cdf0e10cSrcweir if (pSubMenu && !aUserSortNames.empty()) 530*cdf0e10cSrcweir { 531*cdf0e10cSrcweir size_t n = aUserSortNames.size(); 532*cdf0e10cSrcweir for (size_t i = 0; i < n; ++i) 533*cdf0e10cSrcweir { 534*cdf0e10cSrcweir pSubMenu->addMenuItem( 535*cdf0e10cSrcweir aUserSortNames[i], true, 536*cdf0e10cSrcweir new PopupSortAction(rPos, PopupSortAction::CUSTOM, static_cast<sal_uInt16>(i), pViewShell)); 537*cdf0e10cSrcweir } 538*cdf0e10cSrcweir } 539*cdf0e10cSrcweir 540*cdf0e10cSrcweir sal_Bool bLayoutRTL = pViewData->GetDocument()->IsLayoutRTL( pViewData->GetTabNo() ); 541*cdf0e10cSrcweir 542*cdf0e10cSrcweir Rectangle aCellRect(rScrPos, rScrSize); 543*cdf0e10cSrcweir const Size& rPopupSize = mpDPFieldPopup->getWindowSize(); 544*cdf0e10cSrcweir if (bLayoutRTL) 545*cdf0e10cSrcweir { 546*cdf0e10cSrcweir // RTL: rScrPos is logical-left (visual right) position, always right-align with that 547*cdf0e10cSrcweir aCellRect.SetPos(Point(rScrPos.X() - rPopupSize.Width() + 1, rScrPos.Y())); 548*cdf0e10cSrcweir } 549*cdf0e10cSrcweir else if (rScrSize.getWidth() > rPopupSize.getWidth()) 550*cdf0e10cSrcweir { 551*cdf0e10cSrcweir // If the cell width is larger than the popup window width, launch it 552*cdf0e10cSrcweir // right-aligned with the cell. 553*cdf0e10cSrcweir long nXOffset = rScrSize.getWidth() - rPopupSize.getWidth(); 554*cdf0e10cSrcweir aCellRect.SetPos(Point(rScrPos.X() + nXOffset, rScrPos.Y())); 555*cdf0e10cSrcweir } 556*cdf0e10cSrcweir mpDPFieldPopup->SetPopupModeEndHdl( LINK(this, ScGridWindow, PopupModeEndHdl) ); 557*cdf0e10cSrcweir mpDPFieldPopup->StartPopupMode(aCellRect, (FLOATWIN_POPUPMODE_DOWN | FLOATWIN_POPUPMODE_GRABFOCUS)); 558*cdf0e10cSrcweir } 559*cdf0e10cSrcweir 560*cdf0e10cSrcweir void ScGridWindow::UpdateDPFromFieldPopupMenu() 561*cdf0e10cSrcweir { 562*cdf0e10cSrcweir typedef hash_map<OUString, OUString, OUStringHash> MemNameMapType; 563*cdf0e10cSrcweir typedef hash_map<OUString, bool, OUStringHash> MemVisibilityType; 564*cdf0e10cSrcweir 565*cdf0e10cSrcweir if (!mpDPFieldPopup.get()) 566*cdf0e10cSrcweir return; 567*cdf0e10cSrcweir 568*cdf0e10cSrcweir DPFieldPopupData* pDPData = static_cast<DPFieldPopupData*>(mpDPFieldPopup->getExtendedData()); 569*cdf0e10cSrcweir if (!pDPData) 570*cdf0e10cSrcweir return; 571*cdf0e10cSrcweir 572*cdf0e10cSrcweir ScDPObject* pDPObj = pDPData->mpDPObj; 573*cdf0e10cSrcweir ScDPObject aNewDPObj(*pDPObj); 574*cdf0e10cSrcweir aNewDPObj.BuildAllDimensionMembers(); 575*cdf0e10cSrcweir ScDPSaveData* pSaveData = aNewDPObj.GetSaveData(); 576*cdf0e10cSrcweir 577*cdf0e10cSrcweir sal_Bool bIsDataLayout; 578*cdf0e10cSrcweir String aDimName = pDPObj->GetDimName(pDPData->mnDim, bIsDataLayout); 579*cdf0e10cSrcweir ScDPSaveDimension* pDim = pSaveData->GetDimensionByName(aDimName); 580*cdf0e10cSrcweir if (!pDim) 581*cdf0e10cSrcweir return; 582*cdf0e10cSrcweir 583*cdf0e10cSrcweir size_t nLabelIndex = 0; 584*cdf0e10cSrcweir lcl_GetLabelIndex( nLabelIndex, pDPData->mnDim, pDPData->maDPParam.maLabelArray ); 585*cdf0e10cSrcweir 586*cdf0e10cSrcweir // Build a map of layout names to original names. 587*cdf0e10cSrcweir const ScDPLabelData& rLabelData = pDPData->maDPParam.maLabelArray[nLabelIndex]; 588*cdf0e10cSrcweir MemNameMapType aMemNameMap; 589*cdf0e10cSrcweir for (vector<ScDPLabelData::Member>::const_iterator itr = rLabelData.maMembers.begin(), itrEnd = rLabelData.maMembers.end(); 590*cdf0e10cSrcweir itr != itrEnd; ++itr) 591*cdf0e10cSrcweir aMemNameMap.insert(MemNameMapType::value_type(itr->maLayoutName, itr->maName)); 592*cdf0e10cSrcweir 593*cdf0e10cSrcweir // The raw result may contain a mixture of layout names and original names. 594*cdf0e10cSrcweir MemVisibilityType aRawResult; 595*cdf0e10cSrcweir mpDPFieldPopup->getResult(aRawResult); 596*cdf0e10cSrcweir 597*cdf0e10cSrcweir MemVisibilityType aResult; 598*cdf0e10cSrcweir for (MemVisibilityType::const_iterator itr = aRawResult.begin(), itrEnd = aRawResult.end(); itr != itrEnd; ++itr) 599*cdf0e10cSrcweir { 600*cdf0e10cSrcweir MemNameMapType::const_iterator itrNameMap = aMemNameMap.find(itr->first); 601*cdf0e10cSrcweir if (itrNameMap == aMemNameMap.end()) 602*cdf0e10cSrcweir // This is an original member name. Use it as-is. 603*cdf0e10cSrcweir aResult.insert(MemVisibilityType::value_type(itr->first, itr->second)); 604*cdf0e10cSrcweir else 605*cdf0e10cSrcweir { 606*cdf0e10cSrcweir // This is a layout name. Get the original member name and use it. 607*cdf0e10cSrcweir aResult.insert(MemVisibilityType::value_type(itrNameMap->second, itr->second)); 608*cdf0e10cSrcweir } 609*cdf0e10cSrcweir } 610*cdf0e10cSrcweir pDim->UpdateMemberVisibility(aResult); 611*cdf0e10cSrcweir 612*cdf0e10cSrcweir ScDBDocFunc aFunc(*pViewData->GetDocShell()); 613*cdf0e10cSrcweir aFunc.DataPilotUpdate(pDPObj, &aNewDPObj, true, false); 614*cdf0e10cSrcweir } 615*cdf0e10cSrcweir 616*cdf0e10cSrcweir void ScGridWindow::DPMouseMove( const MouseEvent& rMEvt ) 617*cdf0e10cSrcweir { 618*cdf0e10cSrcweir DPTestMouse( rMEvt, sal_True ); 619*cdf0e10cSrcweir } 620*cdf0e10cSrcweir 621*cdf0e10cSrcweir void ScGridWindow::DPMouseButtonUp( const MouseEvent& rMEvt ) 622*cdf0e10cSrcweir { 623*cdf0e10cSrcweir bDPMouse = sal_False; 624*cdf0e10cSrcweir ReleaseMouse(); 625*cdf0e10cSrcweir 626*cdf0e10cSrcweir DPTestMouse( rMEvt, sal_False ); 627*cdf0e10cSrcweir SetPointer( Pointer( POINTER_ARROW ) ); 628*cdf0e10cSrcweir } 629*cdf0e10cSrcweir 630*cdf0e10cSrcweir // ----------------------------------------------------------------------- 631*cdf0e10cSrcweir 632*cdf0e10cSrcweir void ScGridWindow::UpdateDragRect( sal_Bool bShowRange, const Rectangle& rPosRect ) 633*cdf0e10cSrcweir { 634*cdf0e10cSrcweir SCCOL nStartX = ( rPosRect.Left() >= 0 ) ? static_cast<SCCOL>(rPosRect.Left()) : SCCOL_MAX; 635*cdf0e10cSrcweir SCROW nStartY = ( rPosRect.Top() >= 0 ) ? static_cast<SCROW>(rPosRect.Top()) : SCROW_MAX; 636*cdf0e10cSrcweir SCCOL nEndX = ( rPosRect.Right() >= 0 ) ? static_cast<SCCOL>(rPosRect.Right()) : SCCOL_MAX; 637*cdf0e10cSrcweir SCROW nEndY = ( rPosRect.Bottom() >= 0 ) ? static_cast<SCROW>(rPosRect.Bottom()) : SCROW_MAX; 638*cdf0e10cSrcweir 639*cdf0e10cSrcweir if ( bShowRange == bDragRect && nDragStartX == nStartX && nDragEndX == nEndX && 640*cdf0e10cSrcweir nDragStartY == nStartY && nDragEndY == nEndY ) 641*cdf0e10cSrcweir { 642*cdf0e10cSrcweir return; // everything unchanged 643*cdf0e10cSrcweir } 644*cdf0e10cSrcweir 645*cdf0e10cSrcweir // if ( bDragRect ) 646*cdf0e10cSrcweir // DrawDragRect( nDragStartX, nDragStartY, nDragEndX, nDragEndY, sal_False ); 647*cdf0e10cSrcweir if ( bShowRange ) 648*cdf0e10cSrcweir { 649*cdf0e10cSrcweir nDragStartX = nStartX; 650*cdf0e10cSrcweir nDragStartY = nStartY; 651*cdf0e10cSrcweir nDragEndX = nEndX; 652*cdf0e10cSrcweir nDragEndY = nEndY; 653*cdf0e10cSrcweir bDragRect = sal_True; 654*cdf0e10cSrcweir // DrawDragRect( nDragStartX, nDragStartY, nDragEndX, nDragEndY, sal_False ); 655*cdf0e10cSrcweir } 656*cdf0e10cSrcweir else 657*cdf0e10cSrcweir bDragRect = sal_False; 658*cdf0e10cSrcweir 659*cdf0e10cSrcweir UpdateDragRectOverlay(); 660*cdf0e10cSrcweir } 661*cdf0e10cSrcweir 662*cdf0e10cSrcweir // ----------------------------------------------------------------------- 663*cdf0e10cSrcweir 664*cdf0e10cSrcweir // Page-Break-Modus 665*cdf0e10cSrcweir 666*cdf0e10cSrcweir sal_uInt16 ScGridWindow::HitPageBreak( const Point& rMouse, ScRange* pSource, 667*cdf0e10cSrcweir SCCOLROW* pBreak, SCCOLROW* pPrev ) 668*cdf0e10cSrcweir { 669*cdf0e10cSrcweir sal_uInt16 nFound = SC_PD_NONE; // 0 670*cdf0e10cSrcweir ScRange aSource; 671*cdf0e10cSrcweir SCCOLROW nBreak = 0; 672*cdf0e10cSrcweir SCCOLROW nPrev = 0; 673*cdf0e10cSrcweir 674*cdf0e10cSrcweir ScPageBreakData* pPageData = pViewData->GetView()->GetPageBreakData(); 675*cdf0e10cSrcweir if ( pPageData ) 676*cdf0e10cSrcweir { 677*cdf0e10cSrcweir sal_Bool bHori = sal_False; 678*cdf0e10cSrcweir sal_Bool bVert = sal_False; 679*cdf0e10cSrcweir SCCOL nHitX = 0; 680*cdf0e10cSrcweir SCROW nHitY = 0; 681*cdf0e10cSrcweir 682*cdf0e10cSrcweir long nMouseX = rMouse.X(); 683*cdf0e10cSrcweir long nMouseY = rMouse.Y(); 684*cdf0e10cSrcweir SCsCOL nPosX; 685*cdf0e10cSrcweir SCsROW nPosY; 686*cdf0e10cSrcweir pViewData->GetPosFromPixel( nMouseX, nMouseY, eWhich, nPosX, nPosY ); 687*cdf0e10cSrcweir Point aTL = pViewData->GetScrPos( nPosX, nPosY, eWhich ); 688*cdf0e10cSrcweir Point aBR = pViewData->GetScrPos( nPosX+1, nPosY+1, eWhich ); 689*cdf0e10cSrcweir 690*cdf0e10cSrcweir // Horizontal mehr Toleranz als vertikal, weil mehr Platz ist 691*cdf0e10cSrcweir if ( nMouseX <= aTL.X() + 4 ) 692*cdf0e10cSrcweir { 693*cdf0e10cSrcweir bHori = sal_True; 694*cdf0e10cSrcweir nHitX = nPosX; 695*cdf0e10cSrcweir } 696*cdf0e10cSrcweir else if ( nMouseX >= aBR.X() - 6 ) 697*cdf0e10cSrcweir { 698*cdf0e10cSrcweir bHori = sal_True; 699*cdf0e10cSrcweir nHitX = nPosX+1; // linker Rand der naechsten Zelle 700*cdf0e10cSrcweir } 701*cdf0e10cSrcweir if ( nMouseY <= aTL.Y() + 2 ) 702*cdf0e10cSrcweir { 703*cdf0e10cSrcweir bVert = sal_True; 704*cdf0e10cSrcweir nHitY = nPosY; 705*cdf0e10cSrcweir } 706*cdf0e10cSrcweir else if ( nMouseY >= aBR.Y() - 4 ) 707*cdf0e10cSrcweir { 708*cdf0e10cSrcweir bVert = sal_True; 709*cdf0e10cSrcweir nHitY = nPosY+1; // oberer Rand der naechsten Zelle 710*cdf0e10cSrcweir } 711*cdf0e10cSrcweir 712*cdf0e10cSrcweir if ( bHori || bVert ) 713*cdf0e10cSrcweir { 714*cdf0e10cSrcweir sal_uInt16 nCount = sal::static_int_cast<sal_uInt16>( pPageData->GetCount() ); 715*cdf0e10cSrcweir for (sal_uInt16 nPos=0; nPos<nCount && !nFound; nPos++) 716*cdf0e10cSrcweir { 717*cdf0e10cSrcweir ScPrintRangeData& rData = pPageData->GetData(nPos); 718*cdf0e10cSrcweir ScRange aRange = rData.GetPrintRange(); 719*cdf0e10cSrcweir sal_Bool bLHit = ( bHori && nHitX == aRange.aStart.Col() ); 720*cdf0e10cSrcweir sal_Bool bRHit = ( bHori && nHitX == aRange.aEnd.Col() + 1 ); 721*cdf0e10cSrcweir sal_Bool bTHit = ( bVert && nHitY == aRange.aStart.Row() ); 722*cdf0e10cSrcweir sal_Bool bBHit = ( bVert && nHitY == aRange.aEnd.Row() + 1 ); 723*cdf0e10cSrcweir sal_Bool bInsideH = ( nPosX >= aRange.aStart.Col() && nPosX <= aRange.aEnd.Col() ); 724*cdf0e10cSrcweir sal_Bool bInsideV = ( nPosY >= aRange.aStart.Row() && nPosY <= aRange.aEnd.Row() ); 725*cdf0e10cSrcweir 726*cdf0e10cSrcweir if ( bLHit ) 727*cdf0e10cSrcweir { 728*cdf0e10cSrcweir if ( bTHit ) 729*cdf0e10cSrcweir nFound = SC_PD_RANGE_TL; 730*cdf0e10cSrcweir else if ( bBHit ) 731*cdf0e10cSrcweir nFound = SC_PD_RANGE_BL; 732*cdf0e10cSrcweir else if ( bInsideV ) 733*cdf0e10cSrcweir nFound = SC_PD_RANGE_L; 734*cdf0e10cSrcweir } 735*cdf0e10cSrcweir else if ( bRHit ) 736*cdf0e10cSrcweir { 737*cdf0e10cSrcweir if ( bTHit ) 738*cdf0e10cSrcweir nFound = SC_PD_RANGE_TR; 739*cdf0e10cSrcweir else if ( bBHit ) 740*cdf0e10cSrcweir nFound = SC_PD_RANGE_BR; 741*cdf0e10cSrcweir else if ( bInsideV ) 742*cdf0e10cSrcweir nFound = SC_PD_RANGE_R; 743*cdf0e10cSrcweir } 744*cdf0e10cSrcweir else if ( bTHit && bInsideH ) 745*cdf0e10cSrcweir nFound = SC_PD_RANGE_T; 746*cdf0e10cSrcweir else if ( bBHit && bInsideH ) 747*cdf0e10cSrcweir nFound = SC_PD_RANGE_B; 748*cdf0e10cSrcweir if (nFound) 749*cdf0e10cSrcweir aSource = aRange; 750*cdf0e10cSrcweir 751*cdf0e10cSrcweir // Umbrueche 752*cdf0e10cSrcweir 753*cdf0e10cSrcweir if ( bVert && bInsideH && !nFound ) 754*cdf0e10cSrcweir { 755*cdf0e10cSrcweir size_t nRowCount = rData.GetPagesY(); 756*cdf0e10cSrcweir const SCROW* pRowEnd = rData.GetPageEndY(); 757*cdf0e10cSrcweir for (size_t nRowPos=0; nRowPos+1<nRowCount; nRowPos++) 758*cdf0e10cSrcweir if ( pRowEnd[nRowPos]+1 == nHitY ) 759*cdf0e10cSrcweir { 760*cdf0e10cSrcweir nFound = SC_PD_BREAK_V; 761*cdf0e10cSrcweir aSource = aRange; 762*cdf0e10cSrcweir nBreak = nHitY; 763*cdf0e10cSrcweir if ( nRowPos ) 764*cdf0e10cSrcweir nPrev = pRowEnd[nRowPos-1]+1; 765*cdf0e10cSrcweir else 766*cdf0e10cSrcweir nPrev = aRange.aStart.Row(); 767*cdf0e10cSrcweir } 768*cdf0e10cSrcweir } 769*cdf0e10cSrcweir if ( bHori && bInsideV && !nFound ) 770*cdf0e10cSrcweir { 771*cdf0e10cSrcweir size_t nColCount = rData.GetPagesX(); 772*cdf0e10cSrcweir const SCCOL* pColEnd = rData.GetPageEndX(); 773*cdf0e10cSrcweir for (size_t nColPos=0; nColPos+1<nColCount; nColPos++) 774*cdf0e10cSrcweir if ( pColEnd[nColPos]+1 == nHitX ) 775*cdf0e10cSrcweir { 776*cdf0e10cSrcweir nFound = SC_PD_BREAK_H; 777*cdf0e10cSrcweir aSource = aRange; 778*cdf0e10cSrcweir nBreak = nHitX; 779*cdf0e10cSrcweir if ( nColPos ) 780*cdf0e10cSrcweir nPrev = pColEnd[nColPos-1]+1; 781*cdf0e10cSrcweir else 782*cdf0e10cSrcweir nPrev = aRange.aStart.Col(); 783*cdf0e10cSrcweir } 784*cdf0e10cSrcweir } 785*cdf0e10cSrcweir } 786*cdf0e10cSrcweir } 787*cdf0e10cSrcweir } 788*cdf0e10cSrcweir 789*cdf0e10cSrcweir if (pSource) 790*cdf0e10cSrcweir *pSource = aSource; // Druckbereich 791*cdf0e10cSrcweir if (pBreak) 792*cdf0e10cSrcweir *pBreak = nBreak; // X/Y Position des verchobenen Seitenumbruchs 793*cdf0e10cSrcweir if (pPrev) 794*cdf0e10cSrcweir *pPrev = nPrev; // X/Y Anfang der Seite, die am Umbruch zuende ist 795*cdf0e10cSrcweir return nFound; 796*cdf0e10cSrcweir } 797*cdf0e10cSrcweir 798*cdf0e10cSrcweir void ScGridWindow::PagebreakMove( const MouseEvent& rMEvt, sal_Bool bUp ) 799*cdf0e10cSrcweir { 800*cdf0e10cSrcweir //! Scrolling und Umschalten mit RFMouseMove zusammenfassen ! 801*cdf0e10cSrcweir //! (Weginvertieren vor dem Scrolling ist anders) 802*cdf0e10cSrcweir 803*cdf0e10cSrcweir // Scrolling 804*cdf0e10cSrcweir 805*cdf0e10cSrcweir sal_Bool bTimer = sal_False; 806*cdf0e10cSrcweir Point aPos = rMEvt.GetPosPixel(); 807*cdf0e10cSrcweir SCsCOL nDx = 0; 808*cdf0e10cSrcweir SCsROW nDy = 0; 809*cdf0e10cSrcweir if ( aPos.X() < 0 ) nDx = -1; 810*cdf0e10cSrcweir if ( aPos.Y() < 0 ) nDy = -1; 811*cdf0e10cSrcweir Size aSize = GetOutputSizePixel(); 812*cdf0e10cSrcweir if ( aPos.X() >= aSize.Width() ) 813*cdf0e10cSrcweir nDx = 1; 814*cdf0e10cSrcweir if ( aPos.Y() >= aSize.Height() ) 815*cdf0e10cSrcweir nDy = 1; 816*cdf0e10cSrcweir if ( nDx != 0 || nDy != 0 ) 817*cdf0e10cSrcweir { 818*cdf0e10cSrcweir if ( bPagebreakDrawn ) // weginvertieren 819*cdf0e10cSrcweir { 820*cdf0e10cSrcweir // DrawDragRect( aPagebreakDrag.aStart.Col(), aPagebreakDrag.aStart.Row(), 821*cdf0e10cSrcweir // aPagebreakDrag.aEnd.Col(), aPagebreakDrag.aEnd.Row(), sal_False ); 822*cdf0e10cSrcweir bPagebreakDrawn = sal_False; 823*cdf0e10cSrcweir UpdateDragRectOverlay(); 824*cdf0e10cSrcweir } 825*cdf0e10cSrcweir 826*cdf0e10cSrcweir if ( nDx != 0 ) pViewData->GetView()->ScrollX( nDx, WhichH(eWhich) ); 827*cdf0e10cSrcweir if ( nDy != 0 ) pViewData->GetView()->ScrollY( nDy, WhichV(eWhich) ); 828*cdf0e10cSrcweir bTimer = sal_True; 829*cdf0e10cSrcweir } 830*cdf0e10cSrcweir 831*cdf0e10cSrcweir // Umschalten bei Fixierung (damit Scrolling funktioniert) 832*cdf0e10cSrcweir 833*cdf0e10cSrcweir if ( eWhich == pViewData->GetActivePart() ) //?? 834*cdf0e10cSrcweir { 835*cdf0e10cSrcweir if ( pViewData->GetHSplitMode() == SC_SPLIT_FIX ) 836*cdf0e10cSrcweir if ( nDx > 0 ) 837*cdf0e10cSrcweir { 838*cdf0e10cSrcweir if ( eWhich == SC_SPLIT_TOPLEFT ) 839*cdf0e10cSrcweir pViewData->GetView()->ActivatePart( SC_SPLIT_TOPRIGHT ); 840*cdf0e10cSrcweir else if ( eWhich == SC_SPLIT_BOTTOMLEFT ) 841*cdf0e10cSrcweir pViewData->GetView()->ActivatePart( SC_SPLIT_BOTTOMRIGHT ); 842*cdf0e10cSrcweir } 843*cdf0e10cSrcweir 844*cdf0e10cSrcweir if ( pViewData->GetVSplitMode() == SC_SPLIT_FIX ) 845*cdf0e10cSrcweir if ( nDy > 0 ) 846*cdf0e10cSrcweir { 847*cdf0e10cSrcweir if ( eWhich == SC_SPLIT_TOPLEFT ) 848*cdf0e10cSrcweir pViewData->GetView()->ActivatePart( SC_SPLIT_BOTTOMLEFT ); 849*cdf0e10cSrcweir else if ( eWhich == SC_SPLIT_TOPRIGHT ) 850*cdf0e10cSrcweir pViewData->GetView()->ActivatePart( SC_SPLIT_BOTTOMRIGHT ); 851*cdf0e10cSrcweir } 852*cdf0e10cSrcweir } 853*cdf0e10cSrcweir 854*cdf0e10cSrcweir // ab hier neu 855*cdf0e10cSrcweir 856*cdf0e10cSrcweir // gesucht wird eine Position zwischen den Zellen (vor nPosX / nPosY) 857*cdf0e10cSrcweir SCsCOL nPosX; 858*cdf0e10cSrcweir SCsROW nPosY; 859*cdf0e10cSrcweir pViewData->GetPosFromPixel( aPos.X(), aPos.Y(), eWhich, nPosX, nPosY ); 860*cdf0e10cSrcweir sal_Bool bLeft, bTop; 861*cdf0e10cSrcweir pViewData->GetMouseQuadrant( aPos, eWhich, nPosX, nPosY, bLeft, bTop ); 862*cdf0e10cSrcweir if ( !bLeft ) ++nPosX; 863*cdf0e10cSrcweir if ( !bTop ) ++nPosY; 864*cdf0e10cSrcweir 865*cdf0e10cSrcweir sal_Bool bBreak = ( nPagebreakMouse == SC_PD_BREAK_H || nPagebreakMouse == SC_PD_BREAK_V ); 866*cdf0e10cSrcweir sal_Bool bHide = sal_False; 867*cdf0e10cSrcweir sal_Bool bToEnd = sal_False; 868*cdf0e10cSrcweir ScRange aDrawRange = aPagebreakSource; 869*cdf0e10cSrcweir if ( bBreak ) 870*cdf0e10cSrcweir { 871*cdf0e10cSrcweir if ( nPagebreakMouse == SC_PD_BREAK_H ) 872*cdf0e10cSrcweir { 873*cdf0e10cSrcweir if ( nPosX > aPagebreakSource.aStart.Col() && 874*cdf0e10cSrcweir nPosX <= aPagebreakSource.aEnd.Col() + 1 ) // ans Ende ist auch erlaubt 875*cdf0e10cSrcweir { 876*cdf0e10cSrcweir bToEnd = ( nPosX == aPagebreakSource.aEnd.Col() + 1 ); 877*cdf0e10cSrcweir aDrawRange.aStart.SetCol( nPosX ); 878*cdf0e10cSrcweir aDrawRange.aEnd.SetCol( nPosX - 1 ); 879*cdf0e10cSrcweir } 880*cdf0e10cSrcweir else 881*cdf0e10cSrcweir bHide = sal_True; 882*cdf0e10cSrcweir } 883*cdf0e10cSrcweir else 884*cdf0e10cSrcweir { 885*cdf0e10cSrcweir if ( nPosY > aPagebreakSource.aStart.Row() && 886*cdf0e10cSrcweir nPosY <= aPagebreakSource.aEnd.Row() + 1 ) // ans Ende ist auch erlaubt 887*cdf0e10cSrcweir { 888*cdf0e10cSrcweir bToEnd = ( nPosY == aPagebreakSource.aEnd.Row() + 1 ); 889*cdf0e10cSrcweir aDrawRange.aStart.SetRow( nPosY ); 890*cdf0e10cSrcweir aDrawRange.aEnd.SetRow( nPosY - 1 ); 891*cdf0e10cSrcweir } 892*cdf0e10cSrcweir else 893*cdf0e10cSrcweir bHide = sal_True; 894*cdf0e10cSrcweir } 895*cdf0e10cSrcweir } 896*cdf0e10cSrcweir else 897*cdf0e10cSrcweir { 898*cdf0e10cSrcweir if ( nPagebreakMouse & SC_PD_RANGE_L ) 899*cdf0e10cSrcweir aDrawRange.aStart.SetCol( nPosX ); 900*cdf0e10cSrcweir if ( nPagebreakMouse & SC_PD_RANGE_T ) 901*cdf0e10cSrcweir aDrawRange.aStart.SetRow( nPosY ); 902*cdf0e10cSrcweir if ( nPagebreakMouse & SC_PD_RANGE_R ) 903*cdf0e10cSrcweir { 904*cdf0e10cSrcweir if ( nPosX > 0 ) 905*cdf0e10cSrcweir aDrawRange.aEnd.SetCol( nPosX-1 ); 906*cdf0e10cSrcweir else 907*cdf0e10cSrcweir bHide = sal_True; 908*cdf0e10cSrcweir } 909*cdf0e10cSrcweir if ( nPagebreakMouse & SC_PD_RANGE_B ) 910*cdf0e10cSrcweir { 911*cdf0e10cSrcweir if ( nPosY > 0 ) 912*cdf0e10cSrcweir aDrawRange.aEnd.SetRow( nPosY-1 ); 913*cdf0e10cSrcweir else 914*cdf0e10cSrcweir bHide = sal_True; 915*cdf0e10cSrcweir } 916*cdf0e10cSrcweir if ( aDrawRange.aStart.Col() > aDrawRange.aEnd.Col() || 917*cdf0e10cSrcweir aDrawRange.aStart.Row() > aDrawRange.aEnd.Row() ) 918*cdf0e10cSrcweir bHide = sal_True; 919*cdf0e10cSrcweir } 920*cdf0e10cSrcweir 921*cdf0e10cSrcweir if ( !bPagebreakDrawn || bUp || aDrawRange != aPagebreakDrag ) 922*cdf0e10cSrcweir { 923*cdf0e10cSrcweir // zeichnen... 924*cdf0e10cSrcweir 925*cdf0e10cSrcweir if ( bPagebreakDrawn ) 926*cdf0e10cSrcweir { 927*cdf0e10cSrcweir // weginvertieren 928*cdf0e10cSrcweir // DrawDragRect( aPagebreakDrag.aStart.Col(), aPagebreakDrag.aStart.Row(), 929*cdf0e10cSrcweir // aPagebreakDrag.aEnd.Col(), aPagebreakDrag.aEnd.Row(), sal_False ); 930*cdf0e10cSrcweir bPagebreakDrawn = sal_False; 931*cdf0e10cSrcweir } 932*cdf0e10cSrcweir aPagebreakDrag = aDrawRange; 933*cdf0e10cSrcweir if ( !bUp && !bHide ) 934*cdf0e10cSrcweir { 935*cdf0e10cSrcweir // hininvertieren 936*cdf0e10cSrcweir // DrawDragRect( aPagebreakDrag.aStart.Col(), aPagebreakDrag.aStart.Row(), 937*cdf0e10cSrcweir // aPagebreakDrag.aEnd.Col(), aPagebreakDrag.aEnd.Row(), sal_False ); 938*cdf0e10cSrcweir bPagebreakDrawn = sal_True; 939*cdf0e10cSrcweir } 940*cdf0e10cSrcweir UpdateDragRectOverlay(); 941*cdf0e10cSrcweir } 942*cdf0e10cSrcweir 943*cdf0e10cSrcweir // bei ButtonUp die Aenderung ausfuehren 944*cdf0e10cSrcweir 945*cdf0e10cSrcweir if ( bUp ) 946*cdf0e10cSrcweir { 947*cdf0e10cSrcweir ScViewFunc* pViewFunc = pViewData->GetView(); 948*cdf0e10cSrcweir ScDocShell* pDocSh = pViewData->GetDocShell(); 949*cdf0e10cSrcweir ScDocument* pDoc = pDocSh->GetDocument(); 950*cdf0e10cSrcweir SCTAB nTab = pViewData->GetTabNo(); 951*cdf0e10cSrcweir sal_Bool bUndo (pDoc->IsUndoEnabled()); 952*cdf0e10cSrcweir 953*cdf0e10cSrcweir if ( bBreak ) 954*cdf0e10cSrcweir { 955*cdf0e10cSrcweir sal_Bool bColumn = ( nPagebreakMouse == SC_PD_BREAK_H ); 956*cdf0e10cSrcweir SCCOLROW nNew = bColumn ? static_cast<SCCOLROW>(nPosX) : static_cast<SCCOLROW>(nPosY); 957*cdf0e10cSrcweir if ( nNew != nPagebreakBreak ) 958*cdf0e10cSrcweir { 959*cdf0e10cSrcweir if (bUndo) 960*cdf0e10cSrcweir { 961*cdf0e10cSrcweir String aUndo = ScGlobal::GetRscString( STR_UNDO_DRAG_BREAK ); 962*cdf0e10cSrcweir pDocSh->GetUndoManager()->EnterListAction( aUndo, aUndo ); 963*cdf0e10cSrcweir } 964*cdf0e10cSrcweir 965*cdf0e10cSrcweir sal_Bool bGrow = !bHide && nNew > nPagebreakBreak; 966*cdf0e10cSrcweir if ( bColumn ) 967*cdf0e10cSrcweir { 968*cdf0e10cSrcweir if (pDoc->HasColBreak(static_cast<SCCOL>(nPagebreakBreak), nTab) & BREAK_MANUAL) 969*cdf0e10cSrcweir { 970*cdf0e10cSrcweir ScAddress aOldAddr( static_cast<SCCOL>(nPagebreakBreak), nPosY, nTab ); 971*cdf0e10cSrcweir pViewFunc->DeletePageBreak( sal_True, sal_True, &aOldAddr, sal_False ); 972*cdf0e10cSrcweir } 973*cdf0e10cSrcweir if ( !bHide && !bToEnd ) // am Ende nicht 974*cdf0e10cSrcweir { 975*cdf0e10cSrcweir ScAddress aNewAddr( static_cast<SCCOL>(nNew), nPosY, nTab ); 976*cdf0e10cSrcweir pViewFunc->InsertPageBreak( sal_True, sal_True, &aNewAddr, sal_False ); 977*cdf0e10cSrcweir } 978*cdf0e10cSrcweir if ( bGrow ) 979*cdf0e10cSrcweir { 980*cdf0e10cSrcweir // vorigen Break auf hart, und Skalierung aendern 981*cdf0e10cSrcweir bool bManualBreak = (pDoc->HasColBreak(static_cast<SCCOL>(nPagebreakPrev), nTab) & BREAK_MANUAL); 982*cdf0e10cSrcweir if ( static_cast<SCCOL>(nPagebreakPrev) > aPagebreakSource.aStart.Col() && !bManualBreak ) 983*cdf0e10cSrcweir { 984*cdf0e10cSrcweir ScAddress aPrev( static_cast<SCCOL>(nPagebreakPrev), nPosY, nTab ); 985*cdf0e10cSrcweir pViewFunc->InsertPageBreak( sal_True, sal_True, &aPrev, sal_False ); 986*cdf0e10cSrcweir } 987*cdf0e10cSrcweir 988*cdf0e10cSrcweir if (!pDocSh->AdjustPrintZoom( ScRange( 989*cdf0e10cSrcweir static_cast<SCCOL>(nPagebreakPrev),0,nTab, static_cast<SCCOL>(nNew-1),0,nTab ) )) 990*cdf0e10cSrcweir bGrow = sal_False; 991*cdf0e10cSrcweir } 992*cdf0e10cSrcweir } 993*cdf0e10cSrcweir else 994*cdf0e10cSrcweir { 995*cdf0e10cSrcweir if (pDoc->HasRowBreak(nPagebreakBreak, nTab) & BREAK_MANUAL) 996*cdf0e10cSrcweir { 997*cdf0e10cSrcweir ScAddress aOldAddr( nPosX, nPagebreakBreak, nTab ); 998*cdf0e10cSrcweir pViewFunc->DeletePageBreak( sal_False, sal_True, &aOldAddr, sal_False ); 999*cdf0e10cSrcweir } 1000*cdf0e10cSrcweir if ( !bHide && !bToEnd ) // am Ende nicht 1001*cdf0e10cSrcweir { 1002*cdf0e10cSrcweir ScAddress aNewAddr( nPosX, nNew, nTab ); 1003*cdf0e10cSrcweir pViewFunc->InsertPageBreak( sal_False, sal_True, &aNewAddr, sal_False ); 1004*cdf0e10cSrcweir } 1005*cdf0e10cSrcweir if ( bGrow ) 1006*cdf0e10cSrcweir { 1007*cdf0e10cSrcweir // vorigen Break auf hart, und Skalierung aendern 1008*cdf0e10cSrcweir bool bManualBreak = (pDoc->HasRowBreak(nPagebreakPrev, nTab) & BREAK_MANUAL); 1009*cdf0e10cSrcweir if ( nPagebreakPrev > aPagebreakSource.aStart.Row() && !bManualBreak ) 1010*cdf0e10cSrcweir { 1011*cdf0e10cSrcweir ScAddress aPrev( nPosX, nPagebreakPrev, nTab ); 1012*cdf0e10cSrcweir pViewFunc->InsertPageBreak( sal_False, sal_True, &aPrev, sal_False ); 1013*cdf0e10cSrcweir } 1014*cdf0e10cSrcweir 1015*cdf0e10cSrcweir if (!pDocSh->AdjustPrintZoom( ScRange( 1016*cdf0e10cSrcweir 0,nPagebreakPrev,nTab, 0,nNew-1,nTab ) )) 1017*cdf0e10cSrcweir bGrow = sal_False; 1018*cdf0e10cSrcweir } 1019*cdf0e10cSrcweir } 1020*cdf0e10cSrcweir 1021*cdf0e10cSrcweir if (bUndo) 1022*cdf0e10cSrcweir { 1023*cdf0e10cSrcweir pDocSh->GetUndoManager()->LeaveListAction(); 1024*cdf0e10cSrcweir } 1025*cdf0e10cSrcweir 1026*cdf0e10cSrcweir if (!bGrow) // sonst in AdjustPrintZoom schon passiert 1027*cdf0e10cSrcweir { 1028*cdf0e10cSrcweir pViewFunc->UpdatePageBreakData( sal_True ); 1029*cdf0e10cSrcweir pDocSh->SetDocumentModified(); 1030*cdf0e10cSrcweir } 1031*cdf0e10cSrcweir } 1032*cdf0e10cSrcweir } 1033*cdf0e10cSrcweir else if ( bHide || aPagebreakDrag != aPagebreakSource ) 1034*cdf0e10cSrcweir { 1035*cdf0e10cSrcweir // Druckbereich setzen 1036*cdf0e10cSrcweir 1037*cdf0e10cSrcweir String aNewRanges; 1038*cdf0e10cSrcweir sal_uInt16 nOldCount = pDoc->GetPrintRangeCount( nTab ); 1039*cdf0e10cSrcweir if ( nOldCount ) 1040*cdf0e10cSrcweir { 1041*cdf0e10cSrcweir for (sal_uInt16 nPos=0; nPos<nOldCount; nPos++) 1042*cdf0e10cSrcweir { 1043*cdf0e10cSrcweir const ScRange* pOld = pDoc->GetPrintRange( nTab, nPos ); 1044*cdf0e10cSrcweir if ( pOld ) 1045*cdf0e10cSrcweir { 1046*cdf0e10cSrcweir String aTemp; 1047*cdf0e10cSrcweir if ( *pOld != aPagebreakSource ) 1048*cdf0e10cSrcweir pOld->Format( aTemp, SCA_VALID ); 1049*cdf0e10cSrcweir else if ( !bHide ) 1050*cdf0e10cSrcweir aPagebreakDrag.Format( aTemp, SCA_VALID ); 1051*cdf0e10cSrcweir if (aTemp.Len()) 1052*cdf0e10cSrcweir { 1053*cdf0e10cSrcweir if ( aNewRanges.Len() ) 1054*cdf0e10cSrcweir aNewRanges += ';'; 1055*cdf0e10cSrcweir aNewRanges += aTemp; 1056*cdf0e10cSrcweir } 1057*cdf0e10cSrcweir } 1058*cdf0e10cSrcweir } 1059*cdf0e10cSrcweir } 1060*cdf0e10cSrcweir else if (!bHide) 1061*cdf0e10cSrcweir aPagebreakDrag.Format( aNewRanges, SCA_VALID ); 1062*cdf0e10cSrcweir 1063*cdf0e10cSrcweir pViewFunc->SetPrintRanges( pDoc->IsPrintEntireSheet( nTab ), &aNewRanges, NULL, NULL, sal_False ); 1064*cdf0e10cSrcweir } 1065*cdf0e10cSrcweir } 1066*cdf0e10cSrcweir 1067*cdf0e10cSrcweir // Timer fuer Scrolling 1068*cdf0e10cSrcweir 1069*cdf0e10cSrcweir if (bTimer && !bUp) 1070*cdf0e10cSrcweir pViewData->GetView()->SetTimer( this, rMEvt ); // Event wiederholen 1071*cdf0e10cSrcweir else 1072*cdf0e10cSrcweir pViewData->GetView()->ResetTimer(); 1073*cdf0e10cSrcweir } 1074*cdf0e10cSrcweir 1075*cdf0e10cSrcweir 1076*cdf0e10cSrcweir 1077*cdf0e10cSrcweir 1078