diff options
Diffstat (limited to 'sw/source/ui/table/tautofmt.cxx')
-rw-r--r-- | sw/source/ui/table/tautofmt.cxx | 1057 |
1 files changed, 1057 insertions, 0 deletions
diff --git a/sw/source/ui/table/tautofmt.cxx b/sw/source/ui/table/tautofmt.cxx new file mode 100644 index 000000000000..d097d5afeba5 --- /dev/null +++ b/sw/source/ui/table/tautofmt.cxx @@ -0,0 +1,1057 @@ +/************************************************************************* + * + * 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 + + + + +#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. + 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 ( BOOL bFitWidth ); + void CalcLineMap (); + void PaintCells (); + + BYTE 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 ( BYTE nIndex, Font& rFont, Font& rCJKFont, Font& rCTLFont ); + String MakeNumberString( String cellString, 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, + BOOL bSetAutoFormat, const SwTableAutoFmt* pSelFmt ) + : SfxModalDialog( pParent, SW_RES( DLG_AUTOFMT_TABLE ) ), + // + aFlFormat ( this, SW_RES( FL_FORMAT ) ), + aLbFormat ( this, SW_RES( LB_FORMAT ) ), + + 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 ) ), + aFlFormats ( this, SW_RES( FL_FORMATS ) ), + 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( 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( BYTE i = 0, nCount = (BYTE)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, 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]; + BOOL bCheck = ((CheckBox*)pBtn)->IsChecked(), bDataChgd = 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 = FALSE; + + if( bDataChgd ) + { + if( !bCoreDataChanged ) + { + aBtnCancel.SetText( aStrClose ); + bCoreDataChanged = TRUE; + } + + pWndPreview->NotifyChange( *pData ); + } + return 0; +} + +/*------------------------------------------------------------------------*/ + + +IMPL_LINK( SwAutoFormatDlg, AddHdl, void *, EMPTYARG ) +{ + BOOL bOk = FALSE, bFmtInserted = 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 ) + { + USHORT 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 = TRUE; + aBtnAdd.Enable( FALSE ); + if ( !bCoreDataChanged ) + { + aBtnCancel.SetText( aStrClose ); + bCoreDataChanged = TRUE; + } + + SelFmtHdl( 0 ); + bOk = TRUE; + } + } + + if( !bFmtInserted ) + { + bOk = RET_CANCEL == ErrorBox( this, + WinBits( WB_OK_CANCEL | WB_DEF_OK), + aStrInvalidFmt + ).Execute(); + } + } + else + bOk = 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(FALSE); + aBtnRename.Enable(FALSE); + } + + if( !bCoreDataChanged ) + { + aBtnCancel.SetText( aStrClose ); + bCoreDataChanged = TRUE; + } + } + delete pBox; + + SelFmtHdl( 0 ); + + return 0; +} + +IMPL_LINK( SwAutoFormatDlg, RenameHdl, void *, EMPTYARG ) +{ + BOOL bOk = FALSE; + while( !bOk ) + { + SwStringInputDlg* pDlg = new SwStringInputDlg( this, + aStrRenameTitle, aLbFormat.GetSelectEntry(), + aEmptyStr ); + if( pDlg->Execute() == RET_OK ) + { + BOOL bFmtRenamed = FALSE; + String aFormatName; + pDlg->GetInputString( aFormatName ); + + if ( aFormatName.Len() > 0 ) + { + USHORT 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 = TRUE; + } + + SelFmtHdl( 0 ); + bOk = TRUE; + bFmtRenamed = TRUE; + } + } + + if( !bFmtRenamed ) + { + bOk = RET_CANCEL == ErrorBox( this, + WinBits( WB_OK_CANCEL | WB_DEF_OK), + aStrInvalidFmt + ).Execute(); + } + } + else + bOk = TRUE; + delete pDlg; + } + return 0; +} + +//------------------------------------------------------------------------ + +IMPL_LINK( SwAutoFormatDlg, SelFmtHdl, void *, EMPTYARG ) +{ + BOOL bBtnEnable = FALSE; + BYTE nSelPos = (BYTE) aLbFormat.GetSelectEntryPos(), nOldIdx = nIndex; + if( nSelPos >= nDfltStylePos ) + { + nIndex = nSelPos - nDfltStylePos; + pWndPreview->NotifyChange( *(*pTableTbl)[nIndex] ); + bBtnEnable = 0 != nIndex; + UpdateChecks( *(*pTableTbl)[nIndex], TRUE ); + } + else + { + nIndex = 255; + + SwTableAutoFmt aTmp( ViewShell::GetShellRes()->aStrNone ); + aTmp.SetFont( FALSE ); + aTmp.SetJustify( FALSE ); + aTmp.SetFrame( FALSE ); + aTmp.SetBackground( FALSE ); + aTmp.SetValueFormat( FALSE ); + aTmp.SetWidthHeight( FALSE ); + + if( nOldIdx != nIndex ) + pWndPreview->NotifyChange( aTmp ); + UpdateChecks( aTmp, 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 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 ( 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( BYTE 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, TRUE ); +} + +//------------------------------------------------------------------------ + +BYTE AutoFmtPreview::GetFormatIndex( size_t nCol, size_t nRow ) const +{ + static const BYTE 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: + //------------------------ + ULONG nNum; + double nVal; + String cellString; + BYTE nIndex = static_cast< BYTE >( 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( (BYTE)nNum ).GetValueFormat( sFmt, eLng, eSys ); + + short nType; + 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; + BYTE nFmtIndex = GetFormatIndex( nCol, nRow ); + Rectangle cellRect = maArray.GetCellRect( nCol, nRow ); + Point aPos = cellRect.TopLeft(); + USHORT nRightX = 0; +// 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 = (USHORT)( 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 - (USHORT)aStrSize.Height()) / 2; + + //----------- + // horizontal + //----------- +/* if ( eJustification != SC_HOR_JUSTIFY_STANDARD )*/ + if( mbRTL ) + aPos.X() += nRightX; + else if (aCurData.IsJustify()) + { + USHORT nHorPos = (USHORT) + ((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( FALSE ); + CalcLineMap(); +} + +//------------------------------------------------------------------------ + + +void AutoFmtPreview::CalcCellArray( 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();//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( 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 ); +} |