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