1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_svx.hxx" 26 #include <svx/sdr/contact/objectcontact.hxx> 27 #include <tools/debug.hxx> 28 #include <svx/sdr/contact/viewobjectcontact.hxx> 29 #include <svx/svdpage.hxx> 30 #include <svx/sdr/contact/viewcontact.hxx> 31 #include <svx/sdr/event/eventhandler.hxx> 32 #include <basegfx/matrix/b2dhommatrix.hxx> 33 #include <svx/sdr/animation/objectanimator.hxx> 34 #include <svx/sdr/event/eventhandler.hxx> 35 36 ////////////////////////////////////////////////////////////////////////////// 37 38 using namespace com::sun::star; 39 40 ////////////////////////////////////////////////////////////////////////////// 41 42 namespace sdr 43 { 44 namespace contact 45 { 46 ObjectContact::ObjectContact() 47 : maViewObjectContactVector(), 48 maPrimitiveAnimator(), 49 mpEventHandler(0), 50 mpViewObjectContactRedirector(0), 51 maViewInformation2D(uno::Sequence< beans::PropertyValue >()), 52 mbIsPreviewRenderer(false) 53 { 54 } 55 56 ObjectContact::~ObjectContact() 57 { 58 // get rid of all registered contacts 59 // #i84257# To avoid that each 'delete pCandidate' again uses 60 // the local RemoveViewObjectContact with a search and removal in the 61 // vector, simply copy and clear local vector. 62 std::vector< ViewObjectContact* > aLocalVOCList(maViewObjectContactVector); 63 maViewObjectContactVector.clear(); 64 65 while(!aLocalVOCList.empty()) 66 { 67 ViewObjectContact* pCandidate = aLocalVOCList.back(); 68 aLocalVOCList.pop_back(); 69 DBG_ASSERT(pCandidate, "Corrupted ViewObjectContactList (!)"); 70 71 // ViewObjectContacts only make sense with View and Object contacts. 72 // When the contact to the SdrObject is deleted like in this case, 73 // all ViewObjectContacts can be deleted, too. 74 delete pCandidate; 75 } 76 77 // assert when there were new entries added during deletion 78 DBG_ASSERT(maViewObjectContactVector.empty(), "Corrupted ViewObjectContactList (!)"); 79 80 // delete the EventHandler. This will destroy all still contained events. 81 DeleteEventHandler(); 82 } 83 84 // LazyInvalidate request. Default implementation directly handles 85 // this by calling back triggerLazyInvalidate() at the VOC 86 void ObjectContact::setLazyInvalidate(ViewObjectContact& rVOC) 87 { 88 rVOC.triggerLazyInvalidate(); 89 } 90 91 // call this to support evtl. preparations for repaint. Default does nothing 92 void ObjectContact::PrepareProcessDisplay() 93 { 94 } 95 96 // A new ViewObjectContact was created and shall be remembered. 97 void ObjectContact::AddViewObjectContact(ViewObjectContact& rVOContact) 98 { 99 maViewObjectContactVector.push_back(&rVOContact); 100 } 101 102 // A ViewObjectContact was deleted and shall be forgotten. 103 void ObjectContact::RemoveViewObjectContact(ViewObjectContact& rVOContact) 104 { 105 std::vector< ViewObjectContact* >::iterator aFindResult = std::find(maViewObjectContactVector.begin(), maViewObjectContactVector.end(), &rVOContact); 106 107 if(aFindResult != maViewObjectContactVector.end()) 108 { 109 maViewObjectContactVector.erase(aFindResult); 110 } 111 } 112 113 // Process the whole displaying 114 void ObjectContact::ProcessDisplay(DisplayInfo& /*rDisplayInfo*/) 115 { 116 // default does nothing 117 } 118 119 // test if visualizing of entered groups is switched on at all 120 bool ObjectContact::DoVisualizeEnteredGroup() const 121 { 122 // Don not do that as default 123 return false; 124 } 125 126 // get active group's (the entered group) ViewContact 127 const ViewContact* ObjectContact::getActiveViewContact() const 128 { 129 // default has no active VC 130 return 0; 131 } 132 133 // Invalidate given rectangle at the window/output which is represented by 134 // this ObjectContact. 135 void ObjectContact::InvalidatePartOfView(const basegfx::B2DRange& /*rRange*/) const 136 { 137 // nothing to do here in the default version 138 } 139 140 // Get info if given Rectangle is visible in this view 141 bool ObjectContact::IsAreaVisible(const basegfx::B2DRange& /*rRange*/) const 142 { 143 // always visible in default version 144 return true; 145 } 146 147 // Get info about the need to visualize GluePoints 148 bool ObjectContact::AreGluePointsVisible() const 149 { 150 return false; 151 } 152 153 // method to create a EventHandler. Needs to give a result. 154 sdr::event::TimerEventHandler* ObjectContact::CreateEventHandler() 155 { 156 // Create and return a new EventHandler 157 return new sdr::event::TimerEventHandler(); 158 } 159 160 // method to get the primitiveAnimator 161 sdr::animation::primitiveAnimator& ObjectContact::getPrimitiveAnimator() 162 { 163 return maPrimitiveAnimator; 164 } 165 166 // method to get the EventHandler. It will 167 // return a existing one or create a new one using CreateEventHandler(). 168 sdr::event::TimerEventHandler& ObjectContact::GetEventHandler() const 169 { 170 if(!HasEventHandler()) 171 { 172 const_cast< ObjectContact* >(this)->mpEventHandler = const_cast< ObjectContact* >(this)->CreateEventHandler(); 173 DBG_ASSERT(mpEventHandler, "ObjectContact::GetEventHandler(): Got no EventHandler (!)"); 174 } 175 176 return *mpEventHandler; 177 } 178 179 // delete the EventHandler 180 void ObjectContact::DeleteEventHandler() 181 { 182 if(mpEventHandler) 183 { 184 // If there are still Events registered, something has went wrong 185 delete mpEventHandler; 186 mpEventHandler = 0L; 187 } 188 } 189 190 // test if there is an EventHandler without creating one on demand 191 bool ObjectContact::HasEventHandler() const 192 { 193 return (0L != mpEventHandler); 194 } 195 196 // check if text animation is allowed. Default is sal_true. 197 bool ObjectContact::IsTextAnimationAllowed() const 198 { 199 return true; 200 } 201 202 // check if graphic animation is allowed. Default is sal_true. 203 bool ObjectContact::IsGraphicAnimationAllowed() const 204 { 205 return true; 206 } 207 208 // check if asynchronious graphis loading is allowed. Default is false. 209 bool ObjectContact::IsAsynchronGraphicsLoadingAllowed() const 210 { 211 return false; 212 } 213 214 // access to ViewObjectContactRedirector 215 ViewObjectContactRedirector* ObjectContact::GetViewObjectContactRedirector() const 216 { 217 return mpViewObjectContactRedirector; 218 } 219 220 void ObjectContact::SetViewObjectContactRedirector(ViewObjectContactRedirector* pNew) 221 { 222 if(mpViewObjectContactRedirector != pNew) 223 { 224 mpViewObjectContactRedirector = pNew; 225 } 226 } 227 228 // check if buffering of MasterPages is allowed. Default is false. 229 bool ObjectContact::IsMasterPageBufferingAllowed() const 230 { 231 return false; 232 } 233 234 // print? Default is false 235 bool ObjectContact::isOutputToPrinter() const 236 { 237 return false; 238 } 239 240 // window? Default is true 241 bool ObjectContact::isOutputToWindow() const 242 { 243 return true; 244 } 245 246 // VirtualDevice? Default is false 247 bool ObjectContact::isOutputToVirtualDevice() const 248 { 249 return false; 250 } 251 252 // recording MetaFile? Default is false 253 bool ObjectContact::isOutputToRecordingMetaFile() const 254 { 255 return false; 256 } 257 258 // pdf export? Default is false 259 bool ObjectContact::isOutputToPDFFile() const 260 { 261 return false; 262 } 263 264 // gray display mode 265 bool ObjectContact::isDrawModeGray() const 266 { 267 return false; 268 } 269 270 // gray display mode 271 bool ObjectContact::isDrawModeBlackWhite() const 272 { 273 return false; 274 } 275 276 // high contrast display mode 277 bool ObjectContact::isDrawModeHighContrast() const 278 { 279 return false; 280 } 281 282 // access to SdrPageView. Default implementation returns NULL 283 SdrPageView* ObjectContact::TryToGetSdrPageView() const 284 { 285 return 0; 286 } 287 288 // access to OutputDevice. Default implementation returns NULL 289 OutputDevice* ObjectContact::TryToGetOutputDevice() const 290 { 291 return 0; 292 } 293 294 void ObjectContact::resetViewPort() 295 { 296 const drawinglayer::geometry::ViewInformation2D& rCurrentVI2D = getViewInformation2D(); 297 298 if(!rCurrentVI2D.getViewport().isEmpty()) 299 { 300 const basegfx::B2DRange aEmptyRange; 301 302 drawinglayer::geometry::ViewInformation2D aNewVI2D( 303 rCurrentVI2D.getObjectTransformation(), 304 rCurrentVI2D.getViewTransformation(), 305 aEmptyRange, 306 rCurrentVI2D.getVisualizedPage(), 307 rCurrentVI2D.getViewTime(), 308 rCurrentVI2D.getExtendedInformationSequence()); 309 310 updateViewInformation2D(aNewVI2D); 311 } 312 } 313 314 } // end of namespace contact 315 } // end of namespace sdr 316 317 ////////////////////////////////////////////////////////////////////////////// 318 // eof 319