View | Details | Raw Unified | Return to issue 28535
Collapse All | Expand All

(-)sc/source/ui/inc/gridwin.hxx (-1 / +2 lines)
Lines 356-362 private: Link Here
356
                        sdr::overlay::OverlayObjectCell::RangeVector* pRanges,
356
                        sdr::overlay::OverlayObjectCell::RangeVector* pRanges,
357
                        const MapMode& rDrawMode,
357
                        const MapMode& rDrawMode,
358
                        const RectangleConverter *pConverter = NULL);
358
                        const RectangleConverter *pConverter = NULL);
359
    void            UpdateCopySourceOverlay(const MapMode& rDrawMode);
360
359
361
protected:
360
protected:
362
    using Window::Resize;
361
    using Window::Resize;
Lines 458-463 public: Link Here
458
    void CursorChanged();
457
    void CursorChanged();
459
    void DrawLayerCreated();
458
    void DrawLayerCreated();
460
459
460
    void            DeleteCopySourceOverlay();
461
    void            UpdateCopySourceOverlay();
461
    void            DeleteCursorOverlay();
462
    void            DeleteCursorOverlay();
462
    void            UpdateCursorOverlay();
463
    void            UpdateCursorOverlay();
463
    void            DeleteSelectionOverlay();
464
    void            DeleteSelectionOverlay();
(-)sc/source/ui/inc/overlayobject.hxx (+58 lines)
Line 0 Link Here
1
/*************************************************************************
2
 *
3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
 * 
5
 * Copyright 2008 by Sun Microsystems, Inc.
6
 *
7
 * OpenOffice.org - a multi-platform office productivity suite
8
 *
9
 * $RCSfile: gridwin.hxx,v $
10
 * $Revision: 1.30 $
11
 *
12
 * This file is part of OpenOffice.org.
13
 *
14
 * OpenOffice.org is free software: you can redistribute it and/or modify
15
 * it under the terms of the GNU Lesser General Public License version 3
16
 * only, as published by the Free Software Foundation.
17
 *
18
 * OpenOffice.org is distributed in the hope that it will be useful,
19
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21
 * GNU Lesser General Public License version 3 for more details
22
 * (a copy is included in the LICENSE file that accompanied this code).
23
 *
24
 * You should have received a copy of the GNU Lesser General Public License
25
 * version 3 along with OpenOffice.org.  If not, see
26
 * <http://www.openoffice.org/license.html>
27
 * for a copy of the LGPLv3 License.
28
 *
29
 ************************************************************************/
30
31
#ifndef __SC_OVERLAYOBJECT_HXX__
32
#define __SC_OVERLAYOBJECT_HXX__
33
34
#include "svx/sdr/overlay/overlayobject.hxx"
35
36
class OutputDevice;
37
class Window;
38
39
class ScOverlayDashedBorder : public ::sdr::overlay::OverlayObject
40
{
41
public:
42
    ScOverlayDashedBorder(const ::basegfx::B2DRange& rRange, const Color& rColor, Window* pWin);
43
    virtual ~ScOverlayDashedBorder();
44
45
    virtual void Trigger(sal_uInt32 nTime);
46
    virtual void transform(const ::basegfx::B2DHomMatrix& rMatrix);
47
    virtual void zoomHasChanged();
48
49
private:
50
    virtual void drawGeometry(OutputDevice& rOutputDevice);
51
    virtual void createBaseRange(OutputDevice& rOutputDevice);
52
53
private:
54
    Window* mpParent;
55
    bool mbToggle;
56
};
57
58
#endif
(-)sc/source/ui/inc/tabview.hxx (+1 lines)
Lines 441-446 public: Link Here
441
441
442
    void			CreateAnchorHandles(SdrHdlList& rHdl, const ScAddress& rAddress);
442
    void			CreateAnchorHandles(SdrHdlList& rHdl, const ScAddress& rAddress);
443
443
444
    void            UpdateCopySourceOverlay();
444
    void            UpdateSelectionOverlay();
445
    void            UpdateSelectionOverlay();
445
    void            UpdateShrinkOverlay();
446
    void            UpdateShrinkOverlay();
446
    void            UpdateAllOverlays();
447
    void            UpdateAllOverlays();
(-)sc/source/ui/view/cellsh1.cxx (-2 / +5 lines)
Lines 1167-1177 void ScCellShell::ExecuteEdit( SfxRequest& rReq ) Link Here
1167
1167
1168
        case SID_COPY:				// fuer Grafiken in DrawShell
1168
        case SID_COPY:				// fuer Grafiken in DrawShell
1169
            {
1169
            {
1170
                WaitObject aWait( GetViewData()->GetDialogParent() );
1170
                ScViewData* pViewData = GetViewData();
1171
                WaitObject aWait( pViewData->GetDialogParent() );
1171
                pTabViewShell->CopyToClip( NULL, FALSE, FALSE, TRUE );
1172
                pTabViewShell->CopyToClip( NULL, FALSE, FALSE, TRUE );
1172
                rReq.Done();
1173
                rReq.Done();
1173
				GetViewData()->SetPasteMode( (ScPasteFlags) (SC_PASTE_MODE | SC_PASTE_BORDER) );
1174
				pViewData->SetPasteMode( (ScPasteFlags) (SC_PASTE_MODE | SC_PASTE_BORDER) );
1174
				pTabViewShell->ShowCursor();
1175
				pTabViewShell->ShowCursor();
1176
                pTabViewShell->UpdateCopySourceOverlay();
1175
            }
1177
            }
1176
            break;
1178
            break;
1177
1179
Lines 1181-1186 void ScCellShell::ExecuteEdit( SfxRequest& rReq ) Link Here
1181
                pTabViewShell->CutToClip( NULL, TRUE );
1183
                pTabViewShell->CutToClip( NULL, TRUE );
1182
                rReq.Done();
1184
                rReq.Done();
1183
				GetViewData()->SetPasteMode( SC_PASTE_MODE );
1185
				GetViewData()->SetPasteMode( SC_PASTE_MODE );
1186
                pTabViewShell->UpdateCopySourceOverlay();
1184
            }
1187
            }
1185
            break;
1188
            break;
1186
1189
(-)sc/source/ui/view/gridwin.cxx (-26 / +30 lines)
Lines 122-127 Link Here
122
#include "tabprotection.hxx"
122
#include "tabprotection.hxx"
123
#include "clipparam.hxx"
123
#include "clipparam.hxx"
124
#include "dpcontrol.hxx"
124
#include "dpcontrol.hxx"
125
#include "overlayobject.hxx"
126
#include "basegfx/range/b2drange.hxx"
125
127
126
// #114409#
128
// #114409#
127
#include <vcl/salbtype.hxx>		// FRound
129
#include <vcl/salbtype.hxx>		// FRound
Lines 3060-3066 void __EXPORT ScGridWindow::KeyInput(const KeyEvent& rKEvt) Link Here
3060
3062
3061
		// hide the border around the copy source
3063
		// hide the border around the copy source
3062
		pViewData->SetPasteMode( SC_PASTE_NONE );
3064
		pViewData->SetPasteMode( SC_PASTE_NONE );
3063
		UpdateCursorOverlay();
3065
		UpdateCopySourceOverlay();
3064
		return;
3066
		return;
3065
	}
3067
	}
3066
    // wenn semi-Modeless-SfxChildWindow-Dialog oben, keine KeyInputs:
3068
    // wenn semi-Modeless-SfxChildWindow-Dialog oben, keine KeyInputs:
Lines 3069-3075 void __EXPORT ScGridWindow::KeyInput(const KeyEvent& rKEvt) Link Here
3069
		if (rKeyCode.GetCode() == KEY_ESCAPE)
3071
		if (rKeyCode.GetCode() == KEY_ESCAPE)
3070
		{
3072
		{
3071
			pViewData->SetPasteMode( SC_PASTE_NONE );
3073
			pViewData->SetPasteMode( SC_PASTE_NONE );
3072
			UpdateCursorOverlay();
3074
            UpdateCopySourceOverlay();
3073
		}
3075
		}
3074
        //	query for existing note marker before calling ViewShell's keyboard handling
3076
        //	query for existing note marker before calling ViewShell's keyboard handling
3075
        //	which may remove the marker
3077
        //	which may remove the marker
Lines 5149-5154 void ScGridWindow::CursorChanged() Link Here
5149
void ScGridWindow::ImpCreateOverlayObjects()
5151
void ScGridWindow::ImpCreateOverlayObjects()
5150
{
5152
{
5151
    UpdateCursorOverlay();
5153
    UpdateCursorOverlay();
5154
    UpdateCopySourceOverlay();
5152
    UpdateSelectionOverlay();
5155
    UpdateSelectionOverlay();
5153
    UpdateAutoFillOverlay();
5156
    UpdateAutoFillOverlay();
5154
    UpdateDragRectOverlay();
5157
    UpdateDragRectOverlay();
Lines 5160-5165 void ScGridWindow::ImpCreateOverlayObjects() Link Here
5160
void ScGridWindow::ImpDestroyOverlayObjects()
5163
void ScGridWindow::ImpDestroyOverlayObjects()
5161
{
5164
{
5162
    DeleteCursorOverlay();
5165
    DeleteCursorOverlay();
5166
    DeleteCopySourceOverlay();
5163
    DeleteSelectionOverlay();
5167
    DeleteSelectionOverlay();
5164
    DeleteAutoFillOverlay();
5168
    DeleteAutoFillOverlay();
5165
    DeleteDragRectOverlay();
5169
    DeleteDragRectOverlay();
Lines 5178-5184 void ScGridWindow::UpdateAllOverlays() Link Here
5178
void ScGridWindow::DeleteCursorOverlay()
5182
void ScGridWindow::DeleteCursorOverlay()
5179
{
5183
{
5180
    DELETEZ( mpOOCursors );
5184
    DELETEZ( mpOOCursors );
5181
    DELETEZ( mpOOSelectionBorder );
5182
}
5185
}
5183
5186
5184
void ScGridWindow::ConvertPixelRectsToRangeVector( const ::std::vector< Rectangle >& rPixelRects, 
5187
void ScGridWindow::ConvertPixelRectsToRangeVector( const ::std::vector< Rectangle >& rPixelRects, 
Lines 5202-5209 void ScGridWindow::ConvertPixelRectsToRangeVector( const ::std::vector< Rectangl Link Here
5202
    }
5205
    }
5203
}
5206
}
5204
5207
5205
void ScGridWindow::UpdateCopySourceOverlay( const MapMode& rDrawMode )
5208
void ScGridWindow::DeleteCopySourceOverlay()
5209
{
5210
    DELETEZ( mpOOSelectionBorder );
5211
}
5212
5213
void ScGridWindow::UpdateCopySourceOverlay()
5206
{
5214
{
5215
    MapMode aDrawMode = GetDrawMapMode();
5216
    MapMode aOldMode = GetMapMode();
5217
    if ( aOldMode != aDrawMode )
5218
        SetMapMode( aDrawMode );
5219
5220
    DeleteCopySourceOverlay();
5221
5207
    if (!pViewData->ShowPasteSource())
5222
    if (!pViewData->ShowPasteSource())
5208
        return;
5223
        return;
5209
    ::sdr::overlay::OverlayManager* pOverlayManager = getOverlayManager();
5224
    ::sdr::overlay::OverlayManager* pOverlayManager = getOverlayManager();
Lines 5232-5264 void ScGridWindow::UpdateCopySourceOverlay( const MapMode& rDrawMode ) Link Here
5232
    
5247
    
5233
        Point aClipStartScrPos = pViewData->GetScrPos( nClipStartX, nClipStartY, eWhich );
5248
        Point aClipStartScrPos = pViewData->GetScrPos( nClipStartX, nClipStartY, eWhich );
5234
        Point aClipEndScrPos   = pViewData->GetScrPos( nClipEndX + 1, nClipEndY + 1, eWhich );
5249
        Point aClipEndScrPos   = pViewData->GetScrPos( nClipEndX + 1, nClipEndY + 1, eWhich );
5235
    
5250
        aClipStartScrPos -= Point(1, 1);
5236
        long nSizeXPix = aClipEndScrPos.X() - aClipStartScrPos.X();
5251
        long nSizeXPix = aClipEndScrPos.X() - aClipStartScrPos.X();
5237
        long nSizeYPix = aClipEndScrPos.Y() - aClipStartScrPos.Y();
5252
        long nSizeYPix = aClipEndScrPos.Y() - aClipStartScrPos.Y();
5238
    
5253
    
5239
        aClipStartScrPos.X() -= 2;
5254
        Rectangle aRect( aClipStartScrPos, Size(nSizeXPix, nSizeYPix) );
5240
        aClipStartScrPos.Y() -= 2;
5241
    
5255
    
5242
        Rectangle aRect( aClipStartScrPos, Size( nSizeXPix + 3, nSizeYPix + 3 ) );
5243
    
5244
        std::vector<Rectangle> aPixelRects;
5245
    
5246
        aPixelRects.push_back(Rectangle( aRect.Left(), aRect.Top(), aRect.Left()+2, aRect.Bottom() ));
5247
        aPixelRects.push_back(Rectangle( aRect.Right()-2, aRect.Top(), aRect.Right(), aRect.Bottom() ));
5248
        aPixelRects.push_back(Rectangle( aRect.Left()+3, aRect.Top(), aRect.Right()-3, aRect.Top()+2 ));
5249
        aPixelRects.push_back(Rectangle( aRect.Left()+3, aRect.Bottom()-2, aRect.Right()-3, aRect.Bottom() ));
5250
    
5251
        sdr::overlay::OverlayObjectCell::RangeVector aRanges;
5252
        ConvertPixelRectsToRangeVector( aPixelRects, &aRanges, rDrawMode );
5253
    
5254
        ScOverlayType eType = SC_OVERLAY_BORDER_TRANSPARENT;
5255
    
5256
    
5256
        Color aHighlight = GetSettings().GetStyleSettings().GetHighlightColor();
5257
        Color aHighlight = GetSettings().GetStyleSettings().GetHighlightColor();
5257
        sdr::overlay::OverlayObjectCell* pOverlay = new sdr::overlay::OverlayObjectCell( eType, aHighlight, aRanges );
5258
5258
    
5259
        Rectangle aLogic = PixelToLogic(aRect, aDrawMode);
5259
        pOverlayManager->add(*pOverlay);
5260
        ::basegfx::B2DRange aRange(aLogic.Left(), aLogic.Top(), aLogic.Right(), aLogic.Bottom());
5260
        mpOOSelectionBorder->append(*pOverlay);
5261
        ScOverlayDashedBorder* pDashedBorder = new ScOverlayDashedBorder(aRange, aHighlight, this);
5262
        pOverlayManager->add(*pDashedBorder);
5263
        mpOOSelectionBorder->append(*pDashedBorder);
5261
    }
5264
    }
5265
5266
    if ( aOldMode != aDrawMode )
5267
        SetMapMode( aOldMode );
5262
}
5268
}
5263
5269
5264
void ScGridWindow::UpdateCursorOverlay()
5270
void ScGridWindow::UpdateCursorOverlay()
Lines 5273-5280 void ScGridWindow::UpdateCursorOverlay() Link Here
5273
5280
5274
    DeleteCursorOverlay();
5281
    DeleteCursorOverlay();
5275
5282
5276
    UpdateCopySourceOverlay( aDrawMode );
5277
5278
    std::vector<Rectangle> aPixelRects;
5283
    std::vector<Rectangle> aPixelRects;
5279
5284
5280
    //
5285
    //
(-)sc/source/ui/view/makefile.mk (+2 lines)
Lines 98-103 SLOFILES = \ Link Here
98
        $(SLO)$/output.obj \
98
        $(SLO)$/output.obj \
99
        $(SLO)$/output2.obj \
99
        $(SLO)$/output2.obj \
100
        $(SLO)$/output3.obj \
100
        $(SLO)$/output3.obj \
101
        $(SLO)$/overlayobject.obj \
101
        $(SLO)$/gridmerg.obj \
102
        $(SLO)$/gridmerg.obj \
102
        $(SLO)$/invmerge.obj \
103
        $(SLO)$/invmerge.obj \
103
        $(SLO)$/cellmergeoption.obj \
104
        $(SLO)$/cellmergeoption.obj \
Lines 155-160 EXCEPTIONSFILES= \ Link Here
155
    $(SLO)$/gridwin.obj \
156
    $(SLO)$/gridwin.obj \
156
    $(SLO)$/invmerge.obj \
157
    $(SLO)$/invmerge.obj \
157
    $(SLO)$/output2.obj \
158
    $(SLO)$/output2.obj \
159
    $(SLO)$/overlayobject.obj \
158
    $(SLO)$/pfuncache.obj \
160
    $(SLO)$/pfuncache.obj \
159
    $(SLO)$/spelldialog.obj \
161
    $(SLO)$/spelldialog.obj \
160
    $(SLO)$/cellsh1.obj \
162
    $(SLO)$/cellsh1.obj \
(-)sc/source/ui/view/overlayobject.cxx (+121 lines)
Line 0 Link Here
1
/*************************************************************************
2
 *
3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
 * 
5
 * Copyright 2008 by Sun Microsystems, Inc.
6
 *
7
 * OpenOffice.org - a multi-platform office productivity suite
8
 *
9
 * $RCSfile: gridwin.hxx,v $
10
 * $Revision: 1.30 $
11
 *
12
 * This file is part of OpenOffice.org.
13
 *
14
 * OpenOffice.org is free software: you can redistribute it and/or modify
15
 * it under the terms of the GNU Lesser General Public License version 3
16
 * only, as published by the Free Software Foundation.
17
 *
18
 * OpenOffice.org is distributed in the hope that it will be useful,
19
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21
 * GNU Lesser General Public License version 3 for more details
22
 * (a copy is included in the LICENSE file that accompanied this code).
23
 *
24
 * You should have received a copy of the GNU Lesser General Public License
25
 * version 3 along with OpenOffice.org.  If not, see
26
 * <http://www.openoffice.org/license.html>
27
 * for a copy of the LGPLv3 License.
28
 *
29
 ************************************************************************/
30
31
// MARKER(update_precomp.py): autogen include statement, do not remove
32
#include "precompiled_sc.hxx"
33
34
#include "overlayobject.hxx"
35
#include "vcl/outdev.hxx"
36
#include "vcl/lineinfo.hxx"
37
#include "vcl/salbtype.hxx"
38
#include "vcl/window.hxx"
39
#include "tools/fract.hxx"
40
#include "basegfx/range/b2drange.hxx"
41
#include "basegfx/polygon/b2dpolygon.hxx"
42
#include "svx/sdr/overlay/overlaymanager.hxx"
43
44
using ::sdr::overlay::OverlayObject;
45
using ::sdr::overlay::OverlayManager;
46
47
#define DASH_UPDATE_INTERVAL 180    // in msec
48
49
ScOverlayDashedBorder::ScOverlayDashedBorder(const ::basegfx::B2DRange& rRange, const Color& rColor, Window* pWin) :
50
    OverlayObject(rColor),
51
    mpParent(pWin),
52
    mbToggle(true)
53
{
54
    mbAllowsAnimation = true;
55
    maBaseRange = rRange;
56
}
57
58
ScOverlayDashedBorder::~ScOverlayDashedBorder()
59
{
60
}
61
62
void ScOverlayDashedBorder::Trigger(sal_uInt32 nTime)
63
{
64
    OverlayManager* pMgr = getOverlayManager();
65
    if (pMgr)
66
    {
67
        SetTime(nTime + DASH_UPDATE_INTERVAL);
68
        mbToggle = !mbToggle;
69
        pMgr->InsertEvent(this);
70
        objectChange();
71
    }
72
}
73
74
void ScOverlayDashedBorder::transform(const ::basegfx::B2DHomMatrix& /*rMatrix*/)
75
{
76
}
77
78
void ScOverlayDashedBorder::zoomHasChanged()
79
{
80
}
81
82
void ScOverlayDashedBorder::drawGeometry(OutputDevice& rOutputDevice)
83
{
84
    using ::basegfx::B2DPoint;
85
    using ::basegfx::B2DPolygon;
86
87
    OverlayManager* pMgr = getOverlayManager();
88
    if (!pMgr)
89
        return;
90
91
    // save original AA and switch off for selection
92
    const sal_uInt16 nOriginalAA(rOutputDevice.GetAntialiasing());
93
    rOutputDevice.SetAntialiasing(0);
94
95
    if (mbToggle)
96
    {    
97
        pMgr->setStripeColorA(getBaseColor());
98
        pMgr->setStripeColorB(COL_WHITE);
99
    }
100
    else
101
    {
102
        pMgr->setStripeColorA(COL_WHITE);
103
        pMgr->setStripeColorB(getBaseColor());
104
    }
105
106
    B2DPolygon aPoly;
107
    aPoly.append(B2DPoint(maBaseRange.getMinX(), maBaseRange.getMinY()));
108
    aPoly.append(B2DPoint(maBaseRange.getMaxX(), maBaseRange.getMinY()));
109
    aPoly.append(B2DPoint(maBaseRange.getMaxX(), maBaseRange.getMaxY()));
110
    aPoly.append(B2DPoint(maBaseRange.getMinX(), maBaseRange.getMaxY()));
111
    aPoly.append(B2DPoint(maBaseRange.getMinX(), maBaseRange.getMinY()));
112
    ImpDrawPolygonStriped(rOutputDevice, aPoly);
113
114
    // restore original AA
115
    rOutputDevice.SetAntialiasing(nOriginalAA);
116
}
117
118
void ScOverlayDashedBorder::createBaseRange(OutputDevice& /*rOutputDevice*/)
119
{
120
}
121
(-)sc/source/ui/view/tabview2.cxx (+7 lines)
Lines 699-704 void ScTabView::ExpandBlockArea(SCsCOL nMovX, SCsROW nMovY) Link Here
699
    ExpandBlock(nAreaX, nAreaY, eMode);
699
    ExpandBlock(nAreaX, nAreaY, eMode);
700
}
700
}
701
701
702
void ScTabView::UpdateCopySourceOverlay()
703
{
704
    for (sal_uInt8 i = 0; i < 4; ++i)
705
        if (pGridWin[i] && pGridWin[i]->IsVisible())
706
            pGridWin[i]->UpdateCopySourceOverlay();
707
}
708
702
void ScTabView::UpdateSelectionOverlay()
709
void ScTabView::UpdateSelectionOverlay()
703
{
710
{
704
    for (USHORT i=0; i<4; i++)
711
    for (USHORT i=0; i<4; i++)
(-)sc/source/ui/view/tabview3.cxx (+1 lines)
Lines 1810-1815 void ScTabView::MakeEditView( ScEditEngineDefaulter* pEngine, SCCOL nCol, SCROW Link Here
1810
                    pGridWin[i]->HideCursor();
1810
                    pGridWin[i]->HideCursor();
1811
1811
1812
                    pGridWin[i]->DeleteCursorOverlay();
1812
                    pGridWin[i]->DeleteCursorOverlay();
1813
                    pGridWin[i]->DeleteCopySourceOverlay();
1813
                    pGridWin[i]->DeleteAutoFillOverlay();
1814
                    pGridWin[i]->DeleteAutoFillOverlay();
1814
1815
1815
                    // flush OverlayManager before changing MapMode to text edit
1816
                    // flush OverlayManager before changing MapMode to text edit
(-)sc/source/ui/view/viewfunc.cxx (-1 / +4 lines)
Lines 1940-1946 void ScViewFunc::DeleteMulti( BOOL bRows, BOOL bRecord ) Link Here
1940
1940
1941
void ScViewFunc::DeleteContents( USHORT nFlags, BOOL bRecord )
1941
void ScViewFunc::DeleteContents( USHORT nFlags, BOOL bRecord )
1942
{
1942
{
1943
	GetViewData()->SetPasteMode( SC_PASTE_NONE );
1943
    ScViewData* pViewData = GetViewData();
1944
	pViewData->SetPasteMode( SC_PASTE_NONE );
1945
    pViewData->GetViewShell()->UpdateCopySourceOverlay();
1946
1944
    // nur wegen Matrix nicht editierbar? Attribute trotzdem ok
1947
    // nur wegen Matrix nicht editierbar? Attribute trotzdem ok
1945
    BOOL bOnlyNotBecauseOfMatrix;
1948
    BOOL bOnlyNotBecauseOfMatrix;
1946
    BOOL bEditable = SelectionEditable( &bOnlyNotBecauseOfMatrix );
1949
    BOOL bEditable = SelectionEditable( &bOnlyNotBecauseOfMatrix );

Return to issue 28535