/************************************************************** * * 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 "scitems.hxx" #include #include #include #include #include "document.hxx" #include "cell.hxx" #include "cellform.hxx" #include "patattr.hxx" #include "scrdata.hxx" #include "poolhelp.hxx" using namespace com::sun::star; #define SC_BREAKITER_SERVICE "com.sun.star.i18n.BreakIterator" // // this file is compiled with exceptions enabled // put functions here that need exceptions! // // ----------------------------------------------------------------------- const uno::Reference< i18n::XBreakIterator >& ScDocument::GetBreakIterator() { if ( !pScriptTypeData ) pScriptTypeData = new ScScriptTypeData; if ( !pScriptTypeData->xBreakIter.is() ) { uno::Reference< uno::XInterface > xInterface = xServiceManager->createInstance( ::rtl::OUString::createFromAscii( SC_BREAKITER_SERVICE ) ); pScriptTypeData->xBreakIter = uno::Reference< i18n::XBreakIterator >( xInterface, uno::UNO_QUERY ); DBG_ASSERT( pScriptTypeData->xBreakIter.is(), "can't get BreakIterator" ); } return pScriptTypeData->xBreakIter; } sal_Bool ScDocument::HasStringWeakCharacters( const String& rString ) { if (rString.Len()) { uno::Reference xBreakIter = GetBreakIterator(); if ( xBreakIter.is() ) { rtl::OUString aText = rString; sal_Int32 nLen = aText.getLength(); sal_Int32 nPos = 0; do { sal_Int16 nType = xBreakIter->getScriptType( aText, nPos ); if ( nType == i18n::ScriptType::WEAK ) return sal_True; // found nPos = xBreakIter->endOfScript( aText, nPos, nType ); } while ( nPos >= 0 && nPos < nLen ); } } return sal_False; // none found } sal_uInt8 ScDocument::GetStringScriptType( const String& rString ) { sal_uInt8 nRet = 0; if (rString.Len()) { uno::Reference xBreakIter = GetBreakIterator(); if ( xBreakIter.is() ) { rtl::OUString aText = rString; sal_Int32 nLen = aText.getLength(); sal_Int32 nPos = 0; do { sal_Int16 nType = xBreakIter->getScriptType( aText, nPos ); switch ( nType ) { case i18n::ScriptType::LATIN: nRet |= SCRIPTTYPE_LATIN; break; case i18n::ScriptType::ASIAN: nRet |= SCRIPTTYPE_ASIAN; break; case i18n::ScriptType::COMPLEX: nRet |= SCRIPTTYPE_COMPLEX; break; // WEAK is ignored } nPos = xBreakIter->endOfScript( aText, nPos, nType ); } while ( nPos >= 0 && nPos < nLen ); } } return nRet; } sal_uInt8 ScDocument::GetCellScriptType( ScBaseCell* pCell, sal_uLong nNumberFormat ) { if ( !pCell ) return 0; // empty sal_uInt8 nStored = pCell->GetScriptType(); if ( nStored != SC_SCRIPTTYPE_UNKNOWN ) // stored value valid? return nStored; // use stored value String aStr; Color* pColor; ScCellFormat::GetString( pCell, nNumberFormat, aStr, &pColor, *xPoolHelper->GetFormTable() ); sal_uInt8 nRet = GetStringScriptType( aStr ); pCell->SetScriptType( nRet ); // store for later calls return nRet; } sal_uInt8 ScDocument::GetScriptType( SCCOL nCol, SCROW nRow, SCTAB nTab, ScBaseCell* pCell ) { // if cell is not passed, take from document if (!pCell) { pCell = GetCell( ScAddress( nCol, nRow, nTab ) ); if ( !pCell ) return 0; // empty } // if script type is set, don't have to get number formats sal_uInt8 nStored = pCell->GetScriptType(); if ( nStored != SC_SCRIPTTYPE_UNKNOWN ) // stored value valid? return nStored; // use stored value // include number formats from conditional formatting const ScPatternAttr* pPattern = GetPattern( nCol, nRow, nTab ); if (!pPattern) return 0; const SfxItemSet* pCondSet = NULL; if ( ((const SfxUInt32Item&)pPattern->GetItem(ATTR_CONDITIONAL)).GetValue() ) pCondSet = GetCondResult( nCol, nRow, nTab ); sal_uLong nFormat = pPattern->GetNumberFormat( xPoolHelper->GetFormTable(), pCondSet ); return GetCellScriptType( pCell, nFormat ); }