1*f6e50924SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*f6e50924SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*f6e50924SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*f6e50924SAndrew Rist * distributed with this work for additional information 6*f6e50924SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*f6e50924SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*f6e50924SAndrew Rist * "License"); you may not use this file except in compliance 9*f6e50924SAndrew Rist * with the License. You may obtain a copy of the License at 10*f6e50924SAndrew Rist * 11*f6e50924SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12*f6e50924SAndrew Rist * 13*f6e50924SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*f6e50924SAndrew Rist * software distributed under the License is distributed on an 15*f6e50924SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*f6e50924SAndrew Rist * KIND, either express or implied. See the License for the 17*f6e50924SAndrew Rist * specific language governing permissions and limitations 18*f6e50924SAndrew Rist * under the License. 19*f6e50924SAndrew Rist * 20*f6e50924SAndrew Rist *************************************************************/ 21*f6e50924SAndrew Rist 22*f6e50924SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_svx.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include <svx/sdr/contact/viewobjectcontactofpageobj.hxx> 28cdf0e10cSrcweir #include <svx/sdr/contact/viewcontactofpageobj.hxx> 29cdf0e10cSrcweir #include <svx/svdopage.hxx> 30cdf0e10cSrcweir #include <svx/sdr/contact/displayinfo.hxx> 31cdf0e10cSrcweir #include <basegfx/polygon/b2dpolygontools.hxx> 32cdf0e10cSrcweir #include <drawinglayer/primitive2d/polypolygonprimitive2d.hxx> 33cdf0e10cSrcweir #include <drawinglayer/primitive2d/polygonprimitive2d.hxx> 34cdf0e10cSrcweir #include <svx/sdr/contact/objectcontactofobjlistpainter.hxx> 35cdf0e10cSrcweir #include <basegfx/matrix/b2dhommatrix.hxx> 36cdf0e10cSrcweir #include <svx/svdpage.hxx> 37cdf0e10cSrcweir #include <svx/unoapi.hxx> 38cdf0e10cSrcweir #include <drawinglayer/primitive2d/pagepreviewprimitive2d.hxx> 39cdf0e10cSrcweir #include <drawinglayer/primitive2d/sdrdecompositiontools2d.hxx> 40cdf0e10cSrcweir 41cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 42cdf0e10cSrcweir 43cdf0e10cSrcweir using namespace com::sun::star; 44cdf0e10cSrcweir 45cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 46cdf0e10cSrcweir 47cdf0e10cSrcweir namespace sdr 48cdf0e10cSrcweir { 49cdf0e10cSrcweir namespace contact 50cdf0e10cSrcweir { 51cdf0e10cSrcweir class PagePrimitiveExtractor : public ObjectContactOfPagePainter, public Timer 52cdf0e10cSrcweir { 53cdf0e10cSrcweir private: 54cdf0e10cSrcweir // the ViewObjectContactOfPageObj using this painter 55cdf0e10cSrcweir ViewObjectContactOfPageObj& mrViewObjectContactOfPageObj; 56cdf0e10cSrcweir 57cdf0e10cSrcweir public: 58cdf0e10cSrcweir // basic constructor/destructor 59cdf0e10cSrcweir PagePrimitiveExtractor(ViewObjectContactOfPageObj& rVOC); 60cdf0e10cSrcweir virtual ~PagePrimitiveExtractor(); 61cdf0e10cSrcweir 62cdf0e10cSrcweir // LazyInvalidate request. Supported here to not automatically 63cdf0e10cSrcweir // invalidate the second interaction state all the time at the 64cdf0e10cSrcweir // original OC 65cdf0e10cSrcweir virtual void setLazyInvalidate(ViewObjectContact& rVOC); 66cdf0e10cSrcweir 67cdf0e10cSrcweir // From baseclass Timer, the timeout call triggered by te LazyInvalidate mechanism 68cdf0e10cSrcweir virtual void Timeout(); 69cdf0e10cSrcweir 70cdf0e10cSrcweir // get primitive visualization 71cdf0e10cSrcweir drawinglayer::primitive2d::Primitive2DSequence createPrimitive2DSequenceForPage(const DisplayInfo& rDisplayInfo); 72cdf0e10cSrcweir 73cdf0e10cSrcweir // Own reaction on changes which will be forwarded to the OC of the owner-VOC 74cdf0e10cSrcweir virtual void InvalidatePartOfView(const basegfx::B2DRange& rRange) const; 75cdf0e10cSrcweir 76cdf0e10cSrcweir // forward access to SdrPageView of ViewObjectContactOfPageObj 77cdf0e10cSrcweir virtual bool isOutputToPrinter() const; 78cdf0e10cSrcweir virtual bool isOutputToWindow() const; 79cdf0e10cSrcweir virtual bool isOutputToVirtualDevice() const; 80cdf0e10cSrcweir virtual bool isOutputToRecordingMetaFile() const; 81cdf0e10cSrcweir virtual bool isOutputToPDFFile() const; 82cdf0e10cSrcweir virtual bool isDrawModeGray() const; 83cdf0e10cSrcweir virtual bool isDrawModeBlackWhite() const; 84cdf0e10cSrcweir virtual bool isDrawModeHighContrast() const; 85cdf0e10cSrcweir virtual SdrPageView* TryToGetSdrPageView() const; 86cdf0e10cSrcweir virtual OutputDevice* TryToGetOutputDevice() const; 87cdf0e10cSrcweir }; 88cdf0e10cSrcweir 89cdf0e10cSrcweir PagePrimitiveExtractor::PagePrimitiveExtractor( 90cdf0e10cSrcweir ViewObjectContactOfPageObj& rVOC) 91cdf0e10cSrcweir : ObjectContactOfPagePainter(0, rVOC.GetObjectContact()), 92cdf0e10cSrcweir mrViewObjectContactOfPageObj(rVOC) 93cdf0e10cSrcweir { 94cdf0e10cSrcweir // make this renderer a preview renderer 95cdf0e10cSrcweir setPreviewRenderer(true); 96cdf0e10cSrcweir 97cdf0e10cSrcweir // init timer 98cdf0e10cSrcweir SetTimeout(1); 99cdf0e10cSrcweir Stop(); 100cdf0e10cSrcweir } 101cdf0e10cSrcweir 102cdf0e10cSrcweir PagePrimitiveExtractor::~PagePrimitiveExtractor() 103cdf0e10cSrcweir { 104cdf0e10cSrcweir // execute missing LazyInvalidates and stop timer 105cdf0e10cSrcweir Timeout(); 106cdf0e10cSrcweir } 107cdf0e10cSrcweir 108cdf0e10cSrcweir void PagePrimitiveExtractor::setLazyInvalidate(ViewObjectContact& /*rVOC*/) 109cdf0e10cSrcweir { 110cdf0e10cSrcweir // do NOT call parent, but remember that something is to do by 111cdf0e10cSrcweir // starting the LazyInvalidateTimer 112cdf0e10cSrcweir Start(); 113cdf0e10cSrcweir } 114cdf0e10cSrcweir 115cdf0e10cSrcweir // From baseclass Timer, the timeout call triggered by te LazyInvalidate mechanism 116cdf0e10cSrcweir void PagePrimitiveExtractor::Timeout() 117cdf0e10cSrcweir { 118cdf0e10cSrcweir // stop the timer 119cdf0e10cSrcweir Stop(); 120cdf0e10cSrcweir 121cdf0e10cSrcweir // invalidate all LazyInvalidate VOCs new situations 122cdf0e10cSrcweir const sal_uInt32 nVOCCount(getViewObjectContactCount()); 123cdf0e10cSrcweir 124cdf0e10cSrcweir for(sal_uInt32 a(0); a < nVOCCount; a++) 125cdf0e10cSrcweir { 126cdf0e10cSrcweir ViewObjectContact* pCandidate = getViewObjectContact(a); 127cdf0e10cSrcweir pCandidate->triggerLazyInvalidate(); 128cdf0e10cSrcweir } 129cdf0e10cSrcweir } 130cdf0e10cSrcweir 131cdf0e10cSrcweir drawinglayer::primitive2d::Primitive2DSequence PagePrimitiveExtractor::createPrimitive2DSequenceForPage(const DisplayInfo& /*rDisplayInfo*/) 132cdf0e10cSrcweir { 133cdf0e10cSrcweir drawinglayer::primitive2d::Primitive2DSequence xRetval; 134cdf0e10cSrcweir const SdrPage* pStartPage = GetStartPage(); 135cdf0e10cSrcweir 136cdf0e10cSrcweir if(pStartPage) 137cdf0e10cSrcweir { 138cdf0e10cSrcweir // update own ViewInformation2D for visualized page 139cdf0e10cSrcweir const drawinglayer::geometry::ViewInformation2D& rOriginalViewInformation = mrViewObjectContactOfPageObj.GetObjectContact().getViewInformation2D(); 140cdf0e10cSrcweir const drawinglayer::geometry::ViewInformation2D aNewViewInformation2D( 141cdf0e10cSrcweir rOriginalViewInformation.getObjectTransformation(), 142cdf0e10cSrcweir rOriginalViewInformation.getViewTransformation(), 143cdf0e10cSrcweir 144cdf0e10cSrcweir // #i101075# use empty range for page content here to force 145cdf0e10cSrcweir // the content not to be physically clipped in any way. This 146cdf0e10cSrcweir // would be possible, but would require the internal transformation 147cdf0e10cSrcweir // which maps between the page visualisation object and the page 148cdf0e10cSrcweir // content, including the aspect ratios (for details see in 149cdf0e10cSrcweir // PagePreviewPrimitive2D::create2DDecomposition) 150cdf0e10cSrcweir basegfx::B2DRange(), 151cdf0e10cSrcweir 152cdf0e10cSrcweir GetXDrawPageForSdrPage(const_cast< SdrPage* >(pStartPage)), 153cdf0e10cSrcweir 0.0, // no time; page previews are not animated 154cdf0e10cSrcweir rOriginalViewInformation.getExtendedInformationSequence()); 155cdf0e10cSrcweir updateViewInformation2D(aNewViewInformation2D); 156cdf0e10cSrcweir 157cdf0e10cSrcweir // create copy of DisplayInfo to set PagePainting 158cdf0e10cSrcweir DisplayInfo aDisplayInfo; 159cdf0e10cSrcweir 160cdf0e10cSrcweir // get page's VOC 161cdf0e10cSrcweir ViewObjectContact& rDrawPageVOContact = pStartPage->GetViewContact().GetViewObjectContact(*this); 162cdf0e10cSrcweir 163cdf0e10cSrcweir // get whole Primitive2DSequence 164cdf0e10cSrcweir xRetval = rDrawPageVOContact.getPrimitive2DSequenceHierarchy(aDisplayInfo); 165cdf0e10cSrcweir } 166cdf0e10cSrcweir 167cdf0e10cSrcweir return xRetval; 168cdf0e10cSrcweir } 169cdf0e10cSrcweir 170cdf0e10cSrcweir void PagePrimitiveExtractor::InvalidatePartOfView(const basegfx::B2DRange& rRange) const 171cdf0e10cSrcweir { 172cdf0e10cSrcweir // an invalidate is called at this view, this needs to be translated to an invalidate 173cdf0e10cSrcweir // for the using VOC. Coordinates are in page coordinate system. 174cdf0e10cSrcweir const SdrPage* pStartPage = GetStartPage(); 175cdf0e10cSrcweir 176cdf0e10cSrcweir if(pStartPage && !rRange.isEmpty()) 177cdf0e10cSrcweir { 178cdf0e10cSrcweir const basegfx::B2DRange aPageRange(0.0, 0.0, (double)pStartPage->GetWdt(), (double)pStartPage->GetHgt()); 179cdf0e10cSrcweir 180cdf0e10cSrcweir if(rRange.overlaps(aPageRange)) 181cdf0e10cSrcweir { 182cdf0e10cSrcweir // if object on the page is inside or overlapping with page, create ActionChanged() for 183cdf0e10cSrcweir // involved VOC 184cdf0e10cSrcweir mrViewObjectContactOfPageObj.ActionChanged(); 185cdf0e10cSrcweir } 186cdf0e10cSrcweir } 187cdf0e10cSrcweir } 188cdf0e10cSrcweir 189cdf0e10cSrcweir // forward access to SdrPageView to VOCOfPageObj 190cdf0e10cSrcweir bool PagePrimitiveExtractor::isOutputToPrinter() const { return mrViewObjectContactOfPageObj.GetObjectContact().isOutputToPrinter(); } 191cdf0e10cSrcweir bool PagePrimitiveExtractor::isOutputToWindow() const { return mrViewObjectContactOfPageObj.GetObjectContact().isOutputToWindow(); } 192cdf0e10cSrcweir bool PagePrimitiveExtractor::isOutputToVirtualDevice() const { return mrViewObjectContactOfPageObj.GetObjectContact().isOutputToVirtualDevice(); } 193cdf0e10cSrcweir bool PagePrimitiveExtractor::isOutputToRecordingMetaFile() const { return mrViewObjectContactOfPageObj.GetObjectContact().isOutputToRecordingMetaFile(); } 194cdf0e10cSrcweir bool PagePrimitiveExtractor::isOutputToPDFFile() const { return mrViewObjectContactOfPageObj.GetObjectContact().isOutputToPDFFile(); } 195cdf0e10cSrcweir bool PagePrimitiveExtractor::isDrawModeGray() const { return mrViewObjectContactOfPageObj.GetObjectContact().isDrawModeGray(); } 196cdf0e10cSrcweir bool PagePrimitiveExtractor::isDrawModeBlackWhite() const { return mrViewObjectContactOfPageObj.GetObjectContact().isDrawModeBlackWhite(); } 197cdf0e10cSrcweir bool PagePrimitiveExtractor::isDrawModeHighContrast() const { return mrViewObjectContactOfPageObj.GetObjectContact().isDrawModeHighContrast(); } 198cdf0e10cSrcweir SdrPageView* PagePrimitiveExtractor::TryToGetSdrPageView() const { return mrViewObjectContactOfPageObj.GetObjectContact().TryToGetSdrPageView(); } 199cdf0e10cSrcweir OutputDevice* PagePrimitiveExtractor::TryToGetOutputDevice() const { return mrViewObjectContactOfPageObj.GetObjectContact().TryToGetOutputDevice(); } 200cdf0e10cSrcweir } // end of namespace contact 201cdf0e10cSrcweir } // end of namespace sdr 202cdf0e10cSrcweir 203cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 204cdf0e10cSrcweir 205cdf0e10cSrcweir namespace sdr 206cdf0e10cSrcweir { 207cdf0e10cSrcweir namespace contact 208cdf0e10cSrcweir { 209cdf0e10cSrcweir drawinglayer::primitive2d::Primitive2DSequence ViewObjectContactOfPageObj::createPrimitive2DSequence(const DisplayInfo& rDisplayInfo) const 210cdf0e10cSrcweir { 211cdf0e10cSrcweir drawinglayer::primitive2d::Primitive2DSequence xRetval; 212cdf0e10cSrcweir const SdrPageObj& rPageObject((static_cast< ViewContactOfPageObj& >(GetViewContact())).GetPageObj()); 213cdf0e10cSrcweir const SdrPage* pPage = rPageObject.GetReferencedPage(); 214cdf0e10cSrcweir const svtools::ColorConfig aColorConfig; 215cdf0e10cSrcweir 216cdf0e10cSrcweir // get PageObject's geometry 217cdf0e10cSrcweir basegfx::B2DHomMatrix aPageObjectTransform; 218cdf0e10cSrcweir { 219cdf0e10cSrcweir const Rectangle aPageObjectModelData(rPageObject.GetLastBoundRect()); 220cdf0e10cSrcweir const basegfx::B2DRange aPageObjectBound( 221cdf0e10cSrcweir aPageObjectModelData.Left(), aPageObjectModelData.Top(), 222cdf0e10cSrcweir aPageObjectModelData.Right(), aPageObjectModelData.Bottom()); 223cdf0e10cSrcweir 224cdf0e10cSrcweir aPageObjectTransform.set(0, 0, aPageObjectBound.getWidth()); 225cdf0e10cSrcweir aPageObjectTransform.set(1, 1, aPageObjectBound.getHeight()); 226cdf0e10cSrcweir aPageObjectTransform.set(0, 2, aPageObjectBound.getMinX()); 227cdf0e10cSrcweir aPageObjectTransform.set(1, 2, aPageObjectBound.getMinY()); 228cdf0e10cSrcweir } 229cdf0e10cSrcweir 230cdf0e10cSrcweir // #i102637# add gray frame also when printing and page exists (handout pages) 231cdf0e10cSrcweir const bool bCreateGrayFrame(!GetObjectContact().isOutputToPrinter() || pPage); 232cdf0e10cSrcweir 233cdf0e10cSrcweir // get displayed page's content. This is the uscaled page content 234cdf0e10cSrcweir if(mpExtractor && pPage) 235cdf0e10cSrcweir { 236cdf0e10cSrcweir // get displayed page's geometry 237cdf0e10cSrcweir drawinglayer::primitive2d::Primitive2DSequence xPageContent; 238cdf0e10cSrcweir const Size aPageSize(pPage->GetSize()); 239cdf0e10cSrcweir const double fPageWidth(aPageSize.getWidth()); 240cdf0e10cSrcweir const double fPageHeight(aPageSize.getHeight()); 241cdf0e10cSrcweir 242cdf0e10cSrcweir // The case that a PageObject contains another PageObject which visualizes the 243cdf0e10cSrcweir // same page again would lead to a recursion. Limit that recursion depth to one 244cdf0e10cSrcweir // by using a local static bool 245cdf0e10cSrcweir static bool bInCreatePrimitive2D(false); 246cdf0e10cSrcweir 247cdf0e10cSrcweir if(bInCreatePrimitive2D) 248cdf0e10cSrcweir { 249cdf0e10cSrcweir // Recursion is possible. Create a replacement primitive 250cdf0e10cSrcweir xPageContent.realloc(2); 251cdf0e10cSrcweir const Color aDocColor(aColorConfig.GetColorValue(svtools::DOCCOLOR).nColor); 252cdf0e10cSrcweir const Color aBorderColor(aColorConfig.GetColorValue(svtools::DOCBOUNDARIES).nColor); 253cdf0e10cSrcweir const basegfx::B2DRange aPageBound(0.0, 0.0, fPageWidth, fPageHeight); 254cdf0e10cSrcweir const basegfx::B2DPolygon aOutline(basegfx::tools::createPolygonFromRect(aPageBound)); 255cdf0e10cSrcweir 256cdf0e10cSrcweir // add replacement fill 257cdf0e10cSrcweir xPageContent[0L] = drawinglayer::primitive2d::Primitive2DReference( 258cdf0e10cSrcweir new drawinglayer::primitive2d::PolyPolygonColorPrimitive2D(basegfx::B2DPolyPolygon(aOutline), aDocColor.getBColor())); 259cdf0e10cSrcweir 260cdf0e10cSrcweir // add replacement border 261cdf0e10cSrcweir xPageContent[1L] = drawinglayer::primitive2d::Primitive2DReference( 262cdf0e10cSrcweir new drawinglayer::primitive2d::PolygonHairlinePrimitive2D(aOutline, aBorderColor.getBColor())); 263cdf0e10cSrcweir } 264cdf0e10cSrcweir else 265cdf0e10cSrcweir { 266cdf0e10cSrcweir // set recursion flag 267cdf0e10cSrcweir bInCreatePrimitive2D = true; 268cdf0e10cSrcweir 269cdf0e10cSrcweir // init extractor, guarantee existance, set page there 270cdf0e10cSrcweir mpExtractor->SetStartPage(pPage); 271cdf0e10cSrcweir 272cdf0e10cSrcweir // #i105548# also need to copy the VOCRedirector for sub-content creation 273cdf0e10cSrcweir mpExtractor->SetViewObjectContactRedirector(GetObjectContact().GetViewObjectContactRedirector()); 274cdf0e10cSrcweir 275cdf0e10cSrcweir // create page content 276cdf0e10cSrcweir xPageContent = mpExtractor->createPrimitive2DSequenceForPage(rDisplayInfo); 277cdf0e10cSrcweir 278cdf0e10cSrcweir // #i105548# reset VOCRedirector to not accidentially have a pointer to a 279cdf0e10cSrcweir // temporary class, so calls to it are avoided safely 280cdf0e10cSrcweir mpExtractor->SetViewObjectContactRedirector(0); 281cdf0e10cSrcweir 282cdf0e10cSrcweir // reset recursion flag 283cdf0e10cSrcweir bInCreatePrimitive2D = false; 284cdf0e10cSrcweir } 285cdf0e10cSrcweir 286cdf0e10cSrcweir // prepare retval 287cdf0e10cSrcweir if(xPageContent.hasElements()) 288cdf0e10cSrcweir { 289cdf0e10cSrcweir const uno::Reference< drawing::XDrawPage > xDrawPage(GetXDrawPageForSdrPage(const_cast< SdrPage*>(pPage))); 290cdf0e10cSrcweir const drawinglayer::primitive2d::Primitive2DReference xPagePreview(new drawinglayer::primitive2d::PagePreviewPrimitive2D( 291cdf0e10cSrcweir xDrawPage, aPageObjectTransform, fPageWidth, fPageHeight, xPageContent, true)); 292cdf0e10cSrcweir xRetval = drawinglayer::primitive2d::Primitive2DSequence(&xPagePreview, 1); 293cdf0e10cSrcweir } 294cdf0e10cSrcweir } 295cdf0e10cSrcweir else if(bCreateGrayFrame) 296cdf0e10cSrcweir { 297cdf0e10cSrcweir // #i105146# no content, but frame display. To make hitting the page preview objects 298cdf0e10cSrcweir // on the handout page more simple, add hidden fill geometry 299cdf0e10cSrcweir const drawinglayer::primitive2d::Primitive2DReference xFrameHit( 300cdf0e10cSrcweir drawinglayer::primitive2d::createHiddenGeometryPrimitives2D( 301cdf0e10cSrcweir false, 302cdf0e10cSrcweir aPageObjectTransform)); 303cdf0e10cSrcweir xRetval = drawinglayer::primitive2d::Primitive2DSequence(&xFrameHit, 1); 304cdf0e10cSrcweir } 305cdf0e10cSrcweir 306cdf0e10cSrcweir // add a gray outline frame, except not when printing 307cdf0e10cSrcweir if(bCreateGrayFrame) 308cdf0e10cSrcweir { 309cdf0e10cSrcweir const Color aFrameColor(aColorConfig.GetColorValue(svtools::OBJECTBOUNDARIES).nColor); 310cdf0e10cSrcweir basegfx::B2DPolygon aOwnOutline(basegfx::tools::createUnitPolygon()); 311cdf0e10cSrcweir aOwnOutline.transform(aPageObjectTransform); 312cdf0e10cSrcweir 313cdf0e10cSrcweir const drawinglayer::primitive2d::Primitive2DReference xGrayFrame( 314cdf0e10cSrcweir new drawinglayer::primitive2d::PolygonHairlinePrimitive2D(aOwnOutline, aFrameColor.getBColor())); 315cdf0e10cSrcweir 316cdf0e10cSrcweir drawinglayer::primitive2d::appendPrimitive2DReferenceToPrimitive2DSequence(xRetval, xGrayFrame); 317cdf0e10cSrcweir } 318cdf0e10cSrcweir 319cdf0e10cSrcweir return xRetval; 320cdf0e10cSrcweir } 321cdf0e10cSrcweir 322cdf0e10cSrcweir ViewObjectContactOfPageObj::ViewObjectContactOfPageObj(ObjectContact& rObjectContact, ViewContact& rViewContact) 323cdf0e10cSrcweir : ViewObjectContactOfSdrObj(rObjectContact, rViewContact), 324cdf0e10cSrcweir mpExtractor(new PagePrimitiveExtractor(*this)) 325cdf0e10cSrcweir { 326cdf0e10cSrcweir } 327cdf0e10cSrcweir 328cdf0e10cSrcweir ViewObjectContactOfPageObj::~ViewObjectContactOfPageObj() 329cdf0e10cSrcweir { 330cdf0e10cSrcweir // delete the helper OC 331cdf0e10cSrcweir if(mpExtractor) 332cdf0e10cSrcweir { 333cdf0e10cSrcweir // remember candidate and reset own pointer to avoid action when createPrimitive2DSequence() 334cdf0e10cSrcweir // would be called for any reason 335cdf0e10cSrcweir PagePrimitiveExtractor* pCandidate = mpExtractor; 336cdf0e10cSrcweir mpExtractor = 0; 337cdf0e10cSrcweir 338cdf0e10cSrcweir // also reset the StartPage to avoid ActionChanged() forwardings in the 339cdf0e10cSrcweir // PagePrimitiveExtractor::InvalidatePartOfView() implementation 340cdf0e10cSrcweir pCandidate->SetStartPage(0); 341cdf0e10cSrcweir delete pCandidate; 342cdf0e10cSrcweir } 343cdf0e10cSrcweir } 344cdf0e10cSrcweir } // end of namespace contact 345cdf0e10cSrcweir } // end of namespace sdr 346cdf0e10cSrcweir 347cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 348cdf0e10cSrcweir // eof 349