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