//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
//=============================================================================//

#ifndef TEXTUREWINDOW_H
#define TEXTUREWINDOW_H
#ifdef _WIN32
#pragma once
#endif

#include "IEditorTexture.h"
#include "utlvector.h"


struct TextureWindowTex_t
{
	IEditorTexture *pTex;
	int nUsageCount;
};


class TextureWindowTexList : public CUtlVector<TextureWindowTex_t>
{
public:

	inline int Find(IEditorTexture *pTex)
	{
		for (int i = 0; i < Count(); i++)
		{
			if (Element(i).pTex == pTex)
			{
				return i;
			}
		}	

		return -1;
	}
};


class CTextureWindow : public CWnd
{
public:
	CTextureWindow();
	virtual ~CTextureWindow();

	void Create(CWnd *pParentWnd, RECT& rect);

	struct TWENUMPOS
	{
		IEditorTexture *pTex;
		RECT texrect;
		int cur_x, cur_y;
		RECT clientrect;
		int largest_y;
		int iTexIndex;
		int nUsageCount;		// The number of times this texture is used in the map. Only set in "Used Textures Only" mode.
	};

	enum
	{
		TYPEFILTER_OPAQUE = 0x1,
		TYPEFILTER_TRANSLUCENT = 0x2,
		TYPEFILTER_SELFILLUM = 0x4,
		TYPEFILTER_ENVMASK = 0x8,

		TYPEFILTER_ALL = (TYPEFILTER_OPAQUE|TYPEFILTER_TRANSLUCENT|TYPEFILTER_SELFILLUM|TYPEFILTER_ENVMASK),
	};

	void EnableUpdate(bool bEnable);
	void UpdateScrollSizes();
	BOOL EnumTexturePositions(TWENUMPOS *pTE, BOOL bStart = FALSE);
	void SetDisplaySize(int iSize);
	void HighlightCurTexture(CDC *pDC = NULL);
	void SetNameFilter(LPCTSTR pszFilter);
	void SetKeywords(const char *pszKeywords);
	void SetTextureFormat(TEXTUREFORMAT eTextureFormat);
	void SelectTexture(LPCTSTR pszTexture, BOOL bAllowRedraw = TRUE);
	void SetSpecificList(TextureWindowTexList *pList);
	void SetTypeFilter( int filter, bool enable );
	void ShowErrors( bool enable )	{ m_bShowErrors = true; }

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CTextureWindow)
	//}}AFX_VIRTUAL

	char szCurTexture[128];

protected:

	bool MatchKeywords(const char *pszSearch, char **pszKeyword, int nKeywords);

	int total_x;
	int total_y;
	int iDisplaySize;
	int iTexNameCharWidth;
	BOOL bFirstPaint;
	CFont TexFont;
	TextureWindowTexList *m_pSpecificList;
	CRect rectHighlight;
	int	m_nTypeFilter;

	char m_szFilter[128];			// Name filter, space, comma, or semicolon delimited.
	int m_nFilters;					// The number of names that were parsed out of the name filter.
	char *m_Filters[64];			// The individual name filters.

	char m_szKeywords[128];			// Keyword filter, space, comma, or semicolon delimited.
	int m_nKeywords;				// The number of keywords that were parsed out of the name filter.
	char *m_Keyword[64];			// The individual keywords.

	bool m_bEnableUpdate;			// Locks GUI updates to control repaints.
	bool m_bShowErrors;

	TEXTUREFORMAT m_eTextureFormat;

	//{{AFX_MSG(CTextureWindow)
	afx_msg void OnPaint();
	afx_msg void OnSize(UINT nType, int cx, int cy);
	afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
	afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
	afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
	afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
	afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint point);
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};


#endif // TEXTUREWINDOW_H