xref: /AOO41X/main/sc/source/ui/docshell/editable.cxx (revision b3f79822e811ac3493b185030a72c3c5a51f32d8)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sc.hxx"
26 
27 
28 
29 #include "editable.hxx"
30 #include "document.hxx"
31 #include "viewfunc.hxx"
32 #include "globstr.hrc"
33 
34 //------------------------------------------------------------------
35 
ScEditableTester()36 ScEditableTester::ScEditableTester() :
37     bIsEditable( sal_True ),
38     bOnlyMatrix( sal_True )
39 {
40 }
41 
ScEditableTester(ScDocument * pDoc,SCTAB nTab,SCCOL nStartCol,SCROW nStartRow,SCCOL nEndCol,SCROW nEndRow)42 ScEditableTester::ScEditableTester( ScDocument* pDoc, SCTAB nTab,
43                         SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow ) :
44     bIsEditable( sal_True ),
45     bOnlyMatrix( sal_True )
46 {
47     TestBlock( pDoc, nTab, nStartCol, nStartRow, nEndCol, nEndRow );
48 }
49 
ScEditableTester(ScDocument * pDoc,SCCOL nStartCol,SCROW nStartRow,SCCOL nEndCol,SCROW nEndRow,const ScMarkData & rMark)50 ScEditableTester::ScEditableTester( ScDocument* pDoc,
51                         SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow,
52                         const ScMarkData& rMark ) :
53     bIsEditable( sal_True ),
54     bOnlyMatrix( sal_True )
55 {
56     TestSelectedBlock( pDoc, nStartCol, nStartRow, nEndCol, nEndRow, rMark );
57 }
58 
ScEditableTester(ScDocument * pDoc,const ScRange & rRange)59 ScEditableTester::ScEditableTester( ScDocument* pDoc, const ScRange& rRange ) :
60     bIsEditable( sal_True ),
61     bOnlyMatrix( sal_True )
62 {
63     TestRange( pDoc, rRange );
64 }
65 
ScEditableTester(ScDocument * pDoc,const ScMarkData & rMark)66 ScEditableTester::ScEditableTester( ScDocument* pDoc, const ScMarkData& rMark ) :
67     bIsEditable( sal_True ),
68     bOnlyMatrix( sal_True )
69 {
70     TestSelection( pDoc, rMark );
71 }
72 
ScEditableTester(ScViewFunc * pView)73 ScEditableTester::ScEditableTester( ScViewFunc* pView ) :
74     bIsEditable( sal_True ),
75     bOnlyMatrix( sal_True )
76 {
77     TestView( pView );
78 }
79 
80 //------------------------------------------------------------------
81 
TestBlock(ScDocument * pDoc,SCTAB nTab,SCCOL nStartCol,SCROW nStartRow,SCCOL nEndCol,SCROW nEndRow)82 void ScEditableTester::TestBlock( ScDocument* pDoc, SCTAB nTab,
83                         SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow )
84 {
85     if ( bIsEditable || bOnlyMatrix )
86     {
87         sal_Bool bThisMatrix;
88         if ( !pDoc->IsBlockEditable( nTab, nStartCol, nStartRow, nEndCol, nEndRow, &bThisMatrix ) )
89         {
90             bIsEditable = sal_False;
91             if ( !bThisMatrix )
92                 bOnlyMatrix = sal_False;
93         }
94     }
95 }
96 
TestSelectedBlock(ScDocument * pDoc,SCCOL nStartCol,SCROW nStartRow,SCCOL nEndCol,SCROW nEndRow,const ScMarkData & rMark)97 void ScEditableTester::TestSelectedBlock( ScDocument* pDoc,
98                         SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow,
99                         const ScMarkData& rMark )
100 {
101     SCTAB nTabCount = pDoc->GetTableCount();
102     for (SCTAB nTab=0; nTab<nTabCount; nTab++)
103         if (rMark.GetTableSelect(nTab))
104             TestBlock( pDoc, nTab, nStartCol, nStartRow, nEndCol, nEndRow );
105 }
106 
TestRange(ScDocument * pDoc,const ScRange & rRange)107 void ScEditableTester::TestRange( ScDocument* pDoc, const ScRange& rRange )
108 {
109     SCCOL nStartCol = rRange.aStart.Col();
110     SCROW nStartRow = rRange.aStart.Row();
111     SCTAB nStartTab = rRange.aStart.Tab();
112     SCCOL nEndCol = rRange.aEnd.Col();
113     SCROW nEndRow = rRange.aEnd.Row();
114     SCTAB nEndTab = rRange.aEnd.Tab();
115     for (SCTAB nTab=nStartTab; nTab<=nEndTab; nTab++)
116         TestBlock( pDoc, nTab, nStartCol, nStartRow, nEndCol, nEndRow );
117 }
118 
TestSelection(ScDocument * pDoc,const ScMarkData & rMark)119 void ScEditableTester::TestSelection( ScDocument* pDoc, const ScMarkData& rMark )
120 {
121     if ( bIsEditable || bOnlyMatrix )
122     {
123         sal_Bool bThisMatrix;
124         if ( !pDoc->IsSelectionEditable( rMark, &bThisMatrix ) )
125         {
126             bIsEditable = sal_False;
127             if ( !bThisMatrix )
128                 bOnlyMatrix = sal_False;
129         }
130     }
131 }
132 
TestView(ScViewFunc * pView)133 void ScEditableTester::TestView( ScViewFunc* pView )
134 {
135     if ( bIsEditable || bOnlyMatrix )
136     {
137         sal_Bool bThisMatrix;
138         if ( !pView->SelectionEditable( &bThisMatrix ) )
139         {
140             bIsEditable = sal_False;
141             if ( !bThisMatrix )
142                 bOnlyMatrix = sal_False;
143         }
144     }
145 }
146 
147 //------------------------------------------------------------------
148 
GetMessageId() const149 sal_uInt16 ScEditableTester::GetMessageId() const
150 {
151     if (bIsEditable)
152         return 0;
153     else if (bOnlyMatrix)
154         return STR_MATRIXFRAGMENTERR;
155     else
156         return STR_PROTECTIONERR;
157 }
158 
159