32 #include <svx/strings.hrc>
58 #include <osl/diagnose.h>
68 #include <bitmaps.hlst>
86 ::std::vector< BitmapEx > maRealMarkers;
92 explicit SdrHdlBitmapSet();
99 #define KIND_COUNT (14)
100 #define INDEX_COUNT (6)
101 #define INDIVIDUAL_COUNT (5)
103 SdrHdlBitmapSet::SdrHdlBitmapSet()
104 : maMarkersBitmap(SIP_SA_MARKERS),
112 BitmapEx& rTargetBitmap = maRealMarkers[nIndex];
116 rTargetBitmap = maMarkersBitmap;
117 rTargetBitmap.
Crop(rRectangle);
120 return rTargetBitmap;
127 const sal_uInt16 nYPos(nInd * 11);
129 switch(eKindOfMarker)
133 OSL_FAIL(
"Unknown kind of marker." );
281 mbMoveOutside(
false),
300 mbMoveOutside(
false),
551 Point aMoveOutsideOffset(0, 0);
560 aMoveOutsideOffset.AdjustY( -(aOffset.
Width()) );
562 aMoveOutsideOffset.AdjustY(aOffset.
Height() );
564 aMoveOutsideOffset.AdjustX( -(aOffset.
Width()) );
566 aMoveOutsideOffset.AdjustX(aOffset.
Height() );
573 std::unique_ptr<sdr::overlay::OverlayObject> pNewOverlayObject;
577 switch (eKindOfMarker)
617 aPosition, eColIndex, eKindOfMarker,
623 std::move(pNewOverlayObject),
672 switch(eKindOfMarker)
712 return "anchor-pressed";
714 return "glue-selected";
716 return "glue-unselected";
750 OUString sMarkerName = appendMarkerName(eKindOfMarker);
751 if (!sMarkerName.isEmpty())
753 OUString sMarkerPrefix(
"svx/res/marker-");
779 return aModernSet.
get()->GetBitmapEx(eKindOfMarker, sal_uInt16(eIndex));
788 std::unique_ptr<sdr::overlay::OverlayObject> pRetval;
791 bool bForceBiggerSize(
false);
795 switch(eKindOfMarker)
806 bForceBiggerSize =
true;
812 bForceBiggerSize =
true;
829 if(eNextBigger == eKindOfMarker)
833 switch(eKindOfMarker)
857 BitmapEx aBmpEx1 = ImpGetBitmapEx(eKindOfMarker, eColIndex);
858 BitmapEx aBmpEx2 = ImpGetBitmapEx(eNextBigger, eColIndex);
889 BitmapEx aBmpEx = ImpGetBitmapEx(eKindOfMarker, eColIndex);
917 sal_uInt16 nCenX(static_cast<sal_uInt16>(aBmpEx.
GetSizePixel().
Width() - 1) >> 1);
920 if(aMoveOutsideOffset.X() > 0)
924 else if(aMoveOutsideOffset.X() < 0)
929 if(aMoveOutsideOffset.Y() > 0)
933 else if(aMoveOutsideOffset.Y() < 0)
959 if (bSize &&
pHdlList!=
nullptr && (bRot || bDis)) {
986 nHdlAngle/=4500_deg100;
987 switch (static_cast<sal_uInt8>(nHdlAngle.
get())) {
988 case 0: ePtr=PointerStyle::ESize;
break;
989 case 1: ePtr=PointerStyle::NESize;
break;
990 case 2: ePtr=PointerStyle::NSize;
break;
991 case 3: ePtr=PointerStyle::NWSize;
break;
992 case 4: ePtr=PointerStyle::WSize;
break;
993 case 5: ePtr=PointerStyle::SWSize;
break;
994 case 6: ePtr=PointerStyle::SSize;
break;
995 case 7: ePtr=PointerStyle::SESize;
break;
1080 std::unique_ptr<sdr::overlay::OverlayObject> pOverlayObject,
1095 const_cast<sdr::contact::ObjectContact&>(rObjectContact)));
1101 pOverlayObject->setOffset(aOffset);
1106 rOverlayManager.
add(*pOverlayObject);
1157 std::unique_ptr<sdr::overlay::OverlayObject> pNewOverlayObject(
new
1167 std::move(pNewOverlayObject),
1195 const Color aLightColor(
1196 static_cast<sal_uInt8>(::std::min(static_cast<sal_Int16>(static_cast<sal_Int16>(aCol.
GetRed()) + sal_Int16(0x0040)), sal_Int16(0x00ff))),
1197 static_cast<sal_uInt8>(::std::min(static_cast<sal_Int16>(static_cast<sal_Int16>(aCol.
GetGreen()) + sal_Int16(0x0040)), sal_Int16(0x00ff))),
1198 static_cast<sal_uInt8>(::std::min(static_cast<sal_Int16>(static_cast<sal_Int16>(aCol.
GetBlue()) + sal_Int16(0x0040)), sal_Int16(0x00ff))));
1204 const Color aDarkColor(
1205 static_cast<sal_uInt8>(::std::max(static_cast<sal_Int16>(static_cast<sal_Int16>(aCol.
GetRed()) - sal_Int16(0x0040)), sal_Int16(0x0000))),
1206 static_cast<sal_uInt8>(::std::max(static_cast<sal_Int16>(static_cast<sal_Int16>(aCol.
GetGreen()) - sal_Int16(0x0040)), sal_Int16(0x0000))),
1207 static_cast<sal_uInt8>(::std::max(static_cast<sal_Int16>(static_cast<sal_Int16>(aCol.
GetBlue()) - sal_Int16(0x0040)), sal_Int16(0x0000))));
1218 Color aRetval(aLum, aLum, aLum);
1259 , bMoveSingleHandle(
false)
1260 , bMoveFirstHandle(
false)
1310 double fLongPercentArrow = (1.0 - 0.05) * fVecLen;
1311 double fHalfArrowWidth = (0.05 * 0.5) * fVecLen;
1314 sal_Int32 nMidX =
static_cast<sal_Int32
>(
aPos.X() + aVec.getX() * fLongPercentArrow);
1315 sal_Int32 nMidY =
static_cast<sal_Int32
>(
aPos.Y() + aVec.getY() * fLongPercentArrow);
1316 Point aMidPoint(nMidX, nMidY);
1321 std::unique_ptr<sdr::overlay::OverlayObject> pNewOverlayObject(
new
1330 std::move(pNewOverlayObject),
1335 Point aLeft(aMidPoint.X() +
static_cast<sal_Int32
>(aPerpend.getX() * fHalfArrowWidth),
1336 aMidPoint.Y() +
static_cast<sal_Int32
>(aPerpend.getY() * fHalfArrowWidth));
1337 Point aRight(aMidPoint.X() -
static_cast<sal_Int32
>(aPerpend.getX() * fHalfArrowWidth),
1338 aMidPoint.Y() -
static_cast<sal_Int32
>(aPerpend.getY() * fHalfArrowWidth));
1344 pNewOverlayObject.reset(
new
1354 std::move(pNewOverlayObject),
1365 FromIAOToItem(GetObj(),
true,
true);
1392 if(bSetItemOnObject)
1396 const OUString aString;
1401 aNewSet.Put(aNewGradItem);
1406 aNewSet.Put(aNewTransItem);
1409 if(bUndo && rModel.IsUndoEnabled())
1411 rModel.BegUndo(
SvxResId(
IsGradient() ? SIP_XA_FILLGRADIENT : SIP_XA_FILLTRANSPARENCE));
1412 rModel.AddUndo(rModel.GetSdrUndoFactory().CreateUndoAttrObject(*_pObj));
1469 std::unique_ptr<sdr::overlay::OverlayObject> pNewOverlayObject(
new
1480 std::move(pNewOverlayObject),
1490 return PointerStyle::RefHand;
1527 if(!aPosition1.equal(aPosition2))
1529 std::unique_ptr<sdr::overlay::OverlayObject> pNewOverlayObject(
new
1536 pNewOverlayObject->setHittable(
false);
1543 std::move(pNewOverlayObject),
1583 std::unique_ptr<sdr::overlay::OverlayObject> pNewOverlayObject(
new
1587 pNewOverlayObject->setBaseColor(
COL_BLACK);
1591 std::move(pNewOverlayObject),
1652 std::move(pNewOverlayObject),
1687 return PointerStyle::MovePoint;
1689 return PointerStyle::ESize;
1691 return PointerStyle::SSize;
1712 return nAngle==0 || nAngle==18000;
1770 std::move(pNewOverlayObject),
1782 case 0:
case 1:
return PointerStyle::Hand;
1783 case 2:
case 3:
return PointerStyle::MovePoint;
1786 return PointerStyle::NotAllowed;
1838 pNewOverlayObject->setHittable(
false);
1842 std::move(pNewOverlayObject),
1869 if (lhs->IsPlusHdl()) n1=4;
1870 if (rhs->IsPlusHdl()) n2=4;
1883 sal_uInt32 nNum1=lhs->GetObjHdlNum();
1884 sal_uInt32 nNum2=rhs->GetObjHdlNum();
1889 return static_cast<sal_uInt16
>(eKind1)<static_cast<sal_uInt16>(eKind2);
1913 struct ImplHdlAndIndex
1927 const ImplHdlAndIndex* p1 =
static_cast<ImplHdlAndIndex
const *
>(pVoid1);
1928 const ImplHdlAndIndex* p2 =
static_cast<ImplHdlAndIndex
const *
>(pVoid2);
1930 if(p1->mpHdl->GetObj() == p2->mpHdl->GetObj())
1932 if(p1->mpHdl->GetObj() &&
dynamic_cast<const SdrPathObj*
>(p1->mpHdl->GetObj()) !=
nullptr)
1939 if(p1->mpHdl->GetPolyNum() == p2->mpHdl->GetPolyNum())
1941 if(p1->mpHdl->GetPointNum() < p2->mpHdl->GetPointNum())
1950 else if(p1->mpHdl->GetPolyNum() < p2->mpHdl->GetPolyNum())
1963 if(!p1->mpHdl->GetObj())
1967 else if(!p2->mpHdl->GetObj())
1974 const sal_uInt32 nOrdNum1 = p1->mpHdl->GetObj()->GetOrdNum();
1975 const sal_uInt32 nOrdNum2 = p2->mpHdl->GetObj()->GetOrdNum();
1977 if(nOrdNum1 < nOrdNum2)
1989 if(p1->mnIndex < p2->mnIndex)
2014 pOld =
GetHdl(nOldHdlNum);
2024 std::unique_ptr<ImplHdlAndIndex[]> pHdlAndIndex(
new ImplHdlAndIndex[
maList.size()]);
2027 for(
size_t a = 0;
a <
maList.size(); ++
a)
2029 pHdlAndIndex[
a].mpHdl =
maList[
a].get();
2030 pHdlAndIndex[
a].mnIndex =
a;
2036 size_t nOldHdl(nOldHdlNum);
2038 if(nOldHdlNum != SAL_MAX_SIZE)
2040 for(
size_t a = 0;
a <
maList.size(); ++
a)
2042 if(pHdlAndIndex[
a].mpHdl == pOld)
2051 size_t nNewHdl(nOldHdl);
2056 if(nOldHdl != SAL_MAX_SIZE)
2058 if(nOldHdl ==
maList.size() - 1)
2061 nNewHdl = SAL_MAX_SIZE;
2077 if(nOldHdl == SAL_MAX_SIZE)
2080 nNewHdl =
maList.size() - 1;
2088 nNewHdl = SAL_MAX_SIZE;
2099 sal_uIntPtr nNewHdlNum(nNewHdl);
2102 if(nNewHdl != SAL_MAX_SIZE)
2104 SdrHdl* pNew = pHdlAndIndex[nNewHdl].mpHdl;
2106 for(
size_t a = 0;
a <
maList.size(); ++
a)
2117 if(nOldHdlNum != nNewHdlNum)
2143 if(pActual && pActual == pNew)
2146 const size_t nNewHdlNum =
GetHdlNum(pNew);
2148 if(nNewHdlNum != SAL_MAX_SIZE)
2175 : mnFocusIndex(SAL_MAX_SIZE),
2233 std::unique_ptr<SdrHdl> pRetval = std::move(
maList[nNum]);
2242 [&eKind](std::unique_ptr<SdrHdl>& rItem) {
return rItem->GetKind() == eKind; }),
2281 return SAL_MAX_SIZE;
2283 [&](
const std::unique_ptr<SdrHdl> &
p) {
return p.get() == pHdl; });
2284 assert(it !=
maList.end());
2286 return SAL_MAX_SIZE;
2287 return it -
maList.begin();
2293 pHdl->SetHdlList(
this);
2294 maList.push_back(std::move(pHdl));
2302 while (nNum>0 && pRet==
nullptr)
2326 for (
auto & pHdl :
maList)
2327 pHdl->SetHdlList(&rOther);
2329 std::make_move_iterator(maList.begin()), std::make_move_iterator(maList.end()));
2338 :
SdrHdl(rPnt, eNewKind),
2340 mfRotation(fRotation)
2347 int nPixelSize = 0, nX = 0, nY = 0, nOffset = 0;
2354 else if( nSize <=4 )
2381 aRetval.
Crop(aSourceRect);
2400 const BitmapEx aHandlesBitmap(SIP_SA_CROP_MARKERS);
2414 std::unique_ptr<sdr::overlay::OverlayObject> pOverlayObject;
2453 std::move(pOverlayObject),
2473 maObjectTransform(rObjectTransform),
2475 mfCropLeft(fCropLeft),
2476 mfCropTop(fCropTop),
2477 mfCropRight(fCropRight),
2478 mfCropBottom(fCropBottom)
2485 assert(rotate !=
nullptr);
2515 double fRotate, fShearX;
2524 translateRotationToMirroring(aScale, &fRotate);
2530 const bool bMirroredX(aScale.
getX() < 0.0);
2531 const bool bMirroredY(aScale.
getY() < 0.0);
2549 aScale.
getX() + fCropRight + fCropLeft,
2550 aScale.
getY() + fCropBottom + fCropTop);
2552 aTranslate.
getX() - fCropLeft,
2553 aTranslate.
getY() - fCropTop);
2557 aTranslate.
getX(), aTranslate.
getY(),
2560 aTargetTranslate.getX(), aTargetTranslate.getY(),
2561 aTargetTranslate.getX() + aTargetScale.getX(), aTargetTranslate.getY() + aTargetScale.getY());
2563 if(aCropped.isEmpty())
2569 if(aCurrentForCompare.equal(aCropped))
2583 aCropped.transform(aBackToUnit);
2610 aCroppedTransform.
scale(
2611 aCropped.getWidth(),
2612 aCropped.getHeight());
2615 aCropped.getMinY());
2628 std::move(aGraphicOutlinePolygon),
2633 aCombination[0] = aGraphic;
2634 aCombination[1] = aGraphicOutline;
2639 std::move(aCropPolyPolygon),
2640 std::move(aCombination)));
2663 pNew->setHittable(
false);
std::unique_ptr< SdrHdl > RemoveHdl(size_t nNum)
BitmapEx GetBitmapEx(BitmapEx const &rBitmapEx, DrawModeFlags nDrawMode)
std::optional< XPolygon > pEdgeTrack
BitmapEx GetBitmapForHandle(const BitmapEx &rBitmap, int nSize)
rtl::Reference< sdr::overlay::OverlayManager > const & GetOverlayManager() const
SdrHdlGradient(const Point &rRef1, const Point &rRef2, bool bGrad)
bool Erase(const Color &rFillColor)
size_t GetHdlNum(const SdrHdl *pHdl) const
virtual void CreateB2dIAObject() override
bool IsMoveOutside() const
void SetPos(const Point &rPnt)
virtual void CreateB2dIAObject() override
SdrMarkView * GetView() const
void insertNewlyCreatedOverlayObjectForSdrHdl(std::unique_ptr< sdr::overlay::OverlayObject > pOverlayObject, const sdr::contact::ObjectContact &rObjectContact, sdr::overlay::OverlayManager &rOverlayManager)
basegfx::B2DPoint maPositionB
void Set2ndPos(const Point &rPnt)
void intersect(const Range2D &rRange)
constexpr::Color COL_RED(0x80, 0x00, 0x00)
virtual ~ImpEdgeHdl() override
Utility class SdrEdgeInfoRec.
const StyleSettings & GetStyleSettings() const
static const AllSettings & GetSettings()
sal_uInt8 GetLuminance() const
virtual bool IsFocusHdl() const
void SetSelected(bool bJa=true)
SdrObject * GetObj() const
SdrCropViewHdl(const basegfx::B2DHomMatrix &rObjectTransform, const Graphic &rGraphic, double fCropLeft, double fCropTop, double fCropRight, double fCropBottom)
void append(std::unique_ptr< OverlayObject > pOverlayObject)
basegfx::B2DPolyPolygon aWireframePoly
const Point & GetPos() const
constexpr::Color COL_LIGHTGRAY(0xC0, 0xC0, 0xC0)
bool IsUseLuminance() const
bool IsRotateShear() const
virtual void CreateB2dIAObject() override
virtual PointerStyle GetPointer() const
const Point & Get2ndPos() const
void add(OverlayObject &rOverlayObject)
static OutputDevice * GetDefaultDevice()
constexpr tools::Long Width() const
constexpr TypedWhichId< SdrEdgeKindItem > SDRATTR_EDGEKIND(SDRATTR_EDGE_FIRST+0)
SdrPageWindow * GetPageWindow(sal_uInt32 nIndex) const
const Color & GetColor() const
bool OutputToWindow() const
constexpr::Color COL_CYAN(0x00, 0x80, 0x80)
OUString SvxResId(TranslateId aId)
IMPL_LINK_NOARG(SdrHdlGradient, ColorChangeHdl, SdrHdlColor *, void)
SdrHdlColor(const Point &rRef, Color aCol, const Size &rSize, bool bLuminance)
sal_uInt16 GetHdlSize() const
virtual PointerStyle GetPointer() const override
void DrawLine(const Point &rStartPt, const Point &rEndPt)
sal_uInt8 GetBlue() const
virtual PointerStyle GetPointer() const override
const ::std::vector< Color > ImpSvNumberformatScan::StandardColor COL_LIGHTRED
void SetDistortShear(bool bOn)
bool ImpIsHorzLine(SdrEdgeLineCode eLineCode, const XPolygon &rXP) const
virtual void CreateB2dIAObject() override
SdrObject * GetConnectedNode(bool bTail1) const override
void Set1PixMore(bool bJa=true)
void SetHdlList(SdrHdlList *pList)
const tools::Rectangle maRect
SdrHdl * IsHdlListHit(const Point &rPnt) const
static int ImplSortHdlFunc(const void *pVoid1, const void *pVoid2)
const SfxPoolItem & GetObjectItem(const sal_uInt16 nWhich) const
E3dVolumeMarker(const basegfx::B2DPolyPolygon &rWireframePoly)
virtual void CreateB2dIAObject()
UNDERLYING_TYPE get() const
void SetColor(Color aNew, bool bCallLink=false)
void SetObj(SdrObject *pNewObj)
constexpr TypedWhichId< XFillGradientItem > XATTR_FILLGRADIENT(XATTR_FILL_FIRST+2)
void MoveTo(SdrHdlList &rOther)
virtual void CreateB2dIAObject() override
bool decompose(B2DTuple &rScale, B2DTuple &rTranslate, double &rRotate, double &rShearX) const
tools::Long FRound(double fVal)
basegfx::B2DPoint maPositionA
bool SetOutputSizePixel(const Size &rNewSize, bool bErase=true)
virtual void onHelpRequest()
is called when help is requested for the area of this handle
B2DPolygon createPolygonFromRect(const B2DRectangle &rRect, double fRadiusX, double fRadiusY)
void RemoveAllByKind(SdrHdlKind eKind)
const ::std::vector< Color > ImpSvNumberformatScan::StandardColor COL_GRAY
void FromIAOToItem(SdrObject *pObj, bool bSetItemOnObject, bool bUndo)
void SetMergedItemSetAndBroadcast(const SfxItemSet &rSet, bool bClearAllItems=false)
void TravelFocusHdl(bool bForward)
void scale(double fX, double fY)
SdrModel & getSdrModelFromSdrObject() const
void transform(const basegfx::B2DHomMatrix &rMatrix)
std::deque< std::unique_ptr< SdrHdl > > maList
void SetMoveOutside(bool bOn)
SVX_DLLPRIVATE SdrHdlList(const SdrHdlList &)=delete
void SetHdlSize(sal_uInt16 nSiz)
void SetMoveOutside(bool bMoveOutside)
const sdr::contact::ObjectContact & GetObjectContact() const
float GetDPIScaleFactor() const
Degree100 NormAngle36000(Degree100 a)
Normalize angle to -180.00..179.99.
void transform(const basegfx::B2DHomMatrix &rMatrix)
virtual void CreateB2dIAObject() override
SAL_WARN_UNUSED_RESULT Point PixelToLogic(const Point &rDevicePt) const
sal_uInt8 GetGreen() const
SdrHdl * GetFocusHdl() const
virtual void CreateB2dIAObject() override
void append(const B2DPolygon &rPolygon, sal_uInt32 nCount=1)
size_t GetHdlCount() const
SdrHdl * GetHdl(size_t nNum) const
sdr::overlay::OverlayObjectList maOverlayGroup
const ::std::vector< Color > ImpSvNumberformatScan::StandardColor COL_LIGHTCYAN
virtual ~SdrHdlLine() override
constexpr TypedWhichId< XFillFloatTransparenceItem > XATTR_FILLFLOATTRANSPARENCE(XATTR_FILL_FIRST+11)
sal_uInt64 GetCursorBlinkTime() const
void SetRotationAngle(Degree100 n)
const SfxPoolItem & Get(sal_uInt16 nWhich, bool bSrchInParent=true) const
constexpr tools::Long Height() const
const SfxItemSet & GetMergedItemSet() const
virtual SVX_DLLPRIVATE void CreateB2dIAObject() override
const ::std::vector< Color > ImpSvNumberformatScan::StandardColor COL_LIGHTGREEN
SdrPaintWindow & GetPaintWindow() const
void SetFocusHdl(SdrHdl *pNew)
bool IsHdlHit(const Point &rPnt) const
const ::std::vector< Color > ImpSvNumberformatScan::StandardColor COL_BLACK
const ::std::vector< Color > ImpSvNumberformatScan::StandardColor COL_YELLOW
bool IsDistortShear() const
bool areMarkHandlesHidden() const
basegfx::B2DHomMatrix maObjectTransform
virtual void CreateB2dIAObject() override
static BitmapEx createGluePointBitmap()
void translate(double fX, double fY)
virtual ~SdrHdlColor() override
SdrPageView * GetSdrPageView() const
const ::std::vector< Color > ImpSvNumberformatScan::StandardColor COL_LIGHTBLUE
BitmapEx GetBitmapEx(const Point &rSrcPt, const Size &rSize) const
BitmapEx loadFromName(const OUString &rFileName, const ImageLoadFlags eFlags)
std::unique_ptr< sdr::overlay::OverlayObject > CreateOverlayObject(const basegfx::B2DPoint &rPos, BitmapColorIndex eColIndex, BitmapMarkerKind eKindOfMarker, Point aMoveOutsideOffset=Point())
Link< SdrHdlColor *, void > aColorChangeHdl
static BitmapMarkerKind GetNextBigger(BitmapMarkerKind eKnd)
virtual void onMouseEnter(const MouseEvent &rMEvt)
is called when the mouse enters the area of this handle.
constexpr::Color COL_BLUE(0x00, 0x00, 0x80)
static bool ImpSdrHdlListSorter(std::unique_ptr< SdrHdl > const &lhs, std::unique_ptr< SdrHdl > const &rhs)
SdrEdgeLineCode eLineCode
void SetLineCode(SdrEdgeLineCode eCode)
virtual ~SdrHdlBezWgt() override
ImpTextframeHdl(const tools::Rectangle &rRect)
SVX_DLLPRIVATE BitmapEx CreateColorDropper(Color aCol)
bool isHitLogic(const basegfx::B2DPoint &rLogicPosition, double fLogicTolerance=0.0) const
virtual void CreateB2dIAObject() override
virtual ~ImpMeasureHdl() override
virtual void onMouseLeave()
is called when the mouse leaves the area of this handle.
const Size & GetSizePixel() const
sal_uInt16 GetTransparentSelectionPercent()
SdrCropHdl(const Point &rPnt, SdrHdlKind eNewKind, double fShearX, double fRotation)
bool Crop(const tools::Rectangle &rRectPixel)
void SetSize(const Size &rNew)
OutputDevice & GetOutputDevice() const
void SetRotateShear(bool bOn)
void AddHdl(std::unique_ptr< SdrHdl > pHdl)
SdrHdlKind GetKind() const
virtual PointerStyle GetPointer() const override
Utility class SdrEdgeObj.
static SVX_DLLPRIVATE Color GetLuminance(const Color &rCol)
bool m_bDetectedRangeSegmentation false
virtual ~SdrHdlGradient() override
sal_uInt32 PageWindowCount() const