1 diff --git sc/source/ui/inc/gridwin.hxx sc/source/ui/inc/gridwin.hxx
2 index 643ae95..2946c39 100644
3 --- sc/source/ui/inc/gridwin.hxx
4 +++ sc/source/ui/inc/gridwin.hxx
5 @@ -144,6 +144,7 @@ private:
7 ::sdr::overlay::OverlayObjectList* mpOOCursors;
8 ::sdr::overlay::OverlayObjectList* mpOOSelection;
9 + ::sdr::overlay::OverlayObjectList* mpOOSelectionBorder;
10 ::sdr::overlay::OverlayObjectList* mpOOAutoFill;
11 ::sdr::overlay::OverlayObjectList* mpOODragRect;
12 ::sdr::overlay::OverlayObjectList* mpOOHeader;
13 @@ -314,6 +315,15 @@ private:
14 void SelectForContextMenu( const Point& rPosPixel );
16 void GetSelectionRects( ::std::vector< Rectangle >& rPixelRects );
17 + struct RectangleConverter {
18 + virtual Rectangle Convert (const Rectangle& r) const = 0;
20 + void ConvertPixelRectsToRangeVector(
21 + const ::std::vector< Rectangle >& rPixelRects,
22 + sdr::overlay::OverlayObjectCell::RangeVector* pRanges,
23 + const MapMode& rDrawMode,
24 + const RectangleConverter *pConverter = NULL);
25 + void UpdateCopySourceOverlay(const MapMode& rDrawMode);
29 diff --git sc/source/ui/view/gridwin.cxx sc/source/ui/view/gridwin.cxx
30 index 5bcc6c8..3d7f3d4 100644
31 --- sc/source/ui/view/gridwin.cxx
32 +++ sc/source/ui/view/gridwin.cxx
36 #include "tabprotection.hxx"
37 +#include "clipparam.hxx"
40 #include <vcl/salbtype.hxx> // FRound
41 @@ -396,6 +397,7 @@ ScGridWindow::ScGridWindow( Window* pParent, ScViewData* pData, ScSplitPos eWhic
42 DragSourceHelper( this ),
44 mpOOSelection( NULL ),
45 + mpOOSelectionBorder( NULL ),
49 @@ -5159,6 +5161,87 @@ void ScGridWindow::UpdateAllOverlays()
50 void ScGridWindow::DeleteCursorOverlay()
52 DELETEZ( mpOOCursors );
53 + DELETEZ( mpOOSelectionBorder );
56 +void ScGridWindow::ConvertPixelRectsToRangeVector( const ::std::vector< Rectangle >& rPixelRects,
57 + sdr::overlay::OverlayObjectCell::RangeVector* pRanges,
58 + const MapMode& rDrawMode,
59 + const ScGridWindow::RectangleConverter* pConverter )
61 + std::vector<Rectangle>::const_iterator aPixelEnd( rPixelRects.end() );
62 + for ( std::vector<Rectangle>::const_iterator aPixelIter( rPixelRects.begin() );
63 + aPixelIter != aPixelEnd; ++aPixelIter )
65 + Rectangle aLogic( PixelToLogic(
66 + (pConverter == NULL ? *aPixelIter : pConverter->Convert (*aPixelIter)),
69 + const basegfx::B2DPoint aTopLeft(aLogic.Left(), aLogic.Top());
70 + const basegfx::B2DPoint aBottomRight(aLogic.Right(), aLogic.Bottom());
71 + const basegfx::B2DRange a2DRange(aTopLeft, aBottomRight);
73 + pRanges->push_back( a2DRange );
77 +void ScGridWindow::UpdateCopySourceOverlay( const MapMode& rDrawMode )
79 + if (!pViewData->ShowPasteSource())
81 + ::sdr::overlay::OverlayManager* pOverlayManager = getOverlayManager();
82 + if (!pOverlayManager)
84 + ScTransferObj* pTransObj = ScTransferObj::GetOwnClipboard( pViewData->GetActiveWin() );
87 + ScDocument* pClipDoc = pTransObj->GetDocument();
91 + SCTAB nCurTab = pViewData->GetCurPos().Tab();
93 + ScClipParam& rClipParam = pClipDoc->GetClipParam();
94 + mpOOSelectionBorder = new ::sdr::overlay::OverlayObjectList;
95 + for (ScRange* p = rClipParam.maRanges.First(); p; p = rClipParam.maRanges.Next())
97 + if (p->aStart.Tab() != nCurTab)
100 + SCCOL nClipStartX = p->aStart.Col();
101 + SCROW nClipStartY = p->aStart.Row();
102 + SCCOL nClipEndX = p->aEnd.Col();
103 + SCROW nClipEndY = p->aEnd.Row();
105 + Point aClipStartScrPos = pViewData->GetScrPos( nClipStartX, nClipStartY, eWhich );
106 + Point aClipEndScrPos = pViewData->GetScrPos( nClipEndX + 1, nClipEndY + 1, eWhich );
108 + long nSizeXPix = aClipEndScrPos.X() - aClipStartScrPos.X();
109 + long nSizeYPix = aClipEndScrPos.Y() - aClipStartScrPos.Y();
111 + aClipStartScrPos.X() -= 2;
112 + aClipStartScrPos.Y() -= 2;
114 + Rectangle aRect( aClipStartScrPos, Size( nSizeXPix + 3, nSizeYPix + 3 ) );
116 + std::vector<Rectangle> aPixelRects;
118 + aPixelRects.push_back(Rectangle( aRect.Left(), aRect.Top(), aRect.Left()+2, aRect.Bottom() ));
119 + aPixelRects.push_back(Rectangle( aRect.Right()-2, aRect.Top(), aRect.Right(), aRect.Bottom() ));
120 + aPixelRects.push_back(Rectangle( aRect.Left()+3, aRect.Top(), aRect.Right()-3, aRect.Top()+2 ));
121 + aPixelRects.push_back(Rectangle( aRect.Left()+3, aRect.Bottom()-2, aRect.Right()-3, aRect.Bottom() ));
123 + sdr::overlay::OverlayObjectCell::RangeVector aRanges;
124 + ConvertPixelRectsToRangeVector( aPixelRects, &aRanges, rDrawMode );
126 + ScOverlayType eType = SC_OVERLAY_BORDER_TRANSPARENT;
128 + Color aHighlight = GetSettings().GetStyleSettings().GetHighlightColor();
129 + sdr::overlay::OverlayObjectCell* pOverlay = new sdr::overlay::OverlayObjectCell( eType, aHighlight, aRanges );
131 + pOverlayManager->add(*pOverlay);
132 + mpOOSelectionBorder->append(*pOverlay);
136 void ScGridWindow::UpdateCursorOverlay()
137 @@ -5173,6 +5256,8 @@ void ScGridWindow::UpdateCursorOverlay()
139 DeleteCursorOverlay();
141 + UpdateCopySourceOverlay( aDrawMode );
143 std::vector<Rectangle> aPixelRects;
146 @@ -5257,19 +5342,7 @@ void ScGridWindow::UpdateCursorOverlay()
147 if ( aPixelRects.size() )
149 sdr::overlay::OverlayObjectCell::RangeVector aRanges;
151 - std::vector<Rectangle>::const_iterator aPixelEnd( aPixelRects.end() );
152 - for ( std::vector<Rectangle>::const_iterator aPixelIter( aPixelRects.begin() );
153 - aPixelIter != aPixelEnd; ++aPixelIter )
155 - Rectangle aLogic( PixelToLogic( *aPixelIter, aDrawMode ) );
157 - const basegfx::B2DPoint aTopLeft(aLogic.Left(), aLogic.Top());
158 - const basegfx::B2DPoint aBottomRight(aLogic.Right(), aLogic.Bottom());
159 - const basegfx::B2DRange a2DRange(aTopLeft, aBottomRight);
161 - aRanges.push_back( a2DRange );
163 + ConvertPixelRectsToRangeVector( aPixelRects, &aRanges, aDrawMode );
165 // #i70788# get the OverlayManager safely
166 ::sdr::overlay::OverlayManager* pOverlayManager = getOverlayManager();
167 @@ -5311,41 +5384,43 @@ void ScGridWindow::UpdateSelectionOverlay()
169 if ( aPixelRects.size() && pViewData->IsActive() )
171 - SCTAB nTab = pViewData->GetTabNo();
172 - BOOL bLayoutRTL = pViewData->GetDocument()->IsLayoutRTL( nTab );
173 - BOOL bOld = pViewData->GetView()->IsOldSelection();
175 - sdr::overlay::OverlayObjectCell::RangeVector aRanges;
176 + struct SelectionConverter : RectangleConverter {
181 + SelectionConverter (ScViewData* pViewData)
182 + : nTab (pViewData->GetTabNo())
183 + , bLayoutRTL (pViewData->GetDocument()->IsLayoutRTL( nTab ))
184 + , bOld (pViewData->GetView()->IsOldSelection())
188 - std::vector<Rectangle>::const_iterator aPixelEnd( aPixelRects.end() );
189 - for ( std::vector<Rectangle>::const_iterator aPixelIter( aPixelRects.begin() );
190 - aPixelIter != aPixelEnd; ++aPixelIter )
192 - Rectangle aPixel( *aPixelIter );
194 + Rectangle Convert (const Rectangle& rRect) const
198 // for transparent selection, add a pixel so the border is on the grid on all edges
199 + Rectangle aPixel (rRect);
207 - Rectangle aLogic( PixelToLogic( aPixel, aDrawMode ) );
209 - const basegfx::B2DPoint aTopLeft(aLogic.Left(), aLogic.Top());
210 - const basegfx::B2DPoint aBottomRight(aLogic.Right(), aLogic.Bottom());
211 - const basegfx::B2DRange a2DRange(aTopLeft, aBottomRight);
213 + SelectionConverter aConverter (pViewData);
215 - aRanges.push_back( a2DRange );
217 + sdr::overlay::OverlayObjectCell::RangeVector aRanges;
218 + ConvertPixelRectsToRangeVector( aPixelRects, &aRanges, aDrawMode, &aConverter );
220 // #i70788# get the OverlayManager safely
221 ::sdr::overlay::OverlayManager* pOverlayManager = getOverlayManager();
225 - ScOverlayType eType = bOld ? SC_OVERLAY_INVERT : SC_OVERLAY_BORDER_TRANSPARENT;
226 + ScOverlayType eType = aConverter.bOld ? SC_OVERLAY_INVERT : SC_OVERLAY_BORDER_TRANSPARENT;
227 Color aHighlight( GetSettings().GetStyleSettings().GetHighlightColor() );
228 sdr::overlay::OverlayObjectCell* pOverlay =
229 new sdr::overlay::OverlayObjectCell( eType, aHighlight, aRanges );
230 @@ -5540,19 +5615,7 @@ void ScGridWindow::UpdateDragRectOverlay()
233 sdr::overlay::OverlayObjectCell::RangeVector aRanges;
235 - std::vector<Rectangle>::const_iterator aPixelEnd( aPixelRects.end() );
236 - for ( std::vector<Rectangle>::const_iterator aPixelIter( aPixelRects.begin() );
237 - aPixelIter != aPixelEnd; ++aPixelIter )
239 - Rectangle aLogic( PixelToLogic( *aPixelIter, aDrawMode ) );
241 - const basegfx::B2DPoint aTopLeft(aLogic.Left(), aLogic.Top());
242 - const basegfx::B2DPoint aBottomRight(aLogic.Right(), aLogic.Bottom());
243 - const basegfx::B2DRange a2DRange(aTopLeft, aBottomRight);
245 - aRanges.push_back( a2DRange );
247 + ConvertPixelRectsToRangeVector( aPixelRects, &aRanges, aDrawMode );
249 // #i70788# get the OverlayManager safely
250 ::sdr::overlay::OverlayManager* pOverlayManager = getOverlayManager();