| /************************************************************** |
| * |
| * 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_svl.hxx" |
| |
| #include <svl/ctloptions.hxx> |
| |
| #include <svl/languageoptions.hxx> |
| #include <i18npool/mslangid.hxx> |
| #include <unotools/configitem.hxx> |
| #include <tools/debug.hxx> |
| #include <com/sun/star/uno/Any.h> |
| #include <com/sun/star/uno/Sequence.hxx> |
| #include <osl/mutex.hxx> |
| #include <vos/mutex.hxx> |
| #include <svl/smplhint.hxx> |
| #include <rtl/instance.hxx> |
| #include <unotools/syslocale.hxx> |
| #include <itemholder2.hxx> |
| |
| using namespace ::com::sun::star; |
| using namespace ::com::sun::star::uno; |
| |
| #define ASCII_STR(s) rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(s) ) |
| #define CFG_READONLY_DEFAULT sal_False |
| |
| // SvtCJKOptions_Impl ---------------------------------------------------------- |
| |
| class SvtCTLOptions_Impl : public utl::ConfigItem |
| { |
| private: |
| sal_Bool m_bIsLoaded; |
| sal_Bool m_bCTLFontEnabled; |
| sal_Bool m_bCTLSequenceChecking; |
| sal_Bool m_bCTLRestricted; |
| sal_Bool m_bCTLTypeAndReplace; |
| SvtCTLOptions::CursorMovement m_eCTLCursorMovement; |
| SvtCTLOptions::TextNumerals m_eCTLTextNumerals; |
| |
| sal_Bool m_bROCTLFontEnabled; |
| sal_Bool m_bROCTLSequenceChecking; |
| sal_Bool m_bROCTLRestricted; |
| sal_Bool m_bROCTLTypeAndReplace; |
| sal_Bool m_bROCTLCursorMovement; |
| sal_Bool m_bROCTLTextNumerals; |
| |
| public: |
| SvtCTLOptions_Impl(); |
| ~SvtCTLOptions_Impl(); |
| |
| virtual void Notify( const Sequence< rtl::OUString >& _aPropertyNames ); |
| virtual void Commit(); |
| void Load(); |
| |
| sal_Bool IsLoaded() { return m_bIsLoaded; } |
| void SetCTLFontEnabled( sal_Bool _bEnabled ); |
| sal_Bool IsCTLFontEnabled() const { return m_bCTLFontEnabled; } |
| |
| void SetCTLSequenceChecking( sal_Bool _bEnabled ); |
| sal_Bool IsCTLSequenceChecking() const { return m_bCTLSequenceChecking;} |
| |
| void SetCTLSequenceCheckingRestricted( sal_Bool _bEnable ); |
| sal_Bool IsCTLSequenceCheckingRestricted( void ) const { return m_bCTLRestricted; } |
| |
| void SetCTLSequenceCheckingTypeAndReplace( sal_Bool _bEnable ); |
| sal_Bool IsCTLSequenceCheckingTypeAndReplace() const { return m_bCTLTypeAndReplace; } |
| |
| void SetCTLCursorMovement( SvtCTLOptions::CursorMovement _eMovement ); |
| SvtCTLOptions::CursorMovement |
| GetCTLCursorMovement() const { return m_eCTLCursorMovement; } |
| |
| void SetCTLTextNumerals( SvtCTLOptions::TextNumerals _eNumerals ); |
| SvtCTLOptions::TextNumerals |
| GetCTLTextNumerals() const { return m_eCTLTextNumerals; } |
| |
| sal_Bool IsReadOnly(SvtCTLOptions::EOption eOption) const; |
| }; |
| //------------------------------------------------------------------------------ |
| namespace |
| { |
| struct PropertyNames |
| : public rtl::Static< Sequence< rtl::OUString >, PropertyNames > {}; |
| } |
| //------------------------------------------------------------------------------ |
| sal_Bool SvtCTLOptions_Impl::IsReadOnly(SvtCTLOptions::EOption eOption) const |
| { |
| sal_Bool bReadOnly = CFG_READONLY_DEFAULT; |
| switch(eOption) |
| { |
| case SvtCTLOptions::E_CTLFONT : bReadOnly = m_bROCTLFontEnabled ; break; |
| case SvtCTLOptions::E_CTLSEQUENCECHECKING : bReadOnly = m_bROCTLSequenceChecking ; break; |
| case SvtCTLOptions::E_CTLCURSORMOVEMENT : bReadOnly = m_bROCTLCursorMovement ; break; |
| case SvtCTLOptions::E_CTLTEXTNUMERALS : bReadOnly = m_bROCTLTextNumerals ; break; |
| case SvtCTLOptions::E_CTLSEQUENCECHECKINGRESTRICTED: bReadOnly = m_bROCTLRestricted ; break; |
| case SvtCTLOptions::E_CTLSEQUENCECHECKINGTYPEANDREPLACE: bReadOnly = m_bROCTLTypeAndReplace; break; |
| default: DBG_ERROR( "SvtCTLOptions_Impl::IsReadOnly() - invalid option" ); |
| } |
| return bReadOnly; |
| } |
| //------------------------------------------------------------------------------ |
| SvtCTLOptions_Impl::SvtCTLOptions_Impl() : |
| |
| utl::ConfigItem( ASCII_STR("Office.Common/I18N/CTL") ), |
| |
| m_bIsLoaded ( sal_False ), |
| m_bCTLFontEnabled ( sal_False ), |
| m_bCTLSequenceChecking ( sal_False ), |
| m_bCTLRestricted ( sal_False ), |
| m_eCTLCursorMovement ( SvtCTLOptions::MOVEMENT_LOGICAL ), |
| m_eCTLTextNumerals ( SvtCTLOptions::NUMERALS_ARABIC ), |
| |
| m_bROCTLFontEnabled ( CFG_READONLY_DEFAULT ), |
| m_bROCTLSequenceChecking( CFG_READONLY_DEFAULT ), |
| m_bROCTLRestricted ( CFG_READONLY_DEFAULT ), |
| m_bROCTLCursorMovement ( CFG_READONLY_DEFAULT ), |
| m_bROCTLTextNumerals ( CFG_READONLY_DEFAULT ) |
| { |
| } |
| //------------------------------------------------------------------------------ |
| SvtCTLOptions_Impl::~SvtCTLOptions_Impl() |
| { |
| if ( IsModified() == sal_True ) |
| Commit(); |
| } |
| // ----------------------------------------------------------------------------- |
| void SvtCTLOptions_Impl::Notify( const Sequence< rtl::OUString >& ) |
| { |
| Load(); |
| NotifyListeners(SFX_HINT_CTL_SETTINGS_CHANGED); |
| } |
| // ----------------------------------------------------------------------------- |
| void SvtCTLOptions_Impl::Commit() |
| { |
| Sequence< rtl::OUString > &rPropertyNames = PropertyNames::get(); |
| rtl::OUString* pOrgNames = rPropertyNames.getArray(); |
| sal_Int32 nOrgCount = rPropertyNames.getLength(); |
| |
| Sequence< rtl::OUString > aNames( nOrgCount ); |
| Sequence< Any > aValues( nOrgCount ); |
| |
| rtl::OUString* pNames = aNames.getArray(); |
| Any* pValues = aValues.getArray(); |
| sal_Int32 nRealCount = 0; |
| |
| const uno::Type& rType = ::getBooleanCppuType(); |
| |
| for ( int nProp = 0; nProp < nOrgCount; nProp++ ) |
| { |
| switch ( nProp ) |
| { |
| case 0: |
| { |
| if (!m_bROCTLFontEnabled) |
| { |
| pNames[nRealCount] = pOrgNames[nProp]; |
| pValues[nRealCount].setValue( &m_bCTLFontEnabled, rType ); |
| ++nRealCount; |
| } |
| } |
| break; |
| |
| case 1: |
| { |
| if (!m_bROCTLSequenceChecking) |
| { |
| pNames[nRealCount] = pOrgNames[nProp]; |
| pValues[nRealCount].setValue( &m_bCTLSequenceChecking, rType ); |
| ++nRealCount; |
| } |
| } |
| break; |
| |
| case 2: |
| { |
| if (!m_bROCTLCursorMovement) |
| { |
| pNames[nRealCount] = pOrgNames[nProp]; |
| pValues[nRealCount] <<= (sal_Int32)m_eCTLCursorMovement; |
| ++nRealCount; |
| } |
| } |
| break; |
| |
| case 3: |
| { |
| if (!m_bROCTLTextNumerals) |
| { |
| pNames[nRealCount] = pOrgNames[nProp]; |
| pValues[nRealCount] <<= (sal_Int32)m_eCTLTextNumerals; |
| ++nRealCount; |
| } |
| } |
| break; |
| |
| case 4: |
| { |
| if (!m_bROCTLRestricted) |
| { |
| pNames[nRealCount] = pOrgNames[nProp]; |
| pValues[nRealCount].setValue( &m_bCTLRestricted, rType ); |
| ++nRealCount; |
| } |
| } |
| break; |
| case 5: |
| { |
| if(!m_bROCTLTypeAndReplace) |
| { |
| pNames[nRealCount] = pOrgNames[nProp]; |
| pValues[nRealCount].setValue( &m_bCTLTypeAndReplace, rType ); |
| ++nRealCount; |
| } |
| } |
| break; |
| } |
| } |
| aNames.realloc(nRealCount); |
| aValues.realloc(nRealCount); |
| PutProperties( aNames, aValues ); |
| //broadcast changes |
| NotifyListeners(SFX_HINT_CTL_SETTINGS_CHANGED); |
| } |
| // ----------------------------------------------------------------------------- |
| void SvtCTLOptions_Impl::Load() |
| { |
| Sequence< rtl::OUString >& rPropertyNames = PropertyNames::get(); |
| if ( !rPropertyNames.getLength() ) |
| { |
| rPropertyNames.realloc(6); |
| rtl::OUString* pNames = rPropertyNames.getArray(); |
| pNames[0] = ASCII_STR("CTLFont"); |
| pNames[1] = ASCII_STR("CTLSequenceChecking"); |
| pNames[2] = ASCII_STR("CTLCursorMovement"); |
| pNames[3] = ASCII_STR("CTLTextNumerals"); |
| pNames[4] = ASCII_STR("CTLSequenceCheckingRestricted"); |
| pNames[5] = ASCII_STR("CTLSequenceCheckingTypeAndReplace"); |
| EnableNotification( rPropertyNames ); |
| } |
| Sequence< Any > aValues = GetProperties( rPropertyNames ); |
| Sequence< sal_Bool > aROStates = GetReadOnlyStates( rPropertyNames ); |
| const Any* pValues = aValues.getConstArray(); |
| const sal_Bool* pROStates = aROStates.getConstArray(); |
| DBG_ASSERT( aValues.getLength() == rPropertyNames.getLength(), "GetProperties failed" ); |
| DBG_ASSERT( aROStates.getLength() == rPropertyNames.getLength(), "GetReadOnlyStates failed" ); |
| if ( aValues.getLength() == rPropertyNames.getLength() && aROStates.getLength() == rPropertyNames.getLength() ) |
| { |
| sal_Bool bValue = sal_False; |
| sal_Int32 nValue = 0; |
| |
| for ( int nProp = 0; nProp < rPropertyNames.getLength(); nProp++ ) |
| { |
| if ( pValues[nProp].hasValue() ) |
| { |
| if ( pValues[nProp] >>= bValue ) |
| { |
| switch ( nProp ) |
| { |
| case 0: { m_bCTLFontEnabled = bValue; m_bROCTLFontEnabled = pROStates[nProp]; } break; |
| case 1: { m_bCTLSequenceChecking = bValue; m_bROCTLSequenceChecking = pROStates[nProp]; } break; |
| case 4: { m_bCTLRestricted = bValue; m_bROCTLRestricted = pROStates[nProp]; } break; |
| case 5: { m_bCTLTypeAndReplace = bValue; m_bROCTLTypeAndReplace = pROStates[nProp]; } break; |
| } |
| } |
| else if ( pValues[nProp] >>= nValue ) |
| { |
| switch ( nProp ) |
| { |
| case 2: { m_eCTLCursorMovement = (SvtCTLOptions::CursorMovement)nValue; m_bROCTLCursorMovement = pROStates[nProp]; } break; |
| case 3: { m_eCTLTextNumerals = (SvtCTLOptions::TextNumerals)nValue; m_bROCTLTextNumerals = pROStates[nProp]; } break; |
| } |
| } |
| } |
| } |
| } |
| sal_uInt16 nType = SvtLanguageOptions::GetScriptTypeOfLanguage(LANGUAGE_SYSTEM); |
| SvtSystemLanguageOptions aSystemLocaleSettings; |
| LanguageType eSystemLanguage = aSystemLocaleSettings.GetWin16SystemLanguage(); |
| sal_uInt16 nWinScript = SvtLanguageOptions::GetScriptTypeOfLanguage( eSystemLanguage ); |
| if( !m_bCTLFontEnabled && (( nType & SCRIPTTYPE_COMPLEX ) || |
| ((eSystemLanguage != LANGUAGE_SYSTEM) && ( nWinScript & SCRIPTTYPE_COMPLEX ))) ) |
| { |
| m_bCTLFontEnabled = sal_True; |
| sal_uInt16 nLanguage = SvtSysLocale().GetLanguage(); |
| //enable sequence checking for the appropriate languages |
| m_bCTLSequenceChecking = m_bCTLRestricted = m_bCTLTypeAndReplace = |
| (MsLangId::needsSequenceChecking( nLanguage) || |
| MsLangId::needsSequenceChecking( eSystemLanguage)); |
| Commit(); |
| } |
| m_bIsLoaded = sal_True; |
| } |
| //------------------------------------------------------------------------------ |
| void SvtCTLOptions_Impl::SetCTLFontEnabled( sal_Bool _bEnabled ) |
| { |
| if(!m_bROCTLFontEnabled && m_bCTLFontEnabled != _bEnabled) |
| { |
| m_bCTLFontEnabled = _bEnabled; |
| SetModified(); |
| NotifyListeners(0); |
| } |
| } |
| //------------------------------------------------------------------------------ |
| void SvtCTLOptions_Impl::SetCTLSequenceChecking( sal_Bool _bEnabled ) |
| { |
| if(!m_bROCTLSequenceChecking && m_bCTLSequenceChecking != _bEnabled) |
| { |
| SetModified(); |
| m_bCTLSequenceChecking = _bEnabled; |
| NotifyListeners(0); |
| } |
| } |
| //------------------------------------------------------------------------------ |
| void SvtCTLOptions_Impl::SetCTLSequenceCheckingRestricted( sal_Bool _bEnabled ) |
| { |
| if(!m_bROCTLRestricted && m_bCTLRestricted != _bEnabled) |
| { |
| SetModified(); |
| m_bCTLRestricted = _bEnabled; |
| NotifyListeners(0); |
| } |
| } |
| //------------------------------------------------------------------------------ |
| void SvtCTLOptions_Impl::SetCTLSequenceCheckingTypeAndReplace( sal_Bool _bEnabled ) |
| { |
| if(!m_bROCTLTypeAndReplace && m_bCTLTypeAndReplace != _bEnabled) |
| { |
| SetModified(); |
| m_bCTLTypeAndReplace = _bEnabled; |
| NotifyListeners(0); |
| } |
| } |
| //------------------------------------------------------------------------------ |
| void SvtCTLOptions_Impl::SetCTLCursorMovement( SvtCTLOptions::CursorMovement _eMovement ) |
| { |
| if (!m_bROCTLCursorMovement && m_eCTLCursorMovement != _eMovement ) |
| { |
| SetModified(); |
| m_eCTLCursorMovement = _eMovement; |
| NotifyListeners(0); |
| } |
| } |
| //------------------------------------------------------------------------------ |
| void SvtCTLOptions_Impl::SetCTLTextNumerals( SvtCTLOptions::TextNumerals _eNumerals ) |
| { |
| if (!m_bROCTLTextNumerals && m_eCTLTextNumerals != _eNumerals ) |
| { |
| SetModified(); |
| m_eCTLTextNumerals = _eNumerals; |
| NotifyListeners(0); |
| } |
| } |
| // global ---------------------------------------------------------------- |
| |
| static SvtCTLOptions_Impl* pCTLOptions = NULL; |
| static sal_Int32 nCTLRefCount = 0; |
| namespace { struct CTLMutex : public rtl::Static< osl::Mutex, CTLMutex > {}; } |
| |
| // class SvtCTLOptions -------------------------------------------------- |
| |
| SvtCTLOptions::SvtCTLOptions( sal_Bool bDontLoad ) |
| { |
| // Global access, must be guarded (multithreading) |
| ::osl::MutexGuard aGuard( CTLMutex::get() ); |
| if ( !pCTLOptions ) |
| { |
| pCTLOptions = new SvtCTLOptions_Impl; |
| ItemHolder2::holdConfigItem(E_CTLOPTIONS); |
| } |
| if( !bDontLoad && !pCTLOptions->IsLoaded() ) |
| pCTLOptions->Load(); |
| |
| ++nCTLRefCount; |
| m_pImp = pCTLOptions; |
| m_pImp->AddListener(this); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| SvtCTLOptions::~SvtCTLOptions() |
| { |
| // Global access, must be guarded (multithreading) |
| ::osl::MutexGuard aGuard( CTLMutex::get() ); |
| |
| m_pImp->RemoveListener(this); |
| if ( !--nCTLRefCount ) |
| DELETEZ( pCTLOptions ); |
| } |
| // ----------------------------------------------------------------------------- |
| void SvtCTLOptions::SetCTLFontEnabled( sal_Bool _bEnabled ) |
| { |
| DBG_ASSERT( pCTLOptions->IsLoaded(), "CTL options not loaded" ); |
| pCTLOptions->SetCTLFontEnabled( _bEnabled ); |
| } |
| // ----------------------------------------------------------------------------- |
| sal_Bool SvtCTLOptions::IsCTLFontEnabled() const |
| { |
| DBG_ASSERT( pCTLOptions->IsLoaded(), "CTL options not loaded" ); |
| return pCTLOptions->IsCTLFontEnabled(); |
| } |
| // ----------------------------------------------------------------------------- |
| void SvtCTLOptions::SetCTLSequenceChecking( sal_Bool _bEnabled ) |
| { |
| DBG_ASSERT( pCTLOptions->IsLoaded(), "CTL options not loaded" ); |
| pCTLOptions->SetCTLSequenceChecking(_bEnabled); |
| } |
| // ----------------------------------------------------------------------------- |
| sal_Bool SvtCTLOptions::IsCTLSequenceChecking() const |
| { |
| DBG_ASSERT( pCTLOptions->IsLoaded(), "CTL options not loaded" ); |
| return pCTLOptions->IsCTLSequenceChecking(); |
| } |
| // ----------------------------------------------------------------------------- |
| void SvtCTLOptions::SetCTLSequenceCheckingRestricted( sal_Bool _bEnable ) |
| { |
| DBG_ASSERT( pCTLOptions->IsLoaded(), "CTL options not loaded" ); |
| pCTLOptions->SetCTLSequenceCheckingRestricted(_bEnable); |
| } |
| // ----------------------------------------------------------------------------- |
| sal_Bool SvtCTLOptions::IsCTLSequenceCheckingRestricted( void ) const |
| { |
| DBG_ASSERT( pCTLOptions->IsLoaded(), "CTL options not loaded" ); |
| return pCTLOptions->IsCTLSequenceCheckingRestricted(); |
| } |
| // ----------------------------------------------------------------------------- |
| void SvtCTLOptions::SetCTLSequenceCheckingTypeAndReplace( sal_Bool _bEnable ) |
| { |
| DBG_ASSERT( pCTLOptions->IsLoaded(), "CTL options not loaded" ); |
| pCTLOptions->SetCTLSequenceCheckingTypeAndReplace(_bEnable); |
| } |
| // ----------------------------------------------------------------------------- |
| sal_Bool SvtCTLOptions::IsCTLSequenceCheckingTypeAndReplace() const |
| { |
| DBG_ASSERT( pCTLOptions->IsLoaded(), "CTL options not loaded" ); |
| return pCTLOptions->IsCTLSequenceCheckingTypeAndReplace(); |
| } |
| // ----------------------------------------------------------------------------- |
| void SvtCTLOptions::SetCTLCursorMovement( SvtCTLOptions::CursorMovement _eMovement ) |
| { |
| DBG_ASSERT( pCTLOptions->IsLoaded(), "CTL options not loaded" ); |
| pCTLOptions->SetCTLCursorMovement( _eMovement ); |
| } |
| // ----------------------------------------------------------------------------- |
| SvtCTLOptions::CursorMovement SvtCTLOptions::GetCTLCursorMovement() const |
| { |
| DBG_ASSERT( pCTLOptions->IsLoaded(), "CTL options not loaded" ); |
| return pCTLOptions->GetCTLCursorMovement(); |
| } |
| // ----------------------------------------------------------------------------- |
| void SvtCTLOptions::SetCTLTextNumerals( SvtCTLOptions::TextNumerals _eNumerals ) |
| { |
| DBG_ASSERT( pCTLOptions->IsLoaded(), "CTL options not loaded" ); |
| pCTLOptions->SetCTLTextNumerals( _eNumerals ); |
| } |
| // ----------------------------------------------------------------------------- |
| SvtCTLOptions::TextNumerals SvtCTLOptions::GetCTLTextNumerals() const |
| { |
| DBG_ASSERT( pCTLOptions->IsLoaded(), "CTL options not loaded" ); |
| return pCTLOptions->GetCTLTextNumerals(); |
| } |
| // ----------------------------------------------------------------------------- |
| sal_Bool SvtCTLOptions::IsReadOnly(EOption eOption) const |
| { |
| DBG_ASSERT( pCTLOptions->IsLoaded(), "CTL options not loaded" ); |
| return pCTLOptions->IsReadOnly(eOption); |
| } |
| // ----------------------------------------------------------------------------- |
| |