diff options
Diffstat (limited to 'cui/source/options/optasian.cxx')
-rw-r--r-- | cui/source/options/optasian.cxx | 467 |
1 files changed, 467 insertions, 0 deletions
diff --git a/cui/source/options/optasian.cxx b/cui/source/options/optasian.cxx new file mode 100644 index 000000000000..fb4c6e2e1352 --- /dev/null +++ b/cui/source/options/optasian.cxx @@ -0,0 +1,467 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * 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_cui.hxx" + +#include <optasian.hxx> +#include <editeng/langitem.hxx> +#include <editeng/unolingu.hxx> +#include <optasian.hrc> +#include <dialmgr.hxx> +#include <cuires.hrc> +#include <tools/table.hxx> +#include <tools/shl.hxx> +#include <svl/asiancfg.hxx> +#include <com/sun/star/lang/Locale.hpp> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/i18n/XForbiddenCharacters.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <sfx2/viewfrm.hxx> +#include <sfx2/objsh.hxx> +#include <vcl/svapp.hxx> +#include <comphelper/processfactory.hxx> +#include <unotools/localedatawrapper.hxx> + +using namespace com::sun::star::uno; +using namespace com::sun::star::lang; +using namespace com::sun::star::i18n; +using namespace com::sun::star::frame; +using namespace com::sun::star::beans; +using rtl::OUString; + +#define C2U(cChar) rtl::OUString::createFromAscii(cChar) + +const sal_Char cIsKernAsianPunctuation[] = "IsKernAsianPunctuation"; +const sal_Char cCharacterCompressionType[] = "CharacterCompressionType"; + +struct SvxForbiddenChars_Impl +{ + sal_Bool bRemoved; + ForbiddenCharacters* pCharacters; +}; + +DECLARE_TABLE( _SvxForbiddenCharacterTable_Impl, SvxForbiddenChars_Impl* ) + +class SvxForbiddenCharacterTable_Impl : public _SvxForbiddenCharacterTable_Impl +{ +public: + SvxForbiddenCharacterTable_Impl() + : _SvxForbiddenCharacterTable_Impl( 4, 4 ) + {} + ~SvxForbiddenCharacterTable_Impl(); +}; + +struct SvxAsianLayoutPage_Impl +{ + SvxAsianConfig aConfig; + SvxAsianLayoutPage_Impl() : + aConfig(sal_False){} + + Reference< XForbiddenCharacters > xForbidden; + Reference< XPropertySet > xPrSet; + Reference< XPropertySetInfo > xPrSetInfo; + SvxForbiddenCharacterTable_Impl aChangedLanguagesTbl; + + sal_Bool hasForbiddenCharacters(LanguageType eLang); + SvxForbiddenChars_Impl* getForbiddenCharacters(LanguageType eLang); + void addForbiddenCharacters(LanguageType eLang, ForbiddenCharacters* pForbidden); +}; +/* -----------------------------24.01.01 14:50-------------------------------- + + ---------------------------------------------------------------------------*/ +SvxForbiddenCharacterTable_Impl::~SvxForbiddenCharacterTable_Impl() +{ + for( SvxForbiddenChars_Impl* pDel = First(); pDel; pDel = Next() ) + { + delete pDel->pCharacters; + delete pDel; + } +} +/* -----------------------------24.01.01 14:50-------------------------------- + + ---------------------------------------------------------------------------*/ +sal_Bool SvxAsianLayoutPage_Impl::hasForbiddenCharacters(LanguageType eLang) +{ + return 0 != aChangedLanguagesTbl.Get(eLang); +} +/* -----------------------------24.01.01 14:50-------------------------------- + + ---------------------------------------------------------------------------*/ +SvxForbiddenChars_Impl* SvxAsianLayoutPage_Impl::getForbiddenCharacters(LanguageType eLang) +{ + SvxForbiddenChars_Impl* pImp = aChangedLanguagesTbl.Get(eLang); + DBG_ASSERT(pImp, "language not available"); + if(pImp) + return pImp; + return 0; +} +/* -----------------------------24.01.01 14:50-------------------------------- + + ---------------------------------------------------------------------------*/ +void SvxAsianLayoutPage_Impl::addForbiddenCharacters( + LanguageType eLang, ForbiddenCharacters* pForbidden) +{ + SvxForbiddenChars_Impl* pOld = aChangedLanguagesTbl.Get(eLang); + if( !pOld ) + { + pOld = new SvxForbiddenChars_Impl; + pOld->bRemoved = 0 == pForbidden; + pOld->pCharacters = pForbidden ? new ForbiddenCharacters(*pForbidden) : 0; + aChangedLanguagesTbl.Insert( eLang, pOld ); + } + else + { + pOld->bRemoved = 0 == pForbidden; + delete pOld->pCharacters; + pOld->pCharacters = pForbidden ? new ForbiddenCharacters(*pForbidden) : 0; + } + +} +/*-- 09.01.01 13:29:02--------------------------------------------------- + + -----------------------------------------------------------------------*/ +static LanguageType eLastUsedLanguageTypeForForbiddenCharacters = USHRT_MAX; + +SvxAsianLayoutPage::SvxAsianLayoutPage( Window* pParent, const SfxItemSet& rSet ) : + SfxTabPage(pParent, CUI_RES( RID_SVXPAGE_ASIAN_LAYOUT ), rSet), + aKerningGB( this, CUI_RES(GB_KERNING )), + aCharKerningRB( this, CUI_RES(RB_CHAR_KERNING )), + aCharPunctKerningRB( this, CUI_RES(RB_CHAR_PUNCT )), + aCharDistGB( this, CUI_RES(GB_CHAR_DIST )), + aNoCompressionRB( this, CUI_RES(RB_NO_COMP )), + aPunctCompressionRB( this, CUI_RES(RB_PUNCT_COMP )), + aPunctKanaCompressionRB(this, CUI_RES(RB_PUNCT_KANA_COMP )), + aStartEndGB( this, CUI_RES(GB_START_END )), + aLanguageFT( this, CUI_RES(FT_LANGUAGE )), + aLanguageLB( this, CUI_RES(LB_LANGUAGE )), + aStandardCB( this, CUI_RES(CB_STANDARD )), + aStartFT( this, CUI_RES(FT_START )), + aStartED( this, CUI_RES(ED_START )), + aEndFT( this, CUI_RES(FT_END )), + aEndED( this, CUI_RES(ED_END )), + aHintFT( this, CUI_RES(FT_HINT )), + pImpl(new SvxAsianLayoutPage_Impl) +{ + FreeResource(); + LanguageHdl(&aLanguageLB); + aLanguageLB.SetSelectHdl(LINK(this, SvxAsianLayoutPage, LanguageHdl)); + aStandardCB.SetClickHdl(LINK(this, SvxAsianLayoutPage, ChangeStandardHdl)); + Link aLk(LINK(this, SvxAsianLayoutPage, ModifyHdl)); + aStartED.SetModifyHdl(aLk); + aEndED.SetModifyHdl(aLk); + + aLanguageLB.SetLanguageList( LANG_LIST_FBD_CHARS, sal_False, sal_False ); +} +/*-- 09.01.01 13:29:02--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SvxAsianLayoutPage::~SvxAsianLayoutPage() +{ + delete pImpl; +} +/*-- 09.01.01 13:29:02--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SfxTabPage* SvxAsianLayoutPage::Create( Window* pParent, const SfxItemSet& rAttrSet ) +{ + return new SvxAsianLayoutPage(pParent, rAttrSet); +} +/*-- 09.01.01 13:29:03--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool SvxAsianLayoutPage::FillItemSet( SfxItemSet& ) +{ + if(aCharKerningRB.IsChecked() != aCharKerningRB.GetSavedValue()) + { + pImpl->aConfig.SetKerningWesternTextOnly(aCharKerningRB.IsChecked()); + OUString sPunct(C2U(cIsKernAsianPunctuation)); + if(pImpl->xPrSetInfo.is() && pImpl->xPrSetInfo->hasPropertyByName(sPunct)) + { + Any aVal; + sal_Bool bVal = !aCharKerningRB.IsChecked(); + aVal.setValue(&bVal, ::getBooleanCppuType()); + pImpl->xPrSet->setPropertyValue(sPunct, aVal); + } + } + + if(aNoCompressionRB.IsChecked() != aNoCompressionRB.GetSavedValue() || + aPunctCompressionRB.IsChecked() != aPunctCompressionRB.GetSavedValue()) + { + sal_Int16 nSet = aNoCompressionRB.IsChecked() ? 0 : + aPunctCompressionRB.IsChecked() ? 1 : 2; + pImpl->aConfig.SetCharDistanceCompression(nSet); + OUString sCompress(C2U(cCharacterCompressionType)); + if(pImpl->xPrSetInfo.is() && pImpl->xPrSetInfo->hasPropertyByName(sCompress)) + { + Any aVal; + aVal <<= nSet; + pImpl->xPrSet->setPropertyValue(sCompress, aVal); + } + } + if(pImpl->aConfig.IsModified()) + pImpl->aConfig.Commit(); + if(pImpl->xForbidden.is()) + { + try + { + for( SvxForbiddenChars_Impl* pElem = pImpl->aChangedLanguagesTbl.First(); + pElem; pElem = pImpl->aChangedLanguagesTbl.Next() ) + { + sal_uLong nLang = pImpl->aChangedLanguagesTbl.GetKey( pElem ); + Locale aLocale; + SvxLanguageToLocale(aLocale, (sal_uInt16)nLang ); + if(pElem->bRemoved) + pImpl->xForbidden->removeForbiddenCharacters( aLocale ); + else if(pElem->pCharacters) + pImpl->xForbidden->setForbiddenCharacters( aLocale, *pElem->pCharacters ); + } + } + catch(Exception&) + { + DBG_ERROR("exception in XForbiddenCharacters"); + } + } + eLastUsedLanguageTypeForForbiddenCharacters = aLanguageLB.GetSelectLanguage(); + + return sal_False; +} +/*-- 09.01.01 13:29:03--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SvxAsianLayoutPage::Reset( const SfxItemSet& ) +{ + SfxViewFrame* pCurFrm = SfxViewFrame::Current(); + SfxObjectShell* pDocSh = pCurFrm ? pCurFrm->GetObjectShell() : 0; + Reference< XModel > xModel; + if(pDocSh) + xModel = pDocSh->GetModel(); + Reference<XMultiServiceFactory> xFact(xModel, UNO_QUERY); + if(xFact.is()) + { + pImpl->xPrSet = Reference<XPropertySet>( + xFact->createInstance(C2U("com.sun.star.document.Settings")), UNO_QUERY); + } + if( pImpl->xPrSet.is() ) + pImpl->xPrSetInfo = pImpl->xPrSet->getPropertySetInfo(); + OUString sForbidden(C2U("ForbiddenCharacters")); + sal_Bool bKernWesternText = pImpl->aConfig.IsKerningWesternTextOnly(); + sal_Int16 nCompress = pImpl->aConfig.GetCharDistanceCompression(); + if(pImpl->xPrSetInfo.is()) + { + if(pImpl->xPrSetInfo->hasPropertyByName(sForbidden)) + { + Any aForbidden = pImpl->xPrSet->getPropertyValue(sForbidden); + aForbidden >>= pImpl->xForbidden; + } + OUString sCompress(C2U(cCharacterCompressionType)); + if(pImpl->xPrSetInfo->hasPropertyByName(sCompress)) + { + Any aVal = pImpl->xPrSet->getPropertyValue(sCompress); + aVal >>= nCompress; + } + OUString sPunct(C2U(cIsKernAsianPunctuation)); + if(pImpl->xPrSetInfo->hasPropertyByName(sPunct)) + { + Any aVal = pImpl->xPrSet->getPropertyValue(sPunct); + bKernWesternText = !*(sal_Bool*)aVal.getValue(); + } + } + else + { + aStartEndGB.Enable(sal_False); + aLanguageFT.Enable(sal_False); + aLanguageLB.Enable(sal_False); + aStandardCB.Enable(sal_False); + aStartFT.Enable(sal_False); + aStartED.Enable(sal_False); + aEndFT.Enable(sal_False); + aEndED.Enable(sal_False); + aHintFT.Enable(sal_False); + } + if(bKernWesternText) + aCharKerningRB.Check(sal_True); + else + aCharPunctKerningRB.Check(sal_True); + switch(nCompress) + { + case 0 : aNoCompressionRB.Check(); break; + case 1 : aPunctCompressionRB.Check(); break; + default: aPunctKanaCompressionRB.Check(); + } + aCharKerningRB.SaveValue(); + aNoCompressionRB.SaveValue(); + aPunctCompressionRB.SaveValue(); + aPunctKanaCompressionRB.SaveValue(); + + aLanguageLB.SelectEntryPos(0); + //preselect the system language in the box - if available + if(USHRT_MAX == eLastUsedLanguageTypeForForbiddenCharacters) + { + eLastUsedLanguageTypeForForbiddenCharacters = SvxLocaleToLanguage( + Application::GetSettings().GetLocale() ); + switch(eLastUsedLanguageTypeForForbiddenCharacters) + { + case LANGUAGE_CHINESE : + case LANGUAGE_CHINESE_SINGAPORE : + eLastUsedLanguageTypeForForbiddenCharacters = LANGUAGE_CHINESE_SIMPLIFIED; + break; + case LANGUAGE_CHINESE_HONGKONG : + case LANGUAGE_CHINESE_MACAU : + eLastUsedLanguageTypeForForbiddenCharacters = LANGUAGE_CHINESE_TRADITIONAL; + break; + } + } + aLanguageLB.SelectLanguage( eLastUsedLanguageTypeForForbiddenCharacters ); + LanguageHdl(&aLanguageLB); +} +/* -----------------------------17.01.01 11:02-------------------------------- + + ---------------------------------------------------------------------------*/ +IMPL_LINK(SvxAsianLayoutPage, LanguageHdl, SvxLanguageBox*, EMPTYARG ) +{ + //set current value + Locale aLocale; + LanguageType eSelectLanguage = aLanguageLB.GetSelectLanguage(); + SvxLanguageToLocale(aLocale, eSelectLanguage ); + + OUString sStart, sEnd; + sal_Bool bAvail; + if(pImpl->xForbidden.is()) + { + bAvail = pImpl->hasForbiddenCharacters(eSelectLanguage); + if(bAvail) + { + SvxForbiddenChars_Impl* pElement = pImpl->getForbiddenCharacters(eSelectLanguage); + if(pElement->bRemoved || !pElement->pCharacters) + { + bAvail = sal_False; + } + else + { + sStart = pElement->pCharacters->beginLine; + sEnd = pElement->pCharacters->endLine; + } + } + else + { + try + { + bAvail = pImpl->xForbidden->hasForbiddenCharacters(aLocale); + if(bAvail) + { + ForbiddenCharacters aForbidden = pImpl->xForbidden->getForbiddenCharacters( aLocale ); + sStart = aForbidden.beginLine; + sEnd = aForbidden.endLine; + } + } + catch(Exception&) + { + DBG_ERROR("exception in XForbiddenCharacters"); + } + } + } + else + { + bAvail = pImpl->aConfig.GetStartEndChars( aLocale, sStart, sEnd ); + } + if(!bAvail) + { + Reference< XMultiServiceFactory > xMSF = ::comphelper::getProcessServiceFactory(); + LocaleDataWrapper aWrap( xMSF, aLocale ); + ForbiddenCharacters aForbidden = aWrap.getForbiddenCharacters(); + sStart = aForbidden.beginLine; + sEnd = aForbidden.endLine; + } + aStandardCB.Check(!bAvail); + aStartED.Enable(bAvail); + aEndED.Enable(bAvail); + aStartFT.Enable(bAvail); + aEndFT.Enable(bAvail); + aStartED.SetText(sStart); + aEndED.SetText(sEnd); + + return 0; +} +/* -----------------------------17.01.01 11:02-------------------------------- + + ---------------------------------------------------------------------------*/ +IMPL_LINK(SvxAsianLayoutPage, ChangeStandardHdl, CheckBox*, pBox) +{ + sal_Bool bCheck = pBox->IsChecked(); + aStartED.Enable(!bCheck); + aEndED.Enable(!bCheck); + aStartFT.Enable(!bCheck); + aEndFT.Enable(!bCheck); + + ModifyHdl(&aStartED); + return 0; +} +/* -----------------------------17.01.01 12:26-------------------------------- + + ---------------------------------------------------------------------------*/ +IMPL_LINK(SvxAsianLayoutPage, ModifyHdl, Edit*, pEdit) +{ + Locale aLocale; + LanguageType eSelectLanguage = aLanguageLB.GetSelectLanguage(); + SvxLanguageToLocale(aLocale, eSelectLanguage ); + OUString sStart = aStartED.GetText(); + OUString sEnd = aEndED.GetText(); + sal_Bool bEnable = pEdit->IsEnabled(); + if(pImpl->xForbidden.is()) + { + try + { + if(bEnable) + { + ForbiddenCharacters aSet; + aSet.beginLine = sStart; + aSet.endLine = sEnd; +// pImpl->xForbidden->setForbiddenCharacters( aLocale, aSet ); + pImpl->addForbiddenCharacters(eSelectLanguage, &aSet); + } + else + pImpl->addForbiddenCharacters(eSelectLanguage, 0); +// pImpl->xForbidden->removeForbiddenCharacters( aLocale ); + } + catch(Exception&) + { + DBG_ERROR("exception in XForbiddenCharacters"); + } + } + pImpl->aConfig.SetStartEndChars( aLocale, bEnable ? &sStart : 0, bEnable ? &sEnd : 0); + return 0; +} +/*-- 07.09.2007 12:05:09--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_uInt16* SvxAsianLayoutPage::GetRanges() +{ + //no items are used + static sal_uInt16 pAsianLayoutRanges[] = { 0 }; + return pAsianLayoutRanges; +} |