diff options
Diffstat (limited to 'svx/source/cui/optgdlg.cxx')
-rw-r--r-- | svx/source/cui/optgdlg.cxx | 1817 |
1 files changed, 1817 insertions, 0 deletions
diff --git a/svx/source/cui/optgdlg.cxx b/svx/source/cui/optgdlg.cxx new file mode 100644 index 0000000000..7b4bb2843e --- /dev/null +++ b/svx/source/cui/optgdlg.cxx @@ -0,0 +1,1817 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: optgdlg.cxx,v $ + * $Revision: 1.53.20.2 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_svx.hxx" +#ifdef SVX_DLLIMPLEMENTATION +#undef SVX_DLLIMPLEMENTATION +#endif +#include <svtools/zforlist.hxx> +#include <goodies/grfmgr.hxx> +#include <svtools/flagitem.hxx> +#include <sfx2/dispatch.hxx> +#include <svtools/lingucfg.hxx> +#include <svtools/szitem.hxx> +#include <sfx2/viewsh.hxx> +#include <sfx2/viewfrm.hxx> +#include <sfx2/imgmgr.hxx> +#include <vcl/configsettings.hxx> +#include <vcl/msgbox.hxx> +#include <vcl/mnemonic.hxx> +#include <i18npool/mslangid.hxx> +#include <svtools/useroptions.hxx> +#include <svtools/cacheoptions.hxx> +#include <svtools/fontoptions.hxx> +#include <svtools/menuoptions.hxx> +#include <svtools/startoptions.hxx> +#include <svtools/languageoptions.hxx> +#include <svtools/miscopt.hxx> +#include <svtools/printwarningoptions.hxx> +#include <svtools/syslocaleoptions.hxx> +#include <svtools/helpopt.hxx> +#include <svtools/accessibilityoptions.hxx> +#include <unotools/configitem.hxx> +#include <sfx2/objsh.hxx> +#include <comphelper/types.hxx> +#include <svtools/ctloptions.hxx> +#include <svtools/langtab.hxx> +#include <unotools/localfilehelper.hxx> +#include <unotools/configmgr.hxx> +#include "cuioptgenrl.hxx" +#include "optpath.hxx" +#include "optsave.hxx" +#include <svx/optlingu.hxx> +#include <svx/xpool.hxx> +#include "dlgutil.hxx" +#ifndef _SVX_TAB_AREA_HXX +#include "cuitabarea.hxx" +#endif +#ifndef _SVX_DIALOGS_HRC +#include <svx/dialogs.hrc> +#endif +#include "unolingu.hxx" +#ifndef _SVX_SVXIDS_HRC +#include <svx/svxids.hrc> +#endif +#include <svx/langitem.hxx> +#ifndef _UNOTOOLS_PROCESSFACTORY_HXX +#include <comphelper/processfactory.hxx> +#endif +#include <rtl/ustrbuf.hxx> + + +#include <svx/dialmgr.hxx> +#include <svtools/helpopt.hxx> +#include <svtools/saveopt.hxx> + +#include <com/sun/star/container/XContentEnumerationAccess.hpp> +#include <com/sun/star/container/XNameAccess.hpp> +#include <com/sun/star/container/XNameReplace.hpp> +#include <com/sun/star/container/XHierarchicalNameAccess.hpp> +#include <com/sun/star/lang/XComponent.hpp> +#include <com/sun/star/lang/XInitialization.hpp> +#include <com/sun/star/beans/NamedValue.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/util/XChangesBatch.hpp> +#include <com/sun/star/uno/Any.hxx> +#include <com/sun/star/container/XContentEnumerationAccess.hpp> +#include <com/sun/star/container/XSet.hpp> + +#include <vcl/svapp.hxx> + +#include "optgdlg.hrc" +#include "optgdlg.hxx" +#include "ofaitem.hxx" +#include <svtools/apearcfg.hxx> +#include <svtools/optionsdrawinglayer.hxx> + +#define CONFIG_LANGUAGES "OfficeLanguages" + +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::util; +using namespace ::utl; +using ::rtl::OString; +using ::rtl::OUString; + +#define C2U(cChar) OUString::createFromAscii(cChar) + +#define MAX_PROGRAM_ENTRIES 3 + +// class OfaMiscTabPage -------------------------------------------------- + +int OfaMiscTabPage::DeactivatePage( SfxItemSet* pSet_ ) +{ + if ( pSet_ ) + FillItemSet( *pSet_ ); + return LEAVE_PAGE; +} + +# ifdef ENABLE_GTK +namespace +{ + ::rtl::OUString impl_SystemFileOpenServiceName() + { + const ::rtl::OUString &rDesktopEnvironment = + Application::GetDesktopEnvironment(); + + if ( rDesktopEnvironment.equalsIgnoreAsciiCaseAscii( "gnome" ) ) + { + return ::rtl::OUString::createFromAscii( "com.sun.star.ui.dialogs.GtkFilePicker" ); + } + else if ( rDesktopEnvironment.equalsIgnoreAsciiCaseAscii( "kde" ) ) + { + return ::rtl::OUString::createFromAscii( "com.sun.star.ui.dialogs.KDEFilePicker" ); + } + return ::rtl::OUString::createFromAscii( "com.sun.star.ui.dialogs.SystemFilePicker" ); + } + + sal_Bool lcl_HasSystemFilePicker() + { + Reference< XMultiServiceFactory > xFactory = comphelper::getProcessServiceFactory(); + sal_Bool bRet = sal_False; + + Reference< XContentEnumerationAccess > xEnumAccess( xFactory, UNO_QUERY ); + Reference< XSet > xSet( xFactory, UNO_QUERY ); + + if ( ! xEnumAccess.is() || ! xSet.is() ) + return bRet; + + try + { + ::rtl::OUString aFileService = impl_SystemFileOpenServiceName(); + Reference< XEnumeration > xEnum = xEnumAccess->createContentEnumeration( aFileService ); + if ( xEnum.is() && xEnum->hasMoreElements() ) + bRet = sal_True; + } + + catch( IllegalArgumentException ) {} + catch( ElementExistException ) {} + return bRet; + } +} + +#endif + +// ----------------------------------------------------------------------- + +OfaMiscTabPage::OfaMiscTabPage(Window* pParent, const SfxItemSet& rSet ) : + + SfxTabPage( pParent, SVX_RES( OFA_TP_MISC ), rSet ), + + aHelpFL ( this, SVX_RES( FL_HELP ) ), + aToolTipsCB ( this, SVX_RES( CB_TOOLTIP ) ), + aExtHelpCB ( this, SVX_RES( CB_EXTHELP ) ), + aHelpAgentCB ( this, SVX_RES( CB_HELPAGENT ) ), + aHelpAgentResetBtn ( this, SVX_RES( PB_HELPAGENT_RESET ) ), + aHelpFormatFT ( this, SVX_RES( FT_HELPFORMAT ) ), + aHelpFormatLB ( this, SVX_RES( LB_HELPFORMAT ) ), + aFileDlgFL ( this, SVX_RES( FL_FILEDLG ) ), + aFileDlgROImage ( this, SVX_RES( FI_FILEDLG_RO ) ), + aFileDlgCB ( this, SVX_RES( CB_FILEDLG ) ), + aPrintDlgFL ( this, SVX_RES( FL_PRINTDLG ) ), + aPrintDlgCB ( this, SVX_RES( CB_PRINTDLG ) ), + aDocStatusFL ( this, SVX_RES( FL_DOCSTATUS ) ), + aDocStatusCB ( this, SVX_RES( CB_DOCSTATUS ) ), + aTwoFigureFL ( this, SVX_RES( FL_TWOFIGURE ) ), + aInterpretFT ( this, SVX_RES( FT_INTERPRET ) ), + aYearValueField ( this, SVX_RES( NF_YEARVALUE ) ), + aToYearFT ( this, SVX_RES( FT_TOYEAR ) ) + +{ + FreeResource(); + + //system fileopen only available in Windows and with gtk vclplug based + //picker and on MacOSX (aqua version) +#if !defined( WNT ) && !defined( ENABLE_GTK ) && !(defined(MACOSX) && defined(QUARTZ)) + aFileDlgFL.Hide(); + aFileDlgCB.Hide(); +#else +# ifdef ENABLE_GTK + if (!lcl_HasSystemFilePicker()) + { + aFileDlgFL.Hide(); + aFileDlgCB.Hide(); + } +# endif +#endif + + #if ! defined(QUARTZ) + aPrintDlgFL.Hide(); + aPrintDlgCB.Hide(); + #endif + + if ( !aFileDlgCB.IsVisible() ) + { + // rearrange the following controls + Point aNewPos = aDocStatusFL.GetPosPixel(); + long nDelta = aNewPos.Y() - aFileDlgFL.GetPosPixel().Y(); + + Window* pWins[] = + { + &aPrintDlgFL, &aPrintDlgCB, &aDocStatusFL, &aDocStatusCB, &aTwoFigureFL, + &aInterpretFT, &aYearValueField, &aToYearFT + }; + Window** pCurrent = pWins; + const sal_Int32 nCount = sizeof( pWins ) / sizeof( pWins[ 0 ] ); + for ( sal_Int32 i = 0; i < nCount; ++i, ++pCurrent ) + { + aNewPos = (*pCurrent)->GetPosPixel(); + aNewPos.Y() -= nDelta; + (*pCurrent)->SetPosPixel( aNewPos ); + } + } + else if ( SvtMiscOptions().IsUseSystemFileDialogReadOnly() ) + { + aFileDlgROImage.Show(); + aFileDlgCB.Disable(); + } + + if ( aPrintDlgCB.IsVisible() ) + { + // rearrange the following controls + Point aNewPos = aDocStatusFL.GetPosPixel(); + long nDelta = aNewPos.Y() - aFileDlgFL.GetPosPixel().Y(); + + Window* pWins[] = + { + &aDocStatusFL, &aDocStatusCB, &aTwoFigureFL, + &aInterpretFT, &aYearValueField, &aToYearFT + }; + Window** pCurrent = pWins; + const sal_Int32 nCount = sizeof( pWins ) / sizeof( pWins[ 0 ] ); + for ( sal_Int32 i = 0; i < nCount; ++i, ++pCurrent ) + { + aNewPos = (*pCurrent)->GetPosPixel(); + aNewPos.Y() += nDelta; + (*pCurrent)->SetPosPixel( aNewPos ); + } + } + + // at least the button is as wide as its text + long nTxtWidth = aHelpAgentResetBtn.GetTextWidth( aHelpAgentResetBtn.GetText() ); + Size aBtnSz = aHelpAgentResetBtn.GetSizePixel(); + if ( aBtnSz.Width() < nTxtWidth ) + { + aBtnSz.Width() = nTxtWidth; + aHelpAgentResetBtn.SetSizePixel( aBtnSz ); + } + + aStrDateInfo = aToYearFT.GetText(); + aYearValueField.SetModifyHdl( LINK( this, OfaMiscTabPage, TwoFigureHdl ) ); + Link aLink = LINK( this, OfaMiscTabPage, TwoFigureConfigHdl ); + aYearValueField.SetDownHdl( aLink ); + aYearValueField.SetUpHdl( aLink ); + aYearValueField.SetLoseFocusHdl( aLink ); + aYearValueField.SetFirstHdl( aLink ); + TwoFigureConfigHdl( &aYearValueField ); + + SetExchangeSupport(); + + aLink = LINK( this, OfaMiscTabPage, HelpCheckHdl_Impl ); + aToolTipsCB.SetClickHdl( aLink ); + aHelpAgentCB.SetClickHdl( aLink ); + aHelpAgentResetBtn.SetClickHdl( LINK( this, OfaMiscTabPage, HelpAgentResetHdl_Impl ) ); + + //fill default names as user data + static const char* aHelpFormatNames[] = + { + "Default", + "HighContrast1", + "HighContrast2", + "HighContrastBlack", + "HighContrastWhite" + }; + + for ( USHORT i = 0; i < aHelpFormatLB.GetEntryCount(); i++ ) + { + String* pData = new String( String::CreateFromAscii( aHelpFormatNames[i] ) ); + aHelpFormatLB.SetEntryData( i, pData ); + } +} + +// ----------------------------------------------------------------------- + +OfaMiscTabPage::~OfaMiscTabPage() +{ + for(USHORT i = 0; i < aHelpFormatLB.GetEntryCount(); i++) + { + delete static_cast< String* >( aHelpFormatLB.GetEntryData(i) ); + } +} + +// ----------------------------------------------------------------------- + +SfxTabPage* OfaMiscTabPage::Create( Window* pParent, const SfxItemSet& rAttrSet ) +{ + return new OfaMiscTabPage( pParent, rAttrSet ); +} + +// ----------------------------------------------------------------------- + +BOOL OfaMiscTabPage::FillItemSet( SfxItemSet& rSet ) +{ + BOOL bModified = FALSE; + + SvtHelpOptions aHelpOptions; + BOOL bChecked = aToolTipsCB.IsChecked(); + if ( bChecked != aToolTipsCB.GetSavedValue() ) + aHelpOptions.SetHelpTips( bChecked ); + bChecked = ( aExtHelpCB.IsChecked() && aToolTipsCB.IsChecked() ); + if ( bChecked != aExtHelpCB.GetSavedValue() ) + aHelpOptions.SetExtendedHelp( bChecked ); + bChecked = aHelpAgentCB.IsChecked(); + if ( bChecked != aHelpAgentCB.GetSavedValue() ) + aHelpOptions.SetHelpAgentAutoStartMode( bChecked ); + USHORT nHelpFormatPos = aHelpFormatLB.GetSelectEntryPos(); + if ( nHelpFormatPos != LISTBOX_ENTRY_NOTFOUND && + nHelpFormatPos != aHelpFormatLB.GetSavedValue() ) + { + aHelpOptions.SetHelpStyleSheet( *static_cast< String* >( aHelpFormatLB.GetEntryData( nHelpFormatPos ) ) ); + } + + if ( aFileDlgCB.IsChecked() != aFileDlgCB.GetSavedValue() ) + { + SvtMiscOptions aMiscOpt; + aMiscOpt.SetUseSystemFileDialog( !aFileDlgCB.IsChecked() ); + bModified = TRUE; + } + + if ( aPrintDlgCB.IsChecked() != aPrintDlgCB.GetSavedValue() ) + { + SvtMiscOptions aMiscOpt; + aMiscOpt.SetUseSystemPrintDialog( !aPrintDlgCB.IsChecked() ); + bModified = TRUE; + } + + if ( aDocStatusCB.IsChecked() != aDocStatusCB.GetSavedValue() ) + { + SvtPrintWarningOptions aPrintOptions; + aPrintOptions.SetModifyDocumentOnPrintingAllowed( aDocStatusCB.IsChecked() ); + bModified = TRUE; + } + + const SfxUInt16Item* pUInt16Item = + PTR_CAST( SfxUInt16Item, GetOldItem( rSet, SID_ATTR_YEAR2000 ) ); + USHORT nNum = (USHORT)aYearValueField.GetText().ToInt32(); + if ( pUInt16Item && pUInt16Item->GetValue() != nNum ) + { + bModified = TRUE; + rSet.Put( SfxUInt16Item( SID_ATTR_YEAR2000, nNum ) ); + } + + return bModified; +} + +// ----------------------------------------------------------------------- + +void OfaMiscTabPage::Reset( const SfxItemSet& rSet ) +{ + SvtHelpOptions aHelpOptions; + aToolTipsCB.Check( aHelpOptions.IsHelpTips() ); + aExtHelpCB.Check( aHelpOptions.IsHelpTips() && aHelpOptions.IsExtendedHelp() ); + aHelpAgentCB.Check( aHelpOptions.IsHelpAgentAutoStartMode() ); + String sStyleSheet = aHelpOptions.GetHelpStyleSheet(); + for ( USHORT i = 0; i < aHelpFormatLB.GetEntryCount(); ++i ) + { + if ( *static_cast< String* >( aHelpFormatLB.GetEntryData(i) ) == sStyleSheet ) + { + aHelpFormatLB.SelectEntryPos(i); + break; + } + } + + aToolTipsCB.SaveValue(); + aExtHelpCB.SaveValue(); + aHelpAgentCB.SaveValue(); + aHelpFormatLB.SaveValue(); + HelpCheckHdl_Impl( &aHelpAgentCB ); + + SvtMiscOptions aMiscOpt; + aFileDlgCB.Check( !aMiscOpt.UseSystemFileDialog() ); + aFileDlgCB.SaveValue(); + aPrintDlgCB.Check( !aMiscOpt.UseSystemPrintDialog() ); + aPrintDlgCB.SaveValue(); + + SvtPrintWarningOptions aPrintOptions; + aDocStatusCB.Check(aPrintOptions.IsModifyDocumentOnPrintingAllowed()); + aDocStatusCB.SaveValue(); + + const SfxPoolItem* pItem = NULL; + if ( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_YEAR2000, FALSE, &pItem ) ) + { + aYearValueField.SetValue( ((SfxUInt16Item*)pItem)->GetValue() ); + TwoFigureConfigHdl( &aYearValueField ); + } + else + { + aYearValueField.Enable(FALSE); + aTwoFigureFL.Enable(FALSE); + aInterpretFT.Enable(FALSE); + aToYearFT.Enable(FALSE); + } +} + +// ----------------------------------------------------------------------- + +IMPL_LINK( OfaMiscTabPage, TwoFigureHdl, NumericField*, pEd ) +{ + (void)pEd; + + String aOutput( aStrDateInfo ); + String aStr( aYearValueField.GetText() ); + String sSep( SvtSysLocale().GetLocaleData().getNumThousandSep() ); + xub_StrLen nIndex = 0; + while ((nIndex = aStr.Search( sSep, nIndex)) != STRING_NOTFOUND) + aStr.Erase( nIndex, sSep.Len()); + long nNum = aStr.ToInt32(); + if ( aStr.Len() != 4 || nNum < aYearValueField.GetMin() || nNum > aYearValueField.GetMax() ) + aOutput.AppendAscii("????"); + else + { + nNum += 99; + aOutput += String::CreateFromInt32( nNum ); + } + aToYearFT.SetText( aOutput ); + return 0; +} + +// ----------------------------------------------------------------------- + +IMPL_LINK( OfaMiscTabPage, TwoFigureConfigHdl, NumericField*, pEd ) +{ + sal_Int64 nNum = aYearValueField.GetValue(); + String aOutput( String::CreateFromInt64( nNum ) ); + aYearValueField.SetText( aOutput ); + aYearValueField.SetSelection( Selection( 0, aOutput.Len() ) ); + TwoFigureHdl( pEd ); + return 0; +} + +// ----------------------------------------------------------------------- + +IMPL_LINK( OfaMiscTabPage, HelpCheckHdl_Impl, CheckBox*, EMPTYARG ) +{ + aExtHelpCB.Enable( aToolTipsCB.IsChecked() ); + aHelpAgentResetBtn.Enable( aHelpAgentCB.IsChecked() ); + return 0; +} + +// ----------------------------------------------------------------------- + +IMPL_LINK( OfaMiscTabPage, HelpAgentResetHdl_Impl, PushButton*, EMPTYARG ) +{ + SvtHelpOptions().resetAgentIgnoreURLCounter(); + return 0; +} + +// ----------------------------------------------------------------------- + +// ------------------------------------------------------------------- +class CanvasSettings +{ +public: + CanvasSettings(); + + BOOL IsHardwareAccelerationEnabled() const; + BOOL IsHardwareAccelerationAvailable() const; + void EnabledHardwareAcceleration( BOOL _bEnabled ) const; + +private: + typedef std::vector< std::pair<OUString,Sequence<OUString> > > ServiceVector; + + Reference<XNameAccess> mxForceFlagNameAccess; + ServiceVector maAvailableImplementations; + mutable BOOL mbHWAccelAvailable; + mutable BOOL mbHWAccelChecked; +}; + +// ------------------------------------------------------------------- +CanvasSettings::CanvasSettings() : + mxForceFlagNameAccess(), + mbHWAccelAvailable(FALSE), + mbHWAccelChecked(FALSE) +{ + try + { + Reference< XMultiServiceFactory > xFactory = comphelper::getProcessServiceFactory(); + Reference<XMultiServiceFactory> xConfigProvider( + xFactory->createInstance( + OUString::createFromAscii("com.sun.star.configuration.ConfigurationProvider")), + UNO_QUERY_THROW ); + + Any propValue( + makeAny( PropertyValue( + OUString::createFromAscii("nodepath"), -1, + makeAny( OUString::createFromAscii("/org.openoffice.Office.Canvas") ), + PropertyState_DIRECT_VALUE ) ) ); + + mxForceFlagNameAccess.set( + xConfigProvider->createInstanceWithArguments( + OUString::createFromAscii("com.sun.star.configuration.ConfigurationUpdateAccess"), + Sequence<Any>( &propValue, 1 ) ), + UNO_QUERY_THROW ); + + propValue = makeAny( + PropertyValue( + OUString::createFromAscii("nodepath"), -1, + makeAny( OUString::createFromAscii("/org.openoffice.Office.Canvas/CanvasServiceList") ), + PropertyState_DIRECT_VALUE ) ); + + Reference<XNameAccess> xNameAccess( + xConfigProvider->createInstanceWithArguments( + OUString::createFromAscii("com.sun.star.configuration.ConfigurationAccess"), + Sequence<Any>( &propValue, 1 ) ), UNO_QUERY_THROW ); + Reference<XHierarchicalNameAccess> xHierarchicalNameAccess( + xNameAccess, UNO_QUERY_THROW); + + Sequence<OUString> serviceNames = xNameAccess->getElementNames(); + const OUString* pCurr = serviceNames.getConstArray(); + const OUString* const pEnd = pCurr + serviceNames.getLength(); + while( pCurr != pEnd ) + { + Reference<XNameAccess> xEntryNameAccess( + xHierarchicalNameAccess->getByHierarchicalName(*pCurr), + UNO_QUERY ); + + if( xEntryNameAccess.is() ) + { + Sequence<OUString> preferredImplementations; + if( (xEntryNameAccess->getByName( OUString::createFromAscii("PreferredImplementations") ) >>= preferredImplementations) ) + maAvailableImplementations.push_back( std::make_pair(*pCurr,preferredImplementations) ); + } + + ++pCurr; + } + } + catch( Exception& ) + { + } +} + +// ------------------------------------------------------------------- +BOOL CanvasSettings::IsHardwareAccelerationAvailable() const +{ + if( !mbHWAccelChecked ) + { + mbHWAccelChecked = true; + + Reference< XMultiServiceFactory > xFactory = comphelper::getProcessServiceFactory(); + + // check whether any of the service lists has an + // implementation that presents the "HardwareAcceleration" property + ServiceVector::const_iterator aCurr=maAvailableImplementations.begin(); + const ServiceVector::const_iterator aEnd=maAvailableImplementations.end(); + while( aCurr != aEnd ) + { + const OUString* pCurrImpl = aCurr->second.getConstArray(); + const OUString* const pEndImpl = pCurrImpl + aCurr->second.getLength(); + + while( pCurrImpl != pEndImpl ) + { + try + { + Reference<XPropertySet> xPropSet( xFactory->createInstance( + pCurrImpl->trim() ), + UNO_QUERY_THROW ); + bool bHasAccel(false); + if( (xPropSet->getPropertyValue(OUString::createFromAscii("HardwareAcceleration")) >>= bHasAccel) ) + if( bHasAccel ) + { + mbHWAccelAvailable = true; + return mbHWAccelAvailable; + } + } + catch (Exception &) + {} + + ++pCurrImpl; + } + + ++aCurr; + } + } + + return mbHWAccelAvailable; +} + +// ------------------------------------------------------------------- +BOOL CanvasSettings::IsHardwareAccelerationEnabled() const +{ + bool bForceLastEntry(false); + if( !mxForceFlagNameAccess.is() ) + return true; + + if( !(mxForceFlagNameAccess->getByName( OUString::createFromAscii("ForceSafeServiceImpl") ) >>= bForceLastEntry) ) + return true; + + return !bForceLastEntry; +} + +// ------------------------------------------------------------------- +void CanvasSettings::EnabledHardwareAcceleration( BOOL _bEnabled ) const +{ + Reference< XNameReplace > xNameReplace( + mxForceFlagNameAccess, UNO_QUERY ); + + if( !xNameReplace.is() ) + return; + + xNameReplace->replaceByName( OUString::createFromAscii("ForceSafeServiceImpl"), + makeAny(!_bEnabled) ); + + Reference< XChangesBatch > xChangesBatch( + mxForceFlagNameAccess, UNO_QUERY ); + + if( !xChangesBatch.is() ) + return; + + xChangesBatch->commitChanges(); +} + +// class OfaViewTabPage -------------------------------------------------- + +OfaViewTabPage::OfaViewTabPage(Window* pParent, const SfxItemSet& rSet ) : + + SfxTabPage( pParent, SVX_RES( OFA_TP_VIEW ), rSet ), + + aUserInterfaceFL ( this, SVX_RES( FL_USERINTERFACE ) ), + aWindowSizeFT ( this, SVX_RES( FT_WINDOWSIZE ) ), + aWindowSizeMF ( this, SVX_RES( MF_WINDOWSIZE ) ), + aIconSizeStyleFT ( this, SVX_RES( FT_ICONSIZESTYLE ) ), + aIconSizeLB ( this, SVX_RES( LB_ICONSIZE ) ), + aIconStyleLB ( this, SVX_RES( LB_ICONSTYLE ) ), + m_aSystemFont (this, SVX_RES( CB_SYSTEM_FONT ) ), +#if defined( UNX ) + aFontAntiAliasing ( this, SVX_RES( CB_FONTANTIALIASING )), + aAAPointLimitLabel ( this, SVX_RES( FT_POINTLIMIT_LABEL )), + aAAPointLimit ( this, SVX_RES( NF_AA_POINTLIMIT )), + aAAPointLimitUnits ( this, SVX_RES( FT_POINTLIMIT_UNIT )), +#endif + aMenuFL ( this, SVX_RES( FL_MENU ) ), + aMenuIconsFT ( this, SVX_RES( FT_MENU_ICONS )), + aMenuIconsLB ( this, SVX_RES( LB_MENU_ICONS )), + aFontListsFL ( this, SVX_RES( FL_FONTLISTS) ), + aFontShowCB ( this, SVX_RES( CB_FONT_SHOW ) ), + aFontHistoryCB ( this, SVX_RES( CB_FONT_HISTORY ) ), + aRenderingFL ( this, SVX_RES( FL_RENDERING ) ), + aUseHardwareAccell ( this, SVX_RES( CB_USE_HARDACCELL ) ), + aUseAntiAliase ( this, SVX_RES( CB_USE_ANTIALIASE ) ), + aMouseFL ( this, SVX_RES( FL_MOUSE ) ), + aMousePosFT ( this, SVX_RES( FT_MOUSEPOS ) ), + aMousePosLB ( this, SVX_RES( LB_MOUSEPOS ) ), + aMouseMiddleFT ( this, SVX_RES( FT_MOUSEMIDDLE ) ), + aMouseMiddleLB ( this, SVX_RES( LB_MOUSEMIDDLE ) ), + nSizeLB_InitialSelection(0), + nStyleLB_InitialSelection(0), + pAppearanceCfg(new SvtTabAppearanceCfg), + pCanvasSettings(new CanvasSettings), + mpDrawinglayerOpt(new SvtOptionsDrawinglayer) +{ +#if defined( UNX ) + aFontAntiAliasing.SetToggleHdl( LINK( this, OfaViewTabPage, OnAntialiasingToggled ) ); + + // depending on the size of the text in aAAPointLimitLabel, we slightly re-arrange aAAPointLimit and aAAPointLimitUnits + //#110391# if the label has no mnemonic and we are in a CJK version the mnemonic "(X)" will be added which + // influences the width calculation + MnemonicGenerator aMnemonicGenerator; + String sLabel(aAAPointLimitLabel.GetText()); + aMnemonicGenerator.RegisterMnemonic( sLabel ); + aMnemonicGenerator.CreateMnemonic( sLabel ); + sLabel.EraseAllChars('~'); + + sal_Int32 nLabelWidth = aAAPointLimitLabel.GetTextWidth( sLabel ); + nLabelWidth += 3; // small gap + // pixels to move both controls to the left + Size aSize = aAAPointLimitLabel.GetSizePixel(); + sal_Int32 nMoveLeft = aSize.Width() - nLabelWidth; + // resize the first label + aSize.Width() = nLabelWidth; + aAAPointLimitLabel.SetSizePixel( aSize ); + + // move the numeric field + Point aPos( aAAPointLimit.GetPosPixel() ); + aPos.X() -= nMoveLeft; + aAAPointLimit.SetPosPixel( aPos ); + + // move (and resize) the units FixedText + aPos = ( aAAPointLimitUnits.GetPosPixel() ); + aPos.X() -= nMoveLeft; + aSize = aAAPointLimitUnits.GetSizePixel(); + aSize.Width() += nMoveLeft; + aAAPointLimitUnits.SetPosSizePixel( aPos, aSize ); +#else + // on this platform, we do not have the anti aliasing options - move the other checkboxes accordingly + // (in the resource, the coordinates are calculated for the AA options beeing present) + Control* pMiscOptions[] = + { + &aMenuFL, &aMenuIconsFT, &aMenuIconsLB, + &aFontListsFL, &aFontShowCB, &aFontHistoryCB + }; + + // temporaryly create the checkbox for the anti aliasing (we need to to determine it's pos) + CheckBox* pFontAntiAliasing = new CheckBox( this, SVX_RES( CB_FONTANTIALIASING ) ); + sal_Int32 nMoveUp = aMenuFL.GetPosPixel().Y() - pFontAntiAliasing->GetPosPixel().Y(); + DELETEZ( pFontAntiAliasing ); + + Point aPos; + for ( sal_Int32 i = 0; i < sizeof( pMiscOptions ) / sizeof( pMiscOptions[0] ); ++i ) + { + aPos = pMiscOptions[i]->GetPosPixel( ); + aPos.Y() -= nMoveUp; + pMiscOptions[i]->SetPosPixel( aPos ); + } + +#endif + + FreeResource(); + + if( ! Application::ValidateSystemFont() ) + { + m_aSystemFont.Check( FALSE ); + m_aSystemFont.Enable( FALSE ); + } + + // add real theme name to 'auto' theme, e.g. 'auto' => 'auto (classic)' + if( aIconStyleLB.GetEntryCount() > 1 ) + { + ::rtl::OUString aAutoStr( aIconStyleLB.GetEntry( 0 ) ); + + aAutoStr += ::rtl::OUString::createFromAscii( " (" ); + + switch( Application::GetSettings().GetStyleSettings().GetAutoSymbolsStyle() ) + { + case STYLE_SYMBOLS_DEFAULT: aAutoStr += aIconStyleLB.GetEntry( 1 ); break; + case STYLE_SYMBOLS_INDUSTRIAL: aAutoStr += aIconStyleLB.GetEntry( 2 ); break; + case STYLE_SYMBOLS_CRYSTAL: aAutoStr += aIconStyleLB.GetEntry( 3 ); break; + case STYLE_SYMBOLS_TANGO: aAutoStr += aIconStyleLB.GetEntry( 4 ); break; + case STYLE_SYMBOLS_CLASSIC: aAutoStr += aIconStyleLB.GetEntry( 5 ); break; + case STYLE_SYMBOLS_HICONTRAST: aAutoStr += aIconStyleLB.GetEntry( 6 ); break; + } + + aIconStyleLB.RemoveEntry( 0 ); + aIconStyleLB.InsertEntry( aAutoStr += ::rtl::OUString::createFromAscii( ")" ), 0 ); + aIconStyleLB.SetSeparatorPos( aIconStyleLB.GetEntryCount() - 2 ); + } +} + +OfaViewTabPage::~OfaViewTabPage() +{ + delete mpDrawinglayerOpt; + delete pCanvasSettings; + delete pAppearanceCfg; +} + +#if defined( UNX ) +//--- 20.08.01 10:16:12 --------------------------------------------------- +IMPL_LINK( OfaViewTabPage, OnAntialiasingToggled, void*, NOTINTERESTEDIN ) +{ + (void)NOTINTERESTEDIN; + + sal_Bool bAAEnabled = aFontAntiAliasing.IsChecked(); + + aAAPointLimitLabel.Enable( bAAEnabled ); + aAAPointLimit.Enable( bAAEnabled ); + aAAPointLimitUnits.Enable( bAAEnabled ); + + return 0L; +} +#endif + +/*-----------------06.12.96 11.50------------------- + +--------------------------------------------------*/ + +SfxTabPage* OfaViewTabPage::Create( Window* pParent, const SfxItemSet& rAttrSet ) +{ + return new OfaViewTabPage(pParent, rAttrSet); +} + +/*-----------------06.12.96 11.50------------------- + +--------------------------------------------------*/ + +BOOL OfaViewTabPage::FillItemSet( SfxItemSet& ) +{ + SvtFontOptions aFontOpt; + SvtMenuOptions aMenuOpt; + SvtStartOptions aStartOpt; + + BOOL bModified = FALSE; + BOOL bMenuOptModified = FALSE; + + SvtMiscOptions aMiscOptions; + UINT16 nSizeLB_NewSelection = aIconSizeLB.GetSelectEntryPos(); + if( nSizeLB_InitialSelection != nSizeLB_NewSelection ) + { + // from now on it's modified, even if via auto setting the same size was set as now selected in the LB + sal_Int16 eSet = SFX_SYMBOLS_SIZE_AUTO; + switch( nSizeLB_NewSelection ) + { + case 0: eSet = SFX_SYMBOLS_SIZE_AUTO; break; + case 1: eSet = SFX_SYMBOLS_SIZE_SMALL; break; + case 2: eSet = SFX_SYMBOLS_SIZE_LARGE; break; + default: + DBG_ERROR( "OfaViewTabPage::FillItemSet(): This state of aIconSizeLB should not be possible!" ); + } + aMiscOptions.SetSymbolsSize( eSet ); + } + + UINT16 nStyleLB_NewSelection = aIconStyleLB.GetSelectEntryPos(); + if( nStyleLB_InitialSelection != nStyleLB_NewSelection ) + { + sal_Int16 eSet = SFX_SYMBOLS_STYLE_AUTO; + switch( nStyleLB_NewSelection ) + { + case 0: eSet = SFX_SYMBOLS_STYLE_AUTO; break; + case 1: eSet = SFX_SYMBOLS_STYLE_DEFAULT; break; + case 2: eSet = SFX_SYMBOLS_STYLE_HICONTRAST; break; + case 3: eSet = SFX_SYMBOLS_STYLE_INDUSTRIAL; break; + case 4: eSet = SFX_SYMBOLS_STYLE_CRYSTAL; break; + case 5: eSet = SFX_SYMBOLS_STYLE_TANGO; break; + case 6: eSet = SFX_SYMBOLS_STYLE_CLASSIC; break; + default: + DBG_ERROR( "OfaViewTabPage::FillItemSet(): This state of aIconStyleLB should not be possible!" ); + } + aMiscOptions.SetSymbolsStyle( eSet ); + } + + BOOL bAppearanceChanged = FALSE; + + + // Screen Scaling + UINT16 nOldScale = pAppearanceCfg->GetScaleFactor(); + UINT16 nNewScale = (UINT16)aWindowSizeMF.GetValue(); + + if ( nNewScale != nOldScale ) + { + pAppearanceCfg->SetScaleFactor(nNewScale); + bAppearanceChanged = TRUE; + } + + // Mouse Snap Mode + short eOldSnap = pAppearanceCfg->GetSnapMode(); + short eNewSnap = aMousePosLB.GetSelectEntryPos(); + if(eNewSnap > 2) + eNewSnap = 2; + + if ( eNewSnap != eOldSnap ) + { + pAppearanceCfg->SetSnapMode(eNewSnap ); + bAppearanceChanged = TRUE; + } + + // Middle Mouse Button + short eOldMiddleMouse = pAppearanceCfg->GetMiddleMouseButton(); + short eNewMiddleMouse = aMouseMiddleLB.GetSelectEntryPos(); + if(eNewMiddleMouse > 2) + eNewMiddleMouse = 2; + + if ( eNewMiddleMouse != eOldMiddleMouse ) + { + pAppearanceCfg->SetMiddleMouseButton( eNewMiddleMouse ); + bAppearanceChanged = TRUE; + } + +#if defined( UNX ) + if ( aFontAntiAliasing.IsChecked() != aFontAntiAliasing.GetSavedValue() ) + { + pAppearanceCfg->SetFontAntiAliasing( aFontAntiAliasing.IsChecked() ); + bAppearanceChanged = TRUE; + } + + if ( aAAPointLimit.GetValue() != aAAPointLimit.GetSavedValue().ToInt32() ) + { + pAppearanceCfg->SetFontAntialiasingMinPixelHeight( aAAPointLimit.GetValue() ); + bAppearanceChanged = TRUE; + } +#endif + + if ( aFontShowCB.IsChecked() != aFontShowCB.GetSavedValue() ) + { + aFontOpt.EnableFontWYSIWYG( aFontShowCB.IsChecked() ); + bModified = TRUE; + } + + if(aMenuIconsLB.GetSelectEntryPos() != aMenuIconsLB.GetSavedValue()) + { + aMenuOpt.SetMenuIconsState( aMenuIconsLB.GetSelectEntryPos() == 0 ? 2 : aMenuIconsLB.GetSelectEntryPos() - 1); + bModified = TRUE; + bMenuOptModified = TRUE; + bAppearanceChanged = TRUE; + } + + if ( aFontHistoryCB.IsChecked() != aFontHistoryCB.GetSavedValue() ) + { + aFontOpt.EnableFontHistory( aFontHistoryCB.IsChecked() ); + bModified = TRUE; + } + + // #i95644# if disabled, do not use value, see in ::Reset() + if(aUseHardwareAccell.IsEnabled()) + { + if(aUseHardwareAccell.IsChecked() != aUseHardwareAccell.GetSavedValue()) + { + pCanvasSettings->EnabledHardwareAcceleration(aUseHardwareAccell.IsChecked()); + bModified = TRUE; + } + } + + // #i95644# if disabled, do not use value, see in ::Reset() + if(aUseAntiAliase.IsEnabled()) + { + if(aUseAntiAliase.IsChecked() != mpDrawinglayerOpt->IsAntiAliasing()) + { + mpDrawinglayerOpt->SetAntiAliasing(aUseAntiAliase.IsChecked()); + bModified = TRUE; + + // react on AA change; invalidate all windows to force + // a repaint when changing from AA to non-AA or vice-versa + Window* pAppWindow = Application::GetFirstTopLevelWindow(); + + while(pAppWindow) + { + pAppWindow->Invalidate(); + pAppWindow = Application::GetNextTopLevelWindow(pAppWindow); + } + } + } + + SvtAccessibilityOptions aAccessibilityOptions; + if( aAccessibilityOptions.GetIsSystemFont() != m_aSystemFont.IsChecked() && + m_aSystemFont.IsEnabled() ) + { + aAccessibilityOptions.SetIsSystemFont( m_aSystemFont.IsChecked() ); + bModified = TRUE; + bMenuOptModified = TRUE; + } + + if( bMenuOptModified ) + { + // Set changed settings to the application instance + AllSettings aAllSettings = Application::GetSettings(); + StyleSettings aStyleSettings = aAllSettings.GetStyleSettings(); + if( m_aSystemFont.IsEnabled() ) + aStyleSettings.SetUseSystemUIFonts( m_aSystemFont.IsChecked() ); + aAllSettings.SetStyleSettings(aStyleSettings); + Application::MergeSystemSettings( aAllSettings ); + Application::SetSettings(aAllSettings); + } + + if ( bAppearanceChanged ) + { + pAppearanceCfg->Commit(); + pAppearanceCfg->SetApplicationDefaults ( GetpApp() ); + } + + return bModified; +} + +/*-----------------06.12.96 11.50------------------- + +--------------------------------------------------*/ +void OfaViewTabPage::Reset( const SfxItemSet& ) +{ + SvtMiscOptions aMiscOptions; + + if( aMiscOptions.GetSymbolsSize() != SFX_SYMBOLS_SIZE_AUTO ) + nSizeLB_InitialSelection = ( aMiscOptions.AreCurrentSymbolsLarge() )? 2 : 1; + aIconSizeLB.SelectEntryPos( nSizeLB_InitialSelection ); + aIconSizeLB.SaveValue(); + + if( aMiscOptions.GetSymbolsStyle() != SFX_SYMBOLS_STYLE_AUTO ) + { + switch ( aMiscOptions.GetCurrentSymbolsStyle() ) + { + case SFX_SYMBOLS_STYLE_DEFAULT: nStyleLB_InitialSelection = 1; break; + case SFX_SYMBOLS_STYLE_HICONTRAST: nStyleLB_InitialSelection = 2; break; + case SFX_SYMBOLS_STYLE_INDUSTRIAL: nStyleLB_InitialSelection = 3; break; + case SFX_SYMBOLS_STYLE_CRYSTAL: nStyleLB_InitialSelection = 4; break; + case SFX_SYMBOLS_STYLE_TANGO: nStyleLB_InitialSelection = 5; break; + case SFX_SYMBOLS_STYLE_CLASSIC: nStyleLB_InitialSelection = 6; break; + default: nStyleLB_InitialSelection = 0; break; + } + } + + aIconStyleLB.SelectEntryPos( nStyleLB_InitialSelection ); + aIconStyleLB.SaveValue(); + + if( m_aSystemFont.IsEnabled() ) + { + SvtAccessibilityOptions aAccessibilityOptions; + m_aSystemFont.Check( aAccessibilityOptions.GetIsSystemFont() ); + } + + // Screen Scaling + aWindowSizeMF.SetValue ( pAppearanceCfg->GetScaleFactor() ); + // Mouse Snap + aMousePosLB.SelectEntryPos(pAppearanceCfg->GetSnapMode()); + aMousePosLB.SaveValue(); + + // Mouse Snap + aMouseMiddleLB.SelectEntryPos(pAppearanceCfg->GetMiddleMouseButton()); + aMouseMiddleLB.SaveValue(); + +#if defined( UNX ) + aFontAntiAliasing.Check( pAppearanceCfg->IsFontAntiAliasing() ); + aAAPointLimit.SetValue( pAppearanceCfg->GetFontAntialiasingMinPixelHeight() ); +#endif + + // WorkingSet + SvtFontOptions aFontOpt; + aFontShowCB.Check( aFontOpt.IsFontWYSIWYGEnabled() ); + SvtMenuOptions aMenuOpt; + aMenuIconsLB.SelectEntryPos(aMenuOpt.GetMenuIconsState() == 2 ? 0 : aMenuOpt.GetMenuIconsState() + 1); + aMenuIconsLB.SaveValue(); + aFontHistoryCB.Check( aFontOpt.IsFontHistoryEnabled() ); + + { // #i95644# HW accel (unified to disable mechanism) + if(pCanvasSettings->IsHardwareAccelerationAvailable()) + { + aUseHardwareAccell.Check(pCanvasSettings->IsHardwareAccelerationEnabled()); + } + else + { + aUseHardwareAccell.Check(false); + aUseHardwareAccell.Disable(); + } + + aUseHardwareAccell.SaveValue(); + } + + { // #i95644# AntiAliasing + if(mpDrawinglayerOpt->IsAAPossibleOnThisSystem()) + { + aUseAntiAliase.Check(mpDrawinglayerOpt->IsAntiAliasing()); + } + else + { + aUseAntiAliase.Check(false); + aUseAntiAliase.Disable(); + } + + aUseAntiAliase.SaveValue(); + } + +#if defined( UNX ) + aFontAntiAliasing.SaveValue(); + aAAPointLimit.SaveValue(); +#endif + aFontShowCB.SaveValue(); + aFontHistoryCB.SaveValue(); + +#if defined( UNX ) + LINK( this, OfaViewTabPage, OnAntialiasingToggled ).Call( NULL ); +#endif +} +/* -----------------------------23.11.00 14:55-------------------------------- + + ---------------------------------------------------------------------------*/ +class LangConfigItem_Impl : public ConfigItem +{ + Any aValue; + OUString aPropertyName; +public: + LangConfigItem_Impl(const OUString& rTree, const OUString& rProperty); + ~LangConfigItem_Impl(); + + virtual void Commit(); + + const Any& GetValue() const {return aValue;} + void SetValue(Any& rValue) {aValue = rValue; SetModified();} +}; +/* -----------------------------23.11.00 15:06-------------------------------- + + ---------------------------------------------------------------------------*/ +LangConfigItem_Impl::LangConfigItem_Impl( + const OUString& rTree, const OUString& rProperty) : + ConfigItem(rTree), + aPropertyName(rProperty) +{ + Sequence<OUString> aNames(1); + aNames.getArray()[0] = aPropertyName; + Sequence<Any> aValues = GetProperties(aNames); + aValue = aValues.getConstArray()[0]; +} +/* -----------------------------23.11.00 15:06-------------------------------- + + ---------------------------------------------------------------------------*/ +LangConfigItem_Impl::~LangConfigItem_Impl() +{} +/* -----------------------------23.11.00 15:10-------------------------------- + + ---------------------------------------------------------------------------*/ +void LangConfigItem_Impl::Commit() +{ + Sequence<OUString> aNames(1); + aNames.getArray()[0] = aPropertyName; + Sequence<Any> aValues(1); + aValues.getArray()[0] = aValue; + PutProperties(aNames, aValues); +} +/* -----------------22.07.2003 10:33----------------- + + --------------------------------------------------*/ +struct LanguageConfig_Impl +{ + SvtLanguageOptions aLanguageOptions; + SvtSysLocaleOptions aSysLocaleOptions; + SvtLinguConfig aLinguConfig; +}; +/* -----------------------------23.11.00 13:06-------------------------------- + + ---------------------------------------------------------------------------*/ +static sal_Bool bLanguageCurrentDoc_Impl = sal_False; + +// some things we'll need... +static const OUString sConfigSrvc = OUString::createFromAscii("com.sun.star.configuration.ConfigurationProvider"); +static const OUString sAccessSrvc = OUString::createFromAscii("com.sun.star.configuration.ConfigurationAccess"); +static const OUString sAccessUpdSrvc = OUString::createFromAscii("com.sun.star.configuration.ConfigurationUpdateAccess"); +static const OUString sInstalledLocalesPath = OUString::createFromAscii("org.openoffice.Setup/Office/InstalledLocales"); +static OUString sUserLocalePath = OUString::createFromAscii("org.openoffice.Office.Linguistic/General"); +//static const OUString sUserLocalePath = OUString::createFromAscii("org.openoffice.Office/Linguistic"); +static const OUString sUserLocaleKey = OUString::createFromAscii("UILocale"); +static const OUString sSystemLocalePath = OUString::createFromAscii("org.openoffice.System/L10N"); +static const OUString sSystemLocaleKey = OUString::createFromAscii("UILocale"); +static const OUString sOfficeLocalePath = OUString::createFromAscii("org.openoffice.Office/L10N"); +static const OUString sOfficeLocaleKey = OUString::createFromAscii("ooLocale"); +static Sequence< OUString > seqInstalledLanguages; + +OfaLanguagesTabPage::OfaLanguagesTabPage( Window* pParent, const SfxItemSet& rSet ) : + SfxTabPage( pParent, SVX_RES( OFA_TP_LANGUAGES ), rSet ), + aUILanguageGB(this, SVX_RES(FL_UI_LANG )), + aLocaleSettingFI(this, SVX_RES(FI_LOCALESETTING)), + aUserInterfaceFT(this, SVX_RES(FT_USERINTERFACE)), + aUserInterfaceLB(this, SVX_RES(LB_USERINTERFACE)), + aLocaleSettingFT(this, SVX_RES(FT_LOCALESETTING)), + aLocaleSettingLB(this, SVX_RES(LB_LOCALESETTING)), + aCurrencyFI( this, SVX_RES(FI_CURRENCY )), + aDecimalSeparatorFT(this, SVX_RES(FT_DECIMALSEPARATOR)), + aDecimalSeparatorCB(this, SVX_RES(CB_DECIMALSEPARATOR)), + aCurrencyFT( this, SVX_RES(FT_CURRENCY )), + aCurrencyLB( this, SVX_RES(LB_CURRENCY )), + aLinguLanguageGB(this, SVX_RES(FL_LINGU_LANG )), + aWesternLanguageFI(this, SVX_RES(FI_WEST_LANG )), + aWesternLanguageFT(this, SVX_RES(FT_WEST_LANG )), + aWesternLanguageLB(this, SVX_RES(LB_WEST_LANG )), + aAsianLanguageFI(this, SVX_RES(FI_ASIAN_LANG )), + aAsianLanguageFT(this, SVX_RES(FT_ASIAN_LANG )), + aAsianLanguageLB(this, SVX_RES(LB_ASIAN_LANG )), + aComplexLanguageFI(this, SVX_RES(FI_COMPLEX_LANG )), + aComplexLanguageFT(this, SVX_RES(FT_COMPLEX_LANG )), + aComplexLanguageLB(this, SVX_RES(LB_COMPLEX_LANG )), + aCurrentDocCB(this, SVX_RES(CB_CURRENT_DOC )), + aEnhancedFL(this, SVX_RES(FL_ENHANCED )), + aAsianSupportFI(this, SVX_RES(FI_ASIANSUPPORT )), + aAsianSupportCB(this, SVX_RES(CB_ASIANSUPPORT )), + aCTLSupportFI(this, SVX_RES(FI_CTLSUPPORT )), + aCTLSupportCB(this, SVX_RES(CB_CTLSUPPORT )), + sDecimalSeparatorLabel(aDecimalSeparatorCB.GetText()), + pLangConfig(new LanguageConfig_Impl) +{ + FreeResource(); + + // initialize user interface language selection + SvtLanguageTable* pLanguageTable = new SvtLanguageTable; + String aStr( pLanguageTable->GetString( LANGUAGE_SYSTEM ) ); + aUserInterfaceLB.InsertEntry(aStr); + aUserInterfaceLB.SetEntryData(0, 0); + aUserInterfaceLB.SelectEntryPos(0); + try + { + OUString sOfficeLocaleValue; + OUString sSystemLocaleValue; + + Reference< XMultiServiceFactory > theMSF = comphelper::getProcessServiceFactory(); + Reference< XMultiServiceFactory > theConfigProvider = Reference< XMultiServiceFactory > ( + theMSF->createInstance( sConfigSrvc ),UNO_QUERY_THROW); + Sequence< Any > theArgs(2); + Reference< XNameAccess > theNameAccess; + + // find out which locales are currently installed and add them to the listbox + theArgs[0] = makeAny(NamedValue(OUString::createFromAscii("NodePath"), makeAny(sInstalledLocalesPath))); + theArgs[1] = makeAny(NamedValue(OUString::createFromAscii("reload"), makeAny(sal_True))); + theNameAccess = Reference< XNameAccess > ( + theConfigProvider->createInstanceWithArguments(sAccessSrvc, theArgs ), UNO_QUERY_THROW ); + seqInstalledLanguages = theNameAccess->getElementNames(); + LanguageType aLang = LANGUAGE_DONTKNOW; + for (sal_Int32 i=0; i<seqInstalledLanguages.getLength(); i++) + { + aLang = MsLangId::convertIsoStringToLanguage(seqInstalledLanguages[i]); + if (aLang != LANGUAGE_DONTKNOW) + { + //USHORT p = aUserInterfaceLB.InsertLanguage(aLang); + String aLangStr( pLanguageTable->GetString( aLang ) ); + USHORT p = aUserInterfaceLB.InsertEntry(aLangStr); + aUserInterfaceLB.SetEntryData(p, (void*)(i+1)); + } + } + + // find out whether the user has a specific locale specified + Sequence< Any > theArgs2(1); + theArgs2[0] = makeAny(NamedValue(OUString::createFromAscii("NodePath"), makeAny(sUserLocalePath))); + theNameAccess = Reference< XNameAccess > ( + theConfigProvider->createInstanceWithArguments(sAccessSrvc, theArgs2 ), UNO_QUERY_THROW ); + if (theNameAccess->hasByName(sUserLocaleKey)) + theNameAccess->getByName(sUserLocaleKey) >>= m_sUserLocaleValue; + // select the user specified locale in the listbox + if (m_sUserLocaleValue.getLength() > 0) + { + sal_Int32 d = 0; + for (USHORT i=0; i < aUserInterfaceLB.GetEntryCount(); i++) + { + d = (sal_Int32)(sal_IntPtr)aUserInterfaceLB.GetEntryData(i); + if ( d > 0 && seqInstalledLanguages.getLength() > d-1 && seqInstalledLanguages[d-1].equals(m_sUserLocaleValue)) + aUserInterfaceLB.SelectEntryPos(i); + } + } + + } + catch (Exception &e) + { + // we'll just leave the box in it's default setting and won't + // even give it event handler... + OString aMsg = OUStringToOString(e.Message, RTL_TEXTENCODING_ASCII_US); + OSL_ENSURE(sal_False, aMsg.getStr()); + } + + aWesternLanguageLB.SetLanguageList( LANG_LIST_WESTERN | LANG_LIST_ONLY_KNOWN, TRUE, FALSE, TRUE ); + aAsianLanguageLB .SetLanguageList( LANG_LIST_CJK | LANG_LIST_ONLY_KNOWN, TRUE, FALSE, TRUE ); + aComplexLanguageLB.SetLanguageList( LANG_LIST_CTL | LANG_LIST_ONLY_KNOWN, TRUE, FALSE, TRUE ); + aLocaleSettingLB .SetLanguageList( LANG_LIST_ALL | LANG_LIST_ONLY_KNOWN, FALSE, FALSE, FALSE); + aLocaleSettingLB.InsertLanguage( LANGUAGE_SYSTEM ); + + // insert SYSTEM entry, no specific currency + aCurrencyLB.InsertEntry( aStr ); + // all currencies + String aTwoSpace( RTL_CONSTASCII_USTRINGPARAM( " " ) ); + const NfCurrencyTable& rCurrTab = SvNumberFormatter::GetTheCurrencyTable(); + USHORT nCurrCount = rCurrTab.Count(); + // first entry is SYSTEM, skip it + for ( USHORT j=1; j < nCurrCount; ++j ) + { + const NfCurrencyEntry* pCurr = rCurrTab[j]; + String aStr_( pCurr->GetBankSymbol() ); + aStr_ += aTwoSpace; + aStr_ += pCurr->GetSymbol(); + aStr = ApplyLreOrRleEmbedding( aStr_ ); + aStr_ += aTwoSpace; + aStr_ += ApplyLreOrRleEmbedding( pLanguageTable->GetString( pCurr->GetLanguage() ) ); + USHORT nPos = aCurrencyLB.InsertEntry( aStr_ ); + aCurrencyLB.SetEntryData( nPos, (void*) pCurr ); + } + delete pLanguageTable; + + aLocaleSettingLB.SetSelectHdl( LINK( this, OfaLanguagesTabPage, LocaleSettingHdl ) ); + Link aLink( LINK( this, OfaLanguagesTabPage, SupportHdl ) ); + aAsianSupportCB.SetClickHdl( aLink ); + aCTLSupportCB.SetClickHdl( aLink ); + + aAsianSupportCB.Check( m_bOldAsian = pLangConfig->aLanguageOptions.IsAnyEnabled() ); + aAsianSupportCB.SaveValue(); + sal_Bool bReadonly = pLangConfig->aLanguageOptions.IsReadOnly(SvtLanguageOptions::E_ALLCJK); + aAsianSupportCB.Enable(!bReadonly); + aAsianSupportFI.Show(bReadonly); + SupportHdl( &aAsianSupportCB ); + + aCTLSupportCB.Check( m_bOldCtl = pLangConfig->aLanguageOptions.IsCTLFontEnabled() ); + aCTLSupportCB.SaveValue(); + bReadonly = pLangConfig->aLanguageOptions.IsReadOnly(SvtLanguageOptions::E_CTLFONT); + aCTLSupportCB.Enable(!bReadonly); + aCTLSupportFI.Show(bReadonly); + SupportHdl( &aCTLSupportCB ); +} +/*-- 23.11.00 13:06:40--------------------------------------------------- + + -----------------------------------------------------------------------*/ +OfaLanguagesTabPage::~OfaLanguagesTabPage() +{ + delete pLangConfig; +} +/*-- 23.11.00 13:06:40--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SfxTabPage* OfaLanguagesTabPage::Create( Window* pParent, const SfxItemSet& rAttrSet ) +{ + return new OfaLanguagesTabPage(pParent, rAttrSet); +} +/*-- 23.11.00 13:06:41--------------------------------------------------- + + -----------------------------------------------------------------------*/ +LanguageType lcl_LangStringToLangType(const OUString& rLang) +{ + Locale aLocale; + sal_Int32 nSep = rLang.indexOf('-'); + if (nSep < 0) + aLocale.Language = rLang; + else + { + aLocale.Language = rLang.copy(0, nSep); + if (nSep < rLang.getLength()) + aLocale.Country = rLang.copy(nSep+1, rLang.getLength() - (nSep+1)); + } + LanguageType eLangType = SvxLocaleToLanguage( aLocale ); + return eLangType; +} + +/*-- 23.11.00 13:06:40--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void lcl_UpdateAndDelete(SfxVoidItem* pInvalidItems[], SfxBoolItem* pBoolItems[], sal_uInt16 nCount) +{ + SfxViewFrame* pCurrentFrm = SfxViewFrame::Current(); + SfxViewFrame* pViewFrm = SfxViewFrame::GetFirst(); + while(pViewFrm) + { + SfxBindings& rBind = pViewFrm->GetBindings(); + for(sal_Int16 i = 0; i < nCount; i++) + { + if(pCurrentFrm == pViewFrm) + rBind.InvalidateAll(sal_False); + rBind.SetState( *pInvalidItems[i] ); + rBind.SetState( *pBoolItems[i] ); + } + pViewFrm = SfxViewFrame::GetNext(*pViewFrm); + } + for(sal_Int16 i = 0; i < nCount; i++) + { + delete pInvalidItems[i]; + delete pBoolItems[i] ; + } +} + +BOOL OfaLanguagesTabPage::FillItemSet( SfxItemSet& rSet ) +{ + if(aCTLSupportCB.IsChecked() && + (aCTLSupportCB.GetSavedValue() != aCTLSupportCB.IsChecked()) || + (aComplexLanguageLB.GetSavedValue() != aComplexLanguageLB.GetSelectEntryPos())) + { + //sequence checking has to be switched on depending on the selected CTL language + LanguageType eCTLLang = aComplexLanguageLB.GetSelectLanguage(); + sal_Bool bOn = MsLangId::needsSequenceChecking( eCTLLang); + pLangConfig->aLanguageOptions.SetCTLSequenceCheckingRestricted(bOn); + pLangConfig->aLanguageOptions.SetCTLSequenceChecking(bOn); + pLangConfig->aLanguageOptions.SetCTLSequenceCheckingTypeAndReplace(bOn); + } + try + { + // handle settings for UI Language + // a change of setting needs to bring up a warning message + OUString aLangString; + sal_Int32 d = (sal_Int32)(sal_IntPtr)aUserInterfaceLB.GetEntryData(aUserInterfaceLB.GetSelectEntryPos()); + if( d > 0 && seqInstalledLanguages.getLength() > d-1) + aLangString = seqInstalledLanguages[d-1]; + + /* + if( aUserInterfaceLB.GetSelectEntryPos() > 0) + aLangString = ConvertLanguageToIsoString(aUserInterfaceLB.GetSelectLanguage()); + */ + Reference< XMultiServiceFactory > theMSF = comphelper::getProcessServiceFactory(); + Reference< XMultiServiceFactory > theConfigProvider = Reference< XMultiServiceFactory > ( + theMSF->createInstance( sConfigSrvc ),UNO_QUERY_THROW); + Sequence< Any > theArgs(1); + theArgs[0] = makeAny(sUserLocalePath); + Reference< XPropertySet >xProp( + theConfigProvider->createInstanceWithArguments(sAccessUpdSrvc, theArgs ), UNO_QUERY_THROW ); + if ( !m_sUserLocaleValue.equals(aLangString)) + { + // OSL_ENSURE(sal_False, "UserInterface language was changed, restart."); + // write new value + xProp->setPropertyValue(sUserLocaleKey, makeAny(aLangString)); + Reference< XChangesBatch >(xProp, UNO_QUERY_THROW)->commitChanges(); + // display info + InfoBox aBox(this, SVX_RES(RID_SVX_MSGBOX_LANGUAGE_RESTART)); + aBox.Execute(); + + // tell quickstarter to stop being a veto listener + + Reference< XInitialization > xInit(theMSF->createInstance( + OUString::createFromAscii("com.sun.star.office.Quickstart")), UNO_QUERY); + if (xInit.is()) + { + Sequence< Any > args(3); + args[0] = makeAny(sal_False); // will be ignored + args[1] = makeAny(sal_False); // will be ignored + args[2] = makeAny(sal_False); // disable veto + xInit->initialize(args); + } + } + } + catch (Exception& e) + { + // we'll just leave the box in it's default setting and won't + // even give it event handler... + OString aMsg = OUStringToOString(e.Message, RTL_TEXTENCODING_ASCII_US); + OSL_ENSURE(sal_False, aMsg.getStr()); + } + + pLangConfig->aSysLocaleOptions.BlockBroadcasts( TRUE ); + + OUString sLang = pLangConfig->aSysLocaleOptions.GetLocaleConfigString(); + LanguageType eOldLocale = (sLang.getLength() ? + lcl_LangStringToLangType( sLang ) : LANGUAGE_SYSTEM); + LanguageType eNewLocale = aLocaleSettingLB.GetSelectLanguage(); + if ( eOldLocale != eNewLocale ) + { + // an empty string denotes SYSTEM locale + OUString sNewLang; + if ( eNewLocale != LANGUAGE_SYSTEM ) + { + Locale aLocale; + SvxLanguageToLocale( aLocale, eNewLocale ); + sNewLang = aLocale.Language; + if ( aLocale.Country.getLength() > 0 ) + { + sNewLang += C2U("-"); + sNewLang += aLocale.Country; + } + } + // Set application settings before options, so listeners at the + // options will access the new locale. + AllSettings aSettings( Application::GetSettings() ); + aSettings.SetLanguage( eNewLocale ); + Application::SetSettings( aSettings ); + pLangConfig->aSysLocaleOptions.SetLocaleConfigString( sNewLang ); + rSet.Put( SfxBoolItem( SID_OPT_LOCALE_CHANGED, TRUE ) ); + } + + // + if(aDecimalSeparatorCB.GetSavedValue() != aDecimalSeparatorCB.IsChecked()) + pLangConfig->aSysLocaleOptions.SetDecimalSeparatorAsLocale(aDecimalSeparatorCB.IsChecked()); + + // Configured currency, for example, USD-en-US or EUR-de-DE, or empty for + // locale default. This must be set _after_ the locale above in order to + // have a valid locale for broadcasting the currency change. + OUString sOldCurr = pLangConfig->aSysLocaleOptions.GetCurrencyConfigString(); + USHORT nCurrPos = aCurrencyLB.GetSelectEntryPos(); + const NfCurrencyEntry* pCurr = (const NfCurrencyEntry*) + aCurrencyLB.GetEntryData( nCurrPos ); + OUString sNewCurr; + if ( pCurr ) + sNewCurr = SvtSysLocaleOptions::CreateCurrencyConfigString( + pCurr->GetBankSymbol(), pCurr->GetLanguage() ); + if ( sOldCurr != sNewCurr ) + pLangConfig->aSysLocaleOptions.SetCurrencyConfigString( sNewCurr ); + + BOOL bRet = FALSE; + SfxObjectShell* pCurrentDocShell = SfxObjectShell::Current(); + Reference< XPropertySet > xLinguProp( LinguMgr::GetLinguPropertySet(), UNO_QUERY ); + BOOL bCurrentDocCBChecked = aCurrentDocCB.IsChecked(); + if(aCurrentDocCB.IsEnabled()) + bLanguageCurrentDoc_Impl = bCurrentDocCBChecked; + BOOL bCurrentDocCBChanged = bCurrentDocCBChecked != aCurrentDocCB.GetSavedValue(); + + BOOL bValChanged = aWesternLanguageLB.GetSavedValue() != aWesternLanguageLB.GetSelectEntryPos(); + if( (bCurrentDocCBChanged && !bCurrentDocCBChecked) || bValChanged) + { + LanguageType eSelectLang = aWesternLanguageLB.GetSelectLanguage(); + if(!bCurrentDocCBChecked) + { + Any aValue; + Locale aLocale = SvxCreateLocale( eSelectLang ); + aValue <<= aLocale; + OUString aPropName( C2U("DefaultLocale") ); + pLangConfig->aLinguConfig.SetProperty( aPropName, aValue ); + if (xLinguProp.is()) + xLinguProp->setPropertyValue( aPropName, aValue ); + } + if(pCurrentDocShell) + { + rSet.Put(SvxLanguageItem(eSelectLang, SID_ATTR_LANGUAGE)); + bRet = TRUE; + } + } + bValChanged = aAsianLanguageLB.GetSavedValue() != aAsianLanguageLB.GetSelectEntryPos(); + if( (bCurrentDocCBChanged && !bCurrentDocCBChecked) || bValChanged) + { + LanguageType eSelectLang = aAsianLanguageLB.GetSelectLanguage(); + if(!bCurrentDocCBChecked) + { + Any aValue; + Locale aLocale = SvxCreateLocale( eSelectLang ); + aValue <<= aLocale; + OUString aPropName( C2U("DefaultLocale_CJK") ); + pLangConfig->aLinguConfig.SetProperty( aPropName, aValue ); + if (xLinguProp.is()) + xLinguProp->setPropertyValue( aPropName, aValue ); + } + if(pCurrentDocShell) + { + rSet.Put(SvxLanguageItem(eSelectLang, SID_ATTR_CHAR_CJK_LANGUAGE)); + bRet = TRUE; + } + } + bValChanged = aComplexLanguageLB.GetSavedValue() != aComplexLanguageLB.GetSelectEntryPos(); + if( (bCurrentDocCBChanged && !bCurrentDocCBChecked) || bValChanged) + { + LanguageType eSelectLang = aComplexLanguageLB.GetSelectLanguage(); + if(!bCurrentDocCBChecked) + { + Any aValue; + Locale aLocale = SvxCreateLocale( eSelectLang ); + aValue <<= aLocale; + OUString aPropName( C2U("DefaultLocale_CTL") ); + pLangConfig->aLinguConfig.SetProperty( aPropName, aValue ); + if (xLinguProp.is()) + xLinguProp->setPropertyValue( aPropName, aValue ); + } + if(pCurrentDocShell) + { + rSet.Put(SvxLanguageItem(eSelectLang, SID_ATTR_CHAR_CTL_LANGUAGE)); + bRet = TRUE; + } + } + + if(aAsianSupportCB.GetSavedValue() != aAsianSupportCB.IsChecked() ) + { + sal_Bool bChecked = aAsianSupportCB.IsChecked(); + pLangConfig->aLanguageOptions.SetAll(bChecked); + //iterate over all bindings to invalidate vertical text direction + + const sal_uInt16 STATE_COUNT = 2; + + SfxBoolItem* pBoolItems[STATE_COUNT]; + pBoolItems[0] = new SfxBoolItem(SID_VERTICALTEXT_STATE, FALSE); + pBoolItems[1] = new SfxBoolItem(SID_TEXT_FITTOSIZE_VERTICAL, FALSE); + + SfxVoidItem* pInvalidItems[STATE_COUNT]; + pInvalidItems[0] = new SfxVoidItem(SID_VERTICALTEXT_STATE); + pInvalidItems[1] = new SfxVoidItem(SID_TEXT_FITTOSIZE_VERTICAL); + + lcl_UpdateAndDelete(pInvalidItems, pBoolItems, STATE_COUNT); + } + + if ( aCTLSupportCB.GetSavedValue() != aCTLSupportCB.IsChecked() ) + { + pLangConfig->aLanguageOptions.SetCTLFontEnabled( aCTLSupportCB.IsChecked() ); + + const sal_uInt16 STATE_COUNT = 1; + SfxBoolItem* pBoolItems[STATE_COUNT]; + pBoolItems[0] = new SfxBoolItem(SID_CTLFONT_STATE, FALSE); + SfxVoidItem* pInvalidItems[STATE_COUNT]; + pInvalidItems[0] = new SfxVoidItem(SID_CTLFONT_STATE); + lcl_UpdateAndDelete(pInvalidItems, pBoolItems, STATE_COUNT); + } + + + + if ( pLangConfig->aSysLocaleOptions.IsModified() ) + pLangConfig->aSysLocaleOptions.Commit(); + pLangConfig->aSysLocaleOptions.BlockBroadcasts( FALSE ); + + return FALSE; +} +//----------------------------------------------------------------------------- +void OfaLanguagesTabPage::Reset( const SfxItemSet& rSet ) +{ + OUString sLang = pLangConfig->aSysLocaleOptions.GetLocaleConfigString(); + if ( sLang.getLength() ) + aLocaleSettingLB.SelectLanguage(lcl_LangStringToLangType(sLang)); + else + aLocaleSettingLB.SelectLanguage( LANGUAGE_SYSTEM ); + sal_Bool bReadonly = pLangConfig->aSysLocaleOptions.IsReadOnly(SvtSysLocaleOptions::E_LOCALE); + aLocaleSettingLB.Enable(!bReadonly); + aLocaleSettingFT.Enable(!bReadonly); + aLocaleSettingFI.Show(bReadonly); + + // + aDecimalSeparatorCB.Check( pLangConfig->aSysLocaleOptions.IsDecimalSeparatorAsLocale()); + aDecimalSeparatorCB.SaveValue(); + + // let LocaleSettingHdl enable/disable checkboxes for CJK/CTL support + // #i15812# must be done *before* the configured currency is set + // and update the decimal separator used for the given locale + LocaleSettingHdl(&aLocaleSettingLB); + + // configured currency, for example, USD-en-US or EUR-de-DE, or empty for locale default + String aAbbrev; + LanguageType eLang; + const NfCurrencyEntry* pCurr = NULL; + sLang = pLangConfig->aSysLocaleOptions.GetCurrencyConfigString(); + if ( sLang.getLength() ) + { + SvtSysLocaleOptions::GetCurrencyAbbrevAndLanguage( aAbbrev, eLang, sLang ); + pCurr = SvNumberFormatter::GetCurrencyEntry( aAbbrev, eLang ); + } + // if pCurr==NULL the SYSTEM entry is selected + USHORT nPos = aCurrencyLB.GetEntryPos( (void*) pCurr ); + aCurrencyLB.SelectEntryPos( nPos ); + bReadonly = pLangConfig->aSysLocaleOptions.IsReadOnly(SvtSysLocaleOptions::E_CURRENCY); + aCurrencyLB.Enable(!bReadonly); + aCurrencyFT.Enable(!bReadonly); + aCurrencyFI.Show(bReadonly); + + //western/CJK/CLK language + LanguageType eCurLang = LANGUAGE_NONE; + LanguageType eCurLangCJK = LANGUAGE_NONE; + LanguageType eCurLangCTL = LANGUAGE_NONE; + SfxObjectShell* pCurrentDocShell = SfxObjectShell::Current(); + //collect the configuration values first + aCurrentDocCB.Enable(FALSE); + // + Any aWestLang; + Any aCJKLang; + Any aCTLLang; + try + { + aWestLang = pLangConfig->aLinguConfig.GetProperty(C2U("DefaultLocale")); + Locale aLocale; + aWestLang >>= aLocale; + eCurLang = SvxLocaleToLanguage( aLocale ); + aCJKLang = pLangConfig->aLinguConfig.GetProperty(C2U("DefaultLocale_CJK")); + aCJKLang >>= aLocale; + eCurLangCJK = SvxLocaleToLanguage( aLocale ); + aCTLLang = pLangConfig->aLinguConfig.GetProperty(C2U("DefaultLocale_CTL")); + aCTLLang >>= aLocale; + eCurLangCTL = SvxLocaleToLanguage( aLocale ); + } + catch(Exception&) + { + } + //overwrite them by the values provided by the DocShell + if(pCurrentDocShell) + { + aCurrentDocCB.Enable(TRUE); + aCurrentDocCB.Check(bLanguageCurrentDoc_Impl); + const SfxPoolItem* pLang; + if( SFX_ITEM_SET == rSet.GetItemState(SID_ATTR_LANGUAGE, FALSE, &pLang)) + eCurLang = ((const SvxLanguageItem*)pLang)->GetValue(); + + if( SFX_ITEM_SET == rSet.GetItemState(SID_ATTR_CHAR_CJK_LANGUAGE, FALSE, &pLang)) + eCurLangCJK = ((const SvxLanguageItem*)pLang)->GetValue(); + + if( SFX_ITEM_SET == rSet.GetItemState(SID_ATTR_CHAR_CTL_LANGUAGE, FALSE, &pLang)) + eCurLangCTL = ((const SvxLanguageItem*)pLang)->GetValue(); + } + if(LANGUAGE_NONE == eCurLang || LANGUAGE_DONTKNOW == eCurLang) + aWesternLanguageLB.SelectLanguage(LANGUAGE_NONE); + else + aWesternLanguageLB.SelectLanguage(eCurLang); + + if(LANGUAGE_NONE == eCurLangCJK || LANGUAGE_DONTKNOW == eCurLangCJK) + aAsianLanguageLB.SelectLanguage(LANGUAGE_NONE); + else + aAsianLanguageLB.SelectLanguage(eCurLangCJK); + + if(LANGUAGE_NONE == eCurLangCTL || LANGUAGE_DONTKNOW == eCurLangCTL) + aComplexLanguageLB.SelectLanguage(LANGUAGE_NONE); + else + aComplexLanguageLB.SelectLanguage(eCurLangCTL); + + aWesternLanguageLB.SaveValue(); + aAsianLanguageLB.SaveValue(); + aComplexLanguageLB.SaveValue(); + aCurrentDocCB.SaveValue(); + + sal_Bool bEnable = !pLangConfig->aLinguConfig.IsReadOnly( C2U("DefaultLocale") ); + aWesternLanguageFT.Enable( bEnable ); + aWesternLanguageLB.Enable( bEnable ); + + + aWesternLanguageFI.Show(!bEnable); + + // #i15812# controls for CJK/CTL already enabled/disabled from LocaleSettingHdl +#if 0 + bEnable = ( !pLangConfig->aLinguConfig.IsReadOnly( C2U("DefaultLocale_CJK") ) && aAsianSupportCB.IsChecked() ); + aAsianLanguageFT.Enable( bEnable ); + aAsianLanguageLB.Enable( bEnable ); + + bEnable = ( !pLangConfig->aLinguConfig.IsReadOnly( C2U("DefaultLocale_CTL") ) && aCTLSupportCB.IsChecked() ); + aComplexLanguageFT.Enable( bEnable ); + aComplexLanguageLB.Enable( bEnable ); +#endif + /*---------------------07-05-07-------------------------- + check the box "For the current document only" + set the focus to the Western Language box + --------------------------------------------------------*/ + const SfxPoolItem* pLang = 0; + if ( SFX_ITEM_SET == rSet.GetItemState(SID_SET_DOCUMENT_LANGUAGE, FALSE, &pLang ) &&( (const SfxBoolItem*)pLang)->GetValue() == TRUE ) + { + aWesternLanguageLB.GrabFocus(); + aCurrentDocCB.Enable(TRUE); + aCurrentDocCB.Check(TRUE); + } +} +/* -----------------------------20.04.01 15:09-------------------------------- + + ---------------------------------------------------------------------------*/ +IMPL_LINK( OfaLanguagesTabPage, SupportHdl, CheckBox*, pBox ) +{ + DBG_ASSERT( pBox, "OfaLanguagesTabPage::SupportHdl(): pBox invalid" ); + + sal_Bool bCheck = pBox->IsChecked(); + if ( &aAsianSupportCB == pBox ) + { + sal_Bool bReadonly = pLangConfig->aLinguConfig.IsReadOnly( C2U("DefaultLocale_CJK")); + bCheck = ( bCheck && !bReadonly ); + aAsianLanguageFT.Enable( bCheck ); + aAsianLanguageLB.Enable( bCheck ); + aAsianLanguageFI.Show(bReadonly); + if( pBox->IsEnabled() ) + m_bOldAsian = bCheck; + } + else if ( &aCTLSupportCB == pBox ) + { + sal_Bool bReadonly = pLangConfig->aLinguConfig.IsReadOnly( C2U("DefaultLocale_CTL")); + bCheck = ( bCheck && !bReadonly ); + aComplexLanguageFT.Enable( bCheck ); + aComplexLanguageLB.Enable( bCheck ); + aComplexLanguageFI.Show(bReadonly); + if( pBox->IsEnabled() ) + m_bOldCtl = bCheck; + } + else + { + DBG_ERRORFILE( "OfaLanguagesTabPage::SupportHdl(): wrong pBox" ); + } + + return 0; +} + +namespace +{ + void lcl_checkLanguageCheckBox(CheckBox& _rCB,sal_Bool _bNewValue,sal_Bool _bOldValue) + { + if ( _bNewValue ) + _rCB.Check(TRUE); + else + _rCB.Check( _bOldValue ); +// #i15082# do not call SaveValue() in running dialog... +// _rCB.SaveValue(); + _rCB.Enable( !_bNewValue ); + } +} +/* -----------------08.06.01 17:56------------------- + + --------------------------------------------------*/ +IMPL_LINK( OfaLanguagesTabPage, LocaleSettingHdl, SvxLanguageBox*, pBox ) +{ + LanguageType eLang = pBox->GetSelectLanguage(); + sal_uInt16 nType = SvtLanguageOptions::GetScriptTypeOfLanguage(eLang); + // first check if CTL must be enabled + // #103299# - if CTL font setting is not readonly + if(!pLangConfig->aLanguageOptions.IsReadOnly(SvtLanguageOptions::E_CTLFONT)) + { + bool bIsCTLFixed = (nType & SCRIPTTYPE_COMPLEX) != 0; + lcl_checkLanguageCheckBox(aCTLSupportCB, bIsCTLFixed, m_bOldCtl); + SupportHdl( &aCTLSupportCB ); + } + // second check if CJK must be enabled + // #103299# - if CJK support is not readonly + if(!pLangConfig->aLanguageOptions.IsReadOnly(SvtLanguageOptions::E_ALLCJK)) + { + bool bIsCJKFixed = (nType & SCRIPTTYPE_ASIAN) != 0; + lcl_checkLanguageCheckBox(aAsianSupportCB, bIsCJKFixed, m_bOldAsian); + SupportHdl( &aAsianSupportCB ); + } + + USHORT nPos; + if ( eLang == LANGUAGE_SYSTEM ) + nPos = aCurrencyLB.GetEntryPos( (void*) NULL ); + else + { + const NfCurrencyEntry* pCurr = &SvNumberFormatter::GetCurrencyEntry( eLang ); + nPos = aCurrencyLB.GetEntryPos( (void*) pCurr ); + } + aCurrencyLB.SelectEntryPos( nPos ); + + //update the decimal separator key of the related CheckBox + Locale aTempLocale; + SvxLanguageToLocale( aTempLocale, eLang ); + LocaleDataWrapper aLocaleWrapper( ::comphelper::getProcessServiceFactory(), aTempLocale ); + String sTempLabel(sDecimalSeparatorLabel); + sTempLabel.SearchAndReplaceAscii("%1", aLocaleWrapper.getNumDecimalSep() ); + aDecimalSeparatorCB.SetText(sTempLabel); + + return 0; +} + |