Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <hintids.hxx>
21 : #include <i18nlangtag/lang.h>
22 : #include <svl/slstitm.hxx>
23 : #include <svl/cjkoptions.hxx>
24 : #include <editeng/fontitem.hxx>
25 : #include <editeng/langitem.hxx>
26 : #include <svx/svdview.hxx>
27 : #include <vcl/msgbox.hxx>
28 : #include <sfx2/viewfrm.hxx>
29 : #include <sfx2/objface.hxx>
30 : #include <svx/svdotext.hxx>
31 : #include <editeng/editeng.hxx>
32 : #include <editeng/editview.hxx>
33 : #include <editeng/eeitem.hxx>
34 : #include <editeng/scripttypeitem.hxx>
35 : #include <sfx2/bindings.hxx>
36 : #include <svx/fontwork.hxx>
37 : #include <sfx2/request.hxx>
38 : #include <sfx2/sidebar/EnumContext.hxx>
39 : #include <svl/whiter.hxx>
40 : #include <editeng/outliner.hxx>
41 : #include <editeng/editstat.hxx>
42 : #include <svx/svdoutl.hxx>
43 : #include <com/sun/star/i18n/TransliterationModules.hpp>
44 : #include <com/sun/star/i18n/TransliterationModulesExtra.hpp>
45 : #include <com/sun/star/i18n/TextConversionOption.hpp>
46 : #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
47 : #include <com/sun/star/lang/XInitialization.hpp>
48 : #include <swtypes.hxx>
49 : #include <view.hxx>
50 : #include <wrtsh.hxx>
51 : #include <viewopt.hxx>
52 : #include <initui.hxx>
53 : #include <drwtxtsh.hxx>
54 : #include <swundo.hxx>
55 : #include <breakit.hxx>
56 :
57 : #include <cmdid.h>
58 : #include <helpid.h>
59 : #include <globals.hrc>
60 : #include <shells.hrc>
61 :
62 : #define SwDrawTextShell
63 : #include <sfx2/msg.hxx>
64 : #include <swslots.hxx>
65 : #include <popup.hrc>
66 : #include <uitool.hxx>
67 : #include <wview.hxx>
68 : #include <swmodule.hxx>
69 : #include <svx/dialogs.hrc>
70 : #include <svx/svdoashp.hxx>
71 : #include <svx/svxdlg.hxx>
72 : #include <svx/xtable.hxx>
73 : #include <cppuhelper/bootstrap.hxx>
74 : #include <comphelper/processfactory.hxx>
75 : #include "swabstdlg.hxx"
76 : #include "misc.hrc"
77 : #include <boost/scoped_ptr.hpp>
78 :
79 : using namespace ::com::sun::star;
80 : using namespace ::com::sun::star::uno;
81 : using namespace ::com::sun::star::beans;
82 : using namespace ::com::sun::star::i18n;
83 :
84 295 : SFX_IMPL_INTERFACE(SwDrawTextShell, SfxShell)
85 :
86 59 : void SwDrawTextShell::InitInterface_Impl()
87 : {
88 59 : GetStaticInterface()->RegisterPopupMenu(SW_RES(MN_DRWTXT_POPUPMENU));
89 :
90 59 : GetStaticInterface()->RegisterObjectBar(SFX_OBJECTBAR_OBJECT, RID_DRAW_TEXT_TOOLBOX);
91 :
92 59 : GetStaticInterface()->RegisterChildWindow(SvxFontWorkChildWindow::GetChildWindowId());
93 59 : }
94 :
95 48 : TYPEINIT1(SwDrawTextShell,SfxShell)
96 :
97 0 : void SwDrawTextShell::Init()
98 : {
99 0 : SwWrtShell &rSh = GetShell();
100 0 : pSdrView = rSh.GetDrawView();
101 0 : SdrOutliner * pOutliner = pSdrView->GetTextEditOutliner();
102 : //#97471# mouse click _and_ key input at the same time
103 0 : if( !pOutliner )
104 0 : return ;
105 0 : OutlinerView* pOLV = pSdrView->GetTextEditOutlinerView();
106 0 : EEControlBits nCtrl = pOutliner->GetControlWord();
107 0 : nCtrl |= EEControlBits::AUTOCORRECT;
108 :
109 0 : SetUndoManager(&pOutliner->GetUndoManager());
110 :
111 : // Now let's try an AutoSpell.
112 :
113 0 : const SwViewOption* pVOpt = rSh.GetViewOptions();
114 0 : if(pVOpt->IsOnlineSpell())
115 : {
116 0 : nCtrl |= EEControlBits::ONLINESPELLING|EEControlBits::ALLOWBIGOBJS;
117 : }
118 : else
119 0 : nCtrl &= ~(EEControlBits::ONLINESPELLING);
120 :
121 0 : pOutliner->SetControlWord(nCtrl);
122 0 : pOLV->ShowCursor();
123 : }
124 :
125 0 : SwDrawTextShell::SwDrawTextShell(SwView &rV) :
126 : SfxShell(&rV),
127 0 : rView(rV)
128 : {
129 0 : SwWrtShell &rSh = GetShell();
130 0 : SetPool(rSh.GetAttrPool().GetSecondaryPool());
131 :
132 0 : Init();
133 :
134 0 : rSh.NoEdit(true);
135 0 : SetName(OUString("ObjectText"));
136 0 : SetHelpId(SW_DRWTXTSHELL);
137 0 : SfxShell::SetContextName(sfx2::sidebar::EnumContext::GetContextName(sfx2::sidebar::EnumContext::Context_DrawText));
138 0 : }
139 :
140 0 : SwDrawTextShell::~SwDrawTextShell()
141 : {
142 0 : if ( GetView().GetCurShell() == this )
143 0 : rView.ResetSubShell();
144 0 : }
145 :
146 0 : SwWrtShell& SwDrawTextShell::GetShell()
147 : {
148 0 : return rView.GetWrtShell();
149 : }
150 :
151 : // Disable slots with this status method
152 :
153 0 : void SwDrawTextShell::StateDisableItems( SfxItemSet &rSet )
154 : {
155 0 : SfxWhichIter aIter(rSet);
156 0 : sal_uInt16 nWhich = aIter.FirstWhich();
157 :
158 0 : while (nWhich)
159 : {
160 0 : rSet.DisableItem( nWhich );
161 0 : nWhich = aIter.NextWhich();
162 0 : }
163 0 : }
164 :
165 0 : void SwDrawTextShell::SetAttrToMarked(const SfxItemSet& rAttr)
166 : {
167 0 : Rectangle aNullRect;
168 0 : OutlinerView* pOLV = pSdrView->GetTextEditOutlinerView();
169 0 : Rectangle aOutRect = pOLV->GetOutputArea();
170 :
171 0 : if (aNullRect != aOutRect)
172 : {
173 0 : GetShell().GetDrawView()->SetAttributes(rAttr);
174 : }
175 0 : }
176 :
177 0 : bool SwDrawTextShell::IsTextEdit()
178 : {
179 0 : return pSdrView->IsTextEdit();
180 : }
181 :
182 0 : void SwDrawTextShell::ExecFontWork(SfxRequest& rReq)
183 : {
184 0 : SwWrtShell &rSh = GetShell();
185 0 : FieldUnit eMetric = ::GetDfltMetric(0 != PTR_CAST(SwWebView, &rSh.GetView()));
186 0 : SW_MOD()->PutItem(SfxUInt16Item(SID_ATTR_METRIC, static_cast< sal_uInt16 >(eMetric)) );
187 0 : SfxViewFrame* pVFrame = GetView().GetViewFrame();
188 0 : if ( rReq.GetArgs() )
189 : {
190 0 : pVFrame->SetChildWindow(SvxFontWorkChildWindow::GetChildWindowId(),
191 : static_cast<const SfxBoolItem&>( (rReq.GetArgs()->
192 0 : Get(SID_FONTWORK))).GetValue());
193 : }
194 : else
195 0 : pVFrame->ToggleChildWindow(SvxFontWorkChildWindow::GetChildWindowId());
196 :
197 0 : pVFrame->GetBindings().Invalidate(SID_FONTWORK);
198 0 : }
199 :
200 0 : void SwDrawTextShell::StateFontWork(SfxItemSet& rSet)
201 : {
202 0 : const sal_uInt16 nId = SvxFontWorkChildWindow::GetChildWindowId();
203 0 : rSet.Put(SfxBoolItem(SID_FONTWORK, GetView().GetViewFrame()->HasChildWindow(nId)));
204 0 : }
205 :
206 : // Edit SfxRequests for FontWork
207 :
208 0 : void SwDrawTextShell::ExecFormText(SfxRequest& rReq)
209 : {
210 0 : SwWrtShell &rSh = GetShell();
211 0 : SdrView* pDrView = rSh.GetDrawView();
212 :
213 0 : const SdrMarkList& rMarkList = pDrView->GetMarkedObjectList();
214 :
215 0 : if ( rMarkList.GetMarkCount() == 1 && rReq.GetArgs() )
216 : {
217 0 : const SfxItemSet& rSet = *rReq.GetArgs();
218 :
219 0 : if ( pDrView->IsTextEdit() )
220 : {
221 : //#111733# Sometimes SdrEndTextEdit() initiates the change in selection and
222 : // 'this' is not valid anymore
223 0 : SwView& rTempView = GetView();
224 0 : pDrView->SdrEndTextEdit(true);
225 : //this removes the current shell from the dispatcher stack!!
226 0 : rTempView.AttrChangedNotify(&rSh);
227 : }
228 :
229 0 : pDrView->SetAttributes(rSet);
230 : }
231 :
232 0 : }
233 :
234 : // Return Status values back to FontWork
235 :
236 0 : void SwDrawTextShell::GetFormTextState(SfxItemSet& rSet)
237 : {
238 0 : SwWrtShell &rSh = GetShell();
239 0 : SdrView* pDrView = rSh.GetDrawView();
240 0 : const SdrMarkList& rMarkList = pDrView->GetMarkedObjectList();
241 0 : const SdrObject* pObj = NULL;
242 0 : SvxFontWorkDialog* pDlg = NULL;
243 :
244 0 : const sal_uInt16 nId = SvxFontWorkChildWindow::GetChildWindowId();
245 :
246 0 : SfxViewFrame* pVFrame = GetView().GetViewFrame();
247 0 : if (pVFrame->HasChildWindow(nId))
248 : {
249 0 : SfxChildWindow* pWnd = pVFrame->GetChildWindow(nId);
250 0 : pDlg = pWnd ? static_cast<SvxFontWorkDialog*>(pWnd->GetWindow()) : NULL;
251 : }
252 :
253 0 : if ( rMarkList.GetMarkCount() == 1 )
254 0 : pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
255 :
256 0 : const SdrTextObj* pTextObj = dynamic_cast< const SdrTextObj* >(pObj);
257 : const bool bDeactivate(
258 0 : !pObj ||
259 0 : !pTextObj ||
260 0 : !pTextObj->HasText() ||
261 0 : dynamic_cast< const SdrObjCustomShape* >(pObj)); // #121538# no FontWork for CustomShapes
262 :
263 0 : if (bDeactivate)
264 : {
265 0 : rSet.DisableItem(XATTR_FORMTXTSTYLE);
266 0 : rSet.DisableItem(XATTR_FORMTXTADJUST);
267 0 : rSet.DisableItem(XATTR_FORMTXTDISTANCE);
268 0 : rSet.DisableItem(XATTR_FORMTXTSTART);
269 0 : rSet.DisableItem(XATTR_FORMTXTMIRROR);
270 0 : rSet.DisableItem(XATTR_FORMTXTHIDEFORM);
271 0 : rSet.DisableItem(XATTR_FORMTXTOUTLINE);
272 0 : rSet.DisableItem(XATTR_FORMTXTSHADOW);
273 0 : rSet.DisableItem(XATTR_FORMTXTSHDWCOLOR);
274 0 : rSet.DisableItem(XATTR_FORMTXTSHDWXVAL);
275 0 : rSet.DisableItem(XATTR_FORMTXTSHDWYVAL);
276 : }
277 : else
278 : {
279 0 : if ( pDlg )
280 0 : pDlg->SetColorList(XColorList::GetStdColorList());
281 :
282 0 : pDrView->GetAttributes( rSet );
283 : }
284 0 : }
285 :
286 0 : void SwDrawTextShell::ExecDrawLingu(SfxRequest &rReq)
287 : {
288 0 : SwWrtShell &rSh = GetShell();
289 0 : OutlinerView* pOutlinerView = pSdrView->GetTextEditOutlinerView();
290 0 : if( rSh.GetDrawView()->GetMarkedObjectList().GetMarkCount() )
291 : {
292 0 : switch(rReq.GetSlot())
293 : {
294 : case SID_THESAURUS:
295 0 : pOutlinerView->StartThesaurus();
296 0 : break;
297 :
298 : case SID_HANGUL_HANJA_CONVERSION:
299 : pOutlinerView->StartTextConversion(LANGUAGE_KOREAN, LANGUAGE_KOREAN, NULL,
300 0 : i18n::TextConversionOption::CHARACTER_BY_CHARACTER, true, false);
301 0 : break;
302 :
303 : case SID_CHINESE_CONVERSION:
304 : {
305 : //open ChineseTranslationDialog
306 0 : Reference<XComponentContext> xContext = comphelper::getProcessComponentContext();
307 0 : if (!xContext.is())
308 0 : return;
309 :
310 0 : Reference<lang::XMultiComponentFactory> xMCF(xContext->getServiceManager());
311 0 : if (!xMCF.is())
312 0 : return;
313 :
314 0 : OUString sService("com.sun.star.linguistic2.ChineseTranslationDialog");
315 : Reference<ui::dialogs::XExecutableDialog> xDialog(
316 0 : xMCF->createInstanceWithContext(sService, xContext), UNO_QUERY);
317 :
318 0 : Reference<lang::XInitialization> xInit(xDialog, UNO_QUERY);
319 :
320 0 : if (!xInit.is())
321 0 : return;
322 :
323 : // initialize dialog
324 0 : Reference<awt::XWindow> xDialogParentWindow(0);
325 0 : Sequence<Any> aSequence(1);
326 0 : Any* pArray = aSequence.getArray();
327 0 : PropertyValue aParam;
328 0 : aParam.Name = "ParentWindow";
329 0 : aParam.Value <<= makeAny(xDialogParentWindow);
330 0 : pArray[0] <<= makeAny(aParam);
331 0 : xInit->initialize( aSequence );
332 :
333 : //execute dialog
334 0 : sal_Int16 nDialogRet = xDialog->execute();
335 0 : if(RET_OK == nDialogRet)
336 : {
337 : //get some parameters from the dialog
338 0 : bool bToSimplified = true;
339 0 : bool bUseVariants = true;
340 0 : bool bCommonTerms = true;
341 0 : Reference<beans::XPropertySet> xPropertySet(xDialog, UNO_QUERY);
342 0 : if (xPropertySet.is())
343 : {
344 : try
345 : {
346 0 : xPropertySet->getPropertyValue("IsDirectionToSimplified") >>= bToSimplified;
347 0 : xPropertySet->getPropertyValue("IsUseCharacterVariants") >>= bUseVariants;
348 0 : xPropertySet->getPropertyValue("IsTranslateCommonTerms") >>= bCommonTerms;
349 : }
350 0 : catch (const Exception&)
351 : {
352 : }
353 : }
354 :
355 : //execute translation
356 0 : sal_Int16 nSourceLang = bToSimplified ? LANGUAGE_CHINESE_TRADITIONAL : LANGUAGE_CHINESE_SIMPLIFIED;
357 0 : sal_Int16 nTargetLang = bToSimplified ? LANGUAGE_CHINESE_SIMPLIFIED : LANGUAGE_CHINESE_TRADITIONAL;
358 0 : sal_Int32 nOptions = bUseVariants ? i18n::TextConversionOption::USE_CHARACTER_VARIANTS : 0;
359 0 : if(!bCommonTerms)
360 0 : nOptions = nOptions | i18n::TextConversionOption::CHARACTER_BY_CHARACTER;
361 :
362 0 : vcl::Font aTargetFont = OutputDevice::GetDefaultFont(DefaultFontType::CJK_TEXT, nTargetLang, GetDefaultFontFlags::OnlyOne);
363 :
364 0 : pOutlinerView->StartTextConversion(nSourceLang, nTargetLang, &aTargetFont, nOptions, false, false);
365 : }
366 :
367 0 : Reference<lang::XComponent> xComponent(xDialog, UNO_QUERY);
368 0 : if (xComponent.is())
369 0 : xComponent->dispose();
370 : }
371 0 : break;
372 :
373 : default:
374 : OSL_ENSURE(false, "unexpected slot-id");
375 : }
376 : }
377 : }
378 :
379 0 : void SwDrawTextShell::ExecDraw(SfxRequest &rReq)
380 : {
381 0 : SwWrtShell &rSh = GetShell();
382 0 : pSdrView = rSh.GetDrawView();
383 0 : OutlinerView* pOLV = pSdrView->GetTextEditOutlinerView();
384 :
385 0 : switch (rReq.GetSlot())
386 : {
387 : case FN_INSERT_SOFT_HYPHEN:
388 : case FN_INSERT_HARDHYPHEN:
389 : case FN_INSERT_HARD_SPACE:
390 : case SID_INSERT_RLM :
391 : case SID_INSERT_LRM :
392 : case SID_INSERT_ZWNBSP :
393 : case SID_INSERT_ZWSP:
394 : {
395 0 : sal_Unicode cIns = 0;
396 0 : switch(rReq.GetSlot())
397 : {
398 0 : case FN_INSERT_SOFT_HYPHEN: cIns = CHAR_SOFTHYPHEN; break;
399 0 : case FN_INSERT_HARDHYPHEN: cIns = CHAR_HARDHYPHEN; break;
400 0 : case FN_INSERT_HARD_SPACE: cIns = CHAR_HARDBLANK; break;
401 0 : case SID_INSERT_RLM : cIns = CHAR_RLM ; break;
402 0 : case SID_INSERT_LRM : cIns = CHAR_LRM ; break;
403 0 : case SID_INSERT_ZWSP : cIns = CHAR_ZWSP ; break;
404 0 : case SID_INSERT_ZWNBSP: cIns = CHAR_ZWNBSP; break;
405 : }
406 0 : pOLV->InsertText( OUString(cIns));
407 0 : rReq.Done();
408 : }
409 0 : break;
410 : case SID_CHARMAP:
411 : { // Insert special character
412 0 : InsertSymbol(rReq);
413 0 : break;
414 : }
415 : case FN_INSERT_STRING:
416 : {
417 0 : const SfxItemSet *pNewAttrs = rReq.GetArgs();
418 0 : sal_uInt16 nSlot = rReq.GetSlot();
419 0 : const SfxPoolItem* pItem = 0;
420 0 : if(pNewAttrs)
421 : {
422 0 : pNewAttrs->GetItemState(nSlot, false, &pItem );
423 0 : pOLV->InsertText(static_cast<const SfxStringItem *>(pItem)->GetValue());
424 : }
425 0 : break;
426 : }
427 :
428 : case SID_SELECTALL:
429 : {
430 0 : SdrOutliner * pOutliner = pSdrView->GetTextEditOutliner();
431 0 : if(pOutliner)
432 : {
433 0 : sal_Int32 nParaCount = pOutliner->GetParagraphCount();
434 0 : if (nParaCount > 0)
435 0 : pOLV->SelectRange(0L, nParaCount );
436 : }
437 : }
438 0 : break;
439 :
440 : case FN_FORMAT_RESET: // delete hard text attributes
441 : {
442 0 : pOLV->RemoveAttribsKeepLanguages( true );
443 0 : pOLV->GetEditView().GetEditEngine()->RemoveFields(true);
444 0 : rReq.Done();
445 : }
446 0 : break;
447 :
448 : case FN_ESCAPE:
449 0 : if (pSdrView->IsTextEdit())
450 : {
451 : // Shell switch!
452 0 : rSh.EndTextEdit();
453 0 : SwView& rTempView = rSh.GetView();
454 0 : rTempView.ExitDraw();
455 0 : rSh.Edit();
456 0 : return;
457 : }
458 0 : break;
459 : case FN_DRAWTEXT_ATTR_DLG:
460 : {
461 0 : SfxItemSet aNewAttr( pSdrView->GetModel()->GetItemPool() );
462 0 : pSdrView->GetAttributes( aNewAttr );
463 0 : SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
464 0 : if ( pFact )
465 : {
466 : boost::scoped_ptr<SfxAbstractTabDialog> pDlg(pFact->CreateTextTabDialog(
467 0 : &(GetView().GetViewFrame()->GetWindow()),
468 0 : &aNewAttr, pSdrView ));
469 0 : sal_uInt16 nResult = pDlg->Execute();
470 :
471 0 : if (nResult == RET_OK)
472 : {
473 0 : if (pSdrView->AreObjectsMarked())
474 : {
475 0 : pSdrView->SetAttributes(*pDlg->GetOutputItemSet());
476 0 : rReq.Done(*(pDlg->GetOutputItemSet()));
477 : }
478 0 : }
479 0 : }
480 : }
481 0 : break;
482 : case SID_TABLE_VERT_NONE:
483 : case SID_TABLE_VERT_CENTER:
484 : case SID_TABLE_VERT_BOTTOM:
485 : {
486 0 : sal_uInt16 nSId = rReq.GetSlot();
487 0 : if (pSdrView->AreObjectsMarked())
488 : {
489 0 : SdrTextVertAdjust eTVA = SDRTEXTVERTADJUST_TOP;
490 0 : if (nSId == SID_TABLE_VERT_CENTER)
491 0 : eTVA = SDRTEXTVERTADJUST_CENTER;
492 0 : else if (nSId == SID_TABLE_VERT_BOTTOM)
493 0 : eTVA = SDRTEXTVERTADJUST_BOTTOM;
494 :
495 0 : SfxItemSet aNewAttr( pSdrView->GetModel()->GetItemPool() );
496 0 : pSdrView->GetAttributes( aNewAttr );
497 0 : aNewAttr.Put(SdrTextVertAdjustItem(eTVA));
498 0 : pSdrView->SetAttributes(aNewAttr);
499 0 : rReq.Done();
500 : }
501 :
502 : }
503 0 : break;
504 :
505 : default:
506 : OSL_ENSURE(false, "unexpected slot-id");
507 0 : return;
508 : }
509 :
510 0 : GetView().GetViewFrame()->GetBindings().InvalidateAll(false);
511 :
512 0 : if (IsTextEdit() && pOLV->GetOutliner()->IsModified())
513 0 : rSh.SetModified();
514 : }
515 :
516 : // Execute undo
517 :
518 0 : void SwDrawTextShell::ExecUndo(SfxRequest &rReq)
519 : {
520 0 : if( IsTextEdit() )
521 : {
522 0 : bool bCallBase = true;
523 0 : const SfxItemSet* pArgs = rReq.GetArgs();
524 0 : if( pArgs )
525 : {
526 0 : sal_uInt16 nId = rReq.GetSlot(), nCnt = 1;
527 : const SfxPoolItem* pItem;
528 0 : switch( nId )
529 : {
530 : case SID_UNDO:
531 : case SID_REDO:
532 0 : if( SfxItemState::SET == pArgs->GetItemState( nId, false, &pItem ) &&
533 0 : 1 < (nCnt = static_cast<const SfxUInt16Item*>(pItem)->GetValue()) )
534 : {
535 : // then we make by ourself.
536 0 : ::svl::IUndoManager* pUndoManager = GetUndoManager();
537 0 : if( pUndoManager )
538 : {
539 0 : if( SID_UNDO == nId )
540 0 : while( nCnt-- )
541 0 : pUndoManager->Undo();
542 : else
543 0 : while( nCnt-- )
544 0 : pUndoManager->Redo();
545 : }
546 0 : bCallBase = false;
547 0 : GetView().GetViewFrame()->GetBindings().InvalidateAll(false);
548 : }
549 0 : break;
550 : }
551 : }
552 0 : if( bCallBase )
553 : {
554 0 : SfxViewFrame *pSfxViewFrame = GetView().GetViewFrame();
555 0 : pSfxViewFrame->ExecuteSlot(rReq, pSfxViewFrame->GetInterface());
556 : }
557 : }
558 0 : }
559 :
560 : // State of undo
561 :
562 0 : void SwDrawTextShell::StateUndo(SfxItemSet &rSet)
563 : {
564 0 : if ( !IsTextEdit() )
565 0 : return;
566 :
567 0 : SfxViewFrame *pSfxViewFrame = GetView().GetViewFrame();
568 0 : SfxWhichIter aIter(rSet);
569 0 : sal_uInt16 nWhich = aIter.FirstWhich();
570 0 : while( nWhich )
571 : {
572 0 : switch ( nWhich )
573 : {
574 : case SID_GETUNDOSTRINGS:
575 : case SID_GETREDOSTRINGS:
576 : {
577 0 : ::svl::IUndoManager* pUndoManager = GetUndoManager();
578 0 : if( pUndoManager )
579 : {
580 : OUString (::svl::IUndoManager:: *fnGetComment)( size_t, bool const ) const;
581 :
582 : sal_uInt16 nCount;
583 0 : if( SID_GETUNDOSTRINGS == nWhich )
584 : {
585 0 : nCount = pUndoManager->GetUndoActionCount();
586 0 : fnGetComment = &::svl::IUndoManager::GetUndoActionComment;
587 : }
588 : else
589 : {
590 0 : nCount = pUndoManager->GetRedoActionCount();
591 0 : fnGetComment = &::svl::IUndoManager::GetRedoActionComment;
592 : }
593 0 : if( nCount )
594 : {
595 0 : OUString sList;
596 0 : for( sal_uInt16 n = 0; n < nCount; ++n )
597 0 : sList += (pUndoManager->*fnGetComment)( n, ::svl::IUndoManager::TopLevel ) + "\n";
598 :
599 0 : SfxStringListItem aItem( nWhich );
600 0 : aItem.SetString( sList );
601 0 : rSet.Put( aItem );
602 : }
603 : }
604 : else
605 0 : rSet.DisableItem( nWhich );
606 : }
607 0 : break;
608 :
609 : default:
610 : pSfxViewFrame->GetSlotState( nWhich,
611 0 : pSfxViewFrame->GetInterface(), &rSet );
612 : }
613 :
614 0 : nWhich = aIter.NextWhich();
615 0 : }
616 : }
617 :
618 0 : void SwDrawTextShell::ExecTransliteration( SfxRequest & rReq )
619 : {
620 0 : if (!pSdrView)
621 0 : return;
622 :
623 : using namespace i18n;
624 :
625 0 : sal_uInt32 nMode = 0;
626 :
627 0 : switch( rReq.GetSlot() )
628 : {
629 : case SID_TRANSLITERATE_SENTENCE_CASE:
630 0 : nMode = TransliterationModulesExtra::SENTENCE_CASE;
631 0 : break;
632 : case SID_TRANSLITERATE_TITLE_CASE:
633 0 : nMode = TransliterationModulesExtra::TITLE_CASE;
634 0 : break;
635 : case SID_TRANSLITERATE_TOGGLE_CASE:
636 0 : nMode = TransliterationModulesExtra::TOGGLE_CASE;
637 0 : break;
638 : case SID_TRANSLITERATE_UPPER:
639 0 : nMode = TransliterationModules_LOWERCASE_UPPERCASE;
640 0 : break;
641 : case SID_TRANSLITERATE_LOWER:
642 0 : nMode = TransliterationModules_UPPERCASE_LOWERCASE;
643 0 : break;
644 :
645 : case SID_TRANSLITERATE_HALFWIDTH:
646 0 : nMode = TransliterationModules_FULLWIDTH_HALFWIDTH;
647 0 : break;
648 : case SID_TRANSLITERATE_FULLWIDTH:
649 0 : nMode = TransliterationModules_HALFWIDTH_FULLWIDTH;
650 0 : break;
651 :
652 : case SID_TRANSLITERATE_HIRAGANA:
653 0 : nMode = TransliterationModules_KATAKANA_HIRAGANA;
654 0 : break;
655 : case SID_TRANSLITERATE_KATAGANA:
656 0 : nMode = TransliterationModules_HIRAGANA_KATAKANA;
657 0 : break;
658 :
659 : default:
660 : OSL_ENSURE(false, "wrong dispatcher");
661 : }
662 :
663 0 : if( nMode )
664 : {
665 0 : OutlinerView* pOLV = pSdrView->GetTextEditOutlinerView();
666 :
667 0 : if (!pOLV)
668 0 : return;
669 :
670 0 : pOLV->TransliterateText( nMode );
671 : }
672 : }
673 :
674 0 : void SwDrawTextShell::ExecRotateTransliteration( SfxRequest & rReq )
675 : {
676 0 : if( rReq.GetSlot() == SID_TRANSLITERATE_ROTATE_CASE )
677 : {
678 0 : if (!pSdrView)
679 0 : return;
680 :
681 0 : OutlinerView* pOLV = pSdrView->GetTextEditOutlinerView();
682 :
683 0 : if (!pOLV)
684 0 : return;
685 :
686 0 : pOLV->TransliterateText( m_aRotateCase.getNextMode() );
687 : }
688 : }
689 :
690 : // Insert special character (see SDraw: FUBULLET.CXX)
691 :
692 0 : void SwDrawTextShell::InsertSymbol(SfxRequest& rReq)
693 : {
694 0 : OutlinerView* pOLV = pSdrView->GetTextEditOutlinerView();
695 0 : if(!pOLV)
696 0 : return;
697 0 : const SfxItemSet *pArgs = rReq.GetArgs();
698 0 : const SfxPoolItem* pItem = 0;
699 0 : if( pArgs )
700 0 : pArgs->GetItemState(GetPool().GetWhich(SID_CHARMAP), false, &pItem);
701 :
702 0 : OUString sSym;
703 0 : OUString sFontName;
704 0 : if ( pItem )
705 : {
706 0 : sSym = static_cast<const SfxStringItem*>(pItem)->GetValue();
707 0 : const SfxPoolItem* pFtItem = NULL;
708 0 : pArgs->GetItemState( GetPool().GetWhich(SID_ATTR_SPECIALCHAR), false, &pFtItem);
709 0 : const SfxStringItem* pFontItem = PTR_CAST( SfxStringItem, pFtItem );
710 0 : if ( pFontItem )
711 0 : sFontName = pFontItem->GetValue();
712 : }
713 :
714 0 : SfxItemSet aSet(pOLV->GetAttribs());
715 0 : SvtScriptType nScript = pOLV->GetSelectedScriptType();
716 0 : SvxFontItem aSetDlgFont( RES_CHRATR_FONT );
717 : {
718 0 : SvxScriptSetItem aSetItem( SID_ATTR_CHAR_FONT, *aSet.GetPool() );
719 0 : aSetItem.GetItemSet().Put( aSet, false );
720 0 : const SfxPoolItem* pI = aSetItem.GetItemOfScript( nScript );
721 0 : if( pI )
722 0 : aSetDlgFont = *static_cast<const SvxFontItem*>(pI);
723 : else
724 : aSetDlgFont = static_cast<const SvxFontItem&>(aSet.Get( GetWhichOfScript(
725 : SID_ATTR_CHAR_FONT,
726 0 : SvtLanguageOptions::GetI18NScriptTypeOfLanguage( GetAppLanguage() ) )));
727 0 : if (sFontName.isEmpty())
728 0 : sFontName = aSetDlgFont.GetFamilyName();
729 : }
730 :
731 0 : vcl::Font aFont(sFontName, Size(1,1));
732 0 : if(sSym.isEmpty())
733 : {
734 0 : SfxAllItemSet aAllSet( GetPool() );
735 0 : aAllSet.Put( SfxBoolItem( FN_PARAM_1, false ) );
736 :
737 0 : SwViewOption aOpt(*rView.GetWrtShell().GetViewOptions());
738 0 : OUString sSymbolFont = aOpt.GetSymbolFont();
739 0 : if( !sSymbolFont.isEmpty() )
740 0 : aAllSet.Put( SfxStringItem( SID_FONT_NAME, sSymbolFont ) );
741 : else
742 0 : aAllSet.Put( SfxStringItem( SID_FONT_NAME, aSetDlgFont.GetFamilyName() ) );
743 :
744 : // If character is selected, it can be shown
745 0 : SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
746 : boost::scoped_ptr<SfxAbstractDialog> pDlg(pFact->CreateSfxDialog( rView.GetWindow(), aAllSet,
747 0 : rView.GetViewFrame()->GetFrame().GetFrameInterface(), RID_SVXDLG_CHARMAP ));
748 0 : sal_uInt16 nResult = pDlg->Execute();
749 0 : if( nResult == RET_OK )
750 : {
751 0 : SFX_ITEMSET_ARG( pDlg->GetOutputItemSet(), pCItem, SfxStringItem, SID_CHARMAP, false );
752 0 : SFX_ITEMSET_ARG( pDlg->GetOutputItemSet(), pFontItem, SvxFontItem, SID_ATTR_CHAR_FONT, false );
753 0 : if ( pFontItem )
754 : {
755 0 : aFont.SetName( pFontItem->GetFamilyName() );
756 0 : aFont.SetStyleName( pFontItem->GetStyleName() );
757 0 : aFont.SetCharSet( pFontItem->GetCharSet() );
758 0 : aFont.SetPitch( pFontItem->GetPitch() );
759 : }
760 :
761 0 : if ( pCItem )
762 : {
763 0 : sSym = pCItem->GetValue();
764 0 : aOpt.SetSymbolFont(aFont.GetName());
765 0 : SW_MOD()->ApplyUsrPref(aOpt, &rView);
766 : }
767 0 : }
768 : }
769 :
770 0 : if( !sSym.isEmpty() )
771 : {
772 : // do not flicker
773 0 : pOLV->HideCursor();
774 0 : SdrOutliner * pOutliner = pSdrView->GetTextEditOutliner();
775 0 : pOutliner->SetUpdateMode(false);
776 :
777 0 : SfxItemSet aOldSet( pOLV->GetAttribs() );
778 0 : SfxItemSet aFontSet( *aOldSet.GetPool(),
779 : EE_CHAR_FONTINFO, EE_CHAR_FONTINFO,
780 : EE_CHAR_FONTINFO_CJK, EE_CHAR_FONTINFO_CJK,
781 : EE_CHAR_FONTINFO_CTL, EE_CHAR_FONTINFO_CTL,
782 0 : 0 );
783 0 : aFontSet.Set( aOldSet );
784 :
785 : // Insert string
786 0 : pOLV->InsertText( sSym );
787 :
788 : // assign attributes (Set font)
789 0 : SfxItemSet aFontAttribSet( *aFontSet.GetPool(), aFontSet.GetRanges() );
790 0 : SvxFontItem aFontItem (aFont.GetFamily(), aFont.GetName(),
791 0 : aFont.GetStyleName(), aFont.GetPitch(),
792 0 : aFont.GetCharSet(),
793 0 : EE_CHAR_FONTINFO );
794 0 : nScript = g_pBreakIt->GetAllScriptsOfText( sSym );
795 0 : if( SvtScriptType::LATIN & nScript )
796 0 : aFontAttribSet.Put( aFontItem, EE_CHAR_FONTINFO );
797 0 : if( SvtScriptType::ASIAN & nScript )
798 0 : aFontAttribSet.Put( aFontItem, EE_CHAR_FONTINFO_CJK );
799 0 : if( SvtScriptType::COMPLEX & nScript )
800 0 : aFontAttribSet.Put( aFontItem, EE_CHAR_FONTINFO_CTL );
801 0 : pOLV->SetAttribs(aFontAttribSet);
802 :
803 : // Remove selection
804 0 : ESelection aSel(pOLV->GetSelection());
805 0 : aSel.nStartPara = aSel.nEndPara;
806 0 : aSel.nStartPos = aSel.nEndPos;
807 0 : pOLV->SetSelection(aSel);
808 :
809 : // Restore old font
810 0 : pOLV->SetAttribs( aFontSet );
811 :
812 : // From now on show again
813 0 : pOutliner->SetUpdateMode(true);
814 0 : pOLV->ShowCursor();
815 :
816 0 : rReq.AppendItem( SfxStringItem( GetPool().GetWhich(SID_CHARMAP), sSym ) );
817 0 : if(!aFont.GetName().isEmpty())
818 0 : rReq.AppendItem( SfxStringItem( SID_ATTR_SPECIALCHAR, aFont.GetName() ) );
819 0 : rReq.Done();
820 0 : }
821 : }
822 :
823 0 : ::svl::IUndoManager* SwDrawTextShell::GetUndoManager()
824 : {
825 0 : SwWrtShell &rSh = GetShell();
826 0 : pSdrView = rSh.GetDrawView();
827 0 : SdrOutliner * pOutliner = pSdrView->GetTextEditOutliner();
828 0 : return &pOutliner->GetUndoManager();
829 : }
830 :
831 0 : void SwDrawTextShell::GetStatePropPanelAttr(SfxItemSet &rSet)
832 : {
833 0 : SfxWhichIter aIter( rSet );
834 0 : sal_uInt16 nWhich = aIter.FirstWhich();
835 :
836 0 : SwWrtShell &rSh = GetShell();
837 0 : pSdrView = rSh.GetDrawView();
838 :
839 0 : SfxItemSet aAttrs( pSdrView->GetModel()->GetItemPool() );
840 0 : pSdrView->GetAttributes( aAttrs );
841 :
842 0 : while ( nWhich )
843 : {
844 0 : sal_uInt16 nSlotId = SfxItemPool::IsWhich(nWhich)
845 0 : ? GetPool().GetSlotId(nWhich)
846 0 : : nWhich;
847 0 : switch ( nSlotId )
848 : {
849 : case SID_TABLE_VERT_NONE:
850 : case SID_TABLE_VERT_CENTER:
851 : case SID_TABLE_VERT_BOTTOM:
852 0 : bool bContour = false;
853 0 : SfxItemState eConState = aAttrs.GetItemState( SDRATTR_TEXT_CONTOURFRAME );
854 0 : if( eConState != SfxItemState::DONTCARE )
855 : {
856 0 : bContour = static_cast<const SdrOnOffItem&>( aAttrs.Get( SDRATTR_TEXT_CONTOURFRAME ) ).GetValue();
857 : }
858 0 : if (bContour) break;
859 :
860 0 : SfxItemState eVState = aAttrs.GetItemState( SDRATTR_TEXT_VERTADJUST );
861 : //SfxItemState eHState = aAttrs.GetItemState( SDRATTR_TEXT_HORZADJUST );
862 :
863 : //if(SfxItemState::DONTCARE != eVState && SfxItemState::DONTCARE != eHState)
864 0 : if(SfxItemState::DONTCARE != eVState)
865 : {
866 0 : SdrTextVertAdjust eTVA = (SdrTextVertAdjust)static_cast<const SdrTextVertAdjustItem&>(aAttrs.Get(SDRATTR_TEXT_VERTADJUST)).GetValue();
867 0 : bool bSet = (nSlotId == SID_TABLE_VERT_NONE && eTVA == SDRTEXTVERTADJUST_TOP) ||
868 0 : (nSlotId == SID_TABLE_VERT_CENTER && eTVA == SDRTEXTVERTADJUST_CENTER) ||
869 0 : (nSlotId == SID_TABLE_VERT_BOTTOM && eTVA == SDRTEXTVERTADJUST_BOTTOM);
870 0 : rSet.Put(SfxBoolItem(nSlotId, bSet));
871 : }
872 : else
873 : {
874 0 : rSet.Put(SfxBoolItem(nSlotId, false));
875 : }
876 0 : break;
877 : }
878 0 : nWhich = aIter.NextWhich();
879 0 : }
880 177 : }
881 :
882 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|