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