xref: /trunk/main/sd/source/ui/func/fuhhconv.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sd.hxx"
30 #include <com/sun/star/i18n/TextConversionOption.hpp>
31 
32 #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
33 #include <com/sun/star/lang/XInitialization.hpp>
34 #include <com/sun/star/beans/PropertyValue.hpp>
35 #include <com/sun/star/beans/XPropertySet.hpp>
36 #include <cppuhelper/bootstrap.hxx>
37 #include <vcl/msgbox.hxx>
38 #include <svl/style.hxx>
39 #include <editeng/eeitem.hxx>
40 #include <editeng/langitem.hxx>
41 #include <editeng/fontitem.hxx>
42 
43 #include <fuhhconv.hxx>
44 #include "drawdoc.hxx"
45 #include "Outliner.hxx"
46 #include "DrawViewShell.hxx"
47 #include "OutlineViewShell.hxx"
48 #include "Window.hxx"
49 #include "ViewShellBase.hxx"
50 
51 #include "sdresid.hxx"
52 #include "strings.hrc"
53 
54 class SfxRequest;
55 
56 #define C2U(cChar)  rtl::OUString::createFromAscii(cChar)
57 
58 using namespace ::com::sun::star;
59 using namespace ::com::sun::star::beans;
60 using namespace ::com::sun::star::uno;
61 
62 namespace sd {
63 
64 class ViewShell;
65 
66 TYPEINIT1( FuHangulHanjaConversion, FuPoor );
67 
68 /*************************************************************************
69 |*
70 |* Konstruktor
71 |*
72 \************************************************************************/
73 
74 FuHangulHanjaConversion::FuHangulHanjaConversion (
75     ViewShell* pViewSh,
76     ::sd::Window* pWin,
77     ::sd::View* pView,
78     SdDrawDocument* pDocument,
79     SfxRequest& rReq )
80        : FuPoor(pViewSh, pWin, pView, pDocument, rReq),
81     pSdOutliner(NULL),
82     bOwnOutliner(sal_False)
83 {
84     if ( mpViewShell->ISA(DrawViewShell) )
85     {
86         bOwnOutliner = sal_True;
87         pSdOutliner = new Outliner( mpDoc, OUTLINERMODE_TEXTOBJECT );
88     }
89     else if ( mpViewShell->ISA(OutlineViewShell) )
90     {
91         bOwnOutliner = sal_False;
92         pSdOutliner = mpDoc->GetOutliner();
93     }
94 
95     if (pSdOutliner)
96        pSdOutliner->PrepareSpelling();
97 }
98 
99 
100 
101 /*************************************************************************
102 |*
103 |* Destruktor
104 |*
105 \************************************************************************/
106 
107 FuHangulHanjaConversion::~FuHangulHanjaConversion()
108 {
109     if (pSdOutliner)
110         pSdOutliner->EndConversion();
111 
112     if (bOwnOutliner)
113         delete pSdOutliner;
114 }
115 
116 FunctionReference FuHangulHanjaConversion::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
117 {
118     FunctionReference xFunc( new FuHangulHanjaConversion( pViewSh, pWin, pView, pDoc, rReq ) );
119     return xFunc;
120 }
121 
122 /*************************************************************************
123 |*
124 |* Suchen&Ersetzen
125 |*
126 \************************************************************************/
127 
128 void FuHangulHanjaConversion::StartConversion( sal_Int16 nSourceLanguage, sal_Int16 nTargetLanguage,
129         const Font *pTargetFont, sal_Int32 nOptions, sal_Bool bIsInteractive )
130 {
131 
132     String aString( SdResId(STR_UNDO_HANGULHANJACONVERSION) );
133     mpView->BegUndo( aString );
134 
135     ViewShellBase* pBase = PTR_CAST(ViewShellBase, SfxViewShell::Current());
136     if (pBase != NULL)
137         mpViewShell = pBase->GetMainViewShell().get();
138 
139     if( mpViewShell )
140     {
141         if ( pSdOutliner && mpViewShell->ISA(DrawViewShell) && !bOwnOutliner )
142         {
143             pSdOutliner->EndConversion();
144 
145             bOwnOutliner = sal_True;
146             pSdOutliner = new Outliner( mpDoc, OUTLINERMODE_TEXTOBJECT );
147             pSdOutliner->BeginConversion();
148         }
149         else if ( pSdOutliner && mpViewShell->ISA(OutlineViewShell) && bOwnOutliner )
150         {
151             pSdOutliner->EndConversion();
152             delete pSdOutliner;
153 
154             bOwnOutliner = sal_False;
155             pSdOutliner = mpDoc->GetOutliner();
156             pSdOutliner->BeginConversion();
157         }
158 
159         if (pSdOutliner)
160             pSdOutliner->StartConversion(nSourceLanguage, nTargetLanguage, pTargetFont, nOptions, bIsInteractive );
161     }
162 
163     // Due to changing between edit mode, notes mode, and handout mode the
164     // view has most likely changed.  Get the new one.
165     mpViewShell = pBase->GetMainViewShell().get();
166     if (mpViewShell != NULL)
167     {
168         mpView = mpViewShell->GetView();
169         mpWindow = mpViewShell->GetActiveWindow();
170     }
171     else
172     {
173         mpView = 0;
174         mpWindow = NULL;
175     }
176 
177     if (mpView != NULL)
178         mpView->EndUndo();
179 }
180 
181 
182 void FuHangulHanjaConversion::ConvertStyles( sal_Int16 nTargetLanguage, const Font *pTargetFont )
183 {
184     if( !mpDoc )
185         return;
186 
187     SfxStyleSheetBasePool* pStyleSheetPool = mpDoc->GetStyleSheetPool();
188     if( !pStyleSheetPool )
189         return;
190 
191     SfxStyleSheetBase* pStyle = pStyleSheetPool->First();
192     while( pStyle )
193     {
194         SfxItemSet& rSet = pStyle->GetItemSet();
195 
196         const bool bHasParent = pStyle->GetParent().Len() != 0;
197 
198         if( !bHasParent || rSet.GetItemState( EE_CHAR_LANGUAGE_CJK, sal_False ) == SFX_ITEM_SET )
199             rSet.Put( SvxLanguageItem( nTargetLanguage, EE_CHAR_LANGUAGE_CJK ) );
200 
201         if( pTargetFont &&
202             ( !bHasParent || rSet.GetItemState( EE_CHAR_FONTINFO_CJK, sal_False ) == SFX_ITEM_SET ) )
203         {
204             // set new font attribute
205             SvxFontItem aFontItem( (SvxFontItem&) rSet.Get( EE_CHAR_FONTINFO_CJK ) );
206             aFontItem.SetFamilyName(   pTargetFont->GetName());
207             aFontItem.SetFamily(       pTargetFont->GetFamily());
208             aFontItem.SetStyleName(    pTargetFont->GetStyleName());
209             aFontItem.SetPitch(        pTargetFont->GetPitch());
210             aFontItem.SetCharSet(      pTargetFont->GetCharSet());
211             rSet.Put( aFontItem );
212         }
213 
214         pStyle = pStyleSheetPool->Next();
215     }
216 
217     mpDoc->SetLanguage( EE_CHAR_LANGUAGE_CJK, nTargetLanguage );
218 }
219 
220 void FuHangulHanjaConversion::StartChineseConversion()
221 {
222     //open ChineseTranslationDialog
223     Reference< XComponentContext > xContext(
224         ::cppu::defaultBootstrap_InitialComponentContext() ); //@todo get context from calc if that has one
225     if(xContext.is())
226     {
227         Reference< lang::XMultiComponentFactory > xMCF( xContext->getServiceManager() );
228         if(xMCF.is())
229         {
230             Reference< ui::dialogs::XExecutableDialog > xDialog(
231                     xMCF->createInstanceWithContext(
232                         rtl::OUString::createFromAscii("com.sun.star.linguistic2.ChineseTranslationDialog")
233                         , xContext), UNO_QUERY);
234             Reference< lang::XInitialization > xInit( xDialog, UNO_QUERY );
235             if( xInit.is() )
236             {
237                 //  initialize dialog
238                 Reference< awt::XWindow > xDialogParentWindow(0);
239                 Sequence<Any> aSeq(1);
240                 Any* pArray = aSeq.getArray();
241                 PropertyValue aParam;
242                 aParam.Name = rtl::OUString::createFromAscii("ParentWindow");
243                 aParam.Value <<= makeAny(xDialogParentWindow);
244                 pArray[0] <<= makeAny(aParam);
245                 xInit->initialize( aSeq );
246 
247                 //execute dialog
248                 sal_Int16 nDialogRet = xDialog->execute();
249                 if( RET_OK == nDialogRet )
250                 {
251                     //get some parameters from the dialog
252                     sal_Bool bToSimplified = sal_True;
253                     sal_Bool bUseVariants = sal_True;
254                     sal_Bool bCommonTerms = sal_True;
255                     Reference< beans::XPropertySet >  xProp( xDialog, UNO_QUERY );
256                     if( xProp.is() )
257                     {
258                         try
259                         {
260                             xProp->getPropertyValue( C2U("IsDirectionToSimplified") ) >>= bToSimplified;
261                             xProp->getPropertyValue( C2U("IsUseCharacterVariants") ) >>= bUseVariants;
262                             xProp->getPropertyValue( C2U("IsTranslateCommonTerms") ) >>= bCommonTerms;
263                         }
264                         catch( Exception& )
265                         {
266                         }
267                     }
268 
269                     //execute translation
270                     sal_Int16 nSourceLang = bToSimplified ? LANGUAGE_CHINESE_TRADITIONAL : LANGUAGE_CHINESE_SIMPLIFIED;
271                     sal_Int16 nTargetLang = bToSimplified ? LANGUAGE_CHINESE_SIMPLIFIED : LANGUAGE_CHINESE_TRADITIONAL;
272                     sal_Int32 nOptions    = bUseVariants ? i18n::TextConversionOption::USE_CHARACTER_VARIANTS : 0;
273                     if( !bCommonTerms )
274                         nOptions = nOptions | i18n::TextConversionOption::CHARACTER_BY_CHARACTER;
275 
276                     Font aTargetFont = mpWindow->GetDefaultFont(
277                                         DEFAULTFONT_CJK_PRESENTATION,
278                                         nTargetLang, DEFAULTFONT_FLAGS_ONLYONE );
279 
280                     StartConversion( nSourceLang, nTargetLang, &aTargetFont, nOptions, sal_False );
281                     ConvertStyles( nTargetLang, &aTargetFont );
282                 }
283             }
284             Reference< lang::XComponent > xComponent( xDialog, UNO_QUERY );
285             if( xComponent.is() )
286                 xComponent->dispose();
287         }
288     }
289 }
290 } // end of namespace
291