xref: /trunk/main/cui/source/tabpages/measure.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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 
36 #include <cuires.hrc>
37 
38 #define _SVX_MEASURE_CXX
39 
40 #include <svx/svdomeas.hxx>
41 #include <svx/svdattr.hxx>
42 #include <svx/svdattrx.hxx>
43 #include <svx/svdview.hxx>
44 #include <svx/dialogs.hrc>
45 #include <svx/dialmgr.hxx>
46 #include "svx/measctrl.hxx"
47 #include "measure.hxx"
48 #include "measure.hrc"
49 #include <dialmgr.hxx>
50 #include "svx/dlgutil.hxx"
51 #include <svx/strarray.hxx>
52 #include <sfx2/request.hxx> //add CHINA001
53 #include "svx/ofaitem.hxx" //add CHINA001
54 
55 static sal_uInt16 pRanges[] =
56 {
57     SDRATTR_MEASURE_FIRST,
58     SDRATTR_MEASURE_LAST,
59     0
60 };
61 
62 /*************************************************************************
63 |*
64 |* Dialog to change measure-attributes
65 |*
66 \************************************************************************/
67 
68 SvxMeasureDialog::SvxMeasureDialog( Window* pParent, const SfxItemSet& rInAttrs,
69                                 const SdrView* pSdrView ) :
70         SfxSingleTabDialog( pParent, rInAttrs, RID_SVXPAGE_MEASURE )
71 {
72     SvxMeasurePage* _pPage = new SvxMeasurePage( this, rInAttrs );
73 
74     _pPage->SetView( pSdrView );
75     _pPage->Construct();
76 
77     SetTabPage( _pPage );
78     SetText( _pPage->GetText() );
79 }
80 
81 /*************************************************************************
82 |*
83 |* Dtor
84 |*
85 \************************************************************************/
86 
87 SvxMeasureDialog::~SvxMeasureDialog()
88 {
89 }
90 
91 /*************************************************************************
92 |*
93 |* Tabpage for changing measure-attributes
94 |*
95 \************************************************************************/
96 
97 SvxMeasurePage::SvxMeasurePage( Window* pWindow, const SfxItemSet& rInAttrs ) :
98                 SvxTabPage      ( pWindow, CUI_RES( RID_SVXPAGE_MEASURE ),
99                                   rInAttrs ),
100 
101         aFlLine                 ( this, CUI_RES( FL_LINE ) ),
102         aFtLineDist             ( this, CUI_RES( FT_LINE_DIST ) ),
103         aMtrFldLineDist         ( this, CUI_RES( MTR_LINE_DIST ) ),
104         aFtHelplineOverhang     ( this, CUI_RES( FT_HELPLINE_OVERHANG ) ),
105         aMtrFldHelplineOverhang ( this, CUI_RES( MTR_FLD_HELPLINE_OVERHANG ) ),
106         aFtHelplineDist         ( this, CUI_RES( FT_HELPLINE_DIST ) ),
107         aMtrFldHelplineDist     ( this, CUI_RES( MTR_FLD_HELPLINE_DIST ) ),
108         aFtHelpline1Len         ( this, CUI_RES( FT_HELPLINE1_LEN ) ),
109         aMtrFldHelpline1Len     ( this, CUI_RES( MTR_FLD_HELPLINE1_LEN ) ),
110         aFtHelpline2Len         ( this, CUI_RES( FT_HELPLINE2_LEN ) ),
111         aMtrFldHelpline2Len     ( this, CUI_RES( MTR_FLD_HELPLINE2_LEN ) ),
112         aTsbBelowRefEdge        ( this, CUI_RES( TSB_BELOW_REF_EDGE ) ),
113         aFtDecimalPlaces        ( this, CUI_RES( FT_DECIMALPLACES ) ),
114         aMtrFldDecimalPlaces    ( this, CUI_RES( MTR_FLD_DECIMALPLACES ) ),
115 
116         aFlLabel                ( this, CUI_RES( FL_LABEL ) ),
117         aFtPosition             ( this, CUI_RES( FT_POSITION ) ),
118         aCtlPosition            ( this, CUI_RES( CTL_POSITION ) ),
119         aTsbAutoPosV            ( this, CUI_RES( TSB_AUTOPOSV ) ),
120         aTsbAutoPosH            ( this, CUI_RES( TSB_AUTOPOSH ) ),
121         aTsbShowUnit            ( this, CUI_RES( TSB_SHOW_UNIT ) ),
122         aLbUnit                 ( this, CUI_RES( LB_UNIT ) ),
123         aTsbParallel            ( this, CUI_RES( TSB_PARALLEL ) ),
124         aCtlPreview             ( this, CUI_RES( CTL_PREVIEW ), rInAttrs ),
125 
126         aFlVert                 ( this, CUI_RES( FL_VERT ) ),
127         rOutAttrs               ( rInAttrs ),
128         aAttrSet                ( *rInAttrs.GetPool() ),
129         pView( 0 ),
130 
131         bPositionModified       ( sal_False )
132 {
133     aCtlPreview.SetAccessibleName(aCtlPreview.GetHelpText());
134     FillUnitLB();
135 
136     FreeResource();
137 
138     const FieldUnit eFUnit = GetModuleFieldUnit( rInAttrs );
139     SetFieldUnit( aMtrFldLineDist, eFUnit );
140     SetFieldUnit( aMtrFldHelplineOverhang, eFUnit );
141     SetFieldUnit( aMtrFldHelplineDist, eFUnit );
142     SetFieldUnit( aMtrFldHelpline1Len, eFUnit );
143     SetFieldUnit( aMtrFldHelpline2Len, eFUnit );
144     if( eFUnit == FUNIT_MM )
145     {
146         aMtrFldLineDist.SetSpinSize( 50 );
147         aMtrFldHelplineOverhang.SetSpinSize( 50 );
148         aMtrFldHelplineDist.SetSpinSize( 50 );
149         aMtrFldHelpline1Len.SetSpinSize( 50 );
150         aMtrFldHelpline2Len.SetSpinSize( 50 );
151     }
152 
153     aTsbAutoPosV.SetClickHdl( LINK( this, SvxMeasurePage, ClickAutoPosHdl_Impl ) );
154     aTsbAutoPosH.SetClickHdl( LINK( this, SvxMeasurePage, ClickAutoPosHdl_Impl ) );
155 
156     // set background and border of iconchoicectrl
157     const StyleSettings& rStyles = Application::GetSettings().GetStyleSettings();
158     aCtlPreview.SetBackground ( rStyles.GetWindowColor() );
159     aCtlPreview.SetBorderStyle(WINDOW_BORDER_MONO);
160 
161     Link aLink( LINK( this, SvxMeasurePage, ChangeAttrHdl_Impl ) );
162     aMtrFldLineDist.SetModifyHdl( aLink );
163     aMtrFldHelplineOverhang.SetModifyHdl( aLink );
164     aMtrFldHelplineDist.SetModifyHdl( aLink );
165     aMtrFldHelpline1Len.SetModifyHdl( aLink );
166     aMtrFldHelpline2Len.SetModifyHdl( aLink );
167     aMtrFldDecimalPlaces.SetModifyHdl( aLink );
168     aTsbBelowRefEdge.SetClickHdl( aLink );
169     aTsbParallel.SetClickHdl( aLink );
170     aTsbShowUnit.SetClickHdl( aLink );
171     aLbUnit.SetSelectHdl( aLink );
172     aLbUnit.SetAccessibleName(GetNonMnemonicString(aTsbShowUnit.GetText()));
173     aCtlPosition.SetAccessibleRelationMemberOf( &aFlLabel );
174     aLbUnit.SetAccessibleRelationLabeledBy( &aTsbShowUnit );
175 }
176 
177 /*************************************************************************
178 |*
179 |* Dtor
180 |*
181 \************************************************************************/
182 
183 SvxMeasurePage::~SvxMeasurePage()
184 {
185 }
186 
187 /*************************************************************************
188 |*
189 |* read the delivered Item-Set
190 |*
191 \************************************************************************/
192 
193 void __EXPORT SvxMeasurePage::Reset( const SfxItemSet& rAttrs )
194 {
195     SfxItemPool* pPool = rAttrs.GetPool();
196     DBG_ASSERT( pPool, "Wo ist der Pool" );
197     eUnit = pPool->GetMetric( SDRATTR_MEASURELINEDIST );
198 
199     const SfxPoolItem* pItem = GetItem( rAttrs, SDRATTR_MEASURELINEDIST );
200 
201     // SdrMeasureLineDistItem
202     if( pItem == NULL )
203         pItem = &pPool->GetDefaultItem( SDRATTR_MEASURELINEDIST );
204     if( pItem )
205     {
206         long nValue = ( ( const SdrMeasureLineDistItem* )pItem )->GetValue();
207         SetMetricValue( aMtrFldLineDist, nValue, eUnit );
208     }
209     else
210     {
211         aMtrFldLineDist.SetText( String() );
212     }
213     aMtrFldLineDist.SaveValue();
214 
215     // SdrMeasureHelplineOverhangItem
216     pItem = GetItem( rAttrs, SDRATTR_MEASUREHELPLINEOVERHANG );
217     if( pItem == NULL )
218         pItem = &pPool->GetDefaultItem( SDRATTR_MEASUREHELPLINEOVERHANG );
219     if( pItem )
220     {
221         long nValue = ( ( const SdrMeasureHelplineOverhangItem* )pItem )->GetValue();
222         SetMetricValue( aMtrFldHelplineOverhang, nValue, eUnit );
223     }
224     else
225     {
226         aMtrFldHelplineOverhang.SetText( String() );
227     }
228     aMtrFldHelplineOverhang.SaveValue();
229 
230     // SdrMeasureHelplineDistItem
231     pItem = GetItem( rAttrs, SDRATTR_MEASUREHELPLINEDIST );
232     if( pItem == NULL )
233         pItem = &pPool->GetDefaultItem( SDRATTR_MEASUREHELPLINEDIST );
234     if( pItem )
235     {
236         long nValue = ( ( const SdrMeasureHelplineDistItem* )pItem )->GetValue();
237         SetMetricValue( aMtrFldHelplineDist, nValue, eUnit );
238     }
239     else
240     {
241         aMtrFldHelplineDist.SetText( String() );
242     }
243     aMtrFldHelplineDist.SaveValue();
244 
245     // SdrMeasureHelpline1LenItem
246     pItem = GetItem( rAttrs, SDRATTR_MEASUREHELPLINE1LEN );
247     if( pItem == NULL )
248         pItem = &pPool->GetDefaultItem( SDRATTR_MEASUREHELPLINE1LEN );
249     if( pItem )
250     {
251         long nValue = ( ( const SdrMeasureHelpline1LenItem* )pItem )->GetValue();
252         SetMetricValue( aMtrFldHelpline1Len, nValue, eUnit );
253     }
254     else
255     {
256         aMtrFldHelpline1Len.SetText( String() );
257     }
258     aMtrFldHelpline1Len.SaveValue();
259 
260     // SdrMeasureHelpline2LenItem
261     pItem = GetItem( rAttrs, SDRATTR_MEASUREHELPLINE2LEN );
262     if( pItem == NULL )
263         pItem = &pPool->GetDefaultItem( SDRATTR_MEASUREHELPLINE2LEN );
264     if( pItem )
265     {
266         long nValue = ( ( const SdrMeasureHelpline2LenItem* )pItem )->GetValue();
267         SetMetricValue( aMtrFldHelpline2Len, nValue, eUnit );
268     }
269     else
270     {
271         aMtrFldHelpline2Len.SetText( String() );
272     }
273     aMtrFldHelpline2Len.SaveValue();
274 
275     // SdrMeasureBelowRefEdgeItem
276     if( rAttrs.GetItemState( SDRATTR_MEASUREBELOWREFEDGE ) != SFX_ITEM_DONTCARE )
277     {
278         aTsbBelowRefEdge.SetState( ( ( const SdrMeasureBelowRefEdgeItem& )rAttrs.Get( SDRATTR_MEASUREBELOWREFEDGE ) ).
279                         GetValue() ? STATE_CHECK : STATE_NOCHECK );
280         aTsbBelowRefEdge.EnableTriState( sal_False );
281     }
282     else
283     {
284         aTsbBelowRefEdge.SetState( STATE_DONTKNOW );
285     }
286     aTsbBelowRefEdge.SaveValue();
287 
288     // SdrMeasureDecimalPlacesItem
289     pItem = GetItem( rAttrs, SDRATTR_MEASUREDECIMALPLACES );
290     if( pItem == NULL )
291         pItem = &pPool->GetDefaultItem( SDRATTR_MEASUREDECIMALPLACES );
292     if( pItem )
293     {
294         sal_Int16 nValue = ( ( const SdrMeasureDecimalPlacesItem* )pItem )->GetValue();
295         aMtrFldDecimalPlaces.SetValue( nValue );
296     }
297     else
298     {
299         aMtrFldDecimalPlaces.SetText( String() );
300     }
301     aMtrFldDecimalPlaces.SaveValue();
302 
303     // SdrMeasureTextRota90Item
304     // Attention: negate !
305     if( rAttrs.GetItemState( SDRATTR_MEASURETEXTROTA90 ) != SFX_ITEM_DONTCARE )
306     {
307         aTsbParallel.SetState( ( ( const SdrMeasureTextRota90Item& )rAttrs.Get( SDRATTR_MEASURETEXTROTA90 ) ).
308                         GetValue() ? STATE_NOCHECK : STATE_CHECK );
309         aTsbParallel.EnableTriState( sal_False );
310     }
311     else
312     {
313         aTsbParallel.SetState( STATE_DONTKNOW );
314     }
315     aTsbParallel.SaveValue();
316 
317     // SdrMeasureShowUnitItem
318     if( rAttrs.GetItemState( SDRATTR_MEASURESHOWUNIT ) != SFX_ITEM_DONTCARE )
319     {
320         aTsbShowUnit.SetState( ( ( const SdrMeasureShowUnitItem& )rAttrs.Get( SDRATTR_MEASURESHOWUNIT ) ).
321                         GetValue() ? STATE_CHECK : STATE_NOCHECK );
322         aTsbShowUnit.EnableTriState( sal_False );
323     }
324     else
325     {
326         aTsbShowUnit.SetState( STATE_DONTKNOW );
327     }
328     aTsbShowUnit.SaveValue();
329 
330     // SdrMeasureUnitItem
331     if( rAttrs.GetItemState( SDRATTR_MEASUREUNIT ) != SFX_ITEM_DONTCARE )
332     {
333         long nFieldUnit = (long) ( ( const SdrMeasureUnitItem& )rAttrs.
334                                     Get( SDRATTR_MEASUREUNIT ) ).GetValue();
335 
336         for( sal_uInt16 i = 0; i < aLbUnit.GetEntryCount(); ++i )
337         {
338             if ( (long)aLbUnit.GetEntryData( i ) == nFieldUnit )
339             {
340                 aLbUnit.SelectEntryPos( i );
341                 break;
342             }
343         }
344     }
345     else
346     {
347         aLbUnit.SetNoSelection();
348     }
349     aLbUnit.SaveValue();
350 
351     // Position
352     if ( rAttrs.GetItemState( SDRATTR_MEASURETEXTVPOS ) != SFX_ITEM_DONTCARE )
353     {
354         SdrMeasureTextVPos eVPos = (SdrMeasureTextVPos)
355                     ( ( const SdrMeasureTextVPosItem& )rAttrs.Get( SDRATTR_MEASURETEXTVPOS ) ).GetValue();
356         {
357             if ( rAttrs.GetItemState( SDRATTR_MEASURETEXTHPOS ) != SFX_ITEM_DONTCARE )
358             {
359                 aTsbAutoPosV.EnableTriState( sal_False );
360                 aTsbAutoPosH.EnableTriState( sal_False );
361 
362                 SdrMeasureTextHPos eHPos = (SdrMeasureTextHPos)
363                             ( ( const SdrMeasureTextHPosItem& )rAttrs.Get( SDRATTR_MEASURETEXTHPOS ) ).GetValue();
364                 RECT_POINT eRP = RP_MM;
365                 switch( eVPos )
366                 {
367                 case SDRMEASURE_ABOVE:
368                     switch( eHPos )
369                     {
370                     case SDRMEASURE_TEXTLEFTOUTSIDE:    eRP = RP_LT; break;
371                     case SDRMEASURE_TEXTINSIDE:         eRP = RP_MT; break;
372                     case SDRMEASURE_TEXTRIGHTOUTSIDE:   eRP = RP_RT; break;
373                     case SDRMEASURE_TEXTHAUTO:          eRP = RP_MT; break;
374                     }
375                     break;
376                 case SDRMEASURETEXT_VERTICALCENTERED:
377                     switch( eHPos )
378                     {
379                     case SDRMEASURE_TEXTLEFTOUTSIDE:    eRP = RP_LM; break;
380                     case SDRMEASURE_TEXTINSIDE:         eRP = RP_MM; break;
381                     case SDRMEASURE_TEXTRIGHTOUTSIDE:   eRP = RP_RM; break;
382                     case SDRMEASURE_TEXTHAUTO:          eRP = RP_MM; break;
383                     }
384                     break;
385                 case SDRMEASURE_BELOW:
386                     switch( eHPos )
387                     {
388                     case SDRMEASURE_TEXTLEFTOUTSIDE:    eRP = RP_LB; break;
389                     case SDRMEASURE_TEXTINSIDE:         eRP = RP_MB; break;
390                     case SDRMEASURE_TEXTRIGHTOUTSIDE:   eRP = RP_RB; break;
391                     case SDRMEASURE_TEXTHAUTO:          eRP = RP_MB; break;
392                     }
393                     break;
394                 case SDRMEASURE_TEXTVAUTO:
395                     switch( eHPos )
396                     {
397                     case SDRMEASURE_TEXTLEFTOUTSIDE:    eRP = RP_LM; break;
398                     case SDRMEASURE_TEXTINSIDE:         eRP = RP_MM; break;
399                     case SDRMEASURE_TEXTRIGHTOUTSIDE:   eRP = RP_RM; break;
400                     case SDRMEASURE_TEXTHAUTO:          eRP = RP_MM; break;
401                     }
402                     break;
403                  default: ;//prevent warning
404                 }
405 
406                 CTL_STATE nState = 0;
407 
408                 if( eHPos == SDRMEASURE_TEXTHAUTO )
409                 {
410                     aTsbAutoPosH.SetState( STATE_CHECK );
411                     nState = CS_NOHORZ;
412                 }
413 
414                 if( eVPos == SDRMEASURE_TEXTVAUTO )
415                 {
416                     aTsbAutoPosV.SetState( STATE_CHECK );
417                     nState |= CS_NOVERT;
418                 }
419 
420                 aCtlPosition.SetState( nState );
421                 aCtlPosition.SetActualRP( eRP );
422             }
423         }
424     }
425     else
426     {
427         aCtlPosition.Reset();
428         aTsbAutoPosV.SetState( STATE_DONTKNOW );
429         aTsbAutoPosH.SetState( STATE_DONTKNOW );
430     }
431 
432     // put the attributes to the preview-control,
433     // otherwise the control don't know about
434     // the settings of the dialog (#67930)
435     ChangeAttrHdl_Impl( &aTsbShowUnit );
436     aCtlPreview.SetAttributes( rAttrs );
437 
438     bPositionModified = sal_False;
439 }
440 
441 /*************************************************************************
442 |*
443 |* Fill the delivered Item-Set with dialogbox-attributes
444 |*
445 \************************************************************************/
446 
447 sal_Bool SvxMeasurePage::FillItemSet( SfxItemSet& rAttrs)
448 {
449     sal_Bool     bModified = sal_False;
450     sal_Int32    nValue;
451     TriState eState;
452 
453     if( aMtrFldLineDist.GetText() != aMtrFldLineDist.GetSavedValue() )
454     {
455         nValue = GetCoreValue( aMtrFldLineDist, eUnit );
456         rAttrs.Put( SdrMeasureLineDistItem( nValue ) );
457         bModified = sal_True;
458     }
459 
460     if( aMtrFldHelplineOverhang.GetText() != aMtrFldHelplineOverhang.GetSavedValue() )
461     {
462         nValue = GetCoreValue( aMtrFldHelplineOverhang, eUnit );
463         rAttrs.Put( SdrMeasureHelplineOverhangItem( nValue ) );
464         bModified = sal_True;
465     }
466 
467     if( aMtrFldHelplineDist.GetText() != aMtrFldHelplineDist.GetSavedValue() )
468     {
469         nValue = GetCoreValue( aMtrFldHelplineDist, eUnit );
470         rAttrs.Put( SdrMeasureHelplineDistItem( nValue ) );
471         bModified = sal_True;
472     }
473 
474     if( aMtrFldHelpline1Len.GetText() != aMtrFldHelpline1Len.GetSavedValue() )
475     {
476         nValue = GetCoreValue( aMtrFldHelpline1Len, eUnit );
477         rAttrs.Put( SdrMeasureHelpline1LenItem( nValue ) );
478         bModified = sal_True;
479     }
480 
481     if( aMtrFldHelpline2Len.GetText() != aMtrFldHelpline2Len.GetSavedValue() )
482     {
483         nValue = GetCoreValue( aMtrFldHelpline2Len, eUnit );
484         rAttrs.Put( SdrMeasureHelpline2LenItem( nValue ) );
485         bModified = sal_True;
486     }
487 
488     eState = aTsbBelowRefEdge.GetState();
489     if( eState != aTsbBelowRefEdge.GetSavedValue() )
490     {
491         rAttrs.Put( SdrMeasureBelowRefEdgeItem( (sal_Bool) STATE_CHECK == eState ) );
492         bModified = sal_True;
493     }
494 
495     if( aMtrFldDecimalPlaces.GetText() != aMtrFldDecimalPlaces.GetSavedValue() )
496     {
497         nValue = static_cast<sal_Int32>(aMtrFldDecimalPlaces.GetValue());
498         rAttrs.Put(
499             SdrMeasureDecimalPlacesItem(
500                 sal::static_int_cast< sal_Int16 >( nValue ) ) );
501         bModified = sal_True;
502     }
503 
504     eState = aTsbParallel.GetState();
505     if( eState != aTsbParallel.GetSavedValue() )
506     {
507         rAttrs.Put( SdrMeasureTextRota90Item( (sal_Bool) STATE_NOCHECK == eState ) );
508         bModified = sal_True;
509     }
510 
511     eState = aTsbShowUnit.GetState();
512     if( eState != aTsbShowUnit.GetSavedValue() )
513     {
514         rAttrs.Put( SdrMeasureShowUnitItem( (sal_Bool) STATE_CHECK == eState ) );
515         bModified = sal_True;
516     }
517 
518     sal_uInt16 nPos = aLbUnit.GetSelectEntryPos();
519     if( nPos != aLbUnit.GetSavedValue() )
520     {
521         if( nPos != LISTBOX_ENTRY_NOTFOUND )
522         {
523             sal_uInt16 nFieldUnit = (sal_uInt16)(long)aLbUnit.GetEntryData( nPos );
524             FieldUnit _eUnit = (FieldUnit) nFieldUnit;
525             rAttrs.Put( SdrMeasureUnitItem( _eUnit ) );
526             bModified = sal_True;
527         }
528     }
529 
530 //enum SdrMeasureTextHPos {SDRMEASURE_TEXTHAUTO,SDRMEASURE_TEXTLEFTOUTSIDE,SDRMEASURE_TEXTINSIDE,SDRMEASURE_TEXTRIGHTOUTSIDE};
531 //enum SdrMeasureTextVPos {SDRMEASURE_TEXTVAUTO,SDRMEASURE_ABOVE,SDRMEASURETEXT_VERTICALCENTERED,SDRMEASURE_BELOW};
532 
533     if( bPositionModified )
534     {
535         // Position
536         SdrMeasureTextVPos eVPos, eOldVPos;
537         SdrMeasureTextHPos eHPos, eOldHPos;
538 
539         RECT_POINT eRP = aCtlPosition.GetActualRP();
540         switch( eRP )
541         {
542             default:
543             case RP_LT: eVPos = SDRMEASURE_ABOVE;
544                         eHPos = SDRMEASURE_TEXTLEFTOUTSIDE; break;
545             case RP_LM: eVPos = SDRMEASURETEXT_VERTICALCENTERED;
546                         eHPos = SDRMEASURE_TEXTLEFTOUTSIDE; break;
547             case RP_LB: eVPos = SDRMEASURE_BELOW;
548                         eHPos = SDRMEASURE_TEXTLEFTOUTSIDE; break;
549             case RP_MT: eVPos = SDRMEASURE_ABOVE;
550                         eHPos = SDRMEASURE_TEXTINSIDE; break;
551             case RP_MM: eVPos = SDRMEASURETEXT_VERTICALCENTERED;
552                         eHPos = SDRMEASURE_TEXTINSIDE; break;
553             case RP_MB: eVPos = SDRMEASURE_BELOW;
554                         eHPos = SDRMEASURE_TEXTINSIDE; break;
555             case RP_RT: eVPos = SDRMEASURE_ABOVE;
556                         eHPos = SDRMEASURE_TEXTRIGHTOUTSIDE; break;
557             case RP_RM: eVPos = SDRMEASURETEXT_VERTICALCENTERED;
558                         eHPos = SDRMEASURE_TEXTRIGHTOUTSIDE; break;
559             case RP_RB: eVPos = SDRMEASURE_BELOW;
560                         eHPos = SDRMEASURE_TEXTRIGHTOUTSIDE; break;
561         }
562         if( aTsbAutoPosH.GetState() == STATE_CHECK )
563             eHPos = SDRMEASURE_TEXTHAUTO;
564 
565         if( aTsbAutoPosV.GetState() == STATE_CHECK )
566             eVPos = SDRMEASURE_TEXTVAUTO;
567 
568         if ( rAttrs.GetItemState( SDRATTR_MEASURETEXTVPOS ) != SFX_ITEM_DONTCARE )
569         {
570             eOldVPos = (SdrMeasureTextVPos)
571                         ( ( const SdrMeasureTextVPosItem& )rOutAttrs.Get( SDRATTR_MEASURETEXTVPOS ) ).GetValue();
572             if( eOldVPos != eVPos )
573             {
574                 rAttrs.Put( SdrMeasureTextVPosItem( eVPos ) );
575                 bModified = sal_True;
576             }
577         }
578         else
579         {
580             rAttrs.Put( SdrMeasureTextVPosItem( eVPos ) );
581             bModified = sal_True;
582         }
583 
584         if ( rAttrs.GetItemState( SDRATTR_MEASURETEXTHPOS ) != SFX_ITEM_DONTCARE )
585         {
586             eOldHPos = (SdrMeasureTextHPos)
587                         ( ( const SdrMeasureTextHPosItem& )rOutAttrs.Get( SDRATTR_MEASURETEXTHPOS ) ).GetValue();
588             if( eOldHPos != eHPos )
589             {
590                 rAttrs.Put( SdrMeasureTextHPosItem( eHPos ) );
591                 bModified = sal_True;
592             }
593         }
594         else
595         {
596             rAttrs.Put( SdrMeasureTextHPosItem( eHPos ) );
597             bModified = sal_True;
598         }
599     }
600 
601     return( bModified );
602 }
603 
604 /*************************************************************************
605 |*
606 |* The View have to set at the measure-object to be able to notify
607 |* unit and floatingpoint-values
608 |*
609 \************************************************************************/
610 
611 void SvxMeasurePage::Construct()
612 {
613     DBG_ASSERT( pView, "Keine gueltige View Uebergeben!" );
614 
615     aCtlPreview.pMeasureObj->SetModel( pView->GetModel() );
616     aCtlPreview.Invalidate();
617 }
618 
619 /*************************************************************************
620 |*
621 |* create the tabpage
622 |*
623 \************************************************************************/
624 
625 SfxTabPage* SvxMeasurePage::Create( Window* pWindow,
626                 const SfxItemSet& rAttrs )
627 {
628     return( new SvxMeasurePage( pWindow, rAttrs ) );
629 }
630 
631 /*************************************************************************
632 |*
633 |*
634 |*
635 \************************************************************************/
636 
637 sal_uInt16* SvxMeasurePage::GetRanges()
638 {
639     return( pRanges );
640 }
641 
642 /*************************************************************************
643 |*
644 |*
645 |*
646 \************************************************************************/
647 
648 void SvxMeasurePage::PointChanged( Window* pWindow, RECT_POINT /*eRP*/ )
649 {
650     ChangeAttrHdl_Impl( pWindow );
651 }
652 
653 /*************************************************************************
654 |*
655 |*
656 |*
657 \************************************************************************/
658 
659 IMPL_LINK( SvxMeasurePage, ClickAutoPosHdl_Impl, void *, p )
660 {
661     if( aTsbAutoPosH.GetState() == STATE_CHECK )
662     {
663         switch( aCtlPosition.GetActualRP() )
664         {
665             case RP_LT:
666             case RP_RT:
667                 aCtlPosition.SetActualRP( RP_MT );
668             break;
669 
670             case RP_LM:
671             case RP_RM:
672                 aCtlPosition.SetActualRP( RP_MM );
673             break;
674 
675             case RP_LB:
676             case RP_RB:
677                 aCtlPosition.SetActualRP( RP_MB );
678             break;
679             default: ;//prevent warning
680         }
681     }
682     if( aTsbAutoPosV.GetState() == STATE_CHECK )
683     {
684         switch( aCtlPosition.GetActualRP() )
685         {
686             case RP_LT:
687             case RP_LB:
688                 aCtlPosition.SetActualRP( RP_LM );
689             break;
690 
691             case RP_MT:
692             case RP_MB:
693                 aCtlPosition.SetActualRP( RP_MM );
694             break;
695 
696             case RP_RT:
697             case RP_RB:
698                 aCtlPosition.SetActualRP( RP_RM );
699             break;
700             default: ;//prevent warning
701         }
702     }
703     ChangeAttrHdl_Impl( p );
704 
705     return( 0L );
706 }
707 
708 /*************************************************************************
709 |*
710 |*
711 |*
712 \************************************************************************/
713 
714 IMPL_LINK( SvxMeasurePage, ChangeAttrHdl_Impl, void *, p )
715 {
716 
717     if( p == &aMtrFldLineDist )
718     {
719         sal_Int32 nValue = GetCoreValue( aMtrFldLineDist, eUnit );
720         aAttrSet.Put( SdrMeasureLineDistItem( nValue ) );
721     }
722 
723     if( p == &aMtrFldHelplineOverhang )
724     {
725         sal_Int32 nValue = GetCoreValue( aMtrFldHelplineOverhang, eUnit );
726         aAttrSet.Put( SdrMeasureHelplineOverhangItem( nValue) );
727     }
728 
729     if( p == &aMtrFldHelplineDist )
730     {
731         sal_Int32 nValue = GetCoreValue( aMtrFldHelplineDist, eUnit );
732         aAttrSet.Put( SdrMeasureHelplineDistItem( nValue) );
733     }
734 
735     if( p == &aMtrFldHelpline1Len )
736     {
737         sal_Int32 nValue = GetCoreValue( aMtrFldHelpline1Len, eUnit );
738         aAttrSet.Put( SdrMeasureHelpline1LenItem( nValue ) );
739     }
740 
741     if( p == &aMtrFldHelpline2Len )
742     {
743         sal_Int32 nValue = GetCoreValue( aMtrFldHelpline2Len, eUnit );
744         aAttrSet.Put( SdrMeasureHelpline2LenItem( nValue ) );
745     }
746 
747     if( p == &aTsbBelowRefEdge )
748     {
749         TriState eState = aTsbBelowRefEdge.GetState();
750         if( eState != STATE_DONTKNOW )
751             aAttrSet.Put( SdrMeasureBelowRefEdgeItem( (sal_Bool) STATE_CHECK == eState ) );
752     }
753 
754     if( p == &aMtrFldDecimalPlaces )
755     {
756         sal_Int16 nValue = sal::static_int_cast< sal_Int16 >(
757             aMtrFldDecimalPlaces.GetValue() );
758         aAttrSet.Put( SdrMeasureDecimalPlacesItem( nValue ) );
759     }
760 
761     if( p == &aTsbParallel )
762     {
763         TriState eState = aTsbParallel.GetState();
764         if( eState != STATE_DONTKNOW )
765             aAttrSet.Put( SdrMeasureTextRota90Item( (sal_Bool) !STATE_CHECK == eState ) );
766     }
767 
768     if( p == &aTsbShowUnit )
769     {
770         TriState eState = aTsbShowUnit.GetState();
771         if( eState != STATE_DONTKNOW )
772             aAttrSet.Put( SdrMeasureShowUnitItem( (sal_Bool) STATE_CHECK == eState ) );
773     }
774 
775     if( p == &aLbUnit )
776     {
777         sal_uInt16 nPos = aLbUnit.GetSelectEntryPos();
778         if( nPos != LISTBOX_ENTRY_NOTFOUND )
779         {
780             sal_uInt16 nFieldUnit = (sal_uInt16)(long)aLbUnit.GetEntryData( nPos );
781             FieldUnit _eUnit = (FieldUnit) nFieldUnit;
782             aAttrSet.Put( SdrMeasureUnitItem( _eUnit ) );
783         }
784     }
785 
786     if( p == &aTsbAutoPosV || p == &aTsbAutoPosH || p == &aCtlPosition )
787     {
788         bPositionModified = sal_True;
789 
790         // Position
791         RECT_POINT eRP = aCtlPosition.GetActualRP();
792         SdrMeasureTextVPos eVPos;
793         SdrMeasureTextHPos eHPos;
794 
795         switch( eRP )
796         {
797             default:
798             case RP_LT: eVPos = SDRMEASURE_ABOVE;
799                         eHPos = SDRMEASURE_TEXTLEFTOUTSIDE; break;
800             case RP_LM: eVPos = SDRMEASURETEXT_VERTICALCENTERED;
801                         eHPos = SDRMEASURE_TEXTLEFTOUTSIDE; break;
802             case RP_LB: eVPos = SDRMEASURE_BELOW;
803                         eHPos = SDRMEASURE_TEXTLEFTOUTSIDE; break;
804             case RP_MT: eVPos = SDRMEASURE_ABOVE;
805                         eHPos = SDRMEASURE_TEXTINSIDE; break;
806             case RP_MM: eVPos = SDRMEASURETEXT_VERTICALCENTERED;
807                         eHPos = SDRMEASURE_TEXTINSIDE; break;
808             case RP_MB: eVPos = SDRMEASURE_BELOW;
809                         eHPos = SDRMEASURE_TEXTINSIDE; break;
810             case RP_RT: eVPos = SDRMEASURE_ABOVE;
811                         eHPos = SDRMEASURE_TEXTRIGHTOUTSIDE; break;
812             case RP_RM: eVPos = SDRMEASURETEXT_VERTICALCENTERED;
813                         eHPos = SDRMEASURE_TEXTRIGHTOUTSIDE; break;
814             case RP_RB: eVPos = SDRMEASURE_BELOW;
815                         eHPos = SDRMEASURE_TEXTRIGHTOUTSIDE; break;
816         }
817 
818         CTL_STATE nState = 0;
819 
820         if( aTsbAutoPosH.GetState() == STATE_CHECK )
821         {
822             eHPos = SDRMEASURE_TEXTHAUTO;
823             nState = CS_NOHORZ;
824         }
825 
826         if( aTsbAutoPosV.GetState() == STATE_CHECK )
827         {
828             eVPos = SDRMEASURE_TEXTVAUTO;
829             nState |= CS_NOVERT;
830         }
831 
832         if( p == &aTsbAutoPosV || p == &aTsbAutoPosH )
833             aCtlPosition.SetState( nState );
834 
835         aAttrSet.Put( SdrMeasureTextVPosItem( eVPos ) );
836         aAttrSet.Put( SdrMeasureTextHPosItem( eHPos ) );
837     }
838 
839     aCtlPreview.SetAttributes( aAttrSet );
840     aCtlPreview.Invalidate();
841 
842     return( 0L );
843 }
844 
845 /*************************************************************************
846 |*
847 |*
848 |*
849 \************************************************************************/
850 
851 void SvxMeasurePage::FillUnitLB()
852 {
853     // fill ListBox with metrics
854     SvxStringArray aMetricArr( SVX_RES( RID_SVXSTR_FIELDUNIT_TABLE ) );
855 
856     long nUnit = FUNIT_NONE;
857     String aStrMetric( CUI_RES( STR_MEASURE_AUTOMATIC ) );
858     sal_uInt16 nPos = aLbUnit.InsertEntry( aStrMetric );
859     aLbUnit.SetEntryData( nPos, (void*)nUnit );
860 
861     for( sal_uInt16 i = 0; i < aMetricArr.Count(); ++i )
862     {
863         aStrMetric = aMetricArr.GetStringByPos( i );
864         nUnit = aMetricArr.GetValue( i );
865         nPos = aLbUnit.InsertEntry( aStrMetric );
866         aLbUnit.SetEntryData( nPos, (void*)nUnit );
867     }
868 }
869 void SvxMeasurePage::PageCreated (SfxAllItemSet aSet) //add CHINA001
870 {
871     SFX_ITEMSET_ARG (&aSet,pOfaPtrItem,OfaPtrItem,SID_OBJECT_LIST,sal_False);
872 
873     if (pOfaPtrItem)
874         SetView( static_cast<SdrView *>(pOfaPtrItem->GetValue()));
875 
876     Construct();
877 }
878 
879