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 #include "precompiled_sc.hxx"
23 
24 #include <sfx2/sidebar/ResourceDefinitions.hrc>
25 #include <sfx2/sidebar/Theme.hxx>
26 #include <sfx2/sidebar/ControlFactory.hxx>
27 #include <AlignmentPropertyPanel.hxx>
28 #include <AlignmentPropertyPanel.hrc>
29 #include <svx/dialmgr.hxx>
30 #include "sc.hrc"
31 #include "scresid.hxx"
32 #include <sfx2/bindings.hxx>
33 #include <sfx2/dispatch.hxx>
34 #include <svx/algitem.hxx>
35 #include <svx/dlgutil.hxx>
36 #include <vcl/toolbox.hxx>
37 #include <svx/sidebar/SidebarDialControl.hxx>
38 
39 using namespace css;
40 using namespace cssu;
41 using ::sfx2::sidebar::ControlFactory;
42 
43 #define A2S(pString) (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(pString)))
44 
45 //////////////////////////////////////////////////////////////////////////////
46 // namespace open
47 
48 namespace sc { namespace sidebar {
49 
50 //////////////////////////////////////////////////////////////////////////////
51 
52 AlignmentPropertyPanel::AlignmentPropertyPanel(
53     Window* pParent,
54     const cssu::Reference<css::frame::XFrame>& rxFrame,
55     SfxBindings* pBindings)
56     : Control(
57         pParent,
58             ScResId(RID_PROPERTYPANEL_SC_ALIGNMENT)),
59       mpTBHorizontalBackground(ControlFactory::CreateToolBoxBackground(this)),
60       mpTBHorizontal(ControlFactory::CreateToolBox(
61               mpTBHorizontalBackground.get(),
62               ScResId(TBX_HORIZONTAL_ALIGNMENT))),
63       mpTBVerticalBackground(ControlFactory::CreateToolBoxBackground(this)),
64       mpTBVertical(ControlFactory::CreateToolBox(
65               mpTBVerticalBackground.get(),
66               ScResId(TBX_VERTICAL_ALIGN))),
67       mpFTLeftIndent(new FixedText(this, ScResId(FT_LEFT_INDENT))),
68       mpMFLeftIndent(new MetricField(this, ScResId(MF_LEFT_INDENT))),
69       mpCBXWrapText(new CheckBox(this, ScResId(CBX_WRAP))),
70       mpCBXMergeCell(new CheckBox(this, ScResId(CBX_MERGE))),
71       mpFtRotate(new FixedText(this, ScResId(FT_ORIENT))),
72       mpCtrlDial(new svx::sidebar::SidebarDialControl(this, ScResId(DIAL_CONTROL))), // , true)),
73       mpMtrAngle(new MetricBox(this, ScResId(CBOX_ANGLE))),
74       mpCbStacked(new CheckBox(this, ScResId(CBX_VERT))),
75       maAlignHorControl(SID_H_ALIGNCELL, *pBindings, *this),
76       maAlignVerControl(SID_V_ALIGNCELL, *pBindings, *this),
77       maLeftIndentControl(SID_ATTR_ALIGN_INDENT, *pBindings, *this),
78       maMergeCellControl(FID_MERGE_TOGGLE, *pBindings, *this),
79       maWrapTextControl(SID_ATTR_ALIGN_LINEBREAK, *pBindings, *this),
80       maAngleControl(SID_ATTR_ALIGN_DEGREES, *pBindings, *this),
81       maStackControl(SID_ATTR_ALIGN_STACKED, *pBindings, *this),
82       maIMGAlignLeft(ScResId(IMG_ALIGN_LEFT)),
83       maIMGAlignCenter(ScResId(IMG_ALIGN_CENTER)),
84       maIMGAlignRight(ScResId(IMG_ALIGN_RIGHT)),
85       maIMGAlignJust(ScResId(IMG_ALIGN_JUST)),
86       maIMGAlignTop(ScResId(IMG_ALIGN_TOP)),
87       maIMGAlignCenterV(ScResId(IMG_ALIGN_CENTER_V)),
88       maIMGAlignBottom(ScResId(IMG_ALIGN_BOTTOM)),
89       meHorAlignState(SVX_HOR_JUSTIFY_STANDARD),
90       meVerAlignState(SVX_VER_JUSTIFY_STANDARD),
91       mbMultiDisable(false),
92       mxFrame(rxFrame),
93       maContext(),
94       mpBindings(pBindings)
95 {
96     Initialize();
97     FreeResource();
98 
99     mpFTLeftIndent->SetBackground(Wallpaper());
100     mpFtRotate->SetBackground(Wallpaper());
101 }
102 
103 //////////////////////////////////////////////////////////////////////////////
104 
105 AlignmentPropertyPanel::~AlignmentPropertyPanel()
106 {
107 }
108 
109 //////////////////////////////////////////////////////////////////////////////
110 
111 void AlignmentPropertyPanel::Initialize()
112 {
113 	mpTBHorizontal->SetItemImage(ID_SUBSTLEFT, maIMGAlignLeft);
114 	mpTBHorizontal->SetItemImage(ID_SUBSTCENTER, maIMGAlignCenter);
115 	mpTBHorizontal->SetItemImage(ID_SUBSTRIGHT, maIMGAlignRight);
116 	mpTBHorizontal->SetItemImage(ID_SUBSTJUSTIFY, maIMGAlignJust);
117 	Size aTbxSize( mpTBHorizontal->CalcWindowSizePixel() );
118 	mpTBHorizontal->SetOutputSizePixel( aTbxSize );
119 	mpTBHorizontal->SetBackground(Wallpaper());
120 	mpTBHorizontal->SetPaintTransparent(true);
121 	Link aLink = LINK(this, AlignmentPropertyPanel, TbxHorAlignSelectHdl);
122 	mpTBHorizontal->SetSelectHdl ( aLink );
123 
124 	mpTBVertical->SetItemImage(IID_VERT_TOP, maIMGAlignTop);
125 	mpTBVertical->SetItemImage(IID_VERT_CENTER, maIMGAlignCenterV);
126 	mpTBVertical->SetItemImage(IID_VERT_BOTTOM, maIMGAlignBottom);
127 	Size aTbxSize2( mpTBVertical->CalcWindowSizePixel() );
128 	mpTBVertical->SetOutputSizePixel( aTbxSize2 );
129 	mpTBVertical->SetBackground(Wallpaper());
130 	mpTBVertical->SetPaintTransparent(true);
131 	aLink = LINK(this, AlignmentPropertyPanel, TbxVerAlignSelectHdl);
132 	mpTBVertical->SetSelectHdl ( aLink );
133 
134 	mpFTLeftIndent->Disable();
135 	mpMFLeftIndent->Disable();
136 	mpMFLeftIndent->SetAccessibleName(::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Left Indent")));	//wj acc
137 	aLink = LINK(this, AlignmentPropertyPanel, MFLeftIndentMdyHdl);
138 	mpMFLeftIndent->SetModifyHdl ( aLink );
139 
140 	aLink = LINK(this, AlignmentPropertyPanel, CBOXMergnCellClkHdl);
141 	mpCBXMergeCell->SetClickHdl ( aLink );
142 
143 	aLink = LINK(this, AlignmentPropertyPanel, CBOXWrapTextClkHdl);
144 	mpCBXWrapText->SetClickHdl ( aLink );
145 
146 	//rotation control
147 	mpCtrlDial->SetAccessibleName(::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Text Orientation")));	//wj acc
148 	mpCtrlDial->SetModifyHdl(LINK( this, AlignmentPropertyPanel, RotationHdl));
149 
150     //rotation
151 	mpMtrAngle->SetAccessibleName(::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Text Orientation")));	//wj acc
152 	mpMtrAngle->SetModifyHdl(LINK( this, AlignmentPropertyPanel, AngleModifiedHdl));
153 	mpMtrAngle->EnableAutocomplete( false );
154 
155     //Vertical stacked
156 	mpCbStacked->SetClickHdl( LINK( this, AlignmentPropertyPanel, ClickStackHdl ) );
157 
158 	mpMtrAngle->InsertValue(0, FUNIT_CUSTOM);
159 	mpMtrAngle->InsertValue(45, FUNIT_CUSTOM);
160 	mpMtrAngle->InsertValue(90, FUNIT_CUSTOM);
161 	mpMtrAngle->InsertValue(135, FUNIT_CUSTOM);
162 	mpMtrAngle->InsertValue(180, FUNIT_CUSTOM);
163 	mpMtrAngle->InsertValue(225, FUNIT_CUSTOM);
164 	mpMtrAngle->InsertValue(270, FUNIT_CUSTOM);
165 	mpMtrAngle->InsertValue(315, FUNIT_CUSTOM);
166     mpMtrAngle->SetDropDownLineCount(mpMtrAngle->GetEntryCount());
167 
168     mpTBHorizontal->SetAccessibleRelationLabeledBy(mpTBHorizontal.get());
169 	mpTBVertical->SetAccessibleRelationLabeledBy(mpTBVertical.get());
170 	mpMFLeftIndent->SetAccessibleRelationLabeledBy(mpFTLeftIndent.get());
171 	mpMtrAngle->SetAccessibleRelationLabeledBy(mpFtRotate.get());
172 #ifdef HAS_IA2
173 	mpMtrAngle->SetMpSubEditAccLableBy(mpFtRotate.get());
174 #endif
175 }
176 
177 //////////////////////////////////////////////////////////////////////////////
178 
179 IMPL_LINK( AlignmentPropertyPanel, AngleModifiedHdl, void *, EMPTYARG )
180 {
181 	String sTmp = mpMtrAngle->GetText();
182 
183 	sal_Unicode nChar = sTmp.GetChar( 0 );
184 	if((sTmp.Len()== 1 &&  nChar == '-') ||
185 		(nChar != '-' && ((nChar < '0') || (nChar > '9') ) ))	////modify
186 		return 0;
187 
188 	double dTmp = sTmp.ToDouble();
189 	FormatDegrees(dTmp);
190 
191 	sal_Int64 nTmp = (sal_Int64)dTmp*100;
192 	SfxInt32Item aAngleItem( SID_ATTR_ALIGN_DEGREES,(sal_uInt32) nTmp);
193 
194 	GetBindings()->GetDispatcher()->Execute(
195 		SID_ATTR_ALIGN_DEGREES, SFX_CALLMODE_RECORD, &aAngleItem, 0L );
196 	return 0;
197 }
198 
199 //////////////////////////////////////////////////////////////////////////////
200 
201 IMPL_LINK( AlignmentPropertyPanel, RotationHdl, void *, EMPTYARG )
202 {
203 	sal_Int32 nTmp = mpCtrlDial->GetRotation();
204 	SfxInt32Item aAngleItem( SID_ATTR_ALIGN_DEGREES,(sal_uInt32) nTmp);
205 
206 	GetBindings()->GetDispatcher()->Execute(
207 		SID_ATTR_ALIGN_DEGREES, SFX_CALLMODE_RECORD, &aAngleItem, 0L );
208 
209 	return 0;
210 }
211 
212 //////////////////////////////////////////////////////////////////////////////
213 
214 IMPL_LINK( AlignmentPropertyPanel, ClickStackHdl, void *, EMPTYARG )
215 {
216 	bool bVertical = mpCbStacked->IsChecked() ? true : false;
217 	SfxBoolItem  aStackItem( SID_ATTR_ALIGN_STACKED, bVertical );
218 	GetBindings()->GetDispatcher()->Execute(
219 		SID_ATTR_ALIGN_STACKED, SFX_CALLMODE_RECORD, &aStackItem, 0L );
220 	return 0;
221 }
222 
223 //////////////////////////////////////////////////////////////////////////////
224 
225 IMPL_LINK(AlignmentPropertyPanel, TbxHorAlignSelectHdl, ToolBox*, pToolBox)
226 {
227 	sal_uInt16 nId = pToolBox->GetCurItemId();
228 
229 	if(nId == ID_SUBSTLEFT)
230 	{
231 		if(meHorAlignState != SVX_HOR_JUSTIFY_LEFT)
232 			meHorAlignState = SVX_HOR_JUSTIFY_LEFT;
233 		else
234 			meHorAlignState = SVX_HOR_JUSTIFY_STANDARD;
235 	}
236 	else if( nId == ID_SUBSTCENTER )
237 	{
238 		if(meHorAlignState != SVX_HOR_JUSTIFY_CENTER)
239 			meHorAlignState = SVX_HOR_JUSTIFY_CENTER;
240 		else
241 			meHorAlignState = SVX_HOR_JUSTIFY_STANDARD;
242 	}
243 	else if( nId == ID_SUBSTRIGHT )
244 	{
245 		if(meHorAlignState != SVX_HOR_JUSTIFY_RIGHT)
246 			meHorAlignState = SVX_HOR_JUSTIFY_RIGHT;
247 		else
248 			meHorAlignState = SVX_HOR_JUSTIFY_STANDARD;
249 	}
250 	else if( nId == ID_SUBSTJUSTIFY )
251 	{
252 		if(meHorAlignState != SVX_HOR_JUSTIFY_BLOCK)
253 			meHorAlignState = SVX_HOR_JUSTIFY_BLOCK;
254 		else
255 			meHorAlignState = SVX_HOR_JUSTIFY_STANDARD;
256 	}
257 	SvxHorJustifyItem aHorItem(meHorAlignState, SID_H_ALIGNCELL);
258 	GetBindings()->GetDispatcher()->Execute(SID_H_ALIGNCELL, SFX_CALLMODE_RECORD, &aHorItem, 0L);
259 	UpdateHorAlign();
260 	return 0;
261 }
262 
263 //////////////////////////////////////////////////////////////////////////////
264 
265 IMPL_LINK(AlignmentPropertyPanel, TbxVerAlignSelectHdl, ToolBox*, pToolBox)
266 {
267 	sal_uInt16 nId = pToolBox->GetCurItemId();
268 
269 	//Bold
270 	if(nId == IID_VERT_TOP)
271 	{
272 		if(meVerAlignState != SVX_VER_JUSTIFY_TOP)
273 			meVerAlignState = SVX_VER_JUSTIFY_TOP;
274 		else
275 			meVerAlignState = SVX_VER_JUSTIFY_STANDARD;
276 	}
277 	else if( nId == IID_VERT_CENTER )
278 	{
279 		if(meVerAlignState != SVX_VER_JUSTIFY_CENTER)
280 			meVerAlignState = SVX_VER_JUSTIFY_CENTER;
281 		else
282 			meVerAlignState = SVX_VER_JUSTIFY_STANDARD;
283 	}
284 	else if( nId == IID_VERT_BOTTOM )
285 	{
286 		if(meVerAlignState != SVX_VER_JUSTIFY_BOTTOM)
287 			meVerAlignState = SVX_VER_JUSTIFY_BOTTOM;
288 		else
289 			meVerAlignState = SVX_VER_JUSTIFY_STANDARD;
290 	}
291 	SvxVerJustifyItem aVerItem(meVerAlignState, SID_V_ALIGNCELL);
292 	GetBindings()->GetDispatcher()->Execute(SID_V_ALIGNCELL, SFX_CALLMODE_RECORD, &aVerItem, 0L);
293 	UpdateVerAlign();
294 	return 0;
295 }
296 
297 //////////////////////////////////////////////////////////////////////////////
298 
299 IMPL_LINK(AlignmentPropertyPanel, MFLeftIndentMdyHdl, void*, EMPTYARG)
300 {
301 	mpCBXWrapText->EnableTriState(false);
302 	sal_uInt16 nVal = (sal_uInt16)mpMFLeftIndent->GetValue();
303 	SfxUInt16Item aItem( SID_ATTR_ALIGN_INDENT,  (sal_uInt16)CalcToUnit( nVal,  SFX_MAPUNIT_TWIP ) );
304 
305 	GetBindings()->GetDispatcher()->Execute(SID_ATTR_ALIGN_INDENT, SFX_CALLMODE_RECORD, &aItem, 0L);
306 	return( 0L );
307 }
308 
309 //////////////////////////////////////////////////////////////////////////////
310 
311 IMPL_LINK(AlignmentPropertyPanel, CBOXMergnCellClkHdl, void*, EMPTYARG)
312 {
313 	bool bState = mpCBXMergeCell->IsChecked();
314 
315 	//Modified
316 	//SfxBoolItem aItem( FID_MERGE_TOGGLE , bState);
317 	//GetBindings()->GetDispatcher()->Execute(FID_MERGE_TOGGLE, SFX_CALLMODE_RECORD, &aItem, false, 0L);
318 	if(bState)
319 		GetBindings()->GetDispatcher()->Execute(FID_MERGE_ON, SFX_CALLMODE_RECORD);
320 	else
321 		GetBindings()->GetDispatcher()->Execute(FID_MERGE_OFF, SFX_CALLMODE_RECORD);
322 	GetBindings()->Invalidate(FID_MERGE_TOGGLE,true,false);
323 	//modified end
324 
325 	return 0;
326 }
327 
328 //////////////////////////////////////////////////////////////////////////////
329 
330 IMPL_LINK(AlignmentPropertyPanel, CBOXWrapTextClkHdl, void*, EMPTYARG)
331 {
332 	bool bState = mpCBXWrapText->IsChecked();
333 	SfxBoolItem aItem( SID_ATTR_ALIGN_LINEBREAK , bState);
334 	GetBindings()->GetDispatcher()->Execute(SID_ATTR_ALIGN_LINEBREAK, SFX_CALLMODE_RECORD, &aItem, 0L);
335 	return 0;
336 }
337 
338 //////////////////////////////////////////////////////////////////////////////
339 
340 AlignmentPropertyPanel* AlignmentPropertyPanel::Create (
341     Window* pParent,
342     const cssu::Reference<css::frame::XFrame>& rxFrame,
343     SfxBindings* pBindings)
344 {
345     if (pParent == NULL)
346         throw lang::IllegalArgumentException(A2S("no parent Window given to AlignmentPropertyPanel::Create"), NULL, 0);
347     if ( ! rxFrame.is())
348         throw lang::IllegalArgumentException(A2S("no XFrame given to AlignmentPropertyPanel::Create"), NULL, 1);
349     if (pBindings == NULL)
350         throw lang::IllegalArgumentException(A2S("no SfxBindings given to AlignmentPropertyPanel::Create"), NULL, 2);
351 
352     return new AlignmentPropertyPanel(
353         pParent,
354         rxFrame,
355         pBindings);
356 }
357 
358 //////////////////////////////////////////////////////////////////////////////
359 
360 void AlignmentPropertyPanel::DataChanged(
361     const DataChangedEvent& rEvent)
362 {
363     (void)rEvent;
364 }
365 
366 //////////////////////////////////////////////////////////////////////////////
367 
368 void AlignmentPropertyPanel::HandleContextChange(
369     const ::sfx2::sidebar::EnumContext aContext)
370 {
371     if(maContext == aContext)
372     {
373         // Nothing to do.
374         return;
375     }
376 
377     maContext = aContext;
378 
379 
380 
381     // todo
382 }
383 
384 //////////////////////////////////////////////////////////////////////////////
385 
386 void AlignmentPropertyPanel::NotifyItemUpdate(
387     sal_uInt16 nSID,
388     SfxItemState eState,
389     const SfxPoolItem* pState,
390     const bool bIsEnabled)
391 {
392     (void)bIsEnabled;
393 
394 	switch(nSID)
395 	{
396 	case SID_H_ALIGNCELL:
397 		if(eState >= SFX_ITEM_DEFAULT && pState && pState->ISA(SvxHorJustifyItem) )
398 		{
399 				const SvxHorJustifyItem* pItem = (const SvxHorJustifyItem*)pState;
400 				meHorAlignState = (SvxCellHorJustify)pItem->GetValue();
401 		}
402 		else
403 		{
404 			meHorAlignState = SVX_HOR_JUSTIFY_STANDARD;
405 		}
406 		UpdateHorAlign();
407 		break;
408 	case SID_V_ALIGNCELL:
409 		if(eState >= SFX_ITEM_DEFAULT && pState && pState->ISA(SvxVerJustifyItem) )
410 		{
411 				const SvxVerJustifyItem* pItem = (const SvxVerJustifyItem*)pState;
412 				meVerAlignState = (SvxCellVerJustify)pItem->GetValue();
413 		}
414 		else
415 		{
416 			meVerAlignState = SVX_VER_JUSTIFY_STANDARD;
417 		}
418 		UpdateVerAlign();
419 		break;
420 	case SID_ATTR_ALIGN_INDENT:
421 		if(eState >= SFX_ITEM_DEFAULT && pState && pState->ISA(SfxUInt16Item) )
422 		{
423 				const SfxUInt16Item* pItem = (const SfxUInt16Item*)pState;
424 				sal_uInt16 nVal = pItem->GetValue();
425 				mpMFLeftIndent->SetValue( CalcToPoint(nVal, SFX_MAPUNIT_TWIP, 1) );
426 		}
427 		else
428 		{
429 			mpMFLeftIndent->SetValue(0);
430 			mpMFLeftIndent->SetText(String());
431 		}
432 		break;
433 	case FID_MERGE_TOGGLE:
434 		if(eState >= SFX_ITEM_DEFAULT && pState && pState->ISA(SfxBoolItem) )
435 		{
436 			mpCBXMergeCell->Enable();
437 			const SfxBoolItem* pItem = (const SfxBoolItem*)pState;
438 			bool bVal = pItem->GetValue();
439 			if(bVal)
440 				mpCBXMergeCell->Check(true);
441 			else
442 				mpCBXMergeCell->Check(false);
443 		}
444 		else
445 		{
446 			mpCBXMergeCell->Check(false);
447 			mpCBXMergeCell->Disable();
448 		}
449 		break;
450 
451 	case SID_ATTR_ALIGN_LINEBREAK:
452 		if(eState == SFX_ITEM_DISABLED)
453 		{
454 			mpCBXWrapText->EnableTriState(false);
455 			mpCBXWrapText->Check(false);
456 			mpCBXWrapText->Disable();
457 		}
458 		else
459 		{
460 			mpCBXWrapText->Enable();
461 			if(eState >= SFX_ITEM_DEFAULT && pState && pState->ISA(SfxBoolItem) )
462 			{
463 				mpCBXWrapText->EnableTriState(false);
464 				const SfxBoolItem* pItem = (const SfxBoolItem*)pState;
465 				bool bVal = pItem->GetValue();
466 				if(bVal)
467 					mpCBXWrapText->Check(true);
468 				else
469 					mpCBXWrapText->Check(false);
470 			}
471 			else if(eState == SFX_ITEM_DONTCARE)
472 			{
473 				mpCBXWrapText->EnableTriState(true);
474 				mpCBXWrapText->SetState(STATE_DONTKNOW);
475 			}
476 		}
477 		break;
478 	case SID_ATTR_ALIGN_DEGREES:
479 		if (eState >= SFX_ITEM_AVAILABLE)
480 		{
481 			long nTmp = ((const SfxInt32Item*)pState)->GetValue();
482 			mpMtrAngle->SetValue( nTmp / 100);	//wj
483 			mpCtrlDial->SetRotation( nTmp );
484 			switch(nTmp)
485 			{
486 				case 0:
487 					mpMtrAngle->SelectEntryPos(0);
488 				break;
489 				case 4500:
490 					mpMtrAngle->SelectEntryPos(1);
491 				break;
492 				case 9000:
493 					mpMtrAngle->SelectEntryPos(2);
494 				break;
495 				case 13500:
496 					mpMtrAngle->SelectEntryPos(3);
497 				break;
498 				case 18000:
499 					mpMtrAngle->SelectEntryPos(4);
500 				break;
501 				case 22500:
502 					mpMtrAngle->SelectEntryPos(5);
503 				break;
504 				case 27000:
505 					mpMtrAngle->SelectEntryPos(6);
506 				break;
507 				case 31500:
508 					mpMtrAngle->SelectEntryPos(7);
509 			}
510 		}
511 		else
512 		{
513 			mpMtrAngle->SetText( String() );
514 			mpCtrlDial->SetRotation( 0 );
515 		}
516 		break;
517 	case SID_ATTR_ALIGN_STACKED:
518 		if (eState >= SFX_ITEM_AVAILABLE)
519 		{
520 			mpCbStacked->EnableTriState(false);
521 			const SfxBoolItem* aStackItem = (const SfxBoolItem*)pState;
522 			bool IsChecked = (bool)aStackItem->GetValue();
523 			if(IsChecked)
524 			{
525 				mpCbStacked->Check(IsChecked);
526 				mpFtRotate->Disable();
527 				mpMtrAngle->Disable();
528 				mpCtrlDial->Disable();
529 				mbMultiDisable = true;
530 			}
531 			else
532 			{
533 				mpCbStacked->Check(IsChecked);
534 				mpFtRotate->Enable();
535 				mpMtrAngle->Enable();
536 				mpCtrlDial->Enable();
537 				mbMultiDisable = false;
538 			}
539 		}
540 		else
541 		{
542 			mbMultiDisable = true;
543 			mpFtRotate->Disable();
544 			mpMtrAngle->Disable();
545 			mpCtrlDial->Disable();
546 			mpCbStacked->EnableTriState(true);
547 			mpCbStacked->SetState(STATE_DONTKNOW);
548 		}
549 	}
550 }
551 
552 //////////////////////////////////////////////////////////////////////////////
553 
554 SfxBindings* AlignmentPropertyPanel::GetBindings()
555 {
556     return mpBindings;
557 }
558 
559 //////////////////////////////////////////////////////////////////////////////
560 
561 void AlignmentPropertyPanel::FormatDegrees(double& dTmp)
562 {
563 	while(dTmp<0)
564 		dTmp += 360;
565 	while (dTmp > 359)	//modify
566 		dTmp = 359;
567 }
568 
569 //////////////////////////////////////////////////////////////////////////////
570 
571 void AlignmentPropertyPanel::UpdateHorAlign()
572 {
573 	mpTBHorizontal->SetItemState(ID_SUBSTLEFT,	STATE_NOCHECK);
574 	mpTBHorizontal->SetItemState(ID_SUBSTCENTER,	STATE_NOCHECK);
575 	mpTBHorizontal->SetItemState(ID_SUBSTRIGHT,	STATE_NOCHECK);
576 	mpTBHorizontal->SetItemState(ID_SUBSTJUSTIFY,STATE_NOCHECK);
577 	mpFTLeftIndent->Disable();
578 	mpMFLeftIndent->Disable();
579 	if(meHorAlignState==SVX_HOR_JUSTIFY_REPEAT)
580 	{
581 		mpFtRotate->Disable();
582 		mpCtrlDial->Disable();
583 		mpMtrAngle->Disable();
584 		mpCbStacked->Disable();
585 	}
586 	else
587 	{
588 		if(!mbMultiDisable)
589 		{
590 			mpFtRotate->Enable();
591 			mpCtrlDial->Enable();
592 			mpMtrAngle->Enable();
593 		}
594 		else
595 		{
596 			mpFtRotate->Disable();
597 			mpCtrlDial->Disable();
598 			mpMtrAngle->Disable();
599 		}
600 		mpCbStacked->Enable();
601 	}
602 	switch(meHorAlignState)
603 	{
604 	case SVX_HOR_JUSTIFY_LEFT:
605 		mpTBHorizontal->SetItemState(ID_SUBSTLEFT,	STATE_CHECK);
606 		mpFTLeftIndent->Enable();
607 		mpMFLeftIndent->Enable();
608 		break;
609 	case SVX_HOR_JUSTIFY_CENTER:mpTBHorizontal->SetItemState(ID_SUBSTCENTER,	STATE_CHECK);break;
610 	case SVX_HOR_JUSTIFY_RIGHT:	mpTBHorizontal->SetItemState(ID_SUBSTRIGHT,	STATE_CHECK);break;
611 	case SVX_HOR_JUSTIFY_BLOCK:	mpTBHorizontal->SetItemState(ID_SUBSTJUSTIFY,STATE_CHECK);break;
612 	default:;
613 	}
614 }
615 
616 //////////////////////////////////////////////////////////////////////////////
617 
618 void AlignmentPropertyPanel::UpdateVerAlign()
619 {
620 	mpTBVertical->SetItemState(IID_VERT_TOP,		STATE_NOCHECK);
621 	mpTBVertical->SetItemState(IID_VERT_CENTER,	STATE_NOCHECK);
622 	mpTBVertical->SetItemState(IID_VERT_BOTTOM,	STATE_NOCHECK);
623 
624 	switch(meVerAlignState)
625 	{
626 	case SVX_VER_JUSTIFY_TOP:	mpTBVertical->SetItemState(IID_VERT_TOP,		STATE_CHECK);break;
627 	case SVX_VER_JUSTIFY_CENTER:mpTBVertical->SetItemState(IID_VERT_CENTER,	STATE_CHECK);break;
628 	case SVX_VER_JUSTIFY_BOTTOM:	mpTBVertical->SetItemState(IID_VERT_BOTTOM,	STATE_CHECK);break;
629 	default:;
630 	}
631 }
632 
633 //////////////////////////////////////////////////////////////////////////////
634 // namespace close
635 
636 }} // end of namespace ::sc::sidebar
637 
638 //////////////////////////////////////////////////////////////////////////////
639 // eof
640