xref: /aoo41x/main/cui/source/tabpages/measure.cxx (revision cdf0e10c)
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