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