xref: /trunk/main/cui/source/tabpages/textattr.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_cui.hxx"
30 
31 // include ---------------------------------------------------------------
32 #include <sfx2/app.hxx>
33 #include <sfx2/module.hxx>
34 #include <tools/shl.hxx>
35 #include <cuires.hrc>
36 #include <svx/svddef.hxx>
37 #include <svx/sdtditm.hxx>
38 #include <svx/sdtagitm.hxx>
39 #include <svx/sdtaitm.hxx>
40 #include <svx/sdtfsitm.hxx>
41 #include <svx/sdtcfitm.hxx>
42 #include <svx/svdobj.hxx>
43 #include <svx/svdmark.hxx>
44 #include <svx/svdview.hxx>
45 #include <svx/svdotext.hxx>
46 #include <svx/dialogs.hrc>
47 
48 #ifndef _SVX_TEXTATTR_CXX
49 #define _SVX_TEXTATTR_CXX
50 #endif
51 #include "textattr.hxx"
52 #include "textattr.hrc"
53 #include <dialmgr.hxx>
54 #include "svx/dlgutil.hxx"
55 #include <sfx2/request.hxx> //add CHINA001
56 #include <svx/ofaitem.hxx> //add CHINA001
57 #include <editeng/writingmodeitem.hxx>
58 
59 static sal_uInt16 pRanges[] =
60 {
61     SDRATTR_MISC_FIRST, SDRATTR_TEXT_HORZADJUST,
62     SDRATTR_TEXT_WORDWRAP, SDRATTR_TEXT_AUTOGROWSIZE,
63     0
64 };
65 
66 /*************************************************************************
67 |*
68 |* Dialog zum Kopieren von Objekten
69 |*
70 \************************************************************************/
71 
72 //CHINA001 SvxTextAttrDialog::SvxTextAttrDialog( Window* pParent, const SfxItemSet& rInAttrs,
73 //CHINA001                              const SdrView* pSdrView ) :
74 //CHINA001      SfxSingleTabDialog( pParent, rInAttrs, RID_SVXPAGE_TEXTATTR )
75 //CHINA001 {
76 //CHINA001 SvxTextAttrPage* pPage = new SvxTextAttrPage( this, rInAttrs );
77 //CHINA001
78 //CHINA001 pPage->SetView( pSdrView );
79 //CHINA001 pPage->Construct();
80 //CHINA001
81 //CHINA001 SetTabPage( pPage );
82 //CHINA001 SetText( pPage->GetText() );
83 //CHINA001 }
84 //CHINA001
85 /*************************************************************************
86 |*
87 |* Dtor
88 |*
89 \************************************************************************/
90 
91 //CHINA001 SvxTextAttrDialog::~SvxTextAttrDialog()
92 //CHINA001 {
93 //CHINA001 }
94 
95 /*************************************************************************
96 |*
97 |* Dialog (Seite) zum Kopieren von Objekten
98 |*
99 \************************************************************************/
100 
101 SvxTextAttrPage::SvxTextAttrPage( Window* pWindow, const SfxItemSet& rInAttrs ) :
102                 SvxTabPage      ( pWindow, CUI_RES( RID_SVXPAGE_TEXTATTR ),
103                                   rInAttrs ),
104 
105                 aFlText         ( this, CUI_RES( FL_TEXT ) ),
106                 aTsbAutoGrowWidth  ( this, CUI_RES( TSB_AUTOGROW_WIDTH ) ),
107                 aTsbAutoGrowHeight ( this, CUI_RES( TSB_AUTOGROW_HEIGHT ) ),
108                 aTsbFitToSize   ( this, CUI_RES( TSB_FIT_TO_SIZE ) ),
109                 aTsbContour     ( this, CUI_RES( TSB_CONTOUR ) ),
110                 aTsbWordWrapText( this, CUI_RES( TSB_WORDWRAP_TEXT ) ),
111                 aTsbAutoGrowSize( this, CUI_RES( TSB_AUTOGROW_SIZE ) ),
112                 aFlDistance     ( this, CUI_RES( FL_DISTANCE ) ),
113                 aFtLeft         ( this, CUI_RES( FT_LEFT ) ),
114                 aMtrFldLeft     ( this, CUI_RES( MTR_FLD_LEFT ) ),
115                 aFtRight        ( this, CUI_RES( FT_RIGHT ) ),
116                 aMtrFldRight    ( this, CUI_RES( MTR_FLD_RIGHT ) ),
117                 aFtTop          ( this, CUI_RES( FT_TOP ) ),
118                 aMtrFldTop      ( this, CUI_RES( MTR_FLD_TOP ) ),
119                 aFtBottom       ( this, CUI_RES( FT_BOTTOM ) ),
120                 aMtrFldBottom   ( this, CUI_RES( MTR_FLD_BOTTOM ) ),
121 
122                 aFlSeparator    ( this, CUI_RES( FL_SEPARATOR ) ),
123 
124                 aFlPosition     ( this, CUI_RES( FL_POSITION ) ),
125                 aCtlPosition    ( this, CUI_RES( CTL_POSITION ),
126                                             RP_MM, 240, 100 ),
127                 aTsbFullWidth   ( this, CUI_RES( TSB_FULL_WIDTH ) ),
128 
129                 rOutAttrs       ( rInAttrs )
130 {
131     FreeResource();
132 
133     FieldUnit eFUnit = GetModuleFieldUnit( rInAttrs );
134     SetFieldUnit( aMtrFldLeft, eFUnit );
135     SetFieldUnit( aMtrFldRight, eFUnit );
136     SetFieldUnit( aMtrFldTop, eFUnit );
137     SetFieldUnit( aMtrFldBottom, eFUnit );
138 
139     Link aLink( LINK( this, SvxTextAttrPage, ClickHdl_Impl ) );
140     aTsbAutoGrowWidth.SetClickHdl( aLink );
141     aTsbAutoGrowHeight.SetClickHdl( aLink );
142     aTsbFitToSize.SetClickHdl( aLink );
143     aTsbContour.SetClickHdl( aLink );
144 
145     aTsbFullWidth.SetClickHdl(
146         LINK( this, SvxTextAttrPage, ClickFullWidthHdl_Impl ) );
147 
148     aCtlPosition.SetAccessibleRelationMemberOf( &aFlPosition );
149 }
150 
151 /*************************************************************************
152 |*
153 |* Dtor
154 |*
155 \************************************************************************/
156 
157 SvxTextAttrPage::~SvxTextAttrPage()
158 {
159 }
160 
161 /*************************************************************************
162 |*
163 |* Liest uebergebenen Item-Set
164 |*
165 \************************************************************************/
166 
167 void __EXPORT SvxTextAttrPage::Reset( const SfxItemSet& rAttrs )
168 {
169     SfxItemPool* pPool = rAttrs.GetPool();
170     DBG_ASSERT( pPool, "Wo ist der Pool" );
171     SfxMapUnit eUnit = pPool->GetMetric( SDRATTR_TEXT_LEFTDIST );
172 
173     // Linker Abstand vom Rahmen
174     const SfxPoolItem* pItem = GetItem( rAttrs, SDRATTR_TEXT_LEFTDIST );
175 
176     if( !pItem )
177         pItem = &pPool->GetDefaultItem( SDRATTR_TEXT_LEFTDIST );
178     if( pItem )
179     {
180         long nValue = ( ( const SdrTextLeftDistItem* )pItem )->GetValue();
181         SetMetricValue( aMtrFldLeft, nValue, eUnit );
182     }
183     else
184         aMtrFldLeft.SetText( String() );
185     aMtrFldLeft.SaveValue();
186 
187     // Rechter Abstand vom Rahmen
188     pItem = GetItem( rAttrs, SDRATTR_TEXT_RIGHTDIST );
189     if( !pItem )
190         pItem = &pPool->GetDefaultItem( SDRATTR_TEXT_RIGHTDIST );
191     if( pItem )
192     {
193         long nValue = ( ( const SdrTextRightDistItem* )pItem )->GetValue();
194         SetMetricValue( aMtrFldRight, nValue, eUnit );
195     }
196     else
197         aMtrFldRight.SetText( String() );
198     aMtrFldRight.SaveValue();
199 
200     // Oberer Abstand vom Rahmen
201     pItem = GetItem( rAttrs, SDRATTR_TEXT_UPPERDIST );
202     if( !pItem )
203         pItem = &pPool->GetDefaultItem( SDRATTR_TEXT_UPPERDIST );
204     if( pItem )
205     {
206         long nValue = ( ( const SdrTextUpperDistItem* )pItem )->GetValue();
207         SetMetricValue( aMtrFldTop, nValue, eUnit );
208     }
209     else
210         aMtrFldTop.SetText( String() );
211     aMtrFldTop.SaveValue();
212 
213     // Unterer Abstand vom Rahmen
214     pItem = GetItem( rAttrs, SDRATTR_TEXT_LOWERDIST );
215     if( !pItem )
216         pItem = &pPool->GetDefaultItem( SDRATTR_TEXT_LOWERDIST );
217     if( pItem )
218     {
219         long nValue = ( ( const SdrTextLowerDistItem* )pItem )->GetValue();
220         SetMetricValue( aMtrFldBottom, nValue, eUnit );
221     }
222     else
223         aMtrFldBottom.SetText( String() );
224     aMtrFldBottom.SaveValue();
225 
226     // An Hoehe anpassen
227     if ( rAttrs.GetItemState( SDRATTR_TEXT_AUTOGROWHEIGHT ) != SFX_ITEM_DONTCARE )
228     {
229         aTsbAutoGrowHeight.SetState( ( ( const SdrTextAutoGrowHeightItem& )rAttrs.Get( SDRATTR_TEXT_AUTOGROWHEIGHT ) ).
230                         GetValue() ? STATE_CHECK : STATE_NOCHECK );
231         aTsbAutoGrowHeight.EnableTriState( sal_False );
232     }
233     else
234         aTsbAutoGrowHeight.SetState( STATE_DONTKNOW );
235     aTsbAutoGrowHeight.SaveValue();
236 
237     // An Breite anpassen
238     if ( rAttrs.GetItemState( SDRATTR_TEXT_AUTOGROWWIDTH ) != SFX_ITEM_DONTCARE )
239     {
240         aTsbAutoGrowWidth.SetState( ( ( const SdrTextAutoGrowWidthItem& )rAttrs.Get( SDRATTR_TEXT_AUTOGROWWIDTH ) ).
241                         GetValue() ? STATE_CHECK : STATE_NOCHECK );
242         aTsbAutoGrowWidth.EnableTriState( sal_False );
243     }
244     else
245         aTsbAutoGrowWidth.SetState( STATE_DONTKNOW );
246     aTsbAutoGrowWidth.SaveValue();
247 
248     // autogrowsize
249     if ( rAttrs.GetItemState( SDRATTR_TEXT_AUTOGROWSIZE ) != SFX_ITEM_DONTCARE )
250     {
251         aTsbAutoGrowSize.SetState( ( ( const SdrTextAutoGrowHeightItem& )rAttrs.Get( SDRATTR_TEXT_AUTOGROWHEIGHT ) ).
252                         GetValue() ? STATE_CHECK : STATE_NOCHECK );
253         aTsbAutoGrowSize.EnableTriState( sal_False );
254     }
255     else
256         aTsbAutoGrowSize.SetState( STATE_DONTKNOW );
257     aTsbAutoGrowSize.SaveValue();
258 
259     // wordwrap text
260     if ( rAttrs.GetItemState( SDRATTR_TEXT_WORDWRAP ) != SFX_ITEM_DONTCARE )
261     {
262         aTsbWordWrapText.SetState( ( ( const SdrTextWordWrapItem& )rAttrs.Get( SDRATTR_TEXT_WORDWRAP ) ).
263                         GetValue() ? STATE_CHECK : STATE_NOCHECK );
264         aTsbWordWrapText.EnableTriState( sal_False );
265     }
266     else
267         aTsbWordWrapText.SetState( STATE_DONTKNOW );
268     aTsbWordWrapText.SaveValue();
269 
270 
271     // #103516# Do the setup based on states of hor/ver adjust
272     // Setup center field and FullWidth
273     SfxItemState eVState = rAttrs.GetItemState( SDRATTR_TEXT_VERTADJUST );
274     SfxItemState eHState = rAttrs.GetItemState( SDRATTR_TEXT_HORZADJUST );
275 
276     if(SFX_ITEM_DONTCARE != eVState && SFX_ITEM_DONTCARE != eHState)
277     {
278         // VertAdjust and HorAdjust are unequivocal, thus
279         SdrTextVertAdjust eTVA = (SdrTextVertAdjust)((const SdrTextVertAdjustItem&)rAttrs.Get(SDRATTR_TEXT_VERTADJUST)).GetValue();
280         SdrTextHorzAdjust eTHA = (SdrTextHorzAdjust)((const SdrTextHorzAdjustItem&)rAttrs.Get(SDRATTR_TEXT_HORZADJUST)).GetValue();
281         RECT_POINT eRP = RP_LB;
282 
283         aTsbFullWidth.EnableTriState( sal_False );
284 
285         // Translate item values into local anchor position.
286         switch (eTVA)
287         {
288             case SDRTEXTVERTADJUST_TOP:
289             {
290                 switch (eTHA)
291                 {
292                     case SDRTEXTHORZADJUST_LEFT: eRP = RP_LT; break;
293                     case SDRTEXTHORZADJUST_BLOCK:
294                     case SDRTEXTHORZADJUST_CENTER: eRP = RP_MT; break;
295                     case SDRTEXTHORZADJUST_RIGHT: eRP = RP_RT; break;
296                 }
297                 break;
298             }
299             case SDRTEXTVERTADJUST_BLOCK:
300             case SDRTEXTVERTADJUST_CENTER:
301             {
302                 switch (eTHA)
303                 {
304                     case SDRTEXTHORZADJUST_LEFT: eRP = RP_LM; break;
305                     case SDRTEXTHORZADJUST_BLOCK:
306                     case SDRTEXTHORZADJUST_CENTER: eRP = RP_MM; break;
307                     case SDRTEXTHORZADJUST_RIGHT: eRP = RP_RM; break;
308                 }
309                 break;
310             }
311             case SDRTEXTVERTADJUST_BOTTOM:
312             {
313                 switch (eTHA)
314                 {
315                     case SDRTEXTHORZADJUST_LEFT: eRP = RP_LB; break;
316                     case SDRTEXTHORZADJUST_BLOCK:
317                     case SDRTEXTHORZADJUST_CENTER: eRP = RP_MB; break;
318                     case SDRTEXTHORZADJUST_RIGHT: eRP = RP_RB; break;
319                 }
320                 break;
321             }
322             default:
323                 break;
324         }
325 
326         // See if we have to check the "full width" check button.
327         sal_Bool bLeftToRight(IsTextDirectionLeftToRight());
328 
329         if((bLeftToRight && (SDRTEXTHORZADJUST_BLOCK == eTHA)) || (!bLeftToRight && (SDRTEXTVERTADJUST_BLOCK == eTVA)))
330         {
331             // Move anchor to valid position.
332             ClickFullWidthHdl_Impl(NULL);
333             aTsbFullWidth.SetState(STATE_CHECK);
334         }
335 
336         aCtlPosition.SetActualRP( eRP );
337     }
338     else
339     {
340         // VertAdjust or HorAdjust is not unequivocal
341         aCtlPosition.Reset();
342 
343         aCtlPosition.SetState(STATE_DONTKNOW);
344         aCtlPosition.DoCompletelyDisable(sal_True);
345 
346         aTsbFullWidth.SetState(STATE_DONTKNOW);
347         aTsbFullWidth.Enable( sal_False );
348         aFlPosition.Enable( sal_False );
349     }
350 
351     // Am Rahmen anpassen
352     if ( rAttrs.GetItemState( SDRATTR_TEXT_FITTOSIZE ) != SFX_ITEM_DONTCARE )
353     {
354         SdrFitToSizeType eFTS = (SdrFitToSizeType)
355                     ( ( const SdrTextFitToSizeTypeItem& )rAttrs.Get( SDRATTR_TEXT_FITTOSIZE ) ).GetValue();
356         aTsbFitToSize.SetState( eFTS == SDRTEXTFIT_NONE ? STATE_NOCHECK : STATE_CHECK );
357         aTsbFitToSize.EnableTriState( sal_False );
358     }
359     else
360         aTsbFitToSize.SetState( STATE_DONTKNOW );
361     aTsbFitToSize.SaveValue();
362 
363     // Konturfluss
364     if( rAttrs.GetItemState( SDRATTR_TEXT_CONTOURFRAME ) != SFX_ITEM_DONTCARE )
365     {
366         sal_Bool bContour = ( ( const SdrTextContourFrameItem& )rAttrs.Get( SDRATTR_TEXT_CONTOURFRAME ) ).GetValue();
367         aTsbContour.SetState( bContour ? STATE_CHECK : STATE_NOCHECK );
368         aTsbContour.EnableTriState( sal_False );
369     }
370     else
371         aTsbContour.SetState( STATE_DONTKNOW );
372     aTsbContour.SaveValue();
373 
374     ClickHdl_Impl( NULL );
375 }
376 
377 /*************************************************************************
378 |*
379 |* Fuellt uebergebenen Item-Set mit Dialogbox-Attributen
380 |*
381 \************************************************************************/
382 
383 sal_Bool SvxTextAttrPage::FillItemSet( SfxItemSet& rAttrs)
384 {
385     SfxItemPool* pPool = rAttrs.GetPool();
386     DBG_ASSERT( pPool, "Wo ist der Pool" );
387     SfxMapUnit eUnit = pPool->GetMetric( SDRATTR_TEXT_LEFTDIST );
388 
389     sal_Int32    nValue;
390     TriState eState;
391 
392     if( aMtrFldLeft.GetText() != aMtrFldLeft.GetSavedValue() )
393     {
394         nValue = GetCoreValue( aMtrFldLeft, eUnit );
395         rAttrs.Put( SdrTextLeftDistItem( nValue ) );
396     }
397 
398     if( aMtrFldRight.GetText() != aMtrFldRight.GetSavedValue() )
399     {
400         nValue = GetCoreValue( aMtrFldRight, eUnit );
401         rAttrs.Put( SdrTextRightDistItem( nValue ) );
402     }
403 
404     if( aMtrFldTop.GetText() != aMtrFldTop.GetSavedValue() )
405     {
406         nValue = GetCoreValue( aMtrFldTop, eUnit );
407         rAttrs.Put( SdrTextUpperDistItem( nValue ) );
408     }
409 
410     if( aMtrFldBottom.GetText() != aMtrFldBottom.GetSavedValue() )
411     {
412         nValue = GetCoreValue( aMtrFldBottom, eUnit );
413         rAttrs.Put( SdrTextLowerDistItem( nValue ) );
414     }
415 
416     eState = aTsbAutoGrowHeight.GetState();
417     if( eState != aTsbAutoGrowHeight.GetSavedValue() )
418     {
419         rAttrs.Put( SdrTextAutoGrowHeightItem( (sal_Bool) STATE_CHECK == eState ) );
420     }
421 
422     eState = aTsbAutoGrowWidth.GetState();
423     if( eState != aTsbAutoGrowWidth.GetSavedValue() )
424     {
425         rAttrs.Put( SdrTextAutoGrowWidthItem( (sal_Bool) STATE_CHECK == eState ) );
426     }
427 
428     eState = aTsbAutoGrowSize.GetState();
429     if( eState != aTsbAutoGrowSize.GetSavedValue() )
430     {
431         rAttrs.Put( SdrTextAutoGrowHeightItem( (sal_Bool) STATE_CHECK == eState ) );
432     }
433 
434     eState = aTsbWordWrapText.GetState();
435     if( eState != aTsbWordWrapText.GetSavedValue() )
436     {
437         rAttrs.Put( SdrTextWordWrapItem( (sal_Bool) STATE_CHECK == eState ) );
438     }
439 
440     // Konturfluss
441     eState = aTsbContour.GetState();
442     if( eState != aTsbContour.GetSavedValue() )
443     {
444         rAttrs.Put( SdrTextContourFrameItem( (sal_Bool) STATE_CHECK == eState ) );
445     }
446 
447     eState = aTsbFitToSize.GetState();
448     if( eState != aTsbFitToSize.GetSavedValue() )
449     {
450         SdrFitToSizeType eFTS;
451         switch( eState )
452         {
453             default: ; //prevent warning
454                 DBG_ERROR( "svx::SvxTextAttrPage::FillItemSet(), unhandled state!" );
455             case STATE_NOCHECK: eFTS = SDRTEXTFIT_NONE; break;
456             //case STATE_CHECK: eFTS = SDRTEXTFIT_RESIZEATTR; break;
457             case STATE_CHECK: eFTS = SDRTEXTFIT_PROPORTIONAL; break;
458         }
459         rAttrs.Put( SdrTextFitToSizeTypeItem( eFTS ) );
460     }
461 
462     // zentriert
463     RECT_POINT eRP = aCtlPosition.GetActualRP();
464     SdrTextVertAdjust eTVA, eOldTVA;
465     SdrTextHorzAdjust eTHA, eOldTHA;
466 
467     switch( eRP )
468     {
469         default:
470         case RP_LT: eTVA = SDRTEXTVERTADJUST_TOP;
471                     eTHA = SDRTEXTHORZADJUST_LEFT; break;
472         case RP_LM: eTVA = SDRTEXTVERTADJUST_CENTER;
473                     eTHA = SDRTEXTHORZADJUST_LEFT; break;
474         case RP_LB: eTVA = SDRTEXTVERTADJUST_BOTTOM;
475                     eTHA = SDRTEXTHORZADJUST_LEFT; break;
476         case RP_MT: eTVA = SDRTEXTVERTADJUST_TOP;
477                     eTHA = SDRTEXTHORZADJUST_CENTER; break;
478         case RP_MM: eTVA = SDRTEXTVERTADJUST_CENTER;
479                     eTHA = SDRTEXTHORZADJUST_CENTER; break;
480         case RP_MB: eTVA = SDRTEXTVERTADJUST_BOTTOM;
481                     eTHA = SDRTEXTHORZADJUST_CENTER; break;
482         case RP_RT: eTVA = SDRTEXTVERTADJUST_TOP;
483                     eTHA = SDRTEXTHORZADJUST_RIGHT; break;
484         case RP_RM: eTVA = SDRTEXTVERTADJUST_CENTER;
485                     eTHA = SDRTEXTHORZADJUST_RIGHT; break;
486         case RP_RB: eTVA = SDRTEXTVERTADJUST_BOTTOM;
487                     eTHA = SDRTEXTHORZADJUST_RIGHT; break;
488     }
489 
490     // #103516# Do not change values if adjust controls were disabled.
491     sal_Bool bIsDisabled(aCtlPosition.IsCompletelyDisabled());
492 
493     if(!bIsDisabled)
494     {
495         if( aTsbFullWidth.GetState() == STATE_CHECK )
496         {
497             if (IsTextDirectionLeftToRight())
498                 eTHA = SDRTEXTHORZADJUST_BLOCK;
499             else
500                 eTVA = SDRTEXTVERTADJUST_BLOCK;
501         }
502 
503         if ( rOutAttrs.GetItemState( SDRATTR_TEXT_VERTADJUST ) != SFX_ITEM_DONTCARE )
504         {
505             eOldTVA = (SdrTextVertAdjust)
506                         ( ( const SdrTextVertAdjustItem& )rOutAttrs.Get( SDRATTR_TEXT_VERTADJUST ) ).GetValue();
507             if( eOldTVA != eTVA )
508                 rAttrs.Put( SdrTextVertAdjustItem( eTVA ) );
509         }
510         else
511             rAttrs.Put( SdrTextVertAdjustItem( eTVA ) );
512 
513         if ( rOutAttrs.GetItemState( SDRATTR_TEXT_HORZADJUST ) != SFX_ITEM_DONTCARE )
514         {
515             eOldTHA = (SdrTextHorzAdjust)
516                         ( ( const SdrTextHorzAdjustItem& )rOutAttrs.Get( SDRATTR_TEXT_HORZADJUST ) ).GetValue();
517             if( eOldTHA != eTHA )
518                 rAttrs.Put( SdrTextHorzAdjustItem( eTHA ) );
519         }
520         else
521             rAttrs.Put( SdrTextHorzAdjustItem( eTHA ) );
522     }
523 
524     return( sal_True );
525 }
526 
527 /*************************************************************************
528 |*
529 |*
530 |*
531 \************************************************************************/
532 
533 void SvxTextAttrPage::Construct()
534 {
535     DBG_ASSERT( pView, "Keine gueltige View Uebergeben!" );
536 
537     bFitToSizeEnabled = bContourEnabled = sal_True;
538     bWordWrapTextEnabled = bAutoGrowSizeEnabled = bAutoGrowWidthEnabled = bAutoGrowHeightEnabled = sal_False;
539 
540     const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
541     if( rMarkList.GetMarkCount() == 1 )
542     {
543         const SdrObject* pObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj();
544         SdrObjKind eKind = (SdrObjKind) pObj->GetObjIdentifier();
545         if( pObj->GetObjInventor() == SdrInventor )
546         {
547             switch( eKind )
548             {
549                 case OBJ_TEXT :
550                 case OBJ_TITLETEXT :
551                 case OBJ_OUTLINETEXT :
552                 case OBJ_CAPTION :
553                 {
554                     if ( ((SdrTextObj*)pObj)->HasText() )
555                     {
556                         // Konturfluss ist NICHT bei reinen Textobjekten m�glich
557                         bContourEnabled = sal_False;
558 
559                         // Breite und Hoehe anpassen ist NUR bei reinen Textobjekten m�glich
560                         bAutoGrowWidthEnabled = bAutoGrowHeightEnabled = sal_True;
561                     }
562                 }
563                 break;
564                 case OBJ_CUSTOMSHAPE :
565                 {
566                     bFitToSizeEnabled = bContourEnabled = sal_False;
567                     bAutoGrowSizeEnabled = sal_True;
568                     bWordWrapTextEnabled = sal_True;
569                 }
570                 break;
571                 default: ;//prevent warning
572             }
573         }
574     }
575     aTsbAutoGrowHeight.Enable( bAutoGrowHeightEnabled );
576     aTsbAutoGrowWidth.Enable( bAutoGrowWidthEnabled );
577     aTsbFitToSize.Enable( bFitToSizeEnabled );
578     aTsbContour.Enable( bContourEnabled );
579     aTsbAutoGrowSize.Enable( bAutoGrowSizeEnabled );
580     aTsbWordWrapText.Enable( bWordWrapTextEnabled );
581 }
582 
583 /*************************************************************************
584 |*
585 |* Erzeugt die Seite
586 |*
587 \************************************************************************/
588 
589 SfxTabPage* SvxTextAttrPage::Create( Window* pWindow,
590                 const SfxItemSet& rAttrs )
591 {
592     return( new SvxTextAttrPage( pWindow, rAttrs ) );
593 }
594 
595 /*************************************************************************
596 |*
597 |*
598 |*
599 \************************************************************************/
600 
601 sal_uInt16* SvxTextAttrPage::GetRanges()
602 {
603     return( pRanges );
604 }
605 
606 /*************************************************************************
607 |*
608 |*
609 |*
610 \************************************************************************/
611 
612 /** Check whether we have to uncheck the "Full width" check box.
613 */
614 void SvxTextAttrPage::PointChanged( Window*, RECT_POINT eRP )
615 {
616     if (aTsbFullWidth.GetState() == STATE_CHECK)
617     {
618         // Depending on write direction and currently checked anchor we have
619         // to uncheck the "full width" button.
620         if (IsTextDirectionLeftToRight())
621             switch( eRP )
622             {
623                 case RP_LT:
624                 case RP_LM:
625                 case RP_LB:
626                 case RP_RT:
627                 case RP_RM:
628                 case RP_RB:
629                     aTsbFullWidth.SetState( STATE_NOCHECK );
630                 break;
631                 default: ;//prevent warning
632             }
633         else
634             switch (eRP)
635             {
636                 case RP_LT:
637                 case RP_MT:
638                 case RP_RT:
639                 case RP_LB:
640                 case RP_MB:
641                 case RP_RB:
642                     aTsbFullWidth.SetState( STATE_NOCHECK );
643                 break;
644                 default: ;//prevent warning
645             }
646     }
647 }
648 
649 /*************************************************************************
650 |*
651 |* Aendert evtl. die Position des Positions-Controls
652 |*
653 \************************************************************************/
654 
655 /** When switching the "full width" check button on the text anchor may have
656     to be moved to a valid and adjacent position.  This position depends on
657     the current anchor position and the text writing direction.
658 */
659 IMPL_LINK( SvxTextAttrPage, ClickFullWidthHdl_Impl, void *, EMPTYARG )
660 {
661     if( aTsbFullWidth.GetState() == STATE_CHECK )
662     {
663         if (IsTextDirectionLeftToRight())
664         {
665             // Move text anchor to horizontal middle axis.
666             switch( aCtlPosition.GetActualRP() )
667             {
668                 case RP_LT:
669                 case RP_RT:
670                     aCtlPosition.SetActualRP( RP_MT );
671                     break;
672 
673                 case RP_LM:
674                 case RP_RM:
675                     aCtlPosition.SetActualRP( RP_MM );
676                     break;
677 
678                 case RP_LB:
679                 case RP_RB:
680                     aCtlPosition.SetActualRP( RP_MB );
681                     break;
682                 default: ;//prevent warning
683             }
684         }
685         else
686         {
687             // Move text anchor to vertical middle axis.
688             switch( aCtlPosition.GetActualRP() )
689             {
690                 case RP_LT:
691                 case RP_LB:
692                     aCtlPosition.SetActualRP( RP_LM );
693                     break;
694 
695                 case RP_MT:
696                 case RP_MB:
697                     aCtlPosition.SetActualRP( RP_MM );
698                     break;
699 
700                 case RP_RT:
701                 case RP_RB:
702                     aCtlPosition.SetActualRP( RP_RM );
703                 break;
704                 default: ;//prevent warning
705             }
706         }
707     }
708     return( 0L );
709 }
710 
711 /*************************************************************************
712 |*
713 |* Enabled/Disabled "Groesse an Text" oder "Am Rahmen Anpassen"
714 |*
715 \************************************************************************/
716 
717 IMPL_LINK( SvxTextAttrPage, ClickHdl_Impl, void *, EMPTYARG )
718 {
719     sal_Bool bAutoGrowWidth  = aTsbAutoGrowWidth.GetState() == STATE_CHECK;
720     sal_Bool bAutoGrowHeight = aTsbAutoGrowHeight.GetState() == STATE_CHECK;
721     sal_Bool bFitToSize      = aTsbFitToSize.GetState() == STATE_CHECK;
722     sal_Bool bContour        = aTsbContour.GetState() == STATE_CHECK;
723 
724     aTsbContour.Enable( !bFitToSize &&
725                         !( ( bAutoGrowWidth && bAutoGrowWidthEnabled ) || ( bAutoGrowHeight && bAutoGrowHeightEnabled ) ) &&
726                         bContourEnabled );
727 
728     aTsbAutoGrowWidth.Enable( !bFitToSize &&
729                               !( bContour && bContourEnabled ) &&
730                               bAutoGrowWidthEnabled );
731 
732     aTsbAutoGrowHeight.Enable( !bFitToSize &&
733                                !( bContour && bContourEnabled ) &&
734                                bAutoGrowHeightEnabled );
735 
736     aTsbFitToSize.Enable( !( ( bAutoGrowWidth && bAutoGrowWidthEnabled ) || ( bAutoGrowHeight && bAutoGrowHeightEnabled ) ) &&
737                           !( bContour && bContourEnabled ) &&
738                           bFitToSizeEnabled );
739 
740     // #101901# enable/disable metric fields and decorations dependent of contour
741     aMtrFldLeft.Enable(!bContour);
742     aMtrFldRight.Enable(!bContour);
743     aMtrFldTop.Enable(!bContour);
744     aMtrFldBottom.Enable(!bContour);
745     aFlDistance.Enable(!bContour);
746     aFtLeft.Enable(!bContour);
747     aFtRight.Enable(!bContour);
748     aFtTop.Enable(!bContour);
749     aFtBottom.Enable(!bContour);
750 
751     if( bContour && bContourEnabled )
752     {
753         aMtrFldLeft.SetValue( 0 );
754         aMtrFldRight.SetValue( 0 );
755         aMtrFldTop.SetValue( 0 );
756         aMtrFldBottom.SetValue( 0 );
757     }
758 
759     // #103516# Do the setup based on states of hor/ver adjust
760     SfxItemState eVState = rOutAttrs.GetItemState( SDRATTR_TEXT_VERTADJUST );
761     SfxItemState eHState = rOutAttrs.GetItemState( SDRATTR_TEXT_HORZADJUST );
762     sal_Bool bHorAndVer(SFX_ITEM_DONTCARE == eVState || SFX_ITEM_DONTCARE == eHState);
763 
764     // #83698# enable/disable text anchoring dependent of contour
765     aCtlPosition.Enable(!bContour && !bHorAndVer);
766     aTsbFullWidth.Enable(!bContour && !bHorAndVer);
767     aFlPosition.Enable(!bContour && !bHorAndVer);
768 
769     return( 0L );
770 }
771 
772 
773 bool SvxTextAttrPage::IsTextDirectionLeftToRight (void) const
774 {
775     // Determine the text writing direction with left to right as default.
776     bool bLeftToRightDirection = true;
777     SfxItemState eState = rOutAttrs.GetItemState(SDRATTR_TEXTDIRECTION);
778 
779     if(SFX_ITEM_DONTCARE != eState)
780     {
781         const SvxWritingModeItem& rItem = static_cast<const SvxWritingModeItem&> (
782             rOutAttrs.Get (SDRATTR_TEXTDIRECTION));
783         if (rItem.GetValue() == com::sun::star::text::WritingMode_TB_RL)
784             bLeftToRightDirection = false;
785     }
786     return bLeftToRightDirection;
787 }
788 
789 //add CHINA001 begin
790 void SvxTextAttrPage::PageCreated(SfxAllItemSet aSet)
791 {
792     SFX_ITEMSET_ARG (&aSet,pViewItem,OfaPtrItem,SID_SVXTEXTATTRPAGE_VIEW,sal_False);
793 
794     if (pViewItem)
795         SetView( static_cast<SdrView *>(pViewItem->GetValue()));
796 
797     Construct();
798 }
799 
800 //end of CHINA001
801