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