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