/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #include "precompiled_svx.hxx" #include "TextCharacterSpacingControl.hxx" #include "TextPropertyPanel.hrc" #include #include #include #include #include #include #include #include namespace svx { namespace sidebar { TextCharacterSpacingControl::TextCharacterSpacingControl(Window* pParent, svx::sidebar::TextPropertyPanel& rPanel) : PopupControl( pParent,SVX_RES(RID_POPUPPANEL_TEXTPAGE_SPACING)) , mrTextPropertyPanel(rPanel) , mpBindings(NULL) , maVSSpacing (ValueSetWithTextControl::IMAGE_TEXT,this, SVX_RES(VS_SPACING)) , maLastCus (this, SVX_RES(FT_LASTCUSTOM)) //, maBorder (this, SVX_RES(CT_BORDER)) , maFTSpacing (this, SVX_RES(FT_SPACING)) , maLBKerning (this, SVX_RES(LB_KERNING)) , maFTBy (this, SVX_RES(FT_BY)) , maEditKerning (this, SVX_RES(ED_KERNING)) , mpImg (NULL) , mpImgSel (NULL) , mpStr (NULL) , mpStrTip (NULL) , maImgCus (SVX_RES(IMG_CUSTOM)) , maImgCusGrey (SVX_RES(IMG_CUSTOM_GRAY)) , maStrCus (SVX_RES(STR_CUSTOM)) , maStrCusE (SVX_RES(STR_CUSTOM_E_TIP)) //add , maStrCusC (SVX_RES(STR_CUSTOM_C_TIP)) //add , maStrCusN (SVX_RES(STR_NORMAL_TIP)) //add , maStrUnit (SVX_RES(STR_PT)) //add , mnCustomKern(0) , mnLastCus ( SPACING_NOCUSTOM ) , mbCusEnable(false) , mbVS(true) { initial(); FreeResource(); mpBindings = mrTextPropertyPanel.GetBindings(); Link aLink = LINK(this, TextCharacterSpacingControl, KerningSelectHdl); maLBKerning.SetSelectHdl(aLink); aLink =LINK(this, TextCharacterSpacingControl, KerningModifyHdl); maEditKerning.SetModifyHdl(aLink); } TextCharacterSpacingControl::~TextCharacterSpacingControl() { delete[] mpImg; delete[] mpImgSel; delete[] mpStr; delete[] mpStrTip; } void TextCharacterSpacingControl::initial() { maVSSpacing.SetStyle( maVSSpacing.GetStyle()| WB_3DLOOK | WB_NO_DIRECTSELECT ); { maVSSpacing.SetControlBackground(GetSettings().GetStyleSettings().GetHighContrastMode()? GetSettings().GetStyleSettings().GetMenuColor(): sfx2::sidebar::Theme::GetColor( sfx2::sidebar::Theme::Paint_PanelBackground )); maVSSpacing.SetColor(GetSettings().GetStyleSettings().GetHighContrastMode()? GetSettings().GetStyleSettings().GetMenuColor(): sfx2::sidebar::Theme::GetColor( sfx2::sidebar::Theme::Paint_PanelBackground )); maVSSpacing.SetBackground(GetSettings().GetStyleSettings().GetHighContrastMode()? GetSettings().GetStyleSettings().GetMenuColor(): sfx2::sidebar::Theme::GetColor( sfx2::sidebar::Theme::Paint_PanelBackground )); maFTSpacing.SetBackground(GetSettings().GetStyleSettings().GetHighContrastMode()? GetSettings().GetStyleSettings().GetMenuColor(): sfx2::sidebar::Theme::GetColor( sfx2::sidebar::Theme::Paint_PanelBackground )); maFTBy.SetBackground(GetSettings().GetStyleSettings().GetHighContrastMode()? GetSettings().GetStyleSettings().GetMenuColor(): sfx2::sidebar::Theme::GetColor( sfx2::sidebar::Theme::Paint_PanelBackground )); } mpImg = new Image[5]; mpImg[0] = Image(SVX_RES(IMG_VERY_TIGHT)); mpImg[1] = Image(SVX_RES(IMG_TIGHT)); mpImg[2] = Image(SVX_RES(IMG_NORMAL)); mpImg[3] = Image(SVX_RES(IMG_LOOSE)); mpImg[4] = Image(SVX_RES(IMG_VERY_LOOSE)); mpImgSel = new Image[5]; mpImgSel[0] = Image(SVX_RES(IMG_VERY_TIGHT_S)); mpImgSel[1] = Image(SVX_RES(IMG_TIGHT_S)); mpImgSel[2] = Image(SVX_RES(IMG_NORMAL_S)); mpImgSel[3] = Image(SVX_RES(IMG_LOOSE_S)); mpImgSel[4] = Image(SVX_RES(IMG_VERY_LOOSE_S)); mpStr = new XubString[5]; mpStr[0] = XubString(SVX_RES(STR_VERY_TIGHT)); mpStr[1] = XubString(SVX_RES(STR_TIGHT)); mpStr[2] = XubString(SVX_RES(STR_NORMAL)); mpStr[3] = XubString(SVX_RES(STR_LOOSE)); mpStr[4] = XubString(SVX_RES(STR_VERY_LOOSE)); mpStrTip = new XubString[5]; mpStrTip[0] = XubString(SVX_RES(STR_VERY_TIGHT_TIP)); mpStrTip[1] = XubString(SVX_RES(STR_TIGHT_TIP)); mpStrTip[2] = XubString(SVX_RES(STR_NORMAL_TIP)); mpStrTip[3] = XubString(SVX_RES(STR_LOOSE_TIP)); mpStrTip[4] = XubString(SVX_RES(STR_VERY_LOOSE_TIP)); for (int i=0;i<5;i++) maVSSpacing.AddItem(mpImg[i], &mpImgSel[i],mpStr[i],&mpStrTip[i]); maVSSpacing.AddItem( maImgCus, 0, maStrCus, 0 ); maVSSpacing.SetNoSelection(); Link aLink = LINK(this, TextCharacterSpacingControl,VSSelHdl ); maVSSpacing.SetSelectHdl(aLink); maVSSpacing.StartSelection(); maVSSpacing.Show(); } void TextCharacterSpacingControl::ToGetFocus() { if(!mbVS) maLBKerning.GrabFocus(); else maVSSpacing.GrabFocus(); } void TextCharacterSpacingControl::Rearrange(bool bLBAvailable,bool bAvailable, long nKerning) { mbVS = true; maVSSpacing.SetNoSelection(); SvtViewOptions aWinOpt( E_WINDOW, SIDEBAR_SPACING_GLOBAL_VALUE ); if ( aWinOpt.Exists() ) { ::com::sun::star::uno::Sequence < ::com::sun::star::beans::NamedValue > aSeq = aWinOpt.GetUserData(); ::rtl::OUString aTmp; if ( aSeq.getLength()) aSeq[0].Value >>= aTmp; String aWinData( aTmp ); mnCustomKern = aWinData.ToInt32(); mnLastCus = SPACING_CLOSE_BY_CUS_EDIT; mbCusEnable = true; } else { mnLastCus = SPACING_NOCUSTOM; mbCusEnable = false; } if( !mnLastCus ) { maVSSpacing.ReplaceItemImages(6, maImgCusGrey,0); } else { //set custom tips maVSSpacing.ReplaceItemImages(6, maImgCus,0); if(mnCustomKern > 0) { String aStrTip( maStrCusE); //LAST CUSTOM no tip defect //add aStrTip.Append( String::CreateFromDouble( (double)mnCustomKern / 10)); aStrTip.Append(maStrUnit); // modify maVSSpacing.SetItemText(6,aStrTip); } else if(mnCustomKern < 0) { String aStrTip(maStrCusC) ; //LAST CUSTOM no tip defect //add aStrTip.Append( String::CreateFromDouble( (double)-mnCustomKern / 10)); aStrTip.Append(maStrUnit); // modify maVSSpacing.SetItemText( 6, aStrTip ); } else { String aStrTip(maStrCusN) ; //LAST CUSTOM no tip defect //add maVSSpacing.SetItemText( 6, aStrTip ); } } if(bLBAvailable && bAvailable) { maLBKerning.Enable(); maFTSpacing.Enable(); SfxMapUnit eUnit = mrTextPropertyPanel.GetSpaceController().GetCoreMetric(); MapUnit eOrgUnit = (MapUnit)eUnit; MapUnit ePntUnit( MAP_POINT ); long nBig = maEditKerning.Normalize(nKerning); nKerning = LogicToLogic( nBig, eOrgUnit, ePntUnit ); if ( nKerning > 0 ) { maFTBy.Enable(); maEditKerning.Enable(); maEditKerning.SetMax( 9999 ); maEditKerning.SetLast( 9999 ); maEditKerning.SetValue( nKerning ); maLBKerning.SelectEntryPos( SIDEBAR_SPACE_EXPAND ); if(nKerning == 30) { maVSSpacing.SelectItem(4); } else if(nKerning == 60) { maVSSpacing.SelectItem(5); } else { maVSSpacing.SetNoSelection(); mbVS = false; } } else if ( nKerning < 0 ) { maFTBy.Enable(); maEditKerning.Enable(); maEditKerning.SetValue( -nKerning ); maLBKerning.SelectEntryPos( SIDEBAR_SPACE_CONDENSED ); long nMax = mrTextPropertyPanel.GetSelFontSize()/6; maEditKerning.SetMax( maEditKerning.Normalize( nMax ), FUNIT_POINT ); maEditKerning.SetLast( maEditKerning.GetMax( maEditKerning.GetUnit() ) ); if( nKerning == -30 ) { maVSSpacing.SelectItem(1); } else if( nKerning == -15 ) { maVSSpacing.SelectItem(2); } else { maVSSpacing.SetNoSelection(); mbVS = false; } } else { maVSSpacing.SelectItem(3); maLBKerning.SelectEntryPos( SIDEBAR_SPACE_NORMAL ); maFTBy.Disable(); maEditKerning.Disable(); maEditKerning.SetValue( 0 ); maEditKerning.SetMax( 9999 ); maEditKerning.SetLast( 9999 ); } } else if(bLBAvailable && !bAvailable) { //modified maVSSpacing.SetNoSelection(); mbVS = false; maLBKerning.Enable(); maFTSpacing.Enable(); maLBKerning.SetNoSelection(); maEditKerning.SetText(String()); maEditKerning.Disable(); maFTBy.Disable(); } else { maVSSpacing.SetNoSelection(); mbVS = false; maEditKerning.SetText(String()); maLBKerning.SetNoSelection(); maLBKerning.Disable(); maFTSpacing.Disable(); maEditKerning.Disable(); maFTBy.Disable(); } GetFocus(); maVSSpacing.Format(); maVSSpacing.StartSelection(); } IMPL_LINK(TextCharacterSpacingControl, VSSelHdl, void *, pControl) { mnLastCus = SPACING_CLOSE_BY_CLICK_ICON; if(pControl == &maVSSpacing) { sal_uInt16 iPos = maVSSpacing.GetSelectItemId(); short nKern = 0; SfxMapUnit eUnit = mrTextPropertyPanel.GetSpaceController().GetCoreMetric(); long nVal = 0; if(iPos == 1) { nVal = LogicToLogic(30, MAP_POINT, (MapUnit)eUnit); nKern = (short)maEditKerning.Denormalize(nVal); SvxKerningItem aKernItem(-nKern, SID_ATTR_CHAR_KERNING); mpBindings->GetDispatcher()->Execute(SID_ATTR_CHAR_KERNING, SFX_CALLMODE_RECORD, &aKernItem, 0L); mrTextPropertyPanel.SetSpacing(-nKern); mnLastCus = SPACING_CLOSE_BY_CLICK_ICON; } else if(iPos == 2) { nVal = LogicToLogic(15, MAP_POINT, (MapUnit)eUnit); nKern = (short)maEditKerning.Denormalize(nVal); SvxKerningItem aKernItem(-nKern, SID_ATTR_CHAR_KERNING); mpBindings->GetDispatcher()->Execute(SID_ATTR_CHAR_KERNING, SFX_CALLMODE_RECORD, &aKernItem, 0L); mrTextPropertyPanel.SetSpacing(-nKern); mnLastCus = SPACING_CLOSE_BY_CLICK_ICON; } else if(iPos == 3) { SvxKerningItem aKernItem(0, SID_ATTR_CHAR_KERNING); mpBindings->GetDispatcher()->Execute(SID_ATTR_CHAR_KERNING, SFX_CALLMODE_RECORD, &aKernItem, 0L); mrTextPropertyPanel.SetSpacing(0); mnLastCus = SPACING_CLOSE_BY_CLICK_ICON; } else if(iPos == 4) { nVal = LogicToLogic(30, MAP_POINT, (MapUnit)eUnit); nKern = (short)maEditKerning.Denormalize(nVal); SvxKerningItem aKernItem(nKern, SID_ATTR_CHAR_KERNING); mpBindings->GetDispatcher()->Execute(SID_ATTR_CHAR_KERNING, SFX_CALLMODE_RECORD, &aKernItem, 0L); mrTextPropertyPanel.SetSpacing(nKern); mnLastCus = SPACING_CLOSE_BY_CLICK_ICON; } else if(iPos == 5) { nVal = LogicToLogic(60, MAP_POINT, (MapUnit)eUnit); nKern = (short)maEditKerning.Denormalize(nVal); SvxKerningItem aKernItem(nKern, SID_ATTR_CHAR_KERNING); mpBindings->GetDispatcher()->Execute(SID_ATTR_CHAR_KERNING, SFX_CALLMODE_RECORD, &aKernItem, 0L); mrTextPropertyPanel.SetSpacing(nKern); mnLastCus = SPACING_CLOSE_BY_CLICK_ICON; } else if(iPos == 6) { //modified if(mbCusEnable) { nVal = LogicToLogic(mnCustomKern, MAP_POINT, (MapUnit)eUnit); nKern = (short)maEditKerning.Denormalize(nVal); SvxKerningItem aKernItem(nKern , SID_ATTR_CHAR_KERNING); mpBindings->GetDispatcher()->Execute(SID_ATTR_CHAR_KERNING, SFX_CALLMODE_RECORD, &aKernItem, 0L); mrTextPropertyPanel.SetSpacing(nKern); mnLastCus = SPACING_CLOSE_BY_CLICK_ICON; } else { maVSSpacing.SetNoSelection(); //add , set no selection and keep the last select item maVSSpacing.Format(); Invalidate(); maVSSpacing.StartSelection(); } //modify end } if(iPos < 6 || (iPos == 6 && mbCusEnable)) //add mrTextPropertyPanel.EndSpacingPopupMode(); } return 0; } IMPL_LINK(TextCharacterSpacingControl, KerningSelectHdl, ListBox*, EMPTYARG) { if ( maLBKerning.GetSelectEntryPos() > 0 ) { maFTBy.Enable(); maEditKerning.Enable(); } else { maEditKerning.SetValue( 0 ); maFTBy.Disable(); maEditKerning.Disable(); } if ( maVSSpacing.GetSelectItemId() > 0 ) { maVSSpacing.SetNoSelection(); //modify maVSSpacing.Format(); Invalidate(); maVSSpacing.StartSelection(); } KerningModifyHdl( NULL ); return 0; } IMPL_LINK(TextCharacterSpacingControl, KerningModifyHdl, MetricField*, EMPTYARG) { if ( maVSSpacing.GetSelectItemId() > 0 ) { maVSSpacing.SetNoSelection(); //modify maVSSpacing.Format(); Invalidate(); maVSSpacing.StartSelection(); } sal_uInt16 nPos = maLBKerning.GetSelectEntryPos(); short nKern = 0; SfxMapUnit eUnit = mrTextPropertyPanel.GetSpaceController().GetCoreMetric(); mnLastCus = SPACING_CLOSE_BY_CUS_EDIT; if ( nPos == SIDEBAR_SPACE_EXPAND || nPos == SIDEBAR_SPACE_CONDENSED ) { long nTmp = static_cast(maEditKerning.GetValue()); if ( nPos == SIDEBAR_SPACE_CONDENSED ) { long nMax = mrTextPropertyPanel.GetSelFontSize()/6; maEditKerning.SetMax( maEditKerning.Normalize( nMax ), FUNIT_TWIP ); maEditKerning.SetLast( maEditKerning.GetMax( maEditKerning.GetUnit() ) ); if(nTmp > maEditKerning.GetMax()) nTmp = maEditKerning.GetMax(); mnCustomKern = -nTmp; long nVal = LogicToLogic( nTmp, MAP_POINT, (MapUnit)eUnit ); nKern = (short)maEditKerning.Denormalize( nVal ); nKern *= - 1; } else { maEditKerning.SetMax( 9999 ); maEditKerning.SetLast( 9999 ); if(nTmp > maEditKerning.GetMax(FUNIT_TWIP)) nTmp = maEditKerning.GetMax(FUNIT_TWIP); mnCustomKern = nTmp; long nVal = LogicToLogic( nTmp, MAP_POINT, (MapUnit)eUnit ); nKern = (short)maEditKerning.Denormalize( nVal ); } } else { mnCustomKern = 0; } SvxKerningItem aKernItem(nKern, SID_ATTR_CHAR_KERNING); mpBindings->GetDispatcher()->Execute(SID_ATTR_CHAR_KERNING, SFX_CALLMODE_RECORD, &aKernItem, 0L); mrTextPropertyPanel.SetSpacing(nKern); return 0; } short TextCharacterSpacingControl::GetLastCustomState() { return mnLastCus; } long TextCharacterSpacingControl::GetLastCustomValue() { return mnCustomKern; } }} // end of namespace sidebar