LibreOffice Module svx (master)  1
svdouno.cxx
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  * Licensed to the Apache Software Foundation (ASF) under one or more
12  * contributor license agreements. See the NOTICE file distributed
13  * with this work for additional information regarding copyright
14  * ownership. The ASF licenses this file to you under the Apache
15  * License, Version 2.0 (the "License"); you may not use this file
16  * except in compliance with the License. You may obtain a copy of
17  * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
22 #include <com/sun/star/container/XChild.hpp>
23 #include <com/sun/star/beans/XPropertySet.hpp>
24 #include <com/sun/star/util/XCloneable.hpp>
25 #include <com/sun/star/uno/XComponentContext.hpp>
27 #include <svx/svdouno.hxx>
28 #include <svx/svdpagv.hxx>
29 #include <svx/svdmodel.hxx>
30 #include <svx/dialmgr.hxx>
31 #include <svx/strings.hrc>
32 #include <svx/svdview.hxx>
33 #include <svx/svdorect.hxx>
34 #include <svx/svdviter.hxx>
35 #include <rtl/ref.hxx>
36 #include <svx/sdrpagewindow.hxx>
37 #include <tools/diagnose_ex.h>
38 #include <tools/debug.hxx>
39 #include <o3tl/sorted_vector.hxx>
40 
41 using namespace ::com::sun::star;
42 using namespace sdr::contact;
43 
44 
45 // Defines
46 
47 
48 // Helper class SdrControlEventListenerImpl
49 
50 #include <com/sun/star/lang/XEventListener.hpp>
51 
52 #include <cppuhelper/implbase.hxx>
53 
54 
55 class SdrControlEventListenerImpl : public ::cppu::WeakImplHelper< css::lang::XEventListener >
56 {
57 protected:
59 
60 public:
62  : pObj(_pObj)
63  {}
64 
65  // XEventListener
66  virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) override;
67 
68  void StopListening(const uno::Reference< lang::XComponent >& xComp);
69  void StartListening(const uno::Reference< lang::XComponent >& xComp);
70 };
71 
72 // XEventListener
73 void SAL_CALL SdrControlEventListenerImpl::disposing( const css::lang::EventObject& /*Source*/)
74 {
75  if (pObj)
76  {
77  pObj->xUnoControlModel = nullptr;
78  }
79 }
80 
81 void SdrControlEventListenerImpl::StopListening(const uno::Reference< lang::XComponent >& xComp)
82 {
83  if (xComp.is())
84  xComp->removeEventListener(this);
85 }
86 
87 void SdrControlEventListenerImpl::StartListening(const uno::Reference< lang::XComponent >& xComp)
88 {
89  if (xComp.is())
90  xComp->addEventListener(this);
91 }
92 
93 
95 {
96  mutable ::rtl::Reference< SdrControlEventListenerImpl >
98 };
99 
100 
101 namespace
102 {
103  void lcl_ensureControlVisibility( SdrView const * _pView, const SdrUnoObj* _pObject, bool _bVisible )
104  {
105  OSL_PRECOND( _pObject, "lcl_ensureControlVisibility: no object -> no survival!" );
106 
107  SdrPageView* pPageView = _pView ? _pView->GetSdrPageView() : nullptr;
108  DBG_ASSERT( pPageView, "lcl_ensureControlVisibility: no view found!" );
109  if ( !pPageView )
110  return;
111 
112  ViewContact& rUnoControlContact( _pObject->GetViewContact() );
113 
114  for ( sal_uInt32 i = 0; i < pPageView->PageWindowCount(); ++i )
115  {
116  SdrPageWindow* pPageWindow = pPageView->GetPageWindow( i );
117  DBG_ASSERT( pPageWindow, "lcl_ensureControlVisibility: invalid PageViewWindow!" );
118  if ( !pPageWindow )
119  continue;
120 
121  if ( !pPageWindow->HasObjectContact() )
122  continue;
123 
124  ObjectContact& rPageViewContact( pPageWindow->GetObjectContact() );
125  const ViewObjectContact& rViewObjectContact( rUnoControlContact.GetViewObjectContact( rPageViewContact ) );
126  const ViewObjectContactOfUnoControl* pUnoControlContact = dynamic_cast< const ViewObjectContactOfUnoControl* >( &rViewObjectContact );
127  DBG_ASSERT( pUnoControlContact, "lcl_ensureControlVisibility: wrong ViewObjectContact type!" );
128  if ( !pUnoControlContact )
129  continue;
130 
131  pUnoControlContact->ensureControlVisibility( _bVisible );
132  }
133  }
134 }
135 
137  SdrModel& rSdrModel,
138  const OUString& rModelName)
139 : SdrRectObj(rSdrModel),
141 {
142  bIsUnoObj = true;
143 
144  m_pImpl->pEventListener = new SdrControlEventListenerImpl(this);
145 
146  // only an owner may create independently
147  if (!rModelName.isEmpty())
148  CreateUnoControlModel(rModelName);
149 }
150 
152  SdrModel& rSdrModel,
153  const OUString& rModelName,
154  const uno::Reference< lang::XMultiServiceFactory >& rxSFac)
155 : SdrRectObj(rSdrModel),
157 {
158  bIsUnoObj = true;
159 
160  m_pImpl->pEventListener = new SdrControlEventListenerImpl(this);
161 
162  // only an owner may create independently
163  if (!rModelName.isEmpty())
164  CreateUnoControlModel(rModelName,rxSFac);
165 }
166 
168 {
169  try
170  {
171  // clean up the control model
172  uno::Reference< lang::XComponent > xComp(xUnoControlModel, uno::UNO_QUERY);
173  if (xComp.is())
174  {
175  // is the control model owned by its environment?
176  uno::Reference< container::XChild > xContent(xUnoControlModel, uno::UNO_QUERY);
177  if (xContent.is() && !xContent->getParent().is())
178  xComp->dispose();
179  else
180  m_pImpl->pEventListener->StopListening(xComp);
181  }
182  }
183  catch( const uno::Exception& )
184  {
185  TOOLS_WARN_EXCEPTION( "svx", "SdrUnoObj::~SdrUnoObj" );
186  }
187 }
188 
190 {
191  rInfo.bRotateFreeAllowed = false;
192  rInfo.bRotate90Allowed = false;
193  rInfo.bMirrorFreeAllowed = false;
194  rInfo.bMirror45Allowed = false;
195  rInfo.bMirror90Allowed = false;
196  rInfo.bTransparenceAllowed = false;
197  rInfo.bShearAllowed = false;
198  rInfo.bEdgeRadiusAllowed = false;
199  rInfo.bNoOrthoDesired = false;
200  rInfo.bCanConvToPath = false;
201  rInfo.bCanConvToPoly = false;
202  rInfo.bCanConvToPathLineToArea = false;
203  rInfo.bCanConvToPolyLineToArea = false;
204  rInfo.bCanConvToContour = false;
205 }
206 
207 sal_uInt16 SdrUnoObj::GetObjIdentifier() const
208 {
209  return sal_uInt16(OBJ_UNO);
210 }
211 
212 void SdrUnoObj::SetContextWritingMode( const sal_Int16 _nContextWritingMode )
213 {
214  try
215  {
216  uno::Reference< beans::XPropertySet > xModelProperties( GetUnoControlModel(), uno::UNO_QUERY_THROW );
217  xModelProperties->setPropertyValue( "ContextWritingMode", uno::makeAny( _nContextWritingMode ) );
218  }
219  catch( const uno::Exception& )
220  {
222  }
223 }
224 
226 {
227  OUStringBuffer sName(SvxResId(STR_ObjNameSingulUno));
228 
229  OUString aName(GetName());
230  if (!aName.isEmpty())
231  {
232  sName.append(' ');
233  sName.append('\'');
234  sName.append(aName);
235  sName.append('\'');
236  }
237 
238  return sName.makeStringAndClear();
239 }
240 
242 {
243  return SvxResId(STR_ObjNamePluralUno);
244 }
245 
247 {
248  return CloneHelper< SdrUnoObj >(rTargetModel);
249 }
250 
252 {
253  if( this == &rObj )
254  return *this;
256 
257  // release the reference to the current control model
258  SetUnoControlModel( nullptr );
259 
262 
263  // copy the uno control model
264  const uno::Reference< awt::XControlModel > xSourceControlModel = rObj.GetUnoControlModel();
265  if ( xSourceControlModel.is() )
266  {
267  try
268  {
269  uno::Reference< util::XCloneable > xClone( xSourceControlModel, uno::UNO_QUERY_THROW );
270  xUnoControlModel.set( xClone->createClone(), uno::UNO_QUERY_THROW );
271  }
272  catch( const uno::Exception& )
273  {
275  }
276  }
277 
278  // get service name of the control from the control model
279  uno::Reference< beans::XPropertySet > xSet(xUnoControlModel, uno::UNO_QUERY);
280  if (xSet.is())
281  {
282  uno::Any aValue( xSet->getPropertyValue("DefaultControl") );
283  OUString aStr;
284 
285  if( aValue >>= aStr )
286  aUnoControlTypeName = aStr;
287  }
288 
289  uno::Reference< lang::XComponent > xComp(xUnoControlModel, uno::UNO_QUERY);
290  if (xComp.is())
291  m_pImpl->pEventListener->StartListening(xComp);
292  return *this;
293 }
294 
295 void SdrUnoObj::NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact)
296 {
297  SdrRectObj::NbcResize(rRef,xFact,yFact);
298 
299  if (aGeo.nShearAngle!=0 || aGeo.nRotationAngle!=0)
300  {
301  // small correctors
302  if (aGeo.nRotationAngle>=9000 && aGeo.nRotationAngle<27000)
303  {
305  }
306 
307  aGeo.nRotationAngle = 0;
308  aGeo.nShearAngle = 0;
309  aGeo.nSin = 0.0;
310  aGeo.nCos = 1.0;
311  aGeo.nTan = 0.0;
312  SetRectsDirty();
313  }
314 }
315 
316 
318 {
319  // no special drag; we have no rounding rect and
320  // do want frame handles
321  return false;
322 }
323 
325 {
326  if ( GetLayer() == _nLayer )
327  { // redundant call -> not interested in doing anything here
328  SdrRectObj::NbcSetLayer( _nLayer );
329  return;
330  }
331 
332  // we need some special handling here in case we're moved from an invisible layer
333  // to a visible one, or vice versa
334  // (relative to a layer. Remember that the visibility of a layer is a view attribute
335  // - the same layer can be visible in one view, and invisible in another view, at the
336  // same time)
337 
338  // collect all views in which our old layer is visible
339  o3tl::sorted_vector< SdrView* > aPreviouslyVisible;
340 
341  {
342  SdrViewIter aIter( this );
343  for ( SdrView* pView = aIter.FirstView(); pView; pView = aIter.NextView() )
344  aPreviouslyVisible.insert( pView );
345  }
346 
347  SdrRectObj::NbcSetLayer( _nLayer );
348 
349  // collect all views in which our new layer is visible
350  o3tl::sorted_vector< SdrView* > aNewlyVisible;
351 
352  {
353  SdrViewIter aIter( this );
354  for ( SdrView* pView = aIter.FirstView(); pView; pView = aIter.NextView() )
355  {
356  if ( aPreviouslyVisible.erase(pView) == 0 )
357  {
358  // in pView, we were visible _before_ the layer change, and are
359  // _not_ visible after the layer change
360  // => remember this view, as our visibility there changed
361  aNewlyVisible.insert( pView );
362  }
363  }
364  }
365 
366  // now aPreviouslyVisible contains all views where we became invisible
367  for (const auto& rpView : aPreviouslyVisible)
368  {
369  lcl_ensureControlVisibility( rpView, this, false );
370  }
371 
372  // and aNewlyVisible all views where we became visible
373  for (const auto& rpView : aNewlyVisible)
374  {
375  lcl_ensureControlVisibility( rpView, this, true );
376  }
377 }
378 
379 void SdrUnoObj::CreateUnoControlModel(const OUString& rModelName)
380 {
381  DBG_ASSERT(!xUnoControlModel.is(), "model already exists");
382 
383  aUnoControlModelTypeName = rModelName;
384 
385  uno::Reference< awt::XControlModel > xModel;
386  uno::Reference< uno::XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
387  if (!aUnoControlModelTypeName.isEmpty() )
388  {
389  xModel.set(xContext->getServiceManager()->createInstanceWithContext(
390  aUnoControlModelTypeName, xContext), uno::UNO_QUERY);
391 
392  if (xModel.is())
393  SetChanged();
394  }
395 
396  SetUnoControlModel(xModel);
397 }
398 
399 void SdrUnoObj::CreateUnoControlModel(const OUString& rModelName,
400  const uno::Reference< lang::XMultiServiceFactory >& rxSFac)
401 {
402  DBG_ASSERT(!xUnoControlModel.is(), "model already exists");
403 
404  aUnoControlModelTypeName = rModelName;
405 
406  uno::Reference< awt::XControlModel > xModel;
407  if (!aUnoControlModelTypeName.isEmpty() && rxSFac.is() )
408  {
409  xModel.set(rxSFac->createInstance(aUnoControlModelTypeName), uno::UNO_QUERY);
410 
411  if (xModel.is())
412  SetChanged();
413  }
414 
415  SetUnoControlModel(xModel);
416 }
417 
418 void SdrUnoObj::SetUnoControlModel( const uno::Reference< awt::XControlModel >& xModel)
419 {
420  if (xUnoControlModel.is())
421  {
422  uno::Reference< lang::XComponent > xComp(xUnoControlModel, uno::UNO_QUERY);
423  if (xComp.is())
424  m_pImpl->pEventListener->StopListening(xComp);
425  }
426 
427  xUnoControlModel = xModel;
428 
429  // control model has to contain service name of the control
430  if (xUnoControlModel.is())
431  {
432  uno::Reference< beans::XPropertySet > xSet(xUnoControlModel, uno::UNO_QUERY);
433  if (xSet.is())
434  {
435  uno::Any aValue( xSet->getPropertyValue("DefaultControl") );
436  OUString aStr;
437  if( aValue >>= aStr )
438  aUnoControlTypeName = aStr;
439  }
440 
441  uno::Reference< lang::XComponent > xComp(xUnoControlModel, uno::UNO_QUERY);
442  if (xComp.is())
443  m_pImpl->pEventListener->StartListening(xComp);
444  }
445 
446  // invalidate all ViewObject contacts
447  ViewContactOfUnoControl* pVC = nullptr;
448  if ( impl_getViewContact( pVC ) )
449  {
450  // flushViewObjectContacts() removes all existing VOCs for the local DrawHierarchy. This
451  // is always allowed since they will be re-created on demand (and with the changed model)
453  }
454 }
455 
456 
457 uno::Reference< awt::XControl > SdrUnoObj::GetUnoControl(const SdrView& _rView, const OutputDevice& _rOut) const
458 {
459  uno::Reference< awt::XControl > xControl;
460 
461  SdrPageView* pPageView = _rView.GetSdrPageView();
462  OSL_ENSURE( pPageView && getSdrPageFromSdrObject() == pPageView->GetPage(), "SdrUnoObj::GetUnoControl: This object is not displayed in that particular view!" );
463  if ( !pPageView || getSdrPageFromSdrObject() != pPageView->GetPage() )
464  return nullptr;
465 
466  SdrPageWindow* pPageWindow = pPageView->FindPageWindow( _rOut );
467  OSL_ENSURE( pPageWindow, "SdrUnoObj::GetUnoControl: did not find my SdrPageWindow!" );
468  if ( !pPageWindow )
469  return nullptr;
470 
471  ViewObjectContact& rViewObjectContact( GetViewContact().GetViewObjectContact( pPageWindow->GetObjectContact() ) );
472  ViewObjectContactOfUnoControl* pUnoContact = dynamic_cast< ViewObjectContactOfUnoControl* >( &rViewObjectContact );
473  OSL_ENSURE( pUnoContact, "SdrUnoObj::GetUnoControl: wrong contact type!" );
474  if ( pUnoContact )
475  xControl = pUnoContact->getControl();
476 
477  return xControl;
478 }
479 
480 
481 uno::Reference< awt::XControl > SdrUnoObj::GetTemporaryControlForWindow(
482  const vcl::Window& _rWindow, uno::Reference< awt::XControlContainer >& _inout_ControlContainer ) const
483 {
484  uno::Reference< awt::XControl > xControl;
485 
486  ViewContactOfUnoControl* pVC = nullptr;
487  if ( impl_getViewContact( pVC ) )
488  xControl = pVC->getTemporaryControlForWindow( _rWindow, _inout_ControlContainer );
489 
490  return xControl;
491 }
492 
493 
495 {
496  ViewContact& rViewContact( GetViewContact() );
497  _out_rpContact = dynamic_cast< ViewContactOfUnoControl* >( &rViewContact );
498  DBG_ASSERT( _out_rpContact, "SdrUnoObj::impl_getViewContact: could not find my ViewContact!" );
499  return ( _out_rpContact != nullptr );
500 }
501 
502 
503 std::unique_ptr<sdr::contact::ViewContact> SdrUnoObj::CreateObjectSpecificViewContact()
504 {
505  return std::make_unique<sdr::contact::ViewContactOfUnoControl>( *this );
506 }
507 
508 
509 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
SVX_DLLPRIVATE bool impl_getViewContact(sdr::contact::ViewContactOfUnoControl *&_out_rpContact) const
Retrieves the typed ViewContact for the object.
Definition: svdouno.cxx:494
virtual void SAL_CALL disposing(const css::lang::EventObject &Source) override
Definition: svdouno.cxx:73
css::uno::Reference< css::awt::XControl > getControl()
returns the ->XControl instance belonging to the instance, creates it if necessary ...
void StartListening(const uno::Reference< lang::XComponent > &xComp)
Definition: svdouno.cxx:87
double nSin
Definition: svdtrans.hxx:219
virtual void TakeObjInfo(SdrObjTransformInfoRec &rInfo) const override
Definition: svdouno.cxx:189
GeoStat aGeo
Definition: svdotext.hxx:185
SdrUnoObj & operator=(const SdrUnoObj &rObj)
Definition: svdouno.cxx:251
long nRotationAngle
Definition: svdtrans.hxx:216
css::uno::Reference< css::awt::XControl > getTemporaryControlForWindow(const vcl::Window &_rWindow, css::uno::Reference< css::awt::XControlContainer > &_inout_ControlContainer) const
retrieves a temporary XControl instance, whose parent is the given window SdrUnoObj::GetTemporaryCon...
virtual void SetContextWritingMode(const sal_Int16 _nContextWritingMode) override
Definition: svdouno.cxx:212
SdrUnoObj(SdrModel &rSdrModel, const OUString &rModelName)
Definition: svdouno.cxx:136
sdr::contact::ViewContact & GetViewContact() const
Definition: svdobj.cxx:244
void Move(long nHorzMoveDelta, long nVertMoveDelta)
Rectangle objects (rectangle, circle, ...)
Definition: svdorect.hxx:39
SdrView * NextView()
Definition: svdviter.cxx:165
SdrPageWindow * FindPageWindow(SdrPaintWindow &rPaintWindow) const
Definition: svdpagv.cxx:41
Provides information about various ZObject properties.
Definition: svdobj.hxx:248
virtual void NbcSetLayer(SdrLayerID nLayer) override
Definition: svdouno.cxx:324
SdrPageWindow * GetPageWindow(sal_uInt32 nIndex) const
Definition: svdpagv.cxx:81
long Right() const
SdrPage * getSdrPageFromSdrObject() const
Definition: svdobj.cxx:262
OUString SvxResId(const char *pId)
Definition: dialmgr.cxx:28
continuously activated OLE (PlugIn-Frame or similar)
Definition: svdobj.hxx:145
SVX_DLLPRIVATE void CreateUnoControlModel(const OUString &rModelName)
Definition: svdouno.cxx:379
virtual std::unique_ptr< sdr::contact::ViewContact > CreateObjectSpecificViewContact() override
Definition: svdouno.cxx:503
tools::Rectangle maRect
Definition: svdotext.hxx:182
virtual ~SdrUnoObj() override
Definition: svdouno.cxx:167
void StopListening(const uno::Reference< lang::XComponent > &xComp)
Definition: svdouno.cxx:81
virtual void NbcResize(const Point &rRef, const Fraction &xFact, const Fraction &yFact) override
Definition: svdouno.cxx:295
long Top() const
virtual OUString TakeObjNamePlural() const override
Definition: svdouno.cxx:241
OUString aUnoControlTypeName
Definition: svdouno.hxx:52
#define DBG_UNHANDLED_EXCEPTION(...)
#define TOOLS_WARN_EXCEPTION(area, stream)
double nCos
Definition: svdtrans.hxx:220
#define DBG_ASSERT(sCon, aError)
int i
OUString sName
friend class SdrControlEventListenerImpl
Definition: svdouno.hxx:47
css::uno::Reference< css::awt::XControl > GetTemporaryControlForWindow(const vcl::Window &_rWindow, css::uno::Reference< css::awt::XControlContainer > &_inout_ControlContainer) const
Retrieves a temporary XControl instance for a given output device.
Definition: svdouno.cxx:481
double nTan
Definition: svdtrans.hxx:218
virtual void SetUnoControlModel(const css::uno::Reference< css::awt::XControlModel > &xModel)
Definition: svdouno.cxx:418
long Bottom() const
void flushViewObjectContacts(bool bWithHierarchy=true)
const sdr::contact::ObjectContact & GetObjectContact() const
OUString GetName() const
Definition: svdobj.cxx:697
long nShearAngle
Definition: svdtrans.hxx:217
virtual SdrLayerID GetLayer() const
Definition: svdobj.cxx:576
virtual bool hasSpecialDrag() const override
The standard transformations (Move,Resize,Rotate,Mirror,Shear) are taken over by the View (TakeXorPol...
Definition: svdouno.cxx:317
virtual sal_uInt16 GetObjIdentifier() const override
Definition: svdouno.cxx:207
SdrControlEventListenerImpl(SdrUnoObj *_pObj)
Definition: svdouno.cxx:61
SdrRectObj & operator=(const SdrRectObj &rCopy)
Definition: svdorect.cxx:250
mutable::rtl::Reference< SdrControlEventListenerImpl > pEventListener
Definition: svdouno.cxx:97
std::unique_ptr< SdrUnoObjDataHolder > m_pImpl
Definition: svdouno.hxx:49
bool bIsUnoObj
Definition: svdobj.hxx:944
SdrPage * GetPage() const
Definition: svdpagv.hxx:171
virtual void NbcResize(const Point &rRef, const Fraction &xFact, const Fraction &yFact) override
Definition: svdorect.cxx:466
bool HasObjectContact() const
determines whether there already exists an ObjectContact
OUString aName
Reference< XComponentContext > getProcessComponentContext()
virtual OUString TakeObjNameSingul() const override
Definition: svdouno.cxx:225
long Left() const
css::uno::Reference< css::awt::XControl > GetUnoControl(const SdrView &_rView, const OutputDevice &_rOut) const
Definition: svdouno.cxx:457
SdrPageView * GetSdrPageView() const
Definition: svdpntv.hxx:310
virtual void SetRectsDirty(bool bNotMyself=false, bool bRecursive=true)
Definition: svdobj.cxx:434
const css::uno::Reference< css::awt::XControlModel > & GetUnoControlModel() const
Definition: svdouno.hxx:91
uno::Reference< ucb::XContent > xContent
Reference< XModel > xModel
css::uno::Reference< css::awt::XControlModel > xUnoControlModel
Definition: svdouno.hxx:55
::std::unique_ptr< XmlIdRegistry_Impl > m_pImpl
std::pair< const_iterator, bool > insert(Value &&x)
virtual void SetChanged()
Definition: svdobj.cxx:928
virtual SdrUnoObj * CloneSdrObject(SdrModel &rTargetModel) const override
Definition: svdouno.cxx:246
SdrView * FirstView()
Definition: svdviter.cxx:158
aStr
OUString aUnoControlModelTypeName
Definition: svdouno.hxx:51
size_type erase(const Value &x)
virtual void NbcSetLayer(SdrLayerID nLayer)
Definition: svdobj.cxx:593
sal_uInt32 PageWindowCount() const
Definition: svdpagv.hxx:94