summaryrefslogtreecommitdiff
path: root/sc/source/ui/view/gridwin2.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/ui/view/gridwin2.cxx')
-rw-r--r--sc/source/ui/view/gridwin2.cxx1066
1 files changed, 0 insertions, 1066 deletions
diff --git a/sc/source/ui/view/gridwin2.cxx b/sc/source/ui/view/gridwin2.cxx
deleted file mode 100644
index b67d0aa3d..000000000
--- a/sc/source/ui/view/gridwin2.cxx
+++ /dev/null
@@ -1,1066 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_sc.hxx"
-
-
-
-// INCLUDE ---------------------------------------------------------------
-
-#include "scitems.hxx"
-#include <vcl/msgbox.hxx>
-#include <vcl/sound.hxx>
-
-#include "gridwin.hxx"
-#include "tabvwsh.hxx"
-#include "docsh.hxx"
-#include "viewdata.hxx"
-#include "pivot.hxx"
-#include "uiitems.hxx"
-#include "scresid.hxx"
-#include "sc.hrc"
-#include "globstr.hrc"
-#include "pagedata.hxx"
-#include "dpobject.hxx"
-#include "dpsave.hxx"
-#include "dpoutput.hxx" // ScDPPositionData
-#include "dpshttab.hxx"
-#include "dbdocfun.hxx"
-#include "dpcontrol.hxx"
-#include "dpcontrol.hrc"
-#include "strload.hxx"
-#include "userlist.hxx"
-
-#include <com/sun/star/sheet/DataPilotFieldOrientation.hpp>
-#include "scabstdlg.hxx"
-
-#include <vector>
-#include <boost/unordered_map.hpp>
-
-using namespace com::sun::star;
-using ::com::sun::star::sheet::DataPilotFieldOrientation;
-using ::std::vector;
-using ::std::auto_ptr;
-using ::boost::unordered_map;
-using ::rtl::OUString;
-using ::rtl::OUStringHash;
-
-// STATIC DATA -----------------------------------------------------------
-
-// -----------------------------------------------------------------------
-
-DataPilotFieldOrientation ScGridWindow::GetDPFieldOrientation( SCCOL nCol, SCROW nRow ) const
-{
- using namespace ::com::sun::star::sheet;
-
- ScDocument* pDoc = pViewData->GetDocument();
- SCTAB nTab = pViewData->GetTabNo();
- ScDPObject* pDPObj = pDoc->GetDPAtCursor(nCol, nRow, nTab);
- if (!pDPObj)
- return DataPilotFieldOrientation_HIDDEN;
-
- sal_uInt16 nOrient = DataPilotFieldOrientation_HIDDEN;
-
- // Check for page field first.
- if (nCol > 0)
- {
- // look for the dimension header left of the drop-down arrow
- long nField = pDPObj->GetHeaderDim( ScAddress( nCol-1, nRow, nTab ), nOrient );
- if ( nField >= 0 && nOrient == DataPilotFieldOrientation_PAGE )
- {
- bool bIsDataLayout = false;
- OUString aFieldName = pDPObj->GetDimName( nField, bIsDataLayout );
- if ( !aFieldName.isEmpty() && !bIsDataLayout )
- return DataPilotFieldOrientation_PAGE;
- }
- }
-
- nOrient = sheet::DataPilotFieldOrientation_HIDDEN;
-
- // Now, check for row/column field.
- long nField = pDPObj->GetHeaderDim(ScAddress(nCol, nRow, nTab), nOrient);
- if (nField >= 0 && (nOrient == DataPilotFieldOrientation_COLUMN || nOrient == DataPilotFieldOrientation_ROW) )
- {
- bool bIsDataLayout = false;
- OUString aFieldName = pDPObj->GetDimName(nField, bIsDataLayout);
- if (!aFieldName.isEmpty() && !bIsDataLayout)
- return static_cast<DataPilotFieldOrientation>(nOrient);
- }
-
- return DataPilotFieldOrientation_HIDDEN;
-}
-
-// private method for mouse button handling
-sal_Bool ScGridWindow::DoPageFieldSelection( SCCOL nCol, SCROW nRow )
-{
- if (GetDPFieldOrientation( nCol, nRow ) == sheet::DataPilotFieldOrientation_PAGE)
- {
- LaunchPageFieldMenu( nCol, nRow );
- return sal_True;
- }
- return false;
-}
-
-bool ScGridWindow::DoAutoFilterButton( SCCOL nCol, SCROW nRow, const MouseEvent& rMEvt )
-{
- ScDocument* pDoc = pViewData->GetDocument();
- SCTAB nTab = pViewData->GetTabNo();
- Point aScrPos = pViewData->GetScrPos(nCol, nRow, eWhich);
- Point aDiffPix = rMEvt.GetPosPixel();
-
- aDiffPix -= aScrPos;
- sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nTab );
- if ( bLayoutRTL )
- aDiffPix.X() = -aDiffPix.X();
-
- long nSizeX, nSizeY;
- pViewData->GetMergeSizePixel( nCol, nRow, nSizeX, nSizeY );
- Size aScrSize(nSizeX-1, nSizeY-1);
-
- // Check if the mouse cursor is clicking on the popup arrow box.
- mpFilterButton.reset(new ScDPFieldButton(this, &GetSettings().GetStyleSettings(), &pViewData->GetZoomX(), &pViewData->GetZoomY(), pDoc));
- mpFilterButton->setBoundingBox(aScrPos, aScrSize, bLayoutRTL);
- mpFilterButton->setPopupLeft(bLayoutRTL); // #i114944# AutoFilter button is left-aligned in RTL
- Point aPopupPos;
- Size aPopupSize;
- mpFilterButton->getPopupBoundingBox(aPopupPos, aPopupSize);
- Rectangle aRec(aPopupPos, aPopupSize);
- if (aRec.IsInside(rMEvt.GetPosPixel()))
- {
- if ( DoPageFieldSelection( nCol, nRow ) )
- return true;
-
- bool bFilterActive = IsAutoFilterActive(nCol, nRow, nTab);
- mpFilterButton->setHasHiddenMember(bFilterActive);
- mpFilterButton->setDrawBaseButton(false);
- mpFilterButton->setDrawPopupButton(true);
- mpFilterButton->setPopupPressed(true);
- HideCursor();
- mpFilterButton->draw();
- ShowCursor();
- DoAutoFilterMenue(nCol, nRow, false);
- return true;
- }
-
- return false;
-}
-
-void ScGridWindow::DoPushButton( SCCOL nCol, SCROW nRow, const MouseEvent& rMEvt )
-{
- ScDocument* pDoc = pViewData->GetDocument();
- SCTAB nTab = pViewData->GetTabNo();
-
- ScDPObject* pDPObj = pDoc->GetDPAtCursor(nCol, nRow, nTab);
-
- if (pDPObj)
- {
- sal_uInt16 nOrient = sheet::DataPilotFieldOrientation_HIDDEN;
- ScAddress aPos( nCol, nRow, nTab );
- long nField = pDPObj->GetHeaderDim( aPos, nOrient );
- if ( nField >= 0 )
- {
- bDPMouse = sal_True;
- nDPField = nField;
- pDragDPObj = pDPObj;
-
- if (DPTestFieldPopupArrow(rMEvt, aPos, pDPObj))
- {
- // field name pop up menu has been launched. Don't activate
- // field move.
- bDPMouse = false;
- return;
- }
-
- DPTestMouse( rMEvt, sal_True );
- StartTracking();
- }
- else if ( pDPObj->IsFilterButton(aPos) )
- {
- ReleaseMouse(); // may have been captured in ButtonDown
-
- ScQueryParam aQueryParam;
- SCTAB nSrcTab = 0;
- const ScSheetSourceDesc* pDesc = pDPObj->GetSheetDesc();
- OSL_ENSURE(pDesc, "no sheet source for filter button");
- if (pDesc)
- {
- aQueryParam = pDesc->GetQueryParam();
- nSrcTab = pDesc->GetSourceRange().aStart.Tab();
- }
-
- SfxItemSet aArgSet( pViewData->GetViewShell()->GetPool(),
- SCITEM_QUERYDATA, SCITEM_QUERYDATA );
- aArgSet.Put( ScQueryItem( SCITEM_QUERYDATA, pViewData, &aQueryParam ) );
-
- ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
- OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
-
- AbstractScPivotFilterDlg* pDlg = pFact->CreateScPivotFilterDlg( pViewData->GetViewShell()->GetDialogParent(),
- aArgSet, nSrcTab,
- RID_SCDLG_PIVOTFILTER);
- OSL_ENSURE(pDlg, "Dialog create fail!");
- if ( pDlg->Execute() == RET_OK )
- {
- ScSheetSourceDesc aNewDesc(pDoc);
- if (pDesc)
- aNewDesc = *pDesc;
-
- const ScQueryItem& rQueryItem = pDlg->GetOutputItem();
- aNewDesc.SetQueryParam(rQueryItem.GetQueryData());
-
- ScDPObject aNewObj( *pDPObj );
- aNewObj.SetSheetDesc( aNewDesc );
- ScDBDocFunc aFunc( *pViewData->GetDocShell() );
- aFunc.DataPilotUpdate( pDPObj, &aNewObj, sal_True, false );
- pViewData->GetView()->CursorPosChanged(); // shells may be switched
- }
- delete pDlg;
- }
- else
- Sound::Beep();
- }
- else
- {
- OSL_FAIL("Da is ja garnix");
- }
-}
-
-// -----------------------------------------------------------------------
-//
-// Data Pilot interaction
-//
-
-void ScGridWindow::DPTestMouse( const MouseEvent& rMEvt, sal_Bool bMove )
-{
- OSL_ENSURE(pDragDPObj, "pDragDPObj missing");
-
- // scroll window if at edges
- //! move this to separate method
-
- sal_Bool bTimer = false;
- Point aPixel = rMEvt.GetPosPixel();
-
- SCsCOL nDx = 0;
- SCsROW nDy = 0;
- if ( aPixel.X() < 0 )
- nDx = -1;
- if ( aPixel.Y() < 0 )
- nDy = -1;
- Size aSize = GetOutputSizePixel();
- if ( aPixel.X() >= aSize.Width() )
- nDx = 1;
- if ( aPixel.Y() >= aSize.Height() )
- nDy = 1;
- if ( nDx != 0 || nDy != 0 )
- {
- UpdateDragRect( false, Rectangle() );
-
- if ( nDx != 0)
- pViewData->GetView()->ScrollX( nDx, WhichH(eWhich) );
- if ( nDy != 0 )
- pViewData->GetView()->ScrollY( nDy, WhichV(eWhich) );
-
- bTimer = sal_True;
- }
-
- // ---
-
- SCsCOL nPosX;
- SCsROW nPosY;
- pViewData->GetPosFromPixel( aPixel.X(), aPixel.Y(), eWhich, nPosX, nPosY );
- sal_Bool bMouseLeft;
- sal_Bool bMouseTop;
- pViewData->GetMouseQuadrant( aPixel, eWhich, nPosX, nPosY, bMouseLeft, bMouseTop );
-
- ScAddress aPos( nPosX, nPosY, pViewData->GetTabNo() );
-
- Rectangle aPosRect;
- sal_uInt16 nOrient;
- long nDimPos;
- sal_Bool bHasRange = pDragDPObj->GetHeaderDrag( aPos, bMouseLeft, bMouseTop, nDPField,
- aPosRect, nOrient, nDimPos );
- UpdateDragRect( bHasRange && bMove, aPosRect );
-
- bool bIsDataLayout;
- sal_Int32 nDimFlags = 0;
- OUString aDimName = pDragDPObj->GetDimName( nDPField, bIsDataLayout, &nDimFlags );
- bool bAllowed = !bHasRange || ScDPObject::IsOrientationAllowed( nOrient, nDimFlags );
-
- if (bMove) // set mouse pointer
- {
- PointerStyle ePointer = POINTER_PIVOT_DELETE;
- if ( !bAllowed )
- ePointer = POINTER_NOTALLOWED;
- else if ( bHasRange )
- switch (nOrient)
- {
- case sheet::DataPilotFieldOrientation_COLUMN: ePointer = POINTER_PIVOT_COL; break;
- case sheet::DataPilotFieldOrientation_ROW: ePointer = POINTER_PIVOT_ROW; break;
- case sheet::DataPilotFieldOrientation_PAGE:
- case sheet::DataPilotFieldOrientation_DATA: ePointer = POINTER_PIVOT_FIELD; break;
- }
- SetPointer( ePointer );
- }
- else // execute change
- {
- if (!bHasRange)
- nOrient = sheet::DataPilotFieldOrientation_HIDDEN;
-
- if ( bIsDataLayout && ( nOrient != sheet::DataPilotFieldOrientation_COLUMN &&
- nOrient != sheet::DataPilotFieldOrientation_ROW ) )
- {
- // removing data layout is not allowed
- pViewData->GetView()->ErrorMessage(STR_PIVOT_MOVENOTALLOWED);
- }
- else if ( bAllowed )
- {
- ScDPSaveData aSaveData( *pDragDPObj->GetSaveData() );
-
- ScDPSaveDimension* pDim;
- if ( bIsDataLayout )
- pDim = aSaveData.GetDataLayoutDimension();
- else
- pDim = aSaveData.GetDimensionByName(aDimName);
- pDim->SetOrientation( nOrient );
- aSaveData.SetPosition( pDim, nDimPos );
-
- //! docfunc method with ScDPSaveData as argument?
-
- ScDPObject aNewObj( *pDragDPObj );
- aNewObj.SetSaveData( aSaveData );
- ScDBDocFunc aFunc( *pViewData->GetDocShell() );
- // when dragging fields, allow re-positioning (bAllowMove)
- aFunc.DataPilotUpdate( pDragDPObj, &aNewObj, sal_True, false, sal_True );
- pViewData->GetView()->CursorPosChanged(); // shells may be switched
- }
- }
-
- if (bTimer && bMove)
- pViewData->GetView()->SetTimer( this, rMEvt ); // repeat event
- else
- pViewData->GetView()->ResetTimer();
-}
-
-bool ScGridWindow::DPTestFieldPopupArrow(const MouseEvent& rMEvt, const ScAddress& rPos, ScDPObject* pDPObj)
-{
- sal_Bool bLayoutRTL = pViewData->GetDocument()->IsLayoutRTL( pViewData->GetTabNo() );
-
- // Get the geometry of the cell.
- Point aScrPos = pViewData->GetScrPos(rPos.Col(), rPos.Row(), eWhich);
- long nSizeX, nSizeY;
- pViewData->GetMergeSizePixel(rPos.Col(), rPos.Row(), nSizeX, nSizeY);
- Size aScrSize(nSizeX-1, nSizeY-1);
-
- // Check if the mouse cursor is clicking on the popup arrow box.
- ScDPFieldButton aBtn(this, &GetSettings().GetStyleSettings());
- aBtn.setBoundingBox(aScrPos, aScrSize, bLayoutRTL);
- aBtn.setPopupLeft(false); // DataPilot popup is always right-aligned for now
- Point aPopupPos;
- Size aPopupSize;
- aBtn.getPopupBoundingBox(aPopupPos, aPopupSize);
- Rectangle aRec(aPopupPos, aPopupSize);
- if (aRec.IsInside(rMEvt.GetPosPixel()))
- {
- // Mouse cursor inside the popup arrow box. Launch the field menu.
- DPLaunchFieldPopupMenu(OutputToScreenPixel(aScrPos), aScrSize, rPos, pDPObj);
- return true;
- }
-
- return false;
-}
-
-namespace {
-
-struct DPFieldPopupData : public ScDPFieldPopupWindow::ExtendedData
-{
- ScPivotParam maDPParam;
- ScDPObject* mpDPObj;
- long mnDim;
-};
-
-class DPFieldPopupOKAction : public ScMenuFloatingWindow::Action
-{
-public:
- explicit DPFieldPopupOKAction(ScGridWindow* p) :
- mpGridWindow(p) {}
-
- virtual void execute()
- {
- mpGridWindow->UpdateDPFromFieldPopupMenu();
- }
-private:
- ScGridWindow* mpGridWindow;
-};
-
-class PopupSortAction : public ScMenuFloatingWindow::Action
-{
-public:
- enum SortType { ASCENDING, DESCENDING, CUSTOM };
-
- explicit PopupSortAction(const ScAddress& rPos, SortType eType, sal_uInt16 nUserListIndex, ScTabViewShell* pViewShell) :
- maPos(rPos), meType(eType), mnUserListIndex(nUserListIndex), mpViewShell(pViewShell) {}
-
- virtual void execute()
- {
- switch (meType)
- {
- case ASCENDING:
- mpViewShell->DataPilotSort(maPos, true);
- break;
- case DESCENDING:
- mpViewShell->DataPilotSort(maPos, false);
- break;
- case CUSTOM:
- mpViewShell->DataPilotSort(maPos, true, &mnUserListIndex);
- break;
- default:
- ;
- }
- }
-
-private:
- ScAddress maPos;
- SortType meType;
- sal_uInt16 mnUserListIndex;
- ScTabViewShell* mpViewShell;
-};
-
-}
-
-void ScGridWindow::DPLaunchFieldPopupMenu(
- const Point& rScrPos, const Size& rScrSize, const ScAddress& rPos, ScDPObject* pDPObj)
-{
- // We need to get the list of field members.
- auto_ptr<DPFieldPopupData> pDPData(new DPFieldPopupData);
- pDPObj->FillLabelData(pDPData->maDPParam);
- pDPData->mpDPObj = pDPObj;
-
- sal_uInt16 nOrient;
- pDPData->mnDim = pDPObj->GetHeaderDim(rPos, nOrient);
-
- if (pDPData->maDPParam.maLabelArray.size() <= static_cast<size_t>(pDPData->mnDim))
- // out-of-bound dimension ID. This should never happen!
- return;
-
- const ScDPLabelData& rLabelData = *pDPData->maDPParam.maLabelArray[pDPData->mnDim];
-
- mpDPFieldPopup.reset(new ScDPFieldPopupWindow(this, pViewData->GetDocument()));
- mpDPFieldPopup->setName(OUString(RTL_CONSTASCII_USTRINGPARAM("DataPilot field member popup")));
- mpDPFieldPopup->setExtendedData(pDPData.release());
- mpDPFieldPopup->setOKAction(new DPFieldPopupOKAction(this));
- {
- // Populate field members.
- size_t n = rLabelData.maMembers.size();
- mpDPFieldPopup->setMemberSize(n);
- for (size_t i = 0; i < n; ++i)
- {
- const ScDPLabelData::Member& rMem = rLabelData.maMembers[i];
- mpDPFieldPopup->addMember(rMem.getDisplayName(), rMem.mbVisible);
- }
- mpDPFieldPopup->initMembers();
- }
-
- vector<OUString> aUserSortNames;
- ScUserList* pUserList = ScGlobal::GetUserList();
- if (pUserList)
- {
- size_t n = pUserList->size();
- aUserSortNames.reserve(n);
- for (size_t i = 0; i < n; ++i)
- {
- const ScUserListData* pData = (*pUserList)[i];
- aUserSortNames.push_back(pData->GetString());
- }
- }
-
- // Populate the menus.
- ScTabViewShell* pViewShell = pViewData->GetViewShell();
- mpDPFieldPopup->addMenuItem(
- ScRscStrLoader(RID_POPUP_FILTER, STR_MENU_SORT_ASC).GetString(), true,
- new PopupSortAction(rPos, PopupSortAction::ASCENDING, 0, pViewShell));
- mpDPFieldPopup->addMenuItem(
- ScRscStrLoader(RID_POPUP_FILTER, STR_MENU_SORT_DESC).GetString(), true,
- new PopupSortAction(rPos, PopupSortAction::DESCENDING, 0, pViewShell));
- ScMenuFloatingWindow* pSubMenu = mpDPFieldPopup->addSubMenuItem(
- ScRscStrLoader(RID_POPUP_FILTER, STR_MENU_SORT_CUSTOM).GetString(), !aUserSortNames.empty());
-
- if (pSubMenu && !aUserSortNames.empty())
- {
- size_t n = aUserSortNames.size();
- for (size_t i = 0; i < n; ++i)
- {
- pSubMenu->addMenuItem(
- aUserSortNames[i], true,
- new PopupSortAction(rPos, PopupSortAction::CUSTOM, static_cast<sal_uInt16>(i), pViewShell));
- }
- }
-
- sal_Bool bLayoutRTL = pViewData->GetDocument()->IsLayoutRTL( pViewData->GetTabNo() );
-
- Rectangle aCellRect(rScrPos, rScrSize);
- const Size& rPopupSize = mpDPFieldPopup->getWindowSize();
- if (bLayoutRTL)
- {
- // RTL: rScrPos is logical-left (visual right) position, always right-align with that
- aCellRect.SetPos(Point(rScrPos.X() - rPopupSize.Width() + 1, rScrPos.Y()));
- }
- else if (rScrSize.getWidth() > rPopupSize.getWidth())
- {
- // If the cell width is larger than the popup window width, launch it
- // right-aligned with the cell.
- long nXOffset = rScrSize.getWidth() - rPopupSize.getWidth();
- aCellRect.SetPos(Point(rScrPos.X() + nXOffset, rScrPos.Y()));
- }
- mpDPFieldPopup->SetPopupModeEndHdl( LINK(this, ScGridWindow, PopupModeEndHdl) );
- mpDPFieldPopup->StartPopupMode(aCellRect, (FLOATWIN_POPUPMODE_DOWN | FLOATWIN_POPUPMODE_GRABFOCUS));
-}
-
-void ScGridWindow::UpdateDPFromFieldPopupMenu()
-{
- typedef boost::unordered_map<OUString, OUString, OUStringHash> MemNameMapType;
- typedef boost::unordered_map<OUString, bool, OUStringHash> MemVisibilityType;
-
- if (!mpDPFieldPopup.get())
- return;
-
- DPFieldPopupData* pDPData = static_cast<DPFieldPopupData*>(mpDPFieldPopup->getExtendedData());
- if (!pDPData)
- return;
-
- ScDPObject* pDPObj = pDPData->mpDPObj;
- ScDPObject aNewDPObj(*pDPObj);
- aNewDPObj.BuildAllDimensionMembers();
- ScDPSaveData* pSaveData = aNewDPObj.GetSaveData();
-
- bool bIsDataLayout;
- OUString aDimName = pDPObj->GetDimName(pDPData->mnDim, bIsDataLayout);
- ScDPSaveDimension* pDim = pSaveData->GetDimensionByName(aDimName);
- if (!pDim)
- return;
-
- // Build a map of layout names to original names.
- const ScDPLabelData& rLabelData = *pDPData->maDPParam.maLabelArray[pDPData->mnDim];
- MemNameMapType aMemNameMap;
- for (vector<ScDPLabelData::Member>::const_iterator itr = rLabelData.maMembers.begin(), itrEnd = rLabelData.maMembers.end();
- itr != itrEnd; ++itr)
- aMemNameMap.insert(MemNameMapType::value_type(itr->maLayoutName, itr->maName));
-
- // The raw result may contain a mixture of layout names and original names.
- MemVisibilityType aRawResult;
- mpDPFieldPopup->getResult(aRawResult);
-
- MemVisibilityType aResult;
- for (MemVisibilityType::const_iterator itr = aRawResult.begin(), itrEnd = aRawResult.end(); itr != itrEnd; ++itr)
- {
- MemNameMapType::const_iterator itrNameMap = aMemNameMap.find(itr->first);
- if (itrNameMap == aMemNameMap.end())
- // This is an original member name. Use it as-is.
- aResult.insert(MemVisibilityType::value_type(itr->first, itr->second));
- else
- {
- // This is a layout name. Get the original member name and use it.
- aResult.insert(MemVisibilityType::value_type(itrNameMap->second, itr->second));
- }
- }
- pDim->UpdateMemberVisibility(aResult);
-
- ScDBDocFunc aFunc(*pViewData->GetDocShell());
- aFunc.DataPilotUpdate(pDPObj, &aNewDPObj, true, false);
-}
-
-void ScGridWindow::UpdateVisibleRange()
-{
- SCCOL nPosX = pViewData->GetPosX(eHWhich);
- SCROW nPosY = pViewData->GetPosY(eVWhich);
- SCCOL nXRight = nPosX + pViewData->VisibleCellsX(eHWhich);
- if (nXRight > MAXCOL) nXRight = MAXCOL;
- SCROW nYBottom = nPosY + pViewData->VisibleCellsY(eVWhich);
- if (nYBottom > MAXROW) nYBottom = MAXROW;
-
- // Store the current visible range.
- maVisibleRange.mnCol1 = nPosX;
- maVisibleRange.mnCol2 = nXRight;
- maVisibleRange.mnRow1 = nPosY;
- maVisibleRange.mnRow2 = nYBottom;
-}
-
-void ScGridWindow::DPMouseMove( const MouseEvent& rMEvt )
-{
- DPTestMouse( rMEvt, sal_True );
-}
-
-void ScGridWindow::DPMouseButtonUp( const MouseEvent& rMEvt )
-{
- bDPMouse = false;
- ReleaseMouse();
-
- DPTestMouse( rMEvt, false );
- SetPointer( Pointer( POINTER_ARROW ) );
-}
-
-// -----------------------------------------------------------------------
-
-void ScGridWindow::UpdateDragRect( sal_Bool bShowRange, const Rectangle& rPosRect )
-{
- SCCOL nStartX = ( rPosRect.Left() >= 0 ) ? static_cast<SCCOL>(rPosRect.Left()) : SCCOL_MAX;
- SCROW nStartY = ( rPosRect.Top() >= 0 ) ? static_cast<SCROW>(rPosRect.Top()) : SCROW_MAX;
- SCCOL nEndX = ( rPosRect.Right() >= 0 ) ? static_cast<SCCOL>(rPosRect.Right()) : SCCOL_MAX;
- SCROW nEndY = ( rPosRect.Bottom() >= 0 ) ? static_cast<SCROW>(rPosRect.Bottom()) : SCROW_MAX;
-
- if ( bShowRange == bDragRect && nDragStartX == nStartX && nDragEndX == nEndX &&
- nDragStartY == nStartY && nDragEndY == nEndY )
- {
- return; // everything unchanged
- }
-
- if ( bShowRange )
- {
- nDragStartX = nStartX;
- nDragStartY = nStartY;
- nDragEndX = nEndX;
- nDragEndY = nEndY;
- bDragRect = true;
- }
- else
- bDragRect = false;
-
- UpdateDragRectOverlay();
-}
-
-// -----------------------------------------------------------------------
-
-// Page-Break-Modus
-
-sal_uInt16 ScGridWindow::HitPageBreak( const Point& rMouse, ScRange* pSource,
- SCCOLROW* pBreak, SCCOLROW* pPrev )
-{
- sal_uInt16 nFound = SC_PD_NONE; // 0
- ScRange aSource;
- SCCOLROW nBreak = 0;
- SCCOLROW nPrev = 0;
-
- ScPageBreakData* pPageData = pViewData->GetView()->GetPageBreakData();
- if ( pPageData )
- {
- sal_Bool bHori = false;
- sal_Bool bVert = false;
- SCCOL nHitX = 0;
- SCROW nHitY = 0;
-
- long nMouseX = rMouse.X();
- long nMouseY = rMouse.Y();
- SCsCOL nPosX;
- SCsROW nPosY;
- pViewData->GetPosFromPixel( nMouseX, nMouseY, eWhich, nPosX, nPosY );
- Point aTL = pViewData->GetScrPos( nPosX, nPosY, eWhich );
- Point aBR = pViewData->GetScrPos( nPosX+1, nPosY+1, eWhich );
-
- // Horizontal mehr Toleranz als vertikal, weil mehr Platz ist
- if ( nMouseX <= aTL.X() + 4 )
- {
- bHori = sal_True;
- nHitX = nPosX;
- }
- else if ( nMouseX >= aBR.X() - 6 )
- {
- bHori = sal_True;
- nHitX = nPosX+1; // linker Rand der naechsten Zelle
- }
- if ( nMouseY <= aTL.Y() + 2 )
- {
- bVert = sal_True;
- nHitY = nPosY;
- }
- else if ( nMouseY >= aBR.Y() - 4 )
- {
- bVert = sal_True;
- nHitY = nPosY+1; // oberer Rand der naechsten Zelle
- }
-
- if ( bHori || bVert )
- {
- sal_uInt16 nCount = sal::static_int_cast<sal_uInt16>( pPageData->GetCount() );
- for (sal_uInt16 nPos=0; nPos<nCount && !nFound; nPos++)
- {
- ScPrintRangeData& rData = pPageData->GetData(nPos);
- ScRange aRange = rData.GetPrintRange();
- sal_Bool bLHit = ( bHori && nHitX == aRange.aStart.Col() );
- sal_Bool bRHit = ( bHori && nHitX == aRange.aEnd.Col() + 1 );
- sal_Bool bTHit = ( bVert && nHitY == aRange.aStart.Row() );
- sal_Bool bBHit = ( bVert && nHitY == aRange.aEnd.Row() + 1 );
- sal_Bool bInsideH = ( nPosX >= aRange.aStart.Col() && nPosX <= aRange.aEnd.Col() );
- sal_Bool bInsideV = ( nPosY >= aRange.aStart.Row() && nPosY <= aRange.aEnd.Row() );
-
- if ( bLHit )
- {
- if ( bTHit )
- nFound = SC_PD_RANGE_TL;
- else if ( bBHit )
- nFound = SC_PD_RANGE_BL;
- else if ( bInsideV )
- nFound = SC_PD_RANGE_L;
- }
- else if ( bRHit )
- {
- if ( bTHit )
- nFound = SC_PD_RANGE_TR;
- else if ( bBHit )
- nFound = SC_PD_RANGE_BR;
- else if ( bInsideV )
- nFound = SC_PD_RANGE_R;
- }
- else if ( bTHit && bInsideH )
- nFound = SC_PD_RANGE_T;
- else if ( bBHit && bInsideH )
- nFound = SC_PD_RANGE_B;
- if (nFound)
- aSource = aRange;
-
- // Umbrueche
-
- if ( bVert && bInsideH && !nFound )
- {
- size_t nRowCount = rData.GetPagesY();
- const SCROW* pRowEnd = rData.GetPageEndY();
- for (size_t nRowPos=0; nRowPos+1<nRowCount; nRowPos++)
- if ( pRowEnd[nRowPos]+1 == nHitY )
- {
- nFound = SC_PD_BREAK_V;
- aSource = aRange;
- nBreak = nHitY;
- if ( nRowPos )
- nPrev = pRowEnd[nRowPos-1]+1;
- else
- nPrev = aRange.aStart.Row();
- }
- }
- if ( bHori && bInsideV && !nFound )
- {
- size_t nColCount = rData.GetPagesX();
- const SCCOL* pColEnd = rData.GetPageEndX();
- for (size_t nColPos=0; nColPos+1<nColCount; nColPos++)
- if ( pColEnd[nColPos]+1 == nHitX )
- {
- nFound = SC_PD_BREAK_H;
- aSource = aRange;
- nBreak = nHitX;
- if ( nColPos )
- nPrev = pColEnd[nColPos-1]+1;
- else
- nPrev = aRange.aStart.Col();
- }
- }
- }
- }
- }
-
- if (pSource)
- *pSource = aSource; // Druckbereich
- if (pBreak)
- *pBreak = nBreak; // X/Y Position des verchobenen Seitenumbruchs
- if (pPrev)
- *pPrev = nPrev; // X/Y Anfang der Seite, die am Umbruch zuende ist
- return nFound;
-}
-
-void ScGridWindow::PagebreakMove( const MouseEvent& rMEvt, sal_Bool bUp )
-{
- //! Scrolling und Umschalten mit RFMouseMove zusammenfassen !
- //! (Weginvertieren vor dem Scrolling ist anders)
-
- // Scrolling
-
- sal_Bool bTimer = false;
- Point aPos = rMEvt.GetPosPixel();
- SCsCOL nDx = 0;
- SCsROW nDy = 0;
- if ( aPos.X() < 0 ) nDx = -1;
- if ( aPos.Y() < 0 ) nDy = -1;
- Size aSize = GetOutputSizePixel();
- if ( aPos.X() >= aSize.Width() )
- nDx = 1;
- if ( aPos.Y() >= aSize.Height() )
- nDy = 1;
- if ( nDx != 0 || nDy != 0 )
- {
- if ( bPagebreakDrawn ) // weginvertieren
- {
- bPagebreakDrawn = false;
- UpdateDragRectOverlay();
- }
-
- if ( nDx != 0 ) pViewData->GetView()->ScrollX( nDx, WhichH(eWhich) );
- if ( nDy != 0 ) pViewData->GetView()->ScrollY( nDy, WhichV(eWhich) );
- bTimer = sal_True;
- }
-
- // Umschalten bei Fixierung (damit Scrolling funktioniert)
-
- if ( eWhich == pViewData->GetActivePart() ) //??
- {
- if ( pViewData->GetHSplitMode() == SC_SPLIT_FIX )
- if ( nDx > 0 )
- {
- if ( eWhich == SC_SPLIT_TOPLEFT )
- pViewData->GetView()->ActivatePart( SC_SPLIT_TOPRIGHT );
- else if ( eWhich == SC_SPLIT_BOTTOMLEFT )
- pViewData->GetView()->ActivatePart( SC_SPLIT_BOTTOMRIGHT );
- }
-
- if ( pViewData->GetVSplitMode() == SC_SPLIT_FIX )
- if ( nDy > 0 )
- {
- if ( eWhich == SC_SPLIT_TOPLEFT )
- pViewData->GetView()->ActivatePart( SC_SPLIT_BOTTOMLEFT );
- else if ( eWhich == SC_SPLIT_TOPRIGHT )
- pViewData->GetView()->ActivatePart( SC_SPLIT_BOTTOMRIGHT );
- }
- }
-
- // ab hier neu
-
- // gesucht wird eine Position zwischen den Zellen (vor nPosX / nPosY)
- SCsCOL nPosX;
- SCsROW nPosY;
- pViewData->GetPosFromPixel( aPos.X(), aPos.Y(), eWhich, nPosX, nPosY );
- sal_Bool bLeft, bTop;
- pViewData->GetMouseQuadrant( aPos, eWhich, nPosX, nPosY, bLeft, bTop );
- if ( !bLeft ) ++nPosX;
- if ( !bTop ) ++nPosY;
-
- sal_Bool bBreak = ( nPagebreakMouse == SC_PD_BREAK_H || nPagebreakMouse == SC_PD_BREAK_V );
- sal_Bool bHide = false;
- sal_Bool bToEnd = false;
- ScRange aDrawRange = aPagebreakSource;
- if ( bBreak )
- {
- if ( nPagebreakMouse == SC_PD_BREAK_H )
- {
- if ( nPosX > aPagebreakSource.aStart.Col() &&
- nPosX <= aPagebreakSource.aEnd.Col() + 1 ) // ans Ende ist auch erlaubt
- {
- bToEnd = ( nPosX == aPagebreakSource.aEnd.Col() + 1 );
- aDrawRange.aStart.SetCol( nPosX );
- aDrawRange.aEnd.SetCol( nPosX - 1 );
- }
- else
- bHide = sal_True;
- }
- else
- {
- if ( nPosY > aPagebreakSource.aStart.Row() &&
- nPosY <= aPagebreakSource.aEnd.Row() + 1 ) // ans Ende ist auch erlaubt
- {
- bToEnd = ( nPosY == aPagebreakSource.aEnd.Row() + 1 );
- aDrawRange.aStart.SetRow( nPosY );
- aDrawRange.aEnd.SetRow( nPosY - 1 );
- }
- else
- bHide = sal_True;
- }
- }
- else
- {
- if ( nPagebreakMouse & SC_PD_RANGE_L )
- aDrawRange.aStart.SetCol( nPosX );
- if ( nPagebreakMouse & SC_PD_RANGE_T )
- aDrawRange.aStart.SetRow( nPosY );
- if ( nPagebreakMouse & SC_PD_RANGE_R )
- {
- if ( nPosX > 0 )
- aDrawRange.aEnd.SetCol( nPosX-1 );
- else
- bHide = sal_True;
- }
- if ( nPagebreakMouse & SC_PD_RANGE_B )
- {
- if ( nPosY > 0 )
- aDrawRange.aEnd.SetRow( nPosY-1 );
- else
- bHide = sal_True;
- }
- if ( aDrawRange.aStart.Col() > aDrawRange.aEnd.Col() ||
- aDrawRange.aStart.Row() > aDrawRange.aEnd.Row() )
- bHide = sal_True;
- }
-
- if ( !bPagebreakDrawn || bUp || aDrawRange != aPagebreakDrag )
- {
- // zeichnen...
-
- if ( bPagebreakDrawn )
- {
- // weginvertieren
- bPagebreakDrawn = false;
- }
- aPagebreakDrag = aDrawRange;
- if ( !bUp && !bHide )
- {
- // hininvertieren
- bPagebreakDrawn = true;
- }
- UpdateDragRectOverlay();
- }
-
- // bei ButtonUp die Aenderung ausfuehren
-
- if ( bUp )
- {
- ScViewFunc* pViewFunc = pViewData->GetView();
- ScDocShell* pDocSh = pViewData->GetDocShell();
- ScDocument* pDoc = pDocSh->GetDocument();
- SCTAB nTab = pViewData->GetTabNo();
- sal_Bool bUndo (pDoc->IsUndoEnabled());
-
- if ( bBreak )
- {
- sal_Bool bColumn = ( nPagebreakMouse == SC_PD_BREAK_H );
- SCCOLROW nNew = bColumn ? static_cast<SCCOLROW>(nPosX) : static_cast<SCCOLROW>(nPosY);
- if ( nNew != nPagebreakBreak )
- {
- if (bUndo)
- {
- String aUndo = ScGlobal::GetRscString( STR_UNDO_DRAG_BREAK );
- pDocSh->GetUndoManager()->EnterListAction( aUndo, aUndo );
- }
-
- sal_Bool bGrow = !bHide && nNew > nPagebreakBreak;
- if ( bColumn )
- {
- if (pDoc->HasColBreak(static_cast<SCCOL>(nPagebreakBreak), nTab) & BREAK_MANUAL)
- {
- ScAddress aOldAddr( static_cast<SCCOL>(nPagebreakBreak), nPosY, nTab );
- pViewFunc->DeletePageBreak( sal_True, sal_True, &aOldAddr, false );
- }
- if ( !bHide && !bToEnd ) // am Ende nicht
- {
- ScAddress aNewAddr( static_cast<SCCOL>(nNew), nPosY, nTab );
- pViewFunc->InsertPageBreak( sal_True, sal_True, &aNewAddr, false );
- }
- if ( bGrow )
- {
- // vorigen Break auf hart, und Skalierung aendern
- bool bManualBreak = (pDoc->HasColBreak(static_cast<SCCOL>(nPagebreakPrev), nTab) & BREAK_MANUAL);
- if ( static_cast<SCCOL>(nPagebreakPrev) > aPagebreakSource.aStart.Col() && !bManualBreak )
- {
- ScAddress aPrev( static_cast<SCCOL>(nPagebreakPrev), nPosY, nTab );
- pViewFunc->InsertPageBreak( sal_True, sal_True, &aPrev, false );
- }
-
- if (!pDocSh->AdjustPrintZoom( ScRange(
- static_cast<SCCOL>(nPagebreakPrev),0,nTab, static_cast<SCCOL>(nNew-1),0,nTab ) ))
- bGrow = false;
- }
- }
- else
- {
- if (pDoc->HasRowBreak(nPagebreakBreak, nTab) & BREAK_MANUAL)
- {
- ScAddress aOldAddr( nPosX, nPagebreakBreak, nTab );
- pViewFunc->DeletePageBreak( false, sal_True, &aOldAddr, false );
- }
- if ( !bHide && !bToEnd ) // am Ende nicht
- {
- ScAddress aNewAddr( nPosX, nNew, nTab );
- pViewFunc->InsertPageBreak( false, sal_True, &aNewAddr, false );
- }
- if ( bGrow )
- {
- // vorigen Break auf hart, und Skalierung aendern
- bool bManualBreak = (pDoc->HasRowBreak(nPagebreakPrev, nTab) & BREAK_MANUAL);
- if ( nPagebreakPrev > aPagebreakSource.aStart.Row() && !bManualBreak )
- {
- ScAddress aPrev( nPosX, nPagebreakPrev, nTab );
- pViewFunc->InsertPageBreak( false, sal_True, &aPrev, false );
- }
-
- if (!pDocSh->AdjustPrintZoom( ScRange(
- 0,nPagebreakPrev,nTab, 0,nNew-1,nTab ) ))
- bGrow = false;
- }
- }
-
- if (bUndo)
- {
- pDocSh->GetUndoManager()->LeaveListAction();
- }
-
- if (!bGrow) // sonst in AdjustPrintZoom schon passiert
- {
- pViewFunc->UpdatePageBreakData( sal_True );
- pDocSh->SetDocumentModified();
- }
- }
- }
- else if ( bHide || aPagebreakDrag != aPagebreakSource )
- {
- // Druckbereich setzen
-
- String aNewRanges;
- sal_uInt16 nOldCount = pDoc->GetPrintRangeCount( nTab );
- if ( nOldCount )
- {
- for (sal_uInt16 nPos=0; nPos<nOldCount; nPos++)
- {
- const ScRange* pOld = pDoc->GetPrintRange( nTab, nPos );
- if ( pOld )
- {
- String aTemp;
- if ( *pOld != aPagebreakSource )
- pOld->Format( aTemp, SCA_VALID );
- else if ( !bHide )
- aPagebreakDrag.Format( aTemp, SCA_VALID );
- if (aTemp.Len())
- {
- if ( aNewRanges.Len() )
- aNewRanges += ';';
- aNewRanges += aTemp;
- }
- }
- }
- }
- else if (!bHide)
- aPagebreakDrag.Format( aNewRanges, SCA_VALID );
-
- pViewFunc->SetPrintRanges( pDoc->IsPrintEntireSheet( nTab ), &aNewRanges, NULL, NULL, false );
- }
- }
-
- // Timer fuer Scrolling
-
- if (bTimer && !bUp)
- pViewData->GetView()->SetTimer( this, rMEvt ); // Event wiederholen
- else
- pViewData->GetView()->ResetTimer();
-}
-
-
-
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */