// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010  Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

#if !defined(AFX_VEGETABLE_DLG_H__4E65E757_88C9_4FCE_94CC_9E429D8DFD68__INCLUDED_)
#define AFX_VEGETABLE_DLG_H__4E65E757_88C9_4FCE_94CC_9E429D8DFD68__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// vegetable_dlg.h : header file
//

#include "ps_wrapper.h"
#include "vegetable_refresh.h"
#include "vegetable_list_box.h"


class	CObjectViewer;
class	CVegetableApperancePage;
class	CVegetableDensityPage;
class	CVegetableScalePage;
class	CVegetableRotatePage;
class	CVegetableWindDlg;

namespace	NL3D
{
	class	CVegetable;
	class	CTileVegetableDesc;
}


/////////////////////////////////////////////////////////////////////////////
// CVegetableDlg dialog

class CVegetableDlg : public CDialog, public IVegetableRefresh
{
// Construction
public:
	CVegetableDlg(CObjectViewer *viewer, CWnd* pParent = NULL);   // standard constructor

	~CVegetableDlg();

// Dialog Data
	//{{AFX_DATA(CVegetableDlg)
	enum { IDD = IDD_VEGETABLE_DLG };
	CVegetableListBox	VegetableList;
	CStatic	StaticPolyCount;
	CButton	CheckSnapToGround;
	CButton	CheckEnableVegetable;
	CButton	CheckAutomaticRefresh;
	CButton	ButtonRefreshLandscape;
	CButton	CheckShowLandscape;
	CStatic	SelectVegetableStaticText;
	//}}AFX_DATA


	// IVegetableRefresh implementation: only if automatic refresh is checked
	virtual	void		refreshVegetableDisplay();


public:
	
	// get count of vegetable in the dlg
	uint				getNumVegetables() const;
	std::string			getVegetableName(uint id) const;
	void				updateCurSelVegetableName();
	NL3D::CVegetable	*getVegetable(uint id) const;

	// Change the hiden state of the id vegetable.
	void				setShowHideVegetable (uint id, bool visible, bool refreshDisplay);
	void				swapShowHideVegetable (uint id);
	bool				isVegetableVisible (uint id);

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CVegetableDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

	/** set the vegetble to edit. NULL will hide all the windows.
	 *	Called by ListBox selection.
	 */
	void			setVegetableToEdit(NL3D::CVegetable *vegetable);

// Implementation
protected:
	CObjectViewer				*_ObjView;
	friend	class	CVegetableListBox;

	// Name to save.
	std::string					_LastVegetSetName;

	// A desc of vegetable to edit.
	struct	CVegetableDesc
	{
		// The vegetable
		NL3D::CVegetable		*Vegetable;
		// The name of this vegetable.
		std::string				VegetableName;
		// Visibility. Editor feature only
		bool					Visible;

		CVegetableDesc();

		// init the vegetable
		void		initDefaultVegetable();
		void		initVegetable(const NL3D::CVegetable &vegetable);
		// update VegetableName according to Vegetable
		void		updateVegetableName();
		// delete the vegetable
		void		deleteVegetable();
	};

	// The vegetable List.
	std::vector<CVegetableDesc>	_Vegetables;

	// The property sheet.
	CPropertySheet				*_PropertySheet;
	CVegetableDensityPage		*_VegetableDensityPage;
	CVegetableApperancePage		*_VegetableApperancePage;
	CVegetableScalePage			*_VegetableScalePage;
	CVegetableRotatePage		*_VegetableRotatePage;

	// Extra wind dlg
	CVegetableWindDlg			*_VegetableWindDlg;

	// refresh vegetable display even if box unchecked.
	void			doRefreshVegetableDisplay();

	// clear all vegetables.
	void			clearVegetables();
	// load a vegetSet with a FileDialog
	bool			loadVegetableSet(NL3D::CTileVegetableDesc &vegetSet, const char *title);
	/** build the vegetSet from the current _Vegetables
	 * NB: transform Rotate Angle in Radians.
	 * \param keepDefaultShapeName if true, then vegetables with a ShapeName=="" are kept.
	 * \param keepHiden if true, then vegetables maked as hiden in ObjectViewer are kept.
	 */
	void			buildVegetableSet(NL3D::CTileVegetableDesc &vegetSet, bool keepDefaultShapeName= true, bool keepHiden= true );
	// append the vegetSet to the current _Vegetables
	// NB: transform Rotate Angle in Degrees.
	void			appendVegetableSet(NL3D::CTileVegetableDesc &vegetSet);

	// Generated message map functions
	//{{AFX_MSG(CVegetableDlg)
	afx_msg void OnDestroy();
	virtual BOOL OnInitDialog();
	afx_msg void OnSelchangeListVegetable();
	afx_msg void OnButtonVegetableAdd();
	afx_msg void OnButtonVegetableClear();
	afx_msg void OnButtonVegetableInsert();
	afx_msg void OnButtonVegetableLoadDesc();
	afx_msg void OnButtonVegetableLoadSet();
	afx_msg void OnButtonVegetableRemove();
	afx_msg void OnButtonVegetableSaveDesc();
	afx_msg void OnButtonVegetableSaveSet();
	afx_msg void OnButtonVegetableAppendSet();
	afx_msg void OnButtonVegetableCopy();
	afx_msg void OnButtonVegetableRefresh();
	afx_msg void OnCheckVegetableShow();
	afx_msg void OnButtonVegetableSetupWind();
	afx_msg void OnCheckVegetableAutomatic();
	afx_msg void OnCheckVegetableEnable();
	afx_msg void OnCheckVegetableSnaptoground();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_VEGETABLE_DLG_H__4E65E757_88C9_4FCE_94CC_9E429D8DFD68__INCLUDED_)