update ooo310-m15
[ooovba.git] / applied_patches / 0167-sc-copy-source-border.diff
blobe31772914ece5e59836cda33ab7b01c9c7eab1e7
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:
6 // #114409#
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;
19 + };
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);
27 protected:
28 using Window::Resize;
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
33 @@ -120,6 +120,7 @@
34 #include "attrib.hxx"
35 #include "cellsh.hxx"
36 #include "tabprotection.hxx"
37 +#include "clipparam.hxx"
39 // #114409#
40 #include <vcl/salbtype.hxx> // FRound
41 @@ -396,6 +397,7 @@ ScGridWindow::ScGridWindow( Window* pParent, ScViewData* pData, ScSplitPos eWhic
42 DragSourceHelper( this ),
43 mpOOCursors( NULL ),
44 mpOOSelection( NULL ),
45 + mpOOSelectionBorder( NULL ),
46 mpOOAutoFill( NULL ),
47 mpOODragRect( NULL ),
48 mpOOHeader( 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 )
64 + {
65 + Rectangle aLogic( PixelToLogic(
66 + (pConverter == NULL ? *aPixelIter : pConverter->Convert (*aPixelIter)),
67 + rDrawMode ) );
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 );
74 + }
77 +void ScGridWindow::UpdateCopySourceOverlay( const MapMode& rDrawMode )
79 + if (!pViewData->ShowPasteSource())
80 + return;
81 + ::sdr::overlay::OverlayManager* pOverlayManager = getOverlayManager();
82 + if (!pOverlayManager)
83 + return;
84 + ScTransferObj* pTransObj = ScTransferObj::GetOwnClipboard( pViewData->GetActiveWin() );
85 + if (!pTransObj)
86 + return;
87 + ScDocument* pClipDoc = pTransObj->GetDocument();
88 + if (!pClipDoc)
89 + return;
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())
96 + {
97 + if (p->aStart.Tab() != nCurTab)
98 + continue;
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 {
177 + SCTAB nTab;
178 + BOOL bLayoutRTL;
179 + BOOL bOld;
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 );
193 - if ( !bOld )
194 + Rectangle Convert (const Rectangle& rRect) const
196 + if ( bOld )
197 + return rRect;
198 // for transparent selection, add a pixel so the border is on the grid on all edges
199 + Rectangle aPixel (rRect);
200 if ( bLayoutRTL )
201 aPixel.Right() += 1;
202 else
203 aPixel.Left() -= 1;
204 aPixel.Top() -= 1;
205 + return aPixel;
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);
212 + };
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();
223 if(pOverlayManager)
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();