/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * 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 .
*/
SfxViewShell* pScActiveViewShell = nullptr; //FIXME: Make this a member
sal_uInt16 nScClickMouseModifier = 0; //FIXME: This too
sal_uInt16 nScFillModeMouseModifier = 0; //FIXME: And this
bool ScGlobal::CheckWidthInvalidate( bool& bNumFormatChanged, const SfxItemSet& rNewAttrs, const SfxItemSet& rOldAttrs )
{ // Here ScPatternAttr::FastEqualPatternSets was used before. This implies that // the two given SfxItemSet are internal ones from ScPatternAttr, but there is // no guarantee here for that. Also that former method contained the comment // "Actually test_tdf133629 from UITest_calc_tests9 somehow manages to have // a different range (and I don't understand enough why), so better be safe and compare fully." // which may be based on this usage. I check for that already in // ScPatternAttr::operator==, seems not to be triggered there. // All in all: Better use SfxItemSet::operator== here, and not one specialized // on the SfxItemSets of ScPatternAttr if (rNewAttrs == rOldAttrs)
{
bNumFormatChanged = false; returnfalse;
} // Check whether attribute changes in rNewAttrs compared to rOldAttrs render // the text width at a cell invalid
bNumFormatChanged =
HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_VALUE_FORMAT ); return ( bNumFormatChanged
|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_LANGUAGE_FORMAT )
|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_FONT )
|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_CJK_FONT )
|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_CTL_FONT )
|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_FONT_HEIGHT )
|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_CJK_FONT_HEIGHT )
|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_CTL_FONT_HEIGHT )
|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_FONT_WEIGHT )
|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_CJK_FONT_WEIGHT )
|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_CTL_FONT_WEIGHT )
|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_FONT_POSTURE )
|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_CJK_FONT_POSTURE )
|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_CTL_FONT_POSTURE )
|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_FONT_UNDERLINE )
|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_FONT_OVERLINE )
|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_FONT_CROSSEDOUT )
|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_FONT_CONTOUR )
|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_FONT_SHADOWED )
|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_STACKED )
|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_ROTATE_VALUE )
|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_ROTATE_MODE )
|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_LINEBREAK )
|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_MARGIN )
);
}
void ScGlobal::SetSearchItem( const SvxSearchItem& rNew )
{
assert(!bThreadedGroupCalcInProgress); // FIXME: An assignment operator would be nice here
xSearchItem.reset(rNew.Clone());
void ScGlobal::ClearAutoFormat()
{
assert(!bThreadedGroupCalcInProgress); if (xAutoFormat)
{ // When modified via StarOne then only the SaveLater flag is set and no saving is done. // If the flag is set then save now. if (xAutoFormat->IsSaveLater())
xAutoFormat->Save();
xAutoFormat.reset();
}
}
void ScGlobal::Init()
{ // The default language for number formats (ScGlobal::eLnge) must // always be LANGUAGE_SYSTEM // FIXME: So remove this variable?
eLnge = LANGUAGE_SYSTEM;
InitPPT(); //ScCompiler::InitSymbolsNative(); // ScParameterClassification _after_ Compiler, needs function resources if // arguments are to be merged in, which in turn need strings of function // names from the compiler.
ScParameterClassification::Init();
InitAddIns();
aStrClipDocName = ScResId( SCSTR_NONAME ) + "1";
// ScDocumentPool::InitVersionMaps() has been called earlier already
}
void ScGlobal::InitTextHeight(SfxItemPool& rPool)
{ // this gets handed over the m_pMessagePool in ScModule::ScModule, so // the previously used item ScPatternAttr is unchanged. This allows to // just use an temporary incarnation of a CellAttributeHelper here const CellAttributeHelper aTempHelper(rPool); const ScPatternAttr& rDefaultCellAttribute(aTempHelper.getDefaultCellAttribute());
OutputDevice* pDefaultDev = Application::GetDefaultDevice();
ScopedVclPtrInstance< VirtualDevice > pVirtWindow( *pDefaultDev );
pVirtWindow->SetMapMode(MapMode(MapUnit::MapPixel));
vcl::Font aDefFont;
rDefaultCellAttribute.fillFontOnly(aDefFont, pVirtWindow); // Font color doesn't matter here
pVirtWindow->SetFont(aDefFont);
sal_uInt16 nTest = static_cast<sal_uInt16>(
pVirtWindow->PixelToLogic(Size(0, pVirtWindow->GetTextHeight()), MapMode(MapUnit::MapTwip)).Height());
if (nTest > nDefFontHeight)
nDefFontHeight = nTest;
rtl_TextEncoding ScGlobal::GetCharsetValue( std::u16string_view rCharSet )
{ // new TextEncoding values if ( CharClass::isAsciiNumeric( rCharSet ) )
{
sal_Int32 nVal = o3tl::toInt32(rCharSet); if ( nVal == RTL_TEXTENCODING_DONTKNOW ) return osl_getThreadTextEncoding(); returnstatic_cast<rtl_TextEncoding>(nVal);
} // old CharSet values for compatibility elseif (o3tl::equalsIgnoreAsciiCase(rCharSet, u"ANSI") ) return RTL_TEXTENCODING_MS_1252; elseif (o3tl::equalsIgnoreAsciiCase(rCharSet, u"MAC") ) return RTL_TEXTENCODING_APPLE_ROMAN; elseif (o3tl::equalsIgnoreAsciiCase(rCharSet, u"IBMPC") ) return RTL_TEXTENCODING_IBM_850; elseif (o3tl::equalsIgnoreAsciiCase(rCharSet, u"IBMPC_437")) return RTL_TEXTENCODING_IBM_437; elseif (o3tl::equalsIgnoreAsciiCase(rCharSet, u"IBMPC_850")) return RTL_TEXTENCODING_IBM_850; elseif (o3tl::equalsIgnoreAsciiCase(rCharSet, u"IBMPC_860")) return RTL_TEXTENCODING_IBM_860; elseif (o3tl::equalsIgnoreAsciiCase(rCharSet, u"IBMPC_861")) return RTL_TEXTENCODING_IBM_861; elseif (o3tl::equalsIgnoreAsciiCase(rCharSet, u"IBMPC_863")) return RTL_TEXTENCODING_IBM_863; elseif (o3tl::equalsIgnoreAsciiCase(rCharSet, u"IBMPC_865")) return RTL_TEXTENCODING_IBM_865; // Some wrong "help" on the net mentions UTF8 and even unoconv uses it, // which worked accidentally if the system encoding is UTF-8 anyway, so // support it ;) but only when reading. elseif (o3tl::equalsIgnoreAsciiCase(rCharSet, u"UTF8")) return RTL_TEXTENCODING_UTF8; elseif (o3tl::equalsIgnoreAsciiCase(rCharSet, u"UTF-8")) return RTL_TEXTENCODING_UTF8; elsereturn osl_getThreadTextEncoding();
}
OUString ScGlobal::GetCharsetString( rtl_TextEncoding eVal )
{ constchar* pChar; switch ( eVal )
{ // old CharSet strings for compatibility case RTL_TEXTENCODING_MS_1252: pChar = "ANSI"; break; case RTL_TEXTENCODING_APPLE_ROMAN: pChar = "MAC"; break; // IBMPC == IBMPC_850 case RTL_TEXTENCODING_IBM_437: pChar = "IBMPC_437"; break; case RTL_TEXTENCODING_IBM_850: pChar = "IBMPC_850"; break; case RTL_TEXTENCODING_IBM_860: pChar = "IBMPC_860"; break; case RTL_TEXTENCODING_IBM_861: pChar = "IBMPC_861"; break; case RTL_TEXTENCODING_IBM_863: pChar = "IBMPC_863"; break; case RTL_TEXTENCODING_IBM_865: pChar = "IBMPC_865"; break; case RTL_TEXTENCODING_DONTKNOW: pChar = "SYSTEM"; break; // new string of TextEncoding value default: return OUString::number( eVal );
} return OUString::createFromAscii(pChar);
}
bool ScGlobal::HasStarCalcFunctionList()
{
OUString lang = Translate::getLanguage(ScModule::get()->GetResLocale()); auto list = xStarCalcFunctionList.find(lang); return list != xStarCalcFunctionList.end();
}
ScFunctionList* ScGlobal::GetStarCalcFunctionList()
{
assert(!bThreadedGroupCalcInProgress);
ScModule* mod = ScModule::get();
OUString lang = Translate::getLanguage(mod->GetResLocale()); if (auto list = xStarCalcFunctionList.find(lang); list != xStarCalcFunctionList.end())
{ return xStarCalcFunctionList[lang].get();
}
xStarCalcFunctionList.emplace(
lang, new ScFunctionList(mod->GetFormulaOptions().GetUseEnglishFuncName())); return xStarCalcFunctionList[lang].get();
}
ScFunctionMgr* ScGlobal::GetStarCalcFunctionMgr()
{
assert(!bThreadedGroupCalcInProgress);
OUString lang = Translate::getLanguage(ScModule::get()->GetResLocale()); if (auto list = xStarCalcFunctionMgr.find(lang); list != xStarCalcFunctionMgr.end())
{ return xStarCalcFunctionMgr[lang].get();
}
xStarCalcFunctionMgr.emplace(lang, new ScFunctionMgr);
return xStarCalcFunctionMgr[lang].get();
}
void ScGlobal::ResetFunctionList()
{ // FunctionMgr has pointers into FunctionList, must also be updated
xStarCalcFunctionMgr.clear();
xStarCalcFunctionList.clear(); // Building new names also needs InputHandler data to be refreshed.
maInputHandlerFunctionNames.clear();
maInputHandlerFunctionNames.emplace(Translate::getLanguage(ScModule::get()->GetResLocale()),
InputHandlerFunctionNames());
}
const InputHandlerFunctionNames& ScGlobal::GetInputHandlerFunctionNames()
{
OUString lang = Translate::getLanguage(ScModule::get()->GetResLocale()); if (maInputHandlerFunctionNames.find(lang) == maInputHandlerFunctionNames.end())
{
maInputHandlerFunctionNames.emplace(lang, InputHandlerFunctionNames());
}
bool ScGlobal::EETextObjEqual( const EditTextObject* pObj1, const EditTextObject* pObj2 )
{ if ( pObj1 == pObj2 ) // Both empty or the same object returntrue;
if ( pObj1 && pObj2 ) return pObj1->Equals( *pObj2);
returnfalse;
}
void ScGlobal::OpenURL(const OUString& rURL, const OUString& rTarget, bool bIgnoreSettings)
{ // OpenURL is always called in the GridWindow by mouse clicks in some way or another. // That's why pScActiveViewShell and nScClickMouseModifier are correct.
// Fragments pointing into the current document should be always opened. if (!bIgnoreSettings && !(ShouldOpenURL() || rURL.startsWith("#"))) return;
SfxViewFrame* pViewFrm = SfxViewFrame::Current(); if (!pViewFrm) return;
// Don't fiddle with fragments pointing into current document. // Also don't mess around with a vnd.sun.star.script or service or other // internal "URI". if (!aUrlName.startsWith("#")
&& !aUrlName.startsWithIgnoreAsciiCase("vnd.sun.star.script:")
&& !aUrlName.startsWithIgnoreAsciiCase("macro:")
&& !aUrlName.startsWithIgnoreAsciiCase("slot:")
&& !aUrlName.startsWithIgnoreAsciiCase("service:")
&& !aUrlName.startsWithIgnoreAsciiCase(".uno:"))
{ // Any relative reference would fail with "not an absolute URL" // error, try to construct an absolute URI with the path relative // to the current document's path or work path, as usual for all // external references. // This then also, as ScGlobal::GetAbsDocName() uses // INetURLObject::smartRel2Abs(), supports "\\" UNC path names as // smb:// Samba shares and DOS path separators converted to proper // file:// URI. const OUString aNewUrlName( ScGlobal::GetAbsDocName( aUrlName, pObjShell)); if (!aNewUrlName.isEmpty())
aUrlName = aNewUrlName;
}
if (!SfxObjectShell::AllowedLinkProtocolFromDocument(aUrlName, pObjShell, pFrame ? pFrame->GetFrameWeld() : nullptr)) return;
SfxStringItem aUrl( SID_FILE_NAME, aUrlName );
SfxStringItem aTarget( SID_TARGETNAME, rTarget ); if ( nScClickMouseModifier & KEY_SHIFT ) // control-click -> into new window
aTarget.SetValue(u"_blank"_ustr);
bool ScGlobal::ShouldOpenURL()
{ bool bCtrlClickHappened = (nScClickMouseModifier & KEY_MOD1); bool bCtrlClickSecOption = SvtSecurityOptions::IsOptionSet( SvtSecurityOptions::EOption::CtrlClickHyperlink ); if( bCtrlClickHappened && ! bCtrlClickSecOption )
{ // return since ctrl+click happened when the // ctrl+click security option was disabled, link should not open returnfalse;
} elseif( ! bCtrlClickHappened && bCtrlClickSecOption )
{ // ctrl+click did not happen; only click happened maybe with some // other key combo. and security option is set, so return returnfalse;
} returntrue;
}
SvtScriptType ScGlobal::GetDefaultScriptType()
{ // Used when text contains only WEAK characters. // Script type of office language is used then (same as GetEditDefaultLanguage, // to get consistent behavior of text in simple cells and EditEngine, // also same as GetAppLanguage() in Writer) return SvtLanguageOptions::GetScriptTypeOfLanguage( Application::GetSettings().GetLanguageTag().getLanguageType() );
}
LanguageType ScGlobal::GetEditDefaultLanguage()
{ // Used for EditEngine::SetDefaultLanguage return Application::GetSettings().GetLanguageTag().getLanguageType();
}
sal_uInt16 ScGlobal::GetScriptedWhichID( SvtScriptType nScriptType, sal_uInt16 nWhich )
{ switch ( nScriptType )
{ case SvtScriptType::LATIN: case SvtScriptType::ASIAN: case SvtScriptType::COMPLEX: break; // take exact matches default: // prefer one, first COMPLEX, then ASIAN if ( nScriptType & SvtScriptType::COMPLEX )
nScriptType = SvtScriptType::COMPLEX; elseif ( nScriptType & SvtScriptType::ASIAN )
nScriptType = SvtScriptType::ASIAN;
} switch ( nScriptType )
{ case SvtScriptType::COMPLEX:
{ switch ( nWhich )
{ case ATTR_FONT: case ATTR_CJK_FONT:
nWhich = ATTR_CTL_FONT; break; case ATTR_FONT_HEIGHT: case ATTR_CJK_FONT_HEIGHT:
nWhich = ATTR_CTL_FONT_HEIGHT; break; case ATTR_FONT_WEIGHT: case ATTR_CJK_FONT_WEIGHT:
nWhich = ATTR_CTL_FONT_WEIGHT; break; case ATTR_FONT_POSTURE: case ATTR_CJK_FONT_POSTURE:
nWhich = ATTR_CTL_FONT_POSTURE; break;
}
} break; case SvtScriptType::ASIAN:
{ switch ( nWhich )
{ case ATTR_FONT: case ATTR_CTL_FONT:
nWhich = ATTR_CJK_FONT; break; case ATTR_FONT_HEIGHT: case ATTR_CTL_FONT_HEIGHT:
nWhich = ATTR_CJK_FONT_HEIGHT; break; case ATTR_FONT_WEIGHT: case ATTR_CTL_FONT_WEIGHT:
nWhich = ATTR_CJK_FONT_WEIGHT; break; case ATTR_FONT_POSTURE: case ATTR_CTL_FONT_POSTURE:
nWhich = ATTR_CJK_FONT_POSTURE; break;
}
} break; default:
{ switch ( nWhich )
{ case ATTR_CTL_FONT: case ATTR_CJK_FONT:
nWhich = ATTR_FONT; break; case ATTR_CTL_FONT_HEIGHT: case ATTR_CJK_FONT_HEIGHT:
nWhich = ATTR_FONT_HEIGHT; break; case ATTR_CTL_FONT_WEIGHT: case ATTR_CJK_FONT_WEIGHT:
nWhich = ATTR_FONT_WEIGHT; break; case ATTR_CTL_FONT_POSTURE: case ATTR_CJK_FONT_POSTURE:
nWhich = ATTR_FONT_POSTURE; break;
}
}
} return nWhich;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.