1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26
27 #include <com/sun/star/i18n/WordType.hpp>
28 #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
29
30 #include <comphelper/processfactory.hxx>
31 #include <svx/dialogs.hrc>
32 #include <hintids.hxx>
33 #include <cmdid.h>
34 #include <helpid.h>
35
36 #include <i18npool/mslangid.hxx>
37 #include <svl/languageoptions.hxx>
38 #include <editeng/langitem.hxx>
39 #include <svtools/langtab.hxx>
40 #include <svl/slstitm.hxx>
41 #include <string.h>
42 #include <svl/stritem.hxx>
43 #include <svx/htmlmode.hxx>
44 #include <svl/whiter.hxx>
45 #include <sfx2/bindings.hxx>
46 #include <sfx2/dispatch.hxx>
47 #include <sfx2/objitem.hxx>
48 #include <vcl/msgbox.hxx>
49 #include <vcl/unohelp2.hxx>
50 #include <sfx2/request.hxx>
51 #include <svl/eitem.hxx>
52 #include <svl/macitem.hxx>
53 #include <editeng/lrspitem.hxx>
54 #include <editeng/ulspitem.hxx>
55 #include <editeng/colritem.hxx>
56 #include <editeng/tstpitem.hxx>
57 #include <editeng/brshitem.hxx>
58 #include <editeng/svxacorr.hxx>
59 #include <svl/cjkoptions.hxx>
60 #include <svl/ctloptions.hxx>
61 #include <IDocumentSettingAccess.hxx>
62 #include <charfmt.hxx>
63 #include <editeng/fontitem.hxx>
64 #include <svx/SmartTagItem.hxx>
65 #include <svx/dialmgr.hxx>
66 #include <fmtinfmt.hxx>
67 #include <swwait.hxx>
68 #include <wrtsh.hxx>
69 #include <wview.hxx>
70 #include <swmodule.hxx>
71 #include <viewopt.hxx>
72 #include <uitool.hxx>
73 #include <swevent.hxx>
74 #include <fmthdft.hxx>
75 #include <pagedesc.hxx>
76 #include <textsh.hxx>
77 #include <IMark.hxx>
78 #include <swdtflvr.hxx>
79 #include <docstat.hxx>
80 #include <outline.hxx>
81 #include <tablemgr.hxx>
82 #include <swundo.hxx> // fuer Undo-IDs
83 #include <reffld.hxx>
84 #include <docsh.hxx>
85 #include <mdiexp.hxx>
86 #include <inputwin.hxx>
87 #include <pardlg.hxx>
88 #include <frmatr.hxx>
89 #include <fmtcol.hxx>
90 #include <cellatr.hxx>
91 #include <edtwin.hxx>
92 #include <redlndlg.hxx>
93 #include "fldmgr.hxx"
94
95 #include <globals.hrc>
96 #include <shells.hrc>
97 #include <app.hrc>
98 #include <web.hrc>
99 #include "paratr.hxx"
100 #include <crsskip.hxx>
101 #include <docstat.hxx>
102 #include <vcl/svapp.hxx>
103 #include <sfx2/app.hxx>
104 #include <breakit.hxx>
105
106 #include <SwSmartTagMgr.hxx>
107
108 #include <editeng/acorrcfg.hxx>
109 #include "swabstdlg.hxx"
110 #include "misc.hrc"
111 #include "chrdlg.hrc"
112 #include <IDocumentStatistics.hxx>
113
114 #include <sfx2/sfxdlg.hxx>
115 #include <svl/languageoptions.hxx>
116 #include <unotools/lingucfg.hxx>
117 #include <com/sun/star/beans/XPropertySet.hpp>
118 #include <com/sun/star/util/XChangesBatch.hpp>
119 #include <com/sun/star/uno/Any.hxx>
120 #include <editeng/unolingu.hxx>
121 #include <unotools/syslocaleoptions.hxx>
122 #include <doc.hxx>
123 #include <view.hxx>
124 #include <ndtxt.hxx>
125 #include <pam.hxx>
126 #include <sfx2/objface.hxx>
127 #include <langhelper.hxx>
128
129 #ifndef _NBDTMGFACT_HXX
130 #include <svx/nbdtmgfact.hxx>
131 #endif
132 #ifndef _NBDTMG_HXX
133 #include <svx/nbdtmg.hxx>
134 #endif
135
136
137 #include <numrule.hxx>
138
139
140 using namespace ::com::sun::star;
141 using namespace svx::sidebar;
142
143
lcl_CharDialog(SwWrtShell & rWrtSh,sal_Bool bUseDialog,sal_uInt16 nSlot,const SfxItemSet * pArgs,SfxRequest * pReq)144 void lcl_CharDialog( SwWrtShell &rWrtSh, sal_Bool bUseDialog, sal_uInt16 nSlot,const SfxItemSet *pArgs, SfxRequest *pReq )
145 {
146 FieldUnit eMetric = ::GetDfltMetric(0 != PTR_CAST(SwWebView, &rWrtSh.GetView()));
147 SW_MOD()->PutItem(SfxUInt16Item(SID_ATTR_METRIC, static_cast< sal_uInt16 >(eMetric)));
148 SfxItemSet aCoreSet( rWrtSh.GetView().GetPool(),
149 RES_CHRATR_BEGIN, RES_CHRATR_END-1,
150 RES_TXTATR_INETFMT, RES_TXTATR_INETFMT,
151 RES_BACKGROUND, RES_BACKGROUND,
152 FN_PARAM_SELECTION, FN_PARAM_SELECTION,
153 SID_HTML_MODE, SID_HTML_MODE,
154 SID_ATTR_CHAR_WIDTH_FIT_TO_LINE, SID_ATTR_CHAR_WIDTH_FIT_TO_LINE,
155 0 );
156 rWrtSh.GetCurAttr( aCoreSet );
157 sal_Bool bSel = rWrtSh.HasSelection();
158 sal_Bool bSelectionPut = sal_False;
159 if(bSel || rWrtSh.IsInWord())
160 {
161 if(!bSel)
162 {
163 rWrtSh.StartAction();
164 rWrtSh.Push();
165 if(!rWrtSh.SelectTxtAttr( RES_TXTATR_INETFMT ))
166 rWrtSh.SelWrd();
167 }
168 aCoreSet.Put(SfxStringItem(FN_PARAM_SELECTION, rWrtSh.GetSelTxt()));
169 bSelectionPut = sal_True;
170 if(!bSel)
171 {
172 rWrtSh.Pop(sal_False);
173 rWrtSh.EndAction();
174 }
175 }
176 aCoreSet.Put( SfxUInt16Item( SID_ATTR_CHAR_WIDTH_FIT_TO_LINE,
177 rWrtSh.GetScalingOfSelectedText() ) );
178 // Das CHRATR_BACKGROUND-Attribut wird fuer den Dialog in
179 // ein RES_BACKGROUND verwandelt und wieder zurueck ...
180 const SfxPoolItem *pTmpBrush;
181 if( SFX_ITEM_SET == aCoreSet.GetItemState( RES_CHRATR_BACKGROUND, sal_True, &pTmpBrush ) )
182 {
183 SvxBrushItem aTmpBrush( *((SvxBrushItem*)pTmpBrush) );
184 aTmpBrush.SetWhich( RES_BACKGROUND );
185 aCoreSet.Put( aTmpBrush );
186 }
187
188 aCoreSet.Put(SfxUInt16Item(SID_HTML_MODE, ::GetHtmlMode(rWrtSh.GetView().GetDocShell())));
189 SfxAbstractTabDialog* pDlg = NULL;
190 if ( bUseDialog && GetActiveView() )
191 {
192 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
193 DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");
194
195 pDlg = pFact->CreateSwCharDlg( rWrtSh.GetView().GetWindow(), rWrtSh.GetView(), aCoreSet, DLG_CHAR );
196 DBG_ASSERT(pDlg, "Dialogdiet fail!");
197 if( FN_INSERT_HYPERLINK == nSlot )
198 pDlg->SetCurPageId(TP_CHAR_URL);
199 }
200 if (nSlot == SID_CHAR_DLG_EFFECT)
201 {
202 pDlg->SetCurPageId(TP_CHAR_EXT);
203 }
204
205 const SfxItemSet* pSet = NULL;
206 if ( !bUseDialog )
207 pSet = pArgs;
208 else if ( NULL != pDlg && pDlg->Execute() == RET_OK ) /* #110771# pDlg can be NULL */
209 {
210 pSet = pDlg->GetOutputItemSet();
211 }
212
213 if ( pSet)
214 {
215 SfxItemSet aTmpSet( *pSet );
216 if( SFX_ITEM_SET == aTmpSet.GetItemState( RES_BACKGROUND, sal_False, &pTmpBrush ) )
217 {
218 SvxBrushItem aTmpBrush( *((SvxBrushItem*)pTmpBrush) );
219 aTmpBrush.SetWhich( RES_CHRATR_BACKGROUND );
220 aTmpSet.Put( aTmpBrush );
221 }
222
223 aTmpSet.ClearItem( RES_BACKGROUND );
224
225 const SfxPoolItem* pSelectionItem;
226 sal_Bool bInsert = sal_False;
227 xub_StrLen nInsert = 0;
228
229 // aus ungeklaerter Ursache ist das alte Item wieder im Set
230 if( !bSelectionPut && SFX_ITEM_SET == aTmpSet.GetItemState(FN_PARAM_SELECTION, sal_False, &pSelectionItem) )
231 {
232 String sInsert = ((const SfxStringItem*)pSelectionItem)->GetValue();
233 bInsert = sInsert.Len() != 0;
234 if(bInsert)
235 {
236 nInsert = sInsert.Len();
237 rWrtSh.StartAction();
238 rWrtSh.Insert( sInsert );
239 rWrtSh.SetMark();
240 rWrtSh.ExtendSelection(sal_False, sInsert.Len());
241 SfxRequest aReq( rWrtSh.GetView().GetViewFrame(), FN_INSERT_STRING );
242 aReq.AppendItem( SfxStringItem( FN_INSERT_STRING, sInsert ) );
243 aReq.Done();
244 SfxRequest aReq1( rWrtSh.GetView().GetViewFrame(), FN_CHAR_LEFT );
245 aReq1.AppendItem( SfxInt16Item(FN_PARAM_MOVE_COUNT, nInsert) );
246 aReq1.AppendItem( SfxBoolItem(FN_PARAM_MOVE_SELECTION, sal_True) );
247 aReq1.Done();
248 }
249 }
250 aTmpSet.ClearItem(FN_PARAM_SELECTION);
251
252 SwTxtFmtColl* pColl = rWrtSh.GetCurTxtFmtColl();
253 if(bSel && rWrtSh.IsSelFullPara() && pColl && pColl->IsAutoUpdateFmt())
254 {
255 rWrtSh.AutoUpdatePara(pColl, aTmpSet);
256 }
257 else
258 rWrtSh.SetAttrSet( aTmpSet );
259 if (pReq)
260 pReq->Done(aTmpSet);
261 if(bInsert)
262 {
263 SfxRequest aReq1( rWrtSh.GetView().GetViewFrame(), FN_CHAR_RIGHT );
264 aReq1.AppendItem( SfxInt16Item(FN_PARAM_MOVE_COUNT, nInsert) );
265 aReq1.AppendItem( SfxBoolItem(FN_PARAM_MOVE_SELECTION, sal_False) );
266 aReq1.Done();
267 rWrtSh.SwapPam();
268 rWrtSh.ClearMark();
269 rWrtSh.DontExpandFmt();
270 rWrtSh.EndAction();
271 }
272 }
273
274 delete pDlg;
275 }
276
277 /*--------------------------------------------------------------------
278 Beschreibung:
279 --------------------------------------------------------------------*/
280
lcl_AskRedlineMode(Window * pWin)281 short lcl_AskRedlineMode(Window *pWin)
282 {
283 MessBox aQBox( pWin, 0,
284 String( SW_RES( STR_REDLINE_TITLE ) ),
285 String( SW_RES( STR_REDLINE_MSG ) ) );
286 aQBox.SetImage( QueryBox::GetStandardImage() );
287 sal_uInt16 nBtnFlags = BUTTONDIALOG_DEFBUTTON |
288 BUTTONDIALOG_OKBUTTON |
289 BUTTONDIALOG_FOCUSBUTTON;
290
291 aQBox.AddButton(String(SW_RES(STR_REDLINE_ACCEPT_ALL)), RET_OK, nBtnFlags);
292 aQBox.GetPushButton( RET_OK )->SetHelpId(HID_AUTOFORMAT_ACCEPT);
293 aQBox.AddButton(String(SW_RES(STR_REDLINE_REJECT_ALL)), RET_CANCEL, BUTTONDIALOG_CANCELBUTTON);
294 aQBox.GetPushButton( RET_CANCEL )->SetHelpId(HID_AUTOFORMAT_REJECT );
295 aQBox.AddButton(String(SW_RES(STR_REDLINE_EDIT)), 2, 0);
296 aQBox.GetPushButton( 2 )->SetHelpId(HID_AUTOFORMAT_EDIT_CHG);
297 aQBox.SetButtonHelpText( RET_OK, aEmptyStr );
298
299 return aQBox.Execute();
300 }
301
Execute(SfxRequest & rReq)302 void SwTextShell::Execute(SfxRequest &rReq)
303 {
304 sal_Bool bUseDialog = sal_True;
305 const SfxItemSet *pArgs = rReq.GetArgs();
306 SwWrtShell& rWrtSh = GetShell();
307 const SfxPoolItem* pItem = 0;
308 sal_uInt16 nSlot = rReq.GetSlot();
309 if(pArgs)
310 pArgs->GetItemState(GetPool().GetWhich(nSlot), sal_False, &pItem);
311 switch( nSlot )
312 {
313 case SID_LANGUAGE_STATUS:
314 {
315 // get the language
316 String aNewLangTxt;
317 SFX_REQUEST_ARG( rReq, pItem2, SfxStringItem, SID_LANGUAGE_STATUS , sal_False );
318 if (pItem2)
319 aNewLangTxt = pItem2->GetValue();
320
321 //!! Remember the view frame right now...
322 //!! (call to GetView().GetViewFrame() will break if the
323 //!! SwTextShell got destroyed meanwhile.)
324 SfxViewFrame *pViewFrame = GetView().GetViewFrame();
325
326 if (aNewLangTxt.EqualsAscii( "*" ))
327 {
328 // open the dialog "Tools/Options/Language Settings - Language"
329 // to set the documents default language
330 SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
331 if (pFact)
332 {
333 VclAbstractDialog* pDlg = pFact->CreateVclDialog( GetView().GetWindow(), SID_LANGUAGE_OPTIONS );
334 pDlg->Execute();
335 delete pDlg;
336 }
337 }
338 else
339 {
340 //!! We have to use StartAction / EndAction bracketing in
341 //!! order to prevent possible destruction of the SwTextShell
342 //!! due to the selection changes coming below.
343 rWrtSh.StartAction();
344 // prevent view from jumping because of (temporary) selection changes
345 rWrtSh.LockView( sal_True );
346
347 // save selection for later restoration
348 rWrtSh.Push();
349
350 // setting the new language...
351 if (aNewLangTxt.Len() > 0)
352 {
353 const String aSelectionLangPrefix( String::CreateFromAscii("Current_") );
354 const String aParagraphLangPrefix( String::CreateFromAscii("Paragraph_") );
355 const String aDocumentLangPrefix( String::CreateFromAscii("Default_") );
356 const String aStrNone( String::CreateFromAscii("LANGUAGE_NONE") );
357 const String aStrResetLangs( String::CreateFromAscii("RESET_LANGUAGES") );
358
359 SfxItemSet aCoreSet( GetPool(),
360 RES_CHRATR_LANGUAGE, RES_CHRATR_LANGUAGE,
361 RES_CHRATR_CJK_LANGUAGE, RES_CHRATR_CJK_LANGUAGE,
362 RES_CHRATR_CTL_LANGUAGE, RES_CHRATR_CTL_LANGUAGE,
363 0 );
364
365 xub_StrLen nPos = 0;
366 bool bForSelection = true;
367 bool bForParagraph = false;
368 if (STRING_NOTFOUND != (nPos = aNewLangTxt.Search( aSelectionLangPrefix, 0 )))
369 {
370 // ... for the current selection
371 aNewLangTxt = aNewLangTxt.Erase( nPos, aSelectionLangPrefix.Len() );
372 bForSelection = true;
373 }
374 else if (STRING_NOTFOUND != (nPos = aNewLangTxt.Search( aParagraphLangPrefix , 0 )))
375 {
376 // ... for the current paragraph language
377 aNewLangTxt = aNewLangTxt.Erase( nPos, aParagraphLangPrefix.Len() );
378 bForSelection = true;
379 bForParagraph = true;
380 }
381 else if (STRING_NOTFOUND != (nPos = aNewLangTxt.Search( aDocumentLangPrefix , 0 )))
382 {
383 // ... as default document language
384 aNewLangTxt = aNewLangTxt.Erase( nPos, aDocumentLangPrefix.Len() );
385 bForSelection = false;
386 }
387
388 if (bForParagraph)
389 SwLangHelper::SelectCurrentPara( rWrtSh );
390
391 if (!bForSelection) // document language to be changed...
392 {
393 rWrtSh.SelAll();
394 rWrtSh.ExtendedSelectAll();
395 }
396
397 rWrtSh.StartUndo( ( !bForParagraph && !bForSelection ) ? UNDO_SETDEFTATTR : UNDO_EMPTY );
398 if (aNewLangTxt == aStrNone)
399 SwLangHelper::SetLanguage_None( rWrtSh, bForSelection, aCoreSet );
400 else if (aNewLangTxt == aStrResetLangs)
401 SwLangHelper::ResetLanguages( rWrtSh, bForSelection );
402 else
403 SwLangHelper::SetLanguage( rWrtSh, aNewLangTxt, bForSelection, aCoreSet );
404 rWrtSh.EndUndo();
405
406 }
407
408 // restore selection...
409 rWrtSh.Pop( sal_False );
410
411 rWrtSh.LockView( sal_False );
412 rWrtSh.EndAction();
413 }
414
415 // invalidate slot to get the new language displayed
416 pViewFrame->GetBindings().Invalidate( nSlot );
417
418 rReq.Done();
419 break;
420 }
421
422 case SID_THES:
423 {
424 // replace word/selection with text from selected sub menu entry
425 String aReplaceText;
426 SFX_REQUEST_ARG( rReq, pItem2, SfxStringItem, SID_THES , sal_False );
427 if (pItem2)
428 aReplaceText = pItem2->GetValue();
429 if (aReplaceText.Len() > 0)
430 {
431 SwView &rView2 = rWrtSh.GetView();
432 const bool bSelection = rWrtSh.HasSelection();
433 const String aLookUpText = rView2.GetThesaurusLookUpText( bSelection );
434 rView2.InsertThesaurusSynonym( aReplaceText, aLookUpText, bSelection );
435 }
436 }
437 break;
438
439 case SID_CHARMAP:
440 {
441 InsertSymbol( rReq );
442 }
443 break;
444 case FN_INSERT_FOOTNOTE:
445 case FN_INSERT_ENDNOTE:
446 {
447 String aStr;
448 SFX_REQUEST_ARG( rReq, pFont, SfxStringItem, FN_PARAM_1 , sal_False );
449 // SFX_REQUEST_ARG( rReq, pCharset, SfxInt16Item, FN_PARAM_2 , sal_False );
450 SFX_REQUEST_ARG( rReq, pNameItem, SfxStringItem, nSlot , sal_False );
451 if ( pNameItem )
452 aStr = pNameItem->GetValue();
453 sal_Bool bFont = pFont && pFont->GetValue().Len();
454 rWrtSh.StartUndo( UNDO_UI_INSERT_FOOTNOTE );
455 rWrtSh.InsertFootnote( aStr, nSlot == FN_INSERT_ENDNOTE, !bFont );
456 if ( bFont )
457 {
458 rWrtSh.Left( CRSR_SKIP_CHARS, sal_True, 1, sal_False );
459 SfxItemSet aSet( rWrtSh.GetAttrPool(), RES_CHRATR_FONT, RES_CHRATR_FONT );
460 rWrtSh.GetCurAttr( aSet );
461 SvxFontItem &rFont = (SvxFontItem &) aSet.Get( RES_CHRATR_FONT );
462 SvxFontItem aFont( rFont.GetFamily(), pFont->GetValue(),
463 rFont.GetStyleName(), rFont.GetPitch(), RTL_TEXTENCODING_DONTKNOW, RES_CHRATR_FONT );
464 //pCharset ? (CharSet) pCharset->GetValue() : RTL_TEXTENCODING_DONTKNOW );
465 rWrtSh.SetAttrSet( aSet, nsSetAttrMode::SETATTR_DONTEXPAND );
466 rWrtSh.ResetSelect(0, sal_False);
467 rWrtSh.EndSelect();
468 rWrtSh.GotoFtnTxt();
469 }
470 rWrtSh.EndUndo( UNDO_UI_INSERT_FOOTNOTE );
471 rReq.Done();
472 }
473 break;
474 case FN_INSERT_FOOTNOTE_DLG:
475 {
476 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
477 DBG_ASSERT(pFact, "Dialogdiet fail!");
478 AbstractInsFootNoteDlg* pDlg = pFact->CreateInsFootNoteDlg( DLG_INS_FOOTNOTE,
479 GetView().GetWindow(), rWrtSh, sal_False );
480 DBG_ASSERT(pDlg, "Dialogdiet fail!");
481 pDlg->SetHelpId(GetStaticInterface()->GetSlot(nSlot)->GetCommand());
482 if ( pDlg->Execute() == RET_OK )
483 {
484 sal_uInt16 nId = pDlg->IsEndNote() ? FN_INSERT_ENDNOTE : FN_INSERT_FOOTNOTE;
485 SfxRequest aReq( GetView().GetViewFrame(), nId );
486 if ( pDlg->GetStr().Len() )
487 aReq.AppendItem( SfxStringItem( nId, pDlg->GetStr() ) );
488 if ( pDlg->GetFontName().Len() )
489 aReq.AppendItem( SfxStringItem( FN_PARAM_1, pDlg->GetFontName() ) );
490 //aReq.AppendItem( SfxStringItem( FN_PARAM_2, pDlg->GetCharSet() ) );
491 ExecuteSlot( aReq );
492 }
493
494 rReq.Ignore();
495 delete pDlg;
496 }
497 break;
498 case FN_FORMAT_FOOTNOTE_DLG:
499 {
500 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
501 DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");
502
503 VclAbstractDialog* pDlg = pFact->CreateSwFootNoteOptionDlg( GetView().GetWindow(), rWrtSh, DLG_DOC_FOOTNOTE );
504 DBG_ASSERT(pDlg, "Dialogdiet fail!");
505 pDlg->Execute();
506 delete pDlg;
507 break;
508 }
509 case SID_INSERTDOC:
510 {
511 GetView().ExecuteInsertDoc( rReq, pItem );
512 break;
513 }
514 case FN_FORMAT_RESET:
515 {
516 // #i78856, reset all attributes but not the language attributes
517 // (for this build an array of all relevant attributes and
518 // remove the languages from that)
519 SvUShortsSort aAttribs;
520
521 sal_uInt16 __FAR_DATA aResetableSetRange[] = {
522 RES_FRMATR_BEGIN, RES_FRMATR_END-1,
523 RES_CHRATR_BEGIN, RES_CHRATR_LANGUAGE - 1,
524 RES_CHRATR_LANGUAGE + 1, RES_CHRATR_CJK_LANGUAGE - 1,
525 RES_CHRATR_CJK_LANGUAGE + 1, RES_CHRATR_CTL_LANGUAGE - 1,
526 RES_CHRATR_CTL_LANGUAGE + 1, RES_CHRATR_END-1,
527 RES_PARATR_BEGIN, RES_PARATR_END-1,
528 RES_TXTATR_INETFMT, RES_TXTATR_INETFMT,
529 RES_TXTATR_CHARFMT, RES_TXTATR_CHARFMT,
530 RES_TXTATR_CJK_RUBY, RES_TXTATR_CJK_RUBY,
531 RES_TXTATR_UNKNOWN_CONTAINER, RES_TXTATR_UNKNOWN_CONTAINER,
532 RES_UNKNOWNATR_BEGIN, RES_UNKNOWNATR_END-1,
533 0
534 };
535 sal_uInt16 __FAR_DATA *pUShorts = aResetableSetRange;
536 while (*pUShorts)
537 {
538 sal_uInt16 nL = pUShorts[1] - pUShorts[0] + 1;
539 sal_uInt16 nE = pUShorts[0];
540 for (sal_uInt16 i = 0; i < nL; ++i)
541 aAttribs.Insert( nE++ );
542 pUShorts += 2;
543 }
544
545 rWrtSh.ResetAttr( &aAttribs );
546 rReq.Done();
547 break;
548 }
549 case FN_INSERT_BREAK_DLG:
550 {
551 sal_uInt16 nKind=0, nPageNumber=0;
552 String aTemplateName;
553 if ( pItem )
554 {
555 nKind = ((SfxInt16Item*)pItem)->GetValue();
556 SFX_REQUEST_ARG( rReq, pTemplate, SfxStringItem, FN_PARAM_1 , sal_False );
557 SFX_REQUEST_ARG( rReq, pNumber, SfxUInt16Item, FN_PARAM_2 , sal_False );
558 if ( pTemplate )
559 aTemplateName = pTemplate->GetValue();
560 if ( pNumber )
561 nPageNumber = pNumber->GetValue();
562 }
563 else
564 {
565 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
566 DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");
567
568 AbstractSwBreakDlg* pDlg = pFact->CreateSwBreakDlg( GetView().GetWindow(), rWrtSh, DLG_BREAK );
569 DBG_ASSERT(pDlg, "Dialogdiet fail!");
570 if ( pDlg->Execute() == RET_OK )
571 {
572 nKind = pDlg->GetKind();
573 aTemplateName = pDlg->GetTemplateName();
574 nPageNumber = pDlg->GetPageNumber();
575 rReq.AppendItem( SfxInt16Item( FN_INSERT_BREAK_DLG, nKind ) );
576 rReq.AppendItem( SfxUInt16Item( FN_PARAM_2, nPageNumber ) );
577 rReq.AppendItem( SfxStringItem( FN_PARAM_1, aTemplateName ) );
578 rReq.Done();
579 }
580 else
581 rReq.Ignore();
582 delete pDlg;
583 }
584
585 switch ( nKind )
586 {
587 case 1 :
588 rWrtSh.InsertLineBreak(); break;
589 case 2 :
590 rWrtSh.InsertColumnBreak(); break;
591 case 3 :
592 {
593 rWrtSh.StartAllAction();
594 if( aTemplateName.Len() )
595 rWrtSh.InsertPageBreak( &aTemplateName, nPageNumber );
596 else
597 rWrtSh.InsertPageBreak();
598 rWrtSh.EndAllAction();
599 }
600 }
601
602 break;
603 }
604 case FN_INSERT_BOOKMARK:
605 {
606 if ( pItem )
607 {
608 ::rtl::OUString sName = ((SfxStringItem*)pItem)->GetValue();
609 rWrtSh.SetBookmark( KeyCode(), sName, aEmptyStr );
610 }
611 else
612 {
613 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
614 DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");
615
616 VclAbstractDialog* pDlg = pFact->CreateSwInsertBookmarkDlg( GetView().GetWindow(), rWrtSh, rReq, DLG_INSERT_BOOKMARK );
617 DBG_ASSERT(pDlg, "Dialogdiet fail!");
618 pDlg->Execute();
619 delete pDlg;
620 }
621
622 break;
623 }
624 case FN_DELETE_BOOKMARK:
625 {
626 if ( pItem )
627 {
628 IDocumentMarkAccess* const pMarkAccess = rWrtSh.getIDocumentMarkAccess();
629 pMarkAccess->deleteMark( pMarkAccess->findMark(((SfxStringItem*)pItem)->GetValue()) );
630 }
631 break;
632 }
633 case FN_AUTOFORMAT_REDLINE_APPLY:
634 {
635 SvxSwAutoFmtFlags aFlags(SvxAutoCorrCfg::Get()->GetAutoCorrect()->GetSwFlags());
636 // das muss fuer die Nachbearbeitung immer sal_False sein
637 aFlags.bAFmtByInput = sal_False;
638 aFlags.bWithRedlining = sal_True;
639 rWrtSh.AutoFormat( &aFlags );
640 aFlags.bWithRedlining = sal_False;
641
642 SfxViewFrame* pVFrame = GetView().GetViewFrame();
643 if (pVFrame->HasChildWindow(FN_REDLINE_ACCEPT))
644 pVFrame->ToggleChildWindow(FN_REDLINE_ACCEPT);
645
646 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
647 DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");
648
649 AbstractSwModalRedlineAcceptDlg* pDlg = pFact->CreateSwModalRedlineAcceptDlg( &GetView().GetEditWin(), DLG_MOD_REDLINE_ACCEPT );
650 DBG_ASSERT(pDlg, "Dialogdiet fail!");
651
652 switch (lcl_AskRedlineMode(&GetView().GetEditWin()))
653 {
654 case RET_OK:
655 {
656 pDlg->AcceptAll(sal_True);
657 SfxRequest aReq( pVFrame, FN_AUTOFORMAT_APPLY );
658 aReq.Done();
659 rReq.Ignore();
660 break;
661 }
662
663 case RET_CANCEL:
664 pDlg->AcceptAll(sal_False);
665 rReq.Ignore();
666 break;
667
668 case 2:
669 pDlg->Execute();
670 rReq.Done();
671 break;
672 }
673 delete pDlg;
674 }
675 break;
676
677 case FN_AUTOFORMAT_APPLY:
678 {
679 SvxSwAutoFmtFlags aFlags(SvxAutoCorrCfg::Get()->GetAutoCorrect()->GetSwFlags());
680 // das muss fuer die Nachbearbeitung immer sal_False sein
681 aFlags.bAFmtByInput = sal_False;
682 rWrtSh.AutoFormat( &aFlags );
683 rReq.Done();
684 }
685 break;
686 case FN_AUTOFORMAT_AUTO:
687 {
688 SvxAutoCorrCfg* pACfg = SvxAutoCorrCfg::Get();
689 sal_Bool bSet = pItem ? ((const SfxBoolItem*)pItem)->GetValue() : !pACfg->IsAutoFmtByInput();
690 if( bSet != pACfg->IsAutoFmtByInput() )
691 {
692 pACfg->SetAutoFmtByInput( bSet );
693 GetView().GetViewFrame()->GetBindings().Invalidate( nSlot );
694 if ( !pItem )
695 rReq.AppendItem( SfxBoolItem( GetPool().GetWhich(nSlot), bSet ) );
696 rReq.Done();
697 }
698 }
699 break;
700 case FN_AUTO_CORRECT:
701 {
702 // erstmal auf Blank defaulten
703 sal_Unicode cChar = ' ';
704 rWrtSh.AutoCorrect( *SvxAutoCorrCfg::Get()->GetAutoCorrect(), cChar );
705 rReq.Done();
706 }
707 break;
708 case FN_TABLE_SORT_DIALOG:
709 case FN_SORTING_DLG:
710 {
711 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
712 DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");
713
714 VclAbstractDialog* pDlg = pFact->CreateVclAbstractDialog( GetView().GetWindow(), rWrtSh, DLG_SORTING );
715 DBG_ASSERT(pDlg, "Dialogdiet fail!");
716 pDlg->Execute();
717 delete pDlg;
718 rReq.Done();
719 }
720 break;
721 case FN_NUMBERING_OUTLINE_DLG:
722 {
723 SfxItemSet aTmp(GetPool(), FN_PARAM_1, FN_PARAM_1);
724 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
725 DBG_ASSERT(pFact, "Dialogdiet fail!");
726 SfxAbstractTabDialog* pDlg = pFact->CreateSwTabDialog( DLG_TAB_OUTLINE,
727 GetView().GetWindow(), &aTmp, rWrtSh);
728 DBG_ASSERT(pDlg, "Dialogdiet fail!");
729 pDlg->Execute();
730 delete pDlg;
731 rReq.Done();
732 }
733 break;
734 case FN_CALCULATE:
735 {
736 SwTransferable* pTransfer = new SwTransferable( rWrtSh );
737 /*??*/ uno::Reference<
738 datatransfer::XTransferable > xRef(
739 pTransfer );
740 pTransfer->CalculateAndCopy();
741 rReq.Done();
742 }
743 break;
744 case FN_GOTO_REFERENCE:
745 {
746 SwField *pFld = rWrtSh.GetCurFld();
747 if(pFld && pFld->GetTypeId() == TYP_GETREFFLD)
748 {
749 rWrtSh.StartAllAction();
750 rWrtSh.SwCrsrShell::GotoRefMark( ((SwGetRefField*)pFld)->GetSetRefName(),
751 ((SwGetRefField*)pFld)->GetSubType(),
752 ((SwGetRefField*)pFld)->GetSeqNo() );
753 rWrtSh.EndAllAction();
754 rReq.Done();
755 }
756 }
757 break;
758 case FN_EDIT_FORMULA:
759 {
760 const sal_uInt16 nId = SwInputChild::GetChildWindowId();
761 SfxViewFrame* pVFrame = GetView().GetViewFrame();
762 if(pItem)
763 {
764 //if the ChildWindow is active it has to be removed
765 if( pVFrame->HasChildWindow( nId ) )
766 {
767 pVFrame->ToggleChildWindow( nId );
768 pVFrame->GetBindings().InvalidateAll( sal_True );
769 }
770
771 String sFormula(((const SfxStringItem*)pItem)->GetValue());
772 SwFldMgr aFldMgr;
773 rWrtSh.StartAllAction();
774 sal_Bool bDelSel;
775 if( 0 != (bDelSel = rWrtSh.HasSelection()) )
776 {
777 rWrtSh.StartUndo( UNDO_START );
778 rWrtSh.DelRight();
779 }
780 else
781 {
782 rWrtSh.EnterStdMode();
783 }
784
785 if( !bDelSel && aFldMgr.GetCurFld() && TYP_FORMELFLD == aFldMgr.GetCurTypeId() )
786 aFldMgr.UpdateCurFld( aFldMgr.GetCurFld()->GetFormat(), aEmptyStr, sFormula );
787 else if( sFormula.Len() )
788 {
789 if( rWrtSh.IsCrsrInTbl() )
790 {
791 SfxItemSet aSet( rWrtSh.GetAttrPool(), RES_BOXATR_FORMULA, RES_BOXATR_FORMULA );
792 aSet.Put( SwTblBoxFormula( sFormula ));
793 rWrtSh.SetTblBoxFormulaAttrs( aSet );
794 rWrtSh.UpdateTable();
795 }
796 else
797 {
798 SvNumberFormatter* pFormatter = rWrtSh.GetNumberFormatter();
799 sal_uLong nSysNumFmt = pFormatter->GetFormatIndex( NF_NUMBER_STANDARD, LANGUAGE_SYSTEM);
800 SwInsertFld_Data aData(TYP_FORMELFLD, nsSwGetSetExpType::GSE_FORMULA, aEmptyStr, sFormula, nSysNumFmt);
801 aFldMgr.InsertFld(aData);
802 }
803 }
804
805 if( bDelSel )
806 rWrtSh.EndUndo( UNDO_END );
807 rWrtSh.EndAllAction();
808 rReq.Done();
809 }
810 else
811 {
812 rWrtSh.EndAllTblBoxEdit();
813 pVFrame->ToggleChildWindow( nId );
814 if( !pVFrame->HasChildWindow( nId ) )
815 pVFrame->GetBindings().InvalidateAll( sal_True );
816 rReq.Ignore();
817 }
818 }
819
820 break;
821 case FN_TABLE_UNSET_READ_ONLY:
822 {
823 rWrtSh.UnProtectTbls();
824 }
825 break;
826 case FN_EDIT_HYPERLINK:
827 GetView().GetViewFrame()->ToggleChildWindow(SID_HYPERLINK_DIALOG);
828 break;
829 case FN_REMOVE_HYPERLINK:
830 {
831 sal_Bool bSel = rWrtSh.HasSelection();
832 if(!bSel)
833 {
834 rWrtSh.StartAction();
835 rWrtSh.Push();
836 if(!rWrtSh.SelectTxtAttr( RES_TXTATR_INETFMT ))
837 rWrtSh.SelWrd();
838 }
839 //now remove the attribute
840 SvUShortsSort aAttribs;
841 aAttribs.Insert( RES_TXTATR_INETFMT );
842 rWrtSh.ResetAttr( &aAttribs );
843 if(!bSel)
844 {
845 rWrtSh.Pop(sal_False);
846 rWrtSh.EndAction();
847 }
848 }
849 break;
850 case SID_ATTR_BRUSH_CHAR :
851 case SID_ATTR_CHAR_SCALEWIDTH :
852 case SID_ATTR_CHAR_ROTATED :
853 case FN_TXTATR_INET :
854 case FN_INSERT_HYPERLINK:
855 {
856 sal_uInt16 nWhich = GetPool().GetWhich( nSlot );
857 if ( pArgs && pArgs->GetItemState( nWhich ) == SFX_ITEM_SET )
858 bUseDialog = sal_False;
859 // intentionally no break
860 }
861 case SID_CHAR_DLG:
862 case SID_CHAR_DLG_EFFECT:
863 {
864 lcl_CharDialog( rWrtSh, bUseDialog, nSlot, pArgs, &rReq );
865 }
866 break;
867 case SID_CHAR_DLG_FOR_PARAGRAPH:
868 {
869 rWrtSh.Push(); //save current cursor
870 SwLangHelper::SelectCurrentPara( rWrtSh );
871 lcl_CharDialog( rWrtSh, bUseDialog, nSlot, pArgs, &rReq );
872 rWrtSh.Pop( sal_False ); //restore old cursor
873 }
874 break;
875 case SID_ATTR_LRSPACE :
876 case SID_ATTR_ULSPACE :
877 case SID_ATTR_BRUSH :
878 case SID_PARA_VERTALIGN :
879 case SID_ATTR_PARA_NUMRULE :
880 case SID_ATTR_PARA_REGISTER :
881 case SID_ATTR_PARA_PAGENUM :
882 case FN_FORMAT_LINENUMBER :
883 case FN_NUMBER_NEWSTART :
884 case FN_NUMBER_NEWSTART_AT :
885 case FN_FORMAT_DROPCAPS :
886 case FN_DROP_TEXT:
887 case SID_ATTR_PARA_LRSPACE:
888 {
889 sal_uInt16 nWhich = GetPool().GetWhich( nSlot );
890 if ( pArgs && pArgs->GetItemState( nWhich ) == SFX_ITEM_SET )
891 bUseDialog = sal_False;
892 // intentionally no break
893
894 }
895 case SID_PARA_DLG:
896 {
897 FieldUnit eMetric = ::GetDfltMetric(0 != PTR_CAST(SwWebView, &GetView()));
898 SW_MOD()->PutItem(SfxUInt16Item(SID_ATTR_METRIC, static_cast< sal_uInt16 >(eMetric)));
899 SfxItemSet aCoreSet( GetPool(),
900 RES_PARATR_BEGIN, RES_PARATR_END - 1,
901 // --> OD 2008-02-25 #refactorlists#
902 RES_PARATR_LIST_BEGIN, RES_PARATR_LIST_END - 1,
903 // <--
904 RES_FRMATR_BEGIN, RES_FRMATR_END - 1,
905 SID_ATTR_TABSTOP_POS, SID_ATTR_TABSTOP_POS,
906 SID_ATTR_TABSTOP_DEFAULTS, SID_ATTR_TABSTOP_DEFAULTS,
907 SID_ATTR_TABSTOP_OFFSET, SID_ATTR_TABSTOP_OFFSET,
908 SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER,
909 SID_ATTR_PARA_MODEL, SID_ATTR_PARA_KEEP,
910 SID_ATTR_PARA_PAGENUM, SID_ATTR_PARA_PAGENUM,
911 SID_HTML_MODE, SID_HTML_MODE,
912 FN_PARAM_1, FN_PARAM_1,
913 FN_NUMBER_NEWSTART, FN_NUMBER_NEWSTART_AT,
914 FN_DROP_TEXT, FN_DROP_CHAR_STYLE_NAME,
915 0);
916 // --> OD 2008-01-16 #newlistlevelattrs#
917 // get also the list level indent values merged as LR-SPACE item, if needed.
918 rWrtSh.GetCurAttr( aCoreSet, true );
919 // <--
920 aCoreSet.Put(SfxUInt16Item(SID_HTML_MODE,
921 ::GetHtmlMode(GetView().GetDocShell())));
922
923 // Tabulatoren, DefaultTabs ins ItemSet Stecken
924 const SvxTabStopItem& rDefTabs = (const SvxTabStopItem&)
925 GetPool().GetDefaultItem(RES_PARATR_TABSTOP);
926
927 sal_uInt16 nDefDist = ::GetTabDist( rDefTabs );
928 SfxUInt16Item aDefDistItem( SID_ATTR_TABSTOP_DEFAULTS, nDefDist );
929 aCoreSet.Put( aDefDistItem );
930
931 // Aktueller Tab
932 SfxUInt16Item aTabPos( SID_ATTR_TABSTOP_POS, 0 );
933 aCoreSet.Put( aTabPos );
934
935 // linker Rand als Offset
936 //#i24363# tab stops relative to indent
937 const long nOff = rWrtSh.getIDocumentSettingAccess()->get(IDocumentSettingAccess::TABS_RELATIVE_TO_INDENT) ?
938 ((SvxLRSpaceItem&)aCoreSet.Get( RES_LR_SPACE )).GetTxtLeft() : 0;
939 SfxInt32Item aOff( SID_ATTR_TABSTOP_OFFSET, nOff );
940 aCoreSet.Put( aOff );
941
942 // BoxInfo setzen
943 ::PrepareBoxInfo( aCoreSet, rWrtSh );
944
945 //aktuelles Seitenformat
946 ::SwToSfxPageDescAttr( aCoreSet );
947
948 sal_uInt16 nDefPage = 0;
949 if( pItem )
950 nDefPage = ((SfxUInt16Item *)pItem)->GetValue();
951
952 // Numerierungseigenschaften
953 if(rWrtSh.GetCurNumRule())
954 {
955 SfxBoolItem aStart( FN_NUMBER_NEWSTART, rWrtSh.IsNumRuleStart() );
956 aCoreSet.Put(aStart);
957 // --> OD 2008-02-29 #refactorlists#
958 // SfxUInt16Item aStartAt(FN_NUMBER_NEWSTART_AT,
959 // rWrtSh.IsNodeNumStart());
960 SfxUInt16Item aStartAt( FN_NUMBER_NEWSTART_AT,
961 rWrtSh.GetNodeNumStart() );
962 // <--
963 aCoreSet.Put(aStartAt);
964 }
965 SfxAbstractTabDialog* pDlg = NULL;
966
967 if ( bUseDialog && GetActiveView() )
968 {
969 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
970 DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");
971
972 pDlg = pFact->CreateSwParaDlg( GetView().GetWindow(),GetView(), aCoreSet,DLG_STD, DLG_PARA,NULL, sal_False, nDefPage );
973 DBG_ASSERT(pDlg, "Dialogdiet fail!");
974 }
975 SfxItemSet* pSet = NULL;
976 if ( !bUseDialog )
977 {
978 if ( nSlot == SID_ATTR_PARA_LRSPACE)
979 {
980 SvxLRSpaceItem aParaMargin((const SvxLRSpaceItem&)pArgs->Get(nSlot));
981 aParaMargin.SetWhich( RES_LR_SPACE);
982 aCoreSet.Put(aParaMargin);
983 pSet = &aCoreSet;
984
985 } else
986 pSet = (SfxItemSet*) pArgs;
987
988 }
989 else if ( NULL != pDlg && pDlg->Execute() == RET_OK )
990 {
991 // Defaults evtl umsetzen
992 pSet = (SfxItemSet*)pDlg->GetOutputItemSet();
993 sal_uInt16 nNewDist;
994 if( SFX_ITEM_SET == pSet->GetItemState( SID_ATTR_TABSTOP_DEFAULTS, sal_False, &pItem ) &&
995 nDefDist != (nNewDist = ((SfxUInt16Item*)pItem)->GetValue()) )
996 {
997 SvxTabStopItem aDefTabs( 0, 0, SVX_TAB_ADJUST_DEFAULT, RES_PARATR_TABSTOP );
998 MakeDefTabs( nNewDist, aDefTabs );
999 rWrtSh.SetDefault( aDefTabs );
1000 pSet->ClearItem( SID_ATTR_TABSTOP_DEFAULTS );
1001 }
1002
1003 if ( SFX_ITEM_SET == pSet->GetItemState(FN_PARAM_1,sal_False,&pItem) )
1004 {
1005 pSet->Put(SfxStringItem(FN_DROP_TEXT, ((const SfxStringItem*)pItem)->GetValue()));
1006 pSet->ClearItem(FN_PARAM_1);
1007 }
1008
1009 if( SFX_ITEM_SET == pSet->GetItemState( RES_PARATR_DROP, sal_False, &pItem ))
1010 {
1011 String sCharStyleName;
1012 if(((const SwFmtDrop*)pItem)->GetCharFmt())
1013 sCharStyleName = ((const SwFmtDrop*)pItem)->GetCharFmt()->GetName();
1014 pSet->Put(SfxStringItem(FN_DROP_CHAR_STYLE_NAME, sCharStyleName));
1015 }
1016 }
1017
1018 if ( pSet )
1019 {
1020 rReq.Done( *pSet );
1021 ::SfxToSwPageDescAttr( rWrtSh, *pSet );
1022 // --> OD 2006-12-06 #i56253#
1023 // enclose all undos.
1024 // Thus, check conditions, if actions will be performed.
1025 const bool bUndoNeeded( pSet->Count() ||
1026 SFX_ITEM_SET == pSet->GetItemState(FN_NUMBER_NEWSTART) ||
1027 SFX_ITEM_SET == pSet->GetItemState(FN_NUMBER_NEWSTART_AT) );
1028 if ( bUndoNeeded )
1029 {
1030 rWrtSh.StartUndo( UNDO_INSATTR );
1031 }
1032 // <--
1033 if( pSet->Count() )
1034 {
1035 rWrtSh.StartAction();
1036 // rWrtSh.StartUndo( UNDO_START );
1037 if ( SFX_ITEM_SET == pSet->GetItemState(FN_DROP_TEXT, sal_False, &pItem) )
1038 {
1039 if ( ((SfxStringItem*)pItem)->GetValue().Len() )
1040 rWrtSh.ReplaceDropTxt(((SfxStringItem*)pItem)->GetValue());
1041 }
1042 rWrtSh.SetAttrSet( *pSet );
1043 // rWrtSh.EndUndo( UNDO_END );
1044 rWrtSh.EndAction();
1045 SwTxtFmtColl* pColl = rWrtSh.GetCurTxtFmtColl();
1046 if(pColl && pColl->IsAutoUpdateFmt())
1047 {
1048 rWrtSh.AutoUpdatePara(pColl, *pSet);
1049 }
1050 }
1051
1052 if( SFX_ITEM_SET == pSet->GetItemState(FN_NUMBER_NEWSTART) )
1053 {
1054 //SetNumRuleStart(sal_True) restarts the numbering at the value
1055 //that is defined at the starting point of the numbering level
1056 //otherwise the SetNodeNumStart() value determines the start
1057 //if it's set to something different than (sal_uInt16)0xFFFF
1058
1059 sal_Bool bStart = ((SfxBoolItem&)pSet->Get(FN_NUMBER_NEWSTART)).GetValue();
1060 // --> OD 2007-06-11 #b6560525#
1061 // Default value for restart value has to be (sal_uInt16)0xFFFF
1062 // in order to indicate that the restart value of the list
1063 // style has to be used on restart.
1064 sal_uInt16 nNumStart = (sal_uInt16)0xFFFF;
1065 // <--
1066 if( SFX_ITEM_SET == pSet->GetItemState(FN_NUMBER_NEWSTART_AT) )
1067 {
1068 nNumStart = ((SfxUInt16Item&)pSet->Get(FN_NUMBER_NEWSTART_AT)).GetValue();
1069 }
1070 rWrtSh.SetNumRuleStart(bStart);
1071 rWrtSh.SetNodeNumStart(nNumStart);
1072 }
1073 else if( SFX_ITEM_SET == pSet->GetItemState(FN_NUMBER_NEWSTART_AT) )
1074 {
1075 sal_uInt16 nNumStart = ((SfxUInt16Item&)pSet->Get(FN_NUMBER_NEWSTART_AT)).GetValue();
1076 rWrtSh.SetNodeNumStart(nNumStart);
1077 rWrtSh.SetNumRuleStart(sal_False);
1078 }
1079 // --> OD 2006-12-06 #i56253#
1080 if ( bUndoNeeded )
1081 {
1082 rWrtSh.EndUndo( UNDO_INSATTR );
1083 }
1084 // <--
1085 }
1086
1087 delete pDlg;
1088 }
1089 break;
1090 case FN_NUM_CONTINUE:
1091 {
1092 // --> OD 2008-03-18 #refactorlists#
1093 String sContinuedListId;
1094 const SwNumRule* pRule =
1095 rWrtSh.SearchNumRule( false, true, false, -1, sContinuedListId );
1096 // --> OD 2009-08-26 #i86492#
1097 // Search also for bullet list
1098 if ( !pRule )
1099 {
1100 pRule = rWrtSh.SearchNumRule( false, false, false, -1, sContinuedListId );
1101 }
1102 // <--
1103 if ( pRule )
1104 {
1105 rWrtSh.SetCurNumRule( *pRule, false, sContinuedListId );
1106 }
1107 // <--
1108 }
1109 break;
1110 case FN_SELECT_PARA:
1111 {
1112 if(!rWrtSh.IsSttOfPara())
1113 rWrtSh.SttPara(sal_False);
1114 else
1115 rWrtSh.EnterStdMode();
1116 rWrtSh.EndPara(sal_True);
1117 }
1118 break;
1119
1120 case SID_DEC_INDENT:
1121 case SID_INC_INDENT:
1122 //According to the requirement, modified the behavior when user
1123 //using the indent button on the toolbar. Now if we increase/decrease indent for a
1124 //paragraph which has bullet style it will increase/decrease the bullet level.
1125 {
1126 //If the current paragraph has bullet call the function to
1127 //increase or decrease the bullet level.
1128 //Why could I know wheter a paragraph has bullet or not by checking the below conditions?
1129 //Please refer to the "case KEY_TAB:" section in SwEditWin::KeyInput(..) :
1130 // if( rSh.GetCurNumRule() && rSh.IsSttOfPara() &&
1131 // !rSh.HasReadonlySel() )
1132 // eKeyState = KS_NumDown;
1133 //Above code demonstrates that when the cursor is at the start of a paragraph which has bullet,
1134 //press TAB will increase the bullet level.
1135 //So I copied from that ^^
1136 if ( rWrtSh.GetCurNumRule() && !rWrtSh.HasReadonlySel() )
1137 {
1138 rWrtSh.NumUpDown( SID_INC_INDENT == nSlot );
1139 }
1140 else//execute the original processing functions
1141 {
1142 //below is copied of the old codes
1143 rWrtSh.MoveLeftMargin( SID_INC_INDENT == nSlot,
1144 rReq.GetModifier() != KEY_MOD1 );
1145 }
1146 }
1147 //rWrtSh.MoveLeftMargin( SID_INC_INDENT == nSlot,
1148 // rReq.GetModifier() != KEY_MOD1 );
1149 rReq.Done();
1150 break;
1151 case FN_DEC_INDENT_OFFSET:
1152 case FN_INC_INDENT_OFFSET:
1153 rWrtSh.MoveLeftMargin( FN_INC_INDENT_OFFSET == nSlot,
1154 rReq.GetModifier() == KEY_MOD1 );
1155 rReq.Done();
1156 break;
1157
1158 case SID_ATTR_CHAR_COLOR2:
1159 {
1160 if(pItem)
1161 {
1162 Color aSet = ((const SvxColorItem*)pItem)->GetValue();
1163 SwEditWin& rEditWin = GetView().GetEditWin();
1164 rEditWin.SetTextColor(aSet);
1165 SwApplyTemplate* pApply = rEditWin.GetApplyTemplate();
1166 SvxColorItem aItem(aSet, RES_CHRATR_COLOR);
1167
1168 // besteht eine Selektion, wird sie gleich gefaerbt
1169 if(!pApply && rWrtSh.HasSelection())
1170 {
1171 rWrtSh.SetAttrItem(SvxColorItem (aSet, RES_CHRATR_COLOR));
1172 }
1173 else if(!pApply || pApply->nColor != SID_ATTR_CHAR_COLOR_EXT)
1174 {
1175 GetView().GetViewFrame()->GetDispatcher()->Execute(SID_ATTR_CHAR_COLOR_EXT);
1176 }
1177
1178 rReq.Done();
1179 }
1180 }
1181 break;
1182 case SID_ATTR_CHAR_COLOR_BACKGROUND:
1183 {
1184 SwEditWin& rEdtWin = GetView().GetEditWin();
1185 SwApplyTemplate* pApply = rEdtWin.GetApplyTemplate();
1186 rEdtWin.SetTextBackColorTransparent(0 == pItem);
1187 Color aSet;
1188 if(pItem)
1189 {
1190 aSet = ((const SvxColorItem*)pItem)->GetValue();
1191 rEdtWin.SetTextBackColor(aSet);
1192 }
1193 if(!pApply && (rWrtSh.HasSelection() || rReq.IsAPI()))
1194 {
1195 SvxBrushItem aBrushItem(RES_CHRATR_BACKGROUND);
1196 if(pItem)
1197 aBrushItem.SetColor(aSet);
1198 else
1199 aBrushItem.SetColor(Color(COL_TRANSPARENT));
1200 rWrtSh.SetAttrItem( aBrushItem );
1201 }
1202 else if(!pApply || pApply->nColor != SID_ATTR_CHAR_COLOR_BACKGROUND_EXT)
1203 {
1204 GetView().GetViewFrame()->GetDispatcher()->Execute(SID_ATTR_CHAR_COLOR_BACKGROUND_EXT);
1205 }
1206
1207 rReq.Done();
1208
1209 }
1210 break;
1211 case SID_ATTR_CHAR_COLOR_BACKGROUND_EXT:
1212 case SID_ATTR_CHAR_COLOR_EXT:
1213 {
1214 SwEditWin& rEdtWin = GetView().GetEditWin();
1215 SwApplyTemplate* pApply = rEdtWin.GetApplyTemplate();
1216 SwApplyTemplate aTempl;
1217 sal_Bool bSelection = rWrtSh.HasSelection();
1218 if(bSelection)
1219 {
1220
1221 if(nSlot == SID_ATTR_CHAR_COLOR_BACKGROUND_EXT)
1222 {
1223 rWrtSh.SetAttrItem(
1224 SvxBrushItem( rEdtWin.GetTextBackColor(), RES_CHRATR_BACKGROUND) );
1225 }
1226 else
1227 rWrtSh.SetAttrItem(
1228 SvxColorItem( rEdtWin.GetTextColor(), RES_CHRATR_COLOR) );
1229 }
1230 else
1231 {
1232 if(!pApply || pApply->nColor != nSlot)
1233 aTempl.nColor = nSlot;
1234 rEdtWin.SetApplyTemplate(aTempl);
1235 }
1236
1237 rReq.Done();
1238 }
1239 break;
1240
1241 case FN_NUM_BULLET_MOVEDOWN:
1242 if (!rWrtSh.IsAddMode())
1243 rWrtSh.MoveParagraph(1);
1244 rReq.Done();
1245 break;
1246
1247 case FN_NUM_BULLET_MOVEUP:
1248 if (!rWrtSh.IsAddMode())
1249 rWrtSh.MoveParagraph(-1);
1250 rReq.Done();
1251 break;
1252 case SID_RUBY_DIALOG:
1253 case SID_HYPERLINK_DIALOG:
1254 {
1255 SfxRequest aReq(nSlot, SFX_CALLMODE_SLOT, SFX_APP()->GetPool());
1256 GetView().GetViewFrame()->ExecuteSlot( aReq);
1257 rReq.Ignore();
1258 }
1259 break;
1260 case FN_INSERT_PAGEHEADER:
1261 case FN_INSERT_PAGEFOOTER:
1262 if(pArgs && pArgs->Count())
1263 {
1264 String sStyleName;
1265 if(pItem)
1266 sStyleName = ((const SfxStringItem*)pItem)->GetValue();
1267 sal_Bool bOn = sal_True;
1268 if( SFX_ITEM_SET == pArgs->GetItemState(FN_PARAM_1, sal_False, &pItem))
1269 bOn = ((const SfxBoolItem*)pItem)->GetValue();
1270 ChangeHeaderOrFooter(sStyleName, FN_INSERT_PAGEHEADER == nSlot, bOn, !rReq.IsAPI());
1271 rReq.Done();
1272 }
1273 break;
1274 case FN_READONLY_SELECTION_MODE :
1275 if(GetView().GetDocShell()->IsReadOnly())
1276 {
1277 rWrtSh.SetReadonlySelectionOption(
1278 !rWrtSh.GetViewOptions()->IsSelectionInReadonly());
1279 rWrtSh.ShowCrsr();
1280 }
1281 break;
1282 case FN_SELECTION_MODE_DEFAULT:
1283 case FN_SELECTION_MODE_BLOCK :
1284 {
1285 bool bSetBlockMode = !rWrtSh.IsBlockMode();
1286 if( pArgs && SFX_ITEM_SET == pArgs->GetItemState(nSlot, sal_False, &pItem))
1287 bSetBlockMode = ((const SfxBoolItem*)pItem)->GetValue();
1288 if( ( nSlot == FN_SELECTION_MODE_DEFAULT ) ^ bSetBlockMode )
1289 rWrtSh.EnterBlockMode();
1290 else
1291 rWrtSh.EnterStdMode();
1292 SfxBindings &rBnd = GetView().GetViewFrame()->GetBindings();
1293 rBnd.Invalidate(FN_STAT_SELMODE);
1294 rBnd.Update(FN_STAT_SELMODE);
1295 }
1296 break;
1297 case SID_OPEN_HYPERLINK:
1298 case FN_COPY_HYPERLINK_LOCATION:
1299 {
1300 SfxItemSet aSet(GetPool(),
1301 RES_TXTATR_INETFMT,
1302 RES_TXTATR_INETFMT);
1303 rWrtSh.GetCurAttr(aSet);
1304 if(SFX_ITEM_SET <= aSet.GetItemState( RES_TXTATR_INETFMT, sal_True ))
1305 {
1306 const SwFmtINetFmt& rINetFmt = dynamic_cast<const SwFmtINetFmt&>( aSet.Get(RES_TXTATR_INETFMT, sal_True) );
1307 if( nSlot == FN_COPY_HYPERLINK_LOCATION )
1308 {
1309 ::uno::Reference< datatransfer::clipboard::XClipboard > xClipboard = GetView().GetEditWin().GetClipboard();
1310 vcl::unohelper::TextDataObject::CopyStringTo(
1311 rINetFmt.GetValue(),
1312 xClipboard );
1313 }
1314 else
1315 rWrtSh.ClickToINetAttr(rINetFmt, URLLOAD_NOFILTER);
1316 }
1317 }
1318 break;
1319 case SID_OPEN_XML_FILTERSETTINGS:
1320 {
1321 try
1322 {
1323 uno::Reference < ui::dialogs::XExecutableDialog > xDialog(::comphelper::getProcessServiceFactory()->createInstance(rtl::OUString::createFromAscii("com.sun.star.comp.ui.XSLTFilterDialog")), uno::UNO_QUERY);
1324 if( xDialog.is() )
1325 {
1326 xDialog->execute();
1327 }
1328 }
1329 catch( uno::Exception& )
1330 {
1331 }
1332 rReq.Ignore ();
1333 }
1334 break;
1335 case FN_FORMAT_APPLY_HEAD1:
1336 {
1337 }
1338 break;
1339 case FN_FORMAT_APPLY_HEAD2:
1340 {
1341 }
1342 break;
1343 case FN_FORMAT_APPLY_HEAD3:
1344 {
1345 }
1346 break;
1347 case FN_FORMAT_APPLY_DEFAULT:
1348 {
1349 }
1350 break;
1351 case FN_FORMAT_APPLY_TEXTBODY:
1352 {
1353 }
1354 break;
1355 case FN_WORDCOUNT_DIALOG:
1356 {
1357 SwWrtShell &rSh = GetShell();
1358 SwDocStat aCurr;
1359 SwDocStat aDocStat( rSh.getIDocumentStatistics()->GetDocStat() );
1360 {
1361 SwWait aWait( *GetView().GetDocShell(), true );
1362 rSh.StartAction();
1363 rSh.CountWords( aCurr );
1364 rSh.UpdateDocStat( aDocStat );
1365 rSh.EndAction();
1366 }
1367
1368 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
1369 DBG_ASSERT(pFact, "Dialogdiet fail!");
1370 AbstractSwWordCountDialog* pDialog = pFact->CreateSwWordCountDialog( GetView().GetWindow() );
1371 pDialog->SetValues(aCurr, aDocStat );
1372 pDialog->Execute();
1373 delete pDialog;
1374 }
1375 break;
1376 default:
1377 ASSERT(!this, falscher Dispatcher);
1378 return;
1379 }
1380 }
1381
1382
1383 /*--------------------------------------------------------------------
1384 Beschreibung:
1385 --------------------------------------------------------------------*/
1386
1387
GetState(SfxItemSet & rSet)1388 void SwTextShell::GetState( SfxItemSet &rSet )
1389 {
1390 SwWrtShell &rSh = GetShell();
1391 SfxWhichIter aIter( rSet );
1392 sal_uInt16 nWhich = aIter.FirstWhich();
1393 while ( nWhich )
1394 {
1395 switch ( nWhich )
1396 {
1397 case SID_LANGUAGE_STATUS:
1398 {
1399 // the value of used script types
1400 String aScriptTypesInUse( String::CreateFromInt32( rSh.GetScriptType() ) );
1401
1402 SvtLanguageTable aLangTable;
1403
1404 // get keyboard language
1405 String aKeyboardLang;
1406 LanguageType nLang = LANGUAGE_DONTKNOW;
1407 SwEditWin& rEditWin = GetView().GetEditWin();
1408 nLang = rEditWin.GetInputLanguage();
1409 if (nLang != LANGUAGE_DONTKNOW && nLang != LANGUAGE_SYSTEM)
1410 aKeyboardLang = aLangTable.GetString( nLang );
1411
1412 // get the language that is in use
1413 const String aMultipleLanguages = String::CreateFromAscii("*");
1414 String aCurrentLang = aMultipleLanguages;
1415 nLang = SwLangHelper::GetCurrentLanguage( rSh );
1416 if (nLang != LANGUAGE_DONTKNOW)
1417 aCurrentLang = aLangTable.GetString( nLang );
1418
1419 // build sequence for status value
1420 uno::Sequence< ::rtl::OUString > aSeq( 4 );
1421 aSeq[0] = aCurrentLang;
1422 aSeq[1] = aScriptTypesInUse;
1423 aSeq[2] = aKeyboardLang;
1424 aSeq[3] = SwLangHelper::GetTextForLanguageGuessing( rSh );
1425
1426 // set sequence as status value
1427 SfxStringListItem aItem( SID_LANGUAGE_STATUS );
1428 aItem.SetStringList( aSeq );
1429 rSet.Put( aItem, SID_LANGUAGE_STATUS );
1430 }
1431 break;
1432
1433 case SID_THES:
1434 {
1435 // is there a valid selection to get text from?
1436 String aText;
1437 sal_Bool bValid = !rSh.HasSelection() ||
1438 (rSh.IsSelOnePara() && !rSh.IsMultiSelection());
1439 // prevent context menu from showing when cursor is not in or at the end of a word
1440 // (GetCurWord will return the next word if there is none at the current position...)
1441 const sal_Int16 nWordType = ::i18n::WordType::DICTIONARY_WORD;
1442 bool bWord = rSh.IsInWord( nWordType ) || rSh.IsStartWord( nWordType ) || rSh.IsEndWord( nWordType );
1443 if (bValid && bWord)
1444 aText = rSh.HasSelection()? rSh.GetSelTxt() : rSh.GetCurWord();
1445
1446 LanguageType nLang = rSh.GetCurLang();
1447 lang::Locale aLocale = SvxCreateLocale( nLang );
1448 String aLangText( MsLangId::convertLanguageToIsoString( nLang ) );
1449
1450 // set word and locale to look up as status value
1451 String aStatusVal( aText );
1452 aStatusVal.AppendAscii( "#" );
1453 aStatusVal += aLangText;
1454
1455 rSet.Put( SfxStringItem( SID_THES, aStatusVal ) );
1456
1457 // disable "Thesaurus" context menu entry if there is nothing to look up
1458 uno::Reference< linguistic2::XThesaurus > xThes( ::GetThesaurus() );
1459 if (aText.Len() == 0 ||
1460 !xThes.is() || nLang == LANGUAGE_NONE || !xThes->hasLocale( aLocale ))
1461 rSet.DisableItem( SID_THES );
1462 }
1463 break;
1464
1465 case FN_NUMBER_NEWSTART :
1466 if(!rSh.GetCurNumRule())
1467 rSet.DisableItem(nWhich);
1468 else
1469 rSet.Put(SfxBoolItem(FN_NUMBER_NEWSTART,
1470 rSh.IsNumRuleStart()));
1471 break;
1472
1473 case FN_EDIT_FORMULA:
1474 case SID_CHARMAP:
1475 {
1476 const int nType = rSh.GetSelectionType();
1477 if (!(nType & nsSelectionType::SEL_TXT) &&
1478 !(nType & nsSelectionType::SEL_TBL) &&
1479 !(nType & nsSelectionType::SEL_NUM))
1480 {
1481 rSet.DisableItem(nWhich);
1482 }
1483 else if ( nWhich == FN_EDIT_FORMULA
1484 && rSh.CrsrInsideInputFld() )
1485 {
1486 rSet.DisableItem( nWhich );
1487 }
1488 }
1489 break;
1490
1491 case FN_INSERT_ENDNOTE:
1492 case FN_INSERT_FOOTNOTE:
1493 case FN_INSERT_FOOTNOTE_DLG:
1494 {
1495 const sal_uInt16 nNoType =
1496 FRMTYPE_FLY_ANY | FRMTYPE_HEADER | FRMTYPE_FOOTER | FRMTYPE_FOOTNOTE;
1497 if ( (rSh.GetFrmType(0,sal_True) & nNoType) )
1498 rSet.DisableItem(nWhich);
1499
1500 if ( rSh.CrsrInsideInputFld() )
1501 {
1502 rSet.DisableItem( nWhich );
1503 }
1504 }
1505 break;
1506
1507 case FN_INSERT_HYPERLINK:
1508 case SID_INSERTDOC:
1509 case FN_INSERT_GLOSSARY:
1510 case FN_EXPAND_GLOSSARY:
1511 if ( rSh.CrsrInsideInputFld() )
1512 {
1513 rSet.DisableItem( nWhich );
1514 }
1515 break;
1516
1517 case FN_INSERT_TABLE:
1518 if ( rSh.CrsrInsideInputFld()
1519 || rSh.GetTableFmt()
1520 || (rSh.GetFrmType(0,sal_True) & FRMTYPE_FOOTNOTE) )
1521 {
1522 rSet.DisableItem( nWhich );
1523 }
1524 break;
1525
1526 case FN_CALCULATE:
1527 if ( !rSh.IsSelection() )
1528 rSet.DisableItem(nWhich);
1529 break;
1530 case FN_GOTO_REFERENCE:
1531 {
1532 SwField *pFld = rSh.GetCurFld();
1533 if ( !pFld || (pFld && pFld->GetTypeId() != TYP_GETREFFLD) )
1534 rSet.DisableItem(nWhich);
1535 }
1536 break;
1537 case FN_AUTOFORMAT_AUTO:
1538 {
1539 rSet.Put( SfxBoolItem( nWhich, SvxAutoCorrCfg::Get()->IsAutoFmtByInput() ));
1540 }
1541 break;
1542
1543 case FN_GLOSSARY_DLG:
1544 {
1545 if ( rSh.CrsrInsideInputFld() )
1546 {
1547 rSet.DisableItem( nWhich );
1548 }
1549 else
1550 {
1551 rSet.Put(SfxBoolItem(nWhich), sal_True);
1552 }
1553 }
1554 break;
1555
1556 case SID_DEC_INDENT:
1557 case SID_INC_INDENT:
1558 {
1559 //if the paragrah has bullet we'll do the following things:
1560 //1: if the bullet level is the first level, disable the decrease-indent button
1561 //2: if the bullet level is the last level, disable the increase-indent button
1562 if ( rSh.GetCurNumRule() && !rSh.HasReadonlySel() )
1563 {
1564 sal_uInt8 nLevel = rSh.GetNumLevel();
1565 if ( nLevel == (MAXLEVEL-1) && nWhich == SID_INC_INDENT ||
1566 nLevel == 0 && nWhich == SID_DEC_INDENT )
1567 {
1568 rSet.DisableItem( nWhich );
1569 }
1570 }
1571 else//if the paragraph has no bullet, execute the original functions
1572 {
1573 //below is copied of the old codes
1574 sal_uInt16 nHtmlMode = ::GetHtmlMode(GetView().GetDocShell());
1575 nHtmlMode &= HTMLMODE_ON|HTMLMODE_SOME_STYLES;
1576 if( (nHtmlMode == HTMLMODE_ON) || !rSh.IsMoveLeftMargin(
1577 SID_INC_INDENT == nWhich, sal_True ))
1578 rSet.DisableItem( nWhich );
1579 }
1580 //old code begins
1581 //sal_uInt16 nHtmlMode = ::GetHtmlMode(GetView().GetDocShell());
1582 //nHtmlMode &= HTMLMODE_ON|HTMLMODE_SOME_STYLES;
1583 //if( (nHtmlMode == HTMLMODE_ON) || !rSh.IsMoveLeftMargin(
1584 // SID_INC_INDENT == nWhich, TRUE ))
1585 // rSet.DisableItem( nWhich );
1586 //old code ends
1587 }
1588 break;
1589
1590 case FN_DEC_INDENT_OFFSET:
1591 case FN_INC_INDENT_OFFSET:
1592 {
1593 sal_uInt16 nHtmlMode = ::GetHtmlMode(GetView().GetDocShell());
1594 nHtmlMode &= HTMLMODE_ON|HTMLMODE_SOME_STYLES;
1595 if( (nHtmlMode == HTMLMODE_ON) ||
1596 !rSh.IsMoveLeftMargin( FN_INC_INDENT_OFFSET == nWhich,
1597 sal_False ))
1598 rSet.DisableItem( nWhich );
1599 }
1600 break;
1601
1602 case SID_ATTR_CHAR_COLOR2:
1603 {
1604 rSet.Put(SvxColorItem(GetView().GetEditWin().GetTextColor(), SID_ATTR_CHAR_COLOR2));
1605 }
1606 break;
1607 case SID_ATTR_CHAR_COLOR_BACKGROUND:
1608 {
1609 if(GetView().GetEditWin().IsTextBackColorTransparent())
1610 rSet.Put(SvxColorItem(Color(COL_TRANSPARENT), SID_ATTR_CHAR_COLOR_BACKGROUND));
1611 else
1612 rSet.Put(SvxColorItem(GetView().GetEditWin().GetTextBackColor(), SID_ATTR_CHAR_COLOR_BACKGROUND));
1613 }
1614 break;
1615 case SID_ATTR_CHAR_COLOR_BACKGROUND_EXT:
1616 case SID_ATTR_CHAR_COLOR_EXT:
1617 {
1618 SwEditWin& rEdtWin = GetView().GetEditWin();
1619 SwApplyTemplate* pApply = rEdtWin.GetApplyTemplate();
1620 rSet.Put(SfxBoolItem(nWhich, pApply && pApply->nColor == nWhich));
1621 }
1622 break;
1623
1624 case FN_INSERT_BOOKMARK:
1625 if( rSh.IsTableMode()
1626 || rSh.CrsrInsideInputFld() )
1627 {
1628 rSet.DisableItem( nWhich );
1629 }
1630 break;
1631
1632
1633 case FN_INSERT_BREAK:
1634 if ( rSh.HasReadonlySel()
1635 && !rSh.CrsrInsideInputFld() )
1636 {
1637 rSet.DisableItem( nWhich );
1638 }
1639 break;
1640
1641
1642 case FN_INSERT_BREAK_DLG:
1643 case FN_INSERT_COLUMN_BREAK:
1644 case FN_INSERT_PAGEBREAK:
1645 if( rSh.CrsrInsideInputFld() )
1646 {
1647 rSet.DisableItem( nWhich );
1648 }
1649 break;
1650
1651 case FN_INSERT_PAGEHEADER:
1652 case FN_INSERT_PAGEFOOTER:
1653 {
1654 #ifndef CHECK_MENU
1655 rSet.Put( SfxObjectShellItem( nWhich, GetView().GetDocShell() ));
1656 #else
1657 // Seitenvorlagen besorgen
1658 sal_Bool bFound = sal_False;
1659 sal_uInt16 n, nCnt = rSh.GetPageDescCnt();
1660 for( n = 0; n < nCnt; ++n )
1661 {
1662 const SwPageDesc& rDesc = rSh.GetPageDesc( n );
1663 if( FN_INSERT_PAGEHEADER == nWhich
1664 ? !rDesc.GetMaster().GetHeader().IsActive()
1665 : !rDesc.GetMaster().GetFooter().IsActive() )
1666 {
1667 bFound = sal_True;
1668 break;
1669 }
1670 }
1671
1672 if( bFound )
1673 rSet.Put( SfxObjectShellItem( nWhich, GetView().GetDocShell() ));
1674 else
1675 rSet.DisableItem( nWhich );
1676 #endif
1677 }
1678 break;
1679 case FN_TABLE_SORT_DIALOG:
1680 case FN_SORTING_DLG:
1681 if(!rSh.HasSelection() ||
1682 (FN_TABLE_SORT_DIALOG == nWhich && !rSh.GetTableFmt()))
1683 rSet.DisableItem( nWhich );
1684 break;
1685
1686 case SID_RUBY_DIALOG:
1687 {
1688 SvtCJKOptions aCJKOptions;
1689 if( !aCJKOptions.IsRubyEnabled()
1690 || rSh.CrsrInsideInputFld() )
1691 {
1692 GetView().GetViewFrame()->GetBindings().SetVisibleState( nWhich, sal_False );
1693 rSet.DisableItem(nWhich);
1694 }
1695 else
1696 GetView().GetViewFrame()->GetBindings().SetVisibleState( nWhich, sal_True );
1697 }
1698 break;
1699
1700 case SID_HYPERLINK_DIALOG:
1701 if( GetView().GetDocShell()->IsReadOnly()
1702 || ( !GetView().GetViewFrame()->HasChildWindow(nWhich)
1703 && rSh.HasReadonlySel() )
1704 || rSh.CrsrInsideInputFld() )
1705 {
1706 rSet.DisableItem(nWhich);
1707 }
1708 else
1709 {
1710 rSet.Put(SfxBoolItem( nWhich, 0 != GetView().GetViewFrame()->GetChildWindow( nWhich ) ));
1711 }
1712 break;
1713
1714 case FN_EDIT_HYPERLINK:
1715 case FN_REMOVE_HYPERLINK:
1716 case FN_COPY_HYPERLINK_LOCATION:
1717 {
1718 SfxItemSet aSet(GetPool(),
1719 RES_TXTATR_INETFMT,
1720 RES_TXTATR_INETFMT);
1721 rSh.GetCurAttr(aSet);
1722 if(SFX_ITEM_SET > aSet.GetItemState( RES_TXTATR_INETFMT, sal_True ) || rSh.HasReadonlySel())
1723 {
1724 rSet.DisableItem(nWhich);
1725 }
1726 }
1727 break;
1728
1729 case SID_TRANSLITERATE_HALFWIDTH:
1730 case SID_TRANSLITERATE_FULLWIDTH:
1731 case SID_TRANSLITERATE_HIRAGANA:
1732 case SID_TRANSLITERATE_KATAGANA:
1733 {
1734 SvtCJKOptions aCJKOptions;
1735 if(!aCJKOptions.IsChangeCaseMapEnabled())
1736 {
1737 GetView().GetViewFrame()->GetBindings().SetVisibleState( nWhich, sal_False );
1738 rSet.DisableItem(nWhich);
1739 }
1740 else
1741 GetView().GetViewFrame()->GetBindings().SetVisibleState( nWhich, sal_True );
1742 }
1743 break;
1744 case FN_READONLY_SELECTION_MODE :
1745 if(!GetView().GetDocShell()->IsReadOnly())
1746 rSet.DisableItem( nWhich );
1747 else
1748 {
1749 rSet.Put(SfxBoolItem(nWhich, rSh.GetViewOptions()->IsSelectionInReadonly()));
1750 }
1751 break;
1752 case FN_SELECTION_MODE_DEFAULT:
1753 case FN_SELECTION_MODE_BLOCK :
1754 rSet.Put(SfxBoolItem(nWhich, (nWhich == FN_SELECTION_MODE_DEFAULT) != rSh.IsBlockMode()));
1755 break;
1756 case SID_OPEN_HYPERLINK:
1757 {
1758 SfxItemSet aSet(GetPool(),
1759 RES_TXTATR_INETFMT,
1760 RES_TXTATR_INETFMT);
1761 rSh.GetCurAttr(aSet);
1762 if(SFX_ITEM_SET > aSet.GetItemState( RES_TXTATR_INETFMT, sal_False ))
1763 rSet.DisableItem(nWhich);
1764 }
1765 break;
1766 case SID_OPEN_SMARTTAGMENU:
1767 {
1768 uno::Sequence< rtl::OUString > aSmartTagTypes;
1769 uno::Sequence< uno::Reference< container::XStringKeyMap > > aStringKeyMaps;
1770 uno::Reference<text::XTextRange> xRange;
1771
1772 rSh.GetSmartTagTerm( aSmartTagTypes, aStringKeyMaps, xRange );
1773
1774 if ( xRange.is() && aSmartTagTypes.getLength() )
1775 {
1776 uno::Sequence < uno::Sequence< uno::Reference< smarttags::XSmartTagAction > > > aActionComponentsSequence;
1777 uno::Sequence < uno::Sequence< sal_Int32 > > aActionIndicesSequence;
1778
1779 const SmartTagMgr& rSmartTagMgr = SwSmartTagMgr::Get();
1780 rSmartTagMgr.GetActionSequences( aSmartTagTypes,
1781 aActionComponentsSequence,
1782 aActionIndicesSequence );
1783
1784 uno::Reference <frame::XController> xController = GetView().GetController();
1785 const lang::Locale aLocale( SW_BREAKITER()->GetLocale( (LanguageType)GetAppLanguage() ) );
1786 const rtl::OUString aApplicationName( rSmartTagMgr.GetApplicationName() );
1787 const rtl::OUString aRangeText = xRange->getString();
1788
1789 const SvxSmartTagItem aItem( nWhich,
1790 aActionComponentsSequence,
1791 aActionIndicesSequence,
1792 aStringKeyMaps,
1793 xRange,
1794 xController,
1795 aLocale,
1796 aApplicationName,
1797 aRangeText );
1798
1799 rSet.Put( aItem );
1800 }
1801 else
1802 rSet.DisableItem(nWhich);
1803 }
1804 break;
1805 case FN_NUM_NUMBERING_ON:
1806 rSet.Put(SfxBoolItem(FN_NUM_NUMBERING_ON,rSh.SelectionHasNumber()));
1807 break;
1808 case FN_NUM_BULLET_ON:
1809 rSet.Put(SfxBoolItem(FN_NUM_BULLET_ON,rSh.SelectionHasBullet()));
1810 break;
1811 case FN_BUL_NUM_RULE_INDEX:
1812 case FN_NUM_NUM_RULE_INDEX:
1813 {
1814 SwNumRule* pCurRule = (SwNumRule*)(GetShell().GetCurNumRule());
1815 sal_uInt16 nActNumLvl = (sal_uInt16)0xFFFF;
1816 rSet.Put(SfxUInt16Item(FN_NUM_NUM_RULE_INDEX,DEFAULT_NONE));
1817 rSet.Put(SfxUInt16Item(FN_BUL_NUM_RULE_INDEX,DEFAULT_NONE));
1818 if( pCurRule )
1819 {
1820 nActNumLvl = GetShell().GetNumLevel();
1821 if( nActNumLvl < MAXLEVEL )
1822 {
1823 nActNumLvl = 1<<nActNumLvl;
1824 }
1825 SvxNumRule aSvxRule = pCurRule->MakeSvxNumRule();
1826 if ( GetShell().HasBullet())
1827 {
1828 rSet.Put(SfxUInt16Item(FN_BUL_NUM_RULE_INDEX,(sal_uInt16)0xFFFF));
1829 rSet.Put(SfxUInt16Item(FN_NUM_NUM_RULE_INDEX,(sal_uInt16)0xFFFF));
1830 NBOTypeMgrBase* pBullets = NBOutlineTypeMgrFact::CreateInstance(eNBOType::MIXBULLETS);
1831 if ( pBullets )
1832 {
1833 sal_uInt16 nBulIndex = pBullets->GetNBOIndexForNumRule(aSvxRule,nActNumLvl);
1834 rSet.Put(SfxUInt16Item(FN_BUL_NUM_RULE_INDEX,nBulIndex));
1835 }
1836 }else if ( GetShell().HasNumber() )
1837 {
1838 rSet.Put(SfxUInt16Item(FN_BUL_NUM_RULE_INDEX,(sal_uInt16)0xFFFF));
1839 rSet.Put(SfxUInt16Item(FN_NUM_NUM_RULE_INDEX,(sal_uInt16)0xFFFF));
1840 NBOTypeMgrBase* pNumbering = NBOutlineTypeMgrFact::CreateInstance(eNBOType::NUMBERING);
1841 if ( pNumbering )
1842 {
1843 sal_uInt16 nBulIndex = pNumbering->GetNBOIndexForNumRule(aSvxRule,nActNumLvl);
1844 rSet.Put(SfxUInt16Item(FN_NUM_NUM_RULE_INDEX,nBulIndex));
1845 }
1846 }
1847 }
1848 }
1849 break;
1850 case FN_NUM_CONTINUE:
1851 {
1852 {
1853 // --> OD 2009-08-26 #i86492#
1854 // Search also for bullet list
1855 String aDummy;
1856 const SwNumRule* pRule =
1857 rSh.SearchNumRule( false, true, false, -1, aDummy );
1858 if ( !pRule )
1859 {
1860 pRule = rSh.SearchNumRule( false, false, false, -1, aDummy );
1861 }
1862 // <--
1863 if ( !pRule )
1864 rSet.DisableItem(nWhich);
1865 }
1866 }
1867 break;
1868 case SID_INSERT_RLM :
1869 case SID_INSERT_LRM :
1870 case SID_INSERT_ZWNBSP :
1871 case SID_INSERT_ZWSP:
1872 {
1873 SvtCTLOptions aCTLOptions;
1874 sal_Bool bEnabled = aCTLOptions.IsCTLFontEnabled();
1875 GetView().GetViewFrame()->GetBindings().SetVisibleState( nWhich, bEnabled );
1876 if(!bEnabled)
1877 rSet.DisableItem(nWhich);
1878 }
1879 break;
1880 }
1881 nWhich = aIter.NextWhich();
1882 }
1883 }
1884 /* -----------------------------2002/07/05 10:31------------------------------
1885 Switch on/off header of footer of a page style - if an empty name is
1886 given all styles are changed
1887 ---------------------------------------------------------------------------*/
ChangeHeaderOrFooter(const String & rStyleName,sal_Bool bHeader,sal_Bool bOn,sal_Bool bShowWarning)1888 void SwTextShell::ChangeHeaderOrFooter(
1889 const String& rStyleName, sal_Bool bHeader, sal_Bool bOn, sal_Bool bShowWarning)
1890 {
1891 SwWrtShell& rSh = GetShell();
1892 rSh.StartAllAction();
1893 rSh.StartUndo( UNDO_HEADER_FOOTER ); // #i7983#
1894 sal_Bool bExecute = sal_True;
1895 sal_Bool bCrsrSet = sal_False;
1896 for( sal_uInt16 nFrom = 0, nTo = rSh.GetPageDescCnt();
1897 nFrom < nTo; ++nFrom )
1898 {
1899 int bChgd = sal_False;
1900 SwPageDesc aDesc( rSh.GetPageDesc( nFrom ));
1901 String sTmp(aDesc.GetName());
1902 if( !rStyleName.Len() || rStyleName == sTmp )
1903 {
1904 if( bShowWarning && !bOn && GetActiveView() && GetActiveView() == &GetView() &&
1905 ((bHeader && aDesc.GetMaster().GetHeader().IsActive()) ||
1906 (!bHeader && aDesc.GetMaster().GetFooter().IsActive())))
1907 {
1908 bShowWarning = sal_False;
1909 //Actions have to be closed while the dialog is showing
1910 rSh.EndAllAction();
1911
1912 Window* pParent = &GetView().GetViewFrame()->GetWindow();
1913 sal_Bool bRet = RET_YES == QueryBox( pParent, ResId( RID_SVXQBX_DELETE_HEADFOOT,
1914 DIALOG_MGR() ) ).Execute();
1915 bExecute = bRet;
1916 rSh.StartAllAction();
1917 }
1918 if( bExecute )
1919 {
1920 bChgd = sal_True;
1921 SwFrmFmt &rMaster = aDesc.GetMaster();
1922 if(bHeader)
1923 rMaster.SetFmtAttr( SwFmtHeader( bOn ));
1924 else
1925 rMaster.SetFmtAttr( SwFmtFooter( bOn ));
1926 if( bOn )
1927 {
1928 SvxULSpaceItem aUL(bHeader ? 0 : MM50, bHeader ? MM50 : 0, RES_UL_SPACE );
1929 SwFrmFmt* pFmt = bHeader ?
1930 (SwFrmFmt*)rMaster.GetHeader().GetHeaderFmt() :
1931 (SwFrmFmt*)rMaster.GetFooter().GetFooterFmt();
1932 pFmt->SetFmtAttr( aUL );
1933 }
1934 }
1935 if( bChgd )
1936 {
1937 rSh.ChgPageDesc( nFrom, aDesc );
1938
1939 if( !bCrsrSet && bOn )
1940 bCrsrSet = rSh.SetCrsrInHdFt(
1941 !rStyleName.Len() ? (sal_uInt16)0xFFFF : nFrom,
1942 bHeader );
1943 }
1944 }
1945 }
1946 rSh.EndUndo( UNDO_HEADER_FOOTER ); // #i7983#
1947 rSh.EndAllAction();
1948 }
1949
1950