blob: 4a7389d9111ad555f4040305d3fe9fe635b6479c [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
#ifndef _EDIT_HXX //autogen
#include <vcl/edit.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#include <vcl/svapp.hxx>
#include <svl/zforlist.hxx>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/i18n/XBreakIterator.hpp>
#include <comphelper/processfactory.hxx>
#include <svtools/scriptedtext.hxx>
#include <svtools/accessibilityoptions.hxx>
#include <svx/framelinkarray.hxx>
#include "swmodule.hxx"
#include "swtypes.hxx"
#ifndef _VIEW_HXX
#include "view.hxx"
#endif
#include "wrtsh.hxx"
#include "tblafmt.hxx"
#ifndef _TAUTOFMT_HXX
#include "tautofmt.hxx"
#endif
#include "shellres.hxx"
#ifndef _TAUTOFMT_HRC
#include "tautofmt.hrc"
#endif
using namespace com::sun::star;
#define FRAME_OFFSET 4
//========================================================================
class AutoFmtPreview : public Window
{
public:
AutoFmtPreview( Window* pParent, const ResId& rRes, SwWrtShell* pWrtShell );
~AutoFmtPreview();
void NotifyChange( const SwTableAutoFmt& rNewData );
protected:
virtual void Paint( const Rectangle& rRect );
private:
SwTableAutoFmt aCurData;
VirtualDevice aVD;
SvtScriptedTextHelper aScriptedText;
svx::frame::Array maArray; /// Implementation to draw the frame borders.
sal_Bool bFitWidth;
bool mbRTL;
Size aPrvSize;
long nLabelColWidth;
long nDataColWidth1;
long nDataColWidth2;
long nRowHeight;
const String aStrJan;
const String aStrFeb;
const String aStrMar;
const String aStrNorth;
const String aStrMid;
const String aStrSouth;
const String aStrSum;
SvNumberFormatter* pNumFmt;
uno::Reference< lang::XMultiServiceFactory > m_xMSF;
uno::Reference< i18n::XBreakIterator > m_xBreak;
//-------------------------------------------
void Init ();
void DoPaint ( const Rectangle& rRect );
void CalcCellArray ( sal_Bool bFitWidth );
void CalcLineMap ();
void PaintCells ();
sal_uInt8 GetFormatIndex( size_t nCol, size_t nRow ) const;
const SvxBoxItem& GetBoxItem( size_t nCol, size_t nRow ) const;
void DrawString( size_t nCol, size_t nRow );
void DrawStrings();
void DrawBackground();
void MakeFonts ( sal_uInt8 nIndex, Font& rFont, Font& rCJKFont, Font& rCTLFont );
String MakeNumberString( String cellString, sal_Bool bAddDec );
};
//========================================================================
class SwStringInputDlg : public ModalDialog
{
public:
SwStringInputDlg( Window* pParent,
const String& rTitle,
const String& rEditTitle,
const String& rDefault );
~SwStringInputDlg();
void GetInputString( String& rString ) const;
private:
Edit aEdInput; // Edit erhaelt so den Focus
FixedText aFtEditTitle;
OKButton aBtnOk;
CancelButton aBtnCancel;
};
SwStringInputDlg::SwStringInputDlg( Window* pParent,
const String& rTitle,
const String& rEditTitle,
const String& rDefault ) :
ModalDialog ( pParent, SW_RES( DLG_SWDLG_STRINPUT ) ),
//
aEdInput ( this, SW_RES( ED_INPUT ) ),
aFtEditTitle ( this, SW_RES( FT_LABEL ) ),
aBtnOk ( this, SW_RES( BTN_OK ) ),
aBtnCancel ( this, SW_RES( BTN_CANCEL ) )
{
SetText( rTitle );
aFtEditTitle.SetText( rEditTitle );
aEdInput.SetText( rDefault );
//-------------
FreeResource();
}
//------------------------------------------------------------------------
void SwStringInputDlg::GetInputString( String& rString ) const
{
rString = aEdInput.GetText();
}
__EXPORT SwStringInputDlg::~SwStringInputDlg()
{
}
//========================================================================
// AutoFormat-Dialog:
SwAutoFormatDlg::SwAutoFormatDlg( Window* pParent, SwWrtShell* pWrtShell,
sal_Bool bSetAutoFormat, const SwTableAutoFmt* pSelFmt )
: SfxModalDialog( pParent, SW_RES( DLG_AUTOFMT_TABLE ) ),
//
aFlFormat ( this, SW_RES( FL_FORMAT ) ),
aLbFormat ( this, SW_RES( LB_FORMAT ) ),
aFlFormats ( this, SW_RES( FL_FORMATS ) ),
aBtnNumFormat ( this, SW_RES( BTN_NUMFORMAT ) ),
aBtnBorder ( this, SW_RES( BTN_BORDER ) ),
aBtnFont ( this, SW_RES( BTN_FONT ) ),
aBtnPattern ( this, SW_RES( BTN_PATTERN ) ),
aBtnAlignment ( this, SW_RES( BTN_ALIGNMENT ) ),
aBtnOk ( this, SW_RES( BTN_OK ) ),
aBtnCancel ( this, SW_RES( BTN_CANCEL ) ),
aBtnHelp ( this, SW_RES( BTN_HELP ) ),
aBtnAdd ( this, SW_RES( BTN_ADD ) ),
aBtnRemove ( this, SW_RES( BTN_REMOVE ) ),
aBtnRename ( this, SW_RES( BTN_RENAME ) ),
aBtnMore ( this, SW_RES( BTN_MORE ) ),
aStrTitle ( SW_RES( STR_ADD_TITLE ) ),
aStrLabel ( SW_RES( STR_ADD_LABEL ) ),
aStrClose ( SW_RES( STR_BTN_CLOSE ) ),
aStrDelTitle ( SW_RES( STR_DEL_TITLE ) ),
aStrDelMsg ( SW_RES( STR_DEL_MSG ) ),
aStrRenameTitle ( SW_RES( STR_RENAME_TITLE ) ),
aStrInvalidFmt ( SW_RES( STR_INVALID_AFNAME )),
pWndPreview ( new AutoFmtPreview( this, SW_RES( WND_PREVIEW ), pWrtShell )),
//
pShell ( pWrtShell ),
nIndex ( 0 ),
nDfltStylePos ( 0 ),
bCoreDataChanged( sal_False ),
bSetAutoFmt ( bSetAutoFormat )
{
pTableTbl = new SwTableAutoFmtTbl;
pTableTbl->Load();
Init( pSelFmt );
//------------- >
FreeResource();
}
//------------------------------------------------------------------------
__EXPORT SwAutoFormatDlg::~SwAutoFormatDlg()
{
delete pWndPreview;
if( bCoreDataChanged )
pTableTbl->Save();
delete pTableTbl;
}
//------------------------------------------------------------------------
void SwAutoFormatDlg::Init( const SwTableAutoFmt* pSelFmt )
{
Link aLk( LINK( this, SwAutoFormatDlg, CheckHdl ) );
aBtnBorder.SetClickHdl( aLk );
aBtnFont.SetClickHdl( aLk );
aBtnPattern.SetClickHdl( aLk );
aBtnAlignment.SetClickHdl( aLk );
aBtnNumFormat.SetClickHdl( aLk );
aBtnAdd.SetClickHdl ( LINK( this, SwAutoFormatDlg, AddHdl ) );
aBtnRemove.SetClickHdl ( LINK( this, SwAutoFormatDlg, RemoveHdl ) );
aBtnRename.SetClickHdl ( LINK( this, SwAutoFormatDlg, RenameHdl ) );
aBtnOk.SetClickHdl ( LINK( this, SwAutoFormatDlg, OkHdl ) );
aLbFormat.SetSelectHdl( LINK( this, SwAutoFormatDlg, SelFmtHdl ) );
aBtnMore.AddWindow( &aBtnNumFormat );
aBtnMore.AddWindow( &aBtnBorder );
aBtnMore.AddWindow( &aBtnFont );
aBtnMore.AddWindow( &aBtnPattern );
aBtnMore.AddWindow( &aBtnAlignment );
aBtnMore.AddWindow( &aFlFormats );
aBtnMore.AddWindow( &aBtnRename );
aBtnAdd.Enable( bSetAutoFmt );
nIndex = 0;
if( !bSetAutoFmt )
{
// dann muss die Liste um den Eintrag <Keins> erweitert werden.
aLbFormat.InsertEntry( ViewShell::GetShellRes()->aStrNone );
nDfltStylePos = 1;
nIndex = 255;
}
for( sal_uInt8 i = 0, nCount = (sal_uInt8)pTableTbl->Count(); i < nCount; i++ )
{
SwTableAutoFmt* pFmt = (*pTableTbl)[ i ];
aLbFormat.InsertEntry( pFmt->GetName() );
if( pSelFmt && pFmt->GetName() == pSelFmt->GetName() )
nIndex = i;
}
aLbFormat.SelectEntryPos( 255 != nIndex ? (nDfltStylePos + nIndex) : 0 );
SelFmtHdl( 0 );
}
//------------------------------------------------------------------------
void SwAutoFormatDlg::UpdateChecks( const SwTableAutoFmt& rFmt, sal_Bool bEnable )
{
aBtnNumFormat.Enable( bEnable );
aBtnNumFormat.Check( rFmt.IsValueFormat() );
aBtnBorder.Enable( bEnable );
aBtnBorder.Check( rFmt.IsFrame() );
aBtnFont.Enable( bEnable );
aBtnFont.Check( rFmt.IsFont() );
aBtnPattern.Enable( bEnable );
aBtnPattern.Check( rFmt.IsBackground() );
aBtnAlignment.Enable( bEnable );
aBtnAlignment.Check( rFmt.IsJustify() );
}
void SwAutoFormatDlg::FillAutoFmtOfIndex( SwTableAutoFmt*& rToFill ) const
{
if( 255 != nIndex )
{
if( rToFill )
*rToFill = *(*pTableTbl)[ nIndex ];
else
rToFill = new SwTableAutoFmt( *(*pTableTbl)[ nIndex ] );
}
else if( rToFill )
delete rToFill, rToFill = 0;
}
/*------------------------------------------------------------------------
Handler:
---------*/
IMPL_LINK( SwAutoFormatDlg, CheckHdl, Button *, pBtn )
{
SwTableAutoFmtPtr pData = (*pTableTbl)[nIndex];
sal_Bool bCheck = ((CheckBox*)pBtn)->IsChecked(), bDataChgd = sal_True;
if( pBtn == &aBtnNumFormat )
pData->SetValueFormat( bCheck );
else if ( pBtn == &aBtnBorder )
pData->SetFrame( bCheck );
else if ( pBtn == &aBtnFont )
pData->SetFont( bCheck );
else if ( pBtn == &aBtnPattern )
pData->SetBackground( bCheck );
else if ( pBtn == &aBtnAlignment )
pData->SetJustify( bCheck );
// else if ( pBtn == &aBtnAdjust )
// pData->SetIncludeWidthHeight( bCheck );
else
bDataChgd = sal_False;
if( bDataChgd )
{
if( !bCoreDataChanged )
{
aBtnCancel.SetText( aStrClose );
bCoreDataChanged = sal_True;
}
pWndPreview->NotifyChange( *pData );
}
return 0;
}
/*------------------------------------------------------------------------*/
IMPL_LINK( SwAutoFormatDlg, AddHdl, void *, EMPTYARG )
{
sal_Bool bOk = sal_False, bFmtInserted = sal_False;
while( !bOk )
{
SwStringInputDlg* pDlg = new SwStringInputDlg( this,
aStrTitle,
aStrLabel,
aEmptyStr );
if( RET_OK == pDlg->Execute() )
{
String aFormatName;
pDlg->GetInputString( aFormatName );
if( aFormatName.Len() > 0 )
{
sal_uInt16 n;
for( n = 0; n < pTableTbl->Count(); ++n )
if( (*pTableTbl)[n]->GetName() == aFormatName )
break;
if( n >= pTableTbl->Count() )
{
// Format mit dem Namen noch nicht vorhanden, also
// aufnehmen
SwTableAutoFmtPtr pNewData = new
SwTableAutoFmt( aFormatName );
pShell->GetTableAutoFmt( *pNewData );
// Sortiert einfuegen!!
for( n = 1; n < pTableTbl->Count(); ++n )
if( (*pTableTbl)[ n ]->GetName() > aFormatName )
break;
pTableTbl->Insert( pNewData, n );
aLbFormat.InsertEntry( aFormatName, nDfltStylePos + n );
aLbFormat.SelectEntryPos( nDfltStylePos + n );
bFmtInserted = sal_True;
aBtnAdd.Enable( sal_False );
if ( !bCoreDataChanged )
{
aBtnCancel.SetText( aStrClose );
bCoreDataChanged = sal_True;
}
SelFmtHdl( 0 );
bOk = sal_True;
}
}
if( !bFmtInserted )
{
bOk = RET_CANCEL == ErrorBox( this,
WinBits( WB_OK_CANCEL | WB_DEF_OK),
aStrInvalidFmt
).Execute();
}
}
else
bOk = sal_True;
delete pDlg;
}
return 0;
}
//------------------------------------------------------------------------
IMPL_LINK( SwAutoFormatDlg, RemoveHdl, void *, EMPTYARG )
{
String aMessage = aStrDelMsg ;
aMessage.AppendAscii("\n\n");
aMessage += aLbFormat.GetSelectEntry() ;
aMessage += '\n';
MessBox* pBox = new MessBox( this, WinBits( WB_OK_CANCEL ),
aStrDelTitle, aMessage);
if ( pBox->Execute() == RET_OK )
{
aLbFormat.RemoveEntry( nDfltStylePos + nIndex );
aLbFormat.SelectEntryPos( nDfltStylePos + nIndex-1 );
pTableTbl->DeleteAndDestroy( nIndex );
nIndex--;
if( !nIndex )
{
aBtnRemove.Enable(sal_False);
aBtnRename.Enable(sal_False);
}
if( !bCoreDataChanged )
{
aBtnCancel.SetText( aStrClose );
bCoreDataChanged = sal_True;
}
}
delete pBox;
SelFmtHdl( 0 );
return 0;
}
IMPL_LINK( SwAutoFormatDlg, RenameHdl, void *, EMPTYARG )
{
sal_Bool bOk = sal_False;
while( !bOk )
{
SwStringInputDlg* pDlg = new SwStringInputDlg( this,
aStrRenameTitle, aLbFormat.GetSelectEntry(),
aEmptyStr );
if( pDlg->Execute() == RET_OK )
{
sal_Bool bFmtRenamed = sal_False;
String aFormatName;
pDlg->GetInputString( aFormatName );
if ( aFormatName.Len() > 0 )
{
sal_uInt16 n;
for( n = 0; n < pTableTbl->Count(); ++n )
if ((*pTableTbl)[n]->GetName() == aFormatName)
break;
if( n >= pTableTbl->Count() )
{
// Format mit dem Namen noch nicht vorhanden, also
// umbenennen
aLbFormat.RemoveEntry( nDfltStylePos + nIndex );
SwTableAutoFmtPtr p = (*pTableTbl)[ nIndex ];
pTableTbl->Remove( nIndex );
p->SetName( aFormatName );
// Sortiert einfuegen!!
for( n = 1; n < pTableTbl->Count(); ++n )
if( (*pTableTbl)[ n ]->GetName() > aFormatName )
break;
pTableTbl->Insert( p, n );
aLbFormat.InsertEntry( aFormatName, nDfltStylePos + n );
aLbFormat.SelectEntryPos( nDfltStylePos + n );
if ( !bCoreDataChanged )
{
aBtnCancel.SetText( aStrClose );
bCoreDataChanged = sal_True;
}
SelFmtHdl( 0 );
bOk = sal_True;
bFmtRenamed = sal_True;
}
}
if( !bFmtRenamed )
{
bOk = RET_CANCEL == ErrorBox( this,
WinBits( WB_OK_CANCEL | WB_DEF_OK),
aStrInvalidFmt
).Execute();
}
}
else
bOk = sal_True;
delete pDlg;
}
return 0;
}
//------------------------------------------------------------------------
IMPL_LINK( SwAutoFormatDlg, SelFmtHdl, void *, EMPTYARG )
{
sal_Bool bBtnEnable = sal_False;
sal_uInt8 nSelPos = (sal_uInt8) aLbFormat.GetSelectEntryPos(), nOldIdx = nIndex;
if( nSelPos >= nDfltStylePos )
{
nIndex = nSelPos - nDfltStylePos;
pWndPreview->NotifyChange( *(*pTableTbl)[nIndex] );
bBtnEnable = 0 != nIndex;
UpdateChecks( *(*pTableTbl)[nIndex], sal_True );
}
else
{
nIndex = 255;
SwTableAutoFmt aTmp( ViewShell::GetShellRes()->aStrNone );
aTmp.SetFont( sal_False );
aTmp.SetJustify( sal_False );
aTmp.SetFrame( sal_False );
aTmp.SetBackground( sal_False );
aTmp.SetValueFormat( sal_False );
aTmp.SetWidthHeight( sal_False );
if( nOldIdx != nIndex )
pWndPreview->NotifyChange( aTmp );
UpdateChecks( aTmp, sal_False );
}
aBtnRemove.Enable( bBtnEnable );
aBtnRename.Enable( bBtnEnable );
return 0;
}
//------------------------------------------------------------------------
IMPL_LINK_INLINE_START( SwAutoFormatDlg, OkHdl, Button *, EMPTYARG )
{
if( bSetAutoFmt )
pShell->SetTableAutoFmt( *(*pTableTbl)[ nIndex ] );
EndDialog( RET_OK );
return sal_True;
}
IMPL_LINK_INLINE_END( SwAutoFormatDlg, OkHdl, Button *, EMPTYARG )
//========================================================================
// AutoFmtPreview
//------------------------------------------------------------------------
AutoFmtPreview::AutoFmtPreview( Window* pParent, const ResId& rRes, SwWrtShell* pWrtShell ) :
Window ( pParent, rRes ),
aCurData ( aEmptyStr ),
aVD ( *this ),
aScriptedText ( aVD ),
bFitWidth ( sal_False ),
mbRTL ( false ),
aPrvSize ( GetSizePixel().Width() - 6, GetSizePixel().Height() - 30 ),
nLabelColWidth ( (aPrvSize.Width() - 4) / 4 - 12 ),
nDataColWidth1 ( (aPrvSize.Width() - 4 - 2 * nLabelColWidth) / 3 ),
nDataColWidth2 ( (aPrvSize.Width() - 4 - 2 * nLabelColWidth) / 4 ),
nRowHeight ( (aPrvSize.Height() - 4) / 5 ),
aStrJan ( SW_RES( STR_JAN ) ),
aStrFeb ( SW_RES( STR_FEB ) ),
aStrMar ( SW_RES( STR_MAR ) ),
aStrNorth ( SW_RES( STR_NORTH ) ),
aStrMid ( SW_RES( STR_MID ) ),
aStrSouth ( SW_RES( STR_SOUTH ) ),
aStrSum ( SW_RES( STR_SUM ) ),
m_xMSF ( comphelper::getProcessServiceFactory() )
{
if (!pWrtShell->IsCrsrInTbl()) // We haven't created the table yet
mbRTL = Application::GetSettings().GetLayoutRTL();
else
mbRTL = pWrtShell->IsTableRightToLeft();
DBG_ASSERT( m_xMSF.is(), "AutoFmtPreview: no MultiServiceFactory");
if ( m_xMSF.is() )
{
m_xBreak = uno::Reference< i18n::XBreakIterator >(
m_xMSF->createInstance (
rtl::OUString::createFromAscii( "com.sun.star.i18n.BreakIterator" ) ),
uno::UNO_QUERY);
}
pNumFmt = new SvNumberFormatter( m_xMSF, LANGUAGE_SYSTEM );
Init();
}
//------------------------------------------------------------------------
__EXPORT AutoFmtPreview::~AutoFmtPreview()
{
delete pNumFmt;
}
//------------------------------------------------------------------------
static void lcl_SetFontProperties(
Font& rFont,
const SvxFontItem& rFontItem,
const SvxWeightItem& rWeightItem,
const SvxPostureItem& rPostureItem )
{
rFont.SetFamily ( rFontItem.GetFamily() );
rFont.SetName ( rFontItem.GetFamilyName() );
rFont.SetStyleName ( rFontItem.GetStyleName() );
rFont.SetCharSet ( rFontItem.GetCharSet() );
rFont.SetPitch ( rFontItem.GetPitch() );
rFont.SetWeight ( (FontWeight)rWeightItem.GetValue() );
rFont.SetItalic ( (FontItalic)rPostureItem.GetValue() );
}
#define SETONALLFONTS( MethodName, Value ) \
rFont.MethodName( Value ); \
rCJKFont.MethodName( Value ); \
rCTLFont.MethodName( Value );
void AutoFmtPreview::MakeFonts( sal_uInt8 nIndex, Font& rFont, Font& rCJKFont, Font& rCTLFont )
{
const SwBoxAutoFmt& rBoxFmt = aCurData.GetBoxFmt( nIndex );
rFont = rCJKFont = rCTLFont = GetFont();
Size aFontSize( rFont.GetSize().Width(), 10 );
lcl_SetFontProperties( rFont, rBoxFmt.GetFont(), rBoxFmt.GetWeight(), rBoxFmt.GetPosture() );
lcl_SetFontProperties( rCJKFont, rBoxFmt.GetCJKFont(), rBoxFmt.GetCJKWeight(), rBoxFmt.GetCJKPosture() );
lcl_SetFontProperties( rCTLFont, rBoxFmt.GetCTLFont(), rBoxFmt.GetCTLWeight(), rBoxFmt.GetCTLPosture() );
SETONALLFONTS( SetUnderline, (FontUnderline)rBoxFmt.GetUnderline().GetValue() );
SETONALLFONTS( SetOverline, (FontUnderline)rBoxFmt.GetOverline().GetValue() );
SETONALLFONTS( SetStrikeout, (FontStrikeout)rBoxFmt.GetCrossedOut().GetValue() );
SETONALLFONTS( SetOutline, rBoxFmt.GetContour().GetValue() );
SETONALLFONTS( SetShadow, rBoxFmt.GetShadowed().GetValue() );
SETONALLFONTS( SetColor, rBoxFmt.GetColor().GetValue() );
SETONALLFONTS( SetSize, aFontSize );
SETONALLFONTS( SetTransparent, sal_True );
}
//------------------------------------------------------------------------
sal_uInt8 AutoFmtPreview::GetFormatIndex( size_t nCol, size_t nRow ) const
{
static const sal_uInt8 pnFmtMap[] =
{
0, 1, 2, 1, 3,
4, 5, 6, 5, 7,
8, 9, 10, 9, 11,
4, 5, 6, 5, 7,
12, 13, 14, 13, 15
};
return pnFmtMap[ maArray.GetCellIndex( nCol, nRow, mbRTL ) ];
}
const SvxBoxItem& AutoFmtPreview::GetBoxItem( size_t nCol, size_t nRow ) const
{
return aCurData.GetBoxFmt( GetFormatIndex( nCol, nRow ) ).GetBox();
}
//------------------------------------------------------------------------
void AutoFmtPreview::DrawString( size_t nCol, size_t nRow )
{
//------------------------
// Ausgabe des Zelltextes:
//------------------------
sal_uLong nNum;
double nVal;
String cellString;
sal_uInt8 nIndex = static_cast< sal_uInt8 >( maArray.GetCellIndex( nCol, nRow, mbRTL ) );
switch( nIndex )
{
case 1: cellString = aStrJan; break;
case 2: cellString = aStrFeb; break;
case 3: cellString = aStrMar; break;
case 5: cellString = aStrNorth; break;
case 10: cellString = aStrMid; break;
case 15: cellString = aStrSouth; break;
case 4:
case 20: cellString = aStrSum; break;
case 6:
case 8:
case 16:
case 18: nVal = nIndex;
nNum = 5;
goto MAKENUMSTR;
case 17:
case 7: nVal = nIndex;
nNum = 6;
goto MAKENUMSTR;
case 11:
case 12:
case 13: nVal = nIndex;
nNum = 12 == nIndex ? 10 : 9;
goto MAKENUMSTR;
case 9: nVal = 21; nNum = 7; goto MAKENUMSTR;
case 14: nVal = 36; nNum = 11; goto MAKENUMSTR;
case 19: nVal = 51; nNum = 7; goto MAKENUMSTR;
case 21: nVal = 33; nNum = 13; goto MAKENUMSTR;
case 22: nVal = 36; nNum = 14; goto MAKENUMSTR;
case 23: nVal = 39; nNum = 13; goto MAKENUMSTR;
case 24: nVal = 108; nNum = 15; goto MAKENUMSTR;
MAKENUMSTR:
if( aCurData.IsValueFormat() )
{
String sFmt; LanguageType eLng, eSys;
aCurData.GetBoxFmt( (sal_uInt8)nNum ).GetValueFormat( sFmt, eLng, eSys );
short nType;
sal_Bool bNew;
xub_StrLen nCheckPos;
sal_uInt32 nKey = pNumFmt->GetIndexPuttingAndConverting( sFmt, eLng,
eSys, nType, bNew, nCheckPos);
Color* pDummy;
pNumFmt->GetOutputString( nVal, nKey, cellString, &pDummy );
}
else
cellString = String::CreateFromInt32((sal_Int32)nVal);
break;
}
if( cellString.Len() )
{
Size aStrSize;
sal_uInt8 nFmtIndex = GetFormatIndex( nCol, nRow );
Rectangle cellRect = maArray.GetCellRect( nCol, nRow );
Point aPos = cellRect.TopLeft();
sal_uInt16 nRightX = 0;
// sal_Bool bJustify = aCurData.IsJustify();
// ScHorJustifyAttr aHorJustifyItem;
// CellHorJustify eJustification;
Size theMaxStrSize( cellRect.GetWidth() - FRAME_OFFSET,
cellRect.GetHeight() - FRAME_OFFSET );
if( aCurData.IsFont() )
{
Font aFont, aCJKFont, aCTLFont;
MakeFonts( nFmtIndex, aFont, aCJKFont, aCTLFont );
aScriptedText.SetFonts( &aFont, &aCJKFont, &aCTLFont );
}
else
aScriptedText.SetDefaultFont();
aScriptedText.SetText( cellString, m_xBreak );
aStrSize = aScriptedText.GetTextSize();
if( aCurData.IsFont() &&
theMaxStrSize.Height() < aStrSize.Height() )
{
// wenn der String in diesem Font nicht
// in die Zelle passt, wird wieder der
// Standard-Font genommen:
aScriptedText.SetDefaultFont();
aStrSize = aScriptedText.GetTextSize();
}
while( theMaxStrSize.Width() <= aStrSize.Width() &&
cellString.Len() > 1 )
{
// if( eJustification == SVX_HOR_JUSTIFY_RIGHT )
// cellString.Erase( 0, 1 );
// else
cellString.Erase( cellString.Len() - 1 );
aScriptedText.SetText( cellString, m_xBreak );
aStrSize = aScriptedText.GetTextSize();
}
nRightX = (sal_uInt16)( cellRect.GetWidth()
- aStrSize.Width()
- FRAME_OFFSET );
//-------------
// Ausrichtung:
//-------------
/* if ( bJustify )
{
aCurData.GetHorJustify( nFmtIndex, aHorJustifyItem );
eJustification = (CellHorJustify)aHorJustifyItem.GetValue();
}
else
{
eJustification = SC_HOR_JUSTIFY_STANDARD;
}*/
//-----------------------------
// vertikal (immer zentrieren):
//-----------------------------
aPos.Y() += (nRowHeight - (sal_uInt16)aStrSize.Height()) / 2;
//-----------
// horizontal
//-----------
/* if ( eJustification != SC_HOR_JUSTIFY_STANDARD )*/
if( mbRTL )
aPos.X() += nRightX;
else if (aCurData.IsJustify())
{
sal_uInt16 nHorPos = (sal_uInt16)
((cellRect.GetWidth()-aStrSize.Width())/2);
const SvxAdjustItem& rAdj = aCurData.GetBoxFmt(nFmtIndex).GetAdjust();
switch ( rAdj.GetAdjust() )
{
case SVX_ADJUST_LEFT:
aPos.X() += FRAME_OFFSET;
break;
case SVX_ADJUST_RIGHT:
aPos.X() += nRightX;
break;
default:
aPos.X() += nHorPos;
break;
}
}
else
{
//---------------------
// Standardausrichtung:
//---------------------
if ( (nCol == 0) || (nIndex == 4) )
{
// Text-Label links oder Summe linksbuendig
aPos.X() += FRAME_OFFSET;
}
else
{
// Zahlen/Datum rechtsbuendig
aPos.X() += nRightX;
}
}
//-------------------------------
aScriptedText.DrawText( aPos );
//-------------------------------
}
}
#undef FRAME_OFFSET
//------------------------------------------------------------------------
void AutoFmtPreview::DrawStrings()
{
for( size_t nRow = 0; nRow < 5; ++nRow )
for( size_t nCol = 0; nCol < 5; ++nCol )
DrawString( nCol, nRow );
}
//------------------------------------------------------------------------
void AutoFmtPreview::DrawBackground()
{
for( size_t nRow = 0; nRow < 5; ++nRow )
{
for( size_t nCol = 0; nCol < 5; ++nCol )
{
SvxBrushItem aBrushItem( aCurData.GetBoxFmt( GetFormatIndex( nCol, nRow ) ).GetBackground() );
aVD.Push( PUSH_LINECOLOR | PUSH_FILLCOLOR );
aVD.SetLineColor();
aVD.SetFillColor( aBrushItem.GetColor() );
aVD.DrawRect( maArray.GetCellRect( nCol, nRow ) );
aVD.Pop();
}
}
}
//------------------------------------------------------------------------
void AutoFmtPreview::PaintCells()
{
// 1) background
if ( aCurData.IsBackground() )
DrawBackground();
// 2) values
DrawStrings();
// 3) border
if ( aCurData.IsFrame() )
maArray.DrawArray( aVD );
}
//------------------------------------------------------------------------
void __EXPORT AutoFmtPreview::Init()
{
SetBorderStyle( GetBorderStyle() | WINDOW_BORDER_MONO );
maArray.Initialize( 5, 5 );
maArray.SetUseDiagDoubleClipping( false );
CalcCellArray( sal_False );
CalcLineMap();
}
//------------------------------------------------------------------------
void AutoFmtPreview::CalcCellArray( sal_Bool _bFitWidth )
{
maArray.SetXOffset( 2 );
maArray.SetAllColWidths( _bFitWidth ? nDataColWidth2 : nDataColWidth1 );
maArray.SetColWidth( 0, nLabelColWidth );
maArray.SetColWidth( 4, nLabelColWidth );
maArray.SetYOffset( 2 );
maArray.SetAllRowHeights( nRowHeight );
aPrvSize.Width() = maArray.GetWidth() + 4;
aPrvSize.Height() = maArray.GetHeight() + 4;
}
//------------------------------------------------------------------------
inline void lclSetStyleFromBorder( svx::frame::Style& rStyle, const SvxBorderLine* pBorder )
{
rStyle.Set( pBorder, 0.05, 5 );
}
void AutoFmtPreview::CalcLineMap()
{
for( size_t nRow = 0; nRow < 5; ++nRow )
{
for( size_t nCol = 0; nCol < 5; ++nCol )
{
svx::frame::Style aStyle;
const SvxBoxItem& rItem = GetBoxItem( nCol, nRow );
lclSetStyleFromBorder( aStyle, rItem.GetLeft() );
maArray.SetCellStyleLeft( nCol, nRow, aStyle );
lclSetStyleFromBorder( aStyle, rItem.GetRight() );
maArray.SetCellStyleRight( nCol, nRow, aStyle );
lclSetStyleFromBorder( aStyle, rItem.GetTop() );
maArray.SetCellStyleTop( nCol, nRow, aStyle );
lclSetStyleFromBorder( aStyle, rItem.GetBottom() );
maArray.SetCellStyleBottom( nCol, nRow, aStyle );
// FIXME - uncomment to draw diagonal borders
// lclSetStyleFromBorder( aStyle, GetDiagItem( nCol, nRow, true ).GetLine() );
// maArray.SetCellStyleTLBR( nCol, nRow, aStyle );
// lclSetStyleFromBorder( aStyle, GetDiagItem( nCol, nRow, false ).GetLine() );
// maArray.SetCellStyleBLTR( nCol, nRow, aStyle );
}
}
}
//------------------------------------------------------------------------
void AutoFmtPreview::NotifyChange( const SwTableAutoFmt& rNewData )
{
aCurData = rNewData;
bFitWidth = aCurData.IsJustify();//sal_True; //???
CalcCellArray( bFitWidth );
CalcLineMap();
DoPaint( Rectangle( Point(0,0), GetSizePixel() ) );
}
//------------------------------------------------------------------------
void AutoFmtPreview::DoPaint( const Rectangle& /*rRect*/ )
{
sal_uInt32 nOldDrawMode = aVD.GetDrawMode();
if( GetSettings().GetStyleSettings().GetHighContrastMode() &&
SW_MOD()->GetAccessibilityOptions().GetIsForBorders() )
aVD.SetDrawMode( DRAWMODE_SETTINGSLINE | DRAWMODE_SETTINGSFILL | DRAWMODE_SETTINGSTEXT | DRAWMODE_SETTINGSGRADIENT );
Bitmap thePreview;
Point aCenterPos;
Size theWndSize = GetSizePixel();
Size thePrevSize;
Color oldColor;
Font aFont;
aFont = aVD.GetFont();
aFont.SetTransparent( sal_True );
aVD.SetFont ( aFont );
aVD.SetLineColor ();
const Color& rWinColor = GetSettings().GetStyleSettings().GetWindowColor();
aVD.SetBackground ( Wallpaper(rWinColor) );
aVD.SetFillColor ( rWinColor );
aVD.SetOutputSizePixel ( aPrvSize );
//--------------------------------
// Zellen auf virtual Device malen
// und Ergebnis sichern
//--------------------------------
PaintCells();
thePreview = aVD.GetBitmap( Point(0,0), aPrvSize );
//--------------------------------------
// Rahmen malen und Vorschau zentrieren:
// (virtual Device fuer Fensterausgabe)
//--------------------------------------
aVD.SetOutputSizePixel( theWndSize );
oldColor = aVD.GetLineColor();
aVD.SetLineColor();
aVD.DrawRect( Rectangle( Point(0,0), theWndSize ) );
SetLineColor( oldColor );
aCenterPos = Point( (theWndSize.Width() - aPrvSize.Width() ) / 2,
(theWndSize.Height() - aPrvSize.Height()) / 2 );
aVD.DrawBitmap( aCenterPos, thePreview );
//----------------------------
// Ausgabe im Vorschaufenster:
//----------------------------
DrawBitmap( Point(0,0), aVD.GetBitmap( Point(0,0), theWndSize ) );
aVD.SetDrawMode( nOldDrawMode );
}
//------------------------------------------------------------------------
void __EXPORT AutoFmtPreview::Paint( const Rectangle& rRect )
{
DoPaint( rRect );
}