/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include class SfxRequest; using namespace ::com::sun::star; using namespace ::com::sun::star::beans; using namespace ::com::sun::star::uno; namespace sd { FuHangulHanjaConversion::FuHangulHanjaConversion ( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDocument, SfxRequest& rReq ) : FuPoor(pViewSh, pWin, pView, pDocument, rReq), pSdOutliner(nullptr), bOwnOutliner(false) { if ( dynamic_cast< const DrawViewShell *>( mpViewShell ) != nullptr ) { bOwnOutliner = true; pSdOutliner = new SdOutliner( mpDoc, OutlinerMode::TextObject ); } else if ( dynamic_cast< const OutlineViewShell *>( mpViewShell ) != nullptr ) { bOwnOutliner = false; pSdOutliner = mpDoc->GetOutliner(); } if (pSdOutliner) pSdOutliner->PrepareSpelling(); } FuHangulHanjaConversion::~FuHangulHanjaConversion() { if (pSdOutliner) pSdOutliner->EndConversion(); if (bOwnOutliner) delete pSdOutliner; } rtl::Reference FuHangulHanjaConversion::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) { rtl::Reference xFunc( new FuHangulHanjaConversion( pViewSh, pWin, pView, pDoc, rReq ) ); return xFunc; } /** * Search and replace */ void FuHangulHanjaConversion::StartConversion( LanguageType nSourceLanguage, LanguageType nTargetLanguage, const vcl::Font *pTargetFont, sal_Int32 nOptions, bool bIsInteractive ) { mpView->BegUndo(SdResId(STR_UNDO_HANGULHANJACONVERSION)); ViewShellBase* pBase = dynamic_cast( SfxViewShell::Current() ); if (pBase != nullptr) mpViewShell = pBase->GetMainViewShell().get(); if( mpViewShell ) { if ( pSdOutliner && dynamic_cast< const DrawViewShell *>( mpViewShell ) != nullptr && !bOwnOutliner ) { pSdOutliner->EndConversion(); bOwnOutliner = true; pSdOutliner = new SdOutliner( mpDoc, OutlinerMode::TextObject ); pSdOutliner->BeginConversion(); } else if ( pSdOutliner && dynamic_cast< const OutlineViewShell *>( mpViewShell ) != nullptr && bOwnOutliner ) { pSdOutliner->EndConversion(); delete pSdOutliner; bOwnOutliner = false; pSdOutliner = mpDoc->GetOutliner(); pSdOutliner->BeginConversion(); } if (pSdOutliner) pSdOutliner->StartConversion(nSourceLanguage, nTargetLanguage, pTargetFont, nOptions, bIsInteractive ); } // Due to changing between edit mode, notes mode, and handout mode the // view has most likely changed. Get the new one. mpViewShell = pBase ? pBase->GetMainViewShell().get() : nullptr; if (mpViewShell != nullptr) { mpView = mpViewShell->GetView(); mpWindow = mpViewShell->GetActiveWindow(); } else { mpView = nullptr; mpWindow = nullptr; } if (mpView != nullptr) mpView->EndUndo(); } void FuHangulHanjaConversion::ConvertStyles( LanguageType nTargetLanguage, const vcl::Font *pTargetFont ) { if( !mpDoc ) return; SfxStyleSheetBasePool* pStyleSheetPool = mpDoc->GetStyleSheetPool(); if( !pStyleSheetPool ) return; SfxStyleSheetBase* pStyle = pStyleSheetPool->First(); while( pStyle ) { SfxItemSet& rSet = pStyle->GetItemSet(); const bool bHasParent = !pStyle->GetParent().isEmpty(); if( !bHasParent || rSet.GetItemState( EE_CHAR_LANGUAGE_CJK, false ) == SfxItemState::SET ) rSet.Put( SvxLanguageItem( nTargetLanguage, EE_CHAR_LANGUAGE_CJK ) ); if( pTargetFont && ( !bHasParent || rSet.GetItemState( EE_CHAR_FONTINFO_CJK, false ) == SfxItemState::SET ) ) { // set new font attribute SvxFontItem aFontItem( rSet.Get( EE_CHAR_FONTINFO_CJK ) ); aFontItem.SetFamilyName( pTargetFont->GetFamilyName()); aFontItem.SetFamily( pTargetFont->GetFamilyType()); aFontItem.SetStyleName( pTargetFont->GetStyleName()); aFontItem.SetPitch( pTargetFont->GetPitch()); aFontItem.SetCharSet( pTargetFont->GetCharSet()); rSet.Put( aFontItem ); } pStyle = pStyleSheetPool->Next(); } mpDoc->SetLanguage( nTargetLanguage, EE_CHAR_LANGUAGE_CJK ); } void FuHangulHanjaConversion::StartChineseConversion() { //open ChineseTranslationDialog Reference< XComponentContext > xContext( ::cppu::defaultBootstrap_InitialComponentContext() ); //@todo get context from calc if that has one if(!xContext.is()) return; Reference< lang::XMultiComponentFactory > xMCF( xContext->getServiceManager() ); if(!xMCF.is()) return; Reference< ui::dialogs::XExecutableDialog > xDialog( xMCF->createInstanceWithContext("com.sun.star.linguistic2.ChineseTranslationDialog" , xContext), UNO_QUERY); Reference< lang::XInitialization > xInit( xDialog, UNO_QUERY ); if( xInit.is() ) { // initialize dialog Reference< awt::XWindow > xDialogParentWindow; Sequence aSeq(comphelper::InitAnyPropertySequence( { {"ParentWindow", uno::Any(xDialogParentWindow)} })); xInit->initialize( aSeq ); //execute dialog sal_Int16 nDialogRet = xDialog->execute(); if( RET_OK == nDialogRet ) { //get some parameters from the dialog bool bToSimplified = true; bool bUseVariants = true; bool bCommonTerms = true; Reference< beans::XPropertySet > xProp( xDialog, UNO_QUERY ); if( xProp.is() ) { try { xProp->getPropertyValue( "IsDirectionToSimplified" ) >>= bToSimplified; xProp->getPropertyValue( "IsUseCharacterVariants" ) >>= bUseVariants; xProp->getPropertyValue( "IsTranslateCommonTerms" ) >>= bCommonTerms; } catch( Exception& ) { } } //execute translation LanguageType nSourceLang = bToSimplified ? LANGUAGE_CHINESE_TRADITIONAL : LANGUAGE_CHINESE_SIMPLIFIED; LanguageType nTargetLang = bToSimplified ? LANGUAGE_CHINESE_SIMPLIFIED : LANGUAGE_CHINESE_TRADITIONAL; sal_Int32 nOptions = bUseVariants ? i18n::TextConversionOption::USE_CHARACTER_VARIANTS : 0; if( !bCommonTerms ) nOptions = nOptions | i18n::TextConversionOption::CHARACTER_BY_CHARACTER; vcl::Font aTargetFont = OutputDevice::GetDefaultFont( DefaultFontType::CJK_PRESENTATION, nTargetLang, GetDefaultFontFlags::OnlyOne ); StartConversion( nSourceLang, nTargetLang, &aTargetFont, nOptions, false ); ConvertStyles( nTargetLang, &aTargetFont ); } } Reference< lang::XComponent > xComponent( xDialog, UNO_QUERY ); if( xComponent.is() ) xComponent->dispose(); } } // end of namespace /* vim:set shiftwidth=4 softtabstop=4 expandtab: */