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 10cdf0e10cSrcweir * 11*f6e50924SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 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. 19cdf0e10cSrcweir * 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 #include <svx/svdpagv.hxx> 27cdf0e10cSrcweir #include <com/sun/star/awt/XWindow.hpp> 28cdf0e10cSrcweir #include <com/sun/star/awt/PosSize.hpp> 29cdf0e10cSrcweir #include <comphelper/processfactory.hxx> 30cdf0e10cSrcweir #include <svx/svdoutl.hxx> 31cdf0e10cSrcweir #include <svx/xpoly.hxx> 32cdf0e10cSrcweir #include <svx/svdouno.hxx> 33cdf0e10cSrcweir #include <svx/svdpage.hxx> 34cdf0e10cSrcweir #include <svx/svdview.hxx> 35cdf0e10cSrcweir 36cdf0e10cSrcweir #include <svx/svdedxv.hxx> 37cdf0e10cSrcweir #include <svx/svdpagv.hxx> 38cdf0e10cSrcweir #include <svx/svdoutl.hxx> 39cdf0e10cSrcweir #include <svx/svdpagv.hxx> 40cdf0e10cSrcweir #include <editeng/outliner.hxx> 41cdf0e10cSrcweir #include <svx/svdetc.hxx> 42cdf0e10cSrcweir #include <svx/svdobj.hxx> 43cdf0e10cSrcweir #include <svx/svdouno.hxx> 44cdf0e10cSrcweir #include <svx/svdpage.hxx> 45cdf0e10cSrcweir #include <svx/svdview.hxx> 46cdf0e10cSrcweir #include "svx/svditer.hxx" 47cdf0e10cSrcweir #include <svx/svdogrp.hxx> 48cdf0e10cSrcweir #include <svx/svdtypes.hxx> 49cdf0e10cSrcweir 50cdf0e10cSrcweir #include <svx/svdotext.hxx> // fuer PaintOutlinerView 51cdf0e10cSrcweir #include <svx/svdoole2.hxx> 52cdf0e10cSrcweir 53cdf0e10cSrcweir // #110094# 54cdf0e10cSrcweir #include <svx/sdr/contact/objectcontactofpageview.hxx> 55cdf0e10cSrcweir #include <svx/svdogrp.hxx> 56cdf0e10cSrcweir #include <svx/sdr/contact/viewobjectcontactredirector.hxx> 57cdf0e10cSrcweir #include <svx/fmview.hxx> 58cdf0e10cSrcweir 59cdf0e10cSrcweir // for search on vector 60cdf0e10cSrcweir #include <algorithm> 61cdf0e10cSrcweir 62cdf0e10cSrcweir using namespace ::rtl; 63cdf0e10cSrcweir using namespace ::com::sun::star; 64cdf0e10cSrcweir #include <svx/sdrpagewindow.hxx> 65cdf0e10cSrcweir #include <svx/sdrpaintwindow.hxx> 66cdf0e10cSrcweir 67cdf0e10cSrcweir TYPEINIT1(SdrPageView, SfxListener); 68cdf0e10cSrcweir DBG_NAME(SdrPageView); 69cdf0e10cSrcweir 70cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////// 71cdf0e10cSrcweir // interface to SdrPageWindow 72cdf0e10cSrcweir 73cdf0e10cSrcweir SdrPageWindow* SdrPageView::FindPageWindow(SdrPaintWindow& rPaintWindow) const 74cdf0e10cSrcweir { 75cdf0e10cSrcweir for(SdrPageWindowVector::const_iterator a = maPageWindows.begin(); a != maPageWindows.end(); a++) 76cdf0e10cSrcweir { 77cdf0e10cSrcweir if(&((*a)->GetPaintWindow()) == &rPaintWindow) 78cdf0e10cSrcweir { 79cdf0e10cSrcweir return *a; 80cdf0e10cSrcweir } 81cdf0e10cSrcweir } 82cdf0e10cSrcweir 83cdf0e10cSrcweir return 0L; 84cdf0e10cSrcweir } 85cdf0e10cSrcweir 86cdf0e10cSrcweir const SdrPageWindow* SdrPageView::FindPatchedPageWindow( const OutputDevice& _rOutDev ) const 87cdf0e10cSrcweir { 88cdf0e10cSrcweir for ( SdrPageWindowVector::const_iterator loop = maPageWindows.begin(); 89cdf0e10cSrcweir loop != maPageWindows.end(); 90cdf0e10cSrcweir ++loop 91cdf0e10cSrcweir ) 92cdf0e10cSrcweir { 93cdf0e10cSrcweir const SdrPageWindow& rPageWindow( *(*loop) ); 94cdf0e10cSrcweir const SdrPaintWindow& rPaintWindow( rPageWindow.GetOriginalPaintWindow() ? *rPageWindow.GetOriginalPaintWindow() : rPageWindow.GetPaintWindow() ); 95cdf0e10cSrcweir if ( &rPaintWindow.GetOutputDevice() == &_rOutDev ) 96cdf0e10cSrcweir { 97cdf0e10cSrcweir return &rPageWindow; 98cdf0e10cSrcweir } 99cdf0e10cSrcweir } 100cdf0e10cSrcweir 101cdf0e10cSrcweir return NULL; 102cdf0e10cSrcweir } 103cdf0e10cSrcweir 104cdf0e10cSrcweir SdrPageWindow* SdrPageView::FindPageWindow(const OutputDevice& rOutDev) const 105cdf0e10cSrcweir { 106cdf0e10cSrcweir for(SdrPageWindowVector::const_iterator a = maPageWindows.begin(); a != maPageWindows.end(); a++) 107cdf0e10cSrcweir { 108cdf0e10cSrcweir if(&((*a)->GetPaintWindow().GetOutputDevice()) == &rOutDev) 109cdf0e10cSrcweir { 110cdf0e10cSrcweir return *a; 111cdf0e10cSrcweir } 112cdf0e10cSrcweir } 113cdf0e10cSrcweir 114cdf0e10cSrcweir return 0L; 115cdf0e10cSrcweir } 116cdf0e10cSrcweir 117cdf0e10cSrcweir SdrPageWindow* SdrPageView::GetPageWindow(sal_uInt32 nIndex) const 118cdf0e10cSrcweir { 119cdf0e10cSrcweir // #126416# 120cdf0e10cSrcweir if(nIndex < maPageWindows.size()) 121cdf0e10cSrcweir { 122cdf0e10cSrcweir return maPageWindows[nIndex]; 123cdf0e10cSrcweir } 124cdf0e10cSrcweir 125cdf0e10cSrcweir return 0L; 126cdf0e10cSrcweir } 127cdf0e10cSrcweir 128cdf0e10cSrcweir void SdrPageView::ClearPageWindows() 129cdf0e10cSrcweir { 130cdf0e10cSrcweir // #126416# 131cdf0e10cSrcweir for(SdrPageWindowVector::const_iterator a = maPageWindows.begin(); a != maPageWindows.end(); a++) 132cdf0e10cSrcweir { 133cdf0e10cSrcweir delete *a; 134cdf0e10cSrcweir } 135cdf0e10cSrcweir 136cdf0e10cSrcweir maPageWindows.clear(); 137cdf0e10cSrcweir } 138cdf0e10cSrcweir 139cdf0e10cSrcweir void SdrPageView::AppendPageWindow(SdrPageWindow& rNew) 140cdf0e10cSrcweir { 141cdf0e10cSrcweir maPageWindows.push_back(&rNew); 142cdf0e10cSrcweir } 143cdf0e10cSrcweir 144cdf0e10cSrcweir SdrPageWindow* SdrPageView::RemovePageWindow(sal_uInt32 nPos) 145cdf0e10cSrcweir { 146cdf0e10cSrcweir if(nPos < maPageWindows.size()) 147cdf0e10cSrcweir { 148cdf0e10cSrcweir SdrPageWindowVector::iterator aAccess = maPageWindows.begin() + nPos; 149cdf0e10cSrcweir // #114376# remember return value 150cdf0e10cSrcweir SdrPageWindow* pErasedSdrPageWindow = *aAccess; 151cdf0e10cSrcweir maPageWindows.erase(aAccess); 152cdf0e10cSrcweir return pErasedSdrPageWindow; 153cdf0e10cSrcweir } 154cdf0e10cSrcweir 155cdf0e10cSrcweir return 0L; 156cdf0e10cSrcweir } 157cdf0e10cSrcweir 158cdf0e10cSrcweir SdrPageWindow* SdrPageView::RemovePageWindow(SdrPageWindow& rOld) 159cdf0e10cSrcweir { 160cdf0e10cSrcweir const SdrPageWindowVector::iterator aFindResult = ::std::find(maPageWindows.begin(), maPageWindows.end(), &rOld); 161cdf0e10cSrcweir 162cdf0e10cSrcweir if(aFindResult != maPageWindows.end()) 163cdf0e10cSrcweir { 164cdf0e10cSrcweir // #114376# remember return value 165cdf0e10cSrcweir SdrPageWindow* pSdrPageWindow = *aFindResult; 166cdf0e10cSrcweir maPageWindows.erase(aFindResult); 167cdf0e10cSrcweir return pSdrPageWindow; 168cdf0e10cSrcweir } 169cdf0e10cSrcweir 170cdf0e10cSrcweir return 0L; 171cdf0e10cSrcweir } 172cdf0e10cSrcweir 173cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 174cdf0e10cSrcweir 175cdf0e10cSrcweir SdrPageView::SdrPageView(SdrPage* pPage1, SdrView& rNewView) 176cdf0e10cSrcweir : mrView(rNewView), 177cdf0e10cSrcweir // #103911# col_auto color lets the view takes the default SvxColorConfig entry 178cdf0e10cSrcweir maDocumentColor( COL_AUTO ), 179cdf0e10cSrcweir maBackgroundColor(COL_AUTO ), // #i48367# also react on autocolor 180cdf0e10cSrcweir mpPreparedPageWindow(0) // #i72752# 181cdf0e10cSrcweir { 182cdf0e10cSrcweir DBG_CTOR(SdrPageView,NULL); 183cdf0e10cSrcweir mpPage = pPage1; 184cdf0e10cSrcweir 185cdf0e10cSrcweir if(mpPage) 186cdf0e10cSrcweir { 187cdf0e10cSrcweir aPgOrg.X()=mpPage->GetLftBorder(); 188cdf0e10cSrcweir aPgOrg.Y()=mpPage->GetUppBorder(); 189cdf0e10cSrcweir } 190cdf0e10cSrcweir mbHasMarked = sal_False; 191cdf0e10cSrcweir aLayerVisi.SetAll(); 192cdf0e10cSrcweir aLayerPrn.SetAll(); 193cdf0e10cSrcweir 194cdf0e10cSrcweir mbVisible = sal_False; 195cdf0e10cSrcweir pAktList = NULL; 196cdf0e10cSrcweir pAktGroup = NULL; 197cdf0e10cSrcweir SetAktGroupAndList(NULL, mpPage); 198cdf0e10cSrcweir 199cdf0e10cSrcweir StartListening(*rNewView.GetModel()); 200cdf0e10cSrcweir 201cdf0e10cSrcweir for(sal_uInt32 a(0L); a < rNewView.PaintWindowCount(); a++) 202cdf0e10cSrcweir { 203cdf0e10cSrcweir AddPaintWindowToPageView(*rNewView.GetPaintWindow(a)); 204cdf0e10cSrcweir } 205cdf0e10cSrcweir } 206cdf0e10cSrcweir 207cdf0e10cSrcweir SdrPageView::~SdrPageView() 208cdf0e10cSrcweir { 209cdf0e10cSrcweir DBG_DTOR(SdrPageView,NULL); 210cdf0e10cSrcweir 211cdf0e10cSrcweir // cleanup window vector 212cdf0e10cSrcweir ClearPageWindows(); 213cdf0e10cSrcweir } 214cdf0e10cSrcweir 215cdf0e10cSrcweir SdrPageWindow& SdrPageView::CreateNewPageWindowEntry(SdrPaintWindow& rPaintWindow) 216cdf0e10cSrcweir { 217cdf0e10cSrcweir // MIB 3.7.08: Das WinRec muss sofort in die Liste eingetragen werden, 218cdf0e10cSrcweir // weil sich das InsertControlContainer darauf verlaesst 219cdf0e10cSrcweir //SdrPageViewWinRec* pRec = new SdrPageViewWinRec( *this, pOut ); 220cdf0e10cSrcweir //pWinList->Insert(pRec); 221cdf0e10cSrcweir SdrPageWindow& rWindow = *(new SdrPageWindow(*this, rPaintWindow)); 222cdf0e10cSrcweir AppendPageWindow(rWindow); 223cdf0e10cSrcweir 224cdf0e10cSrcweir return rWindow; 225cdf0e10cSrcweir } 226cdf0e10cSrcweir 227cdf0e10cSrcweir void SdrPageView::AddPaintWindowToPageView(SdrPaintWindow& rPaintWindow) 228cdf0e10cSrcweir { 229cdf0e10cSrcweir if(!FindPageWindow(rPaintWindow)) 230cdf0e10cSrcweir { 231cdf0e10cSrcweir CreateNewPageWindowEntry(rPaintWindow); 232cdf0e10cSrcweir } 233cdf0e10cSrcweir } 234cdf0e10cSrcweir 235cdf0e10cSrcweir void SdrPageView::RemovePaintWindowFromPageView(SdrPaintWindow& rPaintWindow) 236cdf0e10cSrcweir { 237cdf0e10cSrcweir SdrPageWindow* pCandidate = FindPageWindow(rPaintWindow); 238cdf0e10cSrcweir 239cdf0e10cSrcweir if(pCandidate) 240cdf0e10cSrcweir { 241cdf0e10cSrcweir pCandidate = RemovePageWindow(*pCandidate); 242cdf0e10cSrcweir 243cdf0e10cSrcweir if(pCandidate) 244cdf0e10cSrcweir { 245cdf0e10cSrcweir delete pCandidate; 246cdf0e10cSrcweir } 247cdf0e10cSrcweir } 248cdf0e10cSrcweir } 249cdf0e10cSrcweir 250cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlContainer > SdrPageView::GetControlContainer( const OutputDevice& _rDevice ) const 251cdf0e10cSrcweir { 252cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlContainer > xReturn; 253cdf0e10cSrcweir const SdrPageWindow* pCandidate = FindPatchedPageWindow( _rDevice ); 254cdf0e10cSrcweir 255cdf0e10cSrcweir if ( pCandidate ) 256cdf0e10cSrcweir xReturn = pCandidate->GetControlContainer( true ); 257cdf0e10cSrcweir 258cdf0e10cSrcweir return xReturn; 259cdf0e10cSrcweir } 260cdf0e10cSrcweir 261cdf0e10cSrcweir void __EXPORT SdrPageView::Notify(SfxBroadcaster& /*rBC*/, const SfxHint& /*rHint*/) 262cdf0e10cSrcweir { 263cdf0e10cSrcweir // not really interested in 264cdf0e10cSrcweir } 265cdf0e10cSrcweir 266cdf0e10cSrcweir void SdrPageView::ModelHasChanged() 267cdf0e10cSrcweir { 268cdf0e10cSrcweir if (GetAktGroup()!=NULL) CheckAktGroup(); 269cdf0e10cSrcweir } 270cdf0e10cSrcweir 271cdf0e10cSrcweir sal_Bool SdrPageView::IsReadOnly() const 272cdf0e10cSrcweir { 273cdf0e10cSrcweir return (0L == GetPage() || GetView().GetModel()->IsReadOnly() || GetPage()->IsReadOnly() || GetObjList()->IsReadOnly()); 274cdf0e10cSrcweir } 275cdf0e10cSrcweir 276cdf0e10cSrcweir void SdrPageView::Show() 277cdf0e10cSrcweir { 278cdf0e10cSrcweir if(!IsVisible()) 279cdf0e10cSrcweir { 280cdf0e10cSrcweir mbVisible = sal_True; 281cdf0e10cSrcweir InvalidateAllWin(); 282cdf0e10cSrcweir 283cdf0e10cSrcweir for(sal_uInt32 a(0L); a < GetView().PaintWindowCount(); a++) 284cdf0e10cSrcweir { 285cdf0e10cSrcweir AddPaintWindowToPageView(*GetView().GetPaintWindow(a)); 286cdf0e10cSrcweir } 287cdf0e10cSrcweir } 288cdf0e10cSrcweir } 289cdf0e10cSrcweir 290cdf0e10cSrcweir void SdrPageView::Hide() 291cdf0e10cSrcweir { 292cdf0e10cSrcweir if(IsVisible()) 293cdf0e10cSrcweir { 294cdf0e10cSrcweir InvalidateAllWin(); 295cdf0e10cSrcweir mbVisible = sal_False; 296cdf0e10cSrcweir ClearPageWindows(); 297cdf0e10cSrcweir } 298cdf0e10cSrcweir } 299cdf0e10cSrcweir 300cdf0e10cSrcweir Rectangle SdrPageView::GetPageRect() const 301cdf0e10cSrcweir { 302cdf0e10cSrcweir if (GetPage()==NULL) return Rectangle(); 303cdf0e10cSrcweir return Rectangle(Point(),Size(GetPage()->GetWdt()+1,GetPage()->GetHgt()+1)); 304cdf0e10cSrcweir } 305cdf0e10cSrcweir 306cdf0e10cSrcweir void SdrPageView::InvalidateAllWin() 307cdf0e10cSrcweir { 308cdf0e10cSrcweir if(IsVisible() && GetPage()) 309cdf0e10cSrcweir { 310cdf0e10cSrcweir Rectangle aRect(Point(0,0),Size(GetPage()->GetWdt()+1,GetPage()->GetHgt()+1)); 311cdf0e10cSrcweir aRect.Union(GetPage()->GetAllObjBoundRect()); 312cdf0e10cSrcweir GetView().InvalidateAllWin(aRect); 313cdf0e10cSrcweir } 314cdf0e10cSrcweir } 315cdf0e10cSrcweir 316cdf0e10cSrcweir void SdrPageView::InvalidateAllWin(const Rectangle& rRect, sal_Bool bPlus1Pix) 317cdf0e10cSrcweir { 318cdf0e10cSrcweir if(IsVisible()) 319cdf0e10cSrcweir { 320cdf0e10cSrcweir GetView().InvalidateAllWin(rRect, bPlus1Pix); 321cdf0e10cSrcweir } 322cdf0e10cSrcweir } 323cdf0e10cSrcweir 324cdf0e10cSrcweir void SdrPageView::PaintOutlinerView(OutputDevice* pOut, const Rectangle& rRect) const 325cdf0e10cSrcweir { 326cdf0e10cSrcweir if (GetView().pTextEditOutliner==NULL) return; 327cdf0e10cSrcweir //const SdrObject* pTextObjTmp=GetView().GetTextEditObject(); 328cdf0e10cSrcweir //const SdrTextObj* pText=PTR_CAST(SdrTextObj,pTextObjTmp); 329cdf0e10cSrcweir //FASTBOOL bTextFrame=pText!=NULL && pText->IsTextFrame(); 330cdf0e10cSrcweir sal_uIntPtr nViewAnz=GetView().pTextEditOutliner->GetViewCount(); 331cdf0e10cSrcweir for (sal_uIntPtr i=0; i<nViewAnz; i++) { 332cdf0e10cSrcweir OutlinerView* pOLV=GetView().pTextEditOutliner->GetView(i); 333cdf0e10cSrcweir if (pOLV->GetWindow()==pOut) { 334cdf0e10cSrcweir GetView().ImpPaintOutlinerView(*pOLV, rRect); 335cdf0e10cSrcweir return; 336cdf0e10cSrcweir } 337cdf0e10cSrcweir } 338cdf0e10cSrcweir } 339cdf0e10cSrcweir 340cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////// 341cdf0e10cSrcweir 342cdf0e10cSrcweir void SdrPageView::PrePaint() 343cdf0e10cSrcweir { 344cdf0e10cSrcweir const sal_uInt32 nCount(PageWindowCount()); 345cdf0e10cSrcweir 346cdf0e10cSrcweir for(sal_uInt32 a(0); a < nCount; a++) 347cdf0e10cSrcweir { 348cdf0e10cSrcweir SdrPageWindow* pCandidate = GetPageWindow(a); 349cdf0e10cSrcweir 350cdf0e10cSrcweir if(pCandidate) 351cdf0e10cSrcweir { 352cdf0e10cSrcweir pCandidate->PrePaint(); 353cdf0e10cSrcweir } 354cdf0e10cSrcweir } 355cdf0e10cSrcweir } 356cdf0e10cSrcweir 357cdf0e10cSrcweir void SdrPageView::PostPaint() 358cdf0e10cSrcweir { 359cdf0e10cSrcweir const sal_uInt32 nCount(PageWindowCount()); 360cdf0e10cSrcweir 361cdf0e10cSrcweir for(sal_uInt32 a(0); a < nCount; a++) 362cdf0e10cSrcweir { 363cdf0e10cSrcweir SdrPageWindow* pCandidate = GetPageWindow(a); 364cdf0e10cSrcweir 365cdf0e10cSrcweir if(pCandidate) 366cdf0e10cSrcweir { 367cdf0e10cSrcweir pCandidate->PostPaint(); 368cdf0e10cSrcweir } 369cdf0e10cSrcweir } 370cdf0e10cSrcweir } 371cdf0e10cSrcweir 372cdf0e10cSrcweir void SdrPageView::CompleteRedraw(SdrPaintWindow& rPaintWindow, const Region& rReg, sdr::contact::ViewObjectContactRedirector* pRedirector) const 373cdf0e10cSrcweir { 374cdf0e10cSrcweir if(GetPage()) 375cdf0e10cSrcweir { 376cdf0e10cSrcweir SdrPageWindow* pPageWindow = FindPageWindow(rPaintWindow); 377cdf0e10cSrcweir sal_Bool bIsTempTarget(sal_False); 378cdf0e10cSrcweir 379cdf0e10cSrcweir if(!pPageWindow) 380cdf0e10cSrcweir { 381cdf0e10cSrcweir // create temp PageWindow 382cdf0e10cSrcweir pPageWindow = new SdrPageWindow(*((SdrPageView*)this), rPaintWindow); 383cdf0e10cSrcweir bIsTempTarget = sal_True; 384cdf0e10cSrcweir } 385cdf0e10cSrcweir 386cdf0e10cSrcweir // do the redraw 387cdf0e10cSrcweir pPageWindow->PrepareRedraw(rReg); 388cdf0e10cSrcweir pPageWindow->RedrawAll(pRedirector); 389cdf0e10cSrcweir 390cdf0e10cSrcweir // get rid of temp PageWindow 391cdf0e10cSrcweir if(bIsTempTarget) 392cdf0e10cSrcweir { 393cdf0e10cSrcweir delete pPageWindow; 394cdf0e10cSrcweir pPageWindow = 0L; 395cdf0e10cSrcweir } 396cdf0e10cSrcweir } 397cdf0e10cSrcweir } 398cdf0e10cSrcweir 399cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////// 400cdf0e10cSrcweir // #i74769# use SdrPaintWindow directly 401cdf0e10cSrcweir 402cdf0e10cSrcweir void SdrPageView::setPreparedPageWindow(SdrPageWindow* pKnownTarget) 403cdf0e10cSrcweir { 404cdf0e10cSrcweir // #i72752# remember prepared SdrPageWindow 405cdf0e10cSrcweir mpPreparedPageWindow = pKnownTarget; 406cdf0e10cSrcweir } 407cdf0e10cSrcweir 408cdf0e10cSrcweir void SdrPageView::DrawLayer(SdrLayerID nID, OutputDevice* pGivenTarget, sdr::contact::ViewObjectContactRedirector* pRedirector) const 409cdf0e10cSrcweir { 410cdf0e10cSrcweir if(GetPage()) 411cdf0e10cSrcweir { 412cdf0e10cSrcweir if(pGivenTarget) 413cdf0e10cSrcweir { 414cdf0e10cSrcweir const SdrPageWindow* pKnownTarget = FindPageWindow(*pGivenTarget); 415cdf0e10cSrcweir 416cdf0e10cSrcweir if(pKnownTarget) 417cdf0e10cSrcweir { 418cdf0e10cSrcweir // paint known target 419cdf0e10cSrcweir pKnownTarget->RedrawLayer(&nID, pRedirector); 420cdf0e10cSrcweir } 421cdf0e10cSrcweir else 422cdf0e10cSrcweir { 423cdf0e10cSrcweir // #i72752# DrawLayer() uses a OutputDevice different from BeginDrawLayer. This happens 424cdf0e10cSrcweir // e.g. when SW paints a single text line in text edit mode. Try to use it 425cdf0e10cSrcweir SdrPageWindow* pPreparedTarget = mpPreparedPageWindow; 426cdf0e10cSrcweir 427cdf0e10cSrcweir if(pPreparedTarget) 428cdf0e10cSrcweir { 429cdf0e10cSrcweir // if we have a prepared target, do not use a new SdrPageWindow since this 430cdf0e10cSrcweir // works but is expensive. Just use a temporary PaintWindow 431cdf0e10cSrcweir SdrPaintWindow aTemporaryPaintWindow(mrView, *pGivenTarget); 432cdf0e10cSrcweir 433cdf0e10cSrcweir // Copy existing paint region to use the same as prepared in BeginDrawLayer 434cdf0e10cSrcweir SdrPaintWindow& rExistingPaintWindow = pPreparedTarget->GetPaintWindow(); 435cdf0e10cSrcweir const Region& rExistingRegion = rExistingPaintWindow.GetRedrawRegion(); 436cdf0e10cSrcweir aTemporaryPaintWindow.SetRedrawRegion(rExistingRegion); 437cdf0e10cSrcweir 438cdf0e10cSrcweir // patch the ExistingPageWindow 439cdf0e10cSrcweir pPreparedTarget->patchPaintWindow(aTemporaryPaintWindow); 440cdf0e10cSrcweir 441cdf0e10cSrcweir // redraw the layer 442cdf0e10cSrcweir pPreparedTarget->RedrawLayer(&nID, pRedirector); 443cdf0e10cSrcweir 444cdf0e10cSrcweir // restore the ExistingPageWindow 445cdf0e10cSrcweir pPreparedTarget->unpatchPaintWindow(); 446cdf0e10cSrcweir } 447cdf0e10cSrcweir else 448cdf0e10cSrcweir { 449cdf0e10cSrcweir OSL_ENSURE(false, "SdrPageView::DrawLayer: Creating temporary SdrPageWindow (ObjectContact), this should never be needed (!)"); 450cdf0e10cSrcweir 451cdf0e10cSrcweir // None of the known OutputDevices is the target of this paint, use 452cdf0e10cSrcweir // a temporary SdrPageWindow for this Redraw. 453cdf0e10cSrcweir SdrPaintWindow aTemporaryPaintWindow(mrView, *pGivenTarget); 454cdf0e10cSrcweir SdrPageWindow aTemporaryPageWindow(*((SdrPageView*)this), aTemporaryPaintWindow); 455cdf0e10cSrcweir 456cdf0e10cSrcweir // #i72752# 457cdf0e10cSrcweir // Copy existing paint region if other PageWindows exist, this was created by 458cdf0e10cSrcweir // PrepareRedraw() from BeginDrawLayer(). Needs to be used e.g. when suddenly SW 459cdf0e10cSrcweir // paints into an unknown device other than the view was created for (e.g. VirtualDevice) 460cdf0e10cSrcweir if(PageWindowCount()) 461cdf0e10cSrcweir { 462cdf0e10cSrcweir SdrPageWindow* pExistingPageWindow = GetPageWindow(0L); 463cdf0e10cSrcweir SdrPaintWindow& rExistingPaintWindow = pExistingPageWindow->GetPaintWindow(); 464cdf0e10cSrcweir const Region& rExistingRegion = rExistingPaintWindow.GetRedrawRegion(); 465cdf0e10cSrcweir aTemporaryPaintWindow.SetRedrawRegion(rExistingRegion); 466cdf0e10cSrcweir } 467cdf0e10cSrcweir 468cdf0e10cSrcweir aTemporaryPageWindow.RedrawLayer(&nID, pRedirector); 469cdf0e10cSrcweir } 470cdf0e10cSrcweir } 471cdf0e10cSrcweir } 472cdf0e10cSrcweir else 473cdf0e10cSrcweir { 474cdf0e10cSrcweir // paint in all known windows 475cdf0e10cSrcweir for(sal_uInt32 a(0L); a < PageWindowCount(); a++) 476cdf0e10cSrcweir { 477cdf0e10cSrcweir SdrPageWindow* pTarget = GetPageWindow(a); 478cdf0e10cSrcweir pTarget->RedrawLayer(&nID, pRedirector); 479cdf0e10cSrcweir } 480cdf0e10cSrcweir } 481cdf0e10cSrcweir } 482cdf0e10cSrcweir } 483cdf0e10cSrcweir 484cdf0e10cSrcweir void SdrPageView::SetDesignMode( bool _bDesignMode ) const 485cdf0e10cSrcweir { 486cdf0e10cSrcweir for ( sal_uInt32 i = 0L; i < PageWindowCount(); ++i ) 487cdf0e10cSrcweir { 488cdf0e10cSrcweir const SdrPageWindow& rPageViewWindow = *GetPageWindow(i); 489cdf0e10cSrcweir rPageViewWindow.SetDesignMode( _bDesignMode ); 490cdf0e10cSrcweir } 491cdf0e10cSrcweir } 492cdf0e10cSrcweir 493cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////// 494cdf0e10cSrcweir 495cdf0e10cSrcweir #ifdef OS2 496cdf0e10cSrcweir #define RGBCOLOR(r,g,b) ((sal_uIntPtr)(((sal_uInt8)(b) | ((sal_uInt16)(g)<<8)) | (((sal_uIntPtr)(sal_uInt8)(r))<<16))) 497cdf0e10cSrcweir #endif 498cdf0e10cSrcweir 499cdf0e10cSrcweir void SdrPageView::DrawPageViewGrid(OutputDevice& rOut, const Rectangle& rRect, Color aColor) 500cdf0e10cSrcweir { 501cdf0e10cSrcweir if (GetPage()==NULL) 502cdf0e10cSrcweir return; 503cdf0e10cSrcweir 504cdf0e10cSrcweir long nx1=GetView().aGridBig.Width(); 505cdf0e10cSrcweir long nx2=GetView().aGridFin.Width(); 506cdf0e10cSrcweir long ny1=GetView().aGridBig.Height(); 507cdf0e10cSrcweir long ny2=GetView().aGridFin.Height(); 508cdf0e10cSrcweir 509cdf0e10cSrcweir if (nx1==0) nx1=nx2; 510cdf0e10cSrcweir if (nx2==0) nx2=nx1; 511cdf0e10cSrcweir if (ny1==0) ny1=ny2; 512cdf0e10cSrcweir if (ny2==0) ny2=ny1; 513cdf0e10cSrcweir if (nx1==0) { nx1=ny1; nx2=ny2; } 514cdf0e10cSrcweir if (ny1==0) { ny1=nx1; ny2=nx2; } 515cdf0e10cSrcweir if (nx1<0) nx1=-nx1; 516cdf0e10cSrcweir if (nx2<0) nx2=-nx2; 517cdf0e10cSrcweir if (ny1<0) ny1=-ny1; 518cdf0e10cSrcweir if (ny2<0) ny2=-ny2; 519cdf0e10cSrcweir 520cdf0e10cSrcweir if (nx1!=0) 521cdf0e10cSrcweir { 522cdf0e10cSrcweir // no more global output size, use window size instead to decide grid sizes 523cdf0e10cSrcweir long nScreenWdt = rOut.GetOutputSizePixel().Width(); 524cdf0e10cSrcweir // old: long nScreenWdt=System::GetDesktopRectPixel().GetWidth(); 525cdf0e10cSrcweir 526cdf0e10cSrcweir // Grid bei kleinen Zoomstufen etwas erweitern 527cdf0e10cSrcweir //Size a1PixSiz(rOut.PixelToLogic(Size(1,1))); 528cdf0e10cSrcweir long nMinDotPix=2; 529cdf0e10cSrcweir long nMinLinPix=4; 530cdf0e10cSrcweir 531cdf0e10cSrcweir if (nScreenWdt>=1600) 532cdf0e10cSrcweir { 533cdf0e10cSrcweir nMinDotPix=4; 534cdf0e10cSrcweir nMinLinPix=8; 535cdf0e10cSrcweir } 536cdf0e10cSrcweir else if (nScreenWdt>=1024) 537cdf0e10cSrcweir { 538cdf0e10cSrcweir nMinDotPix=3; 539cdf0e10cSrcweir nMinLinPix=6; 540cdf0e10cSrcweir } 541cdf0e10cSrcweir else 542cdf0e10cSrcweir { // z.B. 640x480 543cdf0e10cSrcweir nMinDotPix=2; 544cdf0e10cSrcweir nMinLinPix=4; 545cdf0e10cSrcweir } 546cdf0e10cSrcweir Size aMinDotDist(rOut.PixelToLogic(Size(nMinDotPix,nMinDotPix))); 547cdf0e10cSrcweir //Size a3PixSiz(rOut.PixelToLogic(Size(2,2))); 548cdf0e10cSrcweir Size aMinLinDist(rOut.PixelToLogic(Size(nMinLinPix,nMinLinPix))); 549cdf0e10cSrcweir FASTBOOL bHoriSolid=nx2<aMinDotDist.Width(); 550cdf0e10cSrcweir FASTBOOL bVertSolid=ny2<aMinDotDist.Height(); 551cdf0e10cSrcweir // Linienabstand vergroessern (mind. 4 Pixel) 552cdf0e10cSrcweir // Vergroesserung: *2 *5 *10 *20 *50 *100 ... 553cdf0e10cSrcweir int nTgl=0; 554cdf0e10cSrcweir long nVal0=nx1; 555cdf0e10cSrcweir while (nx1<aMinLinDist.Width()) 556cdf0e10cSrcweir { 557cdf0e10cSrcweir long a=nx1; 558cdf0e10cSrcweir 559cdf0e10cSrcweir if (nTgl==0) nx1*=2; 560cdf0e10cSrcweir if (nTgl==1) nx1=nVal0*5; // => nx1*=2.5 561cdf0e10cSrcweir if (nTgl==2) nx1*=2; 562cdf0e10cSrcweir 563cdf0e10cSrcweir nVal0=a; 564cdf0e10cSrcweir nTgl++; if (nTgl>=3) nTgl=0; 565cdf0e10cSrcweir } 566cdf0e10cSrcweir nTgl=0; 567cdf0e10cSrcweir nVal0=ny1; 568cdf0e10cSrcweir while (ny1<aMinLinDist.Height()) 569cdf0e10cSrcweir { 570cdf0e10cSrcweir long a=ny1; 571cdf0e10cSrcweir 572cdf0e10cSrcweir if (nTgl==0) ny1*=2; 573cdf0e10cSrcweir if (nTgl==1) ny1=nVal0*5; // => ny1*=2.5 574cdf0e10cSrcweir if (nTgl==2) ny1*=2; 575cdf0e10cSrcweir 576cdf0e10cSrcweir nVal0=a; 577cdf0e10cSrcweir nTgl++; 578cdf0e10cSrcweir 579cdf0e10cSrcweir if (nTgl>=3) nTgl=0; 580cdf0e10cSrcweir } 581cdf0e10cSrcweir // Keine Zwischenpunkte, wenn... 582cdf0e10cSrcweir //if (nx2<a2PixSiz.Width()) nx2=nx1; 583cdf0e10cSrcweir //if (ny2<a2PixSiz.Height()) ny2=ny1; 584cdf0e10cSrcweir 585cdf0e10cSrcweir FASTBOOL bHoriFine=nx2<nx1; 586cdf0e10cSrcweir FASTBOOL bVertFine=ny2<ny1; 587cdf0e10cSrcweir FASTBOOL bHoriLines=bHoriSolid || bHoriFine || !bVertFine; 588cdf0e10cSrcweir FASTBOOL bVertLines=bVertSolid || bVertFine; 589cdf0e10cSrcweir 590cdf0e10cSrcweir Color aColorMerk( rOut.GetLineColor() ); 591cdf0e10cSrcweir rOut.SetLineColor( aColor ); 592cdf0e10cSrcweir 593cdf0e10cSrcweir bool bMap0=rOut.IsMapModeEnabled(); 594cdf0e10cSrcweir 595cdf0e10cSrcweir long nWrX=0;//aWriterPageOffset.X(); 596cdf0e10cSrcweir long nWrY=0;//aWriterPageOffset.Y(); 597cdf0e10cSrcweir Point aOrg(aPgOrg); 598cdf0e10cSrcweir long x1=GetPage()->GetLftBorder()+1+nWrX; 599cdf0e10cSrcweir long x2=GetPage()->GetWdt()-GetPage()->GetRgtBorder()-1+nWrY; 600cdf0e10cSrcweir long y1=GetPage()->GetUppBorder()+1+nWrX; 601cdf0e10cSrcweir long y2=GetPage()->GetHgt()-GetPage()->GetLwrBorder()-1+nWrY; 602cdf0e10cSrcweir const SdrPageGridFrameList* pFrames=GetPage()->GetGridFrameList(this,NULL); 603cdf0e10cSrcweir //sal_uInt16 nBufSiz=1024; // 4k Buffer = max. 512 Punkte 604cdf0e10cSrcweir // #90353# long* pBuf = NULL; 605cdf0e10cSrcweir sal_uInt16 nGridPaintAnz=1; 606cdf0e10cSrcweir if (pFrames!=NULL) nGridPaintAnz=pFrames->GetCount(); 607cdf0e10cSrcweir for (sal_uInt16 nGridPaintNum=0; nGridPaintNum<nGridPaintAnz; nGridPaintNum++) { 608cdf0e10cSrcweir if (pFrames!=NULL) { 609cdf0e10cSrcweir const SdrPageGridFrame& rGF=(*pFrames)[nGridPaintNum]; 610cdf0e10cSrcweir nWrX=rGF.GetPaperRect().Left(); 611cdf0e10cSrcweir nWrY=rGF.GetPaperRect().Top(); 612cdf0e10cSrcweir x1=rGF.GetUserArea().Left(); 613cdf0e10cSrcweir x2=rGF.GetUserArea().Right(); 614cdf0e10cSrcweir y1=rGF.GetUserArea().Top(); 615cdf0e10cSrcweir y2=rGF.GetUserArea().Bottom(); 616cdf0e10cSrcweir aOrg=rGF.GetUserArea().TopLeft(); 617cdf0e10cSrcweir aOrg-=rGF.GetPaperRect().TopLeft(); 618cdf0e10cSrcweir } 619cdf0e10cSrcweir if (!rRect.IsEmpty()) { 620cdf0e10cSrcweir Size a1PixSiz(rOut.PixelToLogic(Size(1,1))); 621cdf0e10cSrcweir long nX1Pix=a1PixSiz.Width(); // 1 Pixel Toleranz drauf 622cdf0e10cSrcweir long nY1Pix=a1PixSiz.Height(); 623cdf0e10cSrcweir if (x1<rRect.Left() -nX1Pix) x1=rRect.Left() -nX1Pix; 624cdf0e10cSrcweir if (x2>rRect.Right() +nX1Pix) x2=rRect.Right() +nX1Pix; 625cdf0e10cSrcweir if (y1<rRect.Top() -nY1Pix) y1=rRect.Top() -nY1Pix; 626cdf0e10cSrcweir if (y2>rRect.Bottom()+nY1Pix) y2=rRect.Bottom()+nY1Pix; 627cdf0e10cSrcweir } 628cdf0e10cSrcweir Point aPnt; 629cdf0e10cSrcweir 630cdf0e10cSrcweir long xBigOrg=aOrg.X()+nWrX; 631cdf0e10cSrcweir while (xBigOrg>=x1) xBigOrg-=nx1; 632cdf0e10cSrcweir while (xBigOrg<x1) xBigOrg+=nx1; 633cdf0e10cSrcweir long xFinOrg=xBigOrg; 634cdf0e10cSrcweir while (xFinOrg>=x1) xFinOrg-=nx2; 635cdf0e10cSrcweir while (xFinOrg<x1) xFinOrg+=nx2; 636cdf0e10cSrcweir 637cdf0e10cSrcweir long yBigOrg=aOrg.Y()+nWrY; 638cdf0e10cSrcweir while (yBigOrg>=y1) yBigOrg-=ny1; 639cdf0e10cSrcweir while (yBigOrg<y1) yBigOrg+=ny1; 640cdf0e10cSrcweir long yFinOrg=yBigOrg; 641cdf0e10cSrcweir while (yFinOrg>=y1) yFinOrg-=ny2; 642cdf0e10cSrcweir while (yFinOrg<y1) yFinOrg+=ny2; 643cdf0e10cSrcweir 644cdf0e10cSrcweir if( x1 <= x2 && y1 <= y2 ) 645cdf0e10cSrcweir { 646cdf0e10cSrcweir if( bHoriLines ) 647cdf0e10cSrcweir { 648cdf0e10cSrcweir sal_uIntPtr nGridFlags = ( bHoriSolid ? GRID_HORZLINES : GRID_DOTS ); 649cdf0e10cSrcweir sal_uInt16 nSteps = sal_uInt16(nx1 / nx2); 650cdf0e10cSrcweir sal_uInt32 nRestPerStepMul1000 = nSteps ? ( ((nx1 * 1000L)/ nSteps) - (nx2 * 1000L) ) : 0; 651cdf0e10cSrcweir sal_uInt32 nStepOffset = 0; 652cdf0e10cSrcweir sal_uInt16 nPointOffset = 0; 653cdf0e10cSrcweir 654cdf0e10cSrcweir for(sal_uInt16 a=0;a<nSteps;a++) 655cdf0e10cSrcweir { 656cdf0e10cSrcweir // Zeichnen 657cdf0e10cSrcweir rOut.DrawGrid( 658cdf0e10cSrcweir Rectangle( xFinOrg + (a * nx2) + nPointOffset, yBigOrg, x2, y2 ), 659cdf0e10cSrcweir Size( nx1, ny1 ), nGridFlags ); 660cdf0e10cSrcweir 661cdf0e10cSrcweir // Schritt machen 662cdf0e10cSrcweir nStepOffset += nRestPerStepMul1000; 663cdf0e10cSrcweir while(nStepOffset >= 1000) 664cdf0e10cSrcweir { 665cdf0e10cSrcweir nStepOffset -= 1000; 666cdf0e10cSrcweir nPointOffset++; 667cdf0e10cSrcweir } 668cdf0e10cSrcweir } 669cdf0e10cSrcweir } 670cdf0e10cSrcweir 671cdf0e10cSrcweir if( bVertLines ) 672cdf0e10cSrcweir { 673cdf0e10cSrcweir sal_uIntPtr nGridFlags = ( bVertSolid ? GRID_VERTLINES : GRID_DOTS ); 674cdf0e10cSrcweir sal_uInt16 nSteps = sal_uInt16(ny1 / ny2); 675cdf0e10cSrcweir sal_uInt32 nRestPerStepMul1000 = nSteps ? ( ((ny1 * 1000L)/ nSteps) - (ny2 * 1000L) ) : 0; 676cdf0e10cSrcweir sal_uInt32 nStepOffset = 0; 677cdf0e10cSrcweir sal_uInt16 nPointOffset = 0; 678cdf0e10cSrcweir 679cdf0e10cSrcweir for(sal_uInt16 a=0;a<nSteps;a++) 680cdf0e10cSrcweir { 681cdf0e10cSrcweir // Zeichnen 682cdf0e10cSrcweir rOut.DrawGrid( 683cdf0e10cSrcweir Rectangle( xBigOrg, yFinOrg + (a * ny2) + nPointOffset, x2, y2 ), 684cdf0e10cSrcweir Size( nx1, ny1 ), nGridFlags ); 685cdf0e10cSrcweir 686cdf0e10cSrcweir // Schritt machen 687cdf0e10cSrcweir nStepOffset += nRestPerStepMul1000; 688cdf0e10cSrcweir while(nStepOffset >= 1000) 689cdf0e10cSrcweir { 690cdf0e10cSrcweir nStepOffset -= 1000; 691cdf0e10cSrcweir nPointOffset++; 692cdf0e10cSrcweir } 693cdf0e10cSrcweir } 694cdf0e10cSrcweir 695cdf0e10cSrcweir // rOut.DrawGrid( Rectangle( xo + xBigOrg, yo + yFinOrg, x2, y2 ), Size( nx1, ny2 ), nGridFlags ); 696cdf0e10cSrcweir } 697cdf0e10cSrcweir } 698cdf0e10cSrcweir } 699cdf0e10cSrcweir 700cdf0e10cSrcweir rOut.EnableMapMode(bMap0); 701cdf0e10cSrcweir rOut.SetLineColor(aColorMerk); 702cdf0e10cSrcweir } 703cdf0e10cSrcweir } 704cdf0e10cSrcweir 705cdf0e10cSrcweir void SdrPageView::AdjHdl() 706cdf0e10cSrcweir { 707cdf0e10cSrcweir GetView().AdjustMarkHdl(); 708cdf0e10cSrcweir } 709cdf0e10cSrcweir 710cdf0e10cSrcweir void SdrPageView::SetLayer(const XubString& rName, SetOfByte& rBS, sal_Bool bJa) 711cdf0e10cSrcweir { 712cdf0e10cSrcweir if(!GetPage()) 713cdf0e10cSrcweir return; 714cdf0e10cSrcweir 715cdf0e10cSrcweir SdrLayerID nID = GetPage()->GetLayerAdmin().GetLayerID(rName, sal_True); 716cdf0e10cSrcweir 717cdf0e10cSrcweir if(SDRLAYER_NOTFOUND != nID) 718cdf0e10cSrcweir rBS.Set(nID, bJa); 719cdf0e10cSrcweir } 720cdf0e10cSrcweir 721cdf0e10cSrcweir sal_Bool SdrPageView::IsLayer(const XubString& rName, const SetOfByte& rBS) const 722cdf0e10cSrcweir { 723cdf0e10cSrcweir if(!GetPage()) 724cdf0e10cSrcweir return sal_False; 725cdf0e10cSrcweir 726cdf0e10cSrcweir sal_Bool bRet(sal_False); 727cdf0e10cSrcweir 728cdf0e10cSrcweir if(rName.Len()) 729cdf0e10cSrcweir { 730cdf0e10cSrcweir SdrLayerID nId = GetPage()->GetLayerAdmin().GetLayerID(rName, sal_True); 731cdf0e10cSrcweir 732cdf0e10cSrcweir if(SDRLAYER_NOTFOUND != nId) 733cdf0e10cSrcweir { 734cdf0e10cSrcweir bRet = rBS.IsSet(nId); 735cdf0e10cSrcweir } 736cdf0e10cSrcweir } 737cdf0e10cSrcweir 738cdf0e10cSrcweir return bRet; 739cdf0e10cSrcweir } 740cdf0e10cSrcweir 741cdf0e10cSrcweir void SdrPageView::SetAllLayers(SetOfByte& rB, sal_Bool bJa) 742cdf0e10cSrcweir { 743cdf0e10cSrcweir if(bJa) 744cdf0e10cSrcweir { 745cdf0e10cSrcweir rB.SetAll(); 746cdf0e10cSrcweir rB.Clear(SDRLAYER_NOTFOUND); 747cdf0e10cSrcweir } 748cdf0e10cSrcweir else 749cdf0e10cSrcweir { 750cdf0e10cSrcweir rB.ClearAll(); 751cdf0e10cSrcweir } 752cdf0e10cSrcweir } 753cdf0e10cSrcweir 754cdf0e10cSrcweir sal_Bool SdrPageView::IsObjMarkable(SdrObject* pObj) const 755cdf0e10cSrcweir { 756cdf0e10cSrcweir if(pObj) 757cdf0e10cSrcweir { 758cdf0e10cSrcweir // Vom Markieren ausgeschlossen? 759cdf0e10cSrcweir if(pObj->IsMarkProtect()) 760cdf0e10cSrcweir { 761cdf0e10cSrcweir return sal_False; 762cdf0e10cSrcweir } 763cdf0e10cSrcweir 764cdf0e10cSrcweir // only visible are markable 765cdf0e10cSrcweir if( !pObj->IsVisible() ) 766cdf0e10cSrcweir { 767cdf0e10cSrcweir return sal_False; 768cdf0e10cSrcweir } 769cdf0e10cSrcweir 770cdf0e10cSrcweir // #112440# 771cdf0e10cSrcweir if(pObj->ISA(SdrObjGroup)) 772cdf0e10cSrcweir { 773cdf0e10cSrcweir // If object is a Group object, visibility depends evtl. on 774cdf0e10cSrcweir // multiple layers. If one object is markable, Group is markable. 775cdf0e10cSrcweir SdrObjList* pObjList = ((SdrObjGroup*)pObj)->GetSubList(); 776cdf0e10cSrcweir 777cdf0e10cSrcweir if(pObjList && pObjList->GetObjCount()) 778cdf0e10cSrcweir { 779cdf0e10cSrcweir sal_Bool bGroupIsMarkable(sal_False); 780cdf0e10cSrcweir 781cdf0e10cSrcweir for(sal_uInt32 a(0L); !bGroupIsMarkable && a < pObjList->GetObjCount(); a++) 782cdf0e10cSrcweir { 783cdf0e10cSrcweir SdrObject* pCandidate = pObjList->GetObj(a); 784cdf0e10cSrcweir 785cdf0e10cSrcweir // call recursively 786cdf0e10cSrcweir if(IsObjMarkable(pCandidate)) 787cdf0e10cSrcweir { 788cdf0e10cSrcweir bGroupIsMarkable = sal_True; 789cdf0e10cSrcweir } 790cdf0e10cSrcweir } 791cdf0e10cSrcweir 792cdf0e10cSrcweir return bGroupIsMarkable; 793cdf0e10cSrcweir } 794cdf0e10cSrcweir else 795cdf0e10cSrcweir { 796cdf0e10cSrcweir // #i43302# 797cdf0e10cSrcweir // Allow empty groups to be selected to be able to delete them 798cdf0e10cSrcweir return sal_True; 799cdf0e10cSrcweir } 800cdf0e10cSrcweir } 801cdf0e10cSrcweir else 802cdf0e10cSrcweir { 803cdf0e10cSrcweir // Der Layer muss sichtbar und darf nicht gesperrt sein 804cdf0e10cSrcweir SdrLayerID nL = pObj->GetLayer(); 805cdf0e10cSrcweir return (aLayerVisi.IsSet(sal_uInt8(nL)) && !aLayerLock.IsSet(sal_uInt8(nL))); 806cdf0e10cSrcweir } 807cdf0e10cSrcweir } 808cdf0e10cSrcweir 809cdf0e10cSrcweir return sal_False; 810cdf0e10cSrcweir } 811cdf0e10cSrcweir 812cdf0e10cSrcweir void SdrPageView::SetPageOrigin(const Point& rOrg) 813cdf0e10cSrcweir { 814cdf0e10cSrcweir if (rOrg!=aPgOrg) { 815cdf0e10cSrcweir aPgOrg=rOrg; 816cdf0e10cSrcweir if (GetView().IsGridVisible()) { 817cdf0e10cSrcweir InvalidateAllWin(); 818cdf0e10cSrcweir } 819cdf0e10cSrcweir } 820cdf0e10cSrcweir } 821cdf0e10cSrcweir 822cdf0e10cSrcweir void SdrPageView::ImpInvalidateHelpLineArea(sal_uInt16 nNum) const 823cdf0e10cSrcweir { 824cdf0e10cSrcweir if (GetView().IsHlplVisible() && nNum<aHelpLines.GetCount()) { 825cdf0e10cSrcweir const SdrHelpLine& rHL=aHelpLines[nNum]; 826cdf0e10cSrcweir 827cdf0e10cSrcweir for(sal_uInt32 a(0L); a < GetView().PaintWindowCount(); a++) 828cdf0e10cSrcweir { 829cdf0e10cSrcweir SdrPaintWindow* pCandidate = GetView().GetPaintWindow(a); 830cdf0e10cSrcweir 831cdf0e10cSrcweir if(pCandidate->OutputToWindow()) 832cdf0e10cSrcweir { 833cdf0e10cSrcweir OutputDevice& rOutDev = pCandidate->GetOutputDevice(); 834cdf0e10cSrcweir Rectangle aR(rHL.GetBoundRect(rOutDev)); 835cdf0e10cSrcweir Size aSiz(rOutDev.PixelToLogic(Size(1,1))); 836cdf0e10cSrcweir aR.Left() -= aSiz.Width(); 837cdf0e10cSrcweir aR.Right() += aSiz.Width(); 838cdf0e10cSrcweir aR.Top() -= aSiz.Height(); 839cdf0e10cSrcweir aR.Bottom() += aSiz.Height(); 840cdf0e10cSrcweir ((SdrView&)GetView()).InvalidateOneWin((Window&)rOutDev, aR); 841cdf0e10cSrcweir } 842cdf0e10cSrcweir } 843cdf0e10cSrcweir } 844cdf0e10cSrcweir } 845cdf0e10cSrcweir 846cdf0e10cSrcweir void SdrPageView::SetHelpLines(const SdrHelpLineList& rHLL) 847cdf0e10cSrcweir { 848cdf0e10cSrcweir aHelpLines=rHLL; 849cdf0e10cSrcweir InvalidateAllWin(); 850cdf0e10cSrcweir } 851cdf0e10cSrcweir 852cdf0e10cSrcweir void SdrPageView::SetHelpLine(sal_uInt16 nNum, const SdrHelpLine& rNewHelpLine) 853cdf0e10cSrcweir { 854cdf0e10cSrcweir if (nNum<aHelpLines.GetCount() && aHelpLines[nNum]!=rNewHelpLine) { 855cdf0e10cSrcweir FASTBOOL bNeedRedraw=sal_True; 856cdf0e10cSrcweir if (aHelpLines[nNum].GetKind()==rNewHelpLine.GetKind()) { 857cdf0e10cSrcweir switch (rNewHelpLine.GetKind()) { 858cdf0e10cSrcweir case SDRHELPLINE_VERTICAL : if (aHelpLines[nNum].GetPos().X()==rNewHelpLine.GetPos().X()) bNeedRedraw=sal_False; break; 859cdf0e10cSrcweir case SDRHELPLINE_HORIZONTAL: if (aHelpLines[nNum].GetPos().Y()==rNewHelpLine.GetPos().Y()) bNeedRedraw=sal_False; break; 860cdf0e10cSrcweir default: break; 861cdf0e10cSrcweir } // switch 862cdf0e10cSrcweir } 863cdf0e10cSrcweir if (bNeedRedraw) ImpInvalidateHelpLineArea(nNum); 864cdf0e10cSrcweir aHelpLines[nNum]=rNewHelpLine; 865cdf0e10cSrcweir if (bNeedRedraw) ImpInvalidateHelpLineArea(nNum); 866cdf0e10cSrcweir } 867cdf0e10cSrcweir } 868cdf0e10cSrcweir 869cdf0e10cSrcweir void SdrPageView::DeleteHelpLine(sal_uInt16 nNum) 870cdf0e10cSrcweir { 871cdf0e10cSrcweir if (nNum<aHelpLines.GetCount()) { 872cdf0e10cSrcweir ImpInvalidateHelpLineArea(nNum); 873cdf0e10cSrcweir aHelpLines.Delete(nNum); 874cdf0e10cSrcweir } 875cdf0e10cSrcweir } 876cdf0e10cSrcweir 877cdf0e10cSrcweir void SdrPageView::InsertHelpLine(const SdrHelpLine& rHL, sal_uInt16 nNum) 878cdf0e10cSrcweir { 879cdf0e10cSrcweir if (nNum>aHelpLines.GetCount()) nNum=aHelpLines.GetCount(); 880cdf0e10cSrcweir aHelpLines.Insert(rHL,nNum); 881cdf0e10cSrcweir if (GetView().IsHlplVisible()) { 882cdf0e10cSrcweir if (GetView().IsHlplFront()) { 883cdf0e10cSrcweir // Hier optimieren ... 884cdf0e10cSrcweir ImpInvalidateHelpLineArea(nNum); 885cdf0e10cSrcweir } else { 886cdf0e10cSrcweir ImpInvalidateHelpLineArea(nNum); 887cdf0e10cSrcweir } 888cdf0e10cSrcweir } 889cdf0e10cSrcweir } 890cdf0e10cSrcweir 891cdf0e10cSrcweir // Betretene Gruppe und Liste setzen 892cdf0e10cSrcweir void SdrPageView::SetAktGroupAndList(SdrObject* pNewGroup, SdrObjList* pNewList) 893cdf0e10cSrcweir { 894cdf0e10cSrcweir if(pAktGroup != pNewGroup) 895cdf0e10cSrcweir { 896cdf0e10cSrcweir pAktGroup = pNewGroup; 897cdf0e10cSrcweir } 898cdf0e10cSrcweir if(pAktList != pNewList) 899cdf0e10cSrcweir { 900cdf0e10cSrcweir pAktList = pNewList; 901cdf0e10cSrcweir } 902cdf0e10cSrcweir } 903cdf0e10cSrcweir 904cdf0e10cSrcweir sal_Bool SdrPageView::EnterGroup(SdrObject* pObj) 905cdf0e10cSrcweir { 906cdf0e10cSrcweir sal_Bool bRet(sal_False); 907cdf0e10cSrcweir 908cdf0e10cSrcweir if(pObj && pObj->IsGroupObject()) 909cdf0e10cSrcweir { 910cdf0e10cSrcweir sal_Bool bGlueInvalidate(GetView().ImpIsGlueVisible()); 911cdf0e10cSrcweir 912cdf0e10cSrcweir if(bGlueInvalidate) 913cdf0e10cSrcweir { 914cdf0e10cSrcweir GetView().GlueInvalidate(); 915cdf0e10cSrcweir } 916cdf0e10cSrcweir 917cdf0e10cSrcweir // deselect all 918cdf0e10cSrcweir GetView().UnmarkAll(); 919cdf0e10cSrcweir 920cdf0e10cSrcweir // set current group and list 921cdf0e10cSrcweir SdrObjList* pNewObjList = pObj->GetSubList(); 922cdf0e10cSrcweir SetAktGroupAndList(pObj, pNewObjList); 923cdf0e10cSrcweir 924cdf0e10cSrcweir // select contained object if only one object is contained, 925cdf0e10cSrcweir // else select nothing and let the user decide what to do next 926cdf0e10cSrcweir if(pNewObjList && pNewObjList->GetObjCount() == 1) 927cdf0e10cSrcweir { 928cdf0e10cSrcweir SdrObject* pFirstObject = pNewObjList->GetObj(0L); 929cdf0e10cSrcweir 930cdf0e10cSrcweir if(GetView().GetSdrPageView()) 931cdf0e10cSrcweir { 932cdf0e10cSrcweir GetView().MarkObj(pFirstObject, GetView().GetSdrPageView()); 933cdf0e10cSrcweir } 934cdf0e10cSrcweir } 935cdf0e10cSrcweir 936cdf0e10cSrcweir // build new handles 937cdf0e10cSrcweir GetView().AdjustMarkHdl(); 938cdf0e10cSrcweir 939cdf0e10cSrcweir // invalidate only when view wants to visualize group entering 940cdf0e10cSrcweir if(GetView().DoVisualizeEnteredGroup()) 941cdf0e10cSrcweir { 942cdf0e10cSrcweir InvalidateAllWin(); 943cdf0e10cSrcweir } 944cdf0e10cSrcweir 945cdf0e10cSrcweir if (bGlueInvalidate) 946cdf0e10cSrcweir { 947cdf0e10cSrcweir GetView().GlueInvalidate(); 948cdf0e10cSrcweir } 949cdf0e10cSrcweir 950cdf0e10cSrcweir bRet = sal_True; 951cdf0e10cSrcweir } 952cdf0e10cSrcweir 953cdf0e10cSrcweir return bRet; 954cdf0e10cSrcweir } 955cdf0e10cSrcweir 956cdf0e10cSrcweir void SdrPageView::LeaveOneGroup() 957cdf0e10cSrcweir { 958cdf0e10cSrcweir if(GetAktGroup()) 959cdf0e10cSrcweir { 960cdf0e10cSrcweir sal_Bool bGlueInvalidate = (GetView().ImpIsGlueVisible()); 961cdf0e10cSrcweir 962cdf0e10cSrcweir if(bGlueInvalidate) 963cdf0e10cSrcweir GetView().GlueInvalidate(); 964cdf0e10cSrcweir 965cdf0e10cSrcweir SdrObject* pLastGroup = GetAktGroup(); 966cdf0e10cSrcweir SdrObject* pParentGroup = GetAktGroup()->GetUpGroup(); 967cdf0e10cSrcweir SdrObjList* pParentList = GetPage(); 968cdf0e10cSrcweir 969cdf0e10cSrcweir if(pParentGroup) 970cdf0e10cSrcweir pParentList = pParentGroup->GetSubList(); 971cdf0e10cSrcweir 972cdf0e10cSrcweir // Alles deselektieren 973cdf0e10cSrcweir GetView().UnmarkAll(); 974cdf0e10cSrcweir 975cdf0e10cSrcweir // Zuweisungen, pAktGroup und pAktList muessen gesetzt sein 976cdf0e10cSrcweir SetAktGroupAndList(pParentGroup, pParentList); 977cdf0e10cSrcweir 978cdf0e10cSrcweir // gerade verlassene Gruppe selektieren 979cdf0e10cSrcweir if(pLastGroup) 980cdf0e10cSrcweir if(GetView().GetSdrPageView()) 981cdf0e10cSrcweir GetView().MarkObj(pLastGroup, GetView().GetSdrPageView()); 982cdf0e10cSrcweir 983cdf0e10cSrcweir GetView().AdjustMarkHdl(); 984cdf0e10cSrcweir 985cdf0e10cSrcweir // invalidate only when view wants to visualize group entering 986cdf0e10cSrcweir if(GetView().DoVisualizeEnteredGroup()) 987cdf0e10cSrcweir InvalidateAllWin(); 988cdf0e10cSrcweir 989cdf0e10cSrcweir if(bGlueInvalidate) 990cdf0e10cSrcweir GetView().GlueInvalidate(); 991cdf0e10cSrcweir } 992cdf0e10cSrcweir } 993cdf0e10cSrcweir 994cdf0e10cSrcweir void SdrPageView::LeaveAllGroup() 995cdf0e10cSrcweir { 996cdf0e10cSrcweir if(GetAktGroup()) 997cdf0e10cSrcweir { 998cdf0e10cSrcweir sal_Bool bGlueInvalidate = (GetView().ImpIsGlueVisible()); 999cdf0e10cSrcweir 1000cdf0e10cSrcweir if(bGlueInvalidate) 1001cdf0e10cSrcweir GetView().GlueInvalidate(); 1002cdf0e10cSrcweir 1003cdf0e10cSrcweir SdrObject* pLastGroup = GetAktGroup(); 1004cdf0e10cSrcweir 1005cdf0e10cSrcweir // Alles deselektieren 1006cdf0e10cSrcweir GetView().UnmarkAll(); 1007cdf0e10cSrcweir 1008cdf0e10cSrcweir // Zuweisungen, pAktGroup und pAktList muessen gesetzt sein 1009cdf0e10cSrcweir SetAktGroupAndList(NULL, GetPage()); 1010cdf0e10cSrcweir 1011cdf0e10cSrcweir // Oberste letzte Gruppe finden und selektieren 1012cdf0e10cSrcweir if(pLastGroup) 1013cdf0e10cSrcweir { 1014cdf0e10cSrcweir while(pLastGroup->GetUpGroup()) 1015cdf0e10cSrcweir pLastGroup = pLastGroup->GetUpGroup(); 1016cdf0e10cSrcweir 1017cdf0e10cSrcweir if(GetView().GetSdrPageView()) 1018cdf0e10cSrcweir GetView().MarkObj(pLastGroup, GetView().GetSdrPageView()); 1019cdf0e10cSrcweir } 1020cdf0e10cSrcweir 1021cdf0e10cSrcweir GetView().AdjustMarkHdl(); 1022cdf0e10cSrcweir 1023cdf0e10cSrcweir // invalidate only when view wants to visualize group entering 1024cdf0e10cSrcweir if(GetView().DoVisualizeEnteredGroup()) 1025cdf0e10cSrcweir InvalidateAllWin(); 1026cdf0e10cSrcweir 1027cdf0e10cSrcweir if(bGlueInvalidate) 1028cdf0e10cSrcweir GetView().GlueInvalidate(); 1029cdf0e10cSrcweir } 1030cdf0e10cSrcweir } 1031cdf0e10cSrcweir 1032cdf0e10cSrcweir sal_uInt16 SdrPageView::GetEnteredLevel() const 1033cdf0e10cSrcweir { 1034cdf0e10cSrcweir sal_uInt16 nAnz=0; 1035cdf0e10cSrcweir SdrObject* pGrp=GetAktGroup(); 1036cdf0e10cSrcweir while (pGrp!=NULL) { 1037cdf0e10cSrcweir nAnz++; 1038cdf0e10cSrcweir pGrp=pGrp->GetUpGroup(); 1039cdf0e10cSrcweir } 1040cdf0e10cSrcweir return nAnz; 1041cdf0e10cSrcweir } 1042cdf0e10cSrcweir 1043cdf0e10cSrcweir XubString SdrPageView::GetActualGroupName() const 1044cdf0e10cSrcweir { 1045cdf0e10cSrcweir if(GetAktGroup()) 1046cdf0e10cSrcweir { 1047cdf0e10cSrcweir XubString aStr(GetAktGroup()->GetName()); 1048cdf0e10cSrcweir 1049cdf0e10cSrcweir if(!aStr.Len()) 1050cdf0e10cSrcweir aStr += sal_Unicode('?'); 1051cdf0e10cSrcweir 1052cdf0e10cSrcweir return aStr; 1053cdf0e10cSrcweir } 1054cdf0e10cSrcweir else 1055cdf0e10cSrcweir return String(); 1056cdf0e10cSrcweir } 1057cdf0e10cSrcweir 1058cdf0e10cSrcweir XubString SdrPageView::GetActualPathName(sal_Unicode cSep) const 1059cdf0e10cSrcweir { 1060cdf0e10cSrcweir XubString aStr; 1061cdf0e10cSrcweir sal_Bool bNamFnd(sal_False); 1062cdf0e10cSrcweir SdrObject* pGrp = GetAktGroup(); 1063cdf0e10cSrcweir 1064cdf0e10cSrcweir while(pGrp) 1065cdf0e10cSrcweir { 1066cdf0e10cSrcweir XubString aStr1(pGrp->GetName()); 1067cdf0e10cSrcweir 1068cdf0e10cSrcweir if(!aStr1.Len()) 1069cdf0e10cSrcweir aStr1 += sal_Unicode('?'); 1070cdf0e10cSrcweir else 1071cdf0e10cSrcweir bNamFnd = sal_True; 1072cdf0e10cSrcweir 1073cdf0e10cSrcweir aStr += aStr1; 1074cdf0e10cSrcweir pGrp = pGrp->GetUpGroup(); 1075cdf0e10cSrcweir 1076cdf0e10cSrcweir if(pGrp) 1077cdf0e10cSrcweir aStr += cSep; 1078cdf0e10cSrcweir } 1079cdf0e10cSrcweir 1080cdf0e10cSrcweir if(!bNamFnd && GetAktGroup()) 1081cdf0e10cSrcweir { 1082cdf0e10cSrcweir aStr = String(); 1083cdf0e10cSrcweir aStr += sal_Unicode('('); 1084cdf0e10cSrcweir aStr += String::CreateFromInt32( GetEnteredLevel() ); 1085cdf0e10cSrcweir aStr += sal_Unicode(')'); 1086cdf0e10cSrcweir } 1087cdf0e10cSrcweir 1088cdf0e10cSrcweir return aStr; 1089cdf0e10cSrcweir } 1090cdf0e10cSrcweir 1091cdf0e10cSrcweir void SdrPageView::CheckAktGroup() 1092cdf0e10cSrcweir { 1093cdf0e10cSrcweir SdrObject* pGrp=GetAktGroup(); 1094cdf0e10cSrcweir while (pGrp!=NULL && 1095cdf0e10cSrcweir (!pGrp->IsInserted() || pGrp->GetObjList()==NULL || 1096cdf0e10cSrcweir pGrp->GetPage()==NULL || pGrp->GetModel()==NULL)) { // irgendwas daneben? 1097cdf0e10cSrcweir pGrp=pGrp->GetUpGroup(); 1098cdf0e10cSrcweir } 1099cdf0e10cSrcweir if (pGrp!=GetAktGroup()) { 1100cdf0e10cSrcweir if (pGrp!=NULL) EnterGroup(pGrp); 1101cdf0e10cSrcweir else LeaveAllGroup(); 1102cdf0e10cSrcweir } 1103cdf0e10cSrcweir } 1104cdf0e10cSrcweir 1105cdf0e10cSrcweir // #103834# Set background color for svx at SdrPageViews 1106cdf0e10cSrcweir void SdrPageView::SetApplicationBackgroundColor(Color aBackgroundColor) 1107cdf0e10cSrcweir { 1108cdf0e10cSrcweir maBackgroundColor = aBackgroundColor; 1109cdf0e10cSrcweir } 1110cdf0e10cSrcweir 1111cdf0e10cSrcweir // #109585# 1112cdf0e10cSrcweir Color SdrPageView::GetApplicationBackgroundColor() const 1113cdf0e10cSrcweir { 1114cdf0e10cSrcweir return maBackgroundColor; 1115cdf0e10cSrcweir } 1116cdf0e10cSrcweir 1117cdf0e10cSrcweir // #103911# Set document color for svx at SdrPageViews 1118cdf0e10cSrcweir void SdrPageView::SetApplicationDocumentColor(Color aDocumentColor) 1119cdf0e10cSrcweir { 1120cdf0e10cSrcweir maDocumentColor = aDocumentColor; 1121cdf0e10cSrcweir } 1122cdf0e10cSrcweir 1123cdf0e10cSrcweir Color SdrPageView::GetApplicationDocumentColor() const 1124cdf0e10cSrcweir { 1125cdf0e10cSrcweir return maDocumentColor; 1126cdf0e10cSrcweir } 1127cdf0e10cSrcweir 1128cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////// 1129cdf0e10cSrcweir // eof 1130