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 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 } 77 TextCharacterSpacingControl::~TextCharacterSpacingControl() 78 { 79 delete[] mpImg; 80 delete[] mpImgSel; 81 delete[] mpStr; 82 delete[] mpStrTip; 83 } 84 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 } 145 void TextCharacterSpacingControl::ToGetFocus() 146 { 147 if(!mbVS) 148 maLBKerning.GrabFocus(); 149 else 150 maVSSpacing.GrabFocus(); 151 } 152 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 } 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 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 } 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 } 464 short TextCharacterSpacingControl::GetLastCustomState() 465 { 466 return mnLastCus; 467 } 468 long TextCharacterSpacingControl::GetLastCustomValue() 469 { 470 return mnCustomKern; 471 } 472 473 }} // end of namespace sidebar 474