//Copie une structure de type élément, dont la source et la destination sont passées par valeur
#define CopieElement(destination,source)		memcpy(&(destination),&(source),sizeof(ELEMENT))
void DessFenetre(HWND hDlg, HANDLE hItem);
LRESULT CALLBACK DlgImport(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
void MajBoutons(HWND hBt);
void GereBoutonInconnu(HWND hDlg, HWND hCtrl);
int OuvreFichierConfig(char *nom_fichier, char *fonction);
char *CreeNomRelatif(char *nom_srce);

void Debug(const char *format, ...)		{
	char      vbuf[1024];
	va_list   arg_ptr;
	va_start(arg_ptr, format);
	_vsnprintf(vbuf, sizeof(vbuf), format, arg_ptr);
	MessageBox(gblHDlg, vbuf, "Débogage", 0);
}

int fMsgBox(HWND hDlg, const char *titre, int flags, const char *format, ...)		{
	char      vbuf[2048];
	va_list   arg_ptr;
	va_start(arg_ptr, format);
	_vsnprintf(vbuf, sizeof(vbuf), format, arg_ptr);
	return MessageBox(hDlg,vbuf,titre,flags);
}

char *SansLeSlash(char *ptr)		{
	char *retour=ptr;
	while(*ptr)		{
		if (*ptr=='\\')
			retour=ptr+1;
		ptr++;
	}
	return retour;
}

//Cette fonction ne vient pas de moi. Elle ajoute un élément à l'arbre du projet
HTREEITEM AddItemToTree(HWND hwndTV, LPSTR lpszItem, int nLevel)
{ 
    TVITEM tvi; 
    TVINSERTSTRUCT tvins; 
    static HTREEITEM hPrev = (HTREEITEM) TVI_FIRST; 
    static HTREEITEM hPrevRootItem = NULL; 
    static HTREEITEM hPrevLev2Item = NULL; 
    HTREEITEM hti; 
 
//    tvi.mask = TVIF_TEXT | TVIF_IMAGE 
//        | TVIF_SELECTEDIMAGE | TVIF_PARAM; 
	tvi.mask = TVIF_TEXT | TVIF_PARAM;

    // Set the text of the item. 
    tvi.pszText = lpszItem; 
    tvi.cchTextMax = lstrlen(lpszItem); 
 
// Assume the item is not a parent item, so give it a 
// document image. 
//    tvi.iImage = g_nDocument;
//    tvi.iSelectedImage = g_nDocument; 
 
    // Save the heading level in the item's application-defined 
    // data area. 
    tvi.lParam = (LPARAM) nLevel;
 
    tvins.item = tvi; 
    tvins.hInsertAfter = hPrev; 
 
    // Set the parent item based on the specified level. 
    if (nLevel == 1) 
        tvins.hParent = TVI_ROOT; 
    else if (nLevel == 2) 
        tvins.hParent = hPrevRootItem; 
    else 
        tvins.hParent = hPrevLev2Item; 
 
    // Add the item to the tree view control. 
    hPrev = (HTREEITEM) SendMessage(hwndTV, TVM_INSERTITEM, 0, 
         (LPARAM) (LPTVINSERTSTRUCT) &tvins); 
 
    // Save the handle to the item. 
    if (nLevel == 1) 
        hPrevRootItem = hPrev; 
    else if (nLevel == 2) 
        hPrevLev2Item = hPrev; 
 
    // The new item is a child item. Give the parent item a 
    // closed folder bitmap to indicate it now has child items. 
    if (nLevel > 1) {
        hti = TreeView_GetParent(hwndTV, hPrev); 
        tvi.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE; 
        tvi.hItem = hti; 
//        tvi.iImage = g_nClosed; 
//        tvi.iSelectedImage = g_nClosed; 
        TreeView_SetItem(hwndTV, &tvi); 
    } 
 
    return hPrev; 
} 

//Celle-ci c'est une copie de la précédente mais avec quelques modifications pour insérer
//un élément dans le projet.
HTREEITEM InsereObjDansArbre(HWND hwndTV, HTREEITEM hPrec, LPSTR lpszItem, int nLevel)
{ 
    TVITEM tvi; 
    TVINSERTSTRUCT tvins; 
    static HTREEITEM hPrev = (HTREEITEM) TVI_FIRST;
    static HTREEITEM hPrevRootItem = NULL; 
    static HTREEITEM hPrevLev2Item = NULL; 
    HTREEITEM hti; 
 
//    tvi.mask = TVIF_TEXT | TVIF_IMAGE 
//        | TVIF_SELECTEDIMAGE | TVIF_PARAM; 
	tvi.mask = TVIF_TEXT | TVIF_PARAM;

    // Set the text of the item. 
    tvi.pszText = lpszItem; 
    tvi.cchTextMax = lstrlen(lpszItem); 
 
    // Assume the item is not a parent item, so give it a 
    // document image. 
//    tvi.iImage = g_nDocument;
//    tvi.iSelectedImage = g_nDocument; 
 
    // Save the heading level in the item's application-defined 
    // data area. 
    tvi.lParam = (LPARAM) nLevel;
 
    tvins.item = tvi;
    tvins.hInsertAfter = hPrev; 
 
    // Set the parent item based on the specified level. 
    if (nLevel == 1) 
        tvins.hParent = TVI_ROOT; 
    else
        tvins.hParent = hPrec; 
 
    // Add the item to the tree view control. 
    hPrev = (HTREEITEM) SendMessage(hwndTV, TVM_INSERTITEM, 0, 
         (LPARAM) (LPTVINSERTSTRUCT) &tvins); 
 
    // Save the handle to the item. 
    if (nLevel == 1) 
        hPrevRootItem = hPrev; 
    else if (nLevel == 2) 
        hPrevLev2Item = hPrev; 
 
    // The new item is a child item. Give the parent item a 
    // closed folder bitmap to indicate it now has child items. 
    if (nLevel > 1) {
        hti = TreeView_GetParent(hwndTV, hPrev); 
        tvi.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE; 
        tvi.hItem = hti;
//        tvi.iImage = g_nClosed; 
//        tvi.iSelectedImage = g_nClosed; 
        TreeView_SetItem(hwndTV, &tvi); 
    } 
 
    return hPrev; 
} 

typedef struct		{
	char *nom;
	HANDLE *hti;
	int type;
} TYPE_HTI;

//Ne pas traduire
TYPE_HTI typesHTI[]=	{
	//Français
	{"racine", NULL, -1},
	{"mosaiques",&htvMosaiques, TYPE_MOSAIQUE},
	{"cartes", &htvCartes, TYPE_CARTE},
	{"palettes",&htvPalettes, TYPE_PALETTE},
	{"bitmaps",&htvBitmaps, -1},
	{"bitmaps8",&htvBitmaps8, TYPE_BITMAP8},
	{"bitmaps16",&htvBitmaps16, TYPE_BITMAP16},
	{"listes",&htvListes, TYPE_LISTE},
};

//Traduction possible

char *noms_dossiers_base[]=		{
	"racine",
	"mosaiques",
	"cartes",
	"palettes",
	"bitmaps",
	"bitmaps8",
	"bitmaps16",
	"liste"
};

#define nbreDossiersBase 8

//Met à jour l'arbre du projet courant
void MajListe(HWND hDlg)		{
	int i,j;
	int trouve;
	int type, niveau;
	HTREEITEM hti;

	g_majListeEnCours = 1;
	//Efface l'arbre
	hTV=GetDlgItem(hDlg,IDC_PROJET);
	htvMosaiques=htvCartes=htvPalettes=htvBitmaps=htvBitmaps8=htvBitmaps16=htvImporter=0;

	SendMessage(hTV, WM_SETREDRAW, 0, 0);
	TreeView_DeleteAllItems(hTV);

	//Réentre tous les objets
	htvMosaiques=AddItemToTree(hTV,"Mosaïques",1);
	htvCartes=AddItemToTree(hTV,"Cartes",1);
	htvListes=AddItemToTree(hTV,"Listes",1);
//	htvSprites=AddItemToTree(hTV,"Sprites",1);
	htvPalettes=AddItemToTree(hTV,"Palettes",1);
	htvBitmaps=AddItemToTree(hTV,"Bitmaps",1);
	htvBitmaps8=AddItemToTree(hTV,"8 bits",2);
	htvBitmaps16=AddItemToTree(hTV,"16 bits",2);
//	htvImporter=AddItemToTree(hTV,"Importer",1);

	for (i=0;i<nbreElements;i++)
		elements[i].hti=0;

	//Lecture recursive pour les répertoires.
	do		{
		//Pour les éléments spéciaux, on les insère maintenant dans les dossiers appropriés.
		trouve=0;
		for (i=0;i<nbreElements;i++)		{
			if (elements[i].hti)
				continue;
			type=elements[i].type;
			niveau=100;

			if (type==TYPE_BITMAP8)
				hti=(HTREEITEM)htvBitmaps8;
			else if (type==TYPE_BITMAP16)
				hti=(HTREEITEM)htvBitmaps16;
			else if (type==TYPE_PALETTE)
				hti=(HTREEITEM)htvPalettes;
			else if (type==TYPE_MOSAIQUE)
				hti=(HTREEITEM)htvMosaiques;
			else if (type==TYPE_CARTE)
				hti=(HTREEITEM)htvCartes;
			else if (type==TYPE_LISTE)
				hti=(HTREEITEM)htvListes;

			if (type&TYPE_DOSSIER)		{
				type&=(~TYPE_DOSSIER);
				hti=NULL;
			}

			if (type&DANS_DOSSIER)		{
				type&=(~DANS_DOSSIER);
				for (j=0;j<nbreDossiersBase;j++)		{
					if (!strcmp(typesHTI[j].nom,elements[i].dossier))		{
						if (j==0)
							hti=NULL;
						else
							hti=*(HTREEITEM*)typesHTI[j].hti;
						goto __fini;
					}
				}

				for (j=0;j<nbreElements;j++)		{
					if (elements[j].type&TYPE_DOSSIER)		{
						if (!strcmp(elements[i].dossier,elements[j].nom_court))		{
							hti=elements[j].hti;
							break;
						}
					}
				}
				if (!hti)
					continue;
__fini:
				;
			}

			trouve++;
			elements[i].hti=InsereObjDansArbre(hTV,hti,SansLeSlash(elements[i].nom_court),niveau);
		}
	} while(trouve>0);

	g_majListeEnCours = 0;
	SendMessage(hTV, WM_SETREDRAW, 1, 0);
	InvalidateRect(hTV, NULL, 0);
	TreeView_SelectItem(hTV,htvMosaiques);
}

//Constantes pour définir le coin haut/gauche dans le quel on peut commencer à écrire
//arbre du projet exclus. Faudra trouver une meilleure méthode.
#define BASEFEN_X 170
#define BASEFEN_Y 30

//Dessine la barre de titre en dégradé.
void DessTitre(HDC hdc, LPCTSTR chaine)		{
	RECT rect;
	int buf,i,r;
	BitBlt(hdcImage3,0,0,380,16,hdcImage1,0,0,SRCCOPY);
	SetTextColor(hdcImage3,RGB(255,255,255));
	SetBkMode(hdcImage3,TRANSPARENT);
	SelectObject(hdcImage3,hFonte);
	r=0;
	for (i=0;i<(signed)strlen(chaine);i++)		{
		GetCharWidth32(hdcImage3,chaine[i],chaine[i],&buf);
		r+=buf;
	}
	if (r>370)		{
		rect.left=5;
		rect.top=1;
		rect.right=375;
		rect.bottom=16;
		DrawText(hdcImage3,chaine,strlen(chaine),&rect,DT_RIGHT);
	}
	else	{
		TextOut(hdcImage3,5,1,chaine,strlen(chaine));
	}
	BitBlt(hdc,BASEFEN_X,BASEFEN_Y-20,380,16,hdcImage3,0,0,SRCCOPY);
}

/*//Dessine la barre de titre en dégradé.
void DessTitre(HDC hdc, LPCTSTR chaine)		{
	BitBlt(hdc,BASEFEN_X,BASEFEN_Y-20,380,15,hdcImage,0,0,SRCCOPY);
	SetTextColor(hdc,RGB(255,255,255));
	SetBkMode(hdc,TRANSPARENT);
	SelectObject(hdc,hFonte);
	TextOut(hdc,BASEFEN_X+5,BASEFEN_Y-19,chaine,strlen(chaine));
}*/

//Crée les contrôles nécessaires pour faire une entrée de fichier de type source et
//destination. Comme c'est parfois insuffisant, on complète ensuite.
void CreeEntreeFichier(HWND hDlg)		{
	hStatic01=CreateWindow ("Static", "Fichier source",WS_CHILD | WS_VISIBLE,
		BASEFEN_X,BASEFEN_Y,300,18, hDlg, NULL, hInst, NULL);
	SendMessage(hStatic01,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

	hTexte01=CreateWindow ("Edit", "",WS_BORDER | WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | WS_TABSTOP,
		BASEFEN_X,BASEFEN_Y+15,300,18, hDlg, NULL, hInst, NULL);
	SendMessage(hTexte01,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

	hBoutonParcourir=CreateWindow("Button", "Parcourir...",WS_CHILD | WS_VISIBLE | WS_TABSTOP,
		BASEFEN_X+310,BASEFEN_Y+15,70,18, hDlg, NULL, hInst, NULL);
	SendMessage(hBoutonParcourir,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

	hStatic02=CreateWindow ("Static", "Fichier de destination",WS_CHILD | WS_VISIBLE,
		BASEFEN_X,BASEFEN_Y+40,300,18, hDlg, NULL, hInst, NULL);
	SendMessage(hStatic02,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

	hTexte02=CreateWindow ("Edit", "",WS_BORDER | WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | WS_TABSTOP,
		BASEFEN_X,BASEFEN_Y+55,300,18, hDlg, NULL, hInst, NULL);
	SendMessage(hTexte02,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

	hBoutonParcourir2=CreateWindow("Button", "Parcourir...",WS_CHILD | WS_VISIBLE | WS_TABSTOP,
		BASEFEN_X+310,BASEFEN_Y+55,70,18, hDlg, NULL, hInst, NULL);
	SendMessage(hBoutonParcourir2,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));
}

/*------------------------------------------atox--------------------------------------*\
| Arguments:                                                                           |
|    -chn (chaîne): Chaîne contenant un nombre hexa à convertir                        |
| Retour:                                                                              |
|     (entier): Valeur entière correspondante à la chaîne hexa                         |
|--------------------------------------------------------------------------------------|
| Convertit une chaîne en nombre hexadécimal et renvoie l'entier correspondant.        |
\*-------------------------------------------------------- © 2003 Florian Brönnimann--*/

//Note: vu l'en-tête, vous ne l'auriez pas deviné, mais j'avais créé cette fonction pour
//un projet à l'école... ;)
int atox(char *chn)	{
	int i;
	int n;
	int v;
	char *deb;
	deb=chn;
	while((*chn>='0' && *chn<='9') || (*chn>='a' && *chn<='f') || (*chn>='A' && *chn<='F'))
		chn++;
	chn--;
	i=1;
	n=0;
	while(chn>=deb)	{
		v=*(chn)-48;
		if (v>=17+32)	v-=39;
		if (v>=17)		v-=7;
		n+=i*v;
		i*=16;
		chn--;
	}
	return n;
}

//Idem mais en binaire
int atob(char *chn)	{
	int i;
	int n;
	int v;
	char *deb;
	deb=chn;
	while(*chn=='0' || *chn=='1')
		chn++;
	chn--;
	i=1;
	n=0;
	while(chn>=deb)	{
		v=*(chn)-48;
		n+=i*v;
		i*=2;
		chn--;
	}
	return n;
}

void JusteChemin(char *fichier)			{
	int i;
	for (i=strlen(fichier)-1; i>=0; i--)
		if (fichier[i] == '\\')
			break;
	if (fichier[i] == '\\')
		fichier[i]=0;
}

//Cette fonction ouvre un fichier et le garde en mémoire (allez savoir pourquoi)
//Pour le contenu de type, référez-vous à la documentation Windows. Il y a juste que le
//premier caractère indique le nombre d'extensions sélectionnables...
int OuvreFichier(char *fichier, char *type)		{
	char chemin[MAX_PATH], chemin2[MAX_PATH];
	int i;
//	static char strPath[MAX_PATH];
	OPENFILENAME ofn = { sizeof(OPENFILENAME), NULL, NULL,
							 NULL, NULL,
							 0, 1, NULL, MAX_PATH, NULL, 0, chemin2,
							 TEXT("Charger un fichier"),
							 OFN_FILEMUSTEXIST|OFN_HIDEREADONLY, 0, 0,
							 NULL, 0, NULL, NULL };
	GetCurrentDirectory(MAX_PATH,chemin);
	strcpy(chemin2, fichierProjet);
	JusteChemin(chemin2);
	SetCurrentDirectory(chemin2);
	ofn.hwndOwner=gblHDlg;
	ofn.lpstrFile=fichier;
	ofn.lpstrFilter=type+1;
	ofn.nFilterIndex=*type;
	i=GetOpenFileName(&ofn);
	SetCurrentDirectory(chemin);
	return i;
}

//Cette fonction permet d'enregistrer un fichier
int SauveFichier(char *fichier, char *type)		{
	char chemin[MAX_PATH], chemin2[MAX_PATH];
	int i;
//	static char strPath[MAX_PATH];
	OPENFILENAME ofn = { sizeof(OPENFILENAME), NULL, NULL ,
							 NULL, NULL,
							 0, 1, NULL, MAX_PATH, NULL, 0, chemin2,
							 TEXT("Sauver un fichier"),
							 OFN_FILEMUSTEXIST|OFN_HIDEREADONLY, 0, 0,
							 NULL, 0, NULL, NULL };
	GetCurrentDirectory(MAX_PATH,chemin);
	strcpy(chemin2, fichierProjet);
	JusteChemin(chemin2);
	SetCurrentDirectory(chemin2);
	ofn.hwndOwner=gblHDlg;
	ofn.lpstrFile=fichier;
	ofn.lpstrFilter=type+1;
	ofn.nFilterIndex=*type;
	i=GetSaveFileName(&ofn);
	SetCurrentDirectory(chemin);
	return i;
}

void AjouteExtension(char *nom, char *ext)			{
	//Rajoute l'extension si nécessaire
	if (strcmp(nom+strlen(nom)-strlen(ext), ext) && !strstr(nom, "."))
		strcat(nom, ext);
}

//Calcule le nombre d'objets d'un type donné dans le projet.
int CalcNombreObjets(int type)			{
	int i, n;
	n=0;
	for (i=0;i<nbreElements;i++)		{
		if (((elements[i].type)&MASQUE_TYPE)==type)
			n++;
	}
	return n;
}

void AjouteTypes()		{
	SendMessage(hComboTaille,CB_ADDSTRING,0,(LPARAM)"Optimisé");
	SendMessage(hComboTaille,CB_ADDSTRING,0,(LPARAM)"128x128");
	SendMessage(hComboTaille,CB_ADDSTRING,0,(LPARAM)"256x256");
	SendMessage(hComboTaille,CB_ADDSTRING,0,(LPARAM)"512x512");
	SendMessage(hComboTaille,CB_ADDSTRING,0,(LPARAM)"1024x1024");
	SendMessage(hComboTaille,CB_SETCURSEL,0,0);
}

void AjouteTaillesBlocs()		{
	SendMessage(hComboTiles,CB_ADDSTRING,0,(LPARAM)"8x8");
	SendMessage(hComboTiles,CB_ADDSTRING,0,(LPARAM)"16x16");
	SendMessage(hComboTiles,CB_ADDSTRING,0,(LPARAM)"32x32");
	SendMessage(hComboTiles,CB_ADDSTRING,0,(LPARAM)"Perso...");
}

void AjoutePalettesTilesets()		{
	int i;
	for (i=0;i<nbreElements;i++)		{
		if (((elements[i].type)&MASQUE_TYPE)==TYPE_PALETTE)
			SendMessage(hComboPalette,CB_ADDSTRING,0,(LPARAM)elements[i].nom_court);
		else if (((elements[i].type)&MASQUE_TYPE)==TYPE_MOSAIQUE)
			SendMessage(hComboTileset,CB_ADDSTRING,0,(LPARAM)elements[i].nom_court);
	}
	SendMessage(hComboPalette,CB_SETCURSEL,0,0);
	SendMessage(hComboTileset,CB_SETCURSEL,0,0);
}

void AjouteTilesets()		{
	int i;
	for (i=0;i<nbreElements;i++)		{
		if (((elements[i].type)&MASQUE_TYPE)==TYPE_MOSAIQUE)
			SendMessage(hComboTileset,CB_ADDSTRING,0,(LPARAM)elements[i].nom_court);
	}
	SendMessage(hComboTileset,CB_SETCURSEL,0,0);
}

void AjouteModeles()		{
	int i;
	for (i=0;i<sdNbreModeles;i++)		{
		SendMessage(hComboModeles,CB_ADDSTRING,0,(LPARAM)sdParams[i].sdNomModele);
	}
	SendMessage(hComboModeles,CB_SETCURSEL,gblSdModele,0);
}

void AjouteMaps()		{
	int i;
	for (i=0;i<nbreElements;i++)		{
		if (((elements[i].type)&MASQUE_TYPE)==TYPE_CARTE || ((elements[i].type)&MASQUE_TYPE)==TYPE_LISTE)
			SendMessage(hComboMap,CB_ADDSTRING,0,(LPARAM)elements[i].nom_court);
	}
	SendMessage(hComboMap,CB_SETCURSEL,0,0);
}

void TravailEnCours()		{
#ifdef INDIQUE_TRAVAIL
	if (!hChargement)
		hChargement=CreateDialog(hInst,(LPCTSTR)IDD_CHARGEMENT,NULL,NULL);
	SetWindowPos(hChargement,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
#else
	#if defined(INDIQUE_PATIENTER)
		if (gblHDlg)		{
			HDC hdc;
			hdc=GetDC(gblHDlg);
			DessTitre(hdc,"Veuillez patienter...");
			ReleaseDC(gblHDlg,hdc);
		}
	#endif
#endif
}

void CacheTravail()		{
#ifdef INDIQUE_TRAVAIL
	ShowWindow(hChargement,SW_HIDE);
#else
	#if defined(INDIQUE_PATIENTER)
		if (gblHDlg)			{
			HDC hdc;
			hdc=GetDC(gblHDlg);
			DessTitre(hdc,cTitre);
			ReleaseDC(gblHDlg,hdc);
		}
	#endif
#endif
}

void AffTravail()		{
#ifdef INDIQUE_TRAVAIL
	ShowWindow(hChargement,SW_SHOW);
#else
	#if defined(INDIQUE_PATIENTER)
		if (gblHDlg)			{
			HDC hdc;
			hdc=GetDC(gblHDlg);
			DessTitre(hdc,"Veuillez patienter...");
			ReleaseDC(gblHDlg,hdc);
		}
	#endif
#endif
}

void TravailTermine()		{
#ifdef INDIQUE_TRAVAIL
	DestroyWindow(hChargement);
	hChargement = NULL;
#else if defined(INDIQUE_PATIENTER)
	#if defined(INDIQUE_PATIENTER)
		if (gblHDlg)		{
			HDC hdc;
			hdc=GetDC(gblHDlg);
			DessTitre(hdc,cTitre);
			ReleaseDC(gblHDlg,hdc);
		}
	#endif
#endif
}


int TrouveNiemeElement(int type, int numero)		{
	int i,n;
	n=0;
	for (i=0;i<nbreElements;i++)		{
		if (((elements[i].type)&MASQUE_TYPE)==type)
			n++;
		if (n==numero)
			break;
	}
	return i;
}

int TrouveNiemeElementCarteListe(int numero)		{
	int i,n;
	n=0;
	for (i=0;i<nbreElements;i++)		{
		if (((elements[i].type)&MASQUE_TYPE)==TYPE_CARTE || ((elements[i].type)&MASQUE_TYPE)==TYPE_LISTE)
			n++;
		if (n==numero)
			break;
	}
	return i;
}


int TrouveElement(int type, char *nom)		{
	int i,n;
	n=0;
	for (i=0;i<nbreElements;i++)		{
		if (((elements[i].type)&MASQUE_TYPE)==type)			{
			if (!strcmp(nom,elements[i].nom_court))
				return i;
		}
	}
	return -1;
}

void EffaceElement(int n)		{
	TreeView_DeleteItem(GetDlgItem(gblHDlg,IDC_PROJET),elements[n].hti);
	memmove(elements+n,elements+n+1,(MAXEL-n-1)*sizeof(ELEMENT));
	nbreElements--;
}

void GereBarresDefil(HWND hDlg)		{
	SCROLLINFO si;
	si.cbSize=sizeof(si);
	si.fMask=SIF_PAGE|SIF_POS|SIF_RANGE;
	si.nPage=256;
	si.nPos=0;
	si.nMin=0;
	if (tailleX>256)		{
		si.nMax=tailleX;
		hStatic04=CreateWindow ("ScrollBar", "",WS_CHILD | WS_VISIBLE | SBS_HORZ,
			BASEFEN_X,BASEFEN_Y+256,256,16, hDlg, NULL, hInst, NULL);
		SetScrollInfo(hStatic04,SB_CTL,&si,1);
	}
	if (tailleY>256)		{
		si.nMax=tailleY;
		hStatic05=CreateWindow ("ScrollBar", "",WS_CHILD | WS_VISIBLE | SBS_VERT,
			BASEFEN_X+256,BASEFEN_Y,16,256, hDlg, NULL, hInst, NULL);
		SetScrollInfo(hStatic05,SB_CTL,&si,1);
	}
	scrollX=0, scrollY=0;
}

void AjouteAuProjetRapide(ELEMENT el)		{
	CopieElement(elements[nbreElements],el);
	nbreElements++;
}

void EffaceElementArbre(int n)		{
	TreeView_DeleteItem(GetDlgItem(gblHDlg,IDC_PROJET),elements[n].hti);
	elements[n].hti = NULL;
}

//i: no de l'élément
void AjouteElementArbre(int i)			{
	HTREEITEM hti;
	int type, niveau, j;

	type=elements[i].type;
	niveau=100;

	if (type==TYPE_BITMAP8)
		hti=(HTREEITEM)htvBitmaps8;
	else if (type==TYPE_BITMAP16)
		hti=(HTREEITEM)htvBitmaps16;
	else if (type==TYPE_PALETTE)
		hti=(HTREEITEM)htvPalettes;
	else if (type==TYPE_MOSAIQUE)
		hti=(HTREEITEM)htvMosaiques;
	else if (type==TYPE_CARTE)
		hti=(HTREEITEM)htvCartes;
	else if (type==TYPE_LISTE)
		hti=(HTREEITEM)htvListes;

	if (type&TYPE_DOSSIER)		{
		type&=(~TYPE_DOSSIER);
		hti=NULL;
	}

	if (type&DANS_DOSSIER)		{
		type&=(~DANS_DOSSIER);
		for (j=0;j<nbreDossiersBase;j++)		{
			if (!strcmp(typesHTI[j].nom,elements[i].dossier))		{
				if (j==0)
					hti=NULL;
				else
					hti=*(HTREEITEM*)typesHTI[j].hti;
				goto __fini;
			}
		}
		for (j=0;j<nbreElements;j++)		{
			if (elements[j].type&TYPE_DOSSIER)		{ 
				if (!strcmp(elements[i].dossier,elements[j].nom_court))		{
					hti=elements[j].hti;
					break;
				}
			}
		}
		if (!hti)
			return;
__fini:
		;
	}

	elements[i].hti=InsereObjDansArbre(hTV,hti,SansLeSlash(elements[i].nom_court),niveau);
}

void VerifieNexistePasDeja(ELEMENT *el,  int bReuseIdenticalFiles)			{
	char nom[MAX_PATH], nombase[MAX_PATH], temp[MAX_PATH];
	int valeur=2, i, j;

	strcpy(nom, el->nom_court);
	strcpy(nombase, el->nom_court);
	j=0;
	for (i=strlen(nombase)-1; i>=0 && j<8; i--)			{
		if (nombase[i]<'0' || nombase[i]>'9')		{
			i++;
			break;
		}
		j++;
	}
	valeur=atoi(nombase+i);
	if (valeur==0)
		valeur=2;
	nombase[i]=0;

redo:
	for (i=0;i<nbreElements;i++)		{
		if (((elements[i].type&MASQUE_TYPE)==(el->type&MASQUE_TYPE)) && !strcmp(elements[i].nom_court, nom))		{
			//Strictement identiques?
			if (bReuseIdenticalFiles && ((elements[i].type)&MASQUE_TYPE)==((el->type)&MASQUE_TYPE) && strcmp(elements[i].nom_fichier, el->nom_fichier)==0)		{
				break;
			}
			else	{
				//Non -> création d'un nouvel élément avec un nom différent
				sprintf(temp, "%i", valeur);
				if (strlen(temp)+strlen(nombase) >= sizeof(el->nom_court)-1)
					nombase[sizeof(el->nom_court)-1-strlen(temp)]=0;
				sprintf(nom, "%s%s", nombase, temp);
				valeur++;
				goto redo;
			}
		}
	}
	strcpy(el->nom_court, nom);
}

void AjouteAuProjet(ELEMENT el)		{
	int i;
	int type, trouveMemeNomMemeType, dejaRedo;

/*	for (i=0;i<nbreElements;i++)		{
		if (((elements[i].type)&MASQUE_TYPE)==((el.type)&MASQUE_TYPE) && strcmp(elements[i].nom_fichier,el.nom_fichier)==0)		{
			if (strcmp(elements[i].nom_court,el.nom_court)==0)		{
				if (el.type&DANS_DOSSIER)		{
					if (strcmp(elements[i].dossier,el.dossier)==0)
						break;
				}
				else
					break;
			}
		}
	}*/

	dejaRedo=0;

redo:
	trouveMemeNomMemeType = FALSE;
	for (i=0;i<nbreElements;i++)		{
		if (strcmp(elements[i].nom_court,el.nom_court)==0)		{
			if (((elements[i].type)&MASQUE_TYPE)==((el.type)&MASQUE_TYPE))			{
				trouveMemeNomMemeType = TRUE;
				if (strcmp(elements[i].nom_fichier,el.nom_fichier)==0)		{
					if (el.type&DANS_DOSSIER)		{
						if (strcmp(elements[i].dossier,el.dossier)==0)
							break;
					}
					else
						break;
				}
			}
		}
	}

	if (i<nbreElements)		{
		CopieElement(el,elements[i]);
		EffaceElement(i);
	}
	else if (trouveMemeNomMemeType)		{
		//Même nom court, mais différentes propriétés -> trouve un nouveau nom
		VerifieNexistePasDeja(&el, TRUE);
		if (!dejaRedo)		{
			dejaRedo=1;
			goto redo;
		}
	}

//	VerifieNexistePasDeja(&el);

	CopieElement(elements[nbreElements],el);
	i=nbreElements;
	type=(elements[i].type&MASQUE_TYPE);
	if (dossierParDefaut[type][0] && !(elements[i].type&DANS_DOSSIER))		{
		elements[i].type|=DANS_DOSSIER;
		strcpy(elements[i].dossier,dossierParDefaut[type]);
	}

	AjouteElementArbre(i);
/*	type=elements[i].type;
	niveau=100;

	if (type==TYPE_BITMAP8)
		hti=(HTREEITEM)htvBitmaps8;
	else if (type==TYPE_BITMAP16)
		hti=(HTREEITEM)htvBitmaps16;
	else if (type==TYPE_PALETTE)
		hti=(HTREEITEM)htvPalettes;
	else if (type==TYPE_MOSAIQUE)
		hti=(HTREEITEM)htvMosaiques;
	else if (type==TYPE_CARTE)
		hti=(HTREEITEM)htvCartes;
	else if (type==TYPE_LISTE)
		hti=(HTREEITEM)htvListes;

	if (type&TYPE_DOSSIER)		{
		type&=(~TYPE_DOSSIER);
		hti=NULL;
	}

	if (type&DANS_DOSSIER)		{
		type&=(~DANS_DOSSIER);
		for (j=0;j<nbreDossiersBase;j++)		{
			if (!strcmp(typesHTI[j].nom,elements[i].dossier))		{
				if (j==0)
					hti=NULL;
				else
					hti=*(HTREEITEM*)typesHTI[j].hti;
				goto __fini;
			}
		}
		for (j=0;j<nbreElements;j++)		{
			if (elements[j].type&TYPE_DOSSIER)		{ 
				if (!strcmp(elements[i].dossier,elements[j].nom_court))		{
					hti=elements[j].hti;
					break;
				}
			}
		}
		if (!hti)
			return;
__fini:
		;
	}

	elements[i].hti=InsereObjDansArbre(hTV,hti,SansLeSlash(elements[i].nom_court),niveau);*/

	nbreElements++;
}

enum {OM_OUVRIR=1,OM_EDITER,OM_DUPLIQUER,OM_RENOMMER,OM_SUPPRIMER,OM_BMPBASE,OM_SUPPRIMERDOSSIER,OM_PROPRIETES};

int affMenu(HWND hWnd, ELEMENT *el)	{
	HMENU hmenu, hpopup;
	int choix,i;
	POINT pt;

	GetCursorPos(&pt);
	hmenu=CreatePopupMenu();

	if (el->type&TYPE_DOSSIER)		{
		hpopup=CreatePopupMenu();
		for (i=1;i<nbreDossiersBase;i++)		{
			if (i!=4)	{		//Ne pas proposer "bitmaps"
				if (!strcmp(dossierParDefaut[typesHTI[i].type], el->nom_court))
					AppendMenu(hpopup,MF_STRING|MF_CHECKED,32+i,noms_dossiers_base[i]);
				else
					AppendMenu(hpopup,MF_STRING,32+i,noms_dossiers_base[i]);
			}
		}

		AppendMenu(hmenu,MF_STRING|MF_POPUP,(unsigned int)hpopup,"Dossier par défaut pour...");
		AppendMenu(hmenu,MF_STRING,OM_RENOMMER,"Renommer");
		AppendMenu(hmenu,MF_STRING,OM_SUPPRIMERDOSSIER,"Supprimer");
	}
	else	{
	//	AppendMenu(hmenu,MF_STRING|MF_DISABLED,0,"Menu");
	//	AppendMenu(hmenu,MF_SEPARATOR,0,NULL);
		if (FichierExiste(el->nom_fichier))
			AppendMenu(hmenu,MF_STRING,OM_OUVRIR,"Voir le code");
		else
			AppendMenu(hmenu,MF_STRING|MF_GRAYED,OM_OUVRIR,"Fichier non-trouvé");

		if ((el->type&MASQUE_TYPE)==TYPE_CARTE)			{
			AppendMenu(hmenu,MF_STRING,OM_EDITER,"Editer");
		}
		if (FichierExiste(el->nom_base))
			AppendMenu(hmenu,MF_STRING,OM_BMPBASE,"Fichier base");

		AppendMenu(hmenu,MF_SEPARATOR,0,0);
		AppendMenu(hmenu,MF_STRING,OM_DUPLIQUER,"Dupliquer");
		AppendMenu(hmenu,MF_STRING,OM_RENOMMER,"Renommer\t   F2");
		AppendMenu(hmenu,MF_STRING,OM_SUPPRIMER,"Supprimer\t   Suppr");
		AppendMenu(hmenu,MF_STRING,OM_PROPRIETES,"Propriétés");
	}

	choix=TrackPopupMenu(hmenu,TPM_LEFTALIGN | TPM_RETURNCMD | TPM_RIGHTBUTTON,pt.x,pt.y,0,hWnd,NULL);
	DestroyMenu(hmenu);

	if (choix>=32 && choix<=32+nbreDossiersBase)		{
		//Déjà le même?
		if (!strcmp(dossierParDefaut[typesHTI[choix-32].type],el->nom_court))
			//Supprime
			strcpy(dossierParDefaut[typesHTI[choix-32].type], "");
		else
			strcpy(dossierParDefaut[typesHTI[choix-32].type],el->nom_court);
		return -1;
	}
	return choix;
}

int affMenuRestaure(HWND hWnd, HTREEITEM hti)	{
	HMENU hmenu;
	int choix, i,j;
	POINT pt;
	char str[1000];

	GetCursorPos(&pt);
	hmenu=CreatePopupMenu();

	if (hti==htvCartes)
		i=TYPE_CARTE;
	else if (hti==htvMosaiques)
		i=TYPE_MOSAIQUE;
	else if (hti==htvBitmaps8)
		i=TYPE_BITMAP8;
	else if (hti==htvBitmaps16)
		i=TYPE_BITMAP16;
	else if (hti==htvPalettes)
		i=TYPE_PALETTE;
	else if (hti==htvListes)
		i=TYPE_LISTE;
	else		{
		TreeView_SelectItem(hArbre,hti);
		return -1;
	}

	if (dossierParDefaut[i][0])		{
		AppendMenu(hmenu,MF_STRING,1,"Restaurer le dossier par défaut");
		AppendMenu(hmenu,MF_STRING,2,"Restaurer tous les dossiers");
		AppendMenu(hmenu,MF_SEPARATOR,0,NULL);
		sprintf(str,"Dossier courant: %s",dossierParDefaut[i]);
		AppendMenu(hmenu,MF_STRING|MF_DISABLED,0,str);
	}
	else	{
		for (j=0;j<nbreDossiersBase;j++)		{
			if (dossierParDefaut[j][0])		{
				AppendMenu(hmenu,MF_STRING,2,"Restaurer tous les dossiers");
				AppendMenu(hmenu,MF_SEPARATOR,0,NULL);
				break;
			}
		}
		AppendMenu(hmenu,MF_STRING|MF_CHECKED|MF_DISABLED,0,"Dossier Ok");
	}

	choix=TrackPopupMenu(hmenu,TPM_LEFTALIGN | TPM_RETURNCMD | TPM_RIGHTBUTTON,pt.x,pt.y,0,hWnd,NULL);

	if (choix==1)
		strcpy(dossierParDefaut[i],"");
	else if (choix==2)		{
		for (i=0;i<nbreDossiersBase;i++)
			strcpy(dossierParDefaut[i],"");
	}

	DestroyMenu(hmenu);
	return -1;
}

void SupprimeDossierVirtuel (int i)			{
	int k;
	for (k=0;k<nbreElements;k++)		{
		if (!strcmp(elements[k].dossier,elements[i].nom_court))			{
			if (elements[k].type & TYPE_DOSSIER)
				SupprimeDossierVirtuel(k);
			else		{
				strcpy(elements[k].dossier, "");
				elements[k].type &= ~DANS_DOSSIER;
			}
		}
	}
	EffaceElement(i);
}


//Gère le clic droit de la souris sur un élément de l'arbre
void GereBoutonDroit(HTREEITEM hti)		{
	int i,j,k, bMaj;
	FILE *f;

	for (i=0;i<nbreElements;i++)
		if (elements[i].hti==hti)
			break;

/*	if (i==nbreElements)		{
		TreeView_SelectItem(hArbre,hti);
		return;
	}*/
//	if (elements[i].type&TYPE_DOSSIER)
//		return;

	if (i==nbreElements)
		j=affMenuRestaure(gblHDlg,hti);
	else
		j=affMenu(gblHDlg,&elements[i]);

	if (j==OM_OUVRIR)		{
		sprintf(str,"notepad \"%s\"",elements[i].nom_fichier);
		WinExec(str,1);
	}
	else if (j==OM_SUPPRIMER)		{
		f=fopen(elements[i].nom_fichier,"rb");
		if (f)		{
			j = fMsgBox(gblHDlg, "Question", MB_ICONINFORMATION|MB_YESNOCANCEL|MB_DEFBUTTON2, "Supprimer l'élément définitivement, le fichier associé (%s) compris?", elements[i].nom_fichier);
			fclose(f);
		}
		else
			j=IDNO;
		if (j!=IDCANCEL)		{
			if (j==IDYES)
				EffaceVersCorbeille(elements[i].nom_fichier);
			EffaceElement(i);
		}
	}
	else if (j==OM_SUPPRIMERDOSSIER)		{
		bMaj = FALSE;
		for (k=0;k<nbreElements;k++)		{
			if (!strcmp(elements[k].dossier,elements[i].nom_court))
				break;
		}
		if (k<nbreElements)		{
			if (MessageBox(gblHDlg,"Ce dossier n'est pas vide! Vous devriez d'abord supprimer les éléments qui s'y trouvent!\nVoulez-vous VRAIMENT le supprimer?","Attention!",MB_ICONEXCLAMATION|MB_YESNO|MB_DEFBUTTON2)==IDNO)
				return;
			bMaj = TRUE;
			SupprimeDossierVirtuel(i);
		}
		else
			EffaceElement(i);
		if (bMaj)
			MajListe(gblHDlg);
	}
	else if (j==OM_DUPLIQUER)		{
		ELEMENT elCourant;
//		char nom[MAX_PATH];
//		HWND hEdit;

		k=i;
		CopieElement(elCourant, elements[i]);
/*		elCourant.nom_court[sizeof(elCourant.nom_court)-3]=0;
		strcpy(nom, elCourant.nom_court);
		for (j=1;j<=99;j++)		{
			sprintf(elCourant.nom_court, "%s%i", nom, j);
			for (i=0;i<nbreElements;i++)		{
				if (((elements[i].type)&MASQUE_TYPE)==((elCourant.type)&MASQUE_TYPE) && strcmp(elements[i].nom_court,elCourant.nom_court)==0)
					break;
			}
			if (i>=nbreElements)
				break;
		}*/
		//Trouve un nouveau nom pour l'élément dupliqué
		VerifieNexistePasDeja(&elCourant, FALSE);
		AjouteAuProjet(elCourant);
		if (nbreElements>0)		{
			TreeView_EditLabel(hArbre,elements[nbreElements-1].hti);
			bEtatDupliqueElement = k+1;
/*			hEdit = TreeView_GetEditControl(hArbre);
			SetWindowText(hEdit, nom);
			SendMessage(hEdit, EM_SETSEL, 0, -1);*/
		}
	}
	else if (j==OM_PROPRIETES)		{
		DialogBoxParam(hInst, (LPCTSTR)IDD_ATTRIBUTSELEMENT, gblHDlg, (DLGPROC)DlgAttributsElement, i);
	}
	else if (j==OM_RENOMMER)		{
		TreeView_EditLabel(hArbre,hti);
	}
	else if (j==OM_EDITER)		{
		Editer=TRUE;
		DessFenetre(gblHDlg,hti);
		DessFenetre(gblHDlg,hti);
	}
	else if (j==OM_BMPBASE)		{
		GetCurrentDirectory(sizeof(str), str);
		ShellExecute(gblHDlg, "open", elements[i].nom_base, "", str, SW_SHOW);
//		sprintf(str,"mspaint \"%s\"",elements[i].nom_base);
//		WinExec(str,1);
	}
}


void DessineBlocArrondi()		{
	int i;
	for (i=0;i<=2;i++)		{
		SetPixel(hdcImage1,i,0,cFond);
		SetPixel(hdcImage1,0,i,cFond);
		SetPixel(hdcImage1,379-i,0,cFond);
		SetPixel(hdcImage1,379,i,cFond);
		SetPixel(hdcImage1,i,15,cFond);
		SetPixel(hdcImage1,0,15-i,cFond);
		SetPixel(hdcImage1,379-i,15,cFond);
		SetPixel(hdcImage1,379,15-i,cFond);
	}
}

void LitComboTiles()		{
	int i;
	i=SendMessage(hComboTiles,CB_GETCURSEL,0,0);

	if (i==0)
		tileX=tileY=8;
	else if (i==1)
		tileX=tileY=16;
	else if (i==2)
		tileX=tileY=32;
}

//Crée un nom court depuis un nom de fichier. Par exemple:
//"C:\HAM\Tools\Salut.bmp" devient "Salut".
void faitNomCourt(char *nom_dest,char *nom_court)		{
	int i;
	for (i=strlen(nom_dest)-1;i>0;i--)
		if (nom_dest[i]=='\\')
			break;
	if (i<=0)
		i=-1;
	if (strlen(nom_dest+i+1)>=30)		{
		memcpy(nom_court,nom_dest+i+1,30);
		nom_court[sizeof(elements->nom_court)-1]=0;
	}
	else
		strcpy(nom_court,nom_dest+i+1);
	for (i=0;i<(signed)strlen(nom_court);i++)
		if (nom_court[i]=='.')		{
			nom_court[i]=0;
			break;
		}
}

void LitNomBase(char *nom_fichier, char *nom_base)		{
	FILE *f;
	f=fopen(nom_fichier,"r");
	if (!f)		{
		strcpy(nom_base,nom_fichier);
		return;
	}
	fgets(nom_base,1000,f);
	nom_base[strlen(nom_base)-1]=0;
	memmove(nom_base,nom_base+2,998);
}


void AidePerso()		{
	if (!FichierExiste(fichierAide))		{
		MessageBox(gblHDlg,"Vous tentez d'accéder au fichier d'aide perso qui n'existe pas.\nCe fichier sert à mettre des informations à lire pour le projet dans lequel se trouve GBA Graphics.\nEn clair, vous y mettez ce que vous voulez indépendamment de la doc.\nPar défaut, il s'appelle lisezmoi.htm",fichierAide,MB_ICONINFORMATION);
	}
	else	{
		ShellExecute(gblHDlg, NULL, fichierAide, NULL, NULL, SW_SHOWNORMAL);
	}
}

char NomC[MAX_PATH];
void FaitNomC(char *nom)		{
	char *dst=NomC;
	char *src=nom;

	while(*nom)	{
		if (*nom=='\\')
			src=nom+1;
		nom++;
	}

	nom=src;
	while(*nom)		{
		if ((*nom>='A' && *nom<='Z') || (*nom>='a' && *nom<='z') || *nom=='_')
			*dst++=*nom;
		else if (*nom>='0' && *nom<='9' && dst>NomC)
			*dst++=*nom;
		else if (*nom==' ')
			*dst++='_';
		nom++;
	}
	*dst=0;
}

int VerifConditions(int i, int fond, int gfxmask)		{
	int t;
	if (n_conditions[fond])		{
		for (t=0;t<n_conditions[fond];t++)		{
			if (i>=(int)s_conditions[fond][t].debut && i<=(int)s_conditions[fond][t].fin)		{
				if (s_conditions[fond][t].exact)
					i=s_conditions[fond][t].debut-s_conditions[fond][t].difference;
				else
					i-=s_conditions[fond][t].difference;
				return i;
			}
		}
	}
	return i&gfxmask;
}

void VerifNomVar (char *nom_defaut, char *type)			{
	//Pas de nom entré?
	if (!type[0])
		strcpy (type, nom_defaut);
/*	if (!chneNomVarB16[0])
		strcpy (chneNomVarB16, nom_defaut);
	if (!chneNomVarB8[0])
		strcpy (chneNomVarB8, nom_defaut);
	if (!chneNomVarPal[0])
		strcpy (chneNomVarPal, nom_defaut);
	if (!chneNomVarTil[0])
		strcpy (chneNomVarTil, nom_defaut);
	if (!chneNomVarMap[0])
		strcpy (chneNomVarMap, nom_defaut);*/
}

void ChangeTousNomVar(char *nom_defaut)		{
	strcpy (chneNomVarB16, nom_defaut);
	strcpy (chneNomVarB8, nom_defaut);
	strcpy (chneNomVarPal, nom_defaut);
	strcpy (chneNomVarTil, nom_defaut);
	strcpy (chneNomVarMap, nom_defaut);
}

void AnnuleNomVar ()		{
	chneNomVarB16[0]=0;
	chneNomVarB8[0]=0;
	chneNomVarPal[0]=0;
	chneNomVarTil[0]=0;
	chneNomVarMap[0]=0;
}

LRESULT CALLBACK DlgTiles(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK DlgOperations(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK DlgDeplace(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
void ExecScript(FILE *f, char *fonction);
LRESULT CALLBACK DlgLier(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
void FctLieMap(char *ptr);
LRESULT CALLBACK DlgExec(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK DlgCouleurs(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
void CreeCouleurs();
LRESULT CALLBACK DlgBits(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
void SetBits(int valeur);
void *BufferActif();
LRESULT CALLBACK DlgAttributs(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
void MajFichierParams();
char *GetBoolText(int valeur);
int GetParamOffset(int nParam);

void Console_Print(const char *format, ...);
void Console_Print_Simple(const char *format, ...);
void AjoutePlanSpecimen(int i);

#include "classes.h"
#include "tooltips.h"

void Dialog_SetInt(HWND hDlg, int ID, int valeur)		{
	sprintf(str, "%i", valeur);
	SetDlgItemText(hDlg, ID, str);
}

int Dialog_GetInt(HWND hDlg, int ID)		{
	GetDlgItemText(hDlg, ID, str,sizeof(str));
	return atoi(str);
}

void Dialog_SetBool(HWND hDlg, int ID, BOOL valeur)		{
	SendDlgItemMessage(hDlg,ID,BM_SETCHECK,(valeur?BST_CHECKED:BST_UNCHECKED),0);
}

BOOL Dialog_GetBool(HWND hDlg, int ID)		{
	return (SendDlgItemMessage(hDlg,ID,BM_GETCHECK,0,0)==BST_CHECKED);
}

void Dialog_SetText(HWND hDlg, int ID, char *texte)		{
	SetDlgItemText(hDlg, ID, texte);
}

char *Dialog_GetText(HWND hDlg, int ID)		{
	GetDlgItemText(hDlg, ID, str, sizeof(str));
	return str;
}

void Combo_AddItem(HWND hDlg, int ID, char *objet)			{
	SendDlgItemMessage(hDlg, ID, CB_ADDSTRING, 0, (LPARAM)objet);
}

int Combo_GetValue(HWND hDlg, int ID)			{
	return SendDlgItemMessage(hDlg, ID, CB_GETCURSEL, 0, 0);
}

void Combo_SetValue(HWND hDlg, int ID, int valeur)			{
	SendDlgItemMessage(hDlg, ID, CB_SETCURSEL, valeur, 0);
}

int EffaceVersCorbeille(char *nom_fichier)
{
	char filename[MAX_PATH+1], chemin[MAX_PATH];
	SHFILEOPSTRUCT FileOpStr;
	ZeroMemory(&FileOpStr, sizeof(FileOpStr));
	FileOpStr.hwnd = gblHDlg;
	FileOpStr.fFlags = FOF_ALLOWUNDO | FOF_NOERRORUI /*| FOF_SILENT*/ | FOF_NOCONFIRMATION;
	FileOpStr.wFunc = FO_DELETE;

	GetFullPathName(nom_fichier, sizeof(chemin), chemin, NULL);

	memset(filename, 0, sizeof(filename));
	strcpy(filename, chemin);
	FileOpStr.pFrom = filename;
	return SHFileOperation(&FileOpStr);
}


