32 #include <svx/strings.hrc>
66 #include <bitmaps.hlst>
84 ::std::vector< BitmapEx > maRealMarkers;
90 explicit SdrHdlBitmapSet();
97 #define KIND_COUNT (14)
98 #define INDEX_COUNT (6)
99 #define INDIVIDUAL_COUNT (5)
101 SdrHdlBitmapSet::SdrHdlBitmapSet()
102 : maMarkersBitmap(SIP_SA_MARKERS),
110 BitmapEx& rTargetBitmap = maRealMarkers[nIndex];
114 rTargetBitmap = maMarkersBitmap;
115 rTargetBitmap.
Crop(rRectangle);
118 return rTargetBitmap;
125 const sal_uInt16 nYPos(nInd * 11);
127 switch(eKindOfMarker)
131 OSL_FAIL(
"Unknown kind of marker." );
279 mbMoveOutside(false),
298 mbMoveOutside(false),
549 Point aMoveOutsideOffset(0, 0);
558 aMoveOutsideOffset.AdjustY( -(aOffset.
Width()) );
560 aMoveOutsideOffset.AdjustY(aOffset.
Height() );
562 aMoveOutsideOffset.AdjustX( -(aOffset.
Width()) );
564 aMoveOutsideOffset.AdjustX(aOffset.
Height() );
571 std::unique_ptr<sdr::overlay::OverlayObject> pNewOverlayObject;
575 switch (eKindOfMarker)
615 aPosition, eColIndex, eKindOfMarker,
621 std::move(pNewOverlayObject),
670 switch(eKindOfMarker)
710 return "anchor-pressed";
712 return "glue-selected";
714 return "glue-unselected";
748 OUString sMarkerName = appendMarkerName(eKindOfMarker);
749 if (!sMarkerName.isEmpty())
751 OUString sMarkerPrefix(
"svx/res/marker-");
777 return aModernSet.get()->GetBitmapEx(eKindOfMarker, sal_uInt16(eIndex));
786 std::unique_ptr<sdr::overlay::OverlayObject> pRetval;
789 bool bForceBiggerSize(
false);
793 switch(eKindOfMarker)
804 bForceBiggerSize =
true;
810 bForceBiggerSize =
true;
827 if(eNextBigger == eKindOfMarker)
831 switch(eKindOfMarker)
855 BitmapEx aBmpEx1 = ImpGetBitmapEx(eKindOfMarker, eColIndex);
856 BitmapEx aBmpEx2 = ImpGetBitmapEx(eNextBigger, eColIndex);
887 BitmapEx aBmpEx = ImpGetBitmapEx(eKindOfMarker, eColIndex);
915 sal_uInt16 nCenX(static_cast<sal_uInt16>(aBmpEx.
GetSizePixel().
Width() - 1) >> 1);
918 if(aMoveOutsideOffset.X() > 0)
922 else if(aMoveOutsideOffset.X() < 0)
927 if(aMoveOutsideOffset.Y() > 0)
931 else if(aMoveOutsideOffset.Y() < 0)
957 if (bSize &&
pHdlList!=
nullptr && (bRot || bDis)) {
984 nHdlAngle/=4500_deg100;
985 switch (static_cast<sal_uInt8>(nHdlAngle.
get())) {
986 case 0: ePtr=PointerStyle::ESize;
break;
987 case 1: ePtr=PointerStyle::NESize;
break;
988 case 2: ePtr=PointerStyle::NSize;
break;
989 case 3: ePtr=PointerStyle::NWSize;
break;
990 case 4: ePtr=PointerStyle::WSize;
break;
991 case 5: ePtr=PointerStyle::SWSize;
break;
992 case 6: ePtr=PointerStyle::SSize;
break;
993 case 7: ePtr=PointerStyle::SESize;
break;
1078 std::unique_ptr<sdr::overlay::OverlayObject> pOverlayObject,
1093 const_cast<sdr::contact::ObjectContact&>(rObjectContact)));
1099 pOverlayObject->setOffset(aOffset);
1104 rOverlayManager.
add(*pOverlayObject);
1155 std::unique_ptr<sdr::overlay::OverlayObject> pNewOverlayObject(
new
1165 std::move(pNewOverlayObject),
1193 const Color aLightColor(
1194 static_cast<sal_uInt8>(::std::min(static_cast<sal_Int16>(static_cast<sal_Int16>(aCol.
GetRed()) + sal_Int16(0x0040)), sal_Int16(0x00ff))),
1195 static_cast<sal_uInt8>(::std::min(static_cast<sal_Int16>(static_cast<sal_Int16>(aCol.
GetGreen()) + sal_Int16(0x0040)), sal_Int16(0x00ff))),
1196 static_cast<sal_uInt8>(::std::min(static_cast<sal_Int16>(static_cast<sal_Int16>(aCol.
GetBlue()) + sal_Int16(0x0040)), sal_Int16(0x00ff))));
1202 const Color aDarkColor(
1203 static_cast<sal_uInt8>(::std::max(static_cast<sal_Int16>(static_cast<sal_Int16>(aCol.
GetRed()) - sal_Int16(0x0040)), sal_Int16(0x0000))),
1204 static_cast<sal_uInt8>(::std::max(static_cast<sal_Int16>(static_cast<sal_Int16>(aCol.
GetGreen()) - sal_Int16(0x0040)), sal_Int16(0x0000))),
1205 static_cast<sal_uInt8>(::std::max(static_cast<sal_Int16>(static_cast<sal_Int16>(aCol.
GetBlue()) - sal_Int16(0x0040)), sal_Int16(0x0000))));
1216 Color aRetval(aLum, aLum, aLum);
1257 , bMoveSingleHandle(false)
1258 , bMoveFirstHandle(false)
1308 double fLongPercentArrow = (1.0 - 0.05) * fVecLen;
1309 double fHalfArrowWidth = (0.05 * 0.5) * fVecLen;
1312 sal_Int32 nMidX =
static_cast<sal_Int32
>(
aPos.X() + aVec.getX() * fLongPercentArrow);
1313 sal_Int32 nMidY =
static_cast<sal_Int32
>(
aPos.Y() + aVec.getY() * fLongPercentArrow);
1314 Point aMidPoint(nMidX, nMidY);
1319 std::unique_ptr<sdr::overlay::OverlayObject> pNewOverlayObject(
new
1328 std::move(pNewOverlayObject),
1333 Point aLeft(aMidPoint.X() +
static_cast<sal_Int32
>(aPerpend.getX() * fHalfArrowWidth),
1334 aMidPoint.Y() +
static_cast<sal_Int32
>(aPerpend.getY() * fHalfArrowWidth));
1335 Point aRight(aMidPoint.X() -
static_cast<sal_Int32
>(aPerpend.getX() * fHalfArrowWidth),
1336 aMidPoint.Y() -
static_cast<sal_Int32
>(aPerpend.getY() * fHalfArrowWidth));
1342 pNewOverlayObject.reset(
new
1352 std::move(pNewOverlayObject),
1363 FromIAOToItem(GetObj(),
true,
true);
1390 if(bSetItemOnObject)
1394 const OUString aString;
1399 aNewSet.Put(aNewGradItem);
1404 aNewSet.Put(aNewTransItem);
1407 if(bUndo && rModel.IsUndoEnabled())
1409 rModel.BegUndo(
SvxResId(
IsGradient() ? SIP_XA_FILLGRADIENT : SIP_XA_FILLTRANSPARENCE));
1410 rModel.AddUndo(rModel.GetSdrUndoFactory().CreateUndoAttrObject(*_pObj));
1467 std::unique_ptr<sdr::overlay::OverlayObject> pNewOverlayObject(
new
1478 std::move(pNewOverlayObject),
1488 return PointerStyle::RefHand;
1525 if(!aPosition1.equal(aPosition2))
1527 std::unique_ptr<sdr::overlay::OverlayObject> pNewOverlayObject(
new
1534 pNewOverlayObject->setHittable(
false);
1541 std::move(pNewOverlayObject),
1581 std::unique_ptr<sdr::overlay::OverlayObject> pNewOverlayObject(
new
1585 pNewOverlayObject->setBaseColor(
COL_BLACK);
1589 std::move(pNewOverlayObject),
1650 std::move(pNewOverlayObject),
1685 return PointerStyle::MovePoint;
1687 return PointerStyle::ESize;
1689 return PointerStyle::SSize;
1710 return nAngle==0 || nAngle==18000;
1768 std::move(pNewOverlayObject),
1780 case 0:
case 1:
return PointerStyle::Hand;
1781 case 2:
case 3:
return PointerStyle::MovePoint;
1784 return PointerStyle::NotAllowed;
1824 const Color aHilightColor(aSvtOptionsDrawinglayer.getHilightColor());
1825 const double fTransparence(aSvtOptionsDrawinglayer.GetTransparentSelectionPercent() * 0.01);
1837 pNewOverlayObject->setHittable(
false);
1841 std::move(pNewOverlayObject),
1868 if (lhs->IsPlusHdl()) n1=4;
1869 if (rhs->IsPlusHdl()) n2=4;
1882 sal_uInt32 nNum1=lhs->GetObjHdlNum();
1883 sal_uInt32 nNum2=rhs->GetObjHdlNum();
1888 return static_cast<sal_uInt16
>(eKind1)<static_cast<sal_uInt16>(eKind2);
1912 struct ImplHdlAndIndex
1926 const ImplHdlAndIndex* p1 =
static_cast<ImplHdlAndIndex
const *
>(pVoid1);
1927 const ImplHdlAndIndex* p2 =
static_cast<ImplHdlAndIndex
const *
>(pVoid2);
1929 if(p1->mpHdl->GetObj() == p2->mpHdl->GetObj())
1931 if(p1->mpHdl->GetObj() &&
dynamic_cast<const SdrPathObj*
>(p1->mpHdl->GetObj()) !=
nullptr)
1938 if(p1->mpHdl->GetPolyNum() == p2->mpHdl->GetPolyNum())
1940 if(p1->mpHdl->GetPointNum() < p2->mpHdl->GetPointNum())
1949 else if(p1->mpHdl->GetPolyNum() < p2->mpHdl->GetPolyNum())
1962 if(!p1->mpHdl->GetObj())
1966 else if(!p2->mpHdl->GetObj())
1973 const sal_uInt32 nOrdNum1 = p1->mpHdl->GetObj()->GetOrdNum();
1974 const sal_uInt32 nOrdNum2 = p2->mpHdl->GetObj()->GetOrdNum();
1976 if(nOrdNum1 < nOrdNum2)
1988 if(p1->mnIndex < p2->mnIndex)
2013 pOld =
GetHdl(nOldHdlNum);
2023 std::unique_ptr<ImplHdlAndIndex[]> pHdlAndIndex(
new ImplHdlAndIndex[
maList.size()]);
2026 for(
size_t a = 0;
a <
maList.size(); ++
a)
2028 pHdlAndIndex[
a].mpHdl =
maList[
a].get();
2029 pHdlAndIndex[
a].mnIndex =
a;
2035 size_t nOldHdl(nOldHdlNum);
2037 if(nOldHdlNum != SAL_MAX_SIZE)
2039 for(
size_t a = 0;
a <
maList.size(); ++
a)
2041 if(pHdlAndIndex[
a].mpHdl == pOld)
2050 size_t nNewHdl(nOldHdl);
2055 if(nOldHdl != SAL_MAX_SIZE)
2057 if(nOldHdl ==
maList.size() - 1)
2060 nNewHdl = SAL_MAX_SIZE;
2076 if(nOldHdl == SAL_MAX_SIZE)
2079 nNewHdl =
maList.size() - 1;
2087 nNewHdl = SAL_MAX_SIZE;
2098 sal_uIntPtr nNewHdlNum(nNewHdl);
2101 if(nNewHdl != SAL_MAX_SIZE)
2103 SdrHdl* pNew = pHdlAndIndex[nNewHdl].mpHdl;
2105 for(
size_t a = 0;
a <
maList.size(); ++
a)
2116 if(nOldHdlNum != nNewHdlNum)
2142 if(pActual && pActual == pNew)
2145 const size_t nNewHdlNum =
GetHdlNum(pNew);
2147 if(nNewHdlNum != SAL_MAX_SIZE)
2174 : mnFocusIndex(SAL_MAX_SIZE),
2232 std::unique_ptr<SdrHdl> pRetval = std::move(
maList[nNum]);
2241 [&eKind](std::unique_ptr<SdrHdl>& rItem) {
return rItem->GetKind() == eKind; }),
2280 return SAL_MAX_SIZE;
2282 [&](
const std::unique_ptr<SdrHdl> &
p) {
return p.get() == pHdl; });
2285 return SAL_MAX_SIZE;
2286 return it -
maList.begin();
2292 pHdl->SetHdlList(
this);
2293 maList.push_back(std::move(pHdl));
2301 while (nNum>0 && pRet==
nullptr)
2325 for (
auto & pHdl :
maList)
2326 pHdl->SetHdlList(&rOther);
2328 std::make_move_iterator(maList.begin()), std::make_move_iterator(maList.end()));
2337 :
SdrHdl(rPnt, eNewKind),
2339 mfRotation(fRotation)
2346 int nPixelSize = 0, nX = 0, nY = 0, nOffset = 0;
2353 else if( nSize <=4 )
2380 aRetval.
Crop(aSourceRect);
2399 const BitmapEx aHandlesBitmap(SIP_SA_CROP_MARKERS);
2413 std::unique_ptr<sdr::overlay::OverlayObject> pOverlayObject;
2452 std::move(pOverlayObject),
2472 maObjectTransform(rObjectTransform),
2474 mfCropLeft(fCropLeft),
2475 mfCropTop(fCropTop),
2476 mfCropRight(fCropRight),
2477 mfCropBottom(fCropBottom)
2484 assert(rotate !=
nullptr);
2514 double fRotate, fShearX;
2523 translateRotationToMirroring(aScale, &fRotate);
2529 const bool bMirroredX(aScale.
getX() < 0.0);
2530 const bool bMirroredY(aScale.
getY() < 0.0);
2548 aScale.
getX() + fCropRight + fCropLeft,
2549 aScale.
getY() + fCropBottom + fCropTop);
2551 aTranslate.
getX() - fCropLeft,
2552 aTranslate.
getY() - fCropTop);
2556 aTranslate.
getX(), aTranslate.
getY(),
2559 aTargetTranslate.getX(), aTargetTranslate.getY(),
2560 aTargetTranslate.getX() + aTargetScale.getX(), aTargetTranslate.getY() + aTargetScale.getY());
2562 if(aCropped.isEmpty())
2568 if(aCurrentForCompare.equal(aCropped))
2582 aCropped.transform(aBackToUnit);
2609 aCroppedTransform.
scale(
2610 aCropped.getWidth(),
2611 aCropped.getHeight());
2614 aCropped.getMinY());
2628 aGraphicOutlinePolygon,
2633 aCombination[0] = aGraphic;
2634 aCombination[1] = aGraphicOutline;
2663 pNew->setHittable(
false);
std::unique_ptr< SdrHdl > RemoveHdl(size_t nNum)
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)
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
OUString SvxResId(const char *pId)
const BorderLinePrimitive2D *pCandidateB assert(pCandidateA)
const Color & GetColor() const
bool OutputToWindow() const
constexpr::Color COL_CYAN(0x00, 0x80, 0x80)
IMPL_LINK_NOARG(SdrHdlGradient, ColorChangeHdl, SdrHdlColor *, void)
SdrHdlColor(const Point &rRef, Color aCol, const Size &rSize, bool bLuminance)
Degree100 NormAngle36000(Degree100 deg100)
Normalize angle to -180.00..179.99.
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
void intersect(const B2DRange &rRange)
float GetDPIScaleFactor() const
void transform(const basegfx::B2DHomMatrix &rMatrix)
virtual void CreateB2dIAObject() override
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
css::uno::Reference< css::graphic::XPrimitive2D > Primitive2DReference
const ::std::vector< Color > ImpSvNumberformatScan::StandardColor COL_LIGHTCYAN
virtual ~SdrHdlLine() override
constexpr TypedWhichId< XFillFloatTransparenceItem > XATTR_FILLFLOATTRANSPARENCE(XATTR_FILL_FIRST+11)
std::unique_ptr< XPolygon > pEdgeTrack
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
basegfx::BColor getBColor() const
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
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)
Color getHilightColor() const
virtual ~SdrHdlGradient() override
sal_uInt32 PageWindowCount() const