xref: /trunk/main/sw/source/ui/shells/txtattr.cxx (revision 34760e49)
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 
28 #include <hintids.hxx>
29 
30 #ifndef _MSGBOX_HXX //autogen
31 #include <vcl/msgbox.hxx>
32 #endif
33 #include <svl/whiter.hxx>
34 #include <svl/stritem.hxx>
35 #include <svl/itemiter.hxx>
36 #include <svl/ctloptions.hxx>
37 #include <swmodule.hxx>
38 #include <sfx2/bindings.hxx>
39 #include <sfx2/request.hxx>
40 #include <editeng/fhgtitem.hxx>
41 #include <editeng/adjitem.hxx>
42 #include <editeng/lspcitem.hxx>
43 #include <editeng/lrspitem.hxx>
44 #include <editeng/udlnitem.hxx>
45 #include <editeng/escpitem.hxx>
46 #include <svx/htmlmode.hxx>
47 #include <editeng/scripttypeitem.hxx>
48 #include <editeng/frmdiritem.hxx>
49 #include "paratr.hxx"
50 
51 #include <fmtinfmt.hxx>
52 #ifndef _DOCSH_HXX
53 #include <docsh.hxx>
54 #endif
55 #include <wrtsh.hxx>
56 #ifndef _VIEW_HXX
57 #include <view.hxx>
58 #endif
59 #include <viewopt.hxx>
60 #include <uitool.hxx>
61 #ifndef _TEXTSH_HXX
62 #include <textsh.hxx>
63 #endif
64 #include <num.hxx>
65 #include <swundo.hxx>
66 #include <fmtcol.hxx>
67 
68 #ifndef _CMDID_H
69 #include <cmdid.h>
70 #endif
71 #include <globals.h>
72 #ifndef _SHELLS_HRC
73 #include <shells.hrc>
74 #endif
75 #include <SwStyleNameMapper.hxx>
76 #include "swabstdlg.hxx"
77 #include "chrdlg.hrc"
78 const SwTwips lFontInc = 2 * 20;		   // ==> PointToTwips(2)
79 const SwTwips lFontMaxSz = 72 * 20; 	   // ==> PointToTwips(72)
80 
81 
82 
83 
ExecCharAttr(SfxRequest & rReq)84 void SwTextShell::ExecCharAttr(SfxRequest &rReq)
85 {
86 	SwWrtShell &rSh = GetShell();
87 	const SfxItemSet  *pArgs   = rReq.GetArgs();
88 		  int          eState = STATE_TOGGLE;
89 	sal_uInt16 nWhich = rReq.GetSlot();
90 
91 	if(pArgs )
92 	{
93 		const SfxPoolItem* pItem;
94 		pArgs->GetItemState(nWhich, sal_False, &pItem);
95 		eState =  ((const SfxBoolItem &) pArgs->
96 								Get( nWhich )).GetValue() ? STATE_ON : STATE_OFF;
97 	}
98 
99 
100 	SfxItemSet aSet( GetPool(), RES_CHRATR_BEGIN, RES_CHRATR_END-1 );
101 	if (STATE_TOGGLE == eState)
102         rSh.GetCurAttr( aSet );
103 
104 	switch ( nWhich )
105 	{
106 		case FN_SET_SUB_SCRIPT:
107 		case FN_SET_SUPER_SCRIPT:
108 		{
109             SvxEscapement eEscape = SVX_ESCAPEMENT_SUBSCRIPT;
110 			switch (eState)
111 			{
112 			case STATE_TOGGLE:
113 			{
114 				short nTmpEsc = ((const SvxEscapementItem&)
115 							aSet.Get( RES_CHRATR_ESCAPEMENT )).GetEsc();
116 				eEscape = nWhich == FN_SET_SUPER_SCRIPT ?
117 								SVX_ESCAPEMENT_SUPERSCRIPT:
118 								SVX_ESCAPEMENT_SUBSCRIPT;
119 				if( (nWhich == FN_SET_SUB_SCRIPT && nTmpEsc < 0) ||
120 							(nWhich == FN_SET_SUPER_SCRIPT && nTmpEsc > 0) )
121 					eEscape = SVX_ESCAPEMENT_OFF;
122 
123 				SfxBindings& rBind = GetView().GetViewFrame()->GetBindings();
124 				if( nWhich == FN_SET_SUB_SCRIPT )
125 					rBind.SetState( SfxBoolItem( FN_SET_SUPER_SCRIPT,
126 																	sal_False ) );
127 				else
128 					rBind.SetState( SfxBoolItem( FN_SET_SUB_SCRIPT,
129 																	sal_False ) );
130 
131 			}
132 			break;
133 			case STATE_ON:
134 				eEscape = nWhich == FN_SET_SUPER_SCRIPT ?
135 								SVX_ESCAPEMENT_SUPERSCRIPT:
136 								SVX_ESCAPEMENT_SUBSCRIPT;
137 				break;
138 			case STATE_OFF:
139 				eEscape = SVX_ESCAPEMENT_OFF;
140 				break;
141 			}
142             SvxEscapementItem aEscape( eEscape, RES_CHRATR_ESCAPEMENT );
143 			if(eEscape == SVX_ESCAPEMENT_SUPERSCRIPT)
144 				aEscape.GetEsc() = DFLT_ESC_AUTO_SUPER;
145 			else if(eEscape == SVX_ESCAPEMENT_SUBSCRIPT)
146 				aEscape.GetEsc() = DFLT_ESC_AUTO_SUB;
147 			if(eState != STATE_OFF )
148 			{
149 				if(eEscape == FN_SET_SUPER_SCRIPT)
150 					aEscape.GetEsc() *= -1;
151 			}
152 			rSh.SetAttrItem( aEscape );
153             rReq.AppendItem( aEscape );
154             rReq.Done();
155 		}
156 		break;
157 
158 		case FN_UPDATE_STYLE_BY_EXAMPLE:
159 			rSh.QuickUpdateStyle();
160             rReq.Done();
161 			break;
162 		case FN_UNDERLINE_DOUBLE:
163 		{
164 			FontUnderline eUnderline =  ((const SvxUnderlineItem&)
165 							aSet.Get(RES_CHRATR_UNDERLINE)).GetLineStyle();
166 			switch( eState )
167 			{
168 				case STATE_TOGGLE:
169 					eUnderline = eUnderline == UNDERLINE_DOUBLE ?
170 						UNDERLINE_NONE :
171 							UNDERLINE_DOUBLE;
172 				break;
173 				case STATE_ON:
174 					eUnderline = UNDERLINE_DOUBLE;
175 				break;
176 				case STATE_OFF:
177 					eUnderline = UNDERLINE_NONE;
178 				break;
179 			}
180             SvxUnderlineItem aUnderline(eUnderline, RES_CHRATR_UNDERLINE );
181             rSh.SetAttrItem( aUnderline );
182             rReq.AppendItem( aUnderline );
183             rReq.Done();
184 		}
185 		break;
186         case FN_REMOVE_DIRECT_CHAR_FORMATS:
187             if( !rSh.HasReadonlySel() && rSh.IsEndPara())
188                 rSh.DontExpandFmt();
189         break;
190 		default:
191 			ASSERT(sal_False, falscher Dispatcher);
192 			return;
193 	}
194 }
195 
196 
ExecCharAttrArgs(SfxRequest & rReq)197 void SwTextShell::ExecCharAttrArgs(SfxRequest &rReq)
198 {
199     sal_uInt16 nSlot = rReq.GetSlot();
200     const SfxItemSet* pArgs = rReq.GetArgs();
201     sal_Bool bArgs = pArgs != 0 && pArgs->Count() > 0;
202     int bGrow = sal_False;
203     SwWrtShell& rWrtSh = GetShell();
204     SwTxtFmtColl* pColl = 0;
205 
206     // nur gesetzt, wenn gesamter Absatz selektiert ist und AutoUpdateFmt gesetzt ist
207     if ( rWrtSh.HasSelection() && rWrtSh.IsSelFullPara() )
208     {
209         pColl = rWrtSh.GetCurTxtFmtColl();
210         if ( pColl && !pColl->IsAutoUpdateFmt() )
211             pColl = 0;
212     }
213     SfxItemPool& rPool = GetPool();
214     sal_uInt16 nWhich = rPool.GetWhich( nSlot );
215     switch (nSlot)
216     {
217     case FN_TXTATR_INET:
218         // Sonderbehandlung der PoolId des SwFmtInetFmt
219         if ( bArgs )
220         {
221             const SfxPoolItem& rItem = pArgs->Get( nWhich );
222 
223             SwFmtINetFmt aINetFmt( (const SwFmtINetFmt&) rItem );
224             if ( USHRT_MAX == aINetFmt.GetVisitedFmtId() )
225             {
226                 ASSERT( false, "<SwTextShell::ExecCharAttrArgs(..)> - unexpected visited character format ID at hyperlink attribute" );
227                 aINetFmt.SetVisitedFmtAndId(
228                         aINetFmt.GetVisitedFmt(),
229                         SwStyleNameMapper::GetPoolIdFromUIName( aINetFmt.GetVisitedFmt(), nsSwGetPoolIdFromName::GET_POOLID_CHRFMT ) );
230             }
231             if ( USHRT_MAX == aINetFmt.GetINetFmtId() )
232             {
233                 ASSERT( false, "<SwTextShell::ExecCharAttrArgs(..)> - unexpected unvisited character format ID at hyperlink attribute" );
234                 aINetFmt.SetINetFmtAndId(
235                         aINetFmt.GetINetFmt(),
236                         SwStyleNameMapper::GetPoolIdFromUIName( aINetFmt.GetINetFmt(), nsSwGetPoolIdFromName::GET_POOLID_CHRFMT ) );
237             }
238 
239             if ( pColl )
240                 pColl->SetFmtAttr( aINetFmt );
241             else
242                 rWrtSh.SetAttrItem( aINetFmt );
243             rReq.Done();
244         }
245         break;
246 
247 		case FN_GROW_FONT_SIZE:
248 			bGrow = sal_True;
249 			// kein break !!
250 		case FN_SHRINK_FONT_SIZE:
251 		{
252 			SvxScriptSetItem aSetItem( SID_ATTR_CHAR_FONTHEIGHT, rPool );
253             rWrtSh.GetCurAttr( aSetItem.GetItemSet() );
254 			SfxItemSet aAttrSet( rPool, aSetItem.GetItemSet().GetRanges() );
255 
256 			const SfxPoolItem* pI;
257 			static const sal_uInt16 aScrTypes[] = {
258 				SCRIPTTYPE_LATIN, SCRIPTTYPE_ASIAN, SCRIPTTYPE_COMPLEX, 0 };
259 			sal_uInt16 nScriptType = rWrtSh.GetScriptType();
260 			for( const sal_uInt16* pScrpTyp = aScrTypes; *pScrpTyp; ++pScrpTyp )
261 				if( ( nScriptType & *pScrpTyp ) &&
262 					0 != ( pI = aSetItem.GetItemOfScript( *pScrpTyp )))
263 				{
264 					SvxFontHeightItem aSize( *(const SvxFontHeightItem*)pI );
265 					SwTwips lSize = (SwTwips) aSize.GetHeight();
266 
267 					if (bGrow)
268 					{
269 						if( lSize == lFontMaxSz )
270 							break;		// das wars, hoeher gehts nicht
271 						if( ( lSize += lFontInc ) > lFontMaxSz )
272 							lSize = lFontMaxSz;
273 					}
274 					else
275 					{
276 						if( 4 == lSize )
277 							break;
278 						if( ( lSize -= lFontInc ) < 4 )
279 							lSize = 4;
280 					}
281 					aSize.SetHeight( lSize );
282 					aAttrSet.Put( aSize );
283 				}
284 				if( aAttrSet.Count() )
285 				{
286 					if( pColl )
287                         pColl->SetFmtAttr( aAttrSet );
288 					else
289 						rWrtSh.SetAttrSet( aAttrSet );
290 				}
291             rReq.Done();
292 		}
293 		break;
294 
295 		default:
296 			ASSERT(sal_False, falscher Dispatcher);
297 			return;
298 	}
299 }
300 
301 
302 
303 #ifdef CFRONT
304 
lcl_SetAdjust(SvxAdjust eAdjst,SfxItemSet & rSet)305 void lcl_SetAdjust(SvxAdjust eAdjst, SfxItemSet& rSet)
306 {
307 	rSet.Put(SvxAdjustItem(eAdjst,RES_PARATR_ADJUST ));
308 }
309 
310 
311 
lcl_SetLineSpace(sal_uInt8 ePropL,SfxItemSet & rSet)312 void lcl_SetLineSpace(sal_uInt8 ePropL,SfxItemSet& rSet)
313 {
314 	SvxLineSpacingItem aLineSpacing(ePropL, RES_PARATR_LINESPACING );
315 	aLineSpacing.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
316 	if( 100 == ePropL )
317 		aLineSpacing.GetInterLineSpaceRule() = SVX_INTER_LINE_SPACE_OFF;
318 	else
319 		aLineSpacing.SetPropLineSpace(ePropL);
320 	rSet.Put( aLineSpacing );
321 }
322 
323 
324 
ExecParaAttr(SfxRequest & rReq)325 void SwTextShell::ExecParaAttr(SfxRequest &rReq)
326 {
327 	// gleiche beide Attribute holen, ist nicht teuerer !!
328 	SfxItemSet aSet( GetPool(), RES_PARATR_LINESPACING, RES_PARATR_ADJUST );
329 
330 	switch (rReq.GetSlot())
331 	{
332 	case FN_SET_LEFT_PARA:			lcl_SetAdjust(ADJLEFT,aSet); 	break;
333 	case FN_SET_RIGHT_PARA:			lcl_SetAdjust(ADJRIGHT,aSet); 	break;
334 	case FN_SET_CENTER_PARA:        lcl_SetAdjust(ADJCENTER,aSet); 	break;
335 	case SID_ATTR_PARA_ADJUST_BLOCK:lcl_SetAdjust(ADJBLOCK,aSet); 	break;
336 
337 	case FN_SET_LINE_SPACE_1:	lcl_SetLineSpace(100,aSet); 	break;
338 	case FN_SET_LINE_SPACE_15:  lcl_SetLineSpace(150,aSet); 	break;
339 	case FN_SET_LINE_SPACE_2:	lcl_SetLineSpace(200,aSet); 	break;
340 
341 	default:
342 		DBG_ERROR("SwTextShell::ExecParaAttr falscher Dispatcher");
343 		return;
344 	}
345 	SwWrtShell& rWrtSh = GetShell();
346 	SwTxtFmtColl* pColl = rWrtSh.GetCurTxtFmtColl();
347 	if(pColl && pColl->IsAutoUpdateFmt())
348 	{
349 		rWrtSh.AutoUpdatePara(pColl, *pSet);
350 	}
351 	else
352     {
353 		rWrtSh.SetAttrSet( aSet );
354         rReq.Done( aSet );
355     }
356 }
357 
358 #else
359 
360 
361 
ExecParaAttr(SfxRequest & rReq)362 void SwTextShell::ExecParaAttr(SfxRequest &rReq)
363 {
364 	SvxAdjust eAdjst;
365 	sal_uInt8 ePropL;
366 	const SfxItemSet* pArgs = rReq.GetArgs();
367 
368 	// gleich beide Attribute holen, ist nicht teuerer !!
369     SfxItemSet aSet( GetPool(),
370         RES_PARATR_LINESPACING, RES_PARATR_ADJUST,
371         RES_FRAMEDIR, RES_FRAMEDIR,
372         0 );
373 
374 	sal_uInt16 nSlot = rReq.GetSlot();
375 	switch (nSlot)
376 	{
377 		case SID_ATTR_PARA_ADJUST:
378 		{
379 			if( pArgs && SFX_ITEM_SET == pArgs->GetItemState(RES_PARATR_ADJUST) )
380 			{
381 				const SvxAdjustItem& rAdj = (const SvxAdjustItem&) pArgs->Get(RES_PARATR_ADJUST);
382 				SvxAdjustItem aAdj( rAdj.GetAdjust(), RES_PARATR_ADJUST );
383 				if ( rAdj.GetAdjust() == SVX_ADJUST_BLOCK )
384 				{
385 					aAdj.SetLastBlock( rAdj.GetLastBlock() );
386 					aAdj.SetOneWord( rAdj.GetOneWord() );
387 				}
388 
389 				aSet.Put(aAdj);
390 			}
391 		}
392 		break;
393 		case SID_ATTR_PARA_ADJUST_LEFT:		eAdjst =  SVX_ADJUST_LEFT;		goto SET_ADJUST;
394 		case SID_ATTR_PARA_ADJUST_RIGHT:	eAdjst =  SVX_ADJUST_RIGHT;		goto SET_ADJUST;
395 		case SID_ATTR_PARA_ADJUST_CENTER:   eAdjst =  SVX_ADJUST_CENTER;	goto SET_ADJUST;
396 		case SID_ATTR_PARA_ADJUST_BLOCK:	eAdjst =  SVX_ADJUST_BLOCK;		goto SET_ADJUST;
397 SET_ADJUST:
398 		{
399 			aSet.Put(SvxAdjustItem(eAdjst,RES_PARATR_ADJUST));
400             rReq.AppendItem( SfxBoolItem( GetPool().GetWhich(nSlot), sal_True ) );
401 		}
402 		break;
403 
404 		case SID_ATTR_PARA_LINESPACE:
405 			if(pArgs && SFX_ITEM_SET == pArgs->GetItemState( GetPool().GetWhich(nSlot) ))
406 			{
407 				SvxLineSpacingItem aLineSpace = (const SvxLineSpacingItem&)pArgs->Get(
408 															GetPool().GetWhich(nSlot));
409 				aSet.Put( aLineSpace );
410 			}
411 		break;
412 		case SID_ATTR_PARA_LINESPACE_10:	ePropL = 100;	goto SET_LINESPACE;
413 		case SID_ATTR_PARA_LINESPACE_15:	ePropL = 150;	goto SET_LINESPACE;
414 		case SID_ATTR_PARA_LINESPACE_20:	ePropL = 200;	goto SET_LINESPACE;
415 
416 SET_LINESPACE:
417 		{
418 
419 			SvxLineSpacingItem aLineSpacing(ePropL, RES_PARATR_LINESPACING );
420 			aLineSpacing.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
421 			if( 100 == ePropL )
422 				aLineSpacing.GetInterLineSpaceRule() = SVX_INTER_LINE_SPACE_OFF;
423 			else
424 				aLineSpacing.SetPropLineSpace(ePropL);
425 			aSet.Put( aLineSpacing );
426 		}
427 		break;
428 
429         case SID_ATTR_PARA_LEFT_TO_RIGHT :
430         case SID_ATTR_PARA_RIGHT_TO_LEFT :
431         {
432             sal_Bool bSet = sal_True;
433             int eState = pArgs ? pArgs->GetItemState(nSlot) : SFX_ITEM_DISABLED;
434             if (pArgs && SFX_ITEM_SET == eState)
435                 bSet = ((const SfxBoolItem&)pArgs->Get(nSlot)).GetValue();
436 /*
437 // toggling of the slots not used anymore
438 
439            if(!bSet)
440 				nSlot = SID_ATTR_PARA_LEFT_TO_RIGHT == nSlot ?
441 					SID_ATTR_PARA_RIGHT_TO_LEFT :
442 					SID_ATTR_PARA_LEFT_TO_RIGHT;
443 */
444             SfxItemSet aAdjustSet( GetPool(),
445                     RES_PARATR_ADJUST, RES_PARATR_ADJUST );
446             GetShell().GetCurAttr(aAdjustSet);
447             sal_Bool bChgAdjust = sal_False;
448             SfxItemState eAdjustState = aAdjustSet.GetItemState(RES_PARATR_ADJUST, sal_False);
449             if(eAdjustState  >= SFX_ITEM_DEFAULT)
450             {
451                 int eAdjust = (int)(( const SvxAdjustItem& )
452 						aAdjustSet.Get(RES_PARATR_ADJUST)).GetAdjust();
453 //                bChgAdjust = SVX_ADJUST_CENTER  != eAdjust  &&  SVX_ADJUST_BLOCK != eAdjust;
454                 bChgAdjust = (SVX_ADJUST_LEFT  == eAdjust  &&  SID_ATTR_PARA_RIGHT_TO_LEFT == nSlot) ||
455                              (SVX_ADJUST_RIGHT == eAdjust  &&  SID_ATTR_PARA_LEFT_TO_RIGHT == nSlot);
456             }
457             else
458                 bChgAdjust = sal_True;
459 
460             SvxFrameDirection eFrmDirection =
461                     (SID_ATTR_PARA_LEFT_TO_RIGHT == nSlot) ?
462                         FRMDIR_HORI_LEFT_TOP : FRMDIR_HORI_RIGHT_TOP;
463             aSet.Put( SvxFrameDirectionItem( eFrmDirection, RES_FRAMEDIR ) );
464 
465             if (bChgAdjust)
466             {
467                 SvxAdjust eAdjust = (SID_ATTR_PARA_LEFT_TO_RIGHT == nSlot) ?
468                         SVX_ADJUST_LEFT : SVX_ADJUST_RIGHT;
469                 SvxAdjustItem aAdjust( eAdjust, RES_PARATR_ADJUST );
470                 aSet.Put( aAdjust );
471                 aAdjust.SetWhich(SID_ATTR_PARA_ADJUST);
472                 GetView().GetViewFrame()->GetBindings().SetState( aAdjust );
473                 // Toggle numbering alignment
474                 const SwNumRule* pCurRule = GetShell().GetNumRuleAtCurrCrsrPos();
475                 if( pCurRule )
476                 {
477                     SvxNumRule aRule = pCurRule->MakeSvxNumRule();
478 
479                     for(sal_uInt16 i = 0; i < aRule.GetLevelCount(); i++)
480                     {
481                         SvxNumberFormat aFmt(aRule.GetLevel(i));
482                         if(SVX_ADJUST_LEFT == aFmt.GetNumAdjust())
483                             aFmt.SetNumAdjust( SVX_ADJUST_RIGHT );
484 
485                         else if(SVX_ADJUST_RIGHT == aFmt.GetNumAdjust())
486                             aFmt.SetNumAdjust( SVX_ADJUST_LEFT );
487 
488                         aRule.SetLevel(i, aFmt, aRule.Get(i) != 0);
489                     }
490                     // --> OD 2008-02-11 #newlistlevelattrs#
491                     SwNumRule aSetRule( pCurRule->GetName(),
492                                         pCurRule->Get( 0 ).GetPositionAndSpaceMode() );
493                     // <--
494                     aSetRule.SetSvxRule( aRule, GetShell().GetDoc());
495                     aSetRule.SetAutoRule( sal_True );
496                     // --> OD 2008-03-17 #refactorlists#
497                     // no start or continuation of a list - list style is only changed
498                     GetShell().SetCurNumRule( aSetRule, false );
499                     // <--
500                 }
501             }
502         }
503         break;
504 
505 		default:
506 			ASSERT(sal_False, falscher Dispatcher);
507 			return;
508 	}
509 	SwWrtShell& rWrtSh = GetShell();
510 	SwTxtFmtColl* pColl = rWrtSh.GetCurTxtFmtColl();
511 	if(pColl && pColl->IsAutoUpdateFmt())
512 	{
513 		rWrtSh.AutoUpdatePara(pColl, aSet);
514 	}
515 	else
516 		rWrtSh.SetAttrSet( aSet );
517     rReq.Done();
518 }
519 
520 #endif
521 
522 
523 
ExecParaAttrArgs(SfxRequest & rReq)524 void SwTextShell::ExecParaAttrArgs(SfxRequest &rReq)
525 {
526 	SwWrtShell &rSh = GetShell();
527 	const SfxItemSet *pArgs = rReq.GetArgs();
528 	const SfxPoolItem *pItem = 0;
529 
530 	sal_uInt16 nSlot = rReq.GetSlot();
531 	if(pArgs)
532 		pArgs->GetItemState(GetPool().GetWhich(nSlot), sal_False, &pItem);
533 	switch ( nSlot )
534 	{
535         case FN_DROP_CHAR_STYLE_NAME:
536             if( pItem )
537             {
538                 String sCharStyleName = ((const SfxStringItem*)pItem)->GetValue();
539                 SfxItemSet aSet(GetPool(), RES_PARATR_DROP, RES_PARATR_DROP, 0L);
540                 rSh.GetCurAttr(aSet);
541                 SwFmtDrop aDropItem((const SwFmtDrop&)aSet.Get(RES_PARATR_DROP));
542                 SwCharFmt* pFmt = 0;
543                 if(sCharStyleName.Len())
544                     pFmt = rSh.FindCharFmtByName( sCharStyleName );
545                 aDropItem.SetCharFmt( pFmt );
546                 aSet.Put(aDropItem);
547                 rSh.SetAttrSet(aSet);
548             }
549         break;
550         case FN_FORMAT_DROPCAPS:
551         {
552 			if(pItem)
553             {
554 				rSh.SetAttrItem(*pItem);
555                 rReq.Done();
556             }
557 			else
558 			{
559 				SfxItemSet aSet(GetPool(), RES_PARATR_DROP, RES_PARATR_DROP,
560 										   HINT_END, HINT_END, 0);
561                 rSh.GetCurAttr(aSet);
562                 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
563                 DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");
564 
565                 SfxAbstractDialog* pDlg = pFact->CreateSfxDialog( GetView().GetWindow(), aSet,
566 					rSh.GetView().GetViewFrame()->GetFrame().GetFrameInterface(), DLG_SWDROPCAPS );
567                 DBG_ASSERT(pDlg, "Dialogdiet fail!");
568 				if (pDlg->Execute() == RET_OK)
569 				{
570 					rSh.StartAction();
571 					rSh.StartUndo( UNDO_START );
572 					if ( SFX_ITEM_SET == aSet.GetItemState(HINT_END,sal_False,&pItem) )
573 					{
574 						if ( ((SfxStringItem*)pItem)->GetValue().Len() )
575 							rSh.ReplaceDropTxt(((SfxStringItem*)pItem)->GetValue());
576 					}
577 					rSh.SetAttrSet(*pDlg->GetOutputItemSet());
578 					rSh.StartUndo( UNDO_END );
579 					rSh.EndAction();
580                     rReq.Done(*pDlg->GetOutputItemSet());
581 				}
582 				delete pDlg;
583 			}
584 		}
585  		break;
586 		case SID_ATTR_PARA_PAGEBREAK:
587 			if(pItem)
588 			{
589 				rSh.SetAttrItem( *pItem );
590                 rReq.Done();
591 			}
592 		break;
593 		case SID_ATTR_PARA_MODEL:
594 		{
595 			if(pItem)
596 			{
597 				SfxItemSet aCoreSet( GetPool(),
598 					RES_PAGEDESC,	RES_PAGEDESC,
599 					SID_ATTR_PARA_MODEL, SID_ATTR_PARA_MODEL, 0);
600 				aCoreSet.Put(*pItem);
601 				SfxToSwPageDescAttr( rSh, aCoreSet);
602 				rSh.SetAttrSet(aCoreSet);
603                 rReq.Done();
604 			}
605 		}
606 		break;
607 
608         default:
609 			ASSERT(sal_False, falscher Dispatcher);
610 			return;
611 	}
612 }
613 
614 
615 
GetAttrState(SfxItemSet & rSet)616 void SwTextShell::GetAttrState(SfxItemSet &rSet)
617 {
618 	SwWrtShell &rSh = GetShell();
619 	SfxItemPool& rPool = GetPool();
620 	SfxItemSet aCoreSet(rPool, aTxtFmtCollSetRange);
621     rSh.GetCurAttr(aCoreSet); // *alle* Textattribute von der Core erfragen
622 
623 	SfxWhichIter aIter(rSet);
624 	sal_uInt16 nSlot = aIter.FirstWhich();
625     sal_Bool bFlag = sal_False;
626 	SfxBoolItem aFlagItem;
627 	const SfxPoolItem* pItem = 0;
628 	int eAdjust = -1;	// Illegaler Wert, um DONTCARE zu erkennen
629 	SfxItemState eState = aCoreSet.GetItemState(RES_PARATR_ADJUST, sal_False, &pItem);
630 
631 	if( SFX_ITEM_DEFAULT == eState )
632 		pItem = &rPool.GetDefaultItem(RES_PARATR_ADJUST);
633 	if( SFX_ITEM_DEFAULT <= eState )
634 		eAdjust = (int)(( SvxAdjustItem* ) pItem)->GetAdjust();
635 
636 	short nEsc = 0;
637 	eState =  aCoreSet.GetItemState(RES_CHRATR_ESCAPEMENT, sal_False, &pItem);
638 	if( SFX_ITEM_DEFAULT == eState )
639 		pItem = &rPool.GetDefaultItem(RES_CHRATR_ESCAPEMENT);
640 	if( eState >= SFX_ITEM_DEFAULT )
641 		nEsc = ((SvxEscapementItem* )pItem)->GetEsc();
642 
643 	sal_uInt16 nLineSpace = 0;
644 	eState =  aCoreSet.GetItemState(RES_PARATR_LINESPACING, sal_False, &pItem);
645 	if( SFX_ITEM_DEFAULT == eState )
646 		pItem = &rPool.GetDefaultItem(RES_PARATR_LINESPACING);
647 	if( SFX_ITEM_DEFAULT <= eState &&
648 			((SvxLineSpacingItem* )pItem)->GetLineSpaceRule() == SVX_LINE_SPACE_AUTO )
649 	{
650 		if(SVX_INTER_LINE_SPACE_OFF ==
651 					((SvxLineSpacingItem* )pItem)->GetInterLineSpaceRule())
652 			nLineSpace = 100;
653 		else
654 			nLineSpace = ((SvxLineSpacingItem* )pItem)->GetPropLineSpace();
655 	}
656 
657 	while (nSlot)
658 	{
659 		switch(nSlot)
660 		{
661 			case FN_SET_SUPER_SCRIPT:
662 					bFlag = 0 < nEsc;
663 				break;
664 			case FN_SET_SUB_SCRIPT:
665 					bFlag = 0 > nEsc;
666 				break;
667 			case SID_ATTR_PARA_ADJUST_LEFT:
668 				if (eAdjust == -1)
669 				{
670 					rSet.InvalidateItem( nSlot );
671 					nSlot = 0;
672 				}
673 				else
674 					bFlag = SVX_ADJUST_LEFT == eAdjust;
675 				break;
676 			case SID_ATTR_PARA_ADJUST_RIGHT:
677 				if (eAdjust == -1)
678 				{
679 					rSet.InvalidateItem( nSlot );
680 					nSlot = 0;
681 				}
682 				else
683 					bFlag = SVX_ADJUST_RIGHT == eAdjust;
684 				break;
685 			case SID_ATTR_PARA_ADJUST_CENTER:
686 				if (eAdjust == -1)
687 				{
688 					rSet.InvalidateItem( nSlot );
689 					nSlot = 0;
690 				}
691 				else
692 					bFlag = SVX_ADJUST_CENTER == eAdjust;
693 				break;
694 			case SID_ATTR_PARA_ADJUST_BLOCK:
695 			{
696 				if (eAdjust == -1)
697 				{
698 					rSet.InvalidateItem( nSlot );
699 					nSlot = 0;
700 				}
701 				else
702 				{
703 					bFlag = SVX_ADJUST_BLOCK == eAdjust;
704 					sal_uInt16 nHtmlMode = GetHtmlMode(rSh.GetView().GetDocShell());
705 					if((nHtmlMode & HTMLMODE_ON) && !(nHtmlMode & (HTMLMODE_FULL_STYLES|HTMLMODE_FIRSTLINE) ))
706 					{
707 						rSet.DisableItem( nSlot );
708 						nSlot = 0;
709 					}
710 				}
711 			}
712 			break;
713 			case SID_ATTR_PARA_LINESPACE_10:
714 				bFlag = nLineSpace == 100;
715 			break;
716 			case SID_ATTR_PARA_LINESPACE_15:
717 				bFlag = nLineSpace == 150;
718 			break;
719 			case SID_ATTR_PARA_LINESPACE_20:
720 				bFlag = nLineSpace == 200;
721 			break;
722 			case FN_GROW_FONT_SIZE:
723 			case FN_SHRINK_FONT_SIZE:
724 			{
725 				SvxScriptSetItem aSetItem( SID_ATTR_CHAR_FONTHEIGHT,
726 											*rSet.GetPool() );
727 				aSetItem.GetItemSet().Put( aCoreSet, sal_False );
728 				if( !aSetItem.GetItemOfScript( rSh.GetScriptType() ))
729 					rSet.DisableItem( nSlot );
730 				nSlot = 0;
731 			}
732 			break;
733 			case FN_UNDERLINE_DOUBLE:
734 			{
735 				eState = aCoreSet.GetItemState(RES_CHRATR_UNDERLINE);
736 				if( eState >= SFX_ITEM_DEFAULT )
737 				{
738 					FontUnderline eUnderline =  ((const SvxUnderlineItem&)
739 							aCoreSet.Get(RES_CHRATR_UNDERLINE)).GetLineStyle();
740 					rSet.Put(SfxBoolItem(nSlot, eUnderline == UNDERLINE_DOUBLE));
741 				}
742 				else
743 					rSet.InvalidateItem(nSlot);
744 				nSlot = 0;
745 			}
746 			break;
747 			case SID_ATTR_PARA_ADJUST:
748 				if (eAdjust == -1)
749 					rSet.InvalidateItem( nSlot );
750 				else
751 					rSet.Put(SvxAdjustItem((SvxAdjust)eAdjust, SID_ATTR_PARA_ADJUST ));
752 				nSlot = 0;
753 			break;
754 			case SID_ATTR_PARA_LRSPACE:
755 			{
756 				eState = aCoreSet.GetItemState(RES_LR_SPACE);
757 				if( eState >= SFX_ITEM_DEFAULT )
758 				{
759 					SvxLRSpaceItem aLR = ( (const SvxLRSpaceItem&) aCoreSet.Get( RES_LR_SPACE ) );
760 					aLR.SetWhich(SID_ATTR_PARA_LRSPACE);
761 					rSet.Put(aLR);
762 				}
763 				else
764 					rSet.InvalidateItem(nSlot);
765 				nSlot = 0;
766 			}
767 
768             case SID_ATTR_PARA_LEFT_TO_RIGHT :
769             case SID_ATTR_PARA_RIGHT_TO_LEFT :
770             {
771                 if ( !SW_MOD()->GetCTLOptions().IsCTLFontEnabled() )
772 				{
773 					rSet.DisableItem( nSlot );
774 					nSlot = 0;
775 				}
776 				else
777 				{
778                     // is the item set?
779                     sal_uInt16 nHtmlMode = GetHtmlMode(rSh.GetView().GetDocShell());
780                     if((!(nHtmlMode & HTMLMODE_ON) || (0 != (nHtmlMode & HTMLMODE_SOME_STYLES))) &&
781                     aCoreSet.GetItemState( RES_FRAMEDIR, sal_False ) >= SFX_ITEM_DEFAULT)
782 					{
783 						SvxFrameDirection eFrmDir = (SvxFrameDirection)
784 								((const SvxFrameDirectionItem& )aCoreSet.Get(RES_FRAMEDIR)).GetValue();
785 						if (FRMDIR_ENVIRONMENT == eFrmDir)
786 						{
787 							eFrmDir = rSh.IsInRightToLeftText() ?
788 									FRMDIR_HORI_RIGHT_TOP : FRMDIR_HORI_LEFT_TOP;
789 						}
790 						bFlag = (SID_ATTR_PARA_LEFT_TO_RIGHT == nSlot &&
791 											FRMDIR_HORI_LEFT_TOP == eFrmDir) ||
792 								(SID_ATTR_PARA_RIGHT_TO_LEFT == nSlot &&
793 											FRMDIR_HORI_RIGHT_TOP == eFrmDir);
794 					}
795 					else
796 					{
797 						rSet.InvalidateItem(nSlot);
798 						nSlot = 0;
799 					}
800 				}
801             }
802             break;
803 
804 			case SID_ATTR_CHAR_LANGUAGE:
805 			case SID_ATTR_CHAR_KERNING:
806 			case RES_PARATR_DROP:
807 			{
808 #if OSL_DEBUG_LEVEL > 1
809 				const SfxPoolItem& rItem = aCoreSet.Get(GetPool().GetWhich(nSlot), sal_True);
810 				rSet.Put(rItem);
811 #else
812 				rSet.Put(aCoreSet.Get( GetPool().GetWhich(nSlot), sal_True));
813 #endif
814 				nSlot = 0;
815 			}
816 			break;
817 			case SID_ATTR_PARA_MODEL:
818 			{
819 				SfxItemSet aTemp(GetPool(),
820 						RES_PAGEDESC,RES_PAGEDESC,
821 						SID_ATTR_PARA_MODEL,SID_ATTR_PARA_MODEL,
822 						0L);
823 				aTemp.Put(aCoreSet);
824 				::SwToSfxPageDescAttr(aTemp);
825 				rSet.Put(aTemp.Get(SID_ATTR_PARA_MODEL));
826 				nSlot = 0;
827 			}
828 			break;
829 			case RES_TXTATR_INETFMT:
830 			{
831 				SfxItemSet aSet(GetPool(), RES_TXTATR_INETFMT, RES_TXTATR_INETFMT);
832                 rSh.GetCurAttr(aSet);
833 #if OSL_DEBUG_LEVEL > 1
834 				const SfxPoolItem& rItem = aSet.Get(RES_TXTATR_INETFMT, sal_True);
835 				rSet.Put(rItem);
836 #else
837 				rSet.Put(aSet.Get( RES_TXTATR_INETFMT, sal_True));
838 #endif
839 				nSlot = 0;
840 			}
841 			break;
842 
843 			default:
844 			// Nichts tun
845 			nSlot = 0;
846 			break;
847 
848 		}
849 		if( nSlot )
850 		{
851 			aFlagItem.SetWhich( nSlot );
852 			aFlagItem.SetValue( bFlag );
853 			rSet.Put( aFlagItem );
854 		}
855 		nSlot = aIter.NextWhich();
856 	}
857 
858 	rSet.Put(aCoreSet,sal_False);
859 }
860 
861 
862 
863