blob: e08377519825fd9102335df45d41af7785ea56fb [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sc.hxx"
#include "editable.hxx"
#include "document.hxx"
#include "viewfunc.hxx"
#include "globstr.hrc"
//------------------------------------------------------------------
ScEditableTester::ScEditableTester() :
bIsEditable( sal_True ),
bOnlyMatrix( sal_True )
{
}
ScEditableTester::ScEditableTester( ScDocument* pDoc, SCTAB nTab,
SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow ) :
bIsEditable( sal_True ),
bOnlyMatrix( sal_True )
{
TestBlock( pDoc, nTab, nStartCol, nStartRow, nEndCol, nEndRow );
}
ScEditableTester::ScEditableTester( ScDocument* pDoc,
SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow,
const ScMarkData& rMark ) :
bIsEditable( sal_True ),
bOnlyMatrix( sal_True )
{
TestSelectedBlock( pDoc, nStartCol, nStartRow, nEndCol, nEndRow, rMark );
}
ScEditableTester::ScEditableTester( ScDocument* pDoc, const ScRange& rRange ) :
bIsEditable( sal_True ),
bOnlyMatrix( sal_True )
{
TestRange( pDoc, rRange );
}
ScEditableTester::ScEditableTester( ScDocument* pDoc, const ScMarkData& rMark ) :
bIsEditable( sal_True ),
bOnlyMatrix( sal_True )
{
TestSelection( pDoc, rMark );
}
ScEditableTester::ScEditableTester( ScViewFunc* pView ) :
bIsEditable( sal_True ),
bOnlyMatrix( sal_True )
{
TestView( pView );
}
//------------------------------------------------------------------
void ScEditableTester::TestBlock( ScDocument* pDoc, SCTAB nTab,
SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow )
{
if ( bIsEditable || bOnlyMatrix )
{
sal_Bool bThisMatrix;
if ( !pDoc->IsBlockEditable( nTab, nStartCol, nStartRow, nEndCol, nEndRow, &bThisMatrix ) )
{
bIsEditable = sal_False;
if ( !bThisMatrix )
bOnlyMatrix = sal_False;
}
}
}
void ScEditableTester::TestSelectedBlock( ScDocument* pDoc,
SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow,
const ScMarkData& rMark )
{
SCTAB nTabCount = pDoc->GetTableCount();
for (SCTAB nTab=0; nTab<nTabCount; nTab++)
if (rMark.GetTableSelect(nTab))
TestBlock( pDoc, nTab, nStartCol, nStartRow, nEndCol, nEndRow );
}
void ScEditableTester::TestRange( ScDocument* pDoc, const ScRange& rRange )
{
SCCOL nStartCol = rRange.aStart.Col();
SCROW nStartRow = rRange.aStart.Row();
SCTAB nStartTab = rRange.aStart.Tab();
SCCOL nEndCol = rRange.aEnd.Col();
SCROW nEndRow = rRange.aEnd.Row();
SCTAB nEndTab = rRange.aEnd.Tab();
for (SCTAB nTab=nStartTab; nTab<=nEndTab; nTab++)
TestBlock( pDoc, nTab, nStartCol, nStartRow, nEndCol, nEndRow );
}
void ScEditableTester::TestSelection( ScDocument* pDoc, const ScMarkData& rMark )
{
if ( bIsEditable || bOnlyMatrix )
{
sal_Bool bThisMatrix;
if ( !pDoc->IsSelectionEditable( rMark, &bThisMatrix ) )
{
bIsEditable = sal_False;
if ( !bThisMatrix )
bOnlyMatrix = sal_False;
}
}
}
void ScEditableTester::TestView( ScViewFunc* pView )
{
if ( bIsEditable || bOnlyMatrix )
{
sal_Bool bThisMatrix;
if ( !pView->SelectionEditable( &bThisMatrix ) )
{
bIsEditable = sal_False;
if ( !bThisMatrix )
bOnlyMatrix = sal_False;
}
}
}
//------------------------------------------------------------------
sal_uInt16 ScEditableTester::GetMessageId() const
{
if (bIsEditable)
return 0;
else if (bOnlyMatrix)
return STR_MATRIXFRAGMENTERR;
else
return STR_PROTECTIONERR;
}