summaryrefslogtreecommitdiff
path: root/sw/source/ui/chrdlg/drpcps.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/ui/chrdlg/drpcps.cxx')
-rw-r--r--sw/source/ui/chrdlg/drpcps.cxx894
1 files changed, 894 insertions, 0 deletions
diff --git a/sw/source/ui/chrdlg/drpcps.cxx b/sw/source/ui/chrdlg/drpcps.cxx
new file mode 100644
index 000000000000..8caf959195dd
--- /dev/null
+++ b/sw/source/ui/chrdlg/drpcps.cxx
@@ -0,0 +1,894 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 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 USHORT __FAR_DATA aPageRg[] = {
+ RES_PARATR_DROP, RES_PARATR_DROP,
+ 0
+};
+
+
+
+// class SwDropCapsPict *****************************************************
+
+class SwDropCapsPict : public Control
+{
+ String maText;
+ String maScriptText;
+ Color maBackColor;
+ Color maTextLineColor;
+ BYTE mnLines;
+ long mnTotLineH;
+ long mnLineH;
+ long mnTextH;
+ USHORT mnDistance;
+ sal_Int32 mnLeading;
+ Printer* mpPrinter;
+ 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, USHORT _nWhich );
+public:
+
+ SwDropCapsPict(Window *pParent, const ResId &rResId) :
+ Control(pParent, rResId), mpPrinter( NULL ), mbDelPrinter( FALSE ) {}
+ ~SwDropCapsPict();
+
+ void UpdatePaintSettings( void ); // also invalidates control!
+
+ inline void SetText( const String& rT );
+ inline void SetLines( BYTE nL );
+ inline void SetDistance( USHORT nD );
+ inline void SetValues( const String& rText, BYTE nLines, USHORT nDistance );
+
+ void DrawPrev( const Point& rPt );
+};
+
+inline void SwDropCapsPict::SetText( const String& rT )
+{
+ maText = rT;
+ UpdatePaintSettings();
+}
+
+inline void SwDropCapsPict::SetLines( BYTE nL )
+{
+ mnLines = nL;
+ UpdatePaintSettings();
+}
+
+inline void SwDropCapsPict::SetDistance( USHORT nD )
+{
+ mnDistance = nD;
+ UpdatePaintSettings();
+}
+
+inline void SwDropCapsPict::SetValues( const String& rText, BYTE nLines, USHORT 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(USHORT nChars)
+{
+ String aStr;
+ for (USHORT 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, USHORT _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(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(TRUE);
+ maCJKFont.SetTransparent(TRUE);
+ maCTLFont.SetTransparent(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 (USHORT 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)
+ ULONG lDistance = mnDistance;
+ USHORT nDistW = (USHORT) (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();
+ USHORT nScript;
+ USHORT nIdx = 0;
+ xub_StrLen nStart = 0;
+ xub_StrLen nEnd;
+ USHORT nCnt = maScriptChg.Count();
+
+ 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( TRUE );
+ mpPrinter->SetFont( aOldFont );
+}
+
+void SwDropCapsPict::CheckScript( void )
+{
+ if( maScriptText == maText )
+ return;
+
+ maScriptText = maText;
+ USHORT nCnt = maScriptChg.Count();
+ if( nCnt )
+ {
+ maScriptChg.Remove( 0, nCnt );
+ 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() )
+ {
+ USHORT nScript = xBreak->getScriptType( maText, 0 );
+ USHORT 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.Insert( nChg, nCnt );
+ maScriptType.Insert( nScript, nCnt );
+ maTextWidth.Insert( ULONG(0), nCnt++ );
+
+ if( nChg < maText.Len() )
+ nScript = xBreak->getScriptType( maText, nChg );
+ else
+ break;
+ } while( TRUE );
+ }
+}
+
+Size SwDropCapsPict::CalcTextSize( void )
+{
+ InitPrinter();
+
+ USHORT nScript;
+ USHORT nIdx = 0;
+ xub_StrLen nStart = 0;
+ xub_StrLen nEnd;
+ USHORT nCnt = maScriptChg.Count();
+ 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 );
+ 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( 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 = TRUE;
+ }
+}
+
+/****************************************************************************
+Dlg: Ctor
+****************************************************************************/
+
+
+SwDropCapsDlg::SwDropCapsDlg(Window *pParent, const SfxItemSet &rSet ) :
+
+ SfxSingleTabDialog(pParent, rSet, 0)
+
+{
+ SwDropCapsPage* pNewPage = (SwDropCapsPage*) SwDropCapsPage::Create(this, rSet);
+ pNewPage->SetFormat(FALSE);
+ SetTabPage(pNewPage);
+}
+
+/****************************************************************************
+Dlg: Dtor
+****************************************************************************/
+
+
+ SwDropCapsDlg::~SwDropCapsDlg()
+{
+}
+
+/****************************************************************************
+Page: Ctor
+****************************************************************************/
+
+
+SwDropCapsPage::SwDropCapsPage(Window *pParent, const SfxItemSet &rSet) :
+
+ SfxTabPage(pParent, SW_RES(TP_DROPCAPS), rSet),
+
+ 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)),
+ aSettingsFL (this, SW_RES(FL_SETTINGS)),
+
+ aTextText (this, SW_RES(TXT_TEXT )),
+ aTextEdit (this, SW_RES(EDT_TEXT )),
+ aTemplateText (this, SW_RES(TXT_TEMPLATE)),
+ aTemplateBox (this, SW_RES(BOX_TEMPLATE)),
+ aContentFL (this, SW_RES(FL_CONTENT )),
+
+ pPict (new SwDropCapsPict(this, SW_RES(CNT_PICT))),
+
+ bModified(FALSE),
+ bFormat(TRUE),
+ rSh(::GetActiveView()->GetWrtShell())
+{
+ FreeResource();
+ SetExchangeSupport();
+
+ USHORT nHtmlMode = ::GetHtmlMode((const SwDocShell*)SfxObjectShell::Current());
+ bHtmlMode = nHtmlMode & HTMLMODE_ON ? TRUE : 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
+****************************************************************************/
+
+
+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(), 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 USHORT nVal = USHORT(aDropCapsField.GetValue());
+ if (bFormat)
+ aTextEdit.SetText(GetDefaultString(nVal));
+ else
+ {
+ aTextEdit.SetText(rSh.GetDropTxt(nVal));
+ aTextEdit.Enable();
+ aTextText.Enable();
+ }
+
+ // Preview
+ pPict->SetValues( aTextEdit.GetText(),
+ BYTE( aLinesField.GetValue() ),
+ USHORT( aDistanceField.Denormalize( aDistanceField.GetValue( FUNIT_TWIP ) ) ) );
+
+ ClickHdl(&aDropCapsBox);
+ bModified = FALSE;
+}
+
+/****************************************************************************
+Page: Click-Handler der CheckBox
+****************************************************************************/
+
+
+IMPL_LINK( SwDropCapsPage, ClickHdl, Button *, EMPTYARG )
+{
+ 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 = TRUE;
+
+ return 0;
+}
+
+/****************************************************************************
+Page: Click-Handler der CheckBox
+****************************************************************************/
+
+
+IMPL_LINK( SwDropCapsPage, WholeWordHdl, CheckBox *, EMPTYARG )
+{
+ aDropCapsField.Enable( !aWholeWordCB.IsChecked() );
+
+ ModifyHdl(&aDropCapsField);
+
+ bModified = TRUE;
+
+ return 0;
+}
+
+/****************************************************************************
+Page: Modify-Handler der SpinFields
+****************************************************************************/
+
+
+IMPL_LINK( SwDropCapsPage, ModifyHdl, Edit *, pEdit )
+{
+ String sPreview;
+
+ // Ggf. Text setzen
+ if (pEdit == &aDropCapsField)
+ {
+ USHORT nVal;
+ BOOL bSetText = FALSE;
+
+ if (!aWholeWordCB.IsChecked())
+ nVal = (USHORT)aDropCapsField.GetValue();
+ else
+ nVal = 0;
+
+ if (bFormat || !rSh.GetDropTxt(1).Len())
+ sPreview = GetDefaultString(nVal);
+ else
+ {
+ bSetText = 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 = FALSE;
+ }
+
+ if (bSetText)
+ aTextEdit.SetText(sPreview);
+ }
+ else if (pEdit == &aTextEdit) // Ggf. Anzahl setzen
+ {
+ USHORT nTmp = aTextEdit.GetText().Len();
+ aDropCapsField.SetValue(Max((USHORT)1, nTmp));
+
+ sPreview = aTextEdit.GetText().Copy(0, nTmp);
+ }
+
+ // Bild anpassen
+ if (pEdit == &aDropCapsField || pEdit == &aTextEdit)
+ pPict->SetText (sPreview);
+ else if (pEdit == &aLinesField)
+ pPict->SetLines((BYTE)aLinesField.GetValue());
+ else
+ pPict->SetDistance((USHORT)aDistanceField.Denormalize(aDistanceField.GetValue(FUNIT_TWIP)));
+
+ bModified = TRUE;
+
+ return 0;
+}
+
+/****************************************************************************
+Page: Select-Handler der Template-Box.
+*****************************************************************************/
+
+
+IMPL_LINK_INLINE_START( SwDropCapsPage, SelectHdl, ListBox *, EMPTYARG )
+{
+ pPict->UpdatePaintSettings();
+ bModified = TRUE;
+ return 0;
+}
+IMPL_LINK_INLINE_END( SwDropCapsPage, SelectHdl, ListBox *, EMPTYARG )
+
+
+USHORT* SwDropCapsPage::GetRanges()
+{
+ return aPageRg;
+}
+
+
+void SwDropCapsPage::FillSet( SfxItemSet &rSet )
+{
+ if(bModified)
+ {
+ SwFmtDrop aFmt;
+
+ BOOL bOn = aDropCapsBox.IsChecked();
+ if(bOn)
+ {
+ // Anzahl, Zeilen, Abstand
+ aFmt.GetChars() = (BYTE) aDropCapsField.GetValue();
+ aFmt.GetLines() = (BYTE) aLinesField.GetValue();
+ aFmt.GetDistance() = (USHORT) 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 );
+ }
+ }
+}
+
+
+
+