/**************************************************************
 * 
 * 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 _SVTOOLS_TEMPLWIN_HXX
#define _SVTOOLS_TEMPLWIN_HXX

#include <tools/resary.hxx>
#include <vcl/splitwin.hxx>
#include <vcl/toolbox.hxx>
#include <vcl/window.hxx>
#include <svtools/headbar.hxx>
#include <svtools/fileview.hxx>
#include <svtools/ivctrl.hxx>
#include <svtools/svmedit2.hxx>
#include <svl/restrictedpaths.hxx>
#include <com/sun/star/frame/XDispatch.hpp>
#include <com/sun/star/lang/Locale.hpp>

namespace com{ namespace sun { namespace star { namespace awt   { class XWindow; } } } }
namespace com{ namespace sun { namespace star { namespace frame { class XFrame; } } } }
namespace com{ namespace sun { namespace star { namespace document {
    class XDocumentProperties;
} } } }
namespace svtools
{
	class ODocumentInfoPreview;
}

// class SvtDummyHeaderBar_Impl ------------------------------------------

class SvtDummyHeaderBar_Impl : public Window
{
private:
	void				UpdateBackgroundColor();

public:
						SvtDummyHeaderBar_Impl( Window* pParent );
						~SvtDummyHeaderBar_Impl();

	virtual void        DataChanged( const DataChangedEvent& rDCEvt );
};

// class SvtIconWindow_Impl ----------------------------------------------

class SvtIconWindow_Impl : public Window
{
private:
	SvtDummyHeaderBar_Impl	aDummyHeaderBar;	// spaceholder instead of HeaderBar
	SvtIconChoiceCtrl	aIconCtrl;

	String				aNewDocumentRootURL;
	String				aTemplateRootURL;
	String				aMyDocumentsRootURL;
	String				aSamplesFolderRootURL;

	long				nMaxTextLength;

	SvxIconChoiceCtrlEntry*	GetEntry( const String& rURL ) const;

public:
	SvtIconWindow_Impl( Window* pParent );
	~SvtIconWindow_Impl();

	virtual void		Resize();

	inline long			GetMaxTextLength() const { return nMaxTextLength; }
	inline void			SetClickHdl( const Link& rLink ) { aIconCtrl.SetClickHdl( rLink ); }

	String				GetSelectedIconURL() const;
	String				GetSelectedIconText() const;
	String				GetCursorPosIconURL() const;
	String				GetIconText( const String& rURL ) const;
	void				InvalidateIconControl();
	void				SetCursorPos( sal_uLong nPos );
	sal_uLong				GetCursorPos() const;
	sal_uLong				GetSelectEntryPos() const;
	void				SetFocus();
	long 				CalcHeight() const;
	sal_Bool			IsRootURL( const String& rURL ) const;
	sal_uLong				GetRootPos( const String& rURL ) const;
	void				UpdateIcons( sal_Bool _bHiContrast );

	inline sal_Bool			ProcessKeyEvent( const KeyEvent& rKEvt );

	inline const String&	GetTemplateRootURL() const		{ return aTemplateRootURL; }
	inline const String&	GetMyDocumentsRootURL() const	{ return aMyDocumentsRootURL; }
	inline const String& 	GetSamplesFolderURL() const		{ return aSamplesFolderRootURL; }

    void                SelectFolder(sal_Int32 nFolderPos);
};

inline sal_Bool SvtIconWindow_Impl::ProcessKeyEvent( const KeyEvent& rKEvt )
{
	return ( rKEvt.GetKeyCode().IsMod2() ? aIconCtrl.DoKeyInput( rKEvt ) : sal_False );
}

// class SvtFileViewWindow_Impl ------------------------------------------

class SvtTemplateWindow;

class SvtFileViewWindow_Impl : public Window
{
private:
	SvtTemplateWindow&	rParent;
	SvtFileView	   		aFileView;
	Link				aNewFolderLink;
	String				aCurrentRootURL;
	String				aFolderURL;
	String				aMyDocumentsURL;
	String				aSamplesFolderURL;
    ::svt::RestrictedPaths
                        aURLFilter;

	sal_Bool			bIsTemplateFolder;

	::com::sun::star::uno::Sequence< ::rtl::OUString >
						GetNewDocContents() const;

public:
	SvtFileViewWindow_Impl( SvtTemplateWindow* pParent );
	~SvtFileViewWindow_Impl();

	virtual void		Resize();

	inline void			SetSelectHdl( const Link& rLink ) { aFileView.SetSelectHdl( rLink ); }
	inline void			SetDoubleClickHdl( const Link& rLink ) { aFileView.SetDoubleClickHdl( rLink ); }
	inline void			SetNewFolderHdl( const Link& rLink ) { aNewFolderLink = rLink; }
	inline void			ResetCursor() { aFileView.ResetCursor(); }
	inline sal_Bool		IsTemplateFolder() const { return bIsTemplateFolder; }
	inline String		GetFolderURL() const { return aFolderURL; }
	inline String		GetRootURL() const { return aCurrentRootURL; }
	inline void			OpenRoot( const String& rRootURL )
							{ aCurrentRootURL = rRootURL; OpenFolder( rRootURL ); }
	inline void			SetMyDocumentsURL( const String& _rNewURL ) { aMyDocumentsURL = _rNewURL; }
	inline void			SetSamplesFolderURL( const String& _rNewURL ) { aSamplesFolderURL = _rNewURL; }

	String				GetSelectedFile() const;
	void				OpenFolder( const String& rURL );
	sal_Bool			HasPreviousLevel( String& rURL ) const;
	String				GetFolderTitle() const;
	void				SetFocus();
};

// class SvtFrameWindow_Impl ---------------------------------------------

class SvtDocInfoTable_Impl : public ResStringArray
{
private:
	String			aEmptyString;

public:
	SvtDocInfoTable_Impl();

	const String&	GetString( long nId ) const;
};

class SvtExtendedMultiLineEdit_Impl : public ExtMultiLineEdit
{
public:
	SvtExtendedMultiLineEdit_Impl( Window* pParent,WinBits _nBits );
	inline ~SvtExtendedMultiLineEdit_Impl() {}

	inline void			Clear() { SetText( String() ); }
	void				InsertEntry( const String& rTitle, const String& rValue );
};

class SvtFrameWindow_Impl : public Window
{
private:
    ::com::sun::star::uno::Reference < ::com::sun::star::frame::XFrame >
								xFrame;
    ::com::sun::star::uno::Reference < ::com::sun::star::document::XDocumentProperties>
								m_xDocProps;
    ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow >
								xWindow;

	::svtools::ODocumentInfoPreview*
									pEditWin;
	Window*							pTextWin;
	Window*							pEmptyWin;
	::com::sun::star::lang::Locale	aLocale;
	SvtDocInfoTable_Impl			aInfoTable;
	String							aCurrentURL;
	::rtl::OUString					m_aOpenURL;
	sal_Bool						bDocInfo;

	void					ShowDocInfo( const String& rURL );
	void					ViewEditWin();
	void					ViewTextWin();
	void					ViewEmptyWin();
	void					ViewNonEmptyWin();	// views depending on bDocInfo

    struct SvtExecuteInfo
    {
        ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatch >     xDispatch;
        ::com::sun::star::util::URL                                                aTargetURL;
    };

    DECL_STATIC_LINK(       SvtFrameWindow_Impl, ExecuteHdl_Impl, SvtExecuteInfo* );

public:
	SvtFrameWindow_Impl( Window* pParent );
	~SvtFrameWindow_Impl();

	virtual void			Resize();

	void					OpenFile( const String& rURL, sal_Bool bPreview, sal_Bool bIsTemplate, sal_Bool bAsTemplate );
	void					ToggleView( sal_Bool bDocInfo );
};

// class SvtTemplateWindow -----------------------------------------------

class HistoryList_Impl;

class SvtTemplateWindow : public Window
{
private:
	ToolBox						aFileViewTB;
	ToolBox						aFrameWinTB;
	SplitWindow					aSplitWin;

	SvtIconWindow_Impl*			pIconWin;
	SvtFileViewWindow_Impl*		pFileWin;
	SvtFrameWindow_Impl*		pFrameWin;
	HistoryList_Impl*			pHistoryList;

	Link						aSelectHdl;
	Link						aDoubleClickHdl;
	Link						aNewFolderHdl;
	Link						aSendFocusHdl;

	Timer						aSelectTimer;

	String						aFolderTitle;

	virtual void		Resize();

	DECL_LINK(			IconClickHdl_Impl, SvtIconChoiceCtrl* );
	DECL_LINK(			FileSelectHdl_Impl, SvtFileView* );
	DECL_LINK(			FileDblClickHdl_Impl, SvtFileView* );
	DECL_LINK(			NewFolderHdl_Impl, SvtFileView* );
	DECL_LINK(			TimeoutHdl_Impl, Timer* );
	DECL_LINK(			ClickHdl_Impl, ToolBox* );
	DECL_LINK(			ResizeHdl_Impl, SplitWindow* );		// used for split and initial setting of toolbar pos

	void				PrintFile( const String& rURL );
	void				AppendHistoryURL( const String& rURL, sal_uLong nGroup );
	void				OpenHistory();
	void				DoAction( sal_uInt16 nAction );
	void				InitToolBoxes();
	void				InitToolBoxImages();
	void				UpdateIcons();

protected:
	virtual long        PreNotify( NotifyEvent& rNEvt );
	virtual void 		DataChanged( const DataChangedEvent& rDCEvt );

public:
    SvtTemplateWindow( Window* pParent );
	~SvtTemplateWindow();

	inline void			SetSelectHdl( const Link& rLink ) { aSelectHdl = rLink; }
	inline void			SetDoubleClickHdl( const Link& rLink ) { aDoubleClickHdl = rLink; }
	inline void			SetNewFolderHdl( const Link& rLink ) { aNewFolderHdl = rLink; }
	inline void			SetSendFocusHdl( const Link& rLink ) { aSendFocusHdl = rLink; }
	inline sal_Bool		IsTemplateFolderOpen() const { return pFileWin->IsTemplateFolder(); }
	inline sal_Bool		HasIconWinFocus() const { return pIconWin->HasChildPathFocus(); }

	void				ReadViewSettings( );
	void				WriteViewSettings( );
	sal_Bool			IsFileSelected() const;
	String				GetSelectedFile() const;
	void				OpenFile( sal_Bool bNotAsTemplate );
	String				GetFolderTitle() const;
	String				GetFolderURL() const;
	void				SetFocus( sal_Bool bIconWin );
	void 				OpenTemplateRoot();
	void				SetPrevLevelButtonState( const String& rURL );	// sets state (enable/disable) for previous level button
	void				ClearHistory();
	long				CalcHeight() const;

    void                SelectFolder(sal_Int32 nFolderPosition);
};

#endif // _SVTOOLS_TEMPLWIN_HXX

