diff options
Diffstat (limited to 'svx/source/svdraw/svdviter.cxx')
-rw-r--r-- | svx/source/svdraw/svdviter.cxx | 351 |
1 files changed, 351 insertions, 0 deletions
diff --git a/svx/source/svdraw/svdviter.cxx b/svx/source/svdraw/svdviter.cxx new file mode 100644 index 000000000000..9c52ee87cf23 --- /dev/null +++ b/svx/source/svdraw/svdviter.cxx @@ -0,0 +1,351 @@ +/************************************************************************* + * + * 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_svx.hxx" + +#include "svdviter.hxx" +#include <svx/svdobj.hxx> +#include <svx/svdpage.hxx> +#include <svx/svdmodel.hxx> +#include <svx/svdview.hxx> +#include <svx/svdpagv.hxx> +#include <svx/svdsob.hxx> +#include <svl/brdcst.hxx> +#include <sdrpaintwindow.hxx> + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +void SdrViewIter::ImpInitVars() +{ + mnListenerNum = 0L; + mnPageViewNum = 0L; + mnOutDevNum = 0L; + mpAktView = 0L; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +SdrViewIter::SdrViewIter(const SdrModel* pModel) +{ + mpModel = pModel; + mpPage = 0L; + mpObject = 0L; + ImpInitVars(); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +SdrViewIter::SdrViewIter(const SdrPage* pPage, sal_Bool bNoMasterPage) +{ + mpPage = pPage; + mpModel = (pPage) ? pPage->GetModel() : 0L; + mpObject = 0L; + mbNoMasterPage = bNoMasterPage; + ImpInitVars(); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +SdrViewIter::SdrViewIter(const SdrObject* pObject, sal_Bool bNoMasterPage) +{ + mpObject = pObject; + mpModel = (pObject) ? pObject->GetModel() : 0L; + mpPage = (pObject) ? pObject->GetPage() : 0L; + mbNoMasterPage = bNoMasterPage; + + if(!mpModel || !mpPage) + { + mpModel = 0L; + mpPage = 0L; + } + + ImpInitVars(); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +sal_Bool SdrViewIter::ImpCheckPageView(SdrPageView* pPV) const +{ + if(mpPage) + { + sal_Bool bMaster(mpPage->IsMasterPage()); + SdrPage* pPg = pPV->GetPage(); + + if(pPg == mpPage) + { + if(mpObject) + { + // Objekt gewuenscht? Na dann erstmal sehen, ob + // das Obj in dieser PageView auch sichtbar ist. + SetOfByte aObjLay; + mpObject->getMergedHierarchyLayerSet(aObjLay); + aObjLay &= pPV->GetVisibleLayers(); + return !aObjLay.IsEmpty(); + } + else + { + return sal_True; + } + } + else + { + if(!mbNoMasterPage && bMaster && (!mpObject || !mpObject->IsNotVisibleAsMaster())) + { + if(pPg->TRG_HasMasterPage()) + { + SdrPage& rMasterPage = pPg->TRG_GetMasterPage(); + + if(&rMasterPage == mpPage) + { + // Aha, die gewuenschte Page ist also MasterPage in dieser PageView + if(mpObject) + { + // Objekt gewuenscht? Na dann erstmal sehen, ob + // das Obj in dieser PageView auch sichtbar ist. + SetOfByte aObjLay; + mpObject->getMergedHierarchyLayerSet(aObjLay); + aObjLay &= pPV->GetVisibleLayers(); + aObjLay &= pPg->TRG_GetMasterPageVisibleLayers(); + + if(!aObjLay.IsEmpty()) + { + return TRUE; + } // ansonsten die naechste MasterPage der Page ansehen... + } + else + { + return sal_True; + } + } + } + } + + // MasterPage nicht erlaubt oder keine passende gefunden + return sal_False; + } + } + else + { + return sal_True; + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +SdrView* SdrViewIter::ImpFindView() +{ + if(mpModel) + { + sal_uInt32 nLsAnz(mpModel->GetListenerCount()); + + while(mnListenerNum < nLsAnz) + { + SfxListener* pLs = mpModel->GetListener((sal_uInt16)mnListenerNum); + mpAktView = PTR_CAST(SdrView, pLs); + + if(mpAktView) + { + if(mpPage) + { + SdrPageView* pPV = mpAktView->GetSdrPageView(); + + if(pPV) + { + if(ImpCheckPageView(pPV)) + { + return mpAktView; + } + } + } + else + { + return mpAktView; + } + } + + mnListenerNum++; + } + } + + mpAktView = 0L; + return mpAktView; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +SdrPageView* SdrViewIter::ImpFindPageView() +{ + if(mpModel) + { + while(mpAktView) + { + SdrPageView* pPV = mpAktView->GetSdrPageView(); + + if(pPV) + { + if(mpPage) + { + if(ImpCheckPageView(pPV)) + { + return pPV; + } + } + else + { + return pPV; + } + + mnPageViewNum++; + } + + mnListenerNum++; + ImpFindView(); + } + } + + return 0L; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +OutputDevice* SdrViewIter::ImpFindOutDev() +{ + while(mpAktView) + { + const sal_uInt32 nOutDevAnz(mpAktView->PaintWindowCount()); + + if(mnOutDevNum < nOutDevAnz) + { + SdrPaintWindow* pPaintWindow = mpAktView->GetPaintWindow(mnOutDevNum); + return &pPaintWindow->GetOutputDevice(); + } + + mnListenerNum++; + ImpFindView(); + } + + return 0L; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +Window* SdrViewIter::ImpFindWindow() +{ + while(mpAktView) + { + const sal_uInt32 nOutDevAnz(mpAktView->PaintWindowCount()); + + while(mnOutDevNum < nOutDevAnz) + { + SdrPaintWindow* pPaintWindow = mpAktView->GetPaintWindow(mnOutDevNum); + OutputDevice& rOutDev = pPaintWindow->GetOutputDevice(); + + if(OUTDEV_WINDOW == rOutDev.GetOutDevType()) + { + return (Window*)(&rOutDev); + } + + mnOutDevNum++; + } + + mnListenerNum++; + ImpFindView(); + } + + return 0L; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +SdrView* SdrViewIter::FirstView() +{ + ImpInitVars(); + return ImpFindView(); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +SdrView* SdrViewIter::NextView() +{ + mnListenerNum++; + return ImpFindView(); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +SdrPageView* SdrViewIter::FirstPageView() +{ + ImpInitVars(); + ImpFindView(); + return ImpFindPageView(); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +SdrPageView* SdrViewIter::NextPageView() +{ + mnPageViewNum++; + return ImpFindPageView(); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +OutputDevice* SdrViewIter::FirstOutDev() +{ + ImpInitVars(); + ImpFindView(); + return ImpFindOutDev(); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +OutputDevice* SdrViewIter::NextOutDev() +{ + mnOutDevNum++; + return ImpFindOutDev(); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +Window* SdrViewIter::FirstWindow() +{ + ImpInitVars(); + ImpFindView(); + return ImpFindWindow(); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +Window* SdrViewIter::NextWindow() +{ + mnOutDevNum++; + return ImpFindWindow(); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + |