/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/



#ifndef SC_AUTOFMT_HXX
#define SC_AUTOFMT_HXX

#ifndef _VIRDEV_HXX //autogen
#include <vcl/virdev.hxx>
#endif
#ifndef SV_FIXED_HXX
#include <vcl/fixed.hxx>
#endif
#ifndef SV_LSTBOX_HXX
#include <vcl/lstbox.hxx>
#endif
#ifndef SV_BUTTON_HXX
#include <vcl/button.hxx>
#endif
#ifndef SV_MOREBTN_HXX
#include <vcl/morebtn.hxx>
#endif
#ifndef _DIALOG_HXX //autogen
#include <vcl/dialog.hxx>
#endif
#include <svtools/scriptedtext.hxx>
#include <svx/framelinkarray.hxx>
#include "scdllapi.h"

//------------------------------------------------------------------------

class ScAutoFormat;
class ScAutoFormatData;
class SvxBoxItem;
class SvxLineItem;
class ScAutoFmtPreview; // s.u.
class SvNumberFormatter;
class ScDocument;

//------------------------------------------------------------------------

enum AutoFmtLine { TOP_LINE, BOTTOM_LINE, LEFT_LINE, RIGHT_LINE };

//========================================================================

//CHINA001 class ScAutoFormatDlg : public ModalDialog
//CHINA001 {
//CHINA001 public:
//CHINA001 ScAutoFormatDlg( Window*					pParent,
//CHINA001 ScAutoFormat*				pAutoFormat,
//CHINA001 const ScAutoFormatData*    pSelFormatData,
//CHINA001 ScDocument*                pDoc );
//CHINA001 ~ScAutoFormatDlg();
//CHINA001
//CHINA001 sal_uInt16 GetIndex() const { return nIndex; }
//CHINA001 String GetCurrFormatName();
//CHINA001
//CHINA001 private:
//CHINA001 FixedLine       aFlFormat;
//CHINA001 ListBox			aLbFormat;
//CHINA001 ScAutoFmtPreview*	pWndPreview;
//CHINA001 OKButton		aBtnOk;
//CHINA001 CancelButton	aBtnCancel;
//CHINA001 HelpButton		aBtnHelp;
//CHINA001 PushButton		aBtnAdd;
//CHINA001 PushButton		aBtnRemove;
//CHINA001 MoreButton		aBtnMore;
//CHINA001 FixedLine       aFlFormatting;
//CHINA001 CheckBox		aBtnNumFormat;
//CHINA001 CheckBox		aBtnBorder;
//CHINA001 CheckBox		aBtnFont;
//CHINA001 CheckBox		aBtnPattern;
//CHINA001 CheckBox		aBtnAlignment;
//CHINA001 CheckBox		aBtnAdjust;
//CHINA001 PushButton		aBtnRename;
//CHINA001 String			aStrTitle;
//CHINA001 String			aStrLabel;
//CHINA001 String			aStrClose;
//CHINA001 String			aStrDelTitle;
//CHINA001 String			aStrDelMsg;
//CHINA001 String			aStrRename;
//CHINA001
//CHINA001 //------------------------
//CHINA001 ScAutoFormat*			pFormat;
//CHINA001 const ScAutoFormatData*	pSelFmtData;
//CHINA001 sal_uInt16					nIndex;
//CHINA001 sal_Bool					bCoreDataChanged;
//CHINA001 sal_Bool					bFmtInserted;
//CHINA001
//CHINA001 void Init			();
//CHINA001 void UpdateChecks	();
//CHINA001 //------------------------
//CHINA001 DECL_LINK( CheckHdl, Button * );
//CHINA001 DECL_LINK( AddHdl, void * );
//CHINA001 DECL_LINK( RemoveHdl, void * );
//CHINA001 DECL_LINK( SelFmtHdl, void * );
//CHINA001 DECL_LINK( CloseHdl, PushButton * );
//CHINA001 DECL_LINK( DblClkHdl, void * );
//CHINA001 DECL_LINK( RenameHdl, void *);
//CHINA001
//CHINA001 };
//CHINA001
//========================================================================

