#ifndef __FileList__H
#define __FileList__H

#include "WimpLib:DocView.h"
#include "FLTrack.h"
#include "WimpLib:Clipboard.h"

extern const file_type FileList_Load_FileTypes[];
extern const file_type FileList_Save_FileTypes[];

typedef enum
{ FileList_TypeNormal = 0    // Saved in user location
, FileList_TypeMain   = 1    // Saved in standard location
, FileList_TypeExtern = 2    // Non DigitalCD playlists (.m3u, .pls, yp.xml)
, FileList_TypeTemporary = 3 // Follows only non saving lists
, FileList_TypeQueue  = 3
, FileList_TypeDir    = 4
, FileList_TypeYP     = 5    // Yellow pages (url to yp.xml)
, FileList_TypeSearch = 6
} FileList_Type;

typedef struct FileList FileList;

FileList* throw_FileList_GetMain(void);
FileList* throw_New_FileList_Queue(void);
FileList* throw_New_FileList_Search(void);
FileList* throw_New_FileList_Sublist(FileList* pParent, FileList_Type type, const char* title, file_type fileType);
FileList* throw_New_FileList_FromTrack(struct FLTrack* pTrack);
FileList* throw_New_FileList_File(FileList* pParent, const char* filename);
FileList* throw_New_FileList_Receive(FileList* pParent, const Msg_FileData* rcv);
void Delete_FileList(FileList*);

const _kernel_oserror* FileList_LoadDocument(Document* This, XFer* xfer, file_type type, const ScreenPos* pInfo);
void FileList_SendHeader(const FileList* pEdit, file_type type, sXFer_Chunk* pchunk, uint32_t count);
void FileList_SendTrack(const FileList* pEdit, file_type type, sXFer_Chunk* pchunk, const struct FLTrack* pTrack, bool bExport);
void FileList_SendTrailer(const FileList* pEdit, file_type type, sXFer_Chunk* pchunk, uint32_t count);
bool FileList_AcceptSourceFileType(file_type type);

extern ClipboardHandler FileList_Clipboard;

#define FileList_OnSaveDocument(p) Document_OnSaveDocument((Document*) p)
#define FileList_GetPathName(p) Document_GetPathName((Document*) p)
#define FileList_HasValidPath(p) Document_HasValidPath((Document*) p)
#define FileList_IsModified(p) Document_IsModified((Document*) p)
void FileList_SetModifiedFlag(FileList*, bool b);
void FileList_SetAutoModifiedFlag(FileList*);
void FileList_StartUpdate(FileList*);
void FileList_EndUpdate(FileList*, bool bSetAutoModified, bool bSetModified);
const _kernel_oserror* FileList_ViewLoadDocument(View* pView, XFer* xfer, file_type type, const ScreenPos* pInfo);
#define FileList_UpdateAllViews(p, v, h, hd) Document_UpdateAllViews((Document*) p, v, h, hd)
bool FileList_AllowTrackType(const FileList*, unsigned int flags);
int throw_FileList_InsertTrackAt(FileList*, int InsertPos, const struct FLTrack* pTrack);
void throw_FileList_RemoveTrackAt(FileList*, int Pos);

FileList_Type FileList_GetType(const FileList*);
bool FileList_IsPlayable(const FileList*);
bool FileList_IsBusy(const FileList*);

struct FLTrack* FileList_GetOwner(const FileList*);
const char* FileList_GetBaseDir(const FileList*);
const char* FileList_GetTitle(const FileList*);
const char* FileList_GetAuthor(const FileList*);
const char* FileList_GetInfo(const FileList*);

void FileList_SetOwner(FileList*, struct FLTrack*);
bool FileList_SetBaseDir(FileList*, const char* basedir);
bool FileList_SetTitle(FileList*, const char* title);
bool FileList_SetAuthor(FileList*, const char* author);
bool FileList_SetInfo(FileList*, const char* info);

void FileList_Show(FileList*, int Index);

int FileList_TrackCount(const FileList*);
int FileList_CountTracksToPlay(const FileList*, FLTrack_ObjectType type);
const void** FileList_ListTracksToPlay(const FileList*, const void** ptracks, FLTrack_ObjectType type);
void FileList_OpenBaseDir(FileList*);

struct FLTrack* FileList_GetTrack(const FileList*, int index);
struct FLTrack* FileList_GetPlayTrack(const FileList*, int index);
int FileList_FindTrack(const FileList*, const struct FLTrack* pobj);
bool FileList_DelTrack(FileList*, struct FLTrack* pTrack);
void FileList_Play(FileList*, int index);

#define FileList_Add_Show 0x01
#define FileList_Add_Play 0x02
void FileList_AddFile(FileList* This, int InsertPos, const char* filename, int flags);
void throw_FileList_AddList(FileList*, int InsertPos, FileList* pSubList);
void FileList_Rescan(FileList*);

bool FileList_IsFileList(const Document*);

#endif
