//this file is part of eMule
//Copyright (C)2002-2008 Merkur ( strEmail.Format("%s@%s", "devteam", "emule-project.net") / http://www.emule-project.net )
//
//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU General Public License
//as published by the Free Software Foundation; either
//version 2 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 General Public License for more details.
//
//You should have received a copy of the GNU General Public License
//along with this program; if not, write to the Free Software
//Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#pragma once
#include "MuleListCtrl.h"
#include "TitleMenu.h"
#include "ListCtrlItemWalk.h"
#include "Neo/GUI/FileProcessing.h"// gomez82 >>> CRC - [MorphCRCTag] 

class CSharedFileList;
class CKnownFile;
class CDirectoryItem;
class CToolTipCtrlX;
// gomez82 >>> SP - [SharedParts] 
class CSharedFileList;
class CKnownFile;
class CSharedFilesCtrl;

///////////////////////////////////////////////////////////////////////////////
// CSharedItem

class CSharedItem: public CObject
{
	DECLARE_DYNAMIC(CSharedItem)
public:

	bool		isFile;
	bool		isOpen;
	uint16		Part;
	uint16		Parts;
	CKnownFile	*KnownFile;
};

///////////////////////////////////////////////////////////////////////////////
// CSharedFilesListCtrlItemWalk

class CSharedFilesListCtrlItemWalk : public CListCtrlItemWalk
{
public:
	CSharedFilesListCtrlItemWalk(CSharedFilesCtrl* pListCtrl);

	virtual CObject* GetNextSelectableItem();
	virtual CObject* GetPrevSelectableItem();

	void SetItemTypeParts(bool Parts) { m_iParts = Parts; }

protected:
	CSharedFilesCtrl* m_pSharedFilesListCtrl;
	bool m_iParts;
};
// gomez82 >>> SP END 

///////////////////////////////////////////////////////////////////////////////
// CSharedFilesCtrl

class CSharedFilesCtrl : public CMuleListCtrl, public CSharedFilesListCtrlItemWalk // gomez82 >>> SP - [SharedParts] 
//class CSharedFilesCtrl : public CMuleListCtrl, public CListCtrlItemWalk
{
	friend class CSharedDirsTreeCtrl;
	DECLARE_DYNAMIC(CSharedFilesCtrl)

public:
	CSharedFilesCtrl();
	virtual ~CSharedFilesCtrl();

	void	Init();
	void	CreateMenues();
	void	ReloadFileList();
	void	AddFile(const CKnownFile* file);
	void	RemoveFile(const CKnownFile* file);
	void	UpdateFile(const CKnownFile* file);
	// gomez82 >>> SP - [SharedParts] 
	void	UpdatePart(const CSharedItem* part); 
	BOOL	DeleteAllItems();
	// gomez82 >>> SP END -- Xanatos --
	void	Localize();
	void	ShowFilesCount();
	void	ShowComments(CKnownFile* file);
	void	SetAICHHashing(uint32 nVal)				{ nAICHHashing = nVal; }
	void	SetDirectoryFilter(CDirectoryItem* pNewFilter, bool bRefresh = true);

	CFileProcessingThread m_FileProcessingThread; // gomez82 >>> CRC - [MorphCRCTag] 

protected:
	CTitleMenu		m_SharedFilesMenu;
	CTitleMenu		m_CollectionsMenu;
	CTitleMenu		m_CRC32Menu; // gomez82 >>> CRC - [MorphCRCTag] 
	CMenu			m_PrioMenu;
	// gomez82 >>> HideOS & SOTN [Slugfiller/ MorphXT] - Stulle
	CMenu		m_HideOSMenu;
	CMenu		m_SelectiveChunkMenu;
	CMenu		m_ShareOnlyTheNeedMenu;
	// gomez82 >>> HideOS & SOTN [Slugfiller/ MorphXT] - Stulle

	bool			sortstat[4];
	CImageList		m_ImageList;
	CDirectoryItem*	m_pDirectoryFilter;
	volatile uint32 nAICHHashing;
	CToolTipCtrlX*	m_pToolTip;

	static int CALLBACK SortProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
	// gomez82 >>> SP - [SharedParts] 
	static int Compare(const CKnownFile* item1, const CKnownFile* item2, LPARAM lParamSort);
	static int Compare(const CSharedItem* item1, const CSharedItem* item2, LPARAM lParamSort);
	// gomez82 >>> SP END 

	void OpenFile(const CKnownFile* file);
	void ShowFileDialog(CTypedPtrList<CPtrList, CKnownFile*>& aFiles, UINT uPshInvokePage = 0);
	void SetAllIcons();
	int FindFile(const CKnownFile* pFile);
	//void GetItemDisplayText(const CKnownFile* file, int iSubItem, LPTSTR pszText, int cchTextMax) const;
//	bool IsFilteredItem(const CKnownFile* pKnownFile) const;
	int FindPart(const CSharedItem* pPart); // gomez82 >>> SP - [SharedParts] 

	virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
	virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);

	// gomez82 >>> SP - [SharedParts] 
	void ExpandCollapseItem(int Item);
	void DrawFileItem(CDC *dc, int iColumn, LPRECT cur_rec, CKnownFile *file);
	void DrawPartItem(CDC *dc, int iColumn, LPRECT cur_rec, CSharedItem *part);
	// gomez82 >>> SP END 

	DECLARE_MESSAGE_MAP()
	afx_msg void OnSysColorChange();
	afx_msg	void OnColumnClick( NMHDR* pNMHDR, LRESULT* pResult);
	afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
	afx_msg void OnClick(NMHDR *pNMHDR, LRESULT *pResult); // gomez82 >>> NTS - [NeoTreeStyle] 
	afx_msg void OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult);
	afx_msg void OnGetDispInfo(NMHDR *pNMHDR, LRESULT *pResult);
	afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
	afx_msg void OnLvnGetInfoTip(NMHDR *pNMHDR, LRESULT *pResult);
	afx_msg void OnBegindragFilelist(NMHDR* pNMHDR, LRESULT* pResult); // gomez82 >>> SDD - [ShareDargAndDrop] 
	// gomez82 >>> CRC - [MorphCRCTag] 
	afx_msg LRESULT OnCRC32RenameFile (WPARAM wParam, LPARAM lParam);
	afx_msg LRESULT OnCRC32UpdateFile (WPARAM wParam, LPARAM lParam);
	// gomez82 >>> CRC END 
};