class SC_DLLPUBLIC ScAutoFmtPreview : public Window
{
public:
            ScAutoFmtPreview( Window* pParent, const ResId& rRes, ScDocument* pDoc );
			~ScAutoFmtPreview();

	void NotifyChange( ScAutoFormatData* pNewData );

protected:
	virtual void Paint( const Rectangle& rRect );

private:
    ScAutoFormatData*       pCurData;
    VirtualDevice           aVD;
    SvtScriptedTextHelper   aScriptedText;
    ::com::sun::star::uno::Reference< ::com::sun::star::i18n::XBreakIterator > xBreakIter;
    sal_Bool                    bFitWidth;
    svx::frame::Array       maArray;            /// Implementation to draw the frame borders.
    bool                    mbRTL;
    Size                    aPrvSize;
    long                    mnLabelColWidth;
    long                    mnDataColWidth1;
    long                    mnDataColWidth2;
    long                    mnRowHeight;
    const String            aStrJan;
    const String            aStrFeb;
    const String            aStrMar;
    const String            aStrNorth;
    const String            aStrMid;
    const String            aStrSouth;
    const String            aStrSum;
    SvNumberFormatter*      pNumFmt;
	//-------------------------------------------
	SC_DLLPRIVATE void	Init			();
	SC_DLLPRIVATE void	DoPaint			( const Rectangle& rRect );
	SC_DLLPRIVATE void	CalcCellArray	( sal_Bool bFitWidth );
	SC_DLLPRIVATE void	CalcLineMap		();
	SC_DLLPRIVATE void	PaintCells		();

/*  Usage of type size_t instead of SCCOL/SCROW is correct here - used in
    conjunction with class svx::frame::Array (svx/framelinkarray.hxx), which
    expects size_t coordinates. */

    SC_DLLPRIVATE sal_uInt16              GetFormatIndex( size_t nCol, size_t nRow ) const;
    SC_DLLPRIVATE const SvxBoxItem&   GetBoxItem( size_t nCol, size_t nRow ) const;
    SC_DLLPRIVATE const SvxLineItem&  GetDiagItem( size_t nCol, size_t nRow, bool bTLBR ) const;

    SC_DLLPRIVATE void                DrawString( size_t nCol, size_t nRow );
    SC_DLLPRIVATE void                DrawStrings();
    SC_DLLPRIVATE void                DrawBackground();

    SC_DLLPRIVATE void    MakeFonts       ( sal_uInt16 nIndex,
                              Font& rFont,
                              Font& rCJKFont,
                              Font& rCTLFont );

	SC_DLLPRIVATE String	MakeNumberString( String cellString, sal_Bool bAddDec );
	SC_DLLPRIVATE void	DrawFrameLine	( const SvxBorderLine&	rLineD,
							  Point					from,
							  Point					to,
							  sal_Bool					bHorizontal,
							  const SvxBorderLine&	rLineLT,
							  const SvxBorderLine&	rLineL,
							  const SvxBorderLine&	rLineLB,
							  const SvxBorderLine&	rLineRT,
							  const SvxBorderLine&	rLineR,
							  const SvxBorderLine&	rLineRB );
	SC_DLLPRIVATE void CheckPriority	( sal_uInt16			nCurLine,
							  AutoFmtLine		eLine,
							  SvxBorderLine&	rLine );
	SC_DLLPRIVATE void	GetLines		( sal_uInt16 nIndex, AutoFmtLine eLine,
							  SvxBorderLine&	rLineD,
							  SvxBorderLine&	rLineLT,
							  SvxBorderLine&	rLineL,
							  SvxBorderLine&	rLineLB,
							  SvxBorderLine&	rLineRT,
							  SvxBorderLine&	rLineR,
							  SvxBorderLine&	rLineRB );
};

#endif // SC_AUTOFMT_HXX


