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 <com/sun/star/i18n/WordType.hpp>
21 :
22 : #include <hintids.hxx>
23 : #include <cmdid.h>
24 : #include <helpid.h>
25 :
26 : #include <i18nlangtag/languagetag.hxx>
27 : #include <svl/languageoptions.hxx>
28 : #include <editeng/langitem.hxx>
29 : #include <svtools/langtab.hxx>
30 : #include <svl/slstitm.hxx>
31 : #include <svl/grabbagitem.hxx>
32 : #include <string.h>
33 : #include <svl/stritem.hxx>
34 : #include <sfx2/htmlmode.hxx>
35 : #include <svl/whiter.hxx>
36 : #include <sfx2/bindings.hxx>
37 : #include <sfx2/dispatch.hxx>
38 : #include <sfx2/objitem.hxx>
39 : #include <vcl/unohelp2.hxx>
40 : #include <sfx2/request.hxx>
41 : #include <svl/eitem.hxx>
42 : #include <svl/macitem.hxx>
43 : #include <editeng/lrspitem.hxx>
44 : #include <editeng/colritem.hxx>
45 : #include <editeng/tstpitem.hxx>
46 : #include <editeng/brushitem.hxx>
47 : #include <editeng/svxacorr.hxx>
48 : #include <svl/cjkoptions.hxx>
49 : #include <svl/ctloptions.hxx>
50 : #include <IDocumentDrawModelAccess.hxx>
51 : #include <IDocumentSettingAccess.hxx>
52 : #include <charfmt.hxx>
53 : #include <editeng/fontitem.hxx>
54 : #include <svx/SmartTagItem.hxx>
55 : #include <fmtinfmt.hxx>
56 : #include <swwait.hxx>
57 : #include <wrtsh.hxx>
58 : #include <wview.hxx>
59 : #include <swmodule.hxx>
60 : #include <viewopt.hxx>
61 : #include <uitool.hxx>
62 : #include <swevent.hxx>
63 : #include <pagedesc.hxx>
64 : #include <textsh.hxx>
65 : #include <IMark.hxx>
66 : #include <swdtflvr.hxx>
67 : #include <docstat.hxx>
68 : #include <outline.hxx>
69 : #include <tablemgr.hxx>
70 : #include <swundo.hxx>
71 : #include <reffld.hxx>
72 : #include <docsh.hxx>
73 : #include <mdiexp.hxx>
74 : #include <inputwin.hxx>
75 : #include <chrdlgmodes.hxx>
76 : #include <pardlg.hxx>
77 : #include <frmatr.hxx>
78 : #include <fmtcol.hxx>
79 : #include <cellatr.hxx>
80 : #include <edtwin.hxx>
81 : #include <redlndlg.hxx>
82 : #include "fldmgr.hxx"
83 : #include <globals.hrc>
84 : #include <shells.hrc>
85 : #include <app.hrc>
86 : #include <web.hrc>
87 : #include "paratr.hxx"
88 : #include <crsskip.hxx>
89 : #include <vcl/svapp.hxx>
90 : #include <sfx2/app.hxx>
91 : #include <breakit.hxx>
92 : #include <SwSmartTagMgr.hxx>
93 : #include <editeng/acorrcfg.hxx>
94 : #include "swabstdlg.hxx"
95 : #include "misc.hrc"
96 : #include "chrdlg.hrc"
97 : #include <IDocumentStatistics.hxx>
98 : #include <sfx2/sfxdlg.hxx>
99 : #include <unotools/lingucfg.hxx>
100 : #include <com/sun/star/beans/XPropertySet.hpp>
101 : #include <com/sun/star/util/XChangesBatch.hpp>
102 : #include <com/sun/star/uno/Any.hxx>
103 : #include <editeng/unolingu.hxx>
104 : #include <unotools/syslocaleoptions.hxx>
105 : #include <doc.hxx>
106 : #include <drawdoc.hxx>
107 : #include <view.hxx>
108 : #include <ndtxt.hxx>
109 : #include <pam.hxx>
110 : #include <sfx2/objface.hxx>
111 : #include <langhelper.hxx>
112 : #include <uiitems.hxx>
113 : #include <tools/diagnose_ex.h>
114 : #include <svx/nbdtmgfact.hxx>
115 : #include <svx/nbdtmg.hxx>
116 :
117 : #include <svx/svdmodel.hxx>
118 : #include <svx/drawitem.hxx>
119 : #include <numrule.hxx>
120 : #include <boost/scoped_ptr.hpp>
121 :
122 : using namespace ::com::sun::star;
123 : using namespace svx::sidebar;
124 :
125 0 : void sw_CharDialog( SwWrtShell &rWrtSh, bool bUseDialog, sal_uInt16 nSlot,const SfxItemSet *pArgs, SfxRequest *pReq )
126 : {
127 0 : FieldUnit eMetric = ::GetDfltMetric(0 != PTR_CAST(SwWebView, &rWrtSh.GetView()));
128 0 : SW_MOD()->PutItem(SfxUInt16Item(SID_ATTR_METRIC, static_cast< sal_uInt16 >(eMetric)));
129 0 : SfxItemSet aCoreSet( rWrtSh.GetView().GetPool(),
130 : RES_CHRATR_BEGIN, RES_CHRATR_END-1,
131 : RES_TXTATR_INETFMT, RES_TXTATR_INETFMT,
132 : RES_BACKGROUND, RES_BACKGROUND,
133 : RES_BOX, RES_BOX,
134 : RES_SHADOW, RES_SHADOW,
135 : SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER,
136 : FN_PARAM_SELECTION, FN_PARAM_SELECTION,
137 : SID_HTML_MODE, SID_HTML_MODE,
138 : SID_ATTR_CHAR_WIDTH_FIT_TO_LINE, SID_ATTR_CHAR_WIDTH_FIT_TO_LINE,
139 0 : 0 );
140 0 : rWrtSh.GetCurAttr( aCoreSet );
141 0 : bool bSel = rWrtSh.HasSelection();
142 0 : bool bSelectionPut = false;
143 0 : if(bSel || rWrtSh.IsInWord())
144 : {
145 0 : if(!bSel)
146 : {
147 0 : rWrtSh.StartAction();
148 0 : rWrtSh.Push();
149 0 : if(!rWrtSh.SelectTextAttr( RES_TXTATR_INETFMT ))
150 0 : rWrtSh.SelWrd();
151 : }
152 0 : aCoreSet.Put(SfxStringItem(FN_PARAM_SELECTION, rWrtSh.GetSelText()));
153 0 : bSelectionPut = true;
154 0 : if(!bSel)
155 : {
156 0 : rWrtSh.Pop(false);
157 0 : rWrtSh.EndAction();
158 : }
159 : }
160 : aCoreSet.Put( SfxUInt16Item( SID_ATTR_CHAR_WIDTH_FIT_TO_LINE,
161 0 : rWrtSh.GetScalingOfSelectedText() ) );
162 :
163 0 : ::ConvertAttrCharToGen(aCoreSet, CONV_ATTR_STD);
164 :
165 : // Setting the BoxInfo
166 0 : ::PrepareBoxInfo( aCoreSet, rWrtSh );
167 :
168 0 : aCoreSet.Put(SfxUInt16Item(SID_HTML_MODE, ::GetHtmlMode(rWrtSh.GetView().GetDocShell())));
169 0 : boost::scoped_ptr<SfxAbstractTabDialog> pDlg;
170 0 : if ( bUseDialog && GetActiveView() )
171 : {
172 0 : SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
173 : OSL_ENSURE(pFact, "SwAbstractDialogFactory fail!");
174 :
175 0 : pDlg.reset(pFact->CreateSwCharDlg(rWrtSh.GetView().GetWindow(), rWrtSh.GetView(), aCoreSet, DLG_CHAR_STD));
176 : OSL_ENSURE(pDlg, "Dialog creation failed!");
177 0 : if( FN_INSERT_HYPERLINK == nSlot )
178 0 : pDlg->SetCurPageId("hyperlink");
179 : }
180 0 : if (pDlg && nSlot == SID_CHAR_DLG_EFFECT)
181 : {
182 0 : pDlg->SetCurPageId("fonteffects");
183 : }
184 0 : else if (pDlg && (nSlot == SID_ATTR_CHAR_FONT || nSlot == SID_CHAR_DLG_FOR_PARAGRAPH))
185 : {
186 0 : pDlg->SetCurPageId("font");
187 : }
188 0 : else if (pDlg && pReq)
189 : {
190 0 : SFX_REQUEST_ARG((*pReq), pItem, SfxStringItem, FN_PARAM_1, false);
191 0 : if (pItem)
192 0 : pDlg->SetCurPageId(OUStringToOString(pItem->GetValue(), RTL_TEXTENCODING_UTF8));
193 : }
194 :
195 0 : const SfxItemSet* pSet = NULL;
196 0 : if ( !bUseDialog )
197 0 : pSet = pArgs;
198 0 : else if ( pDlg && pDlg->Execute() == RET_OK ) /* #110771# pDlg can be NULL */
199 : {
200 0 : pSet = pDlg->GetOutputItemSet();
201 : }
202 :
203 0 : if ( pSet)
204 : {
205 0 : SfxItemSet aTmpSet( *pSet );
206 0 : ::ConvertAttrGenToChar(aTmpSet, aCoreSet, CONV_ATTR_STD);
207 :
208 : const SfxPoolItem* pSelectionItem;
209 0 : bool bInsert = false;
210 0 : sal_Int32 nInsert = 0;
211 :
212 : // The old item is for unknown reasons back in the set again.
213 0 : if( !bSelectionPut && SfxItemState::SET == aTmpSet.GetItemState(FN_PARAM_SELECTION, false, &pSelectionItem) )
214 : {
215 0 : OUString sInsert = static_cast<const SfxStringItem*>(pSelectionItem)->GetValue();
216 0 : bInsert = !sInsert.isEmpty();
217 0 : if(bInsert)
218 : {
219 0 : nInsert = sInsert.getLength();
220 0 : rWrtSh.StartAction();
221 0 : rWrtSh.Insert( sInsert );
222 0 : rWrtSh.SetMark();
223 0 : rWrtSh.ExtendSelection(false, sInsert.getLength());
224 0 : SfxRequest aReq( rWrtSh.GetView().GetViewFrame(), FN_INSERT_STRING );
225 0 : aReq.AppendItem( SfxStringItem( FN_INSERT_STRING, sInsert ) );
226 0 : aReq.Done();
227 0 : SfxRequest aReq1( rWrtSh.GetView().GetViewFrame(), FN_CHAR_LEFT );
228 0 : aReq1.AppendItem( SfxInt32Item(FN_PARAM_MOVE_COUNT, nInsert) );
229 0 : aReq1.AppendItem( SfxBoolItem(FN_PARAM_MOVE_SELECTION, true) );
230 0 : aReq1.Done();
231 0 : }
232 : }
233 0 : aTmpSet.ClearItem(FN_PARAM_SELECTION);
234 :
235 0 : SwTextFormatColl* pColl = rWrtSh.GetCurTextFormatColl();
236 0 : if(bSel && rWrtSh.IsSelFullPara() && pColl && pColl->IsAutoUpdateFormat())
237 : {
238 0 : rWrtSh.AutoUpdatePara(pColl, aTmpSet);
239 : }
240 : else
241 0 : rWrtSh.SetAttrSet( aTmpSet );
242 0 : if (pReq)
243 0 : pReq->Done(aTmpSet);
244 0 : if(bInsert)
245 : {
246 0 : SfxRequest aReq1( rWrtSh.GetView().GetViewFrame(), FN_CHAR_RIGHT );
247 0 : aReq1.AppendItem( SfxInt32Item(FN_PARAM_MOVE_COUNT, nInsert) );
248 0 : aReq1.AppendItem( SfxBoolItem(FN_PARAM_MOVE_SELECTION, false) );
249 0 : aReq1.Done();
250 0 : rWrtSh.SwapPam();
251 0 : rWrtSh.ClearMark();
252 0 : rWrtSh.DontExpandFormat();
253 0 : rWrtSh.EndAction();
254 0 : }
255 0 : }
256 0 : }
257 :
258 0 : static short lcl_AskRedlineMode(vcl::Window *pWin)
259 : {
260 : ScopedVclPtrInstance<MessBox> aQBox( pWin, 0,
261 : OUString( SW_RES( STR_REDLINE_TITLE ) ),
262 0 : OUString( SW_RES( STR_REDLINE_MSG ) ) );
263 0 : aQBox->SetImage( QueryBox::GetStandardImage() );
264 : const ButtonDialogFlags nBtnFlags = ButtonDialogFlags::Default |
265 0 : ButtonDialogFlags::OK |
266 0 : ButtonDialogFlags::Focus;
267 :
268 0 : aQBox->AddButton(OUString(SW_RES(STR_REDLINE_ACCEPT_ALL)), RET_OK, nBtnFlags);
269 0 : aQBox->GetPushButton( RET_OK )->SetHelpId(HID_AUTOFORMAT_ACCEPT);
270 0 : aQBox->AddButton(OUString(SW_RES(STR_REDLINE_REJECT_ALL)), RET_CANCEL, ButtonDialogFlags::Cancel);
271 0 : aQBox->GetPushButton( RET_CANCEL )->SetHelpId(HID_AUTOFORMAT_REJECT );
272 0 : aQBox->AddButton(OUString(SW_RES(STR_REDLINE_EDIT)), 2);
273 0 : aQBox->GetPushButton( 2 )->SetHelpId(HID_AUTOFORMAT_EDIT_CHG);
274 0 : aQBox->SetButtonHelpText( RET_OK, OUString() );
275 :
276 0 : return aQBox->Execute();
277 : }
278 :
279 0 : void SwTextShell::Execute(SfxRequest &rReq)
280 : {
281 0 : bool bUseDialog = true;
282 0 : const SfxItemSet *pArgs = rReq.GetArgs();
283 0 : SwWrtShell& rWrtSh = GetShell();
284 0 : const SfxPoolItem* pItem = 0;
285 0 : const sal_uInt16 nSlot = rReq.GetSlot();
286 0 : if(pArgs)
287 0 : pArgs->GetItemState(GetPool().GetWhich(nSlot), false, &pItem);
288 0 : switch( nSlot )
289 : {
290 : case SID_LANGUAGE_STATUS:
291 : {
292 : // get the language
293 0 : OUString aNewLangText;
294 0 : SFX_REQUEST_ARG( rReq, pItem2, SfxStringItem, SID_LANGUAGE_STATUS , false );
295 0 : if (pItem2)
296 0 : aNewLangText = pItem2->GetValue();
297 :
298 : //!! Remember the view frame right now...
299 : //!! (call to GetView().GetViewFrame() will break if the
300 : //!! SwTextShell got destroyed meanwhile.)
301 0 : SfxViewFrame *pViewFrame = GetView().GetViewFrame();
302 :
303 0 : if (aNewLangText == "*")
304 : {
305 : // open the dialog "Tools/Options/Language Settings - Language"
306 : // to set the documents default language
307 0 : SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
308 0 : if (pFact)
309 : {
310 0 : boost::scoped_ptr<VclAbstractDialog> pDlg(pFact->CreateVclDialog( GetView().GetWindow(), SID_LANGUAGE_OPTIONS ));
311 0 : pDlg->Execute();
312 : }
313 : }
314 : else
315 : {
316 : //!! We have to use StartAction / EndAction bracketing in
317 : //!! order to prevent possible destruction of the SwTextShell
318 : //!! due to the selection changes coming below.
319 0 : rWrtSh.StartAction();
320 : // prevent view from jumping because of (temporary) selection changes
321 0 : rWrtSh.LockView( true );
322 :
323 : // setting the new language...
324 0 : if (!aNewLangText.isEmpty())
325 : {
326 0 : const OUString aSelectionLangPrefix("Current_");
327 0 : const OUString aParagraphLangPrefix("Paragraph_");
328 0 : const OUString aDocumentLangPrefix("Default_");
329 0 : const OUString aStrNone("LANGUAGE_NONE");
330 0 : const OUString aStrResetLangs("RESET_LANGUAGES");
331 :
332 0 : SfxItemSet aCoreSet( GetPool(),
333 : RES_CHRATR_LANGUAGE, RES_CHRATR_LANGUAGE,
334 : RES_CHRATR_CJK_LANGUAGE, RES_CHRATR_CJK_LANGUAGE,
335 : RES_CHRATR_CTL_LANGUAGE, RES_CHRATR_CTL_LANGUAGE,
336 0 : 0 );
337 :
338 0 : sal_Int32 nPos = 0;
339 0 : bool bForSelection = true;
340 0 : bool bForParagraph = false;
341 0 : if (-1 != (nPos = aNewLangText.indexOf( aSelectionLangPrefix, 0 )))
342 : {
343 : // ... for the current selection
344 0 : aNewLangText = aNewLangText.replaceAt(nPos, aSelectionLangPrefix.getLength(), "");
345 0 : bForSelection = true;
346 : }
347 0 : else if (-1 != (nPos = aNewLangText.indexOf(aParagraphLangPrefix, 0)))
348 : {
349 : // ... for the current paragraph language
350 0 : aNewLangText = aNewLangText.replaceAt(nPos, aParagraphLangPrefix.getLength(), "");
351 0 : bForSelection = true;
352 0 : bForParagraph = true;
353 : }
354 0 : else if (-1 != (nPos = aNewLangText.indexOf(aDocumentLangPrefix, 0)))
355 : {
356 : // ... as default document language
357 0 : aNewLangText = aNewLangText.replaceAt(nPos, aDocumentLangPrefix.getLength(), "");
358 0 : bForSelection = false;
359 : }
360 :
361 0 : if (bForParagraph || !bForSelection)
362 : {
363 0 : rWrtSh.Push(); // save selection for later restoration
364 0 : rWrtSh.ClearMark(); // fdo#67796: invalidate table crsr
365 : }
366 :
367 0 : if (bForParagraph)
368 0 : SwLangHelper::SelectCurrentPara( rWrtSh );
369 :
370 0 : if (!bForSelection) // document language to be changed...
371 : {
372 0 : rWrtSh.SelAll();
373 0 : rWrtSh.ExtendedSelectAll();
374 : }
375 :
376 0 : rWrtSh.StartUndo( ( !bForParagraph && !bForSelection ) ? UNDO_SETDEFTATTR : UNDO_EMPTY );
377 0 : if (aNewLangText == aStrNone)
378 0 : SwLangHelper::SetLanguage_None( rWrtSh, bForSelection, aCoreSet );
379 0 : else if (aNewLangText == aStrResetLangs)
380 0 : SwLangHelper::ResetLanguages( rWrtSh, bForSelection );
381 : else
382 0 : SwLangHelper::SetLanguage( rWrtSh, aNewLangText, bForSelection, aCoreSet );
383 0 : rWrtSh.EndUndo();
384 :
385 0 : if (bForParagraph || !bForSelection)
386 : {
387 0 : rWrtSh.Pop(false); // restore selection...
388 0 : }
389 : }
390 :
391 0 : rWrtSh.LockView( false );
392 0 : rWrtSh.EndAction();
393 : }
394 :
395 : // invalidate slot to get the new language displayed
396 0 : pViewFrame->GetBindings().Invalidate( nSlot );
397 :
398 0 : rReq.Done();
399 0 : break;
400 : }
401 :
402 : case SID_THES:
403 : {
404 : // replace word/selection with text from selected sub menu entry
405 0 : OUString aReplaceText;
406 0 : SFX_REQUEST_ARG( rReq, pItem2, SfxStringItem, SID_THES , false );
407 0 : if (pItem2)
408 0 : aReplaceText = pItem2->GetValue();
409 0 : if (!aReplaceText.isEmpty())
410 : {
411 0 : SwView &rView2 = rWrtSh.GetView();
412 0 : const bool bSelection = rWrtSh.HasSelection();
413 0 : const OUString aLookUpText = rView2.GetThesaurusLookUpText( bSelection );
414 0 : rView2.InsertThesaurusSynonym( aReplaceText, aLookUpText, bSelection );
415 0 : }
416 : }
417 0 : break;
418 :
419 : case SID_CHARMAP:
420 : {
421 0 : InsertSymbol( rReq );
422 : }
423 0 : break;
424 : case FN_INSERT_FOOTNOTE:
425 : case FN_INSERT_ENDNOTE:
426 : {
427 0 : OUString aStr;
428 0 : SFX_REQUEST_ARG( rReq, pFont, SfxStringItem, FN_PARAM_1 , false );
429 0 : SFX_REQUEST_ARG( rReq, pNameItem, SfxStringItem, nSlot , false );
430 0 : if ( pNameItem )
431 0 : aStr = pNameItem->GetValue();
432 0 : bool bFont = pFont && !pFont->GetValue().isEmpty();
433 0 : rWrtSh.StartUndo( UNDO_UI_INSERT_FOOTNOTE );
434 0 : rWrtSh.InsertFootnote( aStr, nSlot == FN_INSERT_ENDNOTE, !bFont );
435 0 : if ( bFont )
436 : {
437 0 : rWrtSh.Left( CRSR_SKIP_CHARS, true, 1, false );
438 0 : SfxItemSet aSet( rWrtSh.GetAttrPool(), RES_CHRATR_FONT, RES_CHRATR_FONT );
439 0 : rWrtSh.GetCurAttr( aSet );
440 0 : const SvxFontItem &rFont = static_cast<const SvxFontItem &>( aSet.Get( RES_CHRATR_FONT ));
441 0 : SvxFontItem aFont( rFont.GetFamily(), pFont->GetValue(),
442 0 : rFont.GetStyleName(), rFont.GetPitch(), RTL_TEXTENCODING_DONTKNOW, RES_CHRATR_FONT );
443 0 : rWrtSh.SetAttrSet( aSet, SetAttrMode::DONTEXPAND );
444 0 : rWrtSh.ResetSelect(0, false);
445 0 : rWrtSh.EndSelect();
446 0 : rWrtSh.GotoFootnoteText();
447 : }
448 0 : rWrtSh.EndUndo( UNDO_UI_INSERT_FOOTNOTE );
449 0 : rReq.Done();
450 : }
451 0 : break;
452 : case FN_INSERT_FOOTNOTE_DLG:
453 : {
454 0 : SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
455 : OSL_ENSURE(pFact, "Dialog creation failed!");
456 : boost::scoped_ptr<AbstractInsFootNoteDlg> pDlg(pFact->CreateInsFootNoteDlg(
457 0 : GetView().GetWindow(), rWrtSh, false));
458 : OSL_ENSURE(pDlg, "Dialog creation failed!");
459 0 : pDlg->SetHelpId(GetStaticInterface()->GetSlot(nSlot)->GetCommand());
460 0 : if ( pDlg->Execute() == RET_OK )
461 : {
462 0 : const sal_uInt16 nId = pDlg->IsEndNote() ? FN_INSERT_ENDNOTE : FN_INSERT_FOOTNOTE;
463 0 : SfxRequest aReq( GetView().GetViewFrame(), nId );
464 0 : if ( !pDlg->GetStr().isEmpty() )
465 0 : aReq.AppendItem( SfxStringItem( nId, pDlg->GetStr() ) );
466 0 : if ( !pDlg->GetFontName().isEmpty() )
467 0 : aReq.AppendItem( SfxStringItem( FN_PARAM_1, pDlg->GetFontName() ) );
468 0 : ExecuteSlot( aReq );
469 : }
470 :
471 0 : rReq.Ignore();
472 : }
473 0 : break;
474 : case FN_FORMAT_FOOTNOTE_DLG:
475 : {
476 0 : GetView().ExecFormatFootnote();
477 0 : break;
478 : }
479 : case SID_INSERTDOC:
480 : {
481 0 : GetView().ExecuteInsertDoc( rReq, pItem );
482 0 : break;
483 : }
484 : case FN_FORMAT_RESET:
485 : {
486 : // #i78856, reset all attributes but not the language attributes
487 : // (for this build an array of all relevant attributes and
488 : // remove the languages from that)
489 0 : std::set<sal_uInt16> aAttribs;
490 :
491 : sal_uInt16 aResetableSetRange[] = {
492 : RES_FRMATR_BEGIN, RES_FRMATR_END-1,
493 : RES_CHRATR_BEGIN, RES_CHRATR_LANGUAGE - 1,
494 : RES_CHRATR_LANGUAGE + 1, RES_CHRATR_CJK_LANGUAGE - 1,
495 : RES_CHRATR_CJK_LANGUAGE + 1, RES_CHRATR_CTL_LANGUAGE - 1,
496 : RES_CHRATR_CTL_LANGUAGE + 1, RES_CHRATR_END-1,
497 : RES_PARATR_BEGIN, RES_PARATR_END-1,
498 : RES_TXTATR_UNKNOWN_CONTAINER, RES_TXTATR_UNKNOWN_CONTAINER,
499 : RES_UNKNOWNATR_BEGIN, RES_UNKNOWNATR_END-1,
500 : 0
501 0 : };
502 0 : const sal_uInt16 *pUShorts = aResetableSetRange;
503 0 : while (*pUShorts)
504 : {
505 0 : for (sal_uInt16 i = pUShorts[0]; i <= pUShorts[1]; ++i)
506 0 : aAttribs.insert( aAttribs.end(), i );
507 0 : pUShorts += 2;
508 : }
509 : // we don't want to change writing direction.
510 0 : aAttribs.erase( RES_FRAMEDIR );
511 0 : rWrtSh.ResetAttr( aAttribs );
512 0 : rReq.Done();
513 0 : break;
514 : }
515 : case FN_INSERT_BREAK_DLG:
516 : {
517 0 : sal_uInt16 nKind=0;
518 0 : ::boost::optional<sal_uInt16> oPageNumber;
519 0 : OUString aTemplateName;
520 0 : if ( pItem )
521 : {
522 0 : nKind = static_cast<const SfxInt16Item*>(pItem)->GetValue();
523 0 : SFX_REQUEST_ARG( rReq, pTemplate, SfxStringItem, FN_PARAM_1 , false );
524 0 : SFX_REQUEST_ARG( rReq, pNumber, SfxUInt16Item, FN_PARAM_2 , false );
525 0 : SFX_REQUEST_ARG( rReq, pIsNumberFilled, SfxBoolItem, FN_PARAM_3, false );
526 0 : if ( pTemplate )
527 0 : aTemplateName = pTemplate->GetValue();
528 0 : if ( pNumber && pIsNumberFilled && pIsNumberFilled->GetValue() )
529 0 : oPageNumber = pNumber->GetValue();
530 : }
531 : else
532 : {
533 0 : SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
534 : OSL_ENSURE(pFact, "SwAbstractDialogFactory fail!");
535 :
536 0 : boost::scoped_ptr<AbstractSwBreakDlg> pDlg(pFact->CreateSwBreakDlg(GetView().GetWindow(), rWrtSh));
537 : OSL_ENSURE(pDlg, "Dialog creation failed!");
538 0 : if ( pDlg->Execute() == RET_OK )
539 : {
540 0 : nKind = pDlg->GetKind();
541 0 : aTemplateName = pDlg->GetTemplateName();
542 0 : oPageNumber = pDlg->GetPageNumber();
543 :
544 0 : bool bIsNumberFilled = false;
545 0 : sal_uInt16 nPageNumber = 0;
546 :
547 0 : if (oPageNumber)
548 : {
549 0 : bIsNumberFilled = true;
550 0 : nPageNumber = oPageNumber.get();
551 : }
552 :
553 0 : rReq.AppendItem( SfxInt16Item ( FN_INSERT_BREAK_DLG, nKind ) );
554 0 : rReq.AppendItem( SfxStringItem( FN_PARAM_1, aTemplateName ) );
555 0 : rReq.AppendItem( SfxUInt16Item( FN_PARAM_2, nPageNumber ) );
556 0 : rReq.AppendItem( SfxBoolItem ( FN_PARAM_3, bIsNumberFilled ) );
557 0 : rReq.Done();
558 : }
559 : else
560 0 : rReq.Ignore();
561 : }
562 :
563 0 : switch ( nKind )
564 : {
565 : case 1 :
566 0 : rWrtSh.InsertLineBreak(); break;
567 : case 2 :
568 0 : rWrtSh.InsertColumnBreak(); break;
569 : case 3 :
570 : {
571 0 : rWrtSh.StartAllAction();
572 0 : if( !aTemplateName.isEmpty() )
573 0 : rWrtSh.InsertPageBreak( &aTemplateName, oPageNumber );
574 : else
575 0 : rWrtSh.InsertPageBreak();
576 0 : rWrtSh.EndAllAction();
577 : }
578 : }
579 :
580 0 : break;
581 : }
582 : case FN_INSERT_BOOKMARK:
583 : {
584 0 : if ( pItem )
585 : {
586 0 : OUString sName = static_cast<const SfxStringItem*>(pItem)->GetValue();
587 0 : rWrtSh.SetBookmark( vcl::KeyCode(), sName, OUString() );
588 : }
589 : else
590 : {
591 0 : SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
592 : OSL_ENSURE(pFact, "SwAbstractDialogFactory fail!");
593 :
594 0 : boost::scoped_ptr<VclAbstractDialog> pDlg(pFact->CreateSwInsertBookmarkDlg( GetView().GetWindow(), rWrtSh, rReq, DLG_INSERT_BOOKMARK ));
595 : OSL_ENSURE(pDlg, "Dialog creation failed!");
596 0 : pDlg->Execute();
597 : }
598 :
599 0 : break;
600 : }
601 : case FN_DELETE_BOOKMARK:
602 : {
603 0 : if ( pItem )
604 : {
605 0 : IDocumentMarkAccess* const pMarkAccess = rWrtSh.getIDocumentMarkAccess();
606 0 : pMarkAccess->deleteMark( pMarkAccess->findMark(static_cast<const SfxStringItem*>(pItem)->GetValue()) );
607 : }
608 0 : break;
609 : }
610 : case FN_AUTOFORMAT_REDLINE_APPLY:
611 : {
612 0 : SvxSwAutoFormatFlags aFlags(SvxAutoCorrCfg::Get().GetAutoCorrect()->GetSwFlags());
613 : // This must always be false for the postprocessing.
614 0 : aFlags.bAFormatByInput = false;
615 0 : aFlags.bWithRedlining = true;
616 0 : rWrtSh.AutoFormat( &aFlags );
617 0 : aFlags.bWithRedlining = false;
618 :
619 0 : SfxViewFrame* pVFrame = GetView().GetViewFrame();
620 0 : if (pVFrame->HasChildWindow(FN_REDLINE_ACCEPT))
621 0 : pVFrame->ToggleChildWindow(FN_REDLINE_ACCEPT);
622 :
623 0 : SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
624 : OSL_ENSURE(pFact, "SwAbstractDialogFactory fail!");
625 :
626 0 : boost::scoped_ptr<AbstractSwModalRedlineAcceptDlg> pDlg(pFact->CreateSwModalRedlineAcceptDlg(&GetView().GetEditWin()));
627 : OSL_ENSURE(pDlg, "Dialog creation failed!");
628 :
629 0 : switch (lcl_AskRedlineMode(&GetView().GetEditWin()))
630 : {
631 : case RET_OK:
632 : {
633 0 : pDlg->AcceptAll(true);
634 0 : SfxRequest aReq( pVFrame, FN_AUTOFORMAT_APPLY );
635 0 : aReq.Done();
636 0 : rReq.Ignore();
637 0 : break;
638 : }
639 :
640 : case RET_CANCEL:
641 0 : pDlg->AcceptAll(false);
642 0 : rReq.Ignore();
643 0 : break;
644 :
645 : case 2:
646 0 : pDlg->Execute();
647 0 : rReq.Done();
648 0 : break;
649 0 : }
650 : }
651 0 : break;
652 :
653 : case FN_AUTOFORMAT_APPLY:
654 : {
655 0 : SvxSwAutoFormatFlags aFlags(SvxAutoCorrCfg::Get().GetAutoCorrect()->GetSwFlags());
656 : // This must always be false for the postprocessing.
657 0 : aFlags.bAFormatByInput = false;
658 0 : rWrtSh.AutoFormat( &aFlags );
659 0 : rReq.Done();
660 : }
661 0 : break;
662 : case FN_AUTOFORMAT_AUTO:
663 : {
664 0 : SvxAutoCorrCfg& rACfg = SvxAutoCorrCfg::Get();
665 0 : bool bSet = pItem ? static_cast<const SfxBoolItem*>(pItem)->GetValue() : !rACfg.IsAutoFormatByInput();
666 0 : if( bSet != rACfg.IsAutoFormatByInput() )
667 : {
668 0 : rACfg.SetAutoFormatByInput( bSet );
669 0 : GetView().GetViewFrame()->GetBindings().Invalidate( nSlot );
670 0 : if ( !pItem )
671 0 : rReq.AppendItem( SfxBoolItem( GetPool().GetWhich(nSlot), bSet ) );
672 0 : rReq.Done();
673 : }
674 : }
675 0 : break;
676 : case FN_AUTO_CORRECT:
677 : {
678 : // At first set to blank as default.
679 0 : sal_Unicode cChar = ' ';
680 0 : rWrtSh.AutoCorrect( *SvxAutoCorrCfg::Get().GetAutoCorrect(), cChar );
681 0 : rReq.Done();
682 : }
683 0 : break;
684 : case FN_TABLE_SORT_DIALOG:
685 : case FN_SORTING_DLG:
686 : {
687 0 : SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
688 : OSL_ENSURE(pFact, "SwAbstractDialogFactory fail!");
689 :
690 0 : boost::scoped_ptr<VclAbstractDialog> pDlg(pFact->CreateVclAbstractDialog( GetView().GetWindow(), rWrtSh, DLG_SORTING ));
691 : OSL_ENSURE(pDlg, "Dialog creation failed!");
692 0 : pDlg->Execute();
693 0 : pDlg.reset();
694 0 : rReq.Done();
695 : }
696 0 : break;
697 : case FN_NUMBERING_OUTLINE_DLG:
698 : {
699 0 : GetView().ExecNumberingOutline(GetPool());
700 0 : rReq.Done();
701 : }
702 0 : break;
703 : case FN_CALCULATE:
704 : {
705 0 : SwTransferable* pTransfer = new SwTransferable( rWrtSh );
706 : /*??*/ uno::Reference<
707 : datatransfer::XTransferable > xRef(
708 0 : pTransfer );
709 0 : pTransfer->CalculateAndCopy();
710 0 : rReq.Done();
711 : }
712 0 : break;
713 : case FN_GOTO_REFERENCE:
714 : {
715 0 : SwField *pField = rWrtSh.GetCurField();
716 0 : if(pField && pField->GetTypeId() == TYP_GETREFFLD)
717 : {
718 0 : rWrtSh.StartAllAction();
719 : rWrtSh.SwCrsrShell::GotoRefMark( static_cast<SwGetRefField*>(pField)->GetSetRefName(),
720 0 : static_cast<SwGetRefField*>(pField)->GetSubType(),
721 0 : static_cast<SwGetRefField*>(pField)->GetSeqNo() );
722 0 : rWrtSh.EndAllAction();
723 0 : rReq.Done();
724 : }
725 : }
726 0 : break;
727 : case FN_EDIT_FORMULA:
728 : {
729 0 : const sal_uInt16 nId = SwInputChild::GetChildWindowId();
730 0 : SfxViewFrame* pVFrame = GetView().GetViewFrame();
731 0 : if(pItem)
732 : {
733 : //if the ChildWindow is active it has to be removed
734 0 : if( pVFrame->HasChildWindow( nId ) )
735 : {
736 0 : pVFrame->ToggleChildWindow( nId );
737 0 : pVFrame->GetBindings().InvalidateAll( true );
738 : }
739 :
740 0 : OUString sFormula(static_cast<const SfxStringItem*>(pItem)->GetValue());
741 0 : SwFieldMgr aFieldMgr;
742 0 : rWrtSh.StartAllAction();
743 : bool bDelSel;
744 0 : if( (bDelSel = rWrtSh.HasSelection()) )
745 : {
746 0 : rWrtSh.StartUndo( UNDO_START );
747 0 : rWrtSh.DelRight();
748 : }
749 : else
750 : {
751 0 : rWrtSh.EnterStdMode();
752 : }
753 :
754 0 : if( !bDelSel && aFieldMgr.GetCurField() && TYP_FORMELFLD == aFieldMgr.GetCurTypeId() )
755 0 : aFieldMgr.UpdateCurField( aFieldMgr.GetCurField()->GetFormat(), OUString(), sFormula );
756 0 : else if( !sFormula.isEmpty() )
757 : {
758 0 : if( rWrtSh.IsCrsrInTable() )
759 : {
760 0 : SfxItemSet aSet( rWrtSh.GetAttrPool(), RES_BOXATR_FORMULA, RES_BOXATR_FORMULA );
761 0 : aSet.Put( SwTableBoxFormula( sFormula ));
762 0 : rWrtSh.SetTableBoxFormulaAttrs( aSet );
763 0 : rWrtSh.UpdateTable();
764 : }
765 : else
766 : {
767 0 : SvNumberFormatter* pFormatter = rWrtSh.GetNumberFormatter();
768 0 : sal_uLong nSysNumFormat = pFormatter->GetFormatIndex( NF_NUMBER_STANDARD, LANGUAGE_SYSTEM);
769 0 : SwInsertField_Data aData(TYP_FORMELFLD, nsSwGetSetExpType::GSE_FORMULA, OUString(), sFormula, nSysNumFormat);
770 0 : aFieldMgr.InsertField(aData);
771 : }
772 : }
773 :
774 0 : if( bDelSel )
775 0 : rWrtSh.EndUndo( UNDO_END );
776 0 : rWrtSh.EndAllAction();
777 0 : rReq.Done();
778 : }
779 : else
780 : {
781 0 : rWrtSh.EndAllTableBoxEdit();
782 0 : pVFrame->ToggleChildWindow( nId );
783 0 : if( !pVFrame->HasChildWindow( nId ) )
784 0 : pVFrame->GetBindings().InvalidateAll( true );
785 0 : rReq.Ignore();
786 : }
787 : }
788 :
789 0 : break;
790 : case FN_TABLE_UNSET_READ_ONLY:
791 : {
792 0 : rWrtSh.UnProtectTables();
793 : }
794 0 : break;
795 : case FN_EDIT_HYPERLINK:
796 0 : GetView().GetViewFrame()->SetChildWindow(SID_HYPERLINK_DIALOG, true);
797 0 : break;
798 : case FN_REMOVE_HYPERLINK:
799 : {
800 0 : bool bSel = rWrtSh.HasSelection();
801 0 : if(!bSel)
802 : {
803 0 : rWrtSh.StartAction();
804 0 : rWrtSh.Push();
805 0 : if(!rWrtSh.SelectTextAttr( RES_TXTATR_INETFMT ))
806 0 : rWrtSh.SelWrd();
807 : }
808 : //now remove the attribute
809 0 : std::set<sal_uInt16> aAttribs;
810 0 : aAttribs.insert( RES_TXTATR_INETFMT );
811 0 : rWrtSh.ResetAttr( aAttribs );
812 0 : if(!bSel)
813 : {
814 0 : rWrtSh.Pop(false);
815 0 : rWrtSh.EndAction();
816 0 : }
817 : }
818 0 : break;
819 : case SID_ATTR_BRUSH_CHAR :
820 : case SID_ATTR_CHAR_SCALEWIDTH :
821 : case SID_ATTR_CHAR_ROTATED :
822 : case FN_TXTATR_INET :
823 : case FN_INSERT_HYPERLINK:
824 : {
825 0 : const sal_uInt16 nWhich = GetPool().GetWhich( nSlot );
826 0 : if ( pArgs && pArgs->GetItemState( nWhich ) == SfxItemState::SET )
827 0 : bUseDialog = false;
828 : // intentionally no break
829 : }
830 : case SID_CHAR_DLG:
831 : case SID_CHAR_DLG_EFFECT:
832 : {
833 0 : sw_CharDialog( rWrtSh, bUseDialog, nSlot, pArgs, &rReq );
834 : }
835 0 : break;
836 : case SID_CHAR_DLG_FOR_PARAGRAPH:
837 : {
838 0 : rWrtSh.Push(); //save current cursor
839 0 : SwLangHelper::SelectCurrentPara( rWrtSh );
840 0 : sw_CharDialog( rWrtSh, bUseDialog, nSlot, pArgs, &rReq );
841 0 : rWrtSh.Pop( false ); //restore old cursor
842 : }
843 0 : break;
844 : case SID_ATTR_LRSPACE :
845 : case SID_ATTR_ULSPACE :
846 : case SID_ATTR_BRUSH :
847 : case SID_PARA_VERTALIGN :
848 : case SID_ATTR_PARA_NUMRULE :
849 : case SID_ATTR_PARA_REGISTER :
850 : case SID_ATTR_PARA_PAGENUM :
851 : case FN_FORMAT_LINENUMBER :
852 : case FN_NUMBER_NEWSTART :
853 : case FN_NUMBER_NEWSTART_AT :
854 : case FN_FORMAT_DROPCAPS :
855 : case FN_DROP_TEXT:
856 : case SID_ATTR_PARA_LRSPACE:
857 : {
858 0 : const sal_uInt16 nWhich = GetPool().GetWhich( nSlot );
859 0 : if ( pArgs && pArgs->GetItemState( nWhich ) == SfxItemState::SET )
860 0 : bUseDialog = false;
861 : // intentionally no break
862 :
863 : }
864 : case SID_PARA_DLG:
865 : {
866 0 : SwPaM* pPaM = NULL;
867 :
868 0 : if ( pArgs )
869 : {
870 0 : const SfxPoolItem* pPaMItem = 0;
871 0 : pArgs->GetItemState( GetPool().GetWhich( FN_PARAM_PAM ), false, &pPaMItem );
872 0 : if ( pPaMItem )
873 0 : pPaM = static_cast< const SwPaMItem* >( pPaMItem )->GetValue( );
874 : }
875 :
876 0 : if ( !pPaM )
877 0 : pPaM = rWrtSh.GetCrsr();
878 :
879 0 : FieldUnit eMetric = ::GetDfltMetric(0 != PTR_CAST(SwWebView, &GetView()));
880 0 : SW_MOD()->PutItem(SfxUInt16Item(SID_ATTR_METRIC, static_cast< sal_uInt16 >(eMetric)));
881 :
882 0 : bool bApplyCharUnit = ::HasCharUnit(0 != PTR_CAST(SwWebView, &GetView()));
883 0 : SW_MOD()->PutItem(SfxBoolItem(SID_ATTR_APPLYCHARUNIT, bApplyCharUnit));
884 :
885 0 : SfxItemSet aCoreSet( GetPool(), //UUUU sorted by indices, one group of three concatenated
886 : RES_PARATR_BEGIN, RES_PARATR_END - 1, // [60
887 : RES_PARATR_LIST_BEGIN, RES_PARATR_LIST_END - 1, // [77
888 : RES_FRMATR_BEGIN, RES_FRMATR_END - 1, // [82
889 :
890 : //UUUU FillAttribute support
891 : XATTR_FILL_FIRST, XATTR_FILL_LAST, // [1014
892 :
893 : // includes SID_ATTR_TABSTOP_POS
894 : SID_ATTR_TABSTOP_DEFAULTS, SID_ATTR_TABSTOP_OFFSET, // [10003 .. 10005
895 :
896 : SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER, // [10023
897 : SID_ATTR_PARA_MODEL, SID_ATTR_PARA_KEEP, // [10065
898 :
899 : //UUUU items to hand over XPropertyList things like
900 : // XColorList, XHatchList, XGradientList and XBitmapList
901 : // to the Area TabPage
902 : SID_COLOR_TABLE, SID_BITMAP_LIST, // [10179
903 :
904 : SID_HTML_MODE, SID_HTML_MODE, // [10414
905 : SID_ATTR_PARA_PAGENUM, SID_ATTR_PARA_PAGENUM, // [10457
906 : FN_PARAM_1, FN_PARAM_1, // [21160
907 : FN_NUMBER_NEWSTART, FN_NUMBER_NEWSTART_AT, // [21738
908 : FN_DROP_TEXT, FN_DROP_CHAR_STYLE_NAME, // [22418
909 0 : 0);
910 :
911 : // get also the list level indent values merged as LR-SPACE item, if needed.
912 0 : rWrtSh.GetCurAttr( aCoreSet, true );
913 :
914 : //UUUU create needed items for XPropertyList entries from the DrawModel so that
915 : // the Area TabPage can access them
916 : // Do this after GetCurAttr, this resets the ItemSet content again
917 0 : const SwDrawModel* pDrawModel = GetView().GetDocShell()->GetDoc()->getIDocumentDrawModelAccess().GetDrawModel();
918 :
919 0 : aCoreSet.Put(SvxColorListItem(pDrawModel->GetColorList(), SID_COLOR_TABLE));
920 0 : aCoreSet.Put(SvxGradientListItem(pDrawModel->GetGradientList(), SID_GRADIENT_LIST));
921 0 : aCoreSet.Put(SvxHatchListItem(pDrawModel->GetHatchList(), SID_HATCH_LIST));
922 0 : aCoreSet.Put(SvxBitmapListItem(pDrawModel->GetBitmapList(), SID_BITMAP_LIST));
923 :
924 : aCoreSet.Put(SfxUInt16Item(SID_HTML_MODE,
925 0 : ::GetHtmlMode(GetView().GetDocShell())));
926 :
927 : // Tabulators: Put DefaultTabs into ItemSet
928 : const SvxTabStopItem& rDefTabs = static_cast<const SvxTabStopItem&>(
929 0 : GetPool().GetDefaultItem(RES_PARATR_TABSTOP));
930 :
931 0 : const sal_uInt16 nDefDist = static_cast<sal_uInt16>(::GetTabDist( rDefTabs ));
932 0 : SfxUInt16Item aDefDistItem( SID_ATTR_TABSTOP_DEFAULTS, nDefDist );
933 0 : aCoreSet.Put( aDefDistItem );
934 :
935 : // Current tabulator
936 0 : SfxUInt16Item aTabPos( SID_ATTR_TABSTOP_POS, 0 );
937 0 : aCoreSet.Put( aTabPos );
938 :
939 : // Left border as offset
940 : //#i24363# tab stops relative to indent
941 0 : const long nOff = rWrtSh.getIDocumentSettingAccess()->get(DocumentSettingId::TABS_RELATIVE_TO_INDENT) ?
942 0 : static_cast<const SvxLRSpaceItem&>(aCoreSet.Get( RES_LR_SPACE )).GetTextLeft() : 0;
943 0 : SfxInt32Item aOff( SID_ATTR_TABSTOP_OFFSET, nOff );
944 0 : aCoreSet.Put( aOff );
945 :
946 : // Setting the BoxInfo
947 0 : ::PrepareBoxInfo( aCoreSet, rWrtSh );
948 :
949 : // Current page format
950 0 : ::SwToSfxPageDescAttr( aCoreSet );
951 :
952 : // Properties of numbering
953 0 : if (rWrtSh.GetNumRuleAtCurrCrsrPos())
954 : {
955 0 : SfxBoolItem aStart( FN_NUMBER_NEWSTART, rWrtSh.IsNumRuleStart( pPaM ) );
956 0 : aCoreSet.Put(aStart);
957 : SfxUInt16Item aStartAt( FN_NUMBER_NEWSTART_AT,
958 0 : rWrtSh.GetNodeNumStart( pPaM ) );
959 0 : aCoreSet.Put(aStartAt);
960 : }
961 0 : boost::scoped_ptr<SfxAbstractTabDialog> pDlg;
962 :
963 0 : if ( bUseDialog && GetActiveView() )
964 : {
965 0 : OString sDefPage;
966 0 : if (pItem)
967 0 : sDefPage = OUStringToOString(static_cast<const SfxStringItem*>(pItem)->GetValue(), RTL_TEXTENCODING_UTF8);
968 :
969 0 : SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
970 : OSL_ENSURE(pFact, "SwAbstractDialogFactory fail!");
971 :
972 0 : pDlg.reset(pFact->CreateSwParaDlg( GetView().GetWindow(),GetView(), aCoreSet, DLG_STD, NULL, false, sDefPage ));
973 0 : OSL_ENSURE(pDlg, "Dialog creation failed!");
974 : }
975 0 : SfxItemSet* pSet = NULL;
976 0 : if ( !bUseDialog )
977 : {
978 0 : if ( nSlot == SID_ATTR_PARA_LRSPACE)
979 : {
980 0 : SvxLRSpaceItem aParaMargin(static_cast<const SvxLRSpaceItem&>(pArgs->Get(nSlot)));
981 0 : aParaMargin.SetWhich( RES_LR_SPACE);
982 0 : aCoreSet.Put(aParaMargin);
983 0 : pSet = &aCoreSet;
984 :
985 : } else
986 0 : pSet = const_cast<SfxItemSet*>(pArgs);
987 :
988 : }
989 0 : else if ( pDlg && pDlg->Execute() == RET_OK )
990 : {
991 : // Apply defaults if necessary.
992 0 : pSet = const_cast<SfxItemSet*>(pDlg->GetOutputItemSet());
993 : sal_uInt16 nNewDist;
994 0 : if( SfxItemState::SET == pSet->GetItemState( SID_ATTR_TABSTOP_DEFAULTS, false, &pItem ) &&
995 0 : nDefDist != (nNewDist = static_cast<const SfxUInt16Item*>(pItem)->GetValue()) )
996 : {
997 0 : SvxTabStopItem aDefTabs( 0, 0, SVX_TAB_ADJUST_DEFAULT, RES_PARATR_TABSTOP );
998 0 : MakeDefTabs( nNewDist, aDefTabs );
999 0 : rWrtSh.SetDefault( aDefTabs );
1000 0 : pSet->ClearItem( SID_ATTR_TABSTOP_DEFAULTS );
1001 : }
1002 :
1003 0 : if ( SfxItemState::SET == pSet->GetItemState(FN_PARAM_1,false,&pItem) )
1004 : {
1005 0 : pSet->Put(SfxStringItem(FN_DROP_TEXT, static_cast<const SfxStringItem*>(pItem)->GetValue()));
1006 0 : pSet->ClearItem(FN_PARAM_1);
1007 : }
1008 :
1009 0 : if( SfxItemState::SET == pSet->GetItemState( RES_PARATR_DROP, false, &pItem ))
1010 : {
1011 0 : OUString sCharStyleName;
1012 0 : if(static_cast<const SwFormatDrop*>(pItem)->GetCharFormat())
1013 0 : sCharStyleName = static_cast<const SwFormatDrop*>(pItem)->GetCharFormat()->GetName();
1014 0 : pSet->Put(SfxStringItem(FN_DROP_CHAR_STYLE_NAME, sCharStyleName));
1015 : }
1016 : }
1017 :
1018 0 : if ( pSet )
1019 : {
1020 0 : rReq.Done( *pSet );
1021 0 : ::SfxToSwPageDescAttr( rWrtSh, *pSet );
1022 : // #i56253#
1023 : // enclose all undos.
1024 : // Thus, check conditions, if actions will be performed.
1025 0 : const bool bUndoNeeded( pSet->Count() ||
1026 0 : SfxItemState::SET == pSet->GetItemState(FN_NUMBER_NEWSTART) ||
1027 0 : SfxItemState::SET == pSet->GetItemState(FN_NUMBER_NEWSTART_AT) );
1028 0 : if ( bUndoNeeded )
1029 : {
1030 0 : rWrtSh.StartUndo( UNDO_INSATTR );
1031 : }
1032 0 : if( pSet->Count() )
1033 : {
1034 0 : rWrtSh.StartAction();
1035 0 : if ( SfxItemState::SET == pSet->GetItemState(FN_DROP_TEXT, false, &pItem) )
1036 : {
1037 0 : if ( !static_cast<const SfxStringItem*>(pItem)->GetValue().isEmpty() )
1038 0 : rWrtSh.ReplaceDropText(static_cast<const SfxStringItem*>(pItem)->GetValue(), pPaM);
1039 : }
1040 0 : rWrtSh.SetAttrSet( *pSet, SetAttrMode::DEFAULT, pPaM );
1041 0 : rWrtSh.EndAction();
1042 0 : SwTextFormatColl* pColl = rWrtSh.GetPaMTextFormatColl( pPaM );
1043 0 : if(pColl && pColl->IsAutoUpdateFormat())
1044 : {
1045 0 : rWrtSh.AutoUpdatePara(pColl, *pSet, pPaM);
1046 : }
1047 : }
1048 :
1049 0 : if( SfxItemState::SET == pSet->GetItemState(FN_NUMBER_NEWSTART) )
1050 : {
1051 : //SetNumRuleStart(true) restarts the numbering at the value
1052 : //that is defined at the starting point of the numbering level
1053 : //otherwise the SetNodeNumStart() value determines the start
1054 : //if it's set to something different than USHRT_MAX
1055 :
1056 0 : bool bStart = static_cast<const SfxBoolItem&>(pSet->Get(FN_NUMBER_NEWSTART)).GetValue();
1057 :
1058 : // Default value for restart value has to be USHRT_MAX
1059 : // in order to indicate that the restart value of the list
1060 : // style has to be used on restart.
1061 0 : sal_uInt16 nNumStart = USHRT_MAX;
1062 0 : if( SfxItemState::SET == pSet->GetItemState(FN_NUMBER_NEWSTART_AT) )
1063 : {
1064 0 : nNumStart = static_cast<const SfxUInt16Item&>(pSet->Get(FN_NUMBER_NEWSTART_AT)).GetValue();
1065 : }
1066 0 : rWrtSh.SetNumRuleStart(bStart, pPaM);
1067 0 : rWrtSh.SetNodeNumStart(nNumStart);
1068 : }
1069 0 : else if( SfxItemState::SET == pSet->GetItemState(FN_NUMBER_NEWSTART_AT) )
1070 : {
1071 0 : rWrtSh.SetNodeNumStart(static_cast<const SfxUInt16Item&>(pSet->Get(FN_NUMBER_NEWSTART_AT)).GetValue());
1072 0 : rWrtSh.SetNumRuleStart(false, pPaM);
1073 : }
1074 : // #i56253#
1075 0 : if ( bUndoNeeded )
1076 : {
1077 0 : rWrtSh.EndUndo( UNDO_INSATTR );
1078 : }
1079 0 : }
1080 : }
1081 0 : break;
1082 : case FN_NUM_CONTINUE:
1083 : {
1084 0 : OUString sContinuedListId;
1085 : const SwNumRule* pRule =
1086 0 : rWrtSh.SearchNumRule( false, true, false, -1, sContinuedListId );
1087 : // #i86492#
1088 : // Search also for bullet list
1089 0 : if ( !pRule )
1090 : {
1091 0 : pRule = rWrtSh.SearchNumRule( false, false, false, -1, sContinuedListId );
1092 : }
1093 0 : if ( pRule )
1094 : {
1095 0 : rWrtSh.SetCurNumRule( *pRule, false, sContinuedListId );
1096 0 : }
1097 : }
1098 0 : break;
1099 :
1100 : case FN_SELECT_PARA:
1101 : {
1102 0 : if ( !rWrtSh.IsSttOfPara() )
1103 0 : rWrtSh.SttPara( false );
1104 : else
1105 0 : rWrtSh.EnterStdMode();
1106 0 : rWrtSh.EndPara( true );
1107 : }
1108 0 : break;
1109 :
1110 : case SID_DEC_INDENT:
1111 : case SID_INC_INDENT:
1112 : //According to the requirement, modified the behavior when user
1113 : //using the indent button on the toolbar. Now if we increase/decrease indent for a
1114 : //paragraph which has bullet style it will increase/decrease the bullet level.
1115 : {
1116 : //If the current paragraph has bullet call the function to
1117 : //increase or decrease the bullet level.
1118 : //Why could I know whether a paragraph has bullet or not by checking the below conditions?
1119 : //Please refer to the "case KEY_TAB:" section in SwEditWin::KeyInput(..) :
1120 : // if( rSh.GetCurNumRule() && rSh.IsSttOfPara() &&
1121 : // !rSh.HasReadonlySel() )
1122 : // eKeyState = KS_NumDown;
1123 : //Above code demonstrates that when the cursor is at the start of a paragraph which has bullet,
1124 : //press TAB will increase the bullet level.
1125 : //So I copied from that ^^
1126 0 : if ( rWrtSh.GetNumRuleAtCurrCrsrPos() && !rWrtSh.HasReadonlySel() )
1127 : {
1128 0 : rWrtSh.NumUpDown( SID_INC_INDENT == nSlot );
1129 : }
1130 : else //execute the original processing functions
1131 : {
1132 : //below is copied of the old codes
1133 0 : rWrtSh.MoveLeftMargin( SID_INC_INDENT == nSlot, rReq.GetModifier() != KEY_MOD1 );
1134 : }
1135 : }
1136 0 : rReq.Done();
1137 0 : break;
1138 :
1139 : case FN_DEC_INDENT_OFFSET:
1140 : case FN_INC_INDENT_OFFSET:
1141 0 : rWrtSh.MoveLeftMargin( FN_INC_INDENT_OFFSET == nSlot, rReq.GetModifier() == KEY_MOD1 );
1142 0 : rReq.Done();
1143 0 : break;
1144 :
1145 : case SID_ATTR_CHAR_COLOR2:
1146 : {
1147 0 : if(pItem)
1148 : {
1149 0 : Color aSet = static_cast<const SvxColorItem*>(pItem)->GetValue();
1150 0 : SwEditWin& rEditWin = GetView().GetEditWin();
1151 0 : SwEditWin::SetWaterCanTextColor(aSet);
1152 0 : SwApplyTemplate* pApply = rEditWin.GetApplyTemplate();
1153 :
1154 : // If there is a selection, then set the color on it
1155 : // otherwise, it'll be the color for the next text to be typed
1156 0 : if(!pApply || pApply->nColor != SID_ATTR_CHAR_COLOR_EXT)
1157 : {
1158 0 : rWrtSh.SetAttrItem(SvxColorItem (aSet, RES_CHRATR_COLOR));
1159 : }
1160 :
1161 0 : rReq.Done();
1162 : }
1163 : }
1164 0 : break;
1165 : case SID_ATTR_CHAR_COLOR_BACKGROUND:
1166 : {
1167 0 : Color aSet;
1168 0 : if(pItem)
1169 0 : aSet = static_cast<const SvxColorItem*>(pItem)->GetValue();
1170 : else
1171 0 : aSet = COL_TRANSPARENT;
1172 :
1173 0 : SwEditWin& rEdtWin = GetView().GetEditWin();
1174 0 : SwEditWin::SetWaterCanTextBackColor(aSet);
1175 0 : SwApplyTemplate* pApply = rEdtWin.GetApplyTemplate();
1176 :
1177 0 : if(!pApply && (rWrtSh.HasSelection() || rReq.IsAPI()))
1178 : {
1179 0 : rWrtSh.StartUndo( UNDO_INSATTR );
1180 0 : SvxBrushItem aBrushItem(RES_CHRATR_BACKGROUND);
1181 0 : aBrushItem.SetColor(aSet);
1182 0 : rWrtSh.SetAttrItem( aBrushItem );
1183 :
1184 : // Remove MS specific highlight when background is set
1185 0 : rWrtSh.SetAttrItem( SvxBrushItem(RES_CHRATR_HIGHLIGHT) );
1186 :
1187 : // Remove shading marker
1188 0 : SfxItemSet aCoreSet( rWrtSh.GetView().GetPool(), RES_CHRATR_GRABBAG, RES_CHRATR_GRABBAG );
1189 0 : rWrtSh.GetCurAttr( aCoreSet );
1190 :
1191 : const SfxPoolItem *pTmpItem;
1192 0 : if( SfxItemState::SET == aCoreSet.GetItemState( RES_CHRATR_GRABBAG, false, &pTmpItem ) )
1193 : {
1194 0 : SfxGrabBagItem aGrabBag(*static_cast<const SfxGrabBagItem*>(pTmpItem));
1195 0 : std::map<OUString, com::sun::star::uno::Any>& rMap = aGrabBag.GetGrabBag();
1196 0 : auto aIterator = rMap.find("CharShadingMarker");
1197 0 : if( aIterator != rMap.end() )
1198 : {
1199 0 : aIterator->second = uno::makeAny(false);
1200 : }
1201 0 : rWrtSh.SetAttrItem( aGrabBag );
1202 : }
1203 0 : rWrtSh.EndUndo( UNDO_INSATTR );
1204 : }
1205 0 : else if(!pApply || pApply->nColor != SID_ATTR_CHAR_COLOR_BACKGROUND_EXT)
1206 : {
1207 0 : GetView().GetViewFrame()->GetDispatcher()->Execute(SID_ATTR_CHAR_COLOR_BACKGROUND_EXT);
1208 : }
1209 :
1210 0 : rReq.Done();
1211 : }
1212 0 : break;
1213 : case SID_ATTR_CHAR_COLOR_BACKGROUND_EXT:
1214 : case SID_ATTR_CHAR_COLOR_EXT:
1215 : {
1216 0 : SwEditWin& rEdtWin = GetView().GetEditWin();
1217 0 : if (pItem)
1218 : {
1219 : // The reason we need this argument here is that when a toolbar is closed
1220 : // and reopened, its color resets, while SwEditWin still holds the old one.
1221 0 : Color aSet = static_cast<const SvxColorItem*>(pItem)->GetValue();
1222 0 : if( nSlot == SID_ATTR_CHAR_COLOR_BACKGROUND_EXT )
1223 0 : SwEditWin::SetWaterCanTextBackColor(aSet);
1224 : else
1225 0 : SwEditWin::SetWaterCanTextColor(aSet);
1226 : }
1227 :
1228 0 : SwApplyTemplate* pApply = rEdtWin.GetApplyTemplate();
1229 0 : SwApplyTemplate aTempl;
1230 0 : if ( rWrtSh.HasSelection() )
1231 : {
1232 0 : if(nSlot == SID_ATTR_CHAR_COLOR_BACKGROUND_EXT)
1233 : {
1234 0 : rWrtSh.StartUndo( UNDO_INSATTR );
1235 : rWrtSh.SetAttrItem(
1236 0 : SvxBrushItem( SwEditWin::GetWaterCanTextBackColor(), RES_CHRATR_BACKGROUND) );
1237 :
1238 : // Remove MS specific highlight when background is set
1239 0 : rWrtSh.SetAttrItem( SvxBrushItem(RES_CHRATR_HIGHLIGHT) );
1240 :
1241 : // Remove shading marker
1242 0 : SfxItemSet aCoreSet( rWrtSh.GetView().GetPool(), RES_CHRATR_GRABBAG, RES_CHRATR_GRABBAG );
1243 0 : rWrtSh.GetCurAttr( aCoreSet );
1244 :
1245 : const SfxPoolItem *pTmpItem;
1246 0 : if( SfxItemState::SET == aCoreSet.GetItemState( RES_CHRATR_GRABBAG, false, &pTmpItem ) )
1247 : {
1248 0 : SfxGrabBagItem aGrabBag(*static_cast<const SfxGrabBagItem*>(pTmpItem));
1249 0 : std::map<OUString, com::sun::star::uno::Any>& rMap = aGrabBag.GetGrabBag();
1250 0 : auto aIterator = rMap.find("CharShadingMarker");
1251 0 : if( aIterator != rMap.end() )
1252 : {
1253 0 : aIterator->second = uno::makeAny(false);
1254 : }
1255 0 : rWrtSh.SetAttrItem( aGrabBag );
1256 : }
1257 0 : rWrtSh.EndUndo( UNDO_INSATTR );
1258 : }
1259 : else
1260 : rWrtSh.SetAttrItem(
1261 0 : SvxColorItem( SwEditWin::GetWaterCanTextColor(), RES_CHRATR_COLOR) );
1262 : }
1263 : else
1264 : {
1265 0 : if(!pApply || pApply->nColor != nSlot)
1266 0 : aTempl.nColor = nSlot;
1267 0 : rEdtWin.SetApplyTemplate(aTempl);
1268 : }
1269 :
1270 0 : rReq.Done();
1271 : }
1272 0 : break;
1273 :
1274 : case FN_NUM_BULLET_MOVEDOWN:
1275 0 : if (!rWrtSh.IsAddMode())
1276 0 : rWrtSh.MoveParagraph(1);
1277 0 : rReq.Done();
1278 0 : break;
1279 :
1280 : case FN_NUM_BULLET_MOVEUP:
1281 0 : if (!rWrtSh.IsAddMode())
1282 0 : rWrtSh.MoveParagraph(-1);
1283 0 : rReq.Done();
1284 0 : break;
1285 : case SID_RUBY_DIALOG:
1286 : case SID_HYPERLINK_DIALOG:
1287 : {
1288 0 : SfxRequest aReq(nSlot, SfxCallMode::SLOT, SfxGetpApp()->GetPool());
1289 0 : GetView().GetViewFrame()->ExecuteSlot( aReq);
1290 0 : rReq.Ignore();
1291 : }
1292 0 : break;
1293 : case FN_INSERT_PAGEHEADER:
1294 : case FN_INSERT_PAGEFOOTER:
1295 0 : if(pArgs && pArgs->Count())
1296 : {
1297 0 : OUString sStyleName;
1298 0 : if(pItem)
1299 0 : sStyleName = static_cast<const SfxStringItem*>(pItem)->GetValue();
1300 0 : bool bOn = true;
1301 0 : if( SfxItemState::SET == pArgs->GetItemState(FN_PARAM_1, false, &pItem))
1302 0 : bOn = static_cast<const SfxBoolItem*>(pItem)->GetValue();
1303 0 : rWrtSh.ChangeHeaderOrFooter(sStyleName, FN_INSERT_PAGEHEADER == nSlot, bOn, !rReq.IsAPI());
1304 0 : rReq.Done();
1305 : }
1306 0 : break;
1307 : case FN_READONLY_SELECTION_MODE :
1308 0 : if(GetView().GetDocShell()->IsReadOnly())
1309 : {
1310 : rWrtSh.SetReadonlySelectionOption(
1311 0 : !rWrtSh.GetViewOptions()->IsSelectionInReadonly());
1312 0 : rWrtSh.ShowCrsr();
1313 : }
1314 0 : break;
1315 : case FN_SELECTION_MODE_DEFAULT:
1316 : case FN_SELECTION_MODE_BLOCK :
1317 : {
1318 0 : bool bSetBlockMode = !rWrtSh.IsBlockMode();
1319 0 : if( pArgs && SfxItemState::SET == pArgs->GetItemState(nSlot, false, &pItem))
1320 0 : bSetBlockMode = static_cast<const SfxBoolItem*>(pItem)->GetValue();
1321 0 : if( ( nSlot == FN_SELECTION_MODE_DEFAULT ) != bSetBlockMode )
1322 0 : rWrtSh.EnterBlockMode();
1323 : else
1324 0 : rWrtSh.EnterStdMode();
1325 0 : SfxBindings &rBnd = GetView().GetViewFrame()->GetBindings();
1326 0 : rBnd.Invalidate(FN_STAT_SELMODE);
1327 0 : rBnd.Update(FN_STAT_SELMODE);
1328 : }
1329 0 : break;
1330 : case SID_OPEN_HYPERLINK:
1331 : case FN_COPY_HYPERLINK_LOCATION:
1332 : {
1333 0 : SfxItemSet aSet(GetPool(),
1334 : RES_TXTATR_INETFMT,
1335 0 : RES_TXTATR_INETFMT);
1336 0 : rWrtSh.GetCurAttr(aSet);
1337 0 : if(SfxItemState::SET <= aSet.GetItemState( RES_TXTATR_INETFMT, true ))
1338 : {
1339 0 : const SwFormatINetFormat& rINetFormat = dynamic_cast<const SwFormatINetFormat&>( aSet.Get(RES_TXTATR_INETFMT, true) );
1340 0 : if( nSlot == FN_COPY_HYPERLINK_LOCATION )
1341 : {
1342 0 : ::uno::Reference< datatransfer::clipboard::XClipboard > xClipboard = GetView().GetEditWin().GetClipboard();
1343 : vcl::unohelper::TextDataObject::CopyStringTo(
1344 0 : rINetFormat.GetValue(),
1345 0 : xClipboard );
1346 : }
1347 : else
1348 0 : rWrtSh.ClickToINetAttr(rINetFormat, URLLOAD_NOFILTER);
1349 0 : }
1350 : }
1351 0 : break;
1352 : case SID_OPEN_XML_FILTERSETTINGS:
1353 : {
1354 0 : HandleOpenXmlFilterSettings(rReq);
1355 : }
1356 0 : break;
1357 : case FN_FORMAT_APPLY_HEAD1:
1358 : {
1359 : }
1360 0 : break;
1361 : case FN_FORMAT_APPLY_HEAD2:
1362 : {
1363 : }
1364 0 : break;
1365 : case FN_FORMAT_APPLY_HEAD3:
1366 : {
1367 : }
1368 0 : break;
1369 : case FN_FORMAT_APPLY_DEFAULT:
1370 : {
1371 : }
1372 0 : break;
1373 : case FN_FORMAT_APPLY_TEXTBODY:
1374 : {
1375 : }
1376 0 : break;
1377 : case FN_WORDCOUNT_DIALOG:
1378 : {
1379 0 : GetView().UpdateWordCount(this, nSlot);
1380 : }
1381 0 : break;
1382 : default:
1383 : OSL_ENSURE(false, "wrong dispatcher");
1384 0 : return;
1385 : }
1386 : }
1387 :
1388 7633 : void SwTextShell::GetState( SfxItemSet &rSet )
1389 : {
1390 7633 : SwWrtShell &rSh = GetShell();
1391 7633 : SfxWhichIter aIter( rSet );
1392 7633 : sal_uInt16 nWhich = aIter.FirstWhich();
1393 30570 : while ( nWhich )
1394 : {
1395 15304 : switch ( nWhich )
1396 : {
1397 : case SID_LANGUAGE_STATUS:
1398 : {
1399 : // the value of used script types
1400 529 : OUString aScriptTypesInUse( OUString::number( static_cast<int>(rSh.GetScriptType()) ) );
1401 :
1402 : // get keyboard language
1403 1058 : OUString aKeyboardLang;
1404 529 : SwEditWin& rEditWin = GetView().GetEditWin();
1405 529 : LanguageType nLang = rEditWin.GetInputLanguage();
1406 529 : if (nLang != LANGUAGE_DONTKNOW && nLang != LANGUAGE_SYSTEM)
1407 0 : aKeyboardLang = SvtLanguageTable::GetLanguageString( nLang );
1408 :
1409 : // get the language that is in use
1410 1058 : OUString aCurrentLang = "*";
1411 529 : nLang = SwLangHelper::GetCurrentLanguage( rSh );
1412 529 : if (nLang != LANGUAGE_DONTKNOW)
1413 529 : aCurrentLang = SvtLanguageTable::GetLanguageString( nLang );
1414 :
1415 : // build sequence for status value
1416 1058 : uno::Sequence< OUString > aSeq( 4 );
1417 529 : aSeq[0] = aCurrentLang;
1418 529 : aSeq[1] = aScriptTypesInUse;
1419 529 : aSeq[2] = aKeyboardLang;
1420 529 : aSeq[3] = SwLangHelper::GetTextForLanguageGuessing( rSh );
1421 :
1422 : // set sequence as status value
1423 1058 : SfxStringListItem aItem( SID_LANGUAGE_STATUS );
1424 529 : aItem.SetStringList( aSeq );
1425 1058 : rSet.Put( aItem, SID_LANGUAGE_STATUS );
1426 : }
1427 529 : break;
1428 :
1429 : case SID_THES:
1430 : {
1431 : // is there a valid selection to get text from?
1432 0 : OUString aText;
1433 0 : bool bValid = !rSh.HasSelection() ||
1434 0 : (rSh.IsSelOnePara() && !rSh.IsMultiSelection());
1435 : // prevent context menu from showing when cursor is not in or at the end of a word
1436 : // (GetCurWord will return the next word if there is none at the current position...)
1437 0 : const sal_Int16 nWordType = ::i18n::WordType::DICTIONARY_WORD;
1438 0 : bool bWord = rSh.IsInWord( nWordType ) || rSh.IsStartWord( nWordType ) || rSh.IsEndWord( nWordType );
1439 0 : if (bValid && bWord)
1440 0 : aText = rSh.HasSelection()? OUString(rSh.GetSelText()) : rSh.GetCurWord();
1441 :
1442 0 : LanguageType nLang = rSh.GetCurLang();
1443 0 : LanguageTag aLanguageTag( nLang);
1444 0 : lang::Locale aLocale( aLanguageTag.getLocale());
1445 0 : OUString aLangText( aLanguageTag.getBcp47() );
1446 :
1447 : // set word and locale to look up as status value
1448 0 : OUString aStatusVal = aText + "#" + aLangText;
1449 :
1450 0 : rSet.Put( SfxStringItem( SID_THES, aStatusVal ) );
1451 :
1452 : // disable "Thesaurus" context menu entry if there is nothing to look up
1453 0 : uno::Reference< linguistic2::XThesaurus > xThes( ::GetThesaurus() );
1454 0 : if (aText.isEmpty() ||
1455 0 : !xThes.is() || nLang == LANGUAGE_NONE || !xThes->hasLocale( aLocale ))
1456 0 : rSet.DisableItem( SID_THES );
1457 : }
1458 0 : break;
1459 :
1460 : case FN_NUMBER_NEWSTART :
1461 0 : if(!rSh.GetNumRuleAtCurrCrsrPos())
1462 0 : rSet.DisableItem(nWhich);
1463 : else
1464 : rSet.Put(SfxBoolItem(FN_NUMBER_NEWSTART,
1465 0 : rSh.IsNumRuleStart()));
1466 0 : break;
1467 :
1468 : case FN_EDIT_FORMULA:
1469 : case SID_CHARMAP:
1470 : {
1471 856 : const int nType = rSh.GetSelectionType();
1472 856 : if (!(nType & nsSelectionType::SEL_TXT) &&
1473 0 : !(nType & nsSelectionType::SEL_TBL) &&
1474 0 : !(nType & nsSelectionType::SEL_NUM))
1475 : {
1476 0 : rSet.DisableItem(nWhich);
1477 : }
1478 856 : else if ( nWhich == FN_EDIT_FORMULA
1479 856 : && rSh.CrsrInsideInputField() )
1480 : {
1481 0 : rSet.DisableItem( nWhich );
1482 : }
1483 : }
1484 856 : break;
1485 :
1486 : case FN_INSERT_ENDNOTE:
1487 : case FN_INSERT_FOOTNOTE:
1488 : case FN_INSERT_FOOTNOTE_DLG:
1489 : {
1490 : const FrmTypeFlags nNoType =
1491 1697 : FrmTypeFlags::FLY_ANY | FrmTypeFlags::HEADER | FrmTypeFlags::FOOTER | FrmTypeFlags::FOOTNOTE;
1492 1697 : if ( rSh.GetFrmType(0,true) & nNoType )
1493 0 : rSet.DisableItem(nWhich);
1494 :
1495 1697 : if ( rSh.CrsrInsideInputField() )
1496 : {
1497 0 : rSet.DisableItem( nWhich );
1498 : }
1499 : }
1500 1697 : break;
1501 :
1502 : case FN_INSERT_HYPERLINK:
1503 : case SID_INSERTDOC:
1504 : case FN_INSERT_GLOSSARY:
1505 : case FN_EXPAND_GLOSSARY:
1506 0 : if ( rSh.CrsrInsideInputField() )
1507 : {
1508 0 : rSet.DisableItem( nWhich );
1509 : }
1510 0 : break;
1511 :
1512 : case FN_INSERT_TABLE:
1513 2532 : if ( rSh.CrsrInsideInputField()
1514 844 : || rSh.GetTableFormat()
1515 4220 : || (rSh.GetFrmType(0,true) & FrmTypeFlags::FOOTNOTE) )
1516 : {
1517 0 : rSet.DisableItem( nWhich );
1518 : }
1519 844 : break;
1520 :
1521 : case FN_CALCULATE:
1522 0 : if ( !rSh.IsSelection() )
1523 0 : rSet.DisableItem(nWhich);
1524 0 : break;
1525 : case FN_GOTO_REFERENCE:
1526 : {
1527 0 : SwField *pField = rSh.GetCurField();
1528 0 : if ( !pField || (pField && pField->GetTypeId() != TYP_GETREFFLD) )
1529 0 : rSet.DisableItem(nWhich);
1530 : }
1531 0 : break;
1532 : case FN_AUTOFORMAT_AUTO:
1533 : {
1534 0 : rSet.Put( SfxBoolItem( nWhich, SvxAutoCorrCfg::Get().IsAutoFormatByInput() ));
1535 : }
1536 0 : break;
1537 :
1538 : case SID_DEC_INDENT:
1539 : case SID_INC_INDENT:
1540 : {
1541 : //if the paragrah has bullet we'll do the following things:
1542 : //1: if the bullet level is the first level, disable the decrease-indent button
1543 : //2: if the bullet level is the last level, disable the increase-indent button
1544 1698 : if ( rSh.GetNumRuleAtCurrCrsrPos() && !rSh.HasReadonlySel() )
1545 : {
1546 0 : const sal_uInt8 nLevel = rSh.GetNumLevel();
1547 0 : if ( ( nLevel == ( MAXLEVEL - 1 ) && nWhich == SID_INC_INDENT )
1548 0 : || ( nLevel == 0 && nWhich == SID_DEC_INDENT ) )
1549 : {
1550 0 : rSet.DisableItem( nWhich );
1551 : }
1552 : }
1553 : else
1554 : {
1555 1698 : sal_uInt16 nHtmlMode = ::GetHtmlMode( GetView().GetDocShell() );
1556 1698 : nHtmlMode &= HTMLMODE_ON | HTMLMODE_SOME_STYLES;
1557 1698 : if ( ( nHtmlMode == HTMLMODE_ON )
1558 1698 : || !rSh.IsMoveLeftMargin( SID_INC_INDENT == nWhich, true ) )
1559 : {
1560 0 : rSet.DisableItem( nWhich );
1561 : }
1562 : }
1563 : }
1564 1698 : break;
1565 :
1566 : case FN_DEC_INDENT_OFFSET:
1567 : case FN_INC_INDENT_OFFSET:
1568 : {
1569 0 : sal_uInt16 nHtmlMode = ::GetHtmlMode(GetView().GetDocShell());
1570 0 : nHtmlMode &= HTMLMODE_ON|HTMLMODE_SOME_STYLES;
1571 0 : if( (nHtmlMode == HTMLMODE_ON) ||
1572 : !rSh.IsMoveLeftMargin( FN_INC_INDENT_OFFSET == nWhich,
1573 0 : false ))
1574 0 : rSet.DisableItem( nWhich );
1575 : }
1576 0 : break;
1577 :
1578 : case SID_ATTR_CHAR_COLOR2:
1579 : {
1580 1186 : SfxItemSet aSet( GetPool() );
1581 1186 : rSh.GetCurAttr( aSet );
1582 1186 : const SvxColorItem& aColorItem = static_cast< const SvxColorItem& >( aSet.Get(RES_CHRATR_COLOR) );
1583 1186 : rSet.Put( aColorItem, SID_ATTR_CHAR_COLOR2 );
1584 : }
1585 1186 : break;
1586 : case SID_ATTR_CHAR_COLOR_BACKGROUND:
1587 : {
1588 : // Always use the visible background
1589 1186 : SfxItemSet aSet( GetPool() );
1590 1186 : rSh.GetCurAttr( aSet );
1591 1186 : const SvxBrushItem& aBrushItem = static_cast< const SvxBrushItem& >( aSet.Get(RES_CHRATR_HIGHLIGHT) );
1592 1186 : if( aBrushItem.GetColor() != COL_TRANSPARENT )
1593 : {
1594 0 : rSet.Put( SvxColorItem(aBrushItem.GetColor(), nWhich) );
1595 : }
1596 : else
1597 : {
1598 1186 : const SvxBrushItem& aBrushItem2 = static_cast< const SvxBrushItem& >( aSet.Get(RES_CHRATR_BACKGROUND) );
1599 1186 : rSet.Put( SvxColorItem(aBrushItem2.GetColor(), nWhich) );
1600 1186 : }
1601 : }
1602 1186 : break;
1603 : case SID_ATTR_CHAR_COLOR_BACKGROUND_EXT:
1604 : case SID_ATTR_CHAR_COLOR_EXT:
1605 : {
1606 2372 : SwEditWin& rEdtWin = GetView().GetEditWin();
1607 2372 : SwApplyTemplate* pApply = rEdtWin.GetApplyTemplate();
1608 2372 : rSet.Put(SfxBoolItem(nWhich, pApply && pApply->nColor == nWhich));
1609 : }
1610 2372 : break;
1611 :
1612 : case FN_INSERT_BOOKMARK:
1613 1700 : if( rSh.IsTableMode()
1614 850 : || rSh.CrsrInsideInputField() )
1615 : {
1616 4 : rSet.DisableItem( nWhich );
1617 : }
1618 850 : break;
1619 :
1620 : case FN_INSERT_BREAK:
1621 0 : if ( rSh.HasReadonlySel()
1622 0 : && !rSh.CrsrInsideInputField() )
1623 : {
1624 0 : rSet.DisableItem( nWhich );
1625 : }
1626 0 : break;
1627 :
1628 : case FN_INSERT_BREAK_DLG:
1629 : case FN_INSERT_COLUMN_BREAK:
1630 : case FN_INSERT_PAGEBREAK:
1631 848 : if( rSh.CrsrInsideInputField() )
1632 : {
1633 0 : rSet.DisableItem( nWhich );
1634 : }
1635 848 : break;
1636 :
1637 : case FN_INSERT_PAGEHEADER:
1638 : case FN_INSERT_PAGEFOOTER:
1639 : {
1640 0 : rSet.Put( SfxObjectShellItem( nWhich, GetView().GetDocShell() ));
1641 : }
1642 0 : break;
1643 : case FN_TABLE_SORT_DIALOG:
1644 : case FN_SORTING_DLG:
1645 7 : if(!rSh.HasSelection() ||
1646 5 : (FN_TABLE_SORT_DIALOG == nWhich && !rSh.GetTableFormat()))
1647 1 : rSet.DisableItem( nWhich );
1648 6 : break;
1649 :
1650 : case SID_RUBY_DIALOG:
1651 : {
1652 0 : SvtCJKOptions aCJKOptions;
1653 0 : if( !aCJKOptions.IsRubyEnabled()
1654 0 : || rSh.CrsrInsideInputField() )
1655 : {
1656 0 : GetView().GetViewFrame()->GetBindings().SetVisibleState( nWhich, false );
1657 0 : rSet.DisableItem(nWhich);
1658 : }
1659 : else
1660 0 : GetView().GetViewFrame()->GetBindings().SetVisibleState( nWhich, true );
1661 : }
1662 0 : break;
1663 :
1664 : case SID_HYPERLINK_DIALOG:
1665 1702 : if( GetView().GetDocShell()->IsReadOnly()
1666 849 : || ( !GetView().GetViewFrame()->HasChildWindow(nWhich)
1667 849 : && rSh.HasReadonlySel() )
1668 1700 : || rSh.CrsrInsideInputField() )
1669 : {
1670 2 : rSet.DisableItem(nWhich);
1671 : }
1672 : else
1673 : {
1674 849 : rSet.Put(SfxBoolItem( nWhich, 0 != GetView().GetViewFrame()->GetChildWindow( nWhich ) ));
1675 : }
1676 851 : break;
1677 :
1678 : case FN_EDIT_HYPERLINK:
1679 : case FN_COPY_HYPERLINK_LOCATION:
1680 : {
1681 0 : SfxItemSet aSet(GetPool(),
1682 : RES_TXTATR_INETFMT,
1683 0 : RES_TXTATR_INETFMT);
1684 0 : rSh.GetCurAttr(aSet);
1685 0 : if(SfxItemState::SET > aSet.GetItemState( RES_TXTATR_INETFMT, true ) || rSh.HasReadonlySel())
1686 : {
1687 0 : rSet.DisableItem(nWhich);
1688 0 : }
1689 : }
1690 0 : break;
1691 : case FN_REMOVE_HYPERLINK:
1692 : {
1693 0 : SfxItemSet aSet(GetPool(),
1694 : RES_TXTATR_INETFMT,
1695 0 : RES_TXTATR_INETFMT);
1696 0 : rSh.GetCurAttr(aSet);
1697 :
1698 : // If a hyperlink is selected, either alone or along with other text...
1699 0 : if ((aSet.GetItemState(RES_TXTATR_INETFMT, true) < SfxItemState::SET &&
1700 0 : aSet.GetItemState(RES_TXTATR_INETFMT, true) != SfxItemState::DONTCARE) ||
1701 0 : rSh.HasReadonlySel())
1702 : {
1703 0 : rSet.DisableItem(nWhich);
1704 0 : }
1705 : }
1706 0 : break;
1707 : case SID_TRANSLITERATE_HALFWIDTH:
1708 : case SID_TRANSLITERATE_FULLWIDTH:
1709 : case SID_TRANSLITERATE_HIRAGANA:
1710 : case SID_TRANSLITERATE_KATAGANA:
1711 : {
1712 0 : SvtCJKOptions aCJKOptions;
1713 0 : if(!aCJKOptions.IsChangeCaseMapEnabled())
1714 : {
1715 0 : GetView().GetViewFrame()->GetBindings().SetVisibleState( nWhich, false );
1716 0 : rSet.DisableItem(nWhich);
1717 : }
1718 : else
1719 0 : GetView().GetViewFrame()->GetBindings().SetVisibleState( nWhich, true );
1720 : }
1721 0 : break;
1722 : case FN_READONLY_SELECTION_MODE :
1723 9 : if(!GetView().GetDocShell()->IsReadOnly())
1724 9 : rSet.DisableItem( nWhich );
1725 : else
1726 : {
1727 0 : rSet.Put(SfxBoolItem(nWhich, rSh.GetViewOptions()->IsSelectionInReadonly()));
1728 : }
1729 9 : break;
1730 : case FN_SELECTION_MODE_DEFAULT:
1731 : case FN_SELECTION_MODE_BLOCK :
1732 0 : rSet.Put(SfxBoolItem(nWhich, (nWhich == FN_SELECTION_MODE_DEFAULT) != rSh.IsBlockMode()));
1733 0 : break;
1734 : case SID_OPEN_HYPERLINK:
1735 : {
1736 0 : SfxItemSet aSet(GetPool(),
1737 : RES_TXTATR_INETFMT,
1738 0 : RES_TXTATR_INETFMT);
1739 0 : rSh.GetCurAttr(aSet);
1740 0 : if(SfxItemState::SET > aSet.GetItemState( RES_TXTATR_INETFMT, false ))
1741 0 : rSet.DisableItem(nWhich);
1742 : }
1743 0 : break;
1744 : case SID_OPEN_SMARTTAGMENU:
1745 : {
1746 0 : uno::Sequence< OUString > aSmartTagTypes;
1747 0 : uno::Sequence< uno::Reference< container::XStringKeyMap > > aStringKeyMaps;
1748 0 : uno::Reference<text::XTextRange> xRange;
1749 :
1750 0 : rSh.GetSmartTagTerm( aSmartTagTypes, aStringKeyMaps, xRange );
1751 :
1752 0 : if ( xRange.is() && aSmartTagTypes.getLength() )
1753 : {
1754 0 : uno::Sequence < uno::Sequence< uno::Reference< smarttags::XSmartTagAction > > > aActionComponentsSequence;
1755 0 : uno::Sequence < uno::Sequence< sal_Int32 > > aActionIndicesSequence;
1756 :
1757 0 : const SmartTagMgr& rSmartTagMgr = SwSmartTagMgr::Get();
1758 : rSmartTagMgr.GetActionSequences( aSmartTagTypes,
1759 : aActionComponentsSequence,
1760 0 : aActionIndicesSequence );
1761 :
1762 0 : uno::Reference <frame::XController> xController = GetView().GetController();
1763 0 : const lang::Locale aLocale( SW_BREAKITER()->GetLocale( GetAppLanguageTag() ) );
1764 0 : const OUString aApplicationName( rSmartTagMgr.GetApplicationName() );
1765 0 : const OUString aRangeText = xRange->getString();
1766 :
1767 : const SvxSmartTagItem aItem( nWhich,
1768 : aActionComponentsSequence,
1769 : aActionIndicesSequence,
1770 : aStringKeyMaps,
1771 : xRange,
1772 : xController,
1773 : aLocale,
1774 : aApplicationName,
1775 0 : aRangeText );
1776 :
1777 0 : rSet.Put( aItem );
1778 : }
1779 : else
1780 0 : rSet.DisableItem(nWhich);
1781 : }
1782 0 : break;
1783 :
1784 : case FN_NUM_NUMBERING_ON:
1785 1186 : rSet.Put(SfxBoolItem(FN_NUM_NUMBERING_ON,rSh.SelectionHasNumber()));
1786 1186 : break;
1787 :
1788 : case FN_NUM_BULLET_ON:
1789 1186 : rSet.Put(SfxBoolItem(FN_NUM_BULLET_ON,rSh.SelectionHasBullet()));
1790 1186 : break;
1791 :
1792 : case FN_BUL_NUM_RULE_INDEX:
1793 : case FN_NUM_NUM_RULE_INDEX:
1794 : {
1795 0 : SwNumRule* pCurRule = const_cast<SwNumRule*>(GetShell().GetNumRuleAtCurrCrsrPos());
1796 0 : sal_uInt16 nActNumLvl = USHRT_MAX;
1797 0 : if( pCurRule )
1798 : {
1799 0 : nActNumLvl = GetShell().GetNumLevel();
1800 0 : if( nActNumLvl < MAXLEVEL )
1801 : {
1802 0 : nActNumLvl = 1<<nActNumLvl;
1803 : }
1804 0 : SvxNumRule aSvxRule = pCurRule->MakeSvxNumRule();
1805 0 : if ( GetShell().HasBullet())
1806 : {
1807 0 : rSet.Put(SfxUInt16Item(FN_BUL_NUM_RULE_INDEX, USHRT_MAX));
1808 0 : rSet.Put(SfxUInt16Item(FN_NUM_NUM_RULE_INDEX, USHRT_MAX));
1809 0 : NBOTypeMgrBase* pBullets = NBOutlineTypeMgrFact::CreateInstance(eNBOType::BULLETS);
1810 0 : if ( pBullets )
1811 : {
1812 0 : const sal_uInt16 nBulIndex = pBullets->GetNBOIndexForNumRule(aSvxRule,nActNumLvl);
1813 0 : rSet.Put(SfxUInt16Item(FN_BUL_NUM_RULE_INDEX,nBulIndex));
1814 : }
1815 0 : }else if ( GetShell().HasNumber() )
1816 : {
1817 0 : rSet.Put(SfxUInt16Item(FN_BUL_NUM_RULE_INDEX, USHRT_MAX));
1818 0 : rSet.Put(SfxUInt16Item(FN_NUM_NUM_RULE_INDEX, USHRT_MAX));
1819 0 : NBOTypeMgrBase* pNumbering = NBOutlineTypeMgrFact::CreateInstance(eNBOType::NUMBERING);
1820 0 : if ( pNumbering )
1821 : {
1822 0 : const sal_uInt16 nBulIndex = pNumbering->GetNBOIndexForNumRule(aSvxRule,nActNumLvl);
1823 0 : rSet.Put(SfxUInt16Item(FN_NUM_NUM_RULE_INDEX,nBulIndex));
1824 : }
1825 0 : }
1826 : }
1827 : }
1828 0 : break;
1829 : case FN_NUM_CONTINUE:
1830 : {
1831 : {
1832 : // #i86492#
1833 : // Search also for bullet list
1834 0 : OUString aDummy;
1835 : const SwNumRule* pRule =
1836 0 : rSh.SearchNumRule( false, true, false, -1, aDummy );
1837 0 : if ( !pRule )
1838 : {
1839 0 : pRule = rSh.SearchNumRule( false, false, false, -1, aDummy );
1840 : }
1841 0 : if ( !pRule )
1842 0 : rSet.DisableItem(nWhich);
1843 : }
1844 : }
1845 0 : break;
1846 : case SID_INSERT_RLM :
1847 : case SID_INSERT_LRM :
1848 : case SID_INSERT_ZWNBSP :
1849 : case SID_INSERT_ZWSP:
1850 : {
1851 0 : SvtCTLOptions aCTLOptions;
1852 0 : bool bEnabled = aCTLOptions.IsCTLFontEnabled();
1853 0 : GetView().GetViewFrame()->GetBindings().SetVisibleState( nWhich, bEnabled );
1854 0 : if(!bEnabled)
1855 0 : rSet.DisableItem(nWhich);
1856 : }
1857 0 : break;
1858 : }
1859 15304 : nWhich = aIter.NextWhich();
1860 7633 : }
1861 7810 : }
1862 :
1863 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|