blob: 38e9994871aaa6b77dc3acbec799285836d76c9d [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.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sw.hxx"
#ifdef SW_DLLIMPLEMENTATION
#undef SW_DLLIMPLEMENTATION
#endif
#include <hintids.hxx>
#define _SVSTDARR_STRINGSDTOR
#define _SVSTDARR_STRINGSISORTDTOR
#include <svl/svstdarr.hxx>
#include "cmdid.h"
#include "swmodule.hxx"
#include "view.hxx"
#include "wrtsh.hxx"
#include "globals.hrc"
#ifndef _METRIC_HXX //autogen
#include <vcl/metric.hxx>
#endif
#include <svl/stritem.hxx>
#include <editeng/fontitem.hxx>
#include <svx/htmlmode.hxx>
#include <sfx2/objsh.hxx>
#include <editeng/svxfont.hxx>
#include <vcl/print.hxx>
#include <sfx2/printer.hxx>
#ifndef _COM_SUN_STAR_I18N_SCRIPTTYPE_HDL_
#include <com/sun/star/i18n/ScriptType.hdl>
#endif
#include <editeng/scripttypeitem.hxx>
#include <com/sun/star/i18n/XBreakIterator.hpp>
#include <comphelper/processfactory.hxx>
#define _SVSTDARR_XUB_STRLEN
#define _SVSTDARR_USHORTS
#define _SVSTDARR_ULONGS
#include <svl/svstdarr.hxx>
#include "charatr.hxx"
#include "viewopt.hxx"
#include "drpcps.hxx"
#include "paratr.hxx"
#include "uitool.hxx"
#include "charfmt.hxx"
#include "chrdlg.hrc"
#include "drpcps.hrc"
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::lang;
//using namespace i18n; !using this namespace leads to mysterious conflicts with ScriptType::...!
// so don't use this instead of the following defines!
#define I18N ::com::sun::star::i18n
#define I18N_SCRIPTTYPE ::com::sun::star::i18n::ScriptType
// Globals ******************************************************************
static sal_uInt16 __FAR_DATA aPageRg[] = {
RES_PARATR_DROP, RES_PARATR_DROP,
0
};
// class SwDropCapsPict *****************************************************
class SwDropCapsPict : public Control
{
String maText;
String maScriptText;
Color maBackColor;
Color maTextLineColor;
sal_uInt8 mnLines;
long mnTotLineH;
long mnLineH;
long mnTextH;
sal_uInt16 mnDistance;
sal_Int32 mnLeading;
Printer* mpPrinter;
sal_Bool mbDelPrinter;
SvULongs maTextWidth;
SvXub_StrLens maScriptChg;
SvUShorts maScriptType;
SvxFont maFont;
SvxFont maCJKFont;
SvxFont maCTLFont;
Size maTextSize;
Reference< I18N::XBreakIterator > xBreak;
virtual void Paint(const Rectangle &rRect);
void CheckScript( void );
Size CalcTextSize( void );
inline void InitPrinter( void );
void _InitPrinter( void );
void GetFontSettings( const SwDropCapsPage& _rPage, Font& _rFont, sal_uInt16 _nWhich );
public:
SwDropCapsPict(Window *pParent, const ResId &rResId) :
Control(pParent, rResId), mpPrinter( NULL ), mbDelPrinter( sal_False ) {}
~SwDropCapsPict();
void UpdatePaintSettings( void ); // also invalidates control!
inline void SetText( const String& rT );
inline void SetLines( sal_uInt8 nL );
inline void SetDistance( sal_uInt16 nD );
inline void SetValues( const String& rText, sal_uInt8 nLines, sal_uInt16 nDistance );
void DrawPrev( const Point& rPt );
};
inline void SwDropCapsPict::SetText( const String& rT )
{
maText = rT;
UpdatePaintSettings();
}
inline void SwDropCapsPict::SetLines( sal_uInt8 nL )
{
mnLines = nL;
UpdatePaintSettings();
}
inline void SwDropCapsPict::SetDistance( sal_uInt16 nD )
{
mnDistance = nD;
UpdatePaintSettings();
}
inline void SwDropCapsPict::SetValues( const String& rText, sal_uInt8 nLines, sal_uInt16 nDistance )
{
maText = rText;
mnLines = nLines;
mnDistance = nDistance;
UpdatePaintSettings();
}
inline void SwDropCapsPict::InitPrinter( void )
{
if( !mpPrinter )
_InitPrinter();
}
/****************************************************************************
Default-String aus Zeichenanzahl erzeugen (A, AB, ABC, ...)
****************************************************************************/
String GetDefaultString(sal_uInt16 nChars)
{
String aStr;
for (sal_uInt16 i = 0; i < nChars; i++)
aStr += String((char) (i + 65));
return aStr;
}
static void calcFontHeightAnyAscent( OutputDevice* _pWin, Font& _rFont, long& _nHeight, long& _nAscent )
{
if ( !_nHeight )
{
_pWin->SetFont( _rFont );
FontMetric aMetric( _pWin->GetFontMetric() );
_nHeight = aMetric.GetLineHeight();
_nAscent = aMetric.GetAscent();
}
}
/****************************************************************************
Pict: Dtor
****************************************************************************/
SwDropCapsPict::~SwDropCapsPict()
{
if( mbDelPrinter )
delete mpPrinter;
}
/****************************************************************************
Pict: Update Font
****************************************************************************/
#define LINES 10
#define BORDER 2
void SwDropCapsPict::GetFontSettings( const SwDropCapsPage& _rPage, Font& _rFont, sal_uInt16 _nWhich )
{
SfxItemSet aSet( _rPage.rSh.GetAttrPool(), _nWhich, _nWhich);
_rPage.rSh.GetCurAttr(aSet);
SvxFontItem aFmtFont((SvxFontItem &) aSet.Get(_nWhich));
_rFont.SetFamily (aFmtFont.GetFamily());
_rFont.SetName (aFmtFont.GetFamilyName());
_rFont.SetPitch (aFmtFont.GetPitch());
_rFont.SetCharSet(aFmtFont.GetCharSet());
}
void SwDropCapsPict::UpdatePaintSettings( void )
{
maBackColor = GetSettings().GetStyleSettings().GetWindowColor();
maTextLineColor = Color( COL_LIGHTGRAY );
// gray lines
mnTotLineH = (GetOutputSizePixel().Height() - 2 * BORDER) / LINES;
mnLineH = mnTotLineH - 2;
mnLeading = GetFontMetric().GetIntLeading();
Font aFont;
{
SwDropCapsPage* pPage = ( SwDropCapsPage* ) GetParent();
if (!pPage->aTemplateBox.GetSelectEntryPos())
{
// Font an Absatzanfang erfragen
pPage->rSh.SttCrsrMove();
pPage->rSh.Push();
pPage->rSh.ClearMark();
SwWhichPara pSwuifnParaCurr = GetfnParaCurr();
SwPosPara pSwuifnParaStart = GetfnParaStart();
pPage->rSh.MovePara(pSwuifnParaCurr,pSwuifnParaStart);
// normal
GetFontSettings( *pPage, aFont, RES_CHRATR_FONT );
// CJK
GetFontSettings( *pPage, maCJKFont, RES_CHRATR_CJK_FONT );
// CTL
GetFontSettings( *pPage, maCTLFont, RES_CHRATR_CTL_FONT );
pPage->rSh.Pop(sal_False);
pPage->rSh.EndCrsrMove();
}
else
{
// Font an Zeichenvorlage erfragen
SwCharFmt *pFmt = pPage->rSh.GetCharStyle(
pPage->aTemplateBox.GetSelectEntry(),
SwWrtShell::GETSTYLE_CREATEANY );
ASSERT(pFmt, "Zeichenvorlage existiert nicht!");
const SvxFontItem &rFmtFont = pFmt->GetFont();
aFont.SetFamily (rFmtFont.GetFamily());
aFont.SetName (rFmtFont.GetFamilyName());
aFont.SetPitch (rFmtFont.GetPitch());
aFont.SetCharSet(rFmtFont.GetCharSet());
}
}
mnTextH = mnLines * mnTotLineH;
aFont.SetSize(Size(0, mnTextH));
maCJKFont.SetSize(Size(0, mnTextH));
maCTLFont.SetSize(Size(0, mnTextH));
aFont.SetTransparent(sal_True);
maCJKFont.SetTransparent(sal_True);
maCTLFont.SetTransparent(sal_True);
aFont.SetColor( SwViewOption::GetFontColor() );
maCJKFont.SetColor( SwViewOption::GetFontColor() );
maCTLFont.SetColor( SwViewOption::GetFontColor() );
aFont.SetFillColor(GetSettings().GetStyleSettings().GetWindowColor());
maCJKFont.SetFillColor(GetSettings().GetStyleSettings().GetWindowColor());
maCTLFont.SetFillColor(GetSettings().GetStyleSettings().GetWindowColor());
maCJKFont.SetSize(Size(0, maCJKFont.GetSize().Height() + mnLeading));
maCTLFont.SetSize(Size(0, maCTLFont.GetSize().Height() + mnLeading));
SetFont(aFont);
aFont.SetSize(Size(0, aFont.GetSize().Height() + mnLeading));
SetFont(aFont);
maFont = aFont;
CheckScript();
maTextSize = CalcTextSize();
Invalidate();
}
/****************************************************************************
Pict: Paint-Overload
****************************************************************************/
void SwDropCapsPict::Paint(const Rectangle &/*rRect*/)
{
if (!IsVisible())
return;
SetMapMode(MapMode(MAP_PIXEL));
SetLineColor();
SetFillColor( maBackColor );
Size aOutputSizePixel( GetOutputSizePixel() );
DrawRect(Rectangle(Point(0, 0), aOutputSizePixel ));
SetClipRegion(Region(Rectangle(
Point(BORDER, BORDER),
Size (aOutputSizePixel.Width () - 2 * BORDER,
aOutputSizePixel.Height() - 2 * BORDER))));
ASSERT(mnLineH > 0, "So klein lassen wir uns nicht machen");
long nY0 = (aOutputSizePixel.Height() - (LINES * mnTotLineH)) / 2;
SetFillColor( maTextLineColor );
for (sal_uInt16 i = 0; i < LINES; ++i)
DrawRect(Rectangle(Point(BORDER, nY0 + i * mnTotLineH), Size(aOutputSizePixel.Width() - 2 * BORDER, mnLineH)));
// Texthintergrund mit Abstand (240 twips ~ 1 Zeilenhoehe)
sal_uLong lDistance = mnDistance;
sal_uInt16 nDistW = (sal_uInt16) (sal_uLong) (((lDistance * 100) / 240) * mnTotLineH) / 100;
SetFillColor( maBackColor );
if(((SwDropCapsPage*)GetParent())->aDropCapsBox.IsChecked())
{
Size aTextSize( maTextSize );
aTextSize.Width() += nDistW;
DrawRect( Rectangle( Point( BORDER, nY0 ), aTextSize ) );
// Text zeichnen
DrawPrev( Point( BORDER, nY0 - mnLeading ) );
}
SetClipRegion();
}
void SwDropCapsPict::DrawPrev( const Point& rPt )
{
Point aPt(rPt);
InitPrinter();
Font aOldFont = mpPrinter->GetFont();
sal_uInt16 nScript;
size_t nIdx = 0;
xub_StrLen nStart = 0;
xub_StrLen nEnd;
size_t nCnt = maScriptChg.size();
if( nCnt )
{
nEnd = maScriptChg[ nIdx ];
nScript = maScriptType[ nIdx ];
}
else
{
nEnd = maText.Len();
nScript = I18N_SCRIPTTYPE::LATIN;
}
do
{
SvxFont& rFnt = (nScript==I18N_SCRIPTTYPE::ASIAN) ? maCJKFont : ((nScript==I18N_SCRIPTTYPE::COMPLEX) ? maCTLFont : maFont);
mpPrinter->SetFont( rFnt );
rFnt.DrawPrev( this, mpPrinter, aPt, maText, nStart, nEnd - nStart );
aPt.X() += maTextWidth[ nIdx++ ];
if( nEnd < maText.Len() && nIdx < nCnt )
{
nStart = nEnd;
nEnd = maScriptChg[ nIdx ];
nScript = maScriptType[ nIdx ];
}
else
break;
}
while( sal_True );
mpPrinter->SetFont( aOldFont );
}
void SwDropCapsPict::CheckScript( void )
{
if( maScriptText == maText )
return;
maScriptText = maText;
size_t nCnt = maScriptChg.size();
if( nCnt )
{
maScriptChg.clear();
maScriptType.Remove( 0, nCnt );
maTextWidth.Remove( 0, nCnt );
nCnt = 0;
}
if( !xBreak.is() )
{
Reference< XMultiServiceFactory > xMSF = ::comphelper::getProcessServiceFactory();
xBreak = Reference< I18N::XBreakIterator >(xMSF->createInstance(
::rtl::OUString::createFromAscii( "com.sun.star.i18n.BreakIterator" ) ),UNO_QUERY);
}
if( xBreak.is() )
{
sal_uInt16 nScript = xBreak->getScriptType( maText, 0 );
sal_uInt16 nChg = 0;
if( I18N_SCRIPTTYPE::WEAK == nScript )
{
nChg = (xub_StrLen)xBreak->endOfScript( maText, nChg, nScript );
if( nChg < maText.Len() )
nScript = xBreak->getScriptType( maText, nChg );
else
nScript = I18N_SCRIPTTYPE::LATIN;
}
do
{
nChg = (xub_StrLen)xBreak->endOfScript( maText, nChg, nScript );
maScriptChg.push_back( nChg );
maScriptType.Insert( nScript, nCnt );
maTextWidth.Insert( sal_uLong(0), nCnt++ );
if( nChg < maText.Len() )
nScript = xBreak->getScriptType( maText, nChg );
else
break;
} while( sal_True );
}
}
Size SwDropCapsPict::CalcTextSize( void )
{
InitPrinter();
sal_uInt16 nScript;
size_t nIdx = 0;
xub_StrLen nStart = 0;
xub_StrLen nEnd;
size_t nCnt = maScriptChg.size();
if( nCnt )
{
nEnd = maScriptChg[ nIdx ];
nScript = maScriptType[ nIdx ];
}
else
{
nEnd = maText.Len();
nScript = I18N_SCRIPTTYPE::LATIN;
}
long nTxtWidth = 0;
long nCJKHeight = 0;
long nCTLHeight = 0;
long nHeight = 0;
long nAscent = 0;
long nCJKAscent = 0;
long nCTLAscent = 0;
do
{
SvxFont& rFnt = ( nScript == I18N_SCRIPTTYPE::ASIAN )? maCJKFont :
( ( nScript == I18N_SCRIPTTYPE::COMPLEX )? maCTLFont : maFont );
sal_uLong nWidth = rFnt.GetTxtSize( mpPrinter, maText, nStart, nEnd-nStart ).Width();
if( nIdx < maTextWidth.Count() )
maTextWidth[ nIdx++ ] = nWidth;
nTxtWidth += nWidth;
switch(nScript)
{
case I18N_SCRIPTTYPE::ASIAN:
calcFontHeightAnyAscent( this, maCJKFont, nCJKHeight, nCJKAscent );
break;
case I18N_SCRIPTTYPE::COMPLEX:
calcFontHeightAnyAscent( this, maCTLFont, nCTLHeight, nCTLAscent );
break;
default:
calcFontHeightAnyAscent( this, maFont, nHeight, nAscent );
}
if( nEnd < maText.Len() && nIdx < nCnt )
{
nStart = nEnd;
nEnd = maScriptChg[ nIdx ];
nScript = maScriptType[ nIdx ];
}
else
break;
}
while( sal_True );
nHeight -= nAscent;
nCJKHeight -= nCJKAscent;
nCTLHeight -= nCTLAscent;
if( nHeight < nCJKHeight )
nHeight = nCJKHeight;
if( nAscent < nCJKAscent )
nAscent = nCJKAscent;
if( nHeight < nCTLHeight )
nHeight = nCTLHeight;
if( nAscent < nCTLAscent )
nAscent = nCTLAscent;
nHeight += nAscent;
Size aTxtSize( nTxtWidth, nHeight );
return aTxtSize;
}
void SwDropCapsPict::_InitPrinter()
{
SfxViewShell* pSh = SfxViewShell::Current();
if ( pSh )
mpPrinter = pSh->GetPrinter();
if ( !mpPrinter )
{
mpPrinter = new Printer;
mbDelPrinter = sal_True;
}
}
/****************************************************************************
Dlg: Ctor
****************************************************************************/
SwDropCapsDlg::SwDropCapsDlg(Window *pParent, const SfxItemSet &rSet ) :
SfxSingleTabDialog(pParent, rSet, 0)
{
SwDropCapsPage* pNewPage = (SwDropCapsPage*) SwDropCapsPage::Create(this, rSet);
pNewPage->SetFormat(sal_False);
SetTabPage(pNewPage);
}
/****************************************************************************
Dlg: Dtor
****************************************************************************/
SwDropCapsDlg::~SwDropCapsDlg()
{
}
/****************************************************************************
Page: Ctor
****************************************************************************/
SwDropCapsPage::SwDropCapsPage(Window *pParent, const SfxItemSet &rSet) :
SfxTabPage(pParent, SW_RES(TP_DROPCAPS), rSet),
aSettingsFL (this, SW_RES(FL_SETTINGS)),
aDropCapsBox (this, SW_RES(CB_SWITCH )),
aWholeWordCB (this, SW_RES(CB_WORD )),
aSwitchText (this, SW_RES(FT_DROPCAPS )),
aDropCapsField(this, SW_RES(FLD_DROPCAPS)),
aLinesText (this, SW_RES(TXT_LINES )),
aLinesField (this, SW_RES(FLD_LINES )),
aDistanceText (this, SW_RES(TXT_DISTANCE)),
aDistanceField(this, SW_RES(FLD_DISTANCE)),
aContentFL (this, SW_RES(FL_CONTENT )),
aTextText (this, SW_RES(TXT_TEXT )),
aTextEdit (this, SW_RES(EDT_TEXT )),
aTemplateText (this, SW_RES(TXT_TEMPLATE)),
aTemplateBox (this, SW_RES(BOX_TEMPLATE)),
pPict (new SwDropCapsPict(this, SW_RES(CNT_PICT))),
bModified(sal_False),
bFormat(sal_True),
rSh(::GetActiveView()->GetWrtShell())
{
FreeResource();
SetExchangeSupport();
sal_uInt16 nHtmlMode = ::GetHtmlMode((const SwDocShell*)SfxObjectShell::Current());
bHtmlMode = nHtmlMode & HTMLMODE_ON ? sal_True : sal_False;
//Im Vorlagendialog kann der Text nicht beeinflusst werden
aTextText.Enable( !bFormat );
aTextEdit.Enable( !bFormat );
// Metriken
SetMetric( aDistanceField, GetDfltMetric(bHtmlMode) );
pPict->SetBorderStyle( WINDOW_BORDER_MONO );
// Handler installieren
Link aLk = LINK(this, SwDropCapsPage, ModifyHdl);
aDropCapsField.SetModifyHdl( aLk );
aLinesField .SetModifyHdl( aLk );
aDistanceField.SetModifyHdl( aLk );
aTextEdit .SetModifyHdl( aLk );
aDropCapsBox .SetClickHdl (LINK(this, SwDropCapsPage, ClickHdl ));
aTemplateBox .SetSelectHdl(LINK(this, SwDropCapsPage, SelectHdl));
aWholeWordCB .SetClickHdl (LINK(this, SwDropCapsPage, WholeWordHdl ));
}
/****************************************************************************
Page: Dtor
****************************************************************************/
SwDropCapsPage::~SwDropCapsPage()
{
delete pPict;
}
int SwDropCapsPage::DeactivatePage(SfxItemSet * _pSet)
{
if ( _pSet )
FillSet( *_pSet );
return LEAVE_PAGE;
}
/****************************************************************************
Page: Factory
****************************************************************************/
SfxTabPage* SwDropCapsPage::Create(Window *pParent,
const SfxItemSet &rSet)
{
return new SwDropCapsPage(pParent, rSet);
}
/****************************************************************************
Page: FillItemSet-Overload
****************************************************************************/
sal_Bool SwDropCapsPage::FillItemSet(SfxItemSet &rSet)
{
if(bModified)
FillSet(rSet);
return bModified;
}
/****************************************************************************
Page: Reset-Overload
****************************************************************************/
void SwDropCapsPage::Reset(const SfxItemSet &rSet)
{
// Zeichen, Zeilen, Abstand und Text
SwFmtDrop aFmtDrop((SwFmtDrop &) rSet.Get(RES_PARATR_DROP));
if (aFmtDrop.GetLines() > 1)
{
aDropCapsField.SetValue(aFmtDrop.GetChars());
aLinesField .SetValue(aFmtDrop.GetLines());
aDistanceField.SetValue(aDistanceField.Normalize(aFmtDrop.GetDistance()), FUNIT_TWIP);
aWholeWordCB .Check (aFmtDrop.GetWholeWord());
}
else
{
aDropCapsField.SetValue(1);
aLinesField .SetValue(3);
aDistanceField.SetValue(0);
}
::FillCharStyleListBox(aTemplateBox, rSh.GetView().GetDocShell(), sal_True);
aTemplateBox.InsertEntry(SW_RESSTR(SW_STR_NONE), 0);
// Vorlage defaulten
aTemplateBox.SelectEntryPos(0);
if (aFmtDrop.GetCharFmt())
aTemplateBox.SelectEntry(aFmtDrop.GetCharFmt()->GetName());
// Controls enablen
aDropCapsBox.Check(aFmtDrop.GetLines() > 1);
const sal_uInt16 nVal = sal_uInt16(aDropCapsField.GetValue());
if (bFormat)
aTextEdit.SetText(GetDefaultString(nVal));
else
{
aTextEdit.SetText(rSh.GetDropTxt(nVal));
aTextEdit.Enable();
aTextText.Enable();
}
// Preview
pPict->SetValues( aTextEdit.GetText(),
sal_uInt8( aLinesField.GetValue() ),
sal_uInt16( aDistanceField.Denormalize( aDistanceField.GetValue( FUNIT_TWIP ) ) ) );
ClickHdl(&aDropCapsBox);
bModified = sal_False;
}
/****************************************************************************
Page: Click-Handler der CheckBox
****************************************************************************/
IMPL_LINK( SwDropCapsPage, ClickHdl, Button *, EMPTYARG )
{
sal_Bool bChecked = aDropCapsBox.IsChecked();
aWholeWordCB .Enable( bChecked && !bHtmlMode );
aSwitchText.Enable( bChecked && !aWholeWordCB.IsChecked() );
aDropCapsField.Enable( bChecked && !aWholeWordCB.IsChecked() );
aLinesText .Enable( bChecked );
aLinesField .Enable( bChecked );
aDistanceText.Enable( bChecked );
aDistanceField.Enable( bChecked );
aTemplateText .Enable( bChecked );
aTemplateBox .Enable( bChecked );
aTextEdit .Enable( bChecked && !bFormat );
aTextText .Enable( bChecked && !bFormat );
if ( bChecked )
{
ModifyHdl(&aDropCapsField);
aDropCapsField.GrabFocus();
}
else
pPict->SetText(aEmptyStr);
bModified = sal_True;
return 0;
}
/****************************************************************************
Page: Click-Handler der CheckBox
****************************************************************************/
IMPL_LINK( SwDropCapsPage, WholeWordHdl, CheckBox *, EMPTYARG )
{
aDropCapsField.Enable( !aWholeWordCB.IsChecked() );
ModifyHdl(&aDropCapsField);
bModified = sal_True;
return 0;
}
/****************************************************************************
Page: Modify-Handler der SpinFields
****************************************************************************/
IMPL_LINK( SwDropCapsPage, ModifyHdl, Edit *, pEdit )
{
String sPreview;
// Ggf. Text setzen
if (pEdit == &aDropCapsField)
{
sal_uInt16 nVal;
sal_Bool bSetText = sal_False;
if (!aWholeWordCB.IsChecked())
nVal = (sal_uInt16)aDropCapsField.GetValue();
else
nVal = 0;
if (bFormat || !rSh.GetDropTxt(1).Len())
sPreview = GetDefaultString(nVal);
else
{
bSetText = sal_True;
sPreview = rSh.GetDropTxt(nVal);
}
String sEdit(aTextEdit.GetText());
if (sEdit.Len() && sPreview.CompareTo(sEdit, sEdit.Len()) != COMPARE_EQUAL)
{
sPreview = sEdit.Copy(0, sPreview.Len());
bSetText = sal_False;
}
if (bSetText)
aTextEdit.SetText(sPreview);
}
else if (pEdit == &aTextEdit) // Ggf. Anzahl setzen
{
sal_uInt16 nTmp = aTextEdit.GetText().Len();
aDropCapsField.SetValue(Max((sal_uInt16)1, nTmp));
sPreview = aTextEdit.GetText().Copy(0, nTmp);
}
// Bild anpassen
if (pEdit == &aDropCapsField || pEdit == &aTextEdit)
pPict->SetText (sPreview);
else if (pEdit == &aLinesField)
pPict->SetLines((sal_uInt8)aLinesField.GetValue());
else
pPict->SetDistance((sal_uInt16)aDistanceField.Denormalize(aDistanceField.GetValue(FUNIT_TWIP)));
bModified = sal_True;
return 0;
}
/****************************************************************************
Page: Select-Handler der Template-Box.
*****************************************************************************/
IMPL_LINK_INLINE_START( SwDropCapsPage, SelectHdl, ListBox *, EMPTYARG )
{
pPict->UpdatePaintSettings();
bModified = sal_True;
return 0;
}
IMPL_LINK_INLINE_END( SwDropCapsPage, SelectHdl, ListBox *, EMPTYARG )
sal_uInt16* SwDropCapsPage::GetRanges()
{
return aPageRg;
}
void SwDropCapsPage::FillSet( SfxItemSet &rSet )
{
if(bModified)
{
SwFmtDrop aFmt;
sal_Bool bOn = aDropCapsBox.IsChecked();
if(bOn)
{
// Anzahl, Zeilen, Abstand
aFmt.GetChars() = (sal_uInt8) aDropCapsField.GetValue();
aFmt.GetLines() = (sal_uInt8) aLinesField.GetValue();
aFmt.GetDistance() = (sal_uInt16) aDistanceField.Denormalize(aDistanceField.GetValue(FUNIT_TWIP));
aFmt.GetWholeWord() = aWholeWordCB.IsChecked();
// Vorlage
if (aTemplateBox.GetSelectEntryPos())
aFmt.SetCharFmt(rSh.GetCharStyle(aTemplateBox.GetSelectEntry()));
}
else
{
aFmt.GetChars() = 1;
aFmt.GetLines() = 1;
aFmt.GetDistance() = 0;
}
// Attribute setzen
const SfxPoolItem* pOldItem;
if(0 == (pOldItem = GetOldItem( rSet, FN_FORMAT_DROPCAPS )) ||
aFmt != *pOldItem )
rSet.Put(aFmt);
// Harte Textformatierung
// Bug 24974: In Gestalter/Vorlagenkatoplog macht das keinen Sinn!!
if( !bFormat && aDropCapsBox.IsChecked() )
{
String sText(aTextEdit.GetText());
if (!aWholeWordCB.IsChecked())
sText.Erase( static_cast< xub_StrLen >(aDropCapsField.GetValue()));
SfxStringItem aStr(FN_PARAM_1, sText);
rSet.Put( aStr );
}
}
}