xref: /trunk/main/cui/source/tabpages/paragrph.cxx (revision 2ee96f1c)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_cui.hxx"
26 
27 #include <svl/style.hxx>
28 #include <sfx2/app.hxx>
29 #include <sfx2/objsh.hxx>
30 #include <sfx2/module.hxx>
31 #include <vcl/mnemonic.hxx>
32 #include <svx/dialogs.hrc>
33 
34 #define _SVX_PARAGRPH_CXX   0
35 
36 #include <svl/languageoptions.hxx>
37 #include <editeng/pgrditem.hxx>
38 #include <cuires.hrc>
39 #include "paragrph.hrc"
40 #include "paragrph.hxx"
41 #include <editeng/frmdiritem.hxx>
42 #include <editeng/lspcitem.hxx>
43 #include <editeng/adjitem.hxx>
44 #include <editeng/orphitem.hxx>
45 #include <editeng/widwitem.hxx>
46 #include <editeng/tstpitem.hxx>
47 #include <editeng/pmdlitem.hxx>
48 #include <editeng/spltitem.hxx>
49 #include <editeng/hyznitem.hxx>
50 #include <editeng/ulspitem.hxx>
51 #include <editeng/lrspitem.hxx>
52 #include <editeng/brkitem.hxx>
53 #include <editeng/keepitem.hxx>
54 #include "svx/dlgutil.hxx"
55 #include <dialmgr.hxx>
56 #include "svx/htmlmode.hxx"
57 #include <editeng/paravertalignitem.hxx>
58 #include <svl/eitem.hxx> //add CHINA001
59 #include <sfx2/request.hxx> //add CHINA001
60 #include <svl/intitem.hxx> //add CHINA001
61 
62 // static ----------------------------------------------------------------
63 
64 static sal_uInt16 pStdRanges[] =
65 {
66 	SID_ATTR_PARA_LINESPACE,		// 10033
67 	SID_ATTR_PARA_LINESPACE,
68 	SID_ATTR_LRSPACE,				// 10048 -
69 	SID_ATTR_ULSPACE,				// 10049
70 	SID_ATTR_PARA_REGISTER,			// 10413
71 	SID_ATTR_PARA_REGISTER,
72 	0
73 };
74 
75 static sal_uInt16 pAlignRanges[] =
76 {
77 	SID_ATTR_PARA_ADJUST,			// 10027
78 	SID_ATTR_PARA_ADJUST,
79 	0
80 };
81 
82 static sal_uInt16 pExtRanges[] =
83 {
84 	SID_ATTR_PARA_PAGEBREAK,		// 10037 -
85 	SID_ATTR_PARA_WIDOWS,			// 10041
86 	SID_ATTR_PARA_MODEL,			// 10065 -
87 	SID_ATTR_PARA_KEEP,				// 10066
88 	0
89 };
90 
91 // define ----------------------------------------------------------------
92 
93 #define MAX_DURCH 5670      // 10 cm ist sinnvoll als maximaler Durchschuss
94 							// laut BP
95 #define FIX_DIST_DEF 283    // Standard-Fix-Abstand 0,5cm
96 
97 // enum ------------------------------------------------------------------
98 
99 enum LineSpaceList
100 {
101 	LLINESPACE_1    = 0,
102 	LLINESPACE_15   = 1,
103 	LLINESPACE_2    = 2,
104 	LLINESPACE_PROP = 3,
105 	LLINESPACE_MIN  = 4,
106 	LLINESPACE_DURCH= 5,
107 	LLINESPACE_FIX 	= 6,
108 	LLINESPACE_END
109 };
110 
111 // C-Funktion ------------------------------------------------------------
112 
113 void SetLineSpace_Impl( SvxLineSpacingItem&, int, long lValue = 0 );
114 
SetLineSpace_Impl(SvxLineSpacingItem & rLineSpace,int eSpace,long lValue)115 void SetLineSpace_Impl( SvxLineSpacingItem& rLineSpace,
116 						int eSpace, long lValue )
117 {
118 	switch ( eSpace )
119 	{
120 		case LLINESPACE_1:
121 			rLineSpace.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
122 			rLineSpace.GetInterLineSpaceRule() = SVX_INTER_LINE_SPACE_OFF;
123 			break;
124 
125 		case LLINESPACE_15:
126 			rLineSpace.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
127 			rLineSpace.SetPropLineSpace( 150 );
128 			break;
129 
130 		case LLINESPACE_2:
131 			rLineSpace.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
132 			rLineSpace.SetPropLineSpace( 200 );
133 			break;
134 
135 		case LLINESPACE_PROP:
136 			rLineSpace.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
137 			rLineSpace.SetPropLineSpace( (sal_uInt8)lValue );
138 			break;
139 
140 		case LLINESPACE_MIN:
141 			rLineSpace.SetLineHeight( (sal_uInt16)lValue );
142 			rLineSpace.GetInterLineSpaceRule() = SVX_INTER_LINE_SPACE_OFF;
143 			break;
144 
145 		case LLINESPACE_DURCH:
146 			rLineSpace.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
147 			rLineSpace.SetInterLineSpace( (sal_uInt16)lValue );
148 			break;
149 
150 		case LLINESPACE_FIX:
151 			rLineSpace.SetLineHeight((sal_uInt16)lValue);
152 			rLineSpace.GetLineSpaceRule() = SVX_LINE_SPACE_FIX;
153 			rLineSpace.GetInterLineSpaceRule() = SVX_INTER_LINE_SPACE_OFF;
154 		break;
155 	}
156 }
157 
158 
GetHtmlMode_Impl(const SfxItemSet & rSet)159 sal_uInt16 GetHtmlMode_Impl(const SfxItemSet& rSet)
160 {
161 	sal_uInt16 nHtmlMode = 0;
162 	const SfxPoolItem* pItem = 0;
163 	SfxObjectShell* pShell;
164 	if(SFX_ITEM_SET == rSet.GetItemState(SID_HTML_MODE, sal_False, &pItem) ||
165 		( 0 != (pShell = SfxObjectShell::Current()) &&
166 					0 != (pItem = pShell->GetItem(SID_HTML_MODE))))
167 	{
168 		nHtmlMode = ((SfxUInt16Item*)pItem)->GetValue();
169 	}
170 	return nHtmlMode;
171 
172 }
173 
174 // class SvxStdParagraphTabPage ------------------------------------------
175 
IMPL_LINK(SvxStdParagraphTabPage,ELRLoseFocusHdl,Edit *,EMPTYARG)176 IMPL_LINK( SvxStdParagraphTabPage, ELRLoseFocusHdl, Edit *, EMPTYARG )
177 {
178 //! if ( aLeftIndent.IsRelativeMode() )
179 //! 	return 0; //!!!
180 
181 	SfxItemPool* pPool = GetItemSet().GetPool();
182 	DBG_ASSERT( pPool, "Wo ist der Pool" );
183 	FieldUnit eUnit =
184 		MapToFieldUnit( pPool->GetMetric( GetWhich( SID_ATTR_LRSPACE ) ) );
185 
186 	sal_Int64 nL = aLeftIndent.Denormalize( aLeftIndent.GetValue( eUnit ) );
187 	sal_Int64 nR = aRightIndent.Denormalize( aRightIndent.GetValue( eUnit ) );
188 	String aTmp = aFLineIndent.GetText();
189 
190 	// Erstzeilen Einzug
191     if( aLeftIndent.GetMin() < 0 )
192 		aFLineIndent.SetMin( -99999, FUNIT_MM );
193 	else
194 		aFLineIndent.SetMin( aFLineIndent.Normalize( -nL ), eUnit );
195 
196 	// Check nur fuer konkrete Breite (Shell)
197 	sal_Int64 nTmp = nWidth - nL - nR - MM50;
198 	aFLineIndent.SetMax( aFLineIndent.Normalize( nTmp ), eUnit );
199 
200 	if ( !aTmp.Len() )
201 		aFLineIndent.SetEmptyFieldValue();
202 	// Maximum Links Rechts
203 	aTmp = aLeftIndent.GetText();
204 	nTmp = nWidth - nR - MM50;
205 	aLeftIndent.SetMax( aLeftIndent.Normalize( nTmp ), eUnit );
206 
207 	if ( !aTmp.Len() )
208 		aLeftIndent.SetEmptyFieldValue();
209 	aTmp = aRightIndent.GetText();
210 	nTmp = nWidth - nL - MM50;
211 	aRightIndent.SetMax( aRightIndent.Normalize( nTmp ), eUnit );
212 
213 	if ( !aTmp.Len() )
214 		aRightIndent.SetEmptyFieldValue();
215 	return 0;
216 }
217 
218 // -----------------------------------------------------------------------
219 
Create(Window * pParent,const SfxItemSet & rSet)220 SfxTabPage* SvxStdParagraphTabPage::Create( Window* pParent,
221 											const SfxItemSet& rSet)
222 {
223 	return new SvxStdParagraphTabPage( pParent, rSet );
224 }
225 
226 // -----------------------------------------------------------------------
227 
FillItemSet(SfxItemSet & rOutSet)228 sal_Bool SvxStdParagraphTabPage::FillItemSet( SfxItemSet& rOutSet )
229 {
230 	SfxItemState eState = SFX_ITEM_UNKNOWN;
231 	const SfxPoolItem* pOld = 0;
232 	SfxItemPool* pPool = rOutSet.GetPool();
233 	DBG_ASSERT( pPool, "Wo ist der Pool" );
234 
235 	sal_Bool bModified = sal_False;
236 	sal_uInt16 nWhich;
237 	sal_uInt16 nPos = aLineDist.GetSelectEntryPos();
238 
239 	if ( LISTBOX_ENTRY_NOTFOUND != nPos &&
240 		 ( nPos != aLineDist.GetSavedValue() ||
241 		   aLineDistAtPercentBox.IsValueModified() ||
242 		   aLineDistAtMetricBox.IsValueModified() ) )
243 	{
244 		nWhich = GetWhich( SID_ATTR_PARA_LINESPACE );
245 		SfxMapUnit eUnit = pPool->GetMetric( nWhich );
246 		SvxLineSpacingItem aSpacing(
247 			(const SvxLineSpacingItem&)GetItemSet().Get( nWhich ) );
248 
249 		switch ( nPos )
250 		{
251 			case LLINESPACE_1:
252 			case LLINESPACE_15:
253 			case LLINESPACE_2:
254 				SetLineSpace_Impl( aSpacing, nPos );
255 				break;
256 
257 			case LLINESPACE_PROP:
258 				SetLineSpace_Impl( aSpacing, nPos,
259 								   static_cast<long>(aLineDistAtPercentBox.Denormalize(
260 								   aLineDistAtPercentBox.GetValue() )) );
261 				break;
262 
263 			case LLINESPACE_MIN:
264 			case LLINESPACE_DURCH:
265 			case LLINESPACE_FIX:
266 				SetLineSpace_Impl( aSpacing, nPos,
267 					GetCoreValue( aLineDistAtMetricBox, eUnit ) );
268 			break;
269 
270 			default:
271 				DBG_ERROR( "unbekannter Type fuer Zeilenabstand." );
272 				break;
273 		}
274 		eState = GetItemSet().GetItemState( nWhich );
275 		pOld = GetOldItem( rOutSet, SID_ATTR_PARA_LINESPACE );
276 
277 		if ( !pOld || !( *(const SvxLineSpacingItem*)pOld == aSpacing ) ||
278 			 SFX_ITEM_DONTCARE == eState )
279 		{
280 			rOutSet.Put( aSpacing );
281 			bModified |= sal_True;
282 		}
283 	}
284 
285 	if ( aTopDist.IsValueModified() || aBottomDist.IsValueModified() )
286 	{
287 		nWhich = GetWhich( SID_ATTR_ULSPACE );
288 		SfxMapUnit eUnit = pPool->GetMetric( nWhich );
289 		pOld = GetOldItem( rOutSet, SID_ATTR_ULSPACE );
290 		SvxULSpaceItem aMargin( nWhich );
291 
292 		if ( bRelativeMode )
293 		{
294 			DBG_ASSERT( GetItemSet().GetParent(), "No ParentSet" );
295 
296 			const SvxULSpaceItem& rOldItem =
297 				(const SvxULSpaceItem&)GetItemSet().GetParent()->Get( nWhich );
298 
299 			if ( aTopDist.IsRelative() )
300 				aMargin.SetUpper( rOldItem.GetUpper(),
301 								  (sal_uInt16)aTopDist.GetValue() );
302 			else
303 				aMargin.SetUpper( (sal_uInt16)GetCoreValue( aTopDist, eUnit ) );
304 
305 			if ( aBottomDist.IsRelative() )
306 				aMargin.SetLower( rOldItem.GetLower(),
307 								  (sal_uInt16)aBottomDist.GetValue() );
308 			else
309 				aMargin.SetLower( (sal_uInt16)GetCoreValue( aBottomDist, eUnit ) );
310 
311 		}
312 		else
313 		{
314 			aMargin.SetUpper( (sal_uInt16)GetCoreValue( aTopDist, eUnit ) );
315 			aMargin.SetLower( (sal_uInt16)GetCoreValue( aBottomDist, eUnit ) );
316 		}
317 		eState = GetItemSet().GetItemState( nWhich );
318 
319 		if ( !pOld || !( *(const SvxULSpaceItem*)pOld == aMargin ) ||
320 			 SFX_ITEM_DONTCARE == eState )
321 		{
322 			rOutSet.Put( aMargin );
323 			bModified |= sal_True;
324 		}
325 	}
326 	FASTBOOL bNullTab = sal_False;
327 
328 	if ( aLeftIndent.IsValueModified() ||
329 		 aFLineIndent.IsValueModified() ||
330 		 aRightIndent.IsValueModified()
331 		 ||	 aAutoCB.GetSavedValue() != aAutoCB.IsChecked() )
332 	{
333 		nWhich = GetWhich( SID_ATTR_LRSPACE );
334 		SfxMapUnit eUnit = pPool->GetMetric( nWhich );
335 		SvxLRSpaceItem aMargin( nWhich );
336 		pOld = GetOldItem( rOutSet, SID_ATTR_LRSPACE );
337 
338 		if ( bRelativeMode )
339 		{
340 			DBG_ASSERT( GetItemSet().GetParent(), "No ParentSet" );
341 
342 			const SvxLRSpaceItem& rOldItem =
343 				(const SvxLRSpaceItem&)GetItemSet().GetParent()->Get( nWhich );
344 
345 			if ( aLeftIndent.IsRelative() )
346 				aMargin.SetTxtLeft( rOldItem.GetTxtLeft(),
347 									(sal_uInt16)aLeftIndent.GetValue() );
348 			else
349 				aMargin.SetTxtLeft( GetCoreValue( aLeftIndent, eUnit ) );
350 
351 			if ( aRightIndent.IsRelative() )
352 				aMargin.SetRight( rOldItem.GetRight(),
353 								  (sal_uInt16)aRightIndent.GetValue() );
354 			else
355 				aMargin.SetRight( GetCoreValue( aRightIndent, eUnit ) );
356 
357 			if ( aFLineIndent.IsRelative() )
358 				aMargin.SetTxtFirstLineOfst( rOldItem.GetTxtFirstLineOfst(),
359 											 (sal_uInt16)aFLineIndent.GetValue() );
360 			else
361 				aMargin.SetTxtFirstLineOfst(
362 					(sal_uInt16)GetCoreValue( aFLineIndent, eUnit ) );
363 		}
364 		else
365 		{
366 			aMargin.SetTxtLeft( GetCoreValue( aLeftIndent, eUnit ) );
367 			aMargin.SetRight( GetCoreValue( aRightIndent, eUnit ) );
368 			aMargin.SetTxtFirstLineOfst(
369 				(sal_uInt16)GetCoreValue( aFLineIndent, eUnit ) );
370 		}
371 		aMargin.SetAutoFirst(aAutoCB.IsChecked());
372 		if ( aMargin.GetTxtFirstLineOfst() < 0 )
373 			bNullTab = sal_True;
374 		eState = GetItemSet().GetItemState( nWhich );
375 
376 		if ( !pOld || !( *(const SvxLRSpaceItem*)pOld == aMargin ) ||
377 			 SFX_ITEM_DONTCARE == eState )
378 		{
379 			rOutSet.Put( aMargin );
380 			bModified |= sal_True;
381 		}
382 	}
383 
384 	if ( bNullTab )
385 	{
386 		MapUnit eUnit = (MapUnit)pPool->GetMetric( GetWhich( SID_ATTR_TABSTOP ) );
387 		if ( MAP_100TH_MM != eUnit )
388 		{
389 
390 			// negativer Erstzeileneinzug -> ggf. Null Default-Tabstop setzen
391             sal_uInt16 _nWhich = GetWhich( SID_ATTR_TABSTOP );
392 			const SfxItemSet& rInSet = GetItemSet();
393 
394             if ( rInSet.GetItemState( _nWhich ) >= SFX_ITEM_AVAILABLE )
395 			{
396 				const SvxTabStopItem& rTabItem =
397                     (const SvxTabStopItem&)rInSet.Get( _nWhich );
398 				SvxTabStopItem aNullTab( rTabItem );
399 				SvxTabStop aNull( 0, SVX_TAB_ADJUST_DEFAULT );
400 				aNullTab.Insert( aNull );
401 				rOutSet.Put( aNullTab );
402 			}
403 		}
404 	}
405 	if( aRegisterCB.IsVisible())
406 	{
407 		const SfxBoolItem* pBoolItem = (SfxBoolItem*)GetOldItem(
408 							rOutSet, SID_ATTR_PARA_REGISTER);
409 		SfxBoolItem* pRegItem = (SfxBoolItem*)pBoolItem->Clone();
410         sal_uInt16 _nWhich = GetWhich( SID_ATTR_PARA_REGISTER );
411 		sal_Bool bSet = pRegItem->GetValue();
412 
413 		if(aRegisterCB.IsChecked() != bSet )
414 		{
415 			pRegItem->SetValue(!bSet);
416 			rOutSet.Put(*pRegItem);
417 			bModified |= sal_True;
418 		}
419         else if ( SFX_ITEM_DEFAULT == GetItemSet().GetItemState( _nWhich, sal_False ) )
420             rOutSet.ClearItem(_nWhich);
421 		delete pRegItem;
422 	}
423 
424 	return bModified;
425 }
426 
427 // -----------------------------------------------------------------------
428 
Reset(const SfxItemSet & rSet)429 void SvxStdParagraphTabPage::Reset( const SfxItemSet& rSet )
430 {
431 	SfxItemPool* pPool = rSet.GetPool();
432 	DBG_ASSERT( pPool, "Wo ist der Pool?" );
433 	String aEmpty;
434 
435 	// Metrik einstellen
436 	FieldUnit eFUnit = GetModuleFieldUnit( rSet );
437 	SetFieldUnit( aLeftIndent, eFUnit );
438 	SetFieldUnit( aRightIndent, eFUnit );
439 	SetFieldUnit( aFLineIndent, eFUnit );
440 	SetFieldUnit( aTopDist, eFUnit );
441 	SetFieldUnit( aBottomDist, eFUnit );
442 	SetFieldUnit( aLineDistAtMetricBox, eFUnit );
443 
444     sal_uInt16 _nWhich = GetWhich( SID_ATTR_LRSPACE );
445     SfxItemState eItemState = rSet.GetItemState( _nWhich );
446 
447 	if ( eItemState >= SFX_ITEM_AVAILABLE )
448 	{
449         SfxMapUnit eUnit = pPool->GetMetric( _nWhich );
450 
451 		if ( bRelativeMode )
452 		{
453 			const SvxLRSpaceItem& rOldItem =
454                 (const SvxLRSpaceItem&)rSet.Get( _nWhich );
455 
456 			if ( rOldItem.GetPropLeft() != 100 )
457 			{
458 				aLeftIndent.SetRelative( sal_True );
459 				aLeftIndent.SetValue( rOldItem.GetPropLeft() );
460 			}
461 			else
462 			{
463 				aLeftIndent.SetRelative();
464 				SetFieldUnit( aLeftIndent, eFUnit );
465 				SetMetricValue( aLeftIndent, rOldItem.GetTxtLeft(), eUnit );
466             }
467 
468 			if ( rOldItem.GetPropRight() != 100 )
469 			{
470 				aRightIndent.SetRelative( sal_True );
471 				aRightIndent.SetValue( rOldItem.GetPropRight() );
472 			}
473 			else
474 			{
475 				aRightIndent.SetRelative();
476 				SetFieldUnit( aRightIndent, eFUnit );
477 				SetMetricValue( aRightIndent, rOldItem.GetRight(), eUnit );
478 			}
479 
480 			if ( rOldItem.GetPropTxtFirstLineOfst() != 100 )
481 			{
482 				aFLineIndent.SetRelative( sal_True );
483 				aFLineIndent.SetValue( rOldItem.GetPropTxtFirstLineOfst() );
484 			}
485 			else
486 			{
487 				aFLineIndent.SetRelative();
488                 aFLineIndent.SetMin(-9999);
489 				SetFieldUnit( aFLineIndent, eFUnit );
490 				SetMetricValue( aFLineIndent, rOldItem.GetTxtFirstLineOfst(),
491 								eUnit );
492 			}
493 			aAutoCB.Check(rOldItem.IsAutoFirst());
494 		}
495 		else
496 		{
497 			const SvxLRSpaceItem& rSpace =
498                 (const SvxLRSpaceItem&)rSet.Get( _nWhich );
499 
500 			SetMetricValue( aLeftIndent, rSpace.GetTxtLeft(), eUnit );
501 			SetMetricValue( aRightIndent, rSpace.GetRight(), eUnit );
502 			SetMetricValue( aFLineIndent, rSpace.GetTxtFirstLineOfst(), eUnit );
503 			aAutoCB.Check(rSpace.IsAutoFirst());
504 		}
505 		AutoHdl_Impl(&aAutoCB);
506 	}
507 	else
508 	{
509 		aLeftIndent.SetEmptyFieldValue();
510 		aRightIndent.SetEmptyFieldValue();
511 		aFLineIndent.SetEmptyFieldValue();
512 	}
513 
514     _nWhich = GetWhich( SID_ATTR_ULSPACE );
515     eItemState = rSet.GetItemState( _nWhich );
516 
517 	if ( eItemState >= SFX_ITEM_AVAILABLE )
518 	{
519         SfxMapUnit eUnit = pPool->GetMetric( _nWhich );
520 
521 		if ( bRelativeMode )
522 		{
523 			const SvxULSpaceItem& rOldItem =
524                 (const SvxULSpaceItem&)rSet.Get( _nWhich );
525 
526 			if ( rOldItem.GetPropUpper() != 100 )
527 			{
528 				aTopDist.SetRelative( sal_True );
529 				aTopDist.SetValue( rOldItem.GetPropUpper() );
530 			}
531 			else
532 			{
533 				aTopDist.SetRelative();
534 				SetFieldUnit( aTopDist, eFUnit );
535 				SetMetricValue( aTopDist, rOldItem.GetUpper(), eUnit );
536 			}
537 
538 			if ( rOldItem.GetPropLower() != 100 )
539 			{
540 				aBottomDist.SetRelative( sal_True );
541 				aBottomDist.SetValue( rOldItem.GetPropLower() );
542 			}
543 			else
544 			{
545 				aBottomDist.SetRelative();
546 				SetFieldUnit( aBottomDist, eFUnit );
547 				SetMetricValue( aBottomDist, rOldItem.GetLower(), eUnit );
548 			}
549 		}
550 		else
551 		{
552 			const SvxULSpaceItem& rTopMargin =
553                 (const SvxULSpaceItem&)rSet.Get( _nWhich );
554 			SetMetricValue( aTopDist, rTopMargin.GetUpper(), eUnit );
555 			SetMetricValue( aBottomDist, rTopMargin.GetLower(), eUnit );
556 		}
557 	}
558 	else
559 	{
560 		aTopDist.SetEmptyFieldValue();
561 		aBottomDist.SetEmptyFieldValue();
562 	}
563 
564     _nWhich = GetWhich( SID_ATTR_PARA_LINESPACE );
565     eItemState = rSet.GetItemState( _nWhich );
566 
567 	if ( eItemState >= SFX_ITEM_AVAILABLE )
568         SetLineSpacing_Impl( (const SvxLineSpacingItem &)rSet.Get( _nWhich ) );
569 	else
570 		aLineDist.SetNoSelection();
571 
572 
573     _nWhich = GetWhich( SID_ATTR_PARA_REGISTER );
574     eItemState = rSet.GetItemState( _nWhich );
575 
576 	if ( eItemState >= SFX_ITEM_AVAILABLE )
577         aRegisterCB.Check( ((const SfxBoolItem &)rSet.Get( _nWhich )).GetValue());
578 	aRegisterCB.SaveValue();
579 	sal_uInt16 nHtmlMode = GetHtmlMode_Impl(rSet);
580 	if(nHtmlMode & HTMLMODE_ON)
581 	{
582 		aRegisterCB.Hide();
583         aRegisterFL.Hide();
584 		aAutoCB.Hide();
585 		if(!(nHtmlMode & HTMLMODE_SOME_STYLES)) // IE oder SW
586 		{
587 			aRightLabel.Disable();
588 			aRightIndent.Disable();
589 			aTopDist.Disable();  //HTML3.2 und NS 3.0
590 			aBottomDist.Disable();
591 			if(!(nHtmlMode & HTMLMODE_FIRSTLINE)) //NS 3.0
592 			{
593 				aFLineIndent.Disable();
594 				aFLineLabel.Disable();
595 			}
596 		}
597 	}
598 
599 	ELRLoseFocusHdl( NULL );
600 	aAutoCB.SaveValue();
601 	aLineDist.SaveValue();
602 }
603 
604 // -----------------------------------------------------------------------
605 
EnableRelativeMode()606 void SvxStdParagraphTabPage::EnableRelativeMode()
607 {
608 	DBG_ASSERT( GetItemSet().GetParent(), "RelativeMode, but no parent-set!" );
609 
610 	aLeftIndent.EnableRelativeMode( 0, 999 );
611 	aFLineIndent.EnableRelativeMode( 0, 999 );
612 	aRightIndent.EnableRelativeMode( 0, 999 );
613 	aTopDist.EnableRelativeMode( 0, 999 );
614 	aBottomDist.EnableRelativeMode( 0, 999 );
615 	bRelativeMode = sal_True;
616 }
617 
618 // -----------------------------------------------------------------------
619 
DeactivatePage(SfxItemSet * _pSet)620 int SvxStdParagraphTabPage::DeactivatePage( SfxItemSet* _pSet )
621 {
622 	ELRLoseFocusHdl( NULL );
623 
624     if ( _pSet )
625         FillItemSet( *_pSet );
626 	return LEAVE_PAGE;
627 }
628 
629 // -----------------------------------------------------------------------
630 
SvxStdParagraphTabPage(Window * pParent,const SfxItemSet & rAttr)631 SvxStdParagraphTabPage::SvxStdParagraphTabPage( Window* pParent,
632 												const SfxItemSet& rAttr ) :
633 
634 	SfxTabPage( pParent, CUI_RES( RID_SVXPAGE_STD_PARAGRAPH ), rAttr ),
635 
636     aIndentFrm              ( this, CUI_RES( FL_INDENT ) ),
637 	aLeftLabel              ( this, CUI_RES( FT_LEFTINDENT ) ),
638 	aLeftIndent             ( this, CUI_RES( ED_LEFTINDENT ) ),
639     aRightLabel             ( this, CUI_RES( FT_RIGHTINDENT ) ),
640     aRightIndent            ( this, CUI_RES( ED_RIGHTINDENT ) ),
641 
642     aFLineLabel             ( this, CUI_RES( FT_FLINEINDENT ) ),
643 	aFLineIndent            ( this, CUI_RES( ED_FLINEINDENT ) ),
644 	aAutoCB                 ( this, CUI_RES( CB_AUTO ) ),
645     aDistFrm                ( this, CUI_RES( FL_DIST ) ),
646 	aTopLabel               ( this, CUI_RES( FT_TOPDIST ) ),
647 	aTopDist                ( this, CUI_RES( ED_TOPDIST ) ),
648 	aBottomLabel            ( this, CUI_RES( FT_BOTTOMDIST ) ),
649 	aBottomDist             ( this, CUI_RES( ED_BOTTOMDIST ) ),
650 
651     aLineDistFrm            ( this, CUI_RES( FL_LINEDIST ) ),
652 	aLineDist               ( this, CUI_RES( LB_LINEDIST ) ),
653 	aLineDistAtLabel        ( this, CUI_RES( FT_LINEDIST ) ),
654 	aLineDistAtPercentBox   ( this, CUI_RES( ED_LINEDISTPERCENT ) ),
655 	aLineDistAtMetricBox    ( this, CUI_RES( ED_LINEDISTMETRIC ) ),
656     sAbsDist                ( CUI_RES(ST_LINEDIST_ABS) ),
657     aExampleWin             ( this, CUI_RES( WN_EXAMPLE ) ),
658     aRegisterFL             ( this, CUI_RES( FL_REGISTER ) ),
659 	aRegisterCB             ( this, CUI_RES( CB_REGISTER ) ),
660     pActLineDistFld ( &aLineDistAtPercentBox ),
661     nAbst           ( MAX_DURCH ),
662     nWidth          ( 11905 /*567 * 50*/ ),
663     nMinFixDist(0L),
664 
665     bRelativeMode   ( sal_False ),
666     bNegativeIndents(sal_False)
667 
668 {
669 	// diese Page braucht ExchangeSupport
670 	SetExchangeSupport();
671 
672 	aLineDistAtMetricBox.Hide();
673     FreeResource();
674 	Init_Impl();
675     aFLineIndent.SetMin(-9999);    // wird default auf 0 gesetzt
676 
677 	aExampleWin.SetAccessibleName(String(CUI_RES(STR_EXAMPLE)));
678 
679 }
680 
681 
682 // -----------------------------------------------------------------------
683 
EnableNegativeMode()684 void SvxStdParagraphTabPage::EnableNegativeMode()
685 {
686     aLeftIndent.SetMin(-9999);
687     aRightIndent.SetMin(-9999);
688     aRightIndent.EnableNegativeMode();
689     aLeftIndent.EnableNegativeMode();
690     bNegativeIndents = sal_True;
691 }
692 
693 // -----------------------------------------------------------------------
694 
GetRanges()695 sal_uInt16* SvxStdParagraphTabPage::GetRanges()
696 {
697 	return pStdRanges;
698 }
699 
700 // -----------------------------------------------------------------------
701 
SetLineSpacing_Impl(const SvxLineSpacingItem & rAttr)702 void SvxStdParagraphTabPage::SetLineSpacing_Impl
703 (
704 	const SvxLineSpacingItem &rAttr
705 )
706 {
707 	SfxMapUnit eUnit = GetItemSet().GetPool()->GetMetric( rAttr.Which() );
708 
709 	switch( rAttr.GetLineSpaceRule() )
710 	{
711 		case SVX_LINE_SPACE_AUTO:
712 		{
713 			SvxInterLineSpace eInter = rAttr.GetInterLineSpaceRule();
714 
715 			switch( eInter )
716 			{
717 				// Default einzeilig
718 				case SVX_INTER_LINE_SPACE_OFF:
719 					aLineDist.SelectEntryPos( LLINESPACE_1 );
720 					break;
721 
722 				// Default einzeilig
723 				case SVX_INTER_LINE_SPACE_PROP:
724 					if ( 100 == rAttr.GetPropLineSpace() )
725 					{
726 						aLineDist.SelectEntryPos( LLINESPACE_1 );
727 						break;
728 					}
729 					// 1.5zeilig
730 					if ( 150 == rAttr.GetPropLineSpace() )
731 					{
732 						aLineDist.SelectEntryPos( LLINESPACE_15 );
733 						break;
734 					}
735 					// 2zeilig
736 					if ( 200 == rAttr.GetPropLineSpace() )
737 					{
738 						aLineDist.SelectEntryPos( LLINESPACE_2 );
739 						break;
740 					}
741 					// eingestellter Prozentwert
742 					aLineDistAtPercentBox.
743 						SetValue( aLineDistAtPercentBox.Normalize(
744 										rAttr.GetPropLineSpace() ) );
745 					aLineDist.SelectEntryPos( LLINESPACE_PROP );
746 					break;
747 
748 				case SVX_INTER_LINE_SPACE_FIX:
749 					SetMetricValue( aLineDistAtMetricBox,
750 									rAttr.GetInterLineSpace(), eUnit );
751 					aLineDist.SelectEntryPos( LLINESPACE_DURCH );
752 					break;
753                 default: ;//prevent warning
754 			}
755 		}
756 		break;
757 		case SVX_LINE_SPACE_FIX:
758 			SetMetricValue(aLineDistAtMetricBox, rAttr.GetLineHeight(), eUnit);
759 			aLineDist.SelectEntryPos( LLINESPACE_FIX );
760 		break;
761 
762 		case SVX_LINE_SPACE_MIN:
763 			SetMetricValue(aLineDistAtMetricBox, rAttr.GetLineHeight(), eUnit);
764 			aLineDist.SelectEntryPos( LLINESPACE_MIN );
765 			break;
766         default: ;//prevent warning
767 	}
768 	LineDistHdl_Impl( &aLineDist );
769 }
770 
771 // -----------------------------------------------------------------------
772 
IMPL_LINK(SvxStdParagraphTabPage,LineDistHdl_Impl,ListBox *,pBox)773 IMPL_LINK( SvxStdParagraphTabPage, LineDistHdl_Impl, ListBox *, pBox )
774 {
775 	switch( pBox->GetSelectEntryPos() )
776 	{
777 		case LLINESPACE_1:
778 		case LLINESPACE_15:
779 		case LLINESPACE_2:
780 			aLineDistAtLabel.Enable(sal_False);
781 			pActLineDistFld->Enable(sal_False);
782 			pActLineDistFld->SetText( String() );
783 			break;
784 
785 		case LLINESPACE_DURCH:
786 			// Setzen eines sinnvollen Defaults?
787 			// MS Begrenzen min(10, aPageSize)
788 			aLineDistAtPercentBox.Hide();
789 			pActLineDistFld = &aLineDistAtMetricBox;
790             aLineDistAtMetricBox.SetMin(0);
791 
792 
793 			if ( !aLineDistAtMetricBox.GetText().Len() )
794 				aLineDistAtMetricBox.SetValue(
795 					aLineDistAtMetricBox.Normalize( 1 ) );
796 			aLineDistAtPercentBox.Hide();
797 			pActLineDistFld->Show();
798 			pActLineDistFld->Enable();
799 			aLineDistAtLabel.Enable();
800 			break;
801 
802 		case LLINESPACE_MIN:
803 			aLineDistAtPercentBox.Hide();
804 			pActLineDistFld = &aLineDistAtMetricBox;
805             aLineDistAtMetricBox.SetMin(0);
806 
807 			if ( !aLineDistAtMetricBox.GetText().Len() )
808 				aLineDistAtMetricBox.SetValue(
809 					aLineDistAtMetricBox.Normalize( 10 ), FUNIT_TWIP );
810 			aLineDistAtPercentBox.Hide();
811 			pActLineDistFld->Show();
812 			pActLineDistFld->Enable();
813 			aLineDistAtLabel.Enable();
814 			break;
815 
816 		case LLINESPACE_PROP:
817 			aLineDistAtMetricBox.Hide();
818 			pActLineDistFld = &aLineDistAtPercentBox;
819 
820 			if ( !aLineDistAtPercentBox.GetText().Len() )
821 				aLineDistAtPercentBox.SetValue(
822 					aLineDistAtPercentBox.Normalize( 100 ), FUNIT_TWIP );
823 			aLineDistAtMetricBox.Hide();
824 			pActLineDistFld->Show();
825 			pActLineDistFld->Enable();
826 			aLineDistAtLabel.Enable();
827 			break;
828 		case LLINESPACE_FIX:
829 		{
830 			aLineDistAtPercentBox.Hide();
831 			pActLineDistFld = &aLineDistAtMetricBox;
832 			sal_Int64 nTemp = aLineDistAtMetricBox.GetValue();
833 			aLineDistAtMetricBox.SetMin(aLineDistAtMetricBox.Normalize(nMinFixDist), FUNIT_TWIP);
834 
835 			// wurde der Wert beim SetMin veraendert, dann ist es Zeit
836 			// fuer den default
837 			if ( aLineDistAtMetricBox.GetValue() != nTemp )
838 				SetMetricValue( aLineDistAtMetricBox,
839 									FIX_DIST_DEF, SFX_MAPUNIT_TWIP ); // fix gibt's nur im Writer
840 			aLineDistAtPercentBox.Hide();
841 			pActLineDistFld->Show();
842 			pActLineDistFld->Enable();
843 			aLineDistAtLabel.Enable();
844 		}
845 		break;
846 	}
847 	UpdateExample_Impl( sal_True );
848 	return 0;
849 }
850 
851 // -----------------------------------------------------------------------
852 
IMPL_LINK_INLINE_START(SvxStdParagraphTabPage,ModifyHdl_Impl,SvxRelativeField *,EMPTYARG)853 IMPL_LINK_INLINE_START( SvxStdParagraphTabPage, ModifyHdl_Impl, SvxRelativeField *, EMPTYARG )
854 {
855 	UpdateExample_Impl();
856 	return 0;
857 }
IMPL_LINK_INLINE_END(SvxStdParagraphTabPage,ModifyHdl_Impl,SvxRelativeField *,EMPTYARG)858 IMPL_LINK_INLINE_END( SvxStdParagraphTabPage, ModifyHdl_Impl, SvxRelativeField *, EMPTYARG )
859 
860 // -----------------------------------------------------------------------
861 
862 void SvxStdParagraphTabPage::Init_Impl()
863 {
864 	aLineDist.SetSelectHdl(
865 		LINK( this, SvxStdParagraphTabPage, LineDistHdl_Impl ) );
866 
867 	Link aLink = LINK( this, SvxStdParagraphTabPage, ELRLoseFocusHdl );
868 	aFLineIndent.SetLoseFocusHdl( aLink );
869 	aLeftIndent.SetLoseFocusHdl( aLink );
870 	aRightIndent.SetLoseFocusHdl( aLink );
871 
872 	aLink = LINK( this, SvxStdParagraphTabPage, ModifyHdl_Impl );
873 	aFLineIndent.SetModifyHdl( aLink );
874 	aLeftIndent.SetModifyHdl( aLink );
875 	aRightIndent.SetModifyHdl( aLink );
876 	aTopDist.SetModifyHdl( aLink );
877 	aBottomDist.SetModifyHdl( aLink );
878 
879 	aAutoCB.SetClickHdl( LINK( this, SvxStdParagraphTabPage, AutoHdl_Impl ));
880 	SfxItemPool* pPool = GetItemSet().GetPool();
881 	DBG_ASSERT( pPool, "Wo ist der Pool" );
882 	FieldUnit eUnit =
883 		MapToFieldUnit( pPool->GetMetric( GetWhich( SID_ATTR_LRSPACE ) ) );
884 
885 	aTopDist.SetMax( aTopDist.Normalize( nAbst ), eUnit );
886 	aBottomDist.SetMax( aBottomDist.Normalize( nAbst ), eUnit );
887 	aLineDistAtMetricBox.SetMax(
888 		aLineDistAtMetricBox.Normalize( nAbst ), eUnit );
889 }
890 
891 // -----------------------------------------------------------------------
892 
UpdateExample_Impl(sal_Bool bAll)893 void SvxStdParagraphTabPage::UpdateExample_Impl( sal_Bool bAll )
894 {
895 	aExampleWin.SetFirstLineOfst(
896 		(short)aFLineIndent.Denormalize( aFLineIndent.GetValue( FUNIT_TWIP ) ) );
897 	aExampleWin.SetLeftMargin(
898 		static_cast<long>(aLeftIndent.Denormalize( aLeftIndent.GetValue( FUNIT_TWIP ) ) ) );
899 	aExampleWin.SetRightMargin(
900 		static_cast<long>(aRightIndent.Denormalize( aRightIndent.GetValue( FUNIT_TWIP ) ) ) );
901 	aExampleWin.SetUpper(
902 		(sal_uInt16)aTopDist.Denormalize( aTopDist.GetValue( FUNIT_TWIP ) ) );
903 	aExampleWin.SetLower(
904 		(sal_uInt16)aBottomDist.Denormalize( aBottomDist.GetValue( FUNIT_TWIP ) ) );
905 
906 
907 
908 	sal_uInt16 nPos = aLineDist.GetSelectEntryPos();
909 
910 	switch ( nPos )
911 	{
912 		case LLINESPACE_1:
913 		case LLINESPACE_15:
914 		case LLINESPACE_2:
915 			aExampleWin.SetLineSpace( (SvxPrevLineSpace)nPos );
916 			break;
917 
918 		case LLINESPACE_PROP:
919 			aExampleWin.SetLineSpace( (SvxPrevLineSpace)nPos,
920 				(sal_uInt16)aLineDistAtPercentBox.Denormalize(
921 				aLineDistAtPercentBox.GetValue() ) );
922 			break;
923 
924 		case LLINESPACE_MIN:
925 		case LLINESPACE_DURCH:
926 		case LLINESPACE_FIX:
927 			aExampleWin.SetLineSpace( (SvxPrevLineSpace)nPos,
928 				(sal_uInt16)GetCoreValue( aLineDistAtMetricBox, SFX_MAPUNIT_TWIP ) );
929 			break;
930 	}
931 	aExampleWin.Draw( bAll );
932 }
933 
934 // -----------------------------------------------------------------------
935 
EnableRegisterMode()936 void SvxStdParagraphTabPage::EnableRegisterMode()
937 {
938 	aRegisterCB.Show();
939     aRegisterFL.Show();
940 }
941 
942 /*-----------------16.01.97 19.54-------------------
943 
944 --------------------------------------------------*/
IMPL_LINK(SvxStdParagraphTabPage,AutoHdl_Impl,CheckBox *,pBox)945 IMPL_LINK( SvxStdParagraphTabPage, AutoHdl_Impl, CheckBox*, pBox )
946 {
947 	sal_Bool bEnable = !pBox->IsChecked();
948 	aFLineLabel .Enable(bEnable);
949 	aFLineIndent.Enable(bEnable);
950 	return 0;
951 }
952 
953 /*-----------------16.01.97 18.00-------------------
954 
955 --------------------------------------------------*/
SetPageWidth(sal_uInt16 nPageWidth)956 void SvxStdParagraphTabPage::SetPageWidth( sal_uInt16 nPageWidth )
957 {
958 	nWidth = nPageWidth;
959 }
960 
961 /*-----------------17.01.97 08.11-------------------
962 
963 --------------------------------------------------*/
EnableAutoFirstLine()964 void SvxStdParagraphTabPage::EnableAutoFirstLine()
965 {
966 	aAutoCB.Show();
967 }
968 
969 /*-----------------11.06.97 11.48-------------------
970 	absoluter Zeilenabstand
971 --------------------------------------------------*/
EnableAbsLineDist(long nMinTwip)972 void	SvxStdParagraphTabPage::EnableAbsLineDist(long nMinTwip)
973 {
974 	aLineDist.InsertEntry(sAbsDist);
975 	nMinFixDist = nMinTwip;
976 }
977 
978 //addd CHINA001 begin
PageCreated(SfxAllItemSet aSet)979 void	SvxStdParagraphTabPage::PageCreated(SfxAllItemSet aSet)
980 {
981 
982 /* CHINA001 different bit represent call to different method of SvxStdParagraphTabPage
983 						0x0001 --->EnableRelativeMode()
984 						0x0002 --->EnableRegisterMode()
985 						0x0004 --->EnableAutoFirstLine()
986 						0x0008 --->EnableNegativeMode()
987 
988 
989 			*/
990 	SFX_ITEMSET_ARG	(&aSet,pPageWidthItem,SfxUInt16Item,SID_SVXSTDPARAGRAPHTABPAGE_PAGEWIDTH,sal_False);
991 	SFX_ITEMSET_ARG	(&aSet,pFlagSetItem,SfxUInt32Item,SID_SVXSTDPARAGRAPHTABPAGE_FLAGSET,sal_False);
992 	SFX_ITEMSET_ARG	(&aSet,pLineDistItem,SfxUInt32Item,SID_SVXSTDPARAGRAPHTABPAGE_ABSLINEDIST,sal_False);
993 
994 	if (pPageWidthItem)
995 		SetPageWidth(pPageWidthItem->GetValue());
996 
997 	if (pFlagSetItem )
998 		if (( 0x0001 & pFlagSetItem->GetValue())== 0x0001 )
999 			EnableRelativeMode();
1000 
1001 	if (pFlagSetItem)
1002 		if (( 0x0002 & pFlagSetItem->GetValue())== 0x0002 )
1003 				EnableRegisterMode();
1004 
1005 	if (pFlagSetItem)
1006 		if ( ( 0x0004 & pFlagSetItem->GetValue())== 0x0004 )
1007 			EnableAutoFirstLine();
1008 
1009 	if(pLineDistItem)
1010 		EnableAbsLineDist(pLineDistItem->GetValue());
1011 
1012 	if (pFlagSetItem)
1013 		if	(( 0x0008 & pFlagSetItem->GetValue()) == 0x0008 )
1014 				EnableNegativeMode();
1015 
1016 }
1017 //end of CHINA001
1018 
1019 #define LASTLINEPOS_DEFAULT		0
1020 #define LASTLINEPOS_LEFT		1
1021 
1022 #define LASTLINECOUNT_OLD		3
1023 #define LASTLINECOUNT_NEW		4
1024 
1025 // class SvxParaAlignTabPage ------------------------------------------------
1026 
1027 /*-----------------16.01.97 19.34-------------------
1028 
1029 --------------------------------------------------*/
SvxParaAlignTabPage(Window * pParent,const SfxItemSet & rSet)1030 SvxParaAlignTabPage::SvxParaAlignTabPage( Window* pParent, const SfxItemSet& rSet )
1031 	: SfxTabPage(pParent, CUI_RES( RID_SVXPAGE_ALIGN_PARAGRAPH ),rSet),
1032     aAlignFrm           ( this, CUI_RES( FL_ALIGN ) ),
1033     aLeft               ( this, CUI_RES( BTN_LEFTALIGN ) ),
1034 	aRight				( this, CUI_RES( BTN_RIGHTALIGN ) ),
1035 	aCenter				( this, CUI_RES( BTN_CENTERALIGN ) ),
1036 	aJustify			( this, CUI_RES( BTN_JUSTIFYALIGN ) ),
1037     aLastLineFT         ( this, CUI_RES( FT_LASTLINE ) ),
1038 	aLastLineLB			( this, CUI_RES( LB_LASTLINE ) ),
1039 	aExpandCB			( this, CUI_RES( CB_EXPAND ) ),
1040 	aSnapToGridCB		( this, CUI_RES( CB_SNAP ) ),
1041 	aExampleWin			( this, CUI_RES( WN_EXAMPLE ) ),
1042 
1043 	aVertAlignFL		( this, CUI_RES( FL_VERTALIGN ) ),
1044 	aVertAlignFT		( this, CUI_RES( FT_VERTALIGN ) ),
1045 	aVertAlignLB		( this, CUI_RES( LB_VERTALIGN ) ),
1046 
1047 	aPropertiesFL		( this, CUI_RES( FL_PROPERTIES    )),
1048 	aTextDirectionFT	( this, CUI_RES( FT_TEXTDIRECTION )),
1049 	aTextDirectionLB	( this, CUI_RES( LB_TEXTDIRECTION ))
1050 {
1051 	SvtLanguageOptions aLangOptions;
1052 	sal_uInt16 nLastLinePos = LASTLINEPOS_DEFAULT;
1053 
1054     if ( aLangOptions.IsAsianTypographyEnabled() )
1055 	{
1056 		String sLeft(CUI_RES(ST_LEFTALIGN_ASIAN));
1057 		aLeft.SetText(sLeft);
1058 		aRight.SetText(String(CUI_RES(ST_RIGHTALIGN_ASIAN)));
1059 		sLeft = MnemonicGenerator::EraseAllMnemonicChars( sLeft );
1060 
1061 		if ( aLastLineLB.GetEntryCount() == LASTLINECOUNT_OLD )
1062 		{
1063 			aLastLineLB.RemoveEntry( 0 );
1064 			aLastLineLB.InsertEntry( sLeft, 0 );
1065 		}
1066 		else
1067 			nLastLinePos = LASTLINEPOS_LEFT;
1068 	}
1069 	// remove "Default" or "Left" entry, depends on CJKOptions
1070 	if ( aLastLineLB.GetEntryCount() == LASTLINECOUNT_NEW )
1071 		aLastLineLB.RemoveEntry( nLastLinePos );
1072 
1073 	FreeResource();
1074 	Link aLink = LINK( this, SvxParaAlignTabPage, AlignHdl_Impl );
1075 	aLeft.SetClickHdl( aLink );
1076 	aRight.SetClickHdl( aLink );
1077 	aCenter.SetClickHdl( aLink );
1078 	aJustify.SetClickHdl( aLink );
1079 	aLastLineLB.SetSelectHdl( LINK( this, SvxParaAlignTabPage, LastLineHdl_Impl ) );
1080 	aTextDirectionLB.SetSelectHdl( LINK( this, SvxParaAlignTabPage, TextDirectionHdl_Impl ) );
1081 
1082     sal_uInt16 nHtmlMode = GetHtmlMode_Impl(rSet);
1083     if(!(nHtmlMode & HTMLMODE_ON) || (0 != (nHtmlMode & HTMLMODE_SOME_STYLES)) )
1084     {
1085         if( aLangOptions.IsCTLFontEnabled() )
1086         {
1087             aTextDirectionLB.InsertEntryValue( CUI_RESSTR( RID_SVXSTR_FRAMEDIR_LTR ), FRMDIR_HORI_LEFT_TOP );
1088             aTextDirectionLB.InsertEntryValue( CUI_RESSTR( RID_SVXSTR_FRAMEDIR_RTL ), FRMDIR_HORI_RIGHT_TOP );
1089             aTextDirectionLB.InsertEntryValue( CUI_RESSTR( RID_SVXSTR_FRAMEDIR_SUPER ), FRMDIR_ENVIRONMENT );
1090 
1091             aPropertiesFL.Show();
1092             aTextDirectionFT.Show();
1093             aTextDirectionLB.Show();
1094         }
1095     }
1096 
1097 	aExampleWin.SetAccessibleName(String(CUI_RES(STR_EXAMPLE)));
1098 
1099 }
1100 
1101 /*-----------------16.01.97 19.33-------------------
1102 
1103 --------------------------------------------------*/
~SvxParaAlignTabPage()1104 SvxParaAlignTabPage::~SvxParaAlignTabPage()
1105 {
1106 }
1107 
1108 /*-----------------16.01.97 19.33-------------------
1109 
1110 --------------------------------------------------*/
DeactivatePage(SfxItemSet * _pSet)1111 int SvxParaAlignTabPage::DeactivatePage( SfxItemSet* _pSet )
1112 {
1113     if ( _pSet )
1114         FillItemSet( *_pSet );
1115 	return LEAVE_PAGE;
1116 }
1117 
1118 /*-----------------16.01.97 19.33-------------------
1119 
1120 --------------------------------------------------*/
Create(Window * pParent,const SfxItemSet & rSet)1121 SfxTabPage*	SvxParaAlignTabPage::Create( Window* pParent, const SfxItemSet& rSet )
1122 {
1123 	return new SvxParaAlignTabPage(pParent, rSet);
1124 }
1125 
1126 /*-----------------16.01.97 19.33-------------------
1127 
1128 --------------------------------------------------*/
GetRanges()1129 sal_uInt16*	SvxParaAlignTabPage::GetRanges()
1130 {
1131 	return pAlignRanges;
1132 
1133 }
1134 
1135 /*-----------------16.01.97 19.33-------------------
1136 
1137 --------------------------------------------------*/
FillItemSet(SfxItemSet & rOutSet)1138 sal_Bool SvxParaAlignTabPage::FillItemSet( SfxItemSet& rOutSet )
1139 {
1140 	sal_Bool bModified = sal_False;
1141 
1142 	FASTBOOL bAdj = sal_False, bChecked = sal_False;
1143 	SvxAdjust eAdjust = SVX_ADJUST_LEFT;
1144 
1145 	if ( aLeft.IsChecked() )
1146 	{
1147 		eAdjust = SVX_ADJUST_LEFT;
1148 		bAdj = !aLeft.GetSavedValue();
1149 		bChecked = sal_True;
1150 	}
1151 	else if ( aRight.IsChecked() )
1152 	{
1153 		eAdjust = SVX_ADJUST_RIGHT;
1154 		bAdj = !aRight.GetSavedValue();
1155 		bChecked = sal_True;
1156 	}
1157 	else if ( aCenter.IsChecked() )
1158 	{
1159 		eAdjust = SVX_ADJUST_CENTER;
1160 		bAdj = !aCenter.GetSavedValue();
1161 		bChecked = sal_True;
1162 	}
1163 	else if ( aJustify.IsChecked() )
1164 	{
1165 		eAdjust = SVX_ADJUST_BLOCK;
1166 		bAdj = !aJustify.GetSavedValue() ||
1167 			aExpandCB.IsChecked() != aExpandCB.GetSavedValue() ||
1168 			aLastLineLB.GetSelectEntryPos() != aLastLineLB.GetSavedValue();
1169 		bChecked = sal_True;
1170 	}
1171     sal_uInt16 _nWhich = GetWhich( SID_ATTR_PARA_ADJUST );
1172 
1173 	if ( bAdj )
1174 	{
1175 		const SvxAdjustItem* pOld =
1176 			(const SvxAdjustItem*)GetOldItem( rOutSet, SID_ATTR_PARA_ADJUST );
1177 		SvxAdjust eOneWord = aExpandCB.IsChecked() ? SVX_ADJUST_BLOCK
1178 												   : SVX_ADJUST_LEFT;
1179 		sal_uInt16 nLBPos = aLastLineLB.GetSelectEntryPos();
1180 		SvxAdjust eLastBlock = SVX_ADJUST_LEFT;
1181 
1182 		if ( 1 == nLBPos )
1183 			eLastBlock = SVX_ADJUST_CENTER;
1184 		else if ( 2 == nLBPos )
1185 			eLastBlock = SVX_ADJUST_BLOCK;
1186 
1187 		FASTBOOL bNothingWasChecked =
1188 			!aLeft.GetSavedValue() && !aRight.GetSavedValue() &&
1189 			!aCenter.GetSavedValue() && !aJustify.GetSavedValue();
1190 
1191 		if ( !pOld || pOld->GetAdjust() != eAdjust ||
1192 			 pOld->GetOneWord() != eOneWord ||
1193 			 pOld->GetLastBlock() != eLastBlock ||
1194 			 ( bChecked && bNothingWasChecked ) )
1195 		{
1196 			bModified |= sal_True;
1197 			SvxAdjustItem aAdj(
1198                 (const SvxAdjustItem&)GetItemSet().Get( _nWhich ) );
1199 			aAdj.SetAdjust( eAdjust );
1200 			aAdj.SetOneWord( eOneWord );
1201 			aAdj.SetLastBlock( eLastBlock );
1202 			rOutSet.Put( aAdj );
1203 		}
1204 	}
1205     if(aSnapToGridCB.IsChecked() != aSnapToGridCB.GetSavedValue())
1206     {
1207         rOutSet.Put(SvxParaGridItem(aSnapToGridCB.IsChecked(), GetWhich( SID_ATTR_PARA_SNAPTOGRID )));
1208         bModified = sal_True;
1209     }
1210     if(aVertAlignLB.GetSavedValue() != aVertAlignLB.GetSelectEntryPos())
1211     {
1212         rOutSet.Put(SvxParaVertAlignItem(aVertAlignLB.GetSelectEntryPos(), GetWhich( SID_PARA_VERTALIGN )));
1213         bModified = sal_True;
1214     }
1215 
1216     if( aTextDirectionLB.IsVisible() )
1217 	{
1218         SvxFrameDirection eDir = aTextDirectionLB.GetSelectEntryValue();
1219         if( eDir != aTextDirectionLB.GetSavedValue() )
1220 		{
1221             rOutSet.Put( SvxFrameDirectionItem( eDir, GetWhich( SID_ATTR_FRAMEDIRECTION ) ) );
1222 			bModified = sal_True;
1223 		}
1224 	}
1225 
1226     return bModified;
1227 }
1228 
1229 /*-----------------16.01.97 19.33-------------------
1230 
1231 --------------------------------------------------*/
Reset(const SfxItemSet & rSet)1232 void SvxParaAlignTabPage::Reset( const SfxItemSet& rSet )
1233 {
1234     sal_uInt16 _nWhich = GetWhich( SID_ATTR_PARA_ADJUST );
1235     SfxItemState eItemState = rSet.GetItemState( _nWhich );
1236 
1237 	sal_uInt16 nLBSelect = 0;
1238 	if ( eItemState >= SFX_ITEM_AVAILABLE )
1239 	{
1240         const SvxAdjustItem& rAdj = (const SvxAdjustItem&)rSet.Get( _nWhich );
1241 
1242 		switch ( rAdj.GetAdjust() /*!!! VB fragen rAdj.GetLastBlock()*/ )
1243 		{
1244 			case SVX_ADJUST_LEFT: aLeft.Check(); break;
1245 
1246 			case SVX_ADJUST_RIGHT: aRight.Check(); break;
1247 
1248 			case SVX_ADJUST_CENTER: aCenter.Check(); break;
1249 
1250 			case SVX_ADJUST_BLOCK: aJustify.Check(); break;
1251             default: ; //prevent warning
1252 		}
1253 		sal_Bool bEnable = aJustify.IsChecked();
1254 		aLastLineFT.Enable(bEnable);
1255 		aLastLineLB.Enable(bEnable);
1256 		aExpandCB  .Enable(bEnable);
1257 
1258 		aExpandCB.Check(SVX_ADJUST_BLOCK == rAdj.GetOneWord());
1259 		switch(rAdj.GetLastBlock())
1260 		{
1261 			case SVX_ADJUST_LEFT:  nLBSelect = 0; break;
1262 
1263 			case SVX_ADJUST_CENTER: nLBSelect = 1;  break;
1264 
1265 			case SVX_ADJUST_BLOCK: nLBSelect = 2;  break;
1266             default: ; //prevent warning
1267 		}
1268 	}
1269 	else
1270 	{
1271 		aLeft.Check( sal_False );
1272 		aRight.Check( sal_False );
1273 		aCenter.Check( sal_False );
1274 		aJustify.Check( sal_False );
1275 	}
1276 	aLastLineLB.SelectEntryPos(nLBSelect);
1277 
1278 	sal_uInt16 nHtmlMode = GetHtmlMode_Impl(rSet);
1279 	if(nHtmlMode & HTMLMODE_ON)
1280 	{
1281 		aLastLineLB.Hide();
1282 		aLastLineFT.Hide();
1283 		aExpandCB.Hide();
1284 		if(!(nHtmlMode & (HTMLMODE_FULL_STYLES|HTMLMODE_FIRSTLINE)) )
1285 			aJustify.Disable();
1286         aSnapToGridCB.Show(sal_False);
1287 	}
1288     _nWhich = GetWhich(SID_ATTR_PARA_SNAPTOGRID);
1289     eItemState = rSet.GetItemState( _nWhich );
1290     if ( eItemState >= SFX_ITEM_AVAILABLE )
1291     {
1292         const SvxParaGridItem& rSnap = (const SvxParaGridItem&)rSet.Get( _nWhich );
1293         aSnapToGridCB.Check(rSnap.GetValue());
1294     }
1295 
1296     _nWhich = GetWhich( SID_PARA_VERTALIGN );
1297     eItemState = rSet.GetItemState( _nWhich );
1298 
1299 	if ( eItemState >= SFX_ITEM_AVAILABLE )
1300     {
1301         aVertAlignLB.Show();
1302         aVertAlignFL.Show();
1303         aVertAlignFT.Show();
1304 
1305         const SvxParaVertAlignItem& rAlign = (const SvxParaVertAlignItem&)rSet.Get( _nWhich );
1306         aVertAlignLB.SelectEntryPos(rAlign.GetValue());
1307     }
1308 
1309     _nWhich = GetWhich( SID_ATTR_FRAMEDIRECTION );
1310     //text direction
1311     if( SFX_ITEM_AVAILABLE <= rSet.GetItemState( _nWhich ) )
1312 	{
1313         const SvxFrameDirectionItem& rFrameDirItem = ( const SvxFrameDirectionItem& ) rSet.Get( _nWhich );
1314         aTextDirectionLB.SelectEntryValue( (SvxFrameDirection)rFrameDirItem.GetValue() );
1315         aTextDirectionLB.SaveValue();
1316 	}
1317 
1318     aSnapToGridCB.SaveValue();
1319     aVertAlignLB.SaveValue();
1320     aLeft.SaveValue();
1321 	aRight.SaveValue();
1322 	aCenter.SaveValue();
1323 	aJustify.SaveValue();
1324 	aLastLineLB.SaveValue();
1325 	aExpandCB.SaveValue();
1326 
1327 	UpdateExample_Impl(sal_True);
1328 }
1329 
1330 /*-----------------17.01.97 08.06-------------------
1331 
1332 --------------------------------------------------*/
IMPL_LINK(SvxParaAlignTabPage,AlignHdl_Impl,RadioButton *,EMPTYARG)1333 IMPL_LINK( SvxParaAlignTabPage, AlignHdl_Impl, RadioButton*, EMPTYARG )
1334 {
1335 	sal_Bool bJustify = aJustify.IsChecked();
1336 	aLastLineFT.Enable(bJustify);
1337 	aLastLineLB.Enable(bJustify);
1338 	aExpandCB.Enable(bJustify);
1339 	UpdateExample_Impl(sal_False);
1340 	return 0;
1341 }
1342 
IMPL_LINK(SvxParaAlignTabPage,LastLineHdl_Impl,ListBox *,EMPTYARG)1343 IMPL_LINK( SvxParaAlignTabPage, LastLineHdl_Impl, ListBox*, EMPTYARG )
1344 {
1345 	UpdateExample_Impl(sal_False);
1346 	return 0;
1347 }
1348 
IMPL_LINK(SvxParaAlignTabPage,TextDirectionHdl_Impl,ListBox *,EMPTYARG)1349 IMPL_LINK( SvxParaAlignTabPage, TextDirectionHdl_Impl, ListBox*, EMPTYARG )
1350 {
1351 	SvxFrameDirection eDir = aTextDirectionLB.GetSelectEntryValue();
1352 	switch ( eDir )
1353 	{
1354 		// check the default alignment for this text direction
1355 		case FRMDIR_HORI_LEFT_TOP :		aLeft.Check( sal_True ); break;
1356 		case FRMDIR_HORI_RIGHT_TOP :	aRight.Check( sal_True ); break;
1357 		case FRMDIR_ENVIRONMENT :		/* do nothing */ break;
1358 		default:
1359 		{
1360 			DBG_ERRORFILE( "SvxParaAlignTabPage::TextDirectionHdl_Impl(): other directions not supported" );
1361 		}
1362 	}
1363 
1364 	return 0;
1365 }
1366 
1367 /*-----------------16.01.97 19.34-------------------
1368 
1369 --------------------------------------------------*/
UpdateExample_Impl(sal_Bool bAll)1370 void	SvxParaAlignTabPage::UpdateExample_Impl( sal_Bool bAll )
1371 {
1372 	if ( aLeft.IsChecked() )
1373 		aExampleWin.SetAdjust( SVX_ADJUST_LEFT );
1374 	else if ( aRight.IsChecked() )
1375 		aExampleWin.SetAdjust( SVX_ADJUST_RIGHT );
1376 	else if ( aCenter.IsChecked() )
1377 		aExampleWin.SetAdjust( SVX_ADJUST_CENTER );
1378 	else if ( aJustify.IsChecked() )
1379 	{
1380 		aExampleWin.SetAdjust( SVX_ADJUST_BLOCK );
1381 		SvxAdjust eLastBlock = SVX_ADJUST_LEFT;
1382 		sal_uInt16 nLBPos = aLastLineLB.GetSelectEntryPos();
1383 		if(nLBPos == 1)
1384 			eLastBlock = SVX_ADJUST_CENTER;
1385 		else if(nLBPos == 2)
1386 			eLastBlock = SVX_ADJUST_BLOCK;
1387 		aExampleWin.SetLastLine( eLastBlock );
1388 	}
1389 
1390 	aExampleWin.Draw( bAll );
1391 }
1392 /*-----------------17.01.97 08.04-------------------
1393 	Erweiterungen fuer den Blocksatz einschalten
1394 --------------------------------------------------*/
EnableJustifyExt()1395 void SvxParaAlignTabPage::EnableJustifyExt()
1396 {
1397 	aLastLineFT.Show();
1398 	aLastLineLB.Show();
1399 	aExpandCB  .Show();
1400     SvtLanguageOptions aCJKOptions;
1401     if(aCJKOptions.IsAsianTypographyEnabled())
1402         aSnapToGridCB.Show();
1403 
1404 }
1405 //add CHINA001 begin
PageCreated(SfxAllItemSet aSet)1406 void SvxParaAlignTabPage::PageCreated (SfxAllItemSet aSet)
1407 {
1408 	SFX_ITEMSET_ARG	(&aSet,pBoolItem,SfxBoolItem,SID_SVXPARAALIGNTABPAGE_ENABLEJUSTIFYEXT,sal_False);
1409 	if (pBoolItem)
1410 		if(pBoolItem->GetValue())
1411 			EnableJustifyExt();
1412 }
1413 //end of CHINA001
1414 // class SvxExtParagraphTabPage ------------------------------------------
1415 
Create(Window * pParent,const SfxItemSet & rSet)1416 SfxTabPage* SvxExtParagraphTabPage::Create( Window* pParent,
1417 											const SfxItemSet& rSet )
1418 {
1419 	return new SvxExtParagraphTabPage( pParent, rSet );
1420 }
1421 
1422 // -----------------------------------------------------------------------
1423 
FillItemSet(SfxItemSet & rOutSet)1424 sal_Bool SvxExtParagraphTabPage::FillItemSet( SfxItemSet& rOutSet )
1425 {
1426 	sal_Bool bModified = sal_False;
1427     sal_uInt16 _nWhich = GetWhich( SID_ATTR_PARA_HYPHENZONE );
1428 	const TriState eHyphenState = aHyphenBox.GetState();
1429 	const SfxPoolItem* pOld = GetOldItem( rOutSet, SID_ATTR_PARA_HYPHENZONE );
1430 
1431 	if ( eHyphenState != aHyphenBox.GetSavedValue() 	||
1432 		 aExtHyphenBeforeBox.IsValueModified() 	   		||
1433 		 aExtHyphenAfterBox.IsValueModified()			||
1434 		 aMaxHyphenEdit.IsValueModified() )
1435 	{
1436 		SvxHyphenZoneItem aHyphen(
1437             (const SvxHyphenZoneItem&)GetItemSet().Get( _nWhich ) );
1438 		aHyphen.SetHyphen( eHyphenState == STATE_CHECK );
1439 
1440 		if ( eHyphenState == STATE_CHECK )
1441 		{
1442 			aHyphen.GetMinLead() = (sal_uInt8)aExtHyphenBeforeBox.GetValue();
1443 			aHyphen.GetMinTrail() = (sal_uInt8)aExtHyphenAfterBox.GetValue();
1444 		}
1445 		aHyphen.GetMaxHyphens() = (sal_uInt8)aMaxHyphenEdit.GetValue();
1446 
1447 		if ( !pOld ||
1448 			!( *(SvxHyphenZoneItem*)pOld == aHyphen ) ||
1449 				eHyphenState != aHyphenBox.GetSavedValue())
1450 		{
1451 			rOutSet.Put( aHyphen );
1452 			bModified |= sal_True;
1453 		}
1454 	}
1455 
1456 	if (aPagenumEdit.IsEnabled() && aPagenumEdit.IsValueModified())
1457 	{
1458 		SfxUInt16Item aPageNum( SID_ATTR_PARA_PAGENUM,
1459 								(sal_uInt16)aPagenumEdit.GetValue() );
1460 
1461 		pOld = GetOldItem( rOutSet, SID_ATTR_PARA_PAGENUM );
1462 
1463 		if ( !pOld || ( (const SfxUInt16Item*)pOld )->GetValue() != aPageNum.GetValue() )
1464 		{
1465 			rOutSet.Put( aPageNum );
1466 			bModified |= sal_True;
1467 		}
1468 	}
1469 
1470 	// Seitenumbruch
1471 
1472 	TriState eState = aApplyCollBtn.GetState();
1473 	FASTBOOL bIsPageModel = sal_False;
1474 
1475     _nWhich = GetWhich( SID_ATTR_PARA_MODEL );
1476 	String sPage;
1477 	if ( eState != aApplyCollBtn.GetSavedValue() ||
1478 		 ( STATE_CHECK == eState &&
1479 		   aApplyCollBox.GetSelectEntryPos() != aApplyCollBox.GetSavedValue() ) )
1480 	{
1481 		if ( eState == STATE_CHECK )
1482 		{
1483 			sPage = aApplyCollBox.GetSelectEntry();
1484 			bIsPageModel = 0 != sPage.Len();
1485 		}
1486 		pOld = GetOldItem( rOutSet, SID_ATTR_PARA_MODEL );
1487 
1488 		if ( !pOld || ( (const SvxPageModelItem*)pOld )->GetValue() != sPage )
1489 		{
1490             rOutSet.Put( SvxPageModelItem( sPage, sal_False, _nWhich ) );
1491 			bModified |= sal_True;
1492 		}
1493 		else
1494 			bIsPageModel = sal_False;
1495 	}
1496 	else if(STATE_CHECK == eState && aApplyCollBtn.IsEnabled())
1497 		bIsPageModel = sal_True;
1498 	else
1499         rOutSet.Put( SvxPageModelItem( sPage, sal_False, _nWhich ) );
1500 
1501     _nWhich = GetWhich( SID_ATTR_PARA_PAGEBREAK );
1502 
1503 	if ( bIsPageModel )
1504 		// wird PageModel eingeschaltet, dann immer PageBreak ausschalten
1505         rOutSet.Put( SvxFmtBreakItem( SVX_BREAK_NONE, _nWhich ) );
1506 	else
1507 	{
1508 		eState = aPageBreakBox.GetState();
1509 		SfxItemState eModelState = GetItemSet().GetItemState(SID_ATTR_PARA_MODEL, sal_False);
1510 
1511 		if ( (eModelState == SFX_ITEM_SET && STATE_CHECK == aPageBreakBox.GetState()) ||
1512 			 eState != aPageBreakBox.GetSavedValue()				||
1513              aBreakTypeLB.GetSelectEntryPos() != aBreakTypeLB.GetSavedValue()   ||
1514              aBreakPositionLB.GetSelectEntryPos() != aBreakPositionLB.GetSavedValue() )
1515 		{
1516 			const SvxFmtBreakItem rOldBreak(
1517                     (const SvxFmtBreakItem&)GetItemSet().Get( _nWhich ));
1518 			SvxFmtBreakItem aBreak(rOldBreak.GetBreak(), rOldBreak.Which());
1519 
1520 			switch ( eState )
1521 			{
1522 				case STATE_CHECK:
1523 				{
1524                     sal_Bool bBefore = aBreakPositionLB.GetSelectEntryPos() == 0;
1525 
1526                     if ( aBreakTypeLB.GetSelectEntryPos() == 0 )
1527 					{
1528 						if ( bBefore )
1529 							aBreak.SetValue( SVX_BREAK_PAGE_BEFORE );
1530 						else
1531 							aBreak.SetValue( SVX_BREAK_PAGE_AFTER );
1532 					}
1533 					else
1534 					{
1535 						if ( bBefore )
1536 							aBreak.SetValue( SVX_BREAK_COLUMN_BEFORE );
1537 						else
1538 							aBreak.SetValue( SVX_BREAK_COLUMN_AFTER );
1539 					}
1540 					break;
1541 				}
1542 
1543 				case STATE_NOCHECK:
1544 					aBreak.SetValue( SVX_BREAK_NONE );
1545 					break;
1546                 default: ; //prevent warning
1547 			}
1548 			pOld = GetOldItem( rOutSet, SID_ATTR_PARA_PAGEBREAK );
1549 
1550 			if ( eState != aPageBreakBox.GetSavedValue()				||
1551 					!pOld || !( *(const SvxFmtBreakItem*)pOld == aBreak ) )
1552 			{
1553 				bModified |= sal_True;
1554 				rOutSet.Put( aBreak );
1555 			}
1556 		}
1557 	}
1558 
1559 
1560 	// Absatztrennung
1561     _nWhich = GetWhich( SID_ATTR_PARA_SPLIT );
1562 	eState = aKeepTogetherBox.GetState();
1563 
1564 	if ( eState != aKeepTogetherBox.GetSavedValue() )
1565 	{
1566 		pOld = GetOldItem( rOutSet, SID_ATTR_PARA_SPLIT );
1567 
1568 		if ( !pOld || ( (const SvxFmtSplitItem*)pOld )->GetValue() !=
1569 					  ( eState == STATE_NOCHECK ) )
1570 		{
1571             rOutSet.Put( SvxFmtSplitItem( eState == STATE_NOCHECK, _nWhich ) );
1572 			bModified |= sal_True;
1573 		}
1574 	}
1575 
1576 	// Absaetze zusammenhalten
1577     _nWhich = GetWhich( SID_ATTR_PARA_KEEP );
1578 	eState = aKeepParaBox.GetState();
1579 
1580 	if ( eState != aKeepParaBox.GetSavedValue() )
1581 	{
1582 		pOld = GetOldItem( rOutSet, SID_ATTR_PARA_KEEP );
1583 
1584 		// hat sich der Status geaendert, muss immer geputtet werden
1585         rOutSet.Put( SvxFmtKeepItem( eState == STATE_CHECK, _nWhich ) );
1586 		bModified |= sal_True;
1587 	}
1588 
1589 	// Witwen und Waisen
1590     _nWhich = GetWhich( SID_ATTR_PARA_WIDOWS );
1591 	eState = aWidowBox.GetState();
1592 
1593 	if ( eState != aWidowBox.GetSavedValue() ||
1594 		 aWidowRowNo.IsValueModified() )
1595 	{
1596 		SvxWidowsItem rItem( eState == STATE_CHECK ?
1597                              (sal_uInt8)aWidowRowNo.GetValue() : 0, _nWhich );
1598 		pOld = GetOldItem( rOutSet, SID_ATTR_PARA_WIDOWS );
1599 
1600 		if ( eState != aWidowBox.GetSavedValue() || !pOld || !( *(const SvxWidowsItem*)pOld == rItem ) )
1601 		{
1602 			rOutSet.Put( rItem );
1603 			bModified |= sal_True;
1604 		}
1605 	}
1606 
1607     _nWhich = GetWhich( SID_ATTR_PARA_ORPHANS );
1608 	eState = aOrphanBox.GetState();
1609 
1610 	if ( eState != aOrphanBox.GetSavedValue() ||
1611 		 aOrphanRowNo.IsValueModified() )
1612 	{
1613 		SvxOrphansItem rItem( eState == STATE_CHECK ?
1614                              (sal_uInt8)aOrphanRowNo.GetValue() : 0, _nWhich );
1615 		pOld = GetOldItem( rOutSet, SID_ATTR_PARA_ORPHANS );
1616 
1617 		if ( eState != aOrphanBox.GetSavedValue() ||
1618 				!pOld ||
1619 					!( *(const SvxOrphansItem*)pOld == rItem ) )
1620 		{
1621 			rOutSet.Put( rItem );
1622 			bModified |= sal_True;
1623 		}
1624 	}
1625 
1626     return bModified;
1627 }
1628 
1629 // -----------------------------------------------------------------------
1630 
Reset(const SfxItemSet & rSet)1631 void SvxExtParagraphTabPage::Reset( const SfxItemSet& rSet )
1632 {
1633     sal_uInt16 _nWhich = GetWhich( SID_ATTR_PARA_HYPHENZONE );
1634     SfxItemState eItemState = rSet.GetItemState( _nWhich );
1635 
1636 	sal_Bool bItemAvailable = eItemState >= SFX_ITEM_AVAILABLE;
1637 	sal_Bool bIsHyphen = sal_False;
1638 	if( !bHtmlMode && bItemAvailable )
1639 	{
1640 		const SvxHyphenZoneItem& rHyphen =
1641             (const SvxHyphenZoneItem&)rSet.Get( _nWhich );
1642 		aHyphenBox.EnableTriState( sal_False );
1643 
1644 		bIsHyphen = rHyphen.IsHyphen();
1645 		aHyphenBox.SetState( bIsHyphen ? STATE_CHECK : STATE_NOCHECK );
1646 
1647 		aExtHyphenBeforeBox.SetValue( rHyphen.GetMinLead() );
1648 		aExtHyphenAfterBox.SetValue( rHyphen.GetMinTrail() );
1649 		aMaxHyphenEdit.SetValue( rHyphen.GetMaxHyphens() );
1650 	}
1651 	else
1652 	{
1653 		aHyphenBox.SetState( STATE_DONTKNOW );
1654 	}
1655 	sal_Bool bEnable = bItemAvailable && bIsHyphen;
1656 	aExtHyphenBeforeBox.Enable(bEnable);
1657 	aExtHyphenAfterBox.Enable(bEnable);
1658 	aBeforeText.Enable(bEnable);
1659 	aAfterText.Enable(bEnable);
1660 	aMaxHyphenLabel.Enable(bEnable);
1661 	aMaxHyphenEdit.Enable(bEnable);
1662 
1663     _nWhich = GetWhich( SID_ATTR_PARA_PAGENUM );
1664 
1665     if ( rSet.GetItemState(_nWhich) >= SFX_ITEM_AVAILABLE )
1666 	{
1667 		const sal_uInt16 nPageNum =
1668             ( (const SfxUInt16Item&)rSet.Get( _nWhich ) ).GetValue();
1669 		aPagenumEdit.SetValue( nPageNum );
1670 	}
1671 
1672 	if ( bPageBreak )
1673 	{
1674 		// zuerst PageModel behandeln
1675         _nWhich = GetWhich( SID_ATTR_PARA_MODEL );
1676 		sal_Bool bIsPageModel = sal_False;
1677         eItemState = rSet.GetItemState( _nWhich );
1678 
1679 		if ( eItemState >= SFX_ITEM_SET )
1680 		{
1681 			aApplyCollBtn.EnableTriState( sal_False );
1682 
1683 			const SvxPageModelItem& rModel =
1684                 (const SvxPageModelItem&)rSet.Get( _nWhich );
1685 			String aStr( rModel.GetValue() );
1686 
1687 			if ( aStr.Len() &&
1688 				 aApplyCollBox.GetEntryPos( aStr ) != LISTBOX_ENTRY_NOTFOUND )
1689 			{
1690 				aApplyCollBox.SelectEntry( aStr );
1691 				aApplyCollBtn.SetState( STATE_CHECK );
1692 				bIsPageModel = sal_True;
1693 
1694 				aPageBreakBox.Enable();
1695 				aPageBreakBox.EnableTriState( sal_False );
1696                 aBreakTypeFT.Enable();
1697                 aBreakTypeLB.Enable();
1698                 aBreakPositionFT.Enable();
1699                 aBreakPositionLB.Enable();
1700                 aApplyCollBtn.Enable();
1701 				aPageBreakBox.SetState( STATE_CHECK );
1702 
1703                 //select page break
1704                 aBreakTypeLB.SelectEntryPos(0);
1705                 //select break before
1706                 aBreakPositionLB.SelectEntryPos(0);
1707 			}
1708 			else
1709 			{
1710 				aApplyCollBox.SetNoSelection();
1711 				aApplyCollBtn.SetState( STATE_NOCHECK );
1712 			}
1713 		}
1714 		else if ( SFX_ITEM_DONTCARE == eItemState )
1715 		{
1716 			aApplyCollBtn.EnableTriState( sal_True );
1717 			aApplyCollBtn.SetState( STATE_DONTKNOW );
1718 			aApplyCollBox.SetNoSelection();
1719 		}
1720 		else
1721 		{
1722 			aApplyCollBtn.Enable(sal_False);
1723 			aApplyCollBox.Enable(sal_False);
1724 			aPagenumEdit.Enable(sal_False);
1725 			aPagenumText.Enable(sal_False);
1726 		}
1727 //!!!	ApplyCollClickHdl_Impl( &aApplyCollBtn );
1728 
1729 		if ( !bIsPageModel )
1730 		{
1731             _nWhich = GetWhich( SID_ATTR_PARA_PAGEBREAK );
1732             eItemState = rSet.GetItemState( _nWhich );
1733 
1734 			if ( eItemState >= SFX_ITEM_AVAILABLE )
1735 			{
1736 				const SvxFmtBreakItem& rPageBreak =
1737                     (const SvxFmtBreakItem&)rSet.Get( _nWhich );
1738 
1739 				SvxBreak eBreak = (SvxBreak)rPageBreak.GetValue();
1740 
1741 				// PageBreak nicht ueber CTRL-RETURN,
1742 				// dann kann CheckBox frei gegeben werden
1743 				aPageBreakBox.Enable();
1744 				aPageBreakBox.EnableTriState( sal_False );
1745                 aBreakTypeFT.Enable();
1746                 aBreakTypeLB.Enable();
1747                 aBreakPositionFT.Enable();
1748                 aBreakPositionLB.Enable();
1749 
1750 				aPageBreakBox.SetState( STATE_CHECK );
1751 
1752                 sal_Bool _bEnable =     eBreak != SVX_BREAK_NONE &&
1753 								eBreak != SVX_BREAK_COLUMN_BEFORE &&
1754 								eBreak != SVX_BREAK_COLUMN_AFTER;
1755                 aApplyCollBtn.Enable(_bEnable);
1756                 if(!_bEnable)
1757 				{
1758                     aApplyCollBox.Enable(_bEnable);
1759                     aPagenumEdit.Enable(_bEnable);
1760 				}
1761 
1762 				if ( eBreak == SVX_BREAK_NONE )
1763 					aPageBreakBox.SetState( STATE_NOCHECK );
1764 
1765                 sal_uInt16 nType = 0; // selection position in break type ListBox : Page
1766                 sal_uInt16 nPosition = 0; //  selection position in break position ListBox : Before
1767                 switch ( eBreak )
1768 				{
1769 					case SVX_BREAK_PAGE_BEFORE:
1770 						break;
1771 					case SVX_BREAK_PAGE_AFTER:
1772                         nPosition = 1;
1773 						break;
1774 					case SVX_BREAK_COLUMN_BEFORE:
1775                         nType = 1;
1776 						break;
1777 					case SVX_BREAK_COLUMN_AFTER:
1778                         nType = 1;
1779                         nPosition = 1;
1780 						break;
1781                     default: ;//prevent warning
1782 				}
1783                 aBreakTypeLB.SelectEntryPos(nType);
1784                 aBreakPositionLB.SelectEntryPos(nPosition);
1785             }
1786 			else if ( SFX_ITEM_DONTCARE == eItemState )
1787 				aPageBreakBox.SetState( STATE_DONTKNOW );
1788 			else
1789 			{
1790                 aPageBreakBox.Enable(sal_False);
1791                 aBreakTypeFT.Enable(sal_False);
1792                 aBreakTypeLB.Enable(sal_False);
1793                 aBreakPositionFT.Enable(sal_False);
1794                 aBreakPositionLB.Enable(sal_False);
1795 			}
1796 		}
1797 
1798         PageBreakPosHdl_Impl( &aBreakPositionLB );
1799 		PageBreakHdl_Impl( &aPageBreakBox );
1800 	}
1801 
1802     _nWhich = GetWhich( SID_ATTR_PARA_KEEP );
1803     eItemState = rSet.GetItemState( _nWhich );
1804 
1805 	if ( eItemState >= SFX_ITEM_AVAILABLE )
1806 	{
1807 		aKeepParaBox.EnableTriState( sal_False );
1808 		const SvxFmtKeepItem& rKeep =
1809             (const SvxFmtKeepItem&)rSet.Get( _nWhich );
1810 
1811 		if ( rKeep.GetValue() )
1812 			aKeepParaBox.SetState( STATE_CHECK );
1813 		else
1814 			aKeepParaBox.SetState( STATE_NOCHECK );
1815 	}
1816 	else if ( SFX_ITEM_DONTCARE == eItemState )
1817 		aKeepParaBox.SetState( STATE_DONTKNOW );
1818 	else
1819 		aKeepParaBox.Enable(sal_False);
1820 
1821     _nWhich = GetWhich( SID_ATTR_PARA_SPLIT );
1822     eItemState = rSet.GetItemState( _nWhich );
1823 
1824 	if ( eItemState >= SFX_ITEM_AVAILABLE )
1825 	{
1826 		const SvxFmtSplitItem& rSplit =
1827             (const SvxFmtSplitItem&)rSet.Get( _nWhich );
1828 		aKeepTogetherBox.EnableTriState( sal_False );
1829 
1830 		if ( !rSplit.GetValue() )
1831 			aKeepTogetherBox.SetState( STATE_CHECK );
1832 		else
1833 		{
1834 			aKeepTogetherBox.SetState( STATE_NOCHECK );
1835 
1836 			// Witwen und Waisen
1837 			aWidowBox.Enable();
1838             _nWhich = GetWhich( SID_ATTR_PARA_WIDOWS );
1839             SfxItemState eTmpState = rSet.GetItemState( _nWhich );
1840 
1841 			if ( eTmpState >= SFX_ITEM_AVAILABLE )
1842 			{
1843 				const SvxWidowsItem& rWidow =
1844                     (const SvxWidowsItem&)rSet.Get( _nWhich );
1845 				aWidowBox.EnableTriState( sal_False );
1846 				const sal_uInt16 nLines = rWidow.GetValue();
1847 
1848                 sal_Bool _bEnable = nLines > 0;
1849 				aWidowRowNo.SetValue( aWidowRowNo.Normalize( nLines ) );
1850                 aWidowBox.SetState( _bEnable ? STATE_CHECK : STATE_NOCHECK);
1851                 aWidowRowNo.Enable(_bEnable);
1852                 aWidowRowLabel.Enable(_bEnable);
1853 
1854 			}
1855 			else if ( SFX_ITEM_DONTCARE == eTmpState )
1856 				aWidowBox.SetState( STATE_DONTKNOW );
1857 			else
1858 				aWidowBox.Enable(sal_False);
1859 
1860 			aOrphanBox.Enable();
1861             _nWhich = GetWhich( SID_ATTR_PARA_ORPHANS );
1862             eTmpState = rSet.GetItemState( _nWhich );
1863 
1864 			if ( eTmpState >= SFX_ITEM_AVAILABLE )
1865 			{
1866 				const SvxOrphansItem& rOrphan =
1867                     (const SvxOrphansItem&)rSet.Get( _nWhich );
1868 				const sal_uInt16 nLines = rOrphan.GetValue();
1869 				aOrphanBox.EnableTriState( sal_False );
1870 
1871                 sal_Bool _bEnable = nLines > 0;
1872                 aOrphanBox.SetState( _bEnable ? STATE_CHECK : STATE_NOCHECK);
1873 				aOrphanRowNo.SetValue( aOrphanRowNo.Normalize( nLines ) );
1874                 aOrphanRowNo.Enable(_bEnable);
1875                 aOrphanRowLabel.Enable(_bEnable);
1876 
1877 			}
1878 			else if ( SFX_ITEM_DONTCARE == eTmpState )
1879 				aOrphanBox.SetState( STATE_DONTKNOW );
1880 			else
1881 				aOrphanBox.Enable(sal_False);
1882 		}
1883 	}
1884 	else if ( SFX_ITEM_DONTCARE == eItemState )
1885 		aKeepTogetherBox.SetState( STATE_DONTKNOW );
1886 	else
1887 		aKeepTogetherBox.Enable(sal_False);
1888 
1889 	// damit alles richt enabled wird
1890 	KeepTogetherHdl_Impl( 0 );
1891 	WidowHdl_Impl( 0 );
1892 	OrphanHdl_Impl( 0 );
1893 
1894     aHyphenBox.SaveValue();
1895 	aExtHyphenBeforeBox.SaveValue();
1896 	aExtHyphenAfterBox.SaveValue();
1897 	aMaxHyphenEdit.SaveValue();
1898 	aPageBreakBox.SaveValue();
1899     aBreakPositionLB.SaveValue();
1900     aBreakTypeLB.SaveValue();
1901 	aApplyCollBtn.SaveValue();
1902 	aApplyCollBox.SaveValue();
1903 	aPagenumEdit.SaveValue();
1904 	aKeepTogetherBox.SaveValue();
1905 	aKeepParaBox.SaveValue();
1906 	aWidowBox.SaveValue();
1907 	aOrphanBox.SaveValue();
1908 }
1909 
1910 // -----------------------------------------------------------------------
1911 
DeactivatePage(SfxItemSet * _pSet)1912 int SvxExtParagraphTabPage::DeactivatePage( SfxItemSet* _pSet )
1913 {
1914     if ( _pSet )
1915         FillItemSet( *_pSet );
1916 	return LEAVE_PAGE;
1917 }
1918 
1919 // -----------------------------------------------------------------------
1920 
DisablePageBreak()1921 void SvxExtParagraphTabPage::DisablePageBreak()
1922 {
1923 	bPageBreak = sal_False;
1924 	aPageBreakBox.Enable(sal_False);
1925     aBreakTypeLB.RemoveEntry(0);
1926     aBreakPositionFT.Enable(sal_False);
1927     aBreakPositionLB.Enable(sal_False);
1928 	aApplyCollBtn.Enable(sal_False);
1929 	aApplyCollBox.Enable(sal_False);
1930 	aPagenumEdit.Enable(sal_False);
1931 }
1932 
1933 // -----------------------------------------------------------------------
1934 
SvxExtParagraphTabPage(Window * pParent,const SfxItemSet & rAttr)1935 SvxExtParagraphTabPage::SvxExtParagraphTabPage( Window* pParent, const SfxItemSet& rAttr ) :
1936 
1937 	SfxTabPage( pParent, CUI_RES( RID_SVXPAGE_EXT_PARAGRAPH ), rAttr ),
1938 
1939     aExtFL              ( this, CUI_RES( FL_HYPHEN ) ),
1940 	aHyphenBox    		( this, CUI_RES( BTN_HYPHEN ) ),
1941 	aBeforeText			( this, CUI_RES( FT_HYPHENBEFORE ) ),
1942 	aExtHyphenBeforeBox ( this, CUI_RES( ED_HYPHENBEFORE ) ),
1943 	aAfterText			( this, CUI_RES( FT_HYPHENAFTER ) ),
1944 	aExtHyphenAfterBox  ( this, CUI_RES( ED_HYPHENAFTER ) ),
1945 	aMaxHyphenLabel     ( this, CUI_RES( FT_MAXHYPH ) ),
1946 	aMaxHyphenEdit		( this, CUI_RES( ED_MAXHYPH ) ),
1947     aBreaksFL           ( this, CUI_RES( FL_BREAKS ) ),
1948     aPageBreakBox       ( this, CUI_RES( BTN_PAGEBREAK ) ),
1949     aBreakTypeFT        ( this, CUI_RES( FT_BREAKTYPE     )),
1950     aBreakTypeLB        ( this, CUI_RES( LB_BREAKTYPE     )),
1951     aBreakPositionFT    ( this, CUI_RES( FT_BREAKPOSITION )),
1952     aBreakPositionLB    ( this, CUI_RES( LB_BREAKPOSITION )),
1953 //    aPageBox            ( this, CUI_RES( BTN_BREAKPAGE ) ),
1954 //    aColumnBox          ( this, CUI_RES( BTN_BREAKCOLUMN ) ),
1955 //    aBeforeBox          ( this, CUI_RES( BTN_PAGEBREAKBEFORE ) ),
1956 //    aAfterBox           ( this, CUI_RES( BTN_PAGEBREAKAFTER ) ),
1957 	aApplyCollBtn       ( this, CUI_RES( BTN_PAGECOLL ) ),
1958 	aApplyCollBox       ( this, CUI_RES( LB_PAGECOLL ) ),
1959 	aPagenumText		( this, CUI_RES( FT_PAGENUM ) ),
1960 	aPagenumEdit		( this, CUI_RES( ED_PAGENUM ) ),
1961     aExtendFL           ( this, CUI_RES( FL_OPTIONS ) ),
1962     aKeepTogetherBox    ( this, CUI_RES( BTN_KEEPTOGETHER ) ),
1963 	aKeepParaBox		( this, CUI_RES( CB_KEEPTOGETHER ) ),
1964 	aOrphanBox          ( this, CUI_RES( BTN_ORPHANS ) ),
1965 	aOrphanRowNo        ( this, CUI_RES( ED_ORPHANS ) ),
1966 	aOrphanRowLabel     ( this, CUI_RES( FT_ORPHANS ) ),
1967 	aWidowBox           ( this, CUI_RES( BTN_WIDOWS ) ),
1968 	aWidowRowNo         ( this, CUI_RES( ED_WIDOWS ) ),
1969 	aWidowRowLabel      ( this, CUI_RES( FT_WIDOWS ) ),
1970     bPageBreak  ( sal_True ),
1971     bHtmlMode   ( sal_False ),
1972     nStdPos     ( 0 )
1973 {
1974 	FreeResource();
1975 
1976 	aApplyCollBox.SetAccessibleRelationLabeledBy(&aApplyCollBtn);
1977 	aApplyCollBox.SetAccessibleName(String(CUI_RES(STR_PAGE_STYLE)));
1978 	aOrphanRowNo.SetAccessibleRelationLabeledBy(&aOrphanBox);
1979 	aWidowRowNo.SetAccessibleRelationLabeledBy(&aWidowBox);
1980 
1981 	// diese Page braucht ExchangeSupport
1982 	SetExchangeSupport();
1983 
1984 	aHyphenBox.SetClickHdl( 		LINK( this, SvxExtParagraphTabPage, HyphenClickHdl_Impl ) );
1985 	aPageBreakBox.SetClickHdl( 		LINK( this, SvxExtParagraphTabPage, PageBreakHdl_Impl ) );
1986 	aKeepTogetherBox.SetClickHdl( 	LINK( this, SvxExtParagraphTabPage, KeepTogetherHdl_Impl ) );
1987 	aWidowBox.SetClickHdl( 			LINK( this, SvxExtParagraphTabPage, WidowHdl_Impl ) );
1988 	aOrphanBox.SetClickHdl( 		LINK( this, SvxExtParagraphTabPage, OrphanHdl_Impl ) );
1989 	aApplyCollBtn.SetClickHdl( 		LINK( this, SvxExtParagraphTabPage, ApplyCollClickHdl_Impl ) );
1990     aBreakTypeLB.SetSelectHdl(      LINK( this, SvxExtParagraphTabPage, PageBreakTypeHdl_Impl ) );
1991     aBreakPositionLB.SetSelectHdl(  LINK( this, SvxExtParagraphTabPage, PageBreakPosHdl_Impl ) );
1992 
1993 	SfxObjectShell* pSh = SfxObjectShell::Current();
1994 	if ( pSh )
1995 	{
1996 		SfxStyleSheetBasePool* pPool = pSh->GetStyleSheetPool();
1997 		pPool->SetSearchMask( SFX_STYLE_FAMILY_PAGE );
1998 		SfxStyleSheetBase* pStyle = pPool->First();
1999 		String aStdName;
2000 
2001 		while( pStyle )
2002 		{
2003 			if ( aStdName.Len() == 0 )
2004 				// first style == standard style
2005 				aStdName = pStyle->GetName();
2006 			aApplyCollBox.InsertEntry( pStyle->GetName() );
2007 			pStyle = pPool->Next();
2008 		}
2009 		nStdPos = aApplyCollBox.GetEntryPos( aStdName );
2010 	}
2011 
2012 	sal_uInt16 nHtmlMode = GetHtmlMode_Impl( rAttr );
2013 	if ( nHtmlMode & HTMLMODE_ON )
2014 	{
2015 		bHtmlMode = sal_True;
2016 		aHyphenBox    		 .Enable(sal_False);
2017 		aBeforeText			 .Enable(sal_False);
2018 		aExtHyphenBeforeBox  .Enable(sal_False);
2019 		aAfterText			 .Enable(sal_False);
2020 		aExtHyphenAfterBox   .Enable(sal_False);
2021 		aMaxHyphenLabel      .Enable(sal_False);
2022 		aMaxHyphenEdit		 .Enable(sal_False);
2023         aExtFL               .Enable(sal_False);
2024 		aPagenumText         .Enable(sal_False);
2025 		aPagenumEdit         .Enable(sal_False);
2026         // no column break in HTML
2027         aBreakTypeLB.RemoveEntry(1);
2028 	}
2029 }
2030 
2031 // -----------------------------------------------------------------------
2032 
~SvxExtParagraphTabPage()2033 __EXPORT SvxExtParagraphTabPage::~SvxExtParagraphTabPage()
2034 {
2035 }
2036 
2037 // -----------------------------------------------------------------------
2038 
GetRanges()2039 sal_uInt16* SvxExtParagraphTabPage::GetRanges()
2040 {
2041 	return pExtRanges;
2042 }
2043 
2044 // -----------------------------------------------------------------------
2045 
IMPL_LINK(SvxExtParagraphTabPage,PageBreakHdl_Impl,TriStateBox *,EMPTYARG)2046 IMPL_LINK( SvxExtParagraphTabPage, PageBreakHdl_Impl, TriStateBox *, EMPTYARG )
2047 {
2048 	switch ( aPageBreakBox.GetState() )
2049 	{
2050 		case STATE_CHECK:
2051             aBreakTypeFT.Enable();
2052             aBreakTypeLB.Enable();
2053             aBreakPositionFT.Enable();
2054             aBreakPositionLB.Enable();
2055 
2056             if ( 0 == aBreakTypeLB.GetSelectEntryPos()&&
2057                 0 == aBreakPositionLB.GetSelectEntryPos() )
2058 			{
2059 				aApplyCollBtn.Enable();
2060 
2061 				sal_Bool bEnable = STATE_CHECK == aApplyCollBtn.GetState() &&
2062 											aApplyCollBox.GetEntryCount();
2063 				aApplyCollBox.Enable(bEnable);
2064 				if(!bHtmlMode)
2065 				{
2066 					aPagenumText.Enable(bEnable);
2067 					aPagenumEdit.Enable(bEnable);
2068 				}
2069 			}
2070 			break;
2071 
2072 		case STATE_NOCHECK:
2073 		case STATE_DONTKNOW:
2074 			aApplyCollBtn.SetState( STATE_NOCHECK );
2075 			aApplyCollBtn.Enable(sal_False);
2076 			aApplyCollBox.Enable(sal_False);
2077 			aPagenumText.Enable(sal_False);
2078 			aPagenumEdit.Enable(sal_False);
2079             aBreakTypeFT.Enable(sal_False);
2080             aBreakTypeLB.Enable(sal_False);
2081             aBreakPositionFT.Enable(sal_False);
2082             aBreakPositionLB.Enable(sal_False);
2083 			break;
2084 	}
2085 	return 0;
2086 }
2087 
2088 // -----------------------------------------------------------------------
2089 
IMPL_LINK(SvxExtParagraphTabPage,KeepTogetherHdl_Impl,TriStateBox *,EMPTYARG)2090 IMPL_LINK( SvxExtParagraphTabPage, KeepTogetherHdl_Impl, TriStateBox *, EMPTYARG )
2091 {
2092 	sal_Bool bEnable = aKeepTogetherBox.GetState() == STATE_NOCHECK;
2093 	aWidowBox.Enable(bEnable);
2094 	aOrphanBox.Enable(bEnable);
2095 
2096 	return 0;
2097 }
2098 
2099 // -----------------------------------------------------------------------
2100 
IMPL_LINK(SvxExtParagraphTabPage,WidowHdl_Impl,TriStateBox *,EMPTYARG)2101 IMPL_LINK( SvxExtParagraphTabPage, WidowHdl_Impl, TriStateBox *, EMPTYARG )
2102 {
2103 	switch ( aWidowBox.GetState() )
2104 	{
2105 		case STATE_CHECK:
2106 			aWidowRowNo.Enable();
2107 			aWidowRowLabel.Enable();
2108 			aKeepTogetherBox.Enable(sal_False);
2109 			break;
2110 
2111 		case STATE_NOCHECK:
2112 			if ( aOrphanBox.GetState() == STATE_NOCHECK )
2113 				aKeepTogetherBox.Enable();
2114 
2115 		// kein break
2116 		case STATE_DONTKNOW:
2117 			aWidowRowNo.Enable(sal_False);
2118 			aWidowRowLabel.Enable(sal_False);
2119 			break;
2120 	}
2121 	return 0;
2122 }
2123 
2124 // -----------------------------------------------------------------------
2125 
IMPL_LINK(SvxExtParagraphTabPage,OrphanHdl_Impl,TriStateBox *,EMPTYARG)2126 IMPL_LINK( SvxExtParagraphTabPage, OrphanHdl_Impl, TriStateBox *, EMPTYARG )
2127 {
2128 	switch( aOrphanBox.GetState() )
2129 	{
2130 		case STATE_CHECK:
2131 			aOrphanRowNo.Enable();
2132 			aOrphanRowLabel.Enable();
2133 			aKeepTogetherBox.Enable(sal_False);
2134 			break;
2135 
2136 		case STATE_NOCHECK:
2137 			if ( aWidowBox.GetState() == STATE_NOCHECK )
2138 				aKeepTogetherBox.Enable();
2139 
2140 		// kein break
2141 		case STATE_DONTKNOW:
2142 			aOrphanRowNo.Enable(sal_False);
2143 			aOrphanRowLabel.Enable(sal_False);
2144 			break;
2145 	}
2146 	return 0;
2147 }
2148 
2149 // -----------------------------------------------------------------------
2150 
IMPL_LINK(SvxExtParagraphTabPage,HyphenClickHdl_Impl,TriStateBox *,EMPTYARG)2151 IMPL_LINK( SvxExtParagraphTabPage, HyphenClickHdl_Impl, TriStateBox *, EMPTYARG )
2152 {
2153 
2154 	sal_Bool bEnable = aHyphenBox.GetState() == STATE_CHECK;
2155 	aBeforeText.Enable(bEnable);
2156 	aExtHyphenBeforeBox.Enable(bEnable);
2157 	aAfterText.Enable(bEnable);
2158 	aExtHyphenAfterBox.Enable(bEnable);
2159 	aMaxHyphenLabel.Enable(bEnable);
2160 	aMaxHyphenEdit.Enable(bEnable);
2161 	aHyphenBox.SetState( bEnable ? STATE_CHECK : STATE_NOCHECK);
2162 
2163 	return 0;
2164 }
2165 
2166 // -----------------------------------------------------------------------
2167 
IMPL_LINK(SvxExtParagraphTabPage,ApplyCollClickHdl_Impl,TriStateBox *,EMPTYARG)2168 IMPL_LINK( SvxExtParagraphTabPage, ApplyCollClickHdl_Impl, TriStateBox *, EMPTYARG )
2169 {
2170 	sal_Bool bEnable = sal_False;
2171 	if ( aApplyCollBtn.GetState() == STATE_CHECK &&
2172 		 aApplyCollBox.GetEntryCount() )
2173 	{
2174 		bEnable = sal_True;
2175 		aApplyCollBox.SelectEntryPos( nStdPos );
2176 	}
2177 	else
2178 	{
2179 		aApplyCollBox.SetNoSelection();
2180 	}
2181 	aApplyCollBox.Enable(bEnable);
2182 	if(!bHtmlMode)
2183 	{
2184 		aPagenumText.Enable(bEnable);
2185 		aPagenumEdit.Enable(bEnable);
2186 	}
2187 	return 0;
2188 }
2189 
2190 // -----------------------------------------------------------------------
2191 
IMPL_LINK(SvxExtParagraphTabPage,PageBreakPosHdl_Impl,ListBox *,pListBox)2192 IMPL_LINK( SvxExtParagraphTabPage, PageBreakPosHdl_Impl, ListBox *, pListBox )
2193 {
2194     if ( 0 == pListBox->GetSelectEntryPos() )
2195     {
2196         aApplyCollBtn.Enable();
2197 
2198         sal_Bool bEnable = aApplyCollBtn.GetState() == STATE_CHECK &&
2199                                     aApplyCollBox.GetEntryCount();
2200 
2201         aApplyCollBox.Enable(bEnable);
2202         if(!bHtmlMode)
2203         {
2204             aPagenumText.Enable(bEnable);
2205             aPagenumEdit.Enable(bEnable);
2206         }
2207     }
2208     else if ( 1 == pListBox->GetSelectEntryPos() )
2209     {
2210         aApplyCollBtn.SetState( STATE_NOCHECK );
2211         aApplyCollBtn.Enable(sal_False);
2212         aApplyCollBox.Enable(sal_False);
2213         aPagenumText.Enable(sal_False);
2214         aPagenumEdit.Enable(sal_False);
2215     }
2216 	return 0;
2217 }
2218 
2219 // -----------------------------------------------------------------------
2220 
IMPL_LINK(SvxExtParagraphTabPage,PageBreakTypeHdl_Impl,ListBox *,pListBox)2221 IMPL_LINK( SvxExtParagraphTabPage, PageBreakTypeHdl_Impl, ListBox *, pListBox )
2222 {
2223     //column break or break break after
2224     sal_uInt16 nBreakPos = aBreakPositionLB.GetSelectEntryPos();
2225     if ( pListBox->GetSelectEntryPos() == 1 || 1 == nBreakPos)
2226 	{
2227 		aApplyCollBtn.SetState( STATE_NOCHECK );
2228 		aApplyCollBtn.Enable(sal_False);
2229 		aApplyCollBox.Enable(sal_False);
2230 		aPagenumText.Enable(sal_False);
2231 		aPagenumEdit.Enable(sal_False);
2232 	}
2233     else
2234         PageBreakPosHdl_Impl( &aBreakPositionLB );
2235 	return 0;
2236 }
2237 //Add CHINA001 begin
PageCreated(SfxAllItemSet aSet)2238 void SvxExtParagraphTabPage::PageCreated(SfxAllItemSet aSet)
2239 {
2240 
2241 
2242 	SFX_ITEMSET_ARG	(&aSet,pDisablePageBreakItem,SfxBoolItem,SID_DISABLE_SVXEXTPARAGRAPHTABPAGE_PAGEBREAK,sal_False);
2243 
2244 	if (pDisablePageBreakItem)
2245 		if ( pDisablePageBreakItem->GetValue())
2246 					DisablePageBreak();
2247 
2248 
2249 }
2250 //end of Add CHINA001
2251 /*-- 29.11.00 11:36:24---------------------------------------------------
2252 
2253   -----------------------------------------------------------------------*/
SvxAsianTabPage(Window * pParent,const SfxItemSet & rSet)2254 SvxAsianTabPage::SvxAsianTabPage( Window* pParent, const SfxItemSet& rSet ) :
2255 	SfxTabPage(pParent, CUI_RES( RID_SVXPAGE_PARA_ASIAN ), rSet),
2256     aOptionsFL(         this, CUI_RES(FL_AS_OPTIONS       )),
2257     aForbiddenRulesCB(  this, CUI_RES(CB_AS_FORBIDDEN     )),
2258     aHangingPunctCB(    this, CUI_RES(CB_AS_HANG_PUNC     )),
2259 	aScriptSpaceCB(     this, CUI_RES(CB_AS_SCRIPT_SPACE	))//,
2260 
2261 {
2262 	FreeResource();
2263 
2264 	Link aLink = LINK( this, SvxAsianTabPage, ClickHdl_Impl );
2265 	aHangingPunctCB.SetClickHdl( aLink );
2266 	aScriptSpaceCB.SetClickHdl( aLink );
2267 	aForbiddenRulesCB.SetClickHdl( aLink );
2268 
2269 }
2270 /*-- 29.11.00 11:36:24---------------------------------------------------
2271 
2272   -----------------------------------------------------------------------*/
~SvxAsianTabPage()2273 SvxAsianTabPage::~SvxAsianTabPage()
2274 {
2275 }
2276 /*-- 29.11.00 11:36:24---------------------------------------------------
2277 
2278   -----------------------------------------------------------------------*/
Create(Window * pParent,const SfxItemSet & rSet)2279 SfxTabPage*	SvxAsianTabPage::Create(	Window* pParent, const SfxItemSet& rSet )
2280 {
2281 	return new SvxAsianTabPage(pParent, rSet);
2282 }
2283 /*-- 29.11.00 11:36:24---------------------------------------------------
2284 
2285   -----------------------------------------------------------------------*/
GetRanges()2286 sal_uInt16*		SvxAsianTabPage::GetRanges()
2287 {
2288 	static sal_uInt16 pRanges[] =
2289 	{
2290 		SID_ATTR_PARA_SCRIPTSPACE, SID_ATTR_PARA_FORBIDDEN_RULES,
2291 		0
2292 	};
2293 	return pRanges;
2294 }
2295 /*-- 29.11.00 11:36:24---------------------------------------------------
2296 
2297   -----------------------------------------------------------------------*/
FillItemSet(SfxItemSet & rSet)2298 sal_Bool		SvxAsianTabPage::FillItemSet( SfxItemSet& rSet )
2299 {
2300 	sal_Bool bRet = sal_False;
2301 	SfxItemPool* pPool = rSet.GetPool();
2302 	if(aScriptSpaceCB.IsChecked() != aScriptSpaceCB.GetSavedValue())
2303 	{
2304 		SfxBoolItem* pNewItem = (SfxBoolItem*)rSet.Get(
2305 			pPool->GetWhich(SID_ATTR_PARA_SCRIPTSPACE)).Clone();
2306 		pNewItem->SetValue(aScriptSpaceCB.IsChecked());
2307 		rSet.Put(*pNewItem);
2308 		delete pNewItem;
2309 		bRet = sal_True;
2310 	}
2311 	if(aHangingPunctCB.IsChecked() != aHangingPunctCB.GetSavedValue())
2312 	{
2313 		SfxBoolItem* pNewItem = (SfxBoolItem*)rSet.Get(
2314 			pPool->GetWhich(SID_ATTR_PARA_HANGPUNCTUATION)).Clone();
2315 		pNewItem->SetValue(aHangingPunctCB.IsChecked());
2316 		rSet.Put(*pNewItem);
2317 		delete pNewItem;
2318 		bRet = sal_True;
2319 	}
2320 	if(aForbiddenRulesCB.IsChecked() != aForbiddenRulesCB.GetSavedValue())
2321 	{
2322 		SfxBoolItem* pNewItem = (SfxBoolItem*)rSet.Get(
2323 			pPool->GetWhich(SID_ATTR_PARA_FORBIDDEN_RULES)).Clone();
2324 		pNewItem->SetValue(aForbiddenRulesCB.IsChecked());
2325 		rSet.Put(*pNewItem);
2326 		delete pNewItem;
2327 		bRet = sal_True;
2328 	}
2329 	return bRet;
2330 }
2331 /*-- 29.11.00 11:36:25---------------------------------------------------
2332 
2333   -----------------------------------------------------------------------*/
lcl_SetBox(const SfxItemSet & rSet,sal_uInt16 nSlotId,TriStateBox & rBox)2334 void lcl_SetBox(const SfxItemSet& rSet, sal_uInt16 nSlotId, TriStateBox& rBox)
2335 {
2336     sal_uInt16 _nWhich = rSet.GetPool()->GetWhich(nSlotId);
2337     SfxItemState eState = rSet.GetItemState(_nWhich, sal_True);
2338 	if(!eState || eState == SFX_ITEM_DISABLED )
2339 		rBox.Enable(sal_False);
2340 	else if(eState >= SFX_ITEM_AVAILABLE)
2341 	{
2342 		rBox.EnableTriState( sal_False );
2343         rBox.Check(((const SfxBoolItem&)rSet.Get(_nWhich)).GetValue());
2344 	}
2345 	else
2346 		rBox.SetState( STATE_DONTKNOW );
2347 	rBox.SaveValue();
2348 }
2349 
2350 
Reset(const SfxItemSet & rSet)2351 void SvxAsianTabPage::Reset( const SfxItemSet& rSet )
2352 {
2353 	lcl_SetBox(rSet, SID_ATTR_PARA_FORBIDDEN_RULES, aForbiddenRulesCB );
2354 //	lcl_SetBox(rSet, , aAllowWordBreakCB );
2355 	lcl_SetBox(rSet, SID_ATTR_PARA_HANGPUNCTUATION, aHangingPunctCB );
2356 
2357 
2358 	//character distance not yet available
2359 //	lcl_SetBox(rSet, , aPuntuationCB    );
2360 	lcl_SetBox(rSet, SID_ATTR_PARA_SCRIPTSPACE, aScriptSpaceCB );
2361 //	lcl_SetBox(rSet, , aAdjustNumbersCB );
2362 //	aAllowWordBreakCB	.Enable(sal_False);
2363 //	aPuntuationCB		.Enable(sal_False);
2364 //	aAdjustNumbersCB	.Enable(sal_False);
2365 }
2366 /* -----------------------------19.12.00 12:59--------------------------------
2367 
2368  ---------------------------------------------------------------------------*/
IMPL_LINK(SvxAsianTabPage,ClickHdl_Impl,TriStateBox *,pBox)2369 IMPL_LINK( SvxAsianTabPage, ClickHdl_Impl, TriStateBox*, pBox )
2370 {
2371 	pBox->EnableTriState( sal_False );
2372 	return 0;
2373 }
2374