1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_forms.hxx"
30*cdf0e10cSrcweir #include "rtattributehandler.hxx"
31*cdf0e10cSrcweir 
32*cdf0e10cSrcweir #ifndef _SVX_SVXIDS_HRC
33*cdf0e10cSrcweir #include <svx/svxids.hrc>
34*cdf0e10cSrcweir #endif
35*cdf0e10cSrcweir #include <editeng/eeitem.hxx>
36*cdf0e10cSrcweir #include <svl/itemset.hxx>
37*cdf0e10cSrcweir #include <svl/itempool.hxx>
38*cdf0e10cSrcweir #include <tools/mapunit.hxx>
39*cdf0e10cSrcweir #include <vcl/mapmod.hxx>
40*cdf0e10cSrcweir #include <vcl/outdev.hxx>
41*cdf0e10cSrcweir 
42*cdf0e10cSrcweir #define ITEMID_ADJUST       EE_PARA_JUST
43*cdf0e10cSrcweir #include <editeng/adjitem.hxx>
44*cdf0e10cSrcweir #define ITEMID_WEIGHT       EE_CHAR_WEIGHT
45*cdf0e10cSrcweir #include <editeng/wghtitem.hxx>
46*cdf0e10cSrcweir #define ITEMID_ESCAPEMENT   EE_CHAR_ESCAPEMENT
47*cdf0e10cSrcweir #include <editeng/escpitem.hxx>
48*cdf0e10cSrcweir #define ITEMID_LINESPACING  EE_PARA_SBL
49*cdf0e10cSrcweir #include <editeng/lspcitem.hxx>
50*cdf0e10cSrcweir #define ITEMID_FONTHEIGHT   EE_CHAR_FONTHEIGHT
51*cdf0e10cSrcweir #include <editeng/fhgtitem.hxx>
52*cdf0e10cSrcweir #define ITEMID_FRAMEDIR     EE_PARA_WRITINGDIR
53*cdf0e10cSrcweir #include <editeng/frmdiritem.hxx>
54*cdf0e10cSrcweir #include <editeng/scripttypeitem.hxx>
55*cdf0e10cSrcweir 
56*cdf0e10cSrcweir //........................................................................
57*cdf0e10cSrcweir namespace frm
58*cdf0e10cSrcweir {
59*cdf0e10cSrcweir //........................................................................
60*cdf0e10cSrcweir     //====================================================================
61*cdf0e10cSrcweir 	//= ReferenceBase
62*cdf0e10cSrcweir 	//====================================================================
63*cdf0e10cSrcweir 	//--------------------------------------------------------------------
64*cdf0e10cSrcweir     oslInterlockedCount SAL_CALL ReferenceBase::acquire()
65*cdf0e10cSrcweir     {
66*cdf0e10cSrcweir         return osl_incrementInterlockedCount( &m_refCount );
67*cdf0e10cSrcweir     }
68*cdf0e10cSrcweir 
69*cdf0e10cSrcweir 	//--------------------------------------------------------------------
70*cdf0e10cSrcweir 	oslInterlockedCount SAL_CALL ReferenceBase::release()
71*cdf0e10cSrcweir     {
72*cdf0e10cSrcweir         return osl_decrementInterlockedCount( &m_refCount );
73*cdf0e10cSrcweir     }
74*cdf0e10cSrcweir 
75*cdf0e10cSrcweir 	//--------------------------------------------------------------------
76*cdf0e10cSrcweir     ReferenceBase::~ReferenceBase()
77*cdf0e10cSrcweir     {
78*cdf0e10cSrcweir     }
79*cdf0e10cSrcweir 
80*cdf0e10cSrcweir     //====================================================================
81*cdf0e10cSrcweir 	//= AttributeHandler
82*cdf0e10cSrcweir 	//====================================================================
83*cdf0e10cSrcweir 	//--------------------------------------------------------------------
84*cdf0e10cSrcweir     AttributeHandler::AttributeHandler( AttributeId _nAttributeId, WhichId _nWhichId )
85*cdf0e10cSrcweir         :m_nAttribute( _nAttributeId )
86*cdf0e10cSrcweir         ,m_nWhich    ( _nWhichId     )
87*cdf0e10cSrcweir     {
88*cdf0e10cSrcweir     }
89*cdf0e10cSrcweir 
90*cdf0e10cSrcweir 	//--------------------------------------------------------------------
91*cdf0e10cSrcweir     AttributeHandler::~AttributeHandler()
92*cdf0e10cSrcweir     {
93*cdf0e10cSrcweir     }
94*cdf0e10cSrcweir 
95*cdf0e10cSrcweir 	//--------------------------------------------------------------------
96*cdf0e10cSrcweir 	oslInterlockedCount SAL_CALL AttributeHandler::acquire()
97*cdf0e10cSrcweir     {
98*cdf0e10cSrcweir         return ReferenceBase::acquire();
99*cdf0e10cSrcweir     }
100*cdf0e10cSrcweir 
101*cdf0e10cSrcweir 	//--------------------------------------------------------------------
102*cdf0e10cSrcweir 	oslInterlockedCount SAL_CALL AttributeHandler::release()
103*cdf0e10cSrcweir     {
104*cdf0e10cSrcweir         return ReferenceBase::release();
105*cdf0e10cSrcweir     }
106*cdf0e10cSrcweir 
107*cdf0e10cSrcweir 	//--------------------------------------------------------------------
108*cdf0e10cSrcweir     AttributeId AttributeHandler::getAttributeId( ) const
109*cdf0e10cSrcweir     {
110*cdf0e10cSrcweir         return getAttribute();
111*cdf0e10cSrcweir     }
112*cdf0e10cSrcweir 
113*cdf0e10cSrcweir 	//--------------------------------------------------------------------
114*cdf0e10cSrcweir     AttributeCheckState AttributeHandler::implGetCheckState( const SfxPoolItem& /*_rItem*/ ) const
115*cdf0e10cSrcweir     {
116*cdf0e10cSrcweir         OSL_ENSURE( sal_False, "AttributeHandler::implGetCheckState: not to be called!" );
117*cdf0e10cSrcweir         return eIndetermined;
118*cdf0e10cSrcweir     }
119*cdf0e10cSrcweir 
120*cdf0e10cSrcweir 	//--------------------------------------------------------------------
121*cdf0e10cSrcweir     void AttributeHandler::putItemForScript( SfxItemSet& _rAttribs, const SfxPoolItem& _rItem, ScriptType _nForScriptType ) const
122*cdf0e10cSrcweir     {
123*cdf0e10cSrcweir         SvxScriptSetItem aSetItem( (WhichId)getAttributeId(), *_rAttribs.GetPool() );
124*cdf0e10cSrcweir         aSetItem.PutItemForScriptType( _nForScriptType, _rItem );
125*cdf0e10cSrcweir         _rAttribs.Put( aSetItem.GetItemSet(), sal_False );
126*cdf0e10cSrcweir     }
127*cdf0e10cSrcweir 
128*cdf0e10cSrcweir 	//--------------------------------------------------------------------
129*cdf0e10cSrcweir     AttributeCheckState AttributeHandler::getCheckState( const SfxItemSet& _rAttribs ) const
130*cdf0e10cSrcweir     {
131*cdf0e10cSrcweir         AttributeCheckState eSimpleState( eIndetermined );
132*cdf0e10cSrcweir         const SfxPoolItem* pItem = _rAttribs.GetItem( getWhich() );
133*cdf0e10cSrcweir         if ( pItem )
134*cdf0e10cSrcweir             eSimpleState = implGetCheckState( *pItem );
135*cdf0e10cSrcweir         return eSimpleState;
136*cdf0e10cSrcweir     }
137*cdf0e10cSrcweir 
138*cdf0e10cSrcweir 	//--------------------------------------------------------------------
139*cdf0e10cSrcweir     AttributeState AttributeHandler::getState( const SfxItemSet& _rAttribs ) const
140*cdf0e10cSrcweir     {
141*cdf0e10cSrcweir         AttributeState aState( eIndetermined );
142*cdf0e10cSrcweir         aState.eSimpleState = getCheckState( _rAttribs );
143*cdf0e10cSrcweir         return aState;
144*cdf0e10cSrcweir     }
145*cdf0e10cSrcweir 
146*cdf0e10cSrcweir     //====================================================================
147*cdf0e10cSrcweir 	//= AttributeHandlerFactory
148*cdf0e10cSrcweir 	//====================================================================
149*cdf0e10cSrcweir 	//--------------------------------------------------------------------
150*cdf0e10cSrcweir     namespace
151*cdf0e10cSrcweir     {
152*cdf0e10cSrcweir         static WhichId lcl_implGetWhich( const SfxItemPool& _rPool, AttributeId _nAttributeId )
153*cdf0e10cSrcweir         {
154*cdf0e10cSrcweir             WhichId nWhich = 0;
155*cdf0e10cSrcweir             switch ( _nAttributeId )
156*cdf0e10cSrcweir             {
157*cdf0e10cSrcweir             case SID_ATTR_CHAR_LATIN_FONTHEIGHT:nWhich = EE_CHAR_FONTHEIGHT;break;
158*cdf0e10cSrcweir             case SID_ATTR_CHAR_LATIN_FONT:      nWhich = EE_CHAR_FONTINFO;  break;
159*cdf0e10cSrcweir             case SID_ATTR_CHAR_LATIN_LANGUAGE:  nWhich = EE_CHAR_LANGUAGE;  break;
160*cdf0e10cSrcweir             case SID_ATTR_CHAR_LATIN_POSTURE:   nWhich = EE_CHAR_ITALIC;    break;
161*cdf0e10cSrcweir             case SID_ATTR_CHAR_LATIN_WEIGHT:    nWhich = EE_CHAR_WEIGHT;    break;
162*cdf0e10cSrcweir 
163*cdf0e10cSrcweir             default:
164*cdf0e10cSrcweir                 nWhich = _rPool.GetWhich( (SfxSlotId)_nAttributeId );
165*cdf0e10cSrcweir             }
166*cdf0e10cSrcweir             return nWhich;
167*cdf0e10cSrcweir         }
168*cdf0e10cSrcweir     }
169*cdf0e10cSrcweir 	//--------------------------------------------------------------------
170*cdf0e10cSrcweir     ::rtl::Reference< IAttributeHandler > AttributeHandlerFactory::getHandlerFor( AttributeId _nAttributeId, const SfxItemPool& _rEditEnginePool )
171*cdf0e10cSrcweir     {
172*cdf0e10cSrcweir         ::rtl::Reference< IAttributeHandler > pReturn;
173*cdf0e10cSrcweir         switch ( _nAttributeId )
174*cdf0e10cSrcweir         {
175*cdf0e10cSrcweir         case SID_ATTR_PARA_ADJUST_LEFT  :
176*cdf0e10cSrcweir 		case SID_ATTR_PARA_ADJUST_CENTER:
177*cdf0e10cSrcweir 		case SID_ATTR_PARA_ADJUST_RIGHT :
178*cdf0e10cSrcweir 		case SID_ATTR_PARA_ADJUST_BLOCK :
179*cdf0e10cSrcweir             pReturn = new ParaAlignmentHandler( _nAttributeId );
180*cdf0e10cSrcweir             break;
181*cdf0e10cSrcweir 
182*cdf0e10cSrcweir         case SID_ATTR_PARA_LINESPACE_10:
183*cdf0e10cSrcweir 	    case SID_ATTR_PARA_LINESPACE_15:
184*cdf0e10cSrcweir 		case SID_ATTR_PARA_LINESPACE_20:
185*cdf0e10cSrcweir             pReturn = new LineSpacingHandler( _nAttributeId );
186*cdf0e10cSrcweir             break;
187*cdf0e10cSrcweir 
188*cdf0e10cSrcweir         case SID_SET_SUPER_SCRIPT:
189*cdf0e10cSrcweir         case SID_SET_SUB_SCRIPT:
190*cdf0e10cSrcweir             pReturn = new EscapementHandler( _nAttributeId );
191*cdf0e10cSrcweir             break;
192*cdf0e10cSrcweir 
193*cdf0e10cSrcweir         case SID_ATTR_CHAR_FONTHEIGHT:
194*cdf0e10cSrcweir         case SID_ATTR_CHAR_CTL_FONTHEIGHT:
195*cdf0e10cSrcweir         case SID_ATTR_CHAR_CJK_FONTHEIGHT:
196*cdf0e10cSrcweir         case SID_ATTR_CHAR_LATIN_FONTHEIGHT:
197*cdf0e10cSrcweir             pReturn = new FontSizeHandler( _nAttributeId, lcl_implGetWhich( _rEditEnginePool, _nAttributeId ) );
198*cdf0e10cSrcweir             break;
199*cdf0e10cSrcweir 
200*cdf0e10cSrcweir         case SID_ATTR_PARA_LEFT_TO_RIGHT:
201*cdf0e10cSrcweir         case SID_ATTR_PARA_RIGHT_TO_LEFT:
202*cdf0e10cSrcweir             pReturn = new ParagraphDirectionHandler( _nAttributeId );
203*cdf0e10cSrcweir             break;
204*cdf0e10cSrcweir 
205*cdf0e10cSrcweir         case SID_ATTR_PARA_HANGPUNCTUATION:
206*cdf0e10cSrcweir         case SID_ATTR_PARA_FORBIDDEN_RULES:
207*cdf0e10cSrcweir         case SID_ATTR_PARA_SCRIPTSPACE:
208*cdf0e10cSrcweir             pReturn = new BooleanHandler( _nAttributeId, lcl_implGetWhich( _rEditEnginePool, _nAttributeId ) );
209*cdf0e10cSrcweir             break;
210*cdf0e10cSrcweir 
211*cdf0e10cSrcweir         default:
212*cdf0e10cSrcweir             pReturn = new SlotHandler( (SfxSlotId)_nAttributeId, lcl_implGetWhich( _rEditEnginePool, _nAttributeId ) );
213*cdf0e10cSrcweir             break;
214*cdf0e10cSrcweir 
215*cdf0e10cSrcweir         }
216*cdf0e10cSrcweir 
217*cdf0e10cSrcweir         return pReturn;
218*cdf0e10cSrcweir     }
219*cdf0e10cSrcweir 
220*cdf0e10cSrcweir     //====================================================================
221*cdf0e10cSrcweir 	//= ParaAlignmentHandler
222*cdf0e10cSrcweir 	//====================================================================
223*cdf0e10cSrcweir 	//--------------------------------------------------------------------
224*cdf0e10cSrcweir     ParaAlignmentHandler::ParaAlignmentHandler( AttributeId _nAttributeId )
225*cdf0e10cSrcweir         :AttributeHandler( _nAttributeId, EE_PARA_JUST )
226*cdf0e10cSrcweir         ,m_eAdjust( SVX_ADJUST_CENTER )
227*cdf0e10cSrcweir     {
228*cdf0e10cSrcweir         switch ( getAttribute() )
229*cdf0e10cSrcweir         {
230*cdf0e10cSrcweir             case SID_ATTR_PARA_ADJUST_LEFT  : m_eAdjust = SVX_ADJUST_LEFT;    break;
231*cdf0e10cSrcweir 	    	case SID_ATTR_PARA_ADJUST_CENTER: m_eAdjust = SVX_ADJUST_CENTER;  break;
232*cdf0e10cSrcweir 		    case SID_ATTR_PARA_ADJUST_RIGHT : m_eAdjust = SVX_ADJUST_RIGHT;   break;
233*cdf0e10cSrcweir 		    case SID_ATTR_PARA_ADJUST_BLOCK : m_eAdjust = SVX_ADJUST_BLOCK;   break;
234*cdf0e10cSrcweir             default:
235*cdf0e10cSrcweir                 OSL_ENSURE( sal_False, "ParaAlignmentHandler::ParaAlignmentHandler: invalid slot!" );
236*cdf0e10cSrcweir                 break;
237*cdf0e10cSrcweir         }
238*cdf0e10cSrcweir     }
239*cdf0e10cSrcweir 
240*cdf0e10cSrcweir 	//--------------------------------------------------------------------
241*cdf0e10cSrcweir     AttributeCheckState ParaAlignmentHandler::implGetCheckState( const SfxPoolItem& _rItem ) const
242*cdf0e10cSrcweir     {
243*cdf0e10cSrcweir         OSL_ENSURE( _rItem.ISA( SvxAdjustItem ), "ParaAlignmentHandler::implGetCheckState: invalid pool item!" );
244*cdf0e10cSrcweir         SvxAdjust eAdjust = static_cast< const SvxAdjustItem& >( _rItem ).GetAdjust();
245*cdf0e10cSrcweir         return ( eAdjust == m_eAdjust ) ? eChecked : eUnchecked;
246*cdf0e10cSrcweir     }
247*cdf0e10cSrcweir 
248*cdf0e10cSrcweir 	//--------------------------------------------------------------------
249*cdf0e10cSrcweir     void ParaAlignmentHandler::executeAttribute( const SfxItemSet& /*_rCurrentAttribs*/, SfxItemSet& _rNewAttribs, const SfxPoolItem* _pAdditionalArg, ScriptType /*_nForScriptType*/ ) const
250*cdf0e10cSrcweir     {
251*cdf0e10cSrcweir         OSL_ENSURE( !_pAdditionalArg, "ParaAlignmentHandler::executeAttribute: this is a simple toggle attribute - no args possible!" );
252*cdf0e10cSrcweir         (void)_pAdditionalArg;
253*cdf0e10cSrcweir         _rNewAttribs.Put( SvxAdjustItem( m_eAdjust, getWhich() ) );
254*cdf0e10cSrcweir     }
255*cdf0e10cSrcweir 
256*cdf0e10cSrcweir     //====================================================================
257*cdf0e10cSrcweir 	//= LineSpacingHandler
258*cdf0e10cSrcweir 	//====================================================================
259*cdf0e10cSrcweir 	//--------------------------------------------------------------------
260*cdf0e10cSrcweir     LineSpacingHandler::LineSpacingHandler( AttributeId _nAttributeId )
261*cdf0e10cSrcweir         :AttributeHandler( _nAttributeId, EE_PARA_SBL )
262*cdf0e10cSrcweir         ,m_nLineSpace( 100 )
263*cdf0e10cSrcweir     {
264*cdf0e10cSrcweir         switch ( getAttribute() )
265*cdf0e10cSrcweir         {
266*cdf0e10cSrcweir             case SID_ATTR_PARA_LINESPACE_10: m_nLineSpace = 100; break;
267*cdf0e10cSrcweir 	    	case SID_ATTR_PARA_LINESPACE_15: m_nLineSpace = 150; break;
268*cdf0e10cSrcweir 		    case SID_ATTR_PARA_LINESPACE_20: m_nLineSpace = 200; break;
269*cdf0e10cSrcweir             default:
270*cdf0e10cSrcweir                 OSL_ENSURE( sal_False, "LineSpacingHandler::LineSpacingHandler: invalid slot!" );
271*cdf0e10cSrcweir                 break;
272*cdf0e10cSrcweir         }
273*cdf0e10cSrcweir     }
274*cdf0e10cSrcweir 
275*cdf0e10cSrcweir 	//--------------------------------------------------------------------
276*cdf0e10cSrcweir     AttributeCheckState LineSpacingHandler::implGetCheckState( const SfxPoolItem& _rItem ) const
277*cdf0e10cSrcweir     {
278*cdf0e10cSrcweir         OSL_ENSURE( _rItem.ISA( SvxLineSpacingItem ), "LineSpacingHandler::implGetCheckState: invalid pool item!" );
279*cdf0e10cSrcweir         sal_uInt16 nLineSpace = static_cast< const SvxLineSpacingItem& >( _rItem ).GetPropLineSpace();
280*cdf0e10cSrcweir         return ( nLineSpace == m_nLineSpace ) ? eChecked : eUnchecked;
281*cdf0e10cSrcweir     }
282*cdf0e10cSrcweir 
283*cdf0e10cSrcweir 	//--------------------------------------------------------------------
284*cdf0e10cSrcweir     void LineSpacingHandler::executeAttribute( const SfxItemSet& /*_rCurrentAttribs*/, SfxItemSet& _rNewAttribs, const SfxPoolItem* _pAdditionalArg, ScriptType /*_nForScriptType*/ ) const
285*cdf0e10cSrcweir     {
286*cdf0e10cSrcweir         OSL_ENSURE( !_pAdditionalArg, "LineSpacingHandler::executeAttribute: this is a simple toggle attribute - no args possible!" );
287*cdf0e10cSrcweir         (void)_pAdditionalArg;
288*cdf0e10cSrcweir 
289*cdf0e10cSrcweir         SvxLineSpacingItem aLineSpacing( m_nLineSpace, getWhich() );
290*cdf0e10cSrcweir         aLineSpacing.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
291*cdf0e10cSrcweir         if ( 100 == m_nLineSpace )
292*cdf0e10cSrcweir             aLineSpacing.GetInterLineSpaceRule() = SVX_INTER_LINE_SPACE_OFF;
293*cdf0e10cSrcweir         else
294*cdf0e10cSrcweir             aLineSpacing.SetPropLineSpace( (sal_uInt8)m_nLineSpace );
295*cdf0e10cSrcweir 
296*cdf0e10cSrcweir         _rNewAttribs.Put( aLineSpacing );
297*cdf0e10cSrcweir     }
298*cdf0e10cSrcweir 
299*cdf0e10cSrcweir     //====================================================================
300*cdf0e10cSrcweir 	//= EscapementHandler
301*cdf0e10cSrcweir 	//====================================================================
302*cdf0e10cSrcweir 	//--------------------------------------------------------------------
303*cdf0e10cSrcweir     EscapementHandler::EscapementHandler( AttributeId _nAttributeId )
304*cdf0e10cSrcweir         :AttributeHandler( _nAttributeId, EE_CHAR_ESCAPEMENT )
305*cdf0e10cSrcweir         ,m_eEscapement( SVX_ESCAPEMENT_OFF )
306*cdf0e10cSrcweir     {
307*cdf0e10cSrcweir         switch ( getAttribute() )
308*cdf0e10cSrcweir         {
309*cdf0e10cSrcweir             case SID_SET_SUPER_SCRIPT   : m_eEscapement = SVX_ESCAPEMENT_SUPERSCRIPT; break;
310*cdf0e10cSrcweir 	    	case SID_SET_SUB_SCRIPT     : m_eEscapement = SVX_ESCAPEMENT_SUBSCRIPT;   break;
311*cdf0e10cSrcweir             default:
312*cdf0e10cSrcweir                 OSL_ENSURE( sal_False, "EscapementHandler::EscapementHandler: invalid slot!" );
313*cdf0e10cSrcweir                 break;
314*cdf0e10cSrcweir         }
315*cdf0e10cSrcweir     }
316*cdf0e10cSrcweir 
317*cdf0e10cSrcweir 	//--------------------------------------------------------------------
318*cdf0e10cSrcweir     AttributeCheckState EscapementHandler::implGetCheckState( const SfxPoolItem& _rItem ) const
319*cdf0e10cSrcweir     {
320*cdf0e10cSrcweir         OSL_ENSURE( _rItem.ISA( SvxEscapementItem ), "EscapementHandler::getState: invalid pool item!" );
321*cdf0e10cSrcweir         SvxEscapement eEscapement = static_cast< const SvxEscapementItem& >( _rItem ).GetEscapement();
322*cdf0e10cSrcweir         return ( eEscapement == m_eEscapement ) ? eChecked : eUnchecked;
323*cdf0e10cSrcweir     }
324*cdf0e10cSrcweir 
325*cdf0e10cSrcweir 	//--------------------------------------------------------------------
326*cdf0e10cSrcweir     void EscapementHandler::executeAttribute( const SfxItemSet& _rCurrentAttribs, SfxItemSet& _rNewAttribs, const SfxPoolItem* _pAdditionalArg, ScriptType /*_nForScriptType*/ ) const
327*cdf0e10cSrcweir     {
328*cdf0e10cSrcweir         OSL_ENSURE( !_pAdditionalArg, "EscapementHandler::executeAttribute: this is a simple toggle attribute - no args possible!" );
329*cdf0e10cSrcweir             // well, in theory we could allow an SvxEscapementItem here, but this is not needed
330*cdf0e10cSrcweir         (void)_pAdditionalArg;
331*cdf0e10cSrcweir 
332*cdf0e10cSrcweir         bool bIsChecked = getCheckState( _rCurrentAttribs ) == eChecked;
333*cdf0e10cSrcweir         _rNewAttribs.Put( SvxEscapementItem( bIsChecked ? SVX_ESCAPEMENT_OFF : m_eEscapement, getWhich() ) );
334*cdf0e10cSrcweir     }
335*cdf0e10cSrcweir 
336*cdf0e10cSrcweir     //====================================================================
337*cdf0e10cSrcweir 	//= SlotHandler
338*cdf0e10cSrcweir 	//====================================================================
339*cdf0e10cSrcweir     //--------------------------------------------------------------------
340*cdf0e10cSrcweir     SlotHandler::SlotHandler( AttributeId _nAttributeId, WhichId _nWhichId )
341*cdf0e10cSrcweir         :AttributeHandler( _nAttributeId, _nWhichId )
342*cdf0e10cSrcweir         ,m_bScriptDependent( false )
343*cdf0e10cSrcweir     {
344*cdf0e10cSrcweir         m_bScriptDependent = ( SID_ATTR_CHAR_WEIGHT == _nAttributeId )
345*cdf0e10cSrcweir                          ||  ( SID_ATTR_CHAR_POSTURE == _nAttributeId )
346*cdf0e10cSrcweir                          ||  ( SID_ATTR_CHAR_FONT == _nAttributeId );
347*cdf0e10cSrcweir     }
348*cdf0e10cSrcweir 
349*cdf0e10cSrcweir     //--------------------------------------------------------------------
350*cdf0e10cSrcweir     AttributeState SlotHandler::getState( const SfxItemSet& _rAttribs ) const
351*cdf0e10cSrcweir     {
352*cdf0e10cSrcweir         AttributeState aState( eIndetermined );
353*cdf0e10cSrcweir 
354*cdf0e10cSrcweir         const SfxPoolItem* pItem = _rAttribs.GetItem( getWhich() );
355*cdf0e10cSrcweir         if ( pItem )
356*cdf0e10cSrcweir             aState.setItem( pItem->Clone() );
357*cdf0e10cSrcweir 
358*cdf0e10cSrcweir         return aState;
359*cdf0e10cSrcweir     }
360*cdf0e10cSrcweir 
361*cdf0e10cSrcweir     //--------------------------------------------------------------------
362*cdf0e10cSrcweir     void SlotHandler::executeAttribute( const SfxItemSet& /*_rCurrentAttribs*/, SfxItemSet& _rNewAttribs, const SfxPoolItem* _pAdditionalArg, ScriptType _nForScriptType ) const
363*cdf0e10cSrcweir     {
364*cdf0e10cSrcweir         if ( _pAdditionalArg )
365*cdf0e10cSrcweir         {
366*cdf0e10cSrcweir             SfxPoolItem* pCorrectWich = _pAdditionalArg->Clone();
367*cdf0e10cSrcweir             pCorrectWich->SetWhich( getWhich() );
368*cdf0e10cSrcweir 
369*cdf0e10cSrcweir             if ( m_bScriptDependent )
370*cdf0e10cSrcweir                 putItemForScript( _rNewAttribs, *pCorrectWich, _nForScriptType );
371*cdf0e10cSrcweir             else
372*cdf0e10cSrcweir                 _rNewAttribs.Put( *pCorrectWich );
373*cdf0e10cSrcweir             DELETEZ( pCorrectWich );
374*cdf0e10cSrcweir         }
375*cdf0e10cSrcweir         else
376*cdf0e10cSrcweir             OSL_ENSURE( sal_False, "SlotHandler::executeAttribute: need attributes to do something!" );
377*cdf0e10cSrcweir     }
378*cdf0e10cSrcweir 
379*cdf0e10cSrcweir     //====================================================================
380*cdf0e10cSrcweir 	//= FontSizeHandler
381*cdf0e10cSrcweir 	//====================================================================
382*cdf0e10cSrcweir     //--------------------------------------------------------------------
383*cdf0e10cSrcweir     FontSizeHandler::FontSizeHandler( AttributeId _nAttributeId, WhichId _nWhichId )
384*cdf0e10cSrcweir         :AttributeHandler( _nAttributeId, _nWhichId )
385*cdf0e10cSrcweir     {
386*cdf0e10cSrcweir         OSL_ENSURE( ( _nAttributeId == SID_ATTR_CHAR_FONTHEIGHT ) || ( _nAttributeId == SID_ATTR_CHAR_CTL_FONTHEIGHT )
387*cdf0e10cSrcweir             || ( _nAttributeId == SID_ATTR_CHAR_CJK_FONTHEIGHT ) || ( _nAttributeId == SID_ATTR_CHAR_LATIN_FONTHEIGHT ),
388*cdf0e10cSrcweir             "FontSizeHandler::FontSizeHandler: invalid attribute id!" );
389*cdf0e10cSrcweir     }
390*cdf0e10cSrcweir 
391*cdf0e10cSrcweir     //--------------------------------------------------------------------
392*cdf0e10cSrcweir     AttributeState FontSizeHandler::getState( const SfxItemSet& _rAttribs ) const
393*cdf0e10cSrcweir     {
394*cdf0e10cSrcweir         AttributeState aState( eIndetermined );
395*cdf0e10cSrcweir 
396*cdf0e10cSrcweir         const SfxPoolItem* pItem = _rAttribs.GetItem( getWhich() );
397*cdf0e10cSrcweir         const SvxFontHeightItem* pFontHeightItem = PTR_CAST( SvxFontHeightItem, pItem );
398*cdf0e10cSrcweir         OSL_ENSURE( pFontHeightItem || !pItem, "FontSizeHandler::getState: invalid item!" );
399*cdf0e10cSrcweir         if ( pFontHeightItem )
400*cdf0e10cSrcweir         {
401*cdf0e10cSrcweir             // by definition, the item should have the unit twip
402*cdf0e10cSrcweir             sal_uLong nHeight = pFontHeightItem->GetHeight();
403*cdf0e10cSrcweir             if ( _rAttribs.GetPool()->GetMetric( getWhich() ) != SFX_MAPUNIT_TWIP )
404*cdf0e10cSrcweir             {
405*cdf0e10cSrcweir                 nHeight = OutputDevice::LogicToLogic(
406*cdf0e10cSrcweir                     Size( 0, nHeight ),
407*cdf0e10cSrcweir                     MapMode( (MapUnit)( _rAttribs.GetPool()->GetMetric( getWhich() ) ) ),
408*cdf0e10cSrcweir                     MapMode( MAP_TWIP )
409*cdf0e10cSrcweir                 ).Height();
410*cdf0e10cSrcweir             }
411*cdf0e10cSrcweir 
412*cdf0e10cSrcweir             SvxFontHeightItem* pNewItem = new SvxFontHeightItem( nHeight, 100, getWhich() );
413*cdf0e10cSrcweir             pNewItem->SetProp( pFontHeightItem->GetProp(), pFontHeightItem->GetPropUnit() );
414*cdf0e10cSrcweir             aState.setItem( pNewItem );
415*cdf0e10cSrcweir         }
416*cdf0e10cSrcweir 
417*cdf0e10cSrcweir         return aState;
418*cdf0e10cSrcweir     }
419*cdf0e10cSrcweir 
420*cdf0e10cSrcweir     //--------------------------------------------------------------------
421*cdf0e10cSrcweir     void FontSizeHandler::executeAttribute( const SfxItemSet& /*_rCurrentAttribs*/, SfxItemSet& _rNewAttribs, const SfxPoolItem* _pAdditionalArg, ScriptType _nForScriptType ) const
422*cdf0e10cSrcweir     {
423*cdf0e10cSrcweir         const SvxFontHeightItem* pFontHeightItem = PTR_CAST( SvxFontHeightItem, _pAdditionalArg );
424*cdf0e10cSrcweir         OSL_ENSURE( pFontHeightItem, "FontSizeHandler::executeAttribute: need a FontHeightItem!" );
425*cdf0e10cSrcweir 
426*cdf0e10cSrcweir         if ( pFontHeightItem )
427*cdf0e10cSrcweir         {
428*cdf0e10cSrcweir             // corect measurement units
429*cdf0e10cSrcweir             SfxMapUnit eItemMapUnit = pFontHeightItem->GetPropUnit(); (void)eItemMapUnit;
430*cdf0e10cSrcweir             sal_uLong nHeight = pFontHeightItem->GetHeight();
431*cdf0e10cSrcweir             if ( _rNewAttribs.GetPool()->GetMetric( getWhich() ) != SFX_MAPUNIT_TWIP )
432*cdf0e10cSrcweir             {
433*cdf0e10cSrcweir                 nHeight = OutputDevice::LogicToLogic(
434*cdf0e10cSrcweir                     Size( 0, nHeight ),
435*cdf0e10cSrcweir                     MapMode( (MapUnit)( SFX_MAPUNIT_TWIP ) ),
436*cdf0e10cSrcweir                     MapMode( (MapUnit)( _rNewAttribs.GetPool()->GetMetric( getWhich() ) ) )
437*cdf0e10cSrcweir                 ).Height();
438*cdf0e10cSrcweir             }
439*cdf0e10cSrcweir 
440*cdf0e10cSrcweir             SvxFontHeightItem aNewItem( nHeight, 100, getWhich() );
441*cdf0e10cSrcweir             aNewItem.SetProp( pFontHeightItem->GetProp(), pFontHeightItem->GetPropUnit() );
442*cdf0e10cSrcweir 
443*cdf0e10cSrcweir             if ( ( getAttributeId() == SID_ATTR_CHAR_FONTHEIGHT ) && _nForScriptType )
444*cdf0e10cSrcweir                 putItemForScript( _rNewAttribs, aNewItem, _nForScriptType );
445*cdf0e10cSrcweir             else
446*cdf0e10cSrcweir                 _rNewAttribs.Put( aNewItem );
447*cdf0e10cSrcweir         }
448*cdf0e10cSrcweir     }
449*cdf0e10cSrcweir 
450*cdf0e10cSrcweir     //====================================================================
451*cdf0e10cSrcweir 	//= ParagraphDirectionHandler
452*cdf0e10cSrcweir 	//====================================================================
453*cdf0e10cSrcweir     //--------------------------------------------------------------------
454*cdf0e10cSrcweir     ParagraphDirectionHandler::ParagraphDirectionHandler( AttributeId _nAttributeId )
455*cdf0e10cSrcweir         :AttributeHandler( _nAttributeId, EE_PARA_WRITINGDIR )
456*cdf0e10cSrcweir         ,m_eParagraphDirection( FRMDIR_HORI_LEFT_TOP )
457*cdf0e10cSrcweir         ,m_eDefaultAdjustment( SVX_ADJUST_RIGHT )
458*cdf0e10cSrcweir         ,m_eOppositeDefaultAdjustment( SVX_ADJUST_LEFT )
459*cdf0e10cSrcweir     {
460*cdf0e10cSrcweir         switch ( getAttributeId() )
461*cdf0e10cSrcweir         {
462*cdf0e10cSrcweir             case SID_ATTR_PARA_LEFT_TO_RIGHT: m_eParagraphDirection = FRMDIR_HORI_LEFT_TOP; m_eDefaultAdjustment = SVX_ADJUST_LEFT; break;
463*cdf0e10cSrcweir             case SID_ATTR_PARA_RIGHT_TO_LEFT: m_eParagraphDirection = FRMDIR_HORI_RIGHT_TOP; m_eDefaultAdjustment = SVX_ADJUST_RIGHT; break;
464*cdf0e10cSrcweir             default:
465*cdf0e10cSrcweir                 OSL_ENSURE( sal_False, "ParagraphDirectionHandler::ParagraphDirectionHandler: invalid attribute id!" );
466*cdf0e10cSrcweir         }
467*cdf0e10cSrcweir 
468*cdf0e10cSrcweir         if ( SVX_ADJUST_RIGHT == m_eDefaultAdjustment )
469*cdf0e10cSrcweir             m_eOppositeDefaultAdjustment = SVX_ADJUST_LEFT;
470*cdf0e10cSrcweir         else
471*cdf0e10cSrcweir             m_eOppositeDefaultAdjustment = SVX_ADJUST_RIGHT;
472*cdf0e10cSrcweir     }
473*cdf0e10cSrcweir 
474*cdf0e10cSrcweir 	//--------------------------------------------------------------------
475*cdf0e10cSrcweir     AttributeCheckState ParagraphDirectionHandler::implGetCheckState( const SfxPoolItem& _rItem ) const
476*cdf0e10cSrcweir     {
477*cdf0e10cSrcweir         OSL_ENSURE( _rItem.ISA( SvxFrameDirectionItem ), "ParagraphDirectionHandler::implGetCheckState: invalid pool item!" );
478*cdf0e10cSrcweir         SvxFrameDirection eDirection = static_cast< SvxFrameDirection >( static_cast< const SvxFrameDirectionItem& >( _rItem ).GetValue() );
479*cdf0e10cSrcweir         return ( eDirection == m_eParagraphDirection ) ? eChecked : eUnchecked;
480*cdf0e10cSrcweir     }
481*cdf0e10cSrcweir 
482*cdf0e10cSrcweir     //--------------------------------------------------------------------
483*cdf0e10cSrcweir     void ParagraphDirectionHandler::executeAttribute( const SfxItemSet& _rCurrentAttribs, SfxItemSet& _rNewAttribs, const SfxPoolItem* /*_pAdditionalArg*/, ScriptType /*_nForScriptType*/ ) const
484*cdf0e10cSrcweir     {
485*cdf0e10cSrcweir         _rNewAttribs.Put( SvxFrameDirectionItem( m_eParagraphDirection, getWhich() ) );
486*cdf0e10cSrcweir 
487*cdf0e10cSrcweir         // if the current adjustment of the was the default adjustment for the *previous* text direction,
488*cdf0e10cSrcweir         // then we toggle the adjustment, too
489*cdf0e10cSrcweir         SvxAdjust eCurrentAdjustment = SVX_ADJUST_LEFT;
490*cdf0e10cSrcweir         const SfxPoolItem* pCurrentAdjustment = NULL;
491*cdf0e10cSrcweir         if ( SFX_ITEM_ON == _rCurrentAttribs.GetItemState( EE_PARA_JUST, sal_True, &pCurrentAdjustment ) )
492*cdf0e10cSrcweir             eCurrentAdjustment = static_cast< const SvxAdjustItem* >( pCurrentAdjustment )->GetAdjust();
493*cdf0e10cSrcweir 
494*cdf0e10cSrcweir         if ( eCurrentAdjustment == m_eOppositeDefaultAdjustment )
495*cdf0e10cSrcweir             _rNewAttribs.Put( SvxAdjustItem( m_eDefaultAdjustment, EE_PARA_JUST ) );
496*cdf0e10cSrcweir     }
497*cdf0e10cSrcweir 
498*cdf0e10cSrcweir     //====================================================================
499*cdf0e10cSrcweir 	//= BooleanHandler
500*cdf0e10cSrcweir 	//====================================================================
501*cdf0e10cSrcweir     //--------------------------------------------------------------------
502*cdf0e10cSrcweir     BooleanHandler::BooleanHandler( AttributeId _nAttributeId, WhichId _nWhichId )
503*cdf0e10cSrcweir         :AttributeHandler( _nAttributeId, _nWhichId )
504*cdf0e10cSrcweir     {
505*cdf0e10cSrcweir     }
506*cdf0e10cSrcweir 
507*cdf0e10cSrcweir     //--------------------------------------------------------------------
508*cdf0e10cSrcweir     AttributeCheckState BooleanHandler::implGetCheckState( const SfxPoolItem& _rItem ) const
509*cdf0e10cSrcweir     {
510*cdf0e10cSrcweir         OSL_ENSURE( _rItem.ISA( SfxBoolItem ), "BooleanHandler::implGetCheckState: invalid item!" );
511*cdf0e10cSrcweir         if ( _rItem.ISA( SfxBoolItem ) )
512*cdf0e10cSrcweir             return static_cast< const SfxBoolItem& >( _rItem ).GetValue() ? eChecked : eUnchecked;
513*cdf0e10cSrcweir 
514*cdf0e10cSrcweir         return eIndetermined;
515*cdf0e10cSrcweir     }
516*cdf0e10cSrcweir 
517*cdf0e10cSrcweir     //--------------------------------------------------------------------
518*cdf0e10cSrcweir     void BooleanHandler::executeAttribute( const SfxItemSet& /*_rCurrentAttribs*/, SfxItemSet& _rNewAttribs, const SfxPoolItem* _pAdditionalArg, ScriptType /*_nForScriptType*/ ) const
519*cdf0e10cSrcweir     {
520*cdf0e10cSrcweir         OSL_ENSURE( _pAdditionalArg && _pAdditionalArg->ISA( SfxBoolItem ), "BooleanHandler::executeAttribute: invalid argument!" );
521*cdf0e10cSrcweir         if ( _pAdditionalArg )
522*cdf0e10cSrcweir         {
523*cdf0e10cSrcweir             SfxPoolItem* pCorrectWich = _pAdditionalArg->Clone();
524*cdf0e10cSrcweir             pCorrectWich->SetWhich( getWhich() );
525*cdf0e10cSrcweir             _rNewAttribs.Put( *pCorrectWich );
526*cdf0e10cSrcweir             DELETEZ( pCorrectWich );
527*cdf0e10cSrcweir         }
528*cdf0e10cSrcweir     }
529*cdf0e10cSrcweir 
530*cdf0e10cSrcweir //........................................................................
531*cdf0e10cSrcweir }   // namespace frm
532*cdf0e10cSrcweir //........................................................................
533