blob: d386289cb8021520069839ae270b86c1c8022387 [file] [log] [blame]
/**************************************************************
*
* 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 <sfx2/sidebar/ResourceDefinitions.hrc>
#include <svx/dialogs.hrc>
#include <svx/dialmgr.hxx>
#include <unotools/viewoptions.hxx>
#include <editeng/kernitem.hxx>
#include <sfx2/bindings.hxx>
#include <sfx2/dispatch.hxx>
#include <sfx2/sidebar/Theme.hxx>
namespace svx { namespace sidebar {
TextCharacterSpacingControl::TextCharacterSpacingControl (
Window* pParent,
svx::sidebar::TextPropertyPanel& rPanel,
SfxBindings* pBindings)
: PopupControl( pParent,SVX_RES(RID_POPUPPANEL_TEXTPAGE_SPACING))
, mrTextPropertyPanel(rPanel)
, mpBindings(pBindings)
, 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();
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( xub_Unicode(' ') );
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( xub_Unicode( ' ' ) );
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();
maVSSpacing.SelectItem(0);
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();
maVSSpacing.SelectItem(0);
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();
maVSSpacing.SelectItem(0);
mbVS = false;
maLBKerning.Enable();
maFTSpacing.Enable();
maLBKerning.SetNoSelection();
maEditKerning.SetText(String());
maEditKerning.Disable();
maFTBy.Disable();
}
else
{
maVSSpacing.SetNoSelection();
maVSSpacing.SelectItem(0);
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();
maVSSpacing.SelectItem(0);
maVSSpacing.Format();
Invalidate();
maVSSpacing.StartSelection();
}
KerningModifyHdl( NULL );
return 0;
}
IMPL_LINK(TextCharacterSpacingControl, KerningModifyHdl, MetricField*, EMPTYARG)
{
if ( maVSSpacing.GetSelectItemId() > 0 )
{
maVSSpacing.SetNoSelection();
maVSSpacing.SelectItem(0);
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<long>(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