diff options
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/ui/Accessibility/AccessibleDocument.cxx | 25 | ||||
-rw-r--r-- | sc/source/ui/drawfunc/drawsh.cxx | 2 | ||||
-rw-r--r-- | sc/source/ui/drawfunc/fudraw.cxx | 6 | ||||
-rw-r--r-- | sc/source/ui/drawfunc/fupoor.cxx | 5 | ||||
-rw-r--r-- | sc/source/ui/drawfunc/fusel.cxx | 6 | ||||
-rw-r--r-- | sc/source/ui/drawfunc/fusel2.cxx | 3 | ||||
-rw-r--r-- | sc/source/ui/drawfunc/futext.cxx | 4 | ||||
-rw-r--r-- | sc/source/ui/inc/gridwin.hxx | 9 | ||||
-rw-r--r-- | sc/source/ui/unoobj/viewuno.cxx | 5 | ||||
-rw-r--r-- | sc/source/ui/view/gridwin.cxx | 158 | ||||
-rw-r--r-- | sc/source/ui/view/gridwin5.cxx | 4 | ||||
-rw-r--r-- | sc/util/makefile.mk | 2 |
12 files changed, 106 insertions, 123 deletions
diff --git a/sc/source/ui/Accessibility/AccessibleDocument.cxx b/sc/source/ui/Accessibility/AccessibleDocument.cxx index 616071be52d4..3ed9b4062a9d 100644 --- a/sc/source/ui/Accessibility/AccessibleDocument.cxx +++ b/sc/source/ui/Accessibility/AccessibleDocument.cxx @@ -563,31 +563,6 @@ uno::Reference< XAccessible > ScChildrenShapes::GetAt(const awt::Point& rPoint) --i; } -/* Window* pWindow = mpViewShell->GetWindowByPos(meSplitPos); - if (pWindow) - { - Point aPnt( rPoint.X, rPoint.Y ); - aPnt = pWindow->PixelToLogic( aPnt ); - SdrPage* pDrawPage = GetDrawPage(); - if (pDrawPage) - { - SdrObject * pObj = GetDrawPage()->CheckHit(aPnt, 1, NULL, false); - if (pObj) - { - uno::Reference<drawing::XShape> xShape (pObj->getUnoShape(), uno::UNO_QUERY); - SortedShapes::iterator aItr;; - if (FindShape(xShape, aItr)) - { - if ((*aItr) && (*aItr)->pAccShape) - xAccessible = (*aItr)->pAccShape; - else - xAccessible = Get(aItr - maZOrderedShapes.begin()); - } - else - DBG_ERRORFILE("a shape is not in the list"); - } - } - }*/ } return xAccessible; } diff --git a/sc/source/ui/drawfunc/drawsh.cxx b/sc/source/ui/drawfunc/drawsh.cxx index 8b86e0d886ef..63f958763479 100644 --- a/sc/source/ui/drawfunc/drawsh.cxx +++ b/sc/source/ui/drawfunc/drawsh.cxx @@ -230,7 +230,7 @@ void ScDrawShell::ExecDrawAttr( SfxRequest& rReq ) { SdrPageView* pPV = 0; SdrObject* pHit = 0; - if ( pView->PickObj( pWin->PixelToLogic( pViewData->GetMousePosPixel() ), pHit, pPV, SDRSEARCH_DEEP ) ) + if ( pView->PickObj( pWin->PixelToLogic( pViewData->GetMousePosPixel() ), pView->getHitTolLog(), pHit, pPV, SDRSEARCH_DEEP ) ) pObj = pHit; } diff --git a/sc/source/ui/drawfunc/fudraw.cxx b/sc/source/ui/drawfunc/fudraw.cxx index 2dccd6edbfe0..fadb8270b6a6 100644 --- a/sc/source/ui/drawfunc/fudraw.cxx +++ b/sc/source/ui/drawfunc/fudraw.cxx @@ -795,12 +795,12 @@ void FuDraw::ForcePointer(const MouseEvent* pMEvt) SdrPageView* pPV; ScMacroInfo* pInfo = 0; - if ( pView->PickObj(aPnt, pObj, pPV, SDRSEARCH_ALSOONMASTER) ) + if ( pView->PickObj(aPnt, pView->getHitTolLog(), pObj, pPV, SDRSEARCH_ALSOONMASTER) ) { if ( pObj->IsGroupObject() ) { SdrObject* pHit = 0; - if ( pView->PickObj(aMDPos, pHit, pPV, SDRSEARCH_DEEP ) ) + if ( pView->PickObj(aMDPos, pView->getHitTolLog(), pHit, pPV, SDRSEARCH_DEEP ) ) pObj = pHit; } pInfo = ScDrawLayer::GetMacroInfo( pObj ); @@ -825,7 +825,7 @@ void FuDraw::ForcePointer(const MouseEvent* pMEvt) // kann mit ALT unterdrueckt werden pWindow->SetPointer( Pointer( POINTER_REFHAND ) ); // Text-URL / ImageMap } - else if ( !bAlt && pView->PickObj(aPnt, pObj, pPV, SDRSEARCH_PICKMACRO) ) + else if ( !bAlt && pView->PickObj(aPnt, pView->getHitTolLog(), pObj, pPV, SDRSEARCH_PICKMACRO) ) { // kann mit ALT unterdrueckt werden SdrObjMacroHitRec aHitRec; //! muss da noch irgendwas gesetzt werden ???? diff --git a/sc/source/ui/drawfunc/fupoor.cxx b/sc/source/ui/drawfunc/fupoor.cxx index c26d3fdcb5fc..23aefe17c71b 100644 --- a/sc/source/ui/drawfunc/fupoor.cxx +++ b/sc/source/ui/drawfunc/fupoor.cxx @@ -42,6 +42,7 @@ #include "detfunc.hxx" #include "document.hxx" #include <vcl/svapp.hxx> +#include <svx/sdrhittesthelper.hxx> /************************************************************************* |* @@ -333,8 +334,10 @@ BOOL FuPoor::IsDetectiveHit( const Point& rLogicPos ) { USHORT nHitLog = (USHORT) pWindow->PixelToLogic( Size(pView->GetHitTolerancePixel(),0)).Width(); - if ( pObject->IsHit( rLogicPos, nHitLog ) ) + if(SdrObjectPrimitiveHit(*pObject, rLogicPos, nHitLog, *pPV, 0, false)) + { bFound = TRUE; + } } pObject = aIter.Next(); diff --git a/sc/source/ui/drawfunc/fusel.cxx b/sc/source/ui/drawfunc/fusel.cxx index 02fc2e38b0f6..79c466f9f2c3 100644 --- a/sc/source/ui/drawfunc/fusel.cxx +++ b/sc/source/ui/drawfunc/fusel.cxx @@ -171,7 +171,7 @@ BOOL __EXPORT FuSelection::MouseButtonDown(const MouseEvent& rMEvt) else { BOOL bAlt = rMEvt.IsMod2(); - if ( !bAlt && pView->PickObj(aMDPos, pObj, pPV, SDRSEARCH_PICKMACRO) ) + if ( !bAlt && pView->PickObj(aMDPos, pView->getHitTolLog(), pObj, pPV, SDRSEARCH_PICKMACRO) ) { pView->BegMacroObj(aMDPos, pObj, pPV, pWindow); bReturn = TRUE; @@ -179,7 +179,7 @@ BOOL __EXPORT FuSelection::MouseButtonDown(const MouseEvent& rMEvt) else { String sURL, sTarget; - if ( !bAlt && pView->PickObj(aMDPos, pObj, pPV, SDRSEARCH_ALSOONMASTER)) + if ( !bAlt && pView->PickObj(aMDPos, pView->getHitTolLog(), pObj, pPV, SDRSEARCH_ALSOONMASTER)) { // Support for imported Excel docs // Excel is of course not consistent and allows @@ -200,7 +200,7 @@ BOOL __EXPORT FuSelection::MouseButtonDown(const MouseEvent& rMEvt) if ( pObj->IsGroupObject() ) { SdrObject* pHit = NULL; - if ( pView->PickObj(aMDPos, pHit, pPV, SDRSEARCH_DEEP ) ) + if ( pView->PickObj(aMDPos, pView->getHitTolLog(), pHit, pPV, SDRSEARCH_DEEP ) ) pObj = pHit; } diff --git a/sc/source/ui/drawfunc/fusel2.cxx b/sc/source/ui/drawfunc/fusel2.cxx index aa518ee42a81..7c096fd51d71 100644 --- a/sc/source/ui/drawfunc/fusel2.cxx +++ b/sc/source/ui/drawfunc/fusel2.cxx @@ -53,6 +53,7 @@ #include "drwlayer.hxx" #include "docsh.hxx" #include "drawview.hxx" +#include <svx/sdrhittesthelper.hxx> // ----------------------------------------------------------------------- @@ -79,7 +80,7 @@ BOOL FuSelection::TestDetective( SdrPageView* pPV, const Point& rPos ) { USHORT nHitLog = (USHORT) pWindow->PixelToLogic( Size(pView->GetHitTolerancePixel(),0)).Width(); - if ( pObject->IsHit( rPos, nHitLog ) ) + if (SdrObjectPrimitiveHit(*pObject, rPos, nHitLog, *pPV, 0, false)) { ScViewData* pViewData = pViewShell->GetViewData(); ScSplitPos ePos = pViewShell->FindWindow( pWindow ); diff --git a/sc/source/ui/drawfunc/futext.cxx b/sc/source/ui/drawfunc/futext.cxx index 302d1c825a2a..ebcb2ad30802 100644 --- a/sc/source/ui/drawfunc/futext.cxx +++ b/sc/source/ui/drawfunc/futext.cxx @@ -193,7 +193,7 @@ BOOL __EXPORT FuText::MouseButtonDown(const MouseEvent& rMEvt) { if (pHdl == NULL && // pView->TakeTextEditObject(aMDPos, pObj, pPV) ) - pView->PickObj(aMDPos, pObj, pPV, SDRSEARCH_PICKTEXTEDIT) ) + pView->PickObj(aMDPos, pView->getHitTolLog(), pObj, pPV, SDRSEARCH_PICKTEXTEDIT) ) { SdrOutliner* pO = MakeOutliner(); lcl_UpdateHyphenator( *pO, pObj ); @@ -250,7 +250,7 @@ BOOL __EXPORT FuText::MouseButtonDown(const MouseEvent& rMEvt) BOOL bMacro = FALSE; // if (bMacro && pView->TakeMacroObject(aMDPos,pObj,pPV)) - if (bMacro && pView->PickObj(aMDPos, pObj, pPV, SDRSEARCH_PICKMACRO) ) + if (bMacro && pView->PickObj(aMDPos, pView->getHitTolLog(), pObj, pPV, SDRSEARCH_PICKMACRO) ) { pView->BegMacroObj(aMDPos,pObj,pPV,pWindow); diff --git a/sc/source/ui/inc/gridwin.hxx b/sc/source/ui/inc/gridwin.hxx index 9b31289d13d0..844d88055578 100644 --- a/sc/source/ui/inc/gridwin.hxx +++ b/sc/source/ui/inc/gridwin.hxx @@ -116,18 +116,19 @@ namespace sdr public: typedef ::std::vector< basegfx::B2DRange > RangeVector; + protected: + basegfx::B2DPolyPolygon impGetOverlayPolyPolygon() const; + private: ScOverlayType mePaintType; RangeVector maRectangles; - virtual void drawGeometry(OutputDevice& rOutputDevice); - virtual void createBaseRange(OutputDevice& rOutputDevice); + // geometry creation for OverlayObject + virtual drawinglayer::primitive2d::Primitive2DSequence createOverlayObjectPrimitive2DSequence(); public: OverlayObjectCell( ScOverlayType eType, const Color& rColor, const RangeVector& rRects); virtual ~OverlayObjectCell(); - - virtual void transform(const basegfx::B2DHomMatrix& rMatrix); }; } // end of namespace overlay diff --git a/sc/source/ui/unoobj/viewuno.cxx b/sc/source/ui/unoobj/viewuno.cxx index fa27b94a9956..c1af5ac9bb99 100644 --- a/sc/source/ui/unoobj/viewuno.cxx +++ b/sc/source/ui/unoobj/viewuno.cxx @@ -71,6 +71,7 @@ #include "gridwin.hxx" #include <com/sun/star/view/DocumentZoomType.hpp> #include "AccessibilityHints.hxx" +#include <svx/sdrhittesthelper.hxx> using namespace com::sun::star; @@ -1169,7 +1170,7 @@ uno::Reference< uno::XInterface > ScTabViewObj::GetClickedObject(const Point& rP SdrView* pDrawView = GetViewShell()->GetSdrView(); - if (pDrawPage && pDrawView) + if (pDrawPage && pDrawView && pDrawView->GetSdrPageView()) { Window* pActiveWin = pData->GetActiveWin(); Point aPos = pActiveWin->PixelToLogic(rPoint); @@ -1183,7 +1184,7 @@ uno::Reference< uno::XInterface > ScTabViewObj::GetClickedObject(const Point& rP while (i < nCount && !bFound) { SdrObject* pObj = pDrawPage->GetObj(i); - if (pObj && pObj->IsHit(aPos, nHitLog)) + if (pObj && SdrObjectPrimitiveHit(*pObj, aPos, nHitLog, *pDrawView->GetSdrPageView(), 0, false)) { xTarget.set(pObj->getUnoShape(), uno::UNO_QUERY); bFound = sal_True; diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx index 918341294e9d..9521f05d4f4e 100644 --- a/sc/source/ui/view/gridwin.cxx +++ b/sc/source/ui/view/gridwin.cxx @@ -129,6 +129,11 @@ #include <svx/sdr/overlay/overlaymanager.hxx> #include <vcl/svapp.hxx> +#include <drawinglayer/primitive2d/invertprimitive2d.hxx> +#include <drawinglayer/primitive2d/polypolygonprimitive2d.hxx> +#include <drawinglayer/primitive2d/unifiedalphaprimitive2d.hxx> +#include <basegfx/polygon/b2dpolygontools.hxx> + using namespace com::sun::star; using ::com::sun::star::uno::Sequence; using ::com::sun::star::uno::Any; @@ -5689,112 +5694,107 @@ namespace sdr mePaintType( eType ), maRectangles( rRects ) { + // no AA for selection overlays + allowAntiAliase(false); } OverlayObjectCell::~OverlayObjectCell() { } - void OverlayObjectCell::drawGeometry(OutputDevice& rOutputDevice) + drawinglayer::primitive2d::Primitive2DSequence OverlayObjectCell::createOverlayObjectPrimitive2DSequence() { - // safe original AA and switch off for selection - const sal_uInt16 nOriginalAA(rOutputDevice.GetAntialiasing()); - rOutputDevice.SetAntialiasing(0); - - // set colors - rOutputDevice.SetLineColor(); - rOutputDevice.SetFillColor(getBaseColor()); + drawinglayer::primitive2d::Primitive2DSequence aRetval; + const basegfx::BColor aRGBColor(getBaseColor().getBColor()); + const sal_uInt32 nCount(maRectangles.size()); - if ( mePaintType == SC_OVERLAY_BORDER_TRANSPARENT ) + if(nCount) { - // to draw the border, all rectangles have to be collected into a PolyPolygon - - PolyPolygon aPolyPoly; - sal_uInt32 nRectCount = maRectangles.size(); - for(sal_uInt32 nRect=0; nRect < nRectCount; ++nRect) + // create fill primities for all rectangles + // These ranges are meant as rectangles, so it is not sufficient to replace them + // using the derived polygon. That would leave out the bottom and right lines + // in a discrete width/height due to polygon painting conventions of leaving off those. + // To solve, it is either possible to create a view-dependent rectangle primitive + // handling this internally or to additionally create a hairline primitive to + // cover these areas (which i will do here) + const bool bIsTransparent(SC_OVERLAY_BORDER_TRANSPARENT == mePaintType); + aRetval.realloc(nCount * 2); + + for(sal_uInt32 a(0);a < nCount; a++) { - const basegfx::B2DRange& rRange(maRectangles[nRect]); - Rectangle aRectangle(FRound(rRange.getMinX()), FRound(rRange.getMinY()), FRound(rRange.getMaxX()), FRound(rRange.getMaxY())); - if ( nRectCount == 1 || nRect+1 < nRectCount ) - { - // simply add for all except the last rect - aPolyPoly.Insert( Polygon( aRectangle ) ); - } - else - { - PolyPolygon aTemp( aPolyPoly ); - aTemp.GetUnion( PolyPolygon( Polygon( aRectangle ) ), aPolyPoly ); - } - } - - rOutputDevice.DrawTransparent(aPolyPoly, 75); - - rOutputDevice.SetLineColor(getBaseColor()); - rOutputDevice.SetFillColor(); - - rOutputDevice.DrawPolyPolygon(aPolyPoly); - } - else - { - if ( mePaintType == SC_OVERLAY_INVERT ) - { - rOutputDevice.Push(); - rOutputDevice.SetRasterOp( ROP_XOR ); - rOutputDevice.SetFillColor( COL_WHITE ); + const basegfx::B2DRange& rRange(maRectangles[a]); + const basegfx::B2DPolygon aPolygon(basegfx::tools::createPolygonFromRect(rRange)); + + aRetval[a * 2] = drawinglayer::primitive2d::Primitive2DReference( + new drawinglayer::primitive2d::PolyPolygonColorPrimitive2D( + basegfx::B2DPolyPolygon(aPolygon), + aRGBColor)); + aRetval[(a * 2) + 1] = drawinglayer::primitive2d::Primitive2DReference( + new drawinglayer::primitive2d::PolyPolygonHairlinePrimitive2D( + basegfx::B2DPolyPolygon(aPolygon), + aRGBColor)); } - for(sal_uInt32 a(0L);a < maRectangles.size(); a++) + if(SC_OVERLAY_INVERT == mePaintType) { - const basegfx::B2DRange& rRange(maRectangles[a]); - const Rectangle aRectangle(FRound(rRange.getMinX()), FRound(rRange.getMinY()), FRound(rRange.getMaxX()), FRound(rRange.getMaxY())); + // embed all in invert primitive + const drawinglayer::primitive2d::Primitive2DReference aInvert( + new drawinglayer::primitive2d::InvertPrimitive2D( + aRetval)); - switch(mePaintType) - { - case SC_OVERLAY_INVERT : - { - rOutputDevice.DrawRect( aRectangle ); - break; - } - case SC_OVERLAY_SOLID : - { - rOutputDevice.DrawRect(aRectangle); - break; - } - default: - { - // SC_OVERLAY_BORDER_TRANSPARENT is handled separately - } - } + aRetval = drawinglayer::primitive2d::Primitive2DSequence(&aInvert, 1); } - - if ( mePaintType == SC_OVERLAY_INVERT ) + else if(bIsTransparent) { - rOutputDevice.Pop(); + // embed all rectangles in 75% transparent paint + const drawinglayer::primitive2d::Primitive2DReference aUnifiedAlpha( + new drawinglayer::primitive2d::UnifiedAlphaPrimitive2D( + aRetval, + 0.75)); + + // prepare merged PolyPoygon selection outline + const basegfx::B2DPolyPolygon aPolyPolygon(impGetOverlayPolyPolygon()); + const drawinglayer::primitive2d::Primitive2DReference aSelectionOutline( + new drawinglayer::primitive2d::PolyPolygonHairlinePrimitive2D( + aPolyPolygon, + aRGBColor)); + + // add both to result + aRetval.realloc(2); + aRetval[0] = aUnifiedAlpha; + aRetval[1] = aSelectionOutline; } } - // restore original AA - rOutputDevice.SetAntialiasing(nOriginalAA); + return aRetval; } - void OverlayObjectCell::createBaseRange(OutputDevice& /* rOutputDevice */) + basegfx::B2DPolyPolygon OverlayObjectCell::impGetOverlayPolyPolygon() const { - maBaseRange.reset(); + PolyPolygon aPolyPoly; + const sal_uInt32 nRectCount(maRectangles.size()); - for(sal_uInt32 a(0L); a < maRectangles.size(); a++) + for(sal_uInt32 nRect(0); nRect < nRectCount; ++nRect) { - maBaseRange.expand(maRectangles[a]); - } - } + const basegfx::B2DRange& rRange(maRectangles[nRect]); + const Rectangle aRectangle( + FRound(rRange.getMinX()), FRound(rRange.getMinY()), + FRound(rRange.getMaxX()), FRound(rRange.getMaxY())); - void OverlayObjectCell::transform(const basegfx::B2DHomMatrix& rMatrix) - { - for(sal_uInt32 a(0L); a < maRectangles.size(); a++) - { - maRectangles[a].transform(rMatrix); + if ( nRectCount == 1 || nRect+1 < nRectCount ) + { + // simply add for all except the last rect + aPolyPoly.Insert( Polygon( aRectangle ) ); + } + else + { + PolyPolygon aTemp( aPolyPoly ); + aTemp.GetUnion( PolyPolygon( Polygon( aRectangle ) ), aPolyPoly ); + } } - } + return aPolyPoly.getB2DPolyPolygon(); + } } // end of namespace overlay } // end of namespace sdr diff --git a/sc/source/ui/view/gridwin5.cxx b/sc/source/ui/view/gridwin5.cxx index 8739ee2b0b91..f3d5b2781607 100644 --- a/sc/source/ui/view/gridwin5.cxx +++ b/sc/source/ui/view/gridwin5.cxx @@ -338,12 +338,12 @@ void ScGridWindow::RequestHelp(const HelpEvent& rHEvt) SdrObject* pObj = 0; SdrPageView* pPV = 0; Point aMDPos = PixelToLogic( aPosPixel ); - if ( pDrView->PickObj(aMDPos, pObj, pPV, SDRSEARCH_ALSOONMASTER) ) + if ( pDrView->PickObj(aMDPos, pDrView->getHitTolLog(), pObj, pPV, SDRSEARCH_ALSOONMASTER) ) { if ( pObj->IsGroupObject() ) { SdrObject* pHit = 0; - if ( pDrView->PickObj(aMDPos, pHit, pPV, SDRSEARCH_DEEP ) ) + if ( pDrView->PickObj(aMDPos, pDrView->getHitTolLog(), pHit, pPV, SDRSEARCH_DEEP ) ) pObj = pHit; } #ifdef ISSUE66550_HLINK_FOR_SHAPES diff --git a/sc/util/makefile.mk b/sc/util/makefile.mk index fe2bf6bc636d..3fc0712cd996 100644 --- a/sc/util/makefile.mk +++ b/sc/util/makefile.mk @@ -85,6 +85,7 @@ SHL1STDLIBS= \ $(SVXLIB) \ $(GOODIESLIB) \ $(BASEGFXLIB) \ + $(DRAWINGLAYERLIB) \ $(VCLLIB) \ $(CPPULIB) \ $(CPPUHELPERLIB) \ @@ -189,6 +190,7 @@ SHL6STDLIBS= \ $(SVLLIB) \ $(SVXLIB) \ $(BASEGFXLIB) \ + $(DRAWINGLAYERLIB) \ $(VCLLIB) \ $(CPPULIB) \ $(CPPUHELPERLIB) \ |