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 36 ScEditableTester::ScEditableTester() : 37 bIsEditable( sal_True ), 38 bOnlyMatrix( sal_True ) 39 { 40 } 41 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 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 59 ScEditableTester::ScEditableTester( ScDocument* pDoc, const ScRange& rRange ) : 60 bIsEditable( sal_True ), 61 bOnlyMatrix( sal_True ) 62 { 63 TestRange( pDoc, rRange ); 64 } 65 66 ScEditableTester::ScEditableTester( ScDocument* pDoc, const ScMarkData& rMark ) : 67 bIsEditable( sal_True ), 68 bOnlyMatrix( sal_True ) 69 { 70 TestSelection( pDoc, rMark ); 71 } 72 73 ScEditableTester::ScEditableTester( ScViewFunc* pView ) : 74 bIsEditable( sal_True ), 75 bOnlyMatrix( sal_True ) 76 { 77 TestView( pView ); 78 } 79 80 //------------------------------------------------------------------ 81 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 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 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 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 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 149 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