xref: /AOO41X/main/svx/source/sidebar/text/TextCharacterSpacingControl.cxx (revision d4aefcae16681f638496d1e984264fe390e450e8)
1*d4aefcaeSZheng Fan /**************************************************************
2*d4aefcaeSZheng Fan  *
3*d4aefcaeSZheng Fan  * Licensed to the Apache Software Foundation (ASF) under one
4*d4aefcaeSZheng Fan  * or more contributor license agreements.  See the NOTICE file
5*d4aefcaeSZheng Fan  * distributed with this work for additional information
6*d4aefcaeSZheng Fan  * regarding copyright ownership.  The ASF licenses this file
7*d4aefcaeSZheng Fan  * to you under the Apache License, Version 2.0 (the
8*d4aefcaeSZheng Fan  * "License"); you may not use this file except in compliance
9*d4aefcaeSZheng Fan  * with the License.  You may obtain a copy of the License at
10*d4aefcaeSZheng Fan  *
11*d4aefcaeSZheng Fan  *   http://www.apache.org/licenses/LICENSE-2.0
12*d4aefcaeSZheng Fan  *
13*d4aefcaeSZheng Fan  * Unless required by applicable law or agreed to in writing,
14*d4aefcaeSZheng Fan  * software distributed under the License is distributed on an
15*d4aefcaeSZheng Fan  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*d4aefcaeSZheng Fan  * KIND, either express or implied.  See the License for the
17*d4aefcaeSZheng Fan  * specific language governing permissions and limitations
18*d4aefcaeSZheng Fan  * under the License.
19*d4aefcaeSZheng Fan  *
20*d4aefcaeSZheng Fan  *************************************************************/
21*d4aefcaeSZheng Fan 
22*d4aefcaeSZheng Fan #include "precompiled_svx.hxx"
23*d4aefcaeSZheng Fan #include "TextCharacterSpacingControl.hxx"
24*d4aefcaeSZheng Fan #include "TextPropertyPanel.hrc"
25*d4aefcaeSZheng Fan #include <sfx2/sidebar/propertypanel.hrc>
26*d4aefcaeSZheng Fan #include <svx/dialogs.hrc>
27*d4aefcaeSZheng Fan #include <svx/dialmgr.hxx>
28*d4aefcaeSZheng Fan #include <unotools/viewoptions.hxx>
29*d4aefcaeSZheng Fan #include <editeng/kernitem.hxx>
30*d4aefcaeSZheng Fan #include <sfx2/bindings.hxx>
31*d4aefcaeSZheng Fan #include <sfx2/dispatch.hxx>
32*d4aefcaeSZheng Fan #include <sfx2/sidebar/Theme.hxx>
33*d4aefcaeSZheng Fan 
34*d4aefcaeSZheng Fan namespace svx { namespace sidebar {
35*d4aefcaeSZheng Fan TextCharacterSpacingControl::TextCharacterSpacingControl(Window* pParent, svx::sidebar::TextPropertyPanel& rPanel)
36*d4aefcaeSZheng Fan :	PopupControl( pParent,SVX_RES(RID_POPUPPANEL_TEXTPAGE_SPACING))
37*d4aefcaeSZheng Fan ,	mrTextPropertyPanel(rPanel)
38*d4aefcaeSZheng Fan ,	mpBindings(NULL)
39*d4aefcaeSZheng Fan ,	maVSSpacing		(ValueSetWithTextControl::IMAGE_TEXT,this, SVX_RES(VS_SPACING))
40*d4aefcaeSZheng Fan ,	maLastCus		(this, SVX_RES(FT_LASTCUSTOM))
41*d4aefcaeSZheng Fan //,	maBorder		(this, SVX_RES(CT_BORDER))
42*d4aefcaeSZheng Fan ,	maFTSpacing		(this, SVX_RES(FT_SPACING))
43*d4aefcaeSZheng Fan ,	maLBKerning		(this, SVX_RES(LB_KERNING))
44*d4aefcaeSZheng Fan ,	maFTBy			(this, SVX_RES(FT_BY))
45*d4aefcaeSZheng Fan ,	maEditKerning	(this, SVX_RES(ED_KERNING))
46*d4aefcaeSZheng Fan 
47*d4aefcaeSZheng Fan ,	mpImg			(NULL)
48*d4aefcaeSZheng Fan ,	mpImgSel		(NULL)
49*d4aefcaeSZheng Fan ,	mpStr			(NULL)
50*d4aefcaeSZheng Fan ,	mpStrTip		(NULL)
51*d4aefcaeSZheng Fan 
52*d4aefcaeSZheng Fan ,	maImgCus		(SVX_RES(IMG_CUSTOM))
53*d4aefcaeSZheng Fan ,	maImgCusGrey	(SVX_RES(IMG_CUSTOM_GRAY))
54*d4aefcaeSZheng Fan ,	maStrCus		(SVX_RES(STR_CUSTOM))
55*d4aefcaeSZheng Fan ,	maStrCusE		(SVX_RES(STR_CUSTOM_E_TIP))	//add
56*d4aefcaeSZheng Fan ,	maStrCusC		(SVX_RES(STR_CUSTOM_C_TIP))	//add
57*d4aefcaeSZheng Fan ,	maStrCusN		(SVX_RES(STR_NORMAL_TIP))	//add
58*d4aefcaeSZheng Fan ,	maStrUnit		(SVX_RES(STR_PT))			//add
59*d4aefcaeSZheng Fan 
60*d4aefcaeSZheng Fan ,	mnCustomKern(0)
61*d4aefcaeSZheng Fan ,	mnLastCus ( SPACING_NOCUSTOM )
62*d4aefcaeSZheng Fan ,	mbCusEnable(false)
63*d4aefcaeSZheng Fan ,	mbVS(true)
64*d4aefcaeSZheng Fan {
65*d4aefcaeSZheng Fan 	initial();
66*d4aefcaeSZheng Fan 	FreeResource();
67*d4aefcaeSZheng Fan 	mpBindings = mrTextPropertyPanel.GetBindings();
68*d4aefcaeSZheng Fan 	Link aLink = LINK(this, TextCharacterSpacingControl, KerningSelectHdl);
69*d4aefcaeSZheng Fan 	maLBKerning.SetSelectHdl(aLink);
70*d4aefcaeSZheng Fan 	aLink =LINK(this, TextCharacterSpacingControl, KerningModifyHdl);
71*d4aefcaeSZheng Fan 	maEditKerning.SetModifyHdl(aLink);
72*d4aefcaeSZheng Fan 
73*d4aefcaeSZheng Fan }
74*d4aefcaeSZheng Fan TextCharacterSpacingControl::~TextCharacterSpacingControl()
75*d4aefcaeSZheng Fan {
76*d4aefcaeSZheng Fan 	delete[] mpImg;
77*d4aefcaeSZheng Fan 	delete[] mpImgSel;
78*d4aefcaeSZheng Fan 	delete[] mpStr;
79*d4aefcaeSZheng Fan 	delete[] mpStrTip;
80*d4aefcaeSZheng Fan }
81*d4aefcaeSZheng Fan /*void TextCharacterSpacingControl::Paint(const Rectangle& rect)
82*d4aefcaeSZheng Fan {
83*d4aefcaeSZheng Fan 	svx::sidebar::PopupControl::Paint(rect);
84*d4aefcaeSZheng Fan 	Color aOldLineColor = GetLineColor();
85*d4aefcaeSZheng Fan 	Color aOldFillColor = GetFillColor();
86*d4aefcaeSZheng Fan 
87*d4aefcaeSZheng Fan 	//Point aPos = maBorder.GetPosPixel();
88*d4aefcaeSZheng Fan 	//Size aSize = maBorder.GetSizePixel();
89*d4aefcaeSZheng Fan 	Point aPos( LogicToPixel( Point( CUSTOM_X, CUSTOM_Y), MAP_APPFONT ));
90*d4aefcaeSZheng Fan 	Size aSize( LogicToPixel( Size(  CUSTOM_WIDTH, CUSTOM_HEIGHT ), MAP_APPFONT ));
91*d4aefcaeSZheng Fan 	Rectangle aRect( aPos, aSize );
92*d4aefcaeSZheng Fan 	aRect.Left() -= 1;
93*d4aefcaeSZheng Fan 	aRect.Top() -= 1;
94*d4aefcaeSZheng Fan 	aRect.Right() += 1;
95*d4aefcaeSZheng Fan 	aRect.Bottom() += 1;
96*d4aefcaeSZheng Fan 
97*d4aefcaeSZheng Fan 
98*d4aefcaeSZheng Fan 	Color aLineColor(189,201,219);
99*d4aefcaeSZheng Fan 	if(!GetSettings().GetStyleSettings().GetHighContrastMode())
100*d4aefcaeSZheng Fan 		SetLineColor(aLineColor);
101*d4aefcaeSZheng Fan 	else
102*d4aefcaeSZheng Fan 		SetLineColor(GetSettings().GetStyleSettings().GetShadowColor());
103*d4aefcaeSZheng Fan 	SetFillColor(COL_TRANSPARENT);
104*d4aefcaeSZheng Fan 	//add  for high contract
105*d4aefcaeSZheng Fan 	//if(GetSettings().GetStyleSettings().GetHighContrastMode())
106*d4aefcaeSZheng Fan 	//{
107*d4aefcaeSZheng Fan 	//	maBorder.SetBackground(GetSettings().GetStyleSettings().GetMenuColor());
108*d4aefcaeSZheng Fan 	//	maFTSpacing.SetBackground(GetSettings().GetStyleSettings().GetMenuColor());
109*d4aefcaeSZheng Fan 	//	maFTBy.SetBackground(GetSettings().GetStyleSettings().GetMenuColor());
110*d4aefcaeSZheng Fan 	//}
111*d4aefcaeSZheng Fan 	DrawRect(aRect);
112*d4aefcaeSZheng Fan 
113*d4aefcaeSZheng Fan 
114*d4aefcaeSZheng Fan 	SetLineColor(aOldLineColor);
115*d4aefcaeSZheng Fan 	SetFillColor(aOldFillColor);
116*d4aefcaeSZheng Fan }*/
117*d4aefcaeSZheng Fan void TextCharacterSpacingControl::initial()
118*d4aefcaeSZheng Fan {
119*d4aefcaeSZheng Fan 	maVSSpacing.SetStyle( maVSSpacing.GetStyle()| WB_3DLOOK |  WB_NO_DIRECTSELECT  );
120*d4aefcaeSZheng Fan 	//for high contract
121*d4aefcaeSZheng Fan 	//if(GetSettings().GetStyleSettings().GetHighContrastMode())
122*d4aefcaeSZheng Fan 	{
123*d4aefcaeSZheng Fan 		maVSSpacing.SetControlBackground(GetSettings().GetStyleSettings().GetHighContrastMode()?
124*d4aefcaeSZheng Fan 		GetSettings().GetStyleSettings().GetMenuColor():
125*d4aefcaeSZheng Fan 		sfx2::sidebar::Theme::GetColor( sfx2::sidebar::Theme::Paint_PanelBackground ));
126*d4aefcaeSZheng Fan 		maVSSpacing.SetColor(GetSettings().GetStyleSettings().GetHighContrastMode()?
127*d4aefcaeSZheng Fan 		GetSettings().GetStyleSettings().GetMenuColor():
128*d4aefcaeSZheng Fan 		sfx2::sidebar::Theme::GetColor( sfx2::sidebar::Theme::Paint_PanelBackground ));
129*d4aefcaeSZheng Fan 		maVSSpacing.SetBackground(GetSettings().GetStyleSettings().GetHighContrastMode()?
130*d4aefcaeSZheng Fan 		GetSettings().GetStyleSettings().GetMenuColor():
131*d4aefcaeSZheng Fan 		sfx2::sidebar::Theme::GetColor( sfx2::sidebar::Theme::Paint_PanelBackground ));
132*d4aefcaeSZheng Fan 		maFTSpacing.SetBackground(GetSettings().GetStyleSettings().GetHighContrastMode()?
133*d4aefcaeSZheng Fan 		GetSettings().GetStyleSettings().GetMenuColor():
134*d4aefcaeSZheng Fan 		sfx2::sidebar::Theme::GetColor( sfx2::sidebar::Theme::Paint_PanelBackground ));
135*d4aefcaeSZheng Fan 		maFTBy.SetBackground(GetSettings().GetStyleSettings().GetHighContrastMode()?
136*d4aefcaeSZheng Fan 		GetSettings().GetStyleSettings().GetMenuColor():
137*d4aefcaeSZheng Fan 		sfx2::sidebar::Theme::GetColor( sfx2::sidebar::Theme::Paint_PanelBackground ));
138*d4aefcaeSZheng Fan 	}
139*d4aefcaeSZheng Fan 	mpImg = new Image[5];
140*d4aefcaeSZheng Fan 	mpImg[0] = Image(SVX_RES(IMG_VERY_TIGHT));
141*d4aefcaeSZheng Fan 	mpImg[1] = Image(SVX_RES(IMG_TIGHT));
142*d4aefcaeSZheng Fan 	mpImg[2] = Image(SVX_RES(IMG_NORMAL));
143*d4aefcaeSZheng Fan 	mpImg[3] = Image(SVX_RES(IMG_LOOSE));
144*d4aefcaeSZheng Fan 	mpImg[4] = Image(SVX_RES(IMG_VERY_LOOSE));
145*d4aefcaeSZheng Fan 
146*d4aefcaeSZheng Fan 	mpImgSel = new Image[5];
147*d4aefcaeSZheng Fan 	mpImgSel[0] = Image(SVX_RES(IMG_VERY_TIGHT_S));
148*d4aefcaeSZheng Fan 	mpImgSel[1] = Image(SVX_RES(IMG_TIGHT_S));
149*d4aefcaeSZheng Fan 	mpImgSel[2] = Image(SVX_RES(IMG_NORMAL_S));
150*d4aefcaeSZheng Fan 	mpImgSel[3] = Image(SVX_RES(IMG_LOOSE_S));
151*d4aefcaeSZheng Fan 	mpImgSel[4] = Image(SVX_RES(IMG_VERY_LOOSE_S));
152*d4aefcaeSZheng Fan 
153*d4aefcaeSZheng Fan 	mpStr = new XubString[5];
154*d4aefcaeSZheng Fan 	mpStr[0] = XubString(SVX_RES(STR_VERY_TIGHT));
155*d4aefcaeSZheng Fan 	mpStr[1] = XubString(SVX_RES(STR_TIGHT));
156*d4aefcaeSZheng Fan 	mpStr[2] = XubString(SVX_RES(STR_NORMAL));
157*d4aefcaeSZheng Fan 	mpStr[3] = XubString(SVX_RES(STR_LOOSE));
158*d4aefcaeSZheng Fan 	mpStr[4] = XubString(SVX_RES(STR_VERY_LOOSE));
159*d4aefcaeSZheng Fan 
160*d4aefcaeSZheng Fan 
161*d4aefcaeSZheng Fan 	mpStrTip = new XubString[5];
162*d4aefcaeSZheng Fan 	mpStrTip[0] = XubString(SVX_RES(STR_VERY_TIGHT_TIP));
163*d4aefcaeSZheng Fan 	mpStrTip[1] = XubString(SVX_RES(STR_TIGHT_TIP));
164*d4aefcaeSZheng Fan 	mpStrTip[2] = XubString(SVX_RES(STR_NORMAL_TIP));
165*d4aefcaeSZheng Fan 	mpStrTip[3] = XubString(SVX_RES(STR_LOOSE_TIP));
166*d4aefcaeSZheng Fan 	mpStrTip[4] = XubString(SVX_RES(STR_VERY_LOOSE_TIP));
167*d4aefcaeSZheng Fan 	//maVSSpacing.SetDefaultTip(mpStr);	//modify
168*d4aefcaeSZheng Fan 	//maVSSpacing.SetDefaultTip(mpStrTip, TRUE); //Add
169*d4aefcaeSZheng Fan 
170*d4aefcaeSZheng Fan 	for (int i=0;i<5;i++)
171*d4aefcaeSZheng Fan 		maVSSpacing.AddItem(mpImg[i], &mpImgSel[i],mpStr[i],&mpStrTip[i]);
172*d4aefcaeSZheng Fan 
173*d4aefcaeSZheng Fan 	maVSSpacing.InsertCustom(maImgCus, maImgCusGrey, maStrCus);
174*d4aefcaeSZheng Fan 	maVSSpacing.SetCustomTip(maStrCus); //Add
175*d4aefcaeSZheng Fan 
176*d4aefcaeSZheng Fan 	maVSSpacing.SetSelItem(0);
177*d4aefcaeSZheng Fan 	Link aLink = LINK(this, TextCharacterSpacingControl,VSSelHdl );
178*d4aefcaeSZheng Fan 	maVSSpacing.SetSelectHdl(aLink);
179*d4aefcaeSZheng Fan 	maVSSpacing.StartSelection();
180*d4aefcaeSZheng Fan 	maVSSpacing.Show();
181*d4aefcaeSZheng Fan }
182*d4aefcaeSZheng Fan void TextCharacterSpacingControl::ToGetFocus()
183*d4aefcaeSZheng Fan {
184*d4aefcaeSZheng Fan 	if(!mbVS)
185*d4aefcaeSZheng Fan 		maLBKerning.GrabFocus();
186*d4aefcaeSZheng Fan 	else
187*d4aefcaeSZheng Fan 		maVSSpacing.GrabFocus();
188*d4aefcaeSZheng Fan }
189*d4aefcaeSZheng Fan 
190*d4aefcaeSZheng Fan void TextCharacterSpacingControl::Rearrange(bool bLBAvailable,bool bAvailable, long nKerning)
191*d4aefcaeSZheng Fan {
192*d4aefcaeSZheng Fan 	mbVS = true;
193*d4aefcaeSZheng Fan 	maVSSpacing.SetSelItem(0);
194*d4aefcaeSZheng Fan 	SvtViewOptions aWinOpt( E_WINDOW, SIDEBAR_SPACING_GLOBAL_VALUE );
195*d4aefcaeSZheng Fan     if ( aWinOpt.Exists() )
196*d4aefcaeSZheng Fan 	{
197*d4aefcaeSZheng Fan 		::com::sun::star::uno::Sequence < ::com::sun::star::beans::NamedValue > aSeq = aWinOpt.GetUserData();
198*d4aefcaeSZheng Fan 		::rtl::OUString aTmp;
199*d4aefcaeSZheng Fan 		if ( aSeq.getLength())
200*d4aefcaeSZheng Fan 			aSeq[0].Value >>= aTmp;
201*d4aefcaeSZheng Fan 
202*d4aefcaeSZheng Fan 		String aWinData( aTmp );
203*d4aefcaeSZheng Fan 		mnCustomKern = aWinData.ToInt32();
204*d4aefcaeSZheng Fan 		mnLastCus = SPACING_CLOSE_BY_CUS_EDIT;
205*d4aefcaeSZheng Fan 		mbCusEnable = true;
206*d4aefcaeSZheng Fan 	}
207*d4aefcaeSZheng Fan 	else
208*d4aefcaeSZheng Fan 	{
209*d4aefcaeSZheng Fan 		mnLastCus = SPACING_NOCUSTOM;
210*d4aefcaeSZheng Fan 		mbCusEnable = false;
211*d4aefcaeSZheng Fan 	}
212*d4aefcaeSZheng Fan 
213*d4aefcaeSZheng Fan 	if( !mnLastCus )
214*d4aefcaeSZheng Fan 	{
215*d4aefcaeSZheng Fan 		maVSSpacing.SetCusEnable(false);
216*d4aefcaeSZheng Fan 		maVSSpacing.SetCustomTip(maStrCus,true);  //LAST CUSTOM no tip defect //add
217*d4aefcaeSZheng Fan 	}
218*d4aefcaeSZheng Fan 	else
219*d4aefcaeSZheng Fan 	{
220*d4aefcaeSZheng Fan 		//set custom tips
221*d4aefcaeSZheng Fan 		maVSSpacing.SetCusEnable(true);
222*d4aefcaeSZheng Fan 		if(mnCustomKern > 0)
223*d4aefcaeSZheng Fan 		{
224*d4aefcaeSZheng Fan 			String aStrTip( maStrCusE);   //LAST CUSTOM no tip defect //add
225*d4aefcaeSZheng Fan 			aStrTip.Append( String::CreateFromDouble( (double)mnCustomKern / 10));
226*d4aefcaeSZheng Fan 			aStrTip.Append(String("pt", 2, RTL_TEXTENCODING_ASCII_US));
227*d4aefcaeSZheng Fan 			aStrTip.Append(maStrUnit);		// modify
228*d4aefcaeSZheng Fan 			maVSSpacing.SetCustomTip(aStrTip,true);
229*d4aefcaeSZheng Fan 		}
230*d4aefcaeSZheng Fan 		else if(mnCustomKern < 0)
231*d4aefcaeSZheng Fan 		{
232*d4aefcaeSZheng Fan 			String aStrTip(maStrCusC) ;		//LAST CUSTOM no tip defect //add
233*d4aefcaeSZheng Fan 			aStrTip.Append( String::CreateFromDouble( (double)-mnCustomKern / 10));
234*d4aefcaeSZheng Fan 			aStrTip.Append(String("pt", 2, RTL_TEXTENCODING_ASCII_US));
235*d4aefcaeSZheng Fan 			aStrTip.Append(maStrUnit);		// modify
236*d4aefcaeSZheng Fan 			maVSSpacing.SetCustomTip(aStrTip,true);
237*d4aefcaeSZheng Fan 		}
238*d4aefcaeSZheng Fan 		else
239*d4aefcaeSZheng Fan 		{
240*d4aefcaeSZheng Fan 			String aStrTip(maStrCusN) ;		//LAST CUSTOM no tip defect //add
241*d4aefcaeSZheng Fan 			maVSSpacing.SetCustomTip(aStrTip,true);
242*d4aefcaeSZheng Fan 		}
243*d4aefcaeSZheng Fan 
244*d4aefcaeSZheng Fan 	}
245*d4aefcaeSZheng Fan 
246*d4aefcaeSZheng Fan 	if(bLBAvailable && bAvailable)
247*d4aefcaeSZheng Fan 	{
248*d4aefcaeSZheng Fan 		maLBKerning.Enable();
249*d4aefcaeSZheng Fan 		maFTSpacing.Enable();
250*d4aefcaeSZheng Fan 
251*d4aefcaeSZheng Fan 		SfxMapUnit eUnit = mrTextPropertyPanel.GetSpaceController().GetCoreMetric();
252*d4aefcaeSZheng Fan         MapUnit eOrgUnit = (MapUnit)eUnit;
253*d4aefcaeSZheng Fan         MapUnit ePntUnit( MAP_POINT );
254*d4aefcaeSZheng Fan         long nBig = maEditKerning.Normalize(nKerning);
255*d4aefcaeSZheng Fan         nKerning = LogicToLogic( nBig, eOrgUnit, ePntUnit );
256*d4aefcaeSZheng Fan 
257*d4aefcaeSZheng Fan 		if ( nKerning > 0 )
258*d4aefcaeSZheng Fan         {
259*d4aefcaeSZheng Fan 			maFTBy.Enable();
260*d4aefcaeSZheng Fan             maEditKerning.Enable();
261*d4aefcaeSZheng Fan             maEditKerning.SetMax( 9999 );
262*d4aefcaeSZheng Fan             maEditKerning.SetLast( 9999 );
263*d4aefcaeSZheng Fan             maEditKerning.SetValue( nKerning );
264*d4aefcaeSZheng Fan             maLBKerning.SelectEntryPos( SIDEBAR_SPACE_EXPAND );
265*d4aefcaeSZheng Fan 			if(nKerning == 30)
266*d4aefcaeSZheng Fan 			{
267*d4aefcaeSZheng Fan 				maVSSpacing.SetSelItem(4);
268*d4aefcaeSZheng Fan 			}
269*d4aefcaeSZheng Fan 			else if(nKerning == 60)
270*d4aefcaeSZheng Fan 			{
271*d4aefcaeSZheng Fan 				maVSSpacing.SetSelItem(5);
272*d4aefcaeSZheng Fan 			}
273*d4aefcaeSZheng Fan 			else
274*d4aefcaeSZheng Fan 			{
275*d4aefcaeSZheng Fan 				maVSSpacing.SetSelItem(0);
276*d4aefcaeSZheng Fan 				mbVS = false;
277*d4aefcaeSZheng Fan 			}
278*d4aefcaeSZheng Fan         }
279*d4aefcaeSZheng Fan         else if ( nKerning < 0 )
280*d4aefcaeSZheng Fan         {
281*d4aefcaeSZheng Fan 			maFTBy.Enable();
282*d4aefcaeSZheng Fan             maEditKerning.Enable();
283*d4aefcaeSZheng Fan             maEditKerning.SetValue( -nKerning );
284*d4aefcaeSZheng Fan             maLBKerning.SelectEntryPos( SIDEBAR_SPACE_CONDENSED );
285*d4aefcaeSZheng Fan             long nMax = mrTextPropertyPanel.GetSelFontSize()/6;
286*d4aefcaeSZheng Fan             maEditKerning.SetMax( maEditKerning.Normalize( nMax ), FUNIT_POINT );
287*d4aefcaeSZheng Fan             maEditKerning.SetLast( maEditKerning.GetMax( maEditKerning.GetUnit() ) );
288*d4aefcaeSZheng Fan 			if( nKerning == -30 )
289*d4aefcaeSZheng Fan 			{
290*d4aefcaeSZheng Fan 				maVSSpacing.SetSelItem(1);
291*d4aefcaeSZheng Fan 			}
292*d4aefcaeSZheng Fan 			else if( nKerning == -15 )
293*d4aefcaeSZheng Fan 			{
294*d4aefcaeSZheng Fan 				maVSSpacing.SetSelItem(2);
295*d4aefcaeSZheng Fan 			}
296*d4aefcaeSZheng Fan 			else
297*d4aefcaeSZheng Fan 			{
298*d4aefcaeSZheng Fan 				maVSSpacing.SetSelItem(0);
299*d4aefcaeSZheng Fan 				mbVS = false;
300*d4aefcaeSZheng Fan 			}
301*d4aefcaeSZheng Fan         }
302*d4aefcaeSZheng Fan         else
303*d4aefcaeSZheng Fan         {
304*d4aefcaeSZheng Fan 			maVSSpacing.SetSelItem(3);
305*d4aefcaeSZheng Fan 			maLBKerning.SelectEntryPos( SIDEBAR_SPACE_NORMAL );
306*d4aefcaeSZheng Fan 			maFTBy.Disable();
307*d4aefcaeSZheng Fan             maEditKerning.Disable();
308*d4aefcaeSZheng Fan             maEditKerning.SetValue( 0 );
309*d4aefcaeSZheng Fan             maEditKerning.SetMax( 9999 );
310*d4aefcaeSZheng Fan             maEditKerning.SetLast( 9999 );
311*d4aefcaeSZheng Fan         }
312*d4aefcaeSZheng Fan 	}
313*d4aefcaeSZheng Fan 	else if(bLBAvailable && !bAvailable)
314*d4aefcaeSZheng Fan 	{
315*d4aefcaeSZheng Fan 		//modified
316*d4aefcaeSZheng Fan 		maVSSpacing.SetSelItem(0);
317*d4aefcaeSZheng Fan 		mbVS = false;
318*d4aefcaeSZheng Fan 		maLBKerning.Enable();
319*d4aefcaeSZheng Fan 		maFTSpacing.Enable();
320*d4aefcaeSZheng Fan 		maLBKerning.SetNoSelection();
321*d4aefcaeSZheng Fan 		maEditKerning.SetText(String());
322*d4aefcaeSZheng Fan 		maEditKerning.Disable();
323*d4aefcaeSZheng Fan 		maFTBy.Disable();
324*d4aefcaeSZheng Fan 	}
325*d4aefcaeSZheng Fan 	else
326*d4aefcaeSZheng Fan 	{
327*d4aefcaeSZheng Fan 		maVSSpacing.SetSelItem(0);
328*d4aefcaeSZheng Fan 		mbVS = false;
329*d4aefcaeSZheng Fan 		maEditKerning.SetText(String());
330*d4aefcaeSZheng Fan         maLBKerning.SetNoSelection();
331*d4aefcaeSZheng Fan 		maLBKerning.Disable();
332*d4aefcaeSZheng Fan 		maFTSpacing.Disable();
333*d4aefcaeSZheng Fan         maEditKerning.Disable();
334*d4aefcaeSZheng Fan 		maFTBy.Disable();
335*d4aefcaeSZheng Fan 	}
336*d4aefcaeSZheng Fan 	GetFocus();
337*d4aefcaeSZheng Fan 	maVSSpacing.Format();
338*d4aefcaeSZheng Fan 	maVSSpacing.StartSelection();
339*d4aefcaeSZheng Fan }
340*d4aefcaeSZheng Fan IMPL_LINK(TextCharacterSpacingControl, VSSelHdl, void *, pControl)
341*d4aefcaeSZheng Fan {
342*d4aefcaeSZheng Fan 	mnLastCus = SPACING_CLOSE_BY_CLICK_ICON;
343*d4aefcaeSZheng Fan 
344*d4aefcaeSZheng Fan 	if(pControl == &maVSSpacing)
345*d4aefcaeSZheng Fan 	{
346*d4aefcaeSZheng Fan 		sal_uInt16 iPos = maVSSpacing.GetSelectItemId();
347*d4aefcaeSZheng Fan 		short nKern = 0;
348*d4aefcaeSZheng Fan 		SfxMapUnit eUnit = mrTextPropertyPanel.GetSpaceController().GetCoreMetric();
349*d4aefcaeSZheng Fan 		long nVal = 0;
350*d4aefcaeSZheng Fan 		if(iPos == 1)
351*d4aefcaeSZheng Fan 		{
352*d4aefcaeSZheng Fan 			nVal = LogicToLogic(30, MAP_POINT, (MapUnit)eUnit);
353*d4aefcaeSZheng Fan 			nKern = (short)maEditKerning.Denormalize(nVal);
354*d4aefcaeSZheng Fan 			SvxKerningItem aKernItem(-nKern, SID_ATTR_CHAR_KERNING);
355*d4aefcaeSZheng Fan 			mpBindings->GetDispatcher()->Execute(SID_ATTR_CHAR_KERNING, SFX_CALLMODE_RECORD, &aKernItem, 0L);
356*d4aefcaeSZheng Fan 			mrTextPropertyPanel.SetSpacing(-nKern);
357*d4aefcaeSZheng Fan 			mnLastCus = SPACING_CLOSE_BY_CLICK_ICON;
358*d4aefcaeSZheng Fan 		}
359*d4aefcaeSZheng Fan 		else if(iPos == 2)
360*d4aefcaeSZheng Fan 		{
361*d4aefcaeSZheng Fan 			nVal = LogicToLogic(15, MAP_POINT, (MapUnit)eUnit);
362*d4aefcaeSZheng Fan 			nKern = (short)maEditKerning.Denormalize(nVal);
363*d4aefcaeSZheng Fan 			SvxKerningItem aKernItem(-nKern, SID_ATTR_CHAR_KERNING);
364*d4aefcaeSZheng Fan 			mpBindings->GetDispatcher()->Execute(SID_ATTR_CHAR_KERNING, SFX_CALLMODE_RECORD, &aKernItem, 0L);
365*d4aefcaeSZheng Fan 			mrTextPropertyPanel.SetSpacing(-nKern);
366*d4aefcaeSZheng Fan 			mnLastCus = SPACING_CLOSE_BY_CLICK_ICON;
367*d4aefcaeSZheng Fan 		}
368*d4aefcaeSZheng Fan 		else if(iPos == 3)
369*d4aefcaeSZheng Fan 		{
370*d4aefcaeSZheng Fan 			SvxKerningItem aKernItem(0, SID_ATTR_CHAR_KERNING);
371*d4aefcaeSZheng Fan 			mpBindings->GetDispatcher()->Execute(SID_ATTR_CHAR_KERNING, SFX_CALLMODE_RECORD, &aKernItem, 0L);
372*d4aefcaeSZheng Fan 			mrTextPropertyPanel.SetSpacing(0);
373*d4aefcaeSZheng Fan 			mnLastCus = SPACING_CLOSE_BY_CLICK_ICON;
374*d4aefcaeSZheng Fan 		}
375*d4aefcaeSZheng Fan 		else if(iPos == 4)
376*d4aefcaeSZheng Fan 		{
377*d4aefcaeSZheng Fan 			nVal = LogicToLogic(30, MAP_POINT, (MapUnit)eUnit);
378*d4aefcaeSZheng Fan 			nKern = (short)maEditKerning.Denormalize(nVal);
379*d4aefcaeSZheng Fan 			SvxKerningItem aKernItem(nKern, SID_ATTR_CHAR_KERNING);
380*d4aefcaeSZheng Fan 			mpBindings->GetDispatcher()->Execute(SID_ATTR_CHAR_KERNING, SFX_CALLMODE_RECORD, &aKernItem, 0L);
381*d4aefcaeSZheng Fan 			mrTextPropertyPanel.SetSpacing(nKern);
382*d4aefcaeSZheng Fan 			mnLastCus = SPACING_CLOSE_BY_CLICK_ICON;
383*d4aefcaeSZheng Fan 		}
384*d4aefcaeSZheng Fan 		else if(iPos == 5)
385*d4aefcaeSZheng Fan 		{
386*d4aefcaeSZheng Fan 			nVal = LogicToLogic(60, MAP_POINT, (MapUnit)eUnit);
387*d4aefcaeSZheng Fan 			nKern = (short)maEditKerning.Denormalize(nVal);
388*d4aefcaeSZheng Fan 			SvxKerningItem aKernItem(nKern, SID_ATTR_CHAR_KERNING);
389*d4aefcaeSZheng Fan 			mpBindings->GetDispatcher()->Execute(SID_ATTR_CHAR_KERNING, SFX_CALLMODE_RECORD, &aKernItem, 0L);
390*d4aefcaeSZheng Fan 			mrTextPropertyPanel.SetSpacing(nKern);
391*d4aefcaeSZheng Fan 			mnLastCus = SPACING_CLOSE_BY_CLICK_ICON;
392*d4aefcaeSZheng Fan 		}
393*d4aefcaeSZheng Fan 		else if(iPos == 6)
394*d4aefcaeSZheng Fan 		{
395*d4aefcaeSZheng Fan 			//modified
396*d4aefcaeSZheng Fan 			if(mbCusEnable)
397*d4aefcaeSZheng Fan 			{
398*d4aefcaeSZheng Fan 				nVal = LogicToLogic(mnCustomKern, MAP_POINT, (MapUnit)eUnit);
399*d4aefcaeSZheng Fan 				nKern = (short)maEditKerning.Denormalize(nVal);
400*d4aefcaeSZheng Fan 				SvxKerningItem aKernItem(nKern , SID_ATTR_CHAR_KERNING);
401*d4aefcaeSZheng Fan 				mpBindings->GetDispatcher()->Execute(SID_ATTR_CHAR_KERNING, SFX_CALLMODE_RECORD, &aKernItem, 0L);
402*d4aefcaeSZheng Fan 				mrTextPropertyPanel.SetSpacing(nKern);
403*d4aefcaeSZheng Fan 				mnLastCus = SPACING_CLOSE_BY_CLICK_ICON;
404*d4aefcaeSZheng Fan 			}
405*d4aefcaeSZheng Fan 			else
406*d4aefcaeSZheng Fan 			{
407*d4aefcaeSZheng Fan 				maVSSpacing.SetNoSelection();		//add , set no selection and keep the last select item
408*d4aefcaeSZheng Fan 				maVSSpacing.Format();
409*d4aefcaeSZheng Fan 				Invalidate();
410*d4aefcaeSZheng Fan 				maVSSpacing.StartSelection();
411*d4aefcaeSZheng Fan 			}
412*d4aefcaeSZheng Fan 			//modify end
413*d4aefcaeSZheng Fan 		}
414*d4aefcaeSZheng Fan 
415*d4aefcaeSZheng Fan 		if(iPos < 6 || (iPos == 6 && mbCusEnable)) //add
416*d4aefcaeSZheng Fan 			mrTextPropertyPanel.EndSpacingPopupMode();
417*d4aefcaeSZheng Fan 	}
418*d4aefcaeSZheng Fan 
419*d4aefcaeSZheng Fan 
420*d4aefcaeSZheng Fan 
421*d4aefcaeSZheng Fan 	return 0;
422*d4aefcaeSZheng Fan }
423*d4aefcaeSZheng Fan 
424*d4aefcaeSZheng Fan IMPL_LINK(TextCharacterSpacingControl, KerningSelectHdl, ListBox*, EMPTYARG)
425*d4aefcaeSZheng Fan {
426*d4aefcaeSZheng Fan 	if ( maLBKerning.GetSelectEntryPos() > 0 )
427*d4aefcaeSZheng Fan 	{
428*d4aefcaeSZheng Fan 		maFTBy.Enable();
429*d4aefcaeSZheng Fan 		maEditKerning.Enable();
430*d4aefcaeSZheng Fan 	}
431*d4aefcaeSZheng Fan 	else
432*d4aefcaeSZheng Fan 	{
433*d4aefcaeSZheng Fan 		maEditKerning.SetValue( 0 );
434*d4aefcaeSZheng Fan 		maFTBy.Disable();
435*d4aefcaeSZheng Fan 		maEditKerning.Disable();
436*d4aefcaeSZheng Fan 	}
437*d4aefcaeSZheng Fan 
438*d4aefcaeSZheng Fan 	if(maVSSpacing.GetSelItem())
439*d4aefcaeSZheng Fan 	{
440*d4aefcaeSZheng Fan 		maVSSpacing.SetSelItem(0);	//modify
441*d4aefcaeSZheng Fan 		maVSSpacing.Format();
442*d4aefcaeSZheng Fan 		Invalidate();
443*d4aefcaeSZheng Fan 		maVSSpacing.StartSelection();
444*d4aefcaeSZheng Fan 	}
445*d4aefcaeSZheng Fan 	KerningModifyHdl( NULL );
446*d4aefcaeSZheng Fan 	return 0;
447*d4aefcaeSZheng Fan }
448*d4aefcaeSZheng Fan IMPL_LINK(TextCharacterSpacingControl, KerningModifyHdl, MetricField*, EMPTYARG)
449*d4aefcaeSZheng Fan {
450*d4aefcaeSZheng Fan 	if(maVSSpacing.GetSelItem())
451*d4aefcaeSZheng Fan 	{
452*d4aefcaeSZheng Fan 		maVSSpacing.SetSelItem(0);	//modify
453*d4aefcaeSZheng Fan 		maVSSpacing.Format();
454*d4aefcaeSZheng Fan 		Invalidate();
455*d4aefcaeSZheng Fan 		maVSSpacing.StartSelection();
456*d4aefcaeSZheng Fan 	}
457*d4aefcaeSZheng Fan 	sal_uInt16 nPos = maLBKerning.GetSelectEntryPos();
458*d4aefcaeSZheng Fan     short nKern = 0;
459*d4aefcaeSZheng Fan     SfxMapUnit eUnit = mrTextPropertyPanel.GetSpaceController().GetCoreMetric();
460*d4aefcaeSZheng Fan 	mnLastCus = SPACING_CLOSE_BY_CUS_EDIT;
461*d4aefcaeSZheng Fan 	if ( nPos == SIDEBAR_SPACE_EXPAND || nPos == SIDEBAR_SPACE_CONDENSED )
462*d4aefcaeSZheng Fan     {
463*d4aefcaeSZheng Fan         long nTmp = static_cast<long>(maEditKerning.GetValue());
464*d4aefcaeSZheng Fan         if ( nPos == SIDEBAR_SPACE_CONDENSED )
465*d4aefcaeSZheng Fan 		{
466*d4aefcaeSZheng Fan 			long nMax =  mrTextPropertyPanel.GetSelFontSize()/6;
467*d4aefcaeSZheng Fan 			maEditKerning.SetMax( maEditKerning.Normalize( nMax ), FUNIT_TWIP );
468*d4aefcaeSZheng Fan 			maEditKerning.SetLast( maEditKerning.GetMax( maEditKerning.GetUnit() ) );
469*d4aefcaeSZheng Fan 			if(nTmp > maEditKerning.GetMax())
470*d4aefcaeSZheng Fan 				nTmp = maEditKerning.GetMax();
471*d4aefcaeSZheng Fan 			mnCustomKern = -nTmp;
472*d4aefcaeSZheng Fan 			long nVal = LogicToLogic( nTmp, MAP_POINT, (MapUnit)eUnit );
473*d4aefcaeSZheng Fan 			nKern = (short)maEditKerning.Denormalize( nVal );
474*d4aefcaeSZheng Fan             nKern *= - 1;
475*d4aefcaeSZheng Fan 		}
476*d4aefcaeSZheng Fan 		else
477*d4aefcaeSZheng Fan 		{
478*d4aefcaeSZheng Fan 			maEditKerning.SetMax( 9999 );
479*d4aefcaeSZheng Fan 			maEditKerning.SetLast( 9999 );
480*d4aefcaeSZheng Fan 			if(nTmp > maEditKerning.GetMax(FUNIT_TWIP))
481*d4aefcaeSZheng Fan 				nTmp = maEditKerning.GetMax(FUNIT_TWIP);
482*d4aefcaeSZheng Fan 			mnCustomKern = nTmp;
483*d4aefcaeSZheng Fan 			long nVal = LogicToLogic( nTmp, MAP_POINT, (MapUnit)eUnit );
484*d4aefcaeSZheng Fan 			nKern = (short)maEditKerning.Denormalize( nVal );
485*d4aefcaeSZheng Fan 		}
486*d4aefcaeSZheng Fan     }
487*d4aefcaeSZheng Fan 	else
488*d4aefcaeSZheng Fan 	{
489*d4aefcaeSZheng Fan 		mnCustomKern = 0;
490*d4aefcaeSZheng Fan 	}
491*d4aefcaeSZheng Fan 	SvxKerningItem aKernItem(nKern, SID_ATTR_CHAR_KERNING);
492*d4aefcaeSZheng Fan 	mpBindings->GetDispatcher()->Execute(SID_ATTR_CHAR_KERNING, SFX_CALLMODE_RECORD, &aKernItem, 0L);
493*d4aefcaeSZheng Fan 	mrTextPropertyPanel.SetSpacing(nKern);
494*d4aefcaeSZheng Fan 	return 0;
495*d4aefcaeSZheng Fan }
496*d4aefcaeSZheng Fan short  TextCharacterSpacingControl::GetLastCustomState()
497*d4aefcaeSZheng Fan {
498*d4aefcaeSZheng Fan 	return mnLastCus;
499*d4aefcaeSZheng Fan }
500*d4aefcaeSZheng Fan long  TextCharacterSpacingControl::GetLastCustomValue()
501*d4aefcaeSZheng Fan {
502*d4aefcaeSZheng Fan 	return mnCustomKern;
503*d4aefcaeSZheng Fan }
504*d4aefcaeSZheng Fan 
505*d4aefcaeSZheng Fan }} // end of namespace sidebar
506