#define MAX_ONGLETS 10
int ongletsNombre=0;
int onglets_bThemeActive=0;
HBRUSH onglets_hBrush=NULL;
HWND onglets_wndTab=NULL;
HWND onglets_hDialogs[MAX_ONGLETS];
LRESULT CALLBACK DlgProprietesFondGeneral(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK DlgProprietesFondConditions(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK DlgProprietesFondBits(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK DlgOptionsGenerales(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK DlgOptionsParametres(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK DlgCouleurs2(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK DlgProprietesFondAvance(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK DlgProprietesFond(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);

LRESULT OnCtlColor(UINT /* uMsg */, WPARAM wParam, 
     LPARAM lParam, BOOL& /* bHandled */) throw()
{
    if (onglets_bThemeActive)
    {
        RECT rc;

        // Set the background mode to transparent
        SetBkMode((HDC)(wParam), TRANSPARENT);

        // Get the controls window dimensions
        GetWindowRect((HWND)(lParam), &rc);

        // Map the coordinates to coordinates with the upper
        // left corner of dialog control as base
        MapWindowPoints(NULL, onglets_wndTab, (LPPOINT)(&rc), 2);

        // Adjust the position of the brush for this control
        // (else we see the top left of the brush as background)
        SetBrushOrgEx((HDC)(wParam), -rc.left, -rc.top, NULL);

        // Return the brush
        return (LRESULT)(onglets_hBrush);
    }

    return FALSE;
}

void UpdateBackgroundBrush() throw()
{
    HMODULE hinstDll;

    // Check if the application is themed
    hinstDll = LoadLibrary("UxTheme.dll");
	onglets_bThemeActive = 0;
    if (hinstDll)
    {
        typedef BOOL (*ISAPPTHEMEDPROC)();
        ISAPPTHEMEDPROC pIsAppThemed;
        pIsAppThemed = 
          (ISAPPTHEMEDPROC) GetProcAddress(hinstDll, "IsAppThemed");

        if(pIsAppThemed)
            onglets_bThemeActive = pIsAppThemed();

        FreeLibrary(hinstDll);
    }

    // Destroy old brush
    if (onglets_hBrush)
        DeleteObject(onglets_hBrush);

    onglets_hBrush = NULL;

    // Only do this if the theme is active
    if (onglets_bThemeActive)
    {
        RECT rc;

        // Get tab control dimensions
        GetWindowRect(onglets_wndTab, &rc);

        // Get the tab control DC
        HDC hDC = GetDC(onglets_wndTab);

        // Create a compatible DC
        HDC hDCMem = CreateCompatibleDC(hDC);
        HBITMAP hBmp = CreateCompatibleBitmap(hDC, 
               rc.right - rc.left, rc.bottom - rc.top);
        HBITMAP hBmpOld = (HBITMAP)(SelectObject(hDCMem, hBmp));

        // Tell the tab control to paint in our DC
        SendMessage(onglets_wndTab, WM_PRINTCLIENT, (WPARAM)(hDCMem), 
           (LPARAM)(PRF_ERASEBKGND | PRF_CLIENT | PRF_NONCLIENT));

        // Create a pattern brush from the bitmap selected in our DC
        onglets_hBrush = CreatePatternBrush(hBmp);

        // Restore the bitmap
        SelectObject(hDCMem, hBmpOld);

        // Cleanup
        DeleteObject(hBmp);
        DeleteDC(hDCMem);
        ReleaseDC(onglets_wndTab, hDC);
    }
}

void SizeDialog(HWND htab, HWND parhwnd, HWND hdlg) 
{
		const int offsX=6, offsY=6, offsL=12, offsH=40;
        RECT rect; 
        GetClientRect(parhwnd,&rect); 
        MoveWindow(htab, offsX, offsY, rect.right-offsX-offsL,rect.bottom-offsY-offsH, 
         TRUE);
        TabCtrl_AdjustRect(htab,FALSE,&rect); 
        MoveWindow(hdlg, rect.left+offsX, rect.top+offsY, 
         rect.right - rect.left -offsX-offsL,rect.bottom-rect.top-offsY-offsH, 
         TRUE);
        ShowWindow(hdlg,SW_SHOWNORMAL); 
}


void onglets_AjouteOnglet(HWND hWndParent, char *nomOnglet, LPCTSTR dialogue, DLGPROC procedure)			{
	TC_ITEM tie;
	tie.mask = TCIF_TEXT;
	tie.iImage = -1;
	tie.pszText = nomOnglet;
	TabCtrl_InsertItem(onglets_wndTab, ongletsNombre, &tie);
	onglets_hDialogs[ongletsNombre]=CreateDialog(hInst, dialogue, hWndParent, procedure);
//	SetParent(onglets_hDialogs[ongletsNombre], onglets_wndTab);
//	SetParent(onglets_hDialogs[ongletsNombre], hWndParent);
	SizeDialog(onglets_wndTab, hWndParent, onglets_hDialogs[ongletsNombre]);
	if (ongletsNombre >= 1)
		ShowWindow(onglets_hDialogs[ongletsNombre], SW_HIDE);
	ongletsNombre++;
}

void onglets_AjouteOngletInvisible(HWND hWndParent, char *nomOnglet, LPCTSTR dialogue, DLGPROC procedure)			{
	onglets_hDialogs[ongletsNombre]=CreateDialog(hInst, dialogue, hWndParent, procedure);
//	SetParent(onglets_hDialogs[ongletsNombre], onglets_wndTab);
//	SetParent(onglets_hDialogs[ongletsNombre], hWndParent);
	SizeDialog(onglets_wndTab, hWndParent, onglets_hDialogs[ongletsNombre]);
	if (ongletsNombre >= 1)
		ShowWindow(onglets_hDialogs[ongletsNombre], SW_HIDE);
	ongletsNombre++;
}


LRESULT CALLBACK DlgOptionsGeneralesOnglets(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	static HWND hWnd, hTab;
	static HWND hDialog[2];
	int i, j;
	LPNMHDR pnmh;

	switch (message)
	{

		case WM_INITDIALOG:
			SetWindowText(hDlg, "Options");
			ongletsNombre=0;
			onglets_wndTab = GetDlgItem(hDlg, IDC_TAB1);
			onglets_AjouteOnglet(hDlg, "General", (LPCTSTR)IDD_OPTIONSGENERALES, (DLGPROC)DlgOptionsGenerales);
			onglets_AjouteOnglet(hDlg, "Conversion", (LPCTSTR)IDD_COULEURS, (DLGPROC)DlgCouleurs);
			onglets_AjouteOnglet(hDlg, "Modèles", (LPCTSTR)IDD_OPTIONSGENERALESPARAMS, (DLGPROC)DlgOptionsParametres);
			onglets_AjouteOngletInvisible(hDlg, "Conversion (+1)", (LPCTSTR)IDD_COULEURS2, (DLGPROC)DlgCouleurs2);
			SetFocus(onglets_hDialogs[0]);
			break;

		case WM_NOTIFY:
			pnmh = (LPNMHDR) lParam;
			switch (pnmh->code)		{
				case TCN_SELCHANGE:
					i=TabCtrl_GetCurSel(onglets_wndTab);
					if (i==2 && gblHEdit)		{
						MessageBox(hDlg, "Impossible de travailler sur les paramètres lorsque l'éditeur est ouvert. Veuillez d'abord le fermer.", "Erreur", MB_ICONEXCLAMATION);
						i=-1;
					}
showwindow:
					for (j=0;j<ongletsNombre;j++)		{
						if (i==j)
							ShowWindow(onglets_hDialogs[j], SW_SHOW);
						else
							ShowWindow(onglets_hDialogs[j], SW_HIDE);
					}
					break;
			}
			break;

		case WM_SIZE:
/*			hTab = GetDlgItem(hDlg, IDC_TAB1);
			SizeDialog(hTab, hDlg, hWnd);*/
			break;

		case WM_COMMAND:
			if (LOWORD(wParam) == IDC_AVANCE)		{
				i=TabCtrl_GetCurSel(onglets_wndTab);
				//Onglet du milieu
				if (i==1)		{
					//Sélectionne la troisième page, normalement invisible
					i=3;
					goto showwindow;
				}
			}
			if (LOWORD(wParam) == IDC_AVANCEFINI)		{
				i=TabCtrl_GetCurSel(onglets_wndTab);
				//Onglet du milieu
				if (i==1)		{
					//Sélectionne la page par défaut
					goto showwindow;
				}
			}
			if (LOWORD(wParam) == IDC_REFRESH)
			{
				for (i=0;i<ongletsNombre;i++)
					SendMessage(onglets_hDialogs[i], WM_COMMAND, MAKEWPARAM(IDC_REFRESH, 0), lParam);
				return TRUE;
			}
			if (LOWORD(wParam) == IDOK)
			{
				for (i=0;i<ongletsNombre;i++)
					SendMessage(onglets_hDialogs[i], WM_COMMAND, MAKEWPARAM(IDOK, 0), 0);
				EndDialog(hDlg, LOWORD(wParam));
				return TRUE;
			}
			if (LOWORD(wParam) == IDCANCEL)
			{
				for (i=0;i<ongletsNombre;i++)
					SendMessage(onglets_hDialogs[i], WM_COMMAND, MAKEWPARAM(IDCANCEL, 0), 0);
				EndDialog(hDlg, LOWORD(wParam));
				return TRUE;
			}
			break;
	}
    return FALSE;
}

LRESULT CALLBACK DlgOptionsEditeurOnglets(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	int i, j;
	LPNMHDR pnmh;

	switch (message)
	{

		case WM_INITDIALOG:
			SetWindowText(hDlg, "Options");
			ongletsNombre=0;
			onglets_wndTab = GetDlgItem(hDlg, IDC_TAB1);
			onglets_AjouteOnglet(hDlg, "Raccourcis", (LPCTSTR)IDD_OPTIONSEDITEUR, (DLGPROC)ProcOptions);
			onglets_AjouteOnglet(hDlg, "Fonds", (LPCTSTR)IDD_OPTIONSEDITEUR2, (DLGPROC)ProcOptions2);
			onglets_AjouteOnglet(hDlg, "Affichage", (LPCTSTR)IDD_OPTIONSEDITEUR3, (DLGPROC)ProcOptions3);
			onglets_AjouteOnglet(hDlg, "Spécimen", (LPCTSTR)IDD_OPTIONSEDITEUR4, (DLGPROC)ProcOptions4);
			SetFocus(onglets_hDialogs[0]);
			break;

		case WM_NOTIFY:
			pnmh = (LPNMHDR) lParam;
			switch (pnmh->code)		{
				case TCN_SELCHANGE:
					i=TabCtrl_GetCurSel(onglets_wndTab);
					for (j=0;j<ongletsNombre;j++)		{
						if (i==j)
							ShowWindow(onglets_hDialogs[j], SW_SHOW);
						else
							ShowWindow(onglets_hDialogs[j], SW_HIDE);
					}
					break;
			}
			break;

		case WM_SIZE:
/*			hTab = GetDlgItem(hDlg, IDC_TAB1);
			SizeDialog(hTab, hDlg, hWnd);*/
			break;

		case WM_COMMAND:
			if (LOWORD(wParam) == IDOK)
			{
				for (i=0;i<ongletsNombre;i++)
					SendMessage(onglets_hDialogs[i], WM_COMMAND, MAKEWPARAM(IDOK, 0), 0);
				EndDialog(hDlg, LOWORD(wParam));
				return TRUE;
			}
			if (LOWORD(wParam) == IDCANCEL)
			{
				for (i=0;i<ongletsNombre;i++)
					SendMessage(onglets_hDialogs[i], WM_COMMAND, MAKEWPARAM(IDCANCEL, 0), 0);
				EndDialog(hDlg, LOWORD(wParam));
				return TRUE;
			}
			break;
	}
    return FALSE;
}

int gblNoFondProprietes=0;
LRESULT CALLBACK DlgOptionsFondOnglets(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	int i, j;
	LPNMHDR pnmh;
	char str[1000];

	switch (message)
	{

		case WM_INITDIALOG:
//			sprintf(str, "Propriétés du fond %s", params[gblNoFondProprietes].gblcNomC);
			sprintf(str, "Propriétés du fond %s", ele_fond[gblNoFondProprietes]->nom_court);
			SetWindowText(hDlg, str);
			ongletsNombre=0;
			onglets_wndTab = GetDlgItem(hDlg, IDC_TAB1);
			onglets_AjouteOnglet(hDlg, "Général", (LPCTSTR)IDD_OPTIONSFONDONGLETGENERAL, (DLGPROC)DlgProprietesFondGeneral);
			onglets_AjouteOnglet(hDlg, "Propriétés", (LPCTSTR)IDD_OPTIONSFOND, (DLGPROC)DlgProprietesFond);
			onglets_AjouteOnglet(hDlg, "Avancé", (LPCTSTR)IDD_OPTIONSFONDONGLETAVANCE, (DLGPROC)DlgProprietesFondAvance);
			onglets_AjouteOnglet(hDlg, "Conditions", (LPCTSTR)IDD_OPTIONSFONDONGLETCONDITIONS, (DLGPROC)DlgProprietesFondConditions);
			onglets_AjouteOnglet(hDlg, "Bits", (LPCTSTR)IDD_OPTIONSFONDONGLETBITS, (DLGPROC)DlgProprietesFondBits);
			SetFocus(onglets_hDialogs[0]);
			break;

		case WM_NOTIFY:
			pnmh = (LPNMHDR) lParam;
			switch (pnmh->code)		{
				case TCN_SELCHANGE:
					i=TabCtrl_GetCurSel(onglets_wndTab);
					for (j=0;j<ongletsNombre;j++)		{
						if (i==j)
							ShowWindow(onglets_hDialogs[j], SW_SHOW);
						else
							ShowWindow(onglets_hDialogs[j], SW_HIDE);
					}
					break;
			}
			break;

		case WM_SIZE:
/*			hTab = GetDlgItem(hDlg, IDC_TAB1);
			SizeDialog(hTab, hDlg, hWnd);*/
			break;

		case WM_COMMAND:
			if (LOWORD(wParam) == IDOK)
			{
				for (i=0;i<ongletsNombre;i++)
					SendMessage(onglets_hDialogs[i], WM_COMMAND, MAKEWPARAM(IDOK, 0), 0);
				EndDialog(hDlg, LOWORD(wParam));
				return TRUE;
			}
			if (LOWORD(wParam) == IDCANCEL)
			{
				for (i=0;i<ongletsNombre;i++)
					SendMessage(onglets_hDialogs[i], WM_COMMAND, MAKEWPARAM(IDCANCEL, 0), 0);
				EndDialog(hDlg, LOWORD(wParam));
				return TRUE;
			}
			break;
	}
    return FALSE;
}

/*LRESULT CALLBACK DlgOptionsGeneralesOngletOptions1(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
		case WM_INITDIALOG:
			return TRUE;

		case WM_SIZE:
			UpdateBackgroundBrush();
			break;

		case WM_CTLCOLORSTATIC:
			BOOL bHandled;
			return OnCtlColor(message, wParam, lParam, bHandled);

		case WM_ERASEBKGND:
			return TRUE;

		case WM_COMMAND:
			if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
			{
				EndDialog(hDlg, LOWORD(wParam));
				return TRUE;
			}
			break;
	}
    return FALSE;
}*/

void Float_VerifieDecimalesMax(char *str, int nbDecimales)			{
	char *ptr, *ptr2;
	int i;
	//Vérifie s'il y a plus de X chiffres après la virgule et les enlève
	for (ptr=str; *ptr; ptr++)		{
		if (*ptr=='.')		{
			ptr++;
			i=0;
			while(*ptr && (*ptr>='0' && *ptr<='9') && i<nbDecimales)		{
				ptr++;
				i++;
			}
			if (i>=nbDecimales)			{
				ptr2 = ptr;
				while(*ptr && (*ptr>='0' && *ptr<='9'))
					ptr++;
				i = strlen(ptr);
				memmove(ptr2, ptr, i);
				ptr2[i] = 0;
			}
		}
	}
}

void Float_TronqueZeros(char *str)			{
	char *ptr, *ptr2;
	int i;
	for (ptr=str; *ptr; ptr++)		{
		if (*ptr=='.')		{
			ptr++;
			while(*ptr && (*ptr>='0' && *ptr<='9'))
				ptr++;
			ptr2 = ptr;
			ptr--;
			while(*ptr!='.')			{
				if (*ptr!='0')
					break;
				ptr--;
			}
			if (ptr<ptr2-1)		{
				i = strlen(ptr2);
				if (*ptr!='.')
					ptr++;
				memmove(ptr, ptr2, i);
				ptr[i]=0;
			}
		}
	}
}

void Memory_IntToString(char *str, __int64 val)		{
	char *unites[5]={"o", "ko", "Mo", "Go", "To"};
	int i;
	for (i=0;i<5;i++)		{
		if (val<((__int64)1000<<(10*i)))			{
			sprintf(str, "%f %s", (float)val/(float)((__int64)1<<(10*i)), unites[i]);
			break;
		}
	}
	if (i>=5)			{
		i--;
		sprintf(str, "%i %s", (int)((float)val/(float)((__int64)1<<(10*i))), unites[i]);
	}

	//Vérifie s'il y a plus de 3 chiffres après la virgule et les enlève
	Float_VerifieDecimalesMax(str, 3);

	//Vérifie s'il n'y a que des 0 après le point et les supprime
	Float_TronqueZeros(str);
}

__int64 Memory_StringToInt(char *str)			{
	//Ne pas traduire
	char unites[5]={'o', 'k', 'm', 'g', 't'};
	//Traduction possible
	double valeur;
	int i;
	char tempStr[100];
	char *ptr, *ptr2;

	ptr2 = tempStr;
	strcpy(tempStr, str);
	valeur = atof(tempStr);
	while(*ptr2>='0' && *ptr2<='9')
		ptr2++;

	ptr = ptr2;
	while(*ptr2)			{
		if (*ptr2 >= 'A' && *ptr2 <= 'Z')
			*ptr2 += 32;
		ptr2++;
	}
	for (i=5-1;i>=0;i--)			{
		if (strchr(ptr, unites[i]))				{
			//+... pour les erreurs de précision
			valeur = valeur * ((__int64)1<<(10*i)) + ((__int64)1<<(10*i-10));
			break;
		}
	}
	return (__int64)valeur;
}

int Memory_StringToInt32(char *str)			{
	__int64 tmp;
	tmp = Memory_StringToInt(str);
	if (tmp >= (__int64)4<<30)
		tmp = 0;
	return (int)tmp;
}


LRESULT CALLBACK DlgOptionsGenerales(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	int x;
	char *chaine;

	switch (message)
	{
		case WM_INITDIALOG:
			sprintf(str, "%i", NB_MAX_ELE_LISTE);
			SetDlgItemText(hDlg, IDC_EDIT5, str);
			OptionsParams_RedessCombo(hDlg, IDC_COMBO1);
			SendDlgItemMessage(hDlg, IDC_COMBO1, CB_SETCURSEL, gblSdModele, 0);
			Dialog_SetBool(hDlg, IDC_CHECK1, sauverParamsMaps);
			Dialog_SetBool(hDlg, IDC_CHECK11, sauverParamsMapsAutomatiquement);
			Dialog_SetInt(hDlg, IDC_EDIT6, editTiming);
			tooltip_AddControl(hDlg, IDC_CHECK1, "Sauvegarde les paramètres modifiés dans l'éditeur de map pour la prochaine fois.");
			tooltip_AddControl(hDlg, IDC_CHECK11, "Si vous cochez cette case, les paramètres seront enregistrés lorsque l'éditeur est fermé, sinon ils ne le seront uniquement lorsque le fichier en question est sauvegardé.");
			tooltip_AddControl(hDlg, IDC_EDIT6, "Intervale de mise à jour de l'éditeur\nSi vous voulez réduire la consommation CPU, vous pouvez augmenter cette valeur, mais l'éditeur sera moins réactif et le rendu plus saccadé.");
			tooltip_AddControl(hDlg, IDC_CHECK2, "Détermine automatiquement le type de fichier en fonction de l'extension, et applique le format correspondant. Cela permet de mixer facilement plusieurs formats dans un seul projet.");
			x = SendDlgItemMessage(hDlg, IDC_CHECK1, BM_GETCHECK, 0, 0);
			if (!sauverParamsMaps)
				EnableWindow(GetDlgItem(hDlg, IDC_CHECK11), FALSE);
			Combo_AddItem(hDlg, IDC_COMBO2, "192 ko");
			Combo_AddItem(hDlg, IDC_COMBO2, "8 Mo");
			Combo_AddItem(hDlg, IDC_COMBO2, "32 Mo");
			Combo_AddItem(hDlg, IDC_COMBO2, "64 Mo");
			Combo_AddItem(hDlg, IDC_COMBO2, "128 Mo");
			Combo_AddItem(hDlg, IDC_COMBO2, "256 Mo");
			Combo_AddItem(hDlg, IDC_COMBO2, "512 Mo");
			Combo_AddItem(hDlg, IDC_COMBO2, "1 Go");
			Combo_AddItem(hDlg, IDC_COMBO2, "Max.");
			if (DIMENSION_MAX==0)
				strcpy(str, "Max.");
			else
				Memory_IntToString(str, DIMENSION_MAX);
			Dialog_SetText(hDlg, IDC_COMBO2, str);
			Dialog_SetBool(hDlg, IDC_CHECK2, bChoisitAutoFormat);
//			SendDlgItemMessage(hDlg,IDC_CHECK2,BM_SETCHECK,zoomPrecis?BST_CHECKED:BST_UNCHECKED,0);
			return TRUE;

		case WM_NOTIFY:
			tooltip_OnWMNotify(lParam);
			break;

		//Support onglets
		case WM_SIZE:
			UpdateBackgroundBrush();
			break;

		case WM_CTLCOLORSTATIC:
			BOOL bHandled;
			return OnCtlColor(message, wParam, lParam, bHandled);

		case WM_ERASEBKGND:
			return TRUE;
		//End support onglets

		case WM_COMMAND:

			switch (HIWORD(wParam))		{
				case BN_CLICKED:
					x = SendDlgItemMessage(hDlg, IDC_CHECK1, BM_GETCHECK, 0, 0);
					if (x == BST_CHECKED)
						EnableWindow(GetDlgItem(hDlg, IDC_CHECK11), TRUE);
					else		{
						EnableWindow(GetDlgItem(hDlg, IDC_CHECK11), FALSE);
						Dialog_SetBool(hDlg, IDC_CHECK11, FALSE);
					}
					break;
			}

			if (LOWORD(wParam) == IDC_REFRESH)
			{
				OptionsParams_RedessCombo(hDlg, IDC_COMBO1);
				SendDlgItemMessage(hDlg, IDC_COMBO1, CB_SETCURSEL, lParam, 0);
			}

			if (LOWORD(wParam) == IDOK) 
			{
				GetDlgItemText(hDlg,IDC_EDIT5,str,sizeof(str));
				x=GetEntier(str);
				if (x>0 && x!=NB_MAX_ELE_LISTE)		{
					if (gblHEdit)		{
						MessageBox(hDlg, "Impossible de modifier le nombre d'éléments par liste lorsque l'éditeur est ouvert. Veuillez le fermer", "Erreur", MB_ICONEXCLAMATION);
					}
					else			{
						if (x<3)
							x=3;
						NB_MAX_ELE_LISTE=x;
					}
				}
				sauverParamsMaps = Dialog_GetBool(hDlg, IDC_CHECK1);
				sauverParamsMapsAutomatiquement = Dialog_GetBool(hDlg, IDC_CHECK11);
				x = Dialog_GetInt(hDlg, IDC_EDIT6);
				if (x<0)
					x=0;
				if (x>1000)
					x=1000;
				editTiming=x;
				gblSdModele = SendDlgItemMessage(hDlg, IDC_COMBO1, CB_GETCURSEL, 0, 0);

				chaine = Dialog_GetText(hDlg, IDC_COMBO2);
				DIMENSION_MAX = Memory_StringToInt32(chaine);
				bChoisitAutoFormat = Dialog_GetBool(hDlg, IDC_CHECK2);

/*				if (SendDlgItemMessage(hDlg,IDC_CHECK2,BM_GETCHECK,0,0)==BST_CHECKED)
					zoomPrecis=1;
				else
					zoomPrecis=0;*/

				if (gblHEdit)
					CreeBarresDefil(gblHEdit);
				EndDialog(hDlg, 0);
				return TRUE;
			}

			if (LOWORD(wParam) == IDCANCEL)
			{
				EndDialog(hDlg, -1);
				return TRUE;
			}
			break;
	}

    return FALSE;
}

void ListeParams_AjouteElement(HWND hListe, char *texte, char *defaut, int type, int taille, int i)		{
	LVITEM lvi;
	char str[1000];

	// Initialize LVITEM members that are common to all items. 
	lvi.mask = LVIF_TEXT | LVIF_STATE;
	lvi.state = 0; 
	lvi.stateMask = 0; 
	lvi.pszText = texte;   // app. maintains text
	lvi.iImage = 0;                     // image list index
	// Initialize item-specific LVITEM members. 
	lvi.iItem = i;
	lvi.iSubItem = 0;
	lvi.lParam = (LPARAM) NULL;    // item data

	ListView_InsertItem(hListe,&lvi);

	if (type==1)
		strcpy(str, "Entier");
	else if (type==2)
		strcpy(str, "Brut");
	else
		sprintf(str, "%i", type);
	ListView_SetItemText(hListe,
			i,
			1,
			str);

	sprintf(str, "%i", taille);
	ListView_SetItemText(hListe,
			i,
			2,
			str);

	ListView_SetItemText(hListe,
			i,
			3,
			defaut);
}

void OptionsParams_EnableTaille(HWND hDlg)			{
	int i;
	i=SendDlgItemMessage(hDlg,IDC_COMBO1,CB_GETCURSEL,0,0);
	if (i==0)		{
		EnableWindow(GetDlgItem(hDlg, IDC_EDIT2), FALSE);
		SetWindowText(GetDlgItem(hDlg, IDC_EDIT2), "4");
	}
	else		{
		EnableWindow(GetDlgItem(hDlg, IDC_EDIT2), TRUE);
//		SetWindowText(GetDlgItem(hDlg, IDC_EDIT2), "");
	}
}

void OptionsParams_RedessCombo(HWND hDlg, int dlgItem)		{
	int i;
	SendMessage(GetDlgItem(hDlg, dlgItem),CB_RESETCONTENT,0,0);
	for (i=0;i<sdNbreModeles;i++)		{
		SendMessage(GetDlgItem(hDlg, dlgItem),CB_ADDSTRING,0,(LPARAM)sdParams[i].sdNomModele);
	}
}

void SendParentRefreshCommand(HWND hDlg, LPARAM lParam)		{
	SendMessage(GetParent(hDlg), WM_COMMAND, MAKEWPARAM(IDC_REFRESH, 0), lParam);
}

LRESULT CALLBACK DlgOptionsParametres(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	int i;
	LVCOLUMN lvc;
	static int tNumParams=0;
	static int tTypeParam[MAX_SD];
	static int tTaillesParam[MAX_SD];
	static char tNomsParams[MAX_SD][TAILLE_MAX_NOM_SD];
	static char tTexteDefaut[MAX_SD][TAILLE_MAX_VALEUR_DEFAUT_SD];
	static int nObjSelect;
	SD_PARAMS *sdp;
	static int modeleChoisi, modeleCourant, modifie=0;

	switch (message)
	{
		case WM_INITDIALOG:
			modeleCourant = gblSdModele;
			lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; 

			lvc.cx = 50;
			lvc.fmt = LVCFMT_LEFT;
			lvc.iSubItem = 1;
			lvc.pszText = "Défaut";
			if (ListView_InsertColumn(GetDlgItem(hDlg,IDC_LISTE), 0, &lvc) == -1) 
				return FALSE;
			ListView_SetColumn (GetDlgItem(hDlg,IDC_LISTE), 0, &lvc);

			lvc.cx = 40; 
			lvc.fmt = LVCFMT_RIGHT;
			lvc.pszText = "Taille";
			lvc.iSubItem = 2; 
			if (ListView_InsertColumn(GetDlgItem(hDlg,IDC_LISTE), 0, &lvc) == -1) 
				return FALSE;
			ListView_SetColumn (GetDlgItem(hDlg,IDC_LISTE), 0, &lvc);


			lvc.cx = 50;
			lvc.fmt = LVCFMT_CENTER;
			lvc.pszText = "Type";
			lvc.iSubItem = 3; 
			if (ListView_InsertColumn(GetDlgItem(hDlg,IDC_LISTE), 0, &lvc) == -1) 
				return FALSE;
			ListView_SetColumn (GetDlgItem(hDlg,IDC_LISTE), 0, &lvc);

			lvc.cx = 110;
			lvc.fmt = LVCFMT_LEFT;
			lvc.iSubItem = 4;
			lvc.pszText = "Nom du paramètre";
			if (ListView_InsertColumn(GetDlgItem(hDlg,IDC_LISTE), 0, &lvc) == -1) 
				return FALSE;
			ListView_SetColumn (GetDlgItem(hDlg,IDC_LISTE), 0, &lvc);

			i = ListView_GetExtendedListViewStyle(GetDlgItem(hDlg,IDC_LISTE));
			ListView_SetExtendedListViewStyle(GetDlgItem(hDlg,IDC_LISTE), i|LVS_EX_HEADERDRAGDROP|LVS_EX_FULLROWSELECT);

			SendMessage(GetDlgItem(hDlg, IDC_COMBO1),CB_ADDSTRING,0,(LPARAM)"Entier");
			SendMessage(GetDlgItem(hDlg, IDC_COMBO1),CB_ADDSTRING,0,(LPARAM)"Brut");

			sdp = &sdParams[gblSdModele];
			memcpy(tTypeParam, sdp->sdTypeParam, sizeof(tTypeParam));
			memcpy(tTaillesParam, sdp->sdTaillesParam, sizeof(tTaillesParam));
			memcpy(tNomsParams, sdp->sdNomsParams, sizeof(tNomsParams));
			memcpy(tTexteDefaut, sdp->sdTexteDefaut, sizeof(tTexteDefaut));
			tNumParams=sdp->sdNumParams;

			modeleChoisi=-1;
			modifie=0;
			OptionsParams_RedessCombo(hDlg, IDC_COMBO2);
			SendMessage(GetDlgItem(hDlg, IDC_COMBO2), CB_SETCURSEL, gblSdModele, 0);

redess_liste:
			SetDlgItemText(hDlg, IDC_BUTTON1, "Ajouter");
			EnableWindow(GetDlgItem(hDlg, IDC_BUTTON3), FALSE);
			ListView_DeleteAllItems(GetDlgItem(hDlg,IDC_LISTE));

			for (i=0;i<tNumParams;i++)			{
				ListeParams_AjouteElement(GetDlgItem(hDlg,IDC_LISTE), tNomsParams[i], tTexteDefaut[i], tTypeParam[i], tTaillesParam[i], i);
			}
			nObjSelect=-1;

			return TRUE;

		//Support onglets
		case WM_SIZE:
			UpdateBackgroundBrush();
			break;

		case WM_CTLCOLORSTATIC:
			BOOL bHandled;
			return OnCtlColor(message, wParam, lParam, bHandled);

		case WM_ERASEBKGND:
			return TRUE;
		//End support onglets

		case WM_NOTIFY:
			switch (((LPNMHDR) lParam)->code) {

				case LVN_KEYDOWN:
					NMLVKEYDOWN *pnkd;
					pnkd = (LPNMLVKEYDOWN) lParam;
					if (pnkd->wVKey==VK_DELETE)			{
efface:
						if (nObjSelect!=-1)		{
							memmove(&tTypeParam[nObjSelect], &tTypeParam[nObjSelect+1], sizeof(tTypeParam[0])*(MAX_SD-nObjSelect-1));
							memmove(&tTaillesParam[nObjSelect], &tTaillesParam[nObjSelect+1], sizeof(tTaillesParam[0])*(MAX_SD-nObjSelect-1));
							memmove(tNomsParams[nObjSelect], tNomsParams[nObjSelect+1], sizeof(tNomsParams[0])*(MAX_SD-nObjSelect-1));
							memmove(tTexteDefaut[nObjSelect], tTexteDefaut[nObjSelect+1], sizeof(tTexteDefaut[0])*(MAX_SD-nObjSelect-1));
							tNumParams--;
							goto redess_liste;
						}
					}
					break;

				case LVN_ITEMCHANGED :
					LPNMLISTVIEW pnmv;
					pnmv = (LPNMLISTVIEW) lParam;
					if (pnmv->uNewState&LVIS_SELECTED)				{
						i=pnmv->iItem;
						SetDlgItemText(hDlg,IDC_EDIT1,tNomsParams[i]);
						SetDlgItemText(hDlg,IDC_EDIT3,tTexteDefaut[i]);
						SendDlgItemMessage(hDlg, IDC_COMBO1, CB_SETCURSEL, tTypeParam[i]-1, 0);
						sprintf(str, "%i", tTaillesParam[i]);
						SetDlgItemText(hDlg,IDC_EDIT2,str);
						SetDlgItemText(hDlg, IDC_BUTTON1, "Mettre à jour");
						EnableWindow(GetDlgItem(hDlg, IDC_BUTTON3), TRUE);
						nObjSelect=i;
						OptionsParams_EnableTaille(hDlg);
					}
					else	{
						SetDlgItemText(hDlg,IDC_EDIT1,"");
						SendDlgItemMessage(hDlg, IDC_COMBO1, CB_SETCURSEL, -1, 0);
						SetDlgItemText(hDlg,IDC_EDIT2,"");
						SetDlgItemText(hDlg,IDC_EDIT3,"");
						SetDlgItemText(hDlg, IDC_BUTTON1, "Ajouter");
						EnableWindow(GetDlgItem(hDlg, IDC_BUTTON3), FALSE);
						nObjSelect=-1;
						OptionsParams_EnableTaille(hDlg);
					}
					break;
			}
			break;

		case WM_COMMAND:
			if (HIWORD(wParam)==CBN_SELCHANGE)		{
				if (LOWORD(wParam) == IDC_COMBO2)		{
					i=SendDlgItemMessage(hDlg,IDC_COMBO2,CB_GETCURSEL,0,0);
					if (i==CB_ERR)			{
						break;
					}
					modeleChoisi=i;
					EnableWindow(GetDlgItem(hDlg, IDC_BUTTON4), TRUE);
					EnableWindow(GetDlgItem(hDlg, IDC_BUTTON5), TRUE);
					break;
				}
			}
			if (HIWORD(wParam)==CBN_EDITCHANGE)		{
				if (LOWORD(wParam) == IDC_COMBO2)		{
					modeleChoisi=-1;
					EnableWindow(GetDlgItem(hDlg, IDC_BUTTON4), FALSE);
					EnableWindow(GetDlgItem(hDlg, IDC_BUTTON5), FALSE);
					break;
				}
			}
			if (HIWORD(wParam)==CBN_SELCHANGE)		{
				if (LOWORD(wParam) == IDC_COMBO1)		{
					OptionsParams_EnableTaille(hDlg);
					break;
				}
			}

			//Sauver
			if (LOWORD(wParam) == IDC_BUTTON2)		{
				GetDlgItemText(hDlg, IDC_COMBO2, str, sizeof(str));
				if (str[0]==0)				//Aucun nom
					break;
				for (i=0;i<sdNbreModeles;i++)		{
					if (!strcmp(sdParams[i].sdNomModele, str))
						break;
				}
				sdp = &sdParams[i];
				modeleCourant = i;
				memcpy(sdp->sdTypeParam, tTypeParam, sizeof(sdp->sdTypeParam));
				memcpy(sdp->sdTaillesParam, tTaillesParam, sizeof(sdp->sdTaillesParam));
				memcpy(sdp->sdNomsParams, tNomsParams, sizeof(sdp->sdNomsParams));
				memcpy(sdp->sdTexteDefaut, tTexteDefaut, sizeof(sdp->sdTexteDefaut));
				sdp->sdNumParams=tNumParams;
				strcpy(sdp->sdNomModele, str);
				if (i>=sdNbreModeles)				//Ajoute, sinon modifie simplement
					sdNbreModeles++;
				OptionsParams_RedessCombo(hDlg, IDC_COMBO2);
				SendParentRefreshCommand(hDlg, modeleCourant);
			}

			//Charger
			if (LOWORD(wParam) == IDC_BUTTON4)		{
				if (modeleChoisi==-1)
					break;
				sdp = &sdParams[modeleChoisi];
				modeleCourant = modeleChoisi;
				SendParentRefreshCommand(hDlg, modeleCourant);
				memcpy(tTypeParam, sdp->sdTypeParam, sizeof(tTypeParam));
				memcpy(tTaillesParam, sdp->sdTaillesParam, sizeof(tTaillesParam));
				memcpy(tNomsParams, sdp->sdNomsParams, sizeof(tNomsParams));
				memcpy(tTexteDefaut, sdp->sdTexteDefaut, sizeof(tTexteDefaut));
				tNumParams=sdp->sdNumParams;
				goto redess_liste;
			}

			//Supprimer
			if (LOWORD(wParam) == IDC_BUTTON5)		{
				if (modeleChoisi==-1)
					break;
				if (sdNbreModeles<=1)		{
					MessageBox(hDlg, "Vous ne pouvez pas supprimer tous les modèles, il doit au moins vous en rester un.", "Erreur", MB_ICONEXCLAMATION);
					break;
				}
				if (gblSdModele==modeleChoisi)		{
					if (MessageBox(hDlg, "Vous allez supprimer le modèle que vous êtes en train d'utiliser!\nÊtes-vous sûr?", "Attention", MB_ICONEXCLAMATION|MB_YESNO|MB_DEFBUTTON2)==IDNO)
						break;
					gblSdModele=0;
					modeleCourant = 0;
				}
				else		{
					if (MessageBox(hDlg, "Vous ne pourrez pas annuler cette opération.\nÊtes-vous sûr?", "Attention", MB_ICONEXCLAMATION|MB_YESNO|MB_DEFBUTTON2)==IDNO)
						break;
				}
				memmove(&sdParams[modeleChoisi], &sdParams[modeleChoisi+1], sizeof(sdParams[0])*(MAX_SD_MODELES-modeleChoisi-1));
				sdNbreModeles--;
				OptionsParams_RedessCombo(hDlg, IDC_COMBO2);
				EnableWindow(GetDlgItem(hDlg, IDC_BUTTON4), FALSE);
				EnableWindow(GetDlgItem(hDlg, IDC_BUTTON5), FALSE);
				SendParentRefreshCommand(hDlg, modeleCourant);
			}

			if (LOWORD(wParam) == IDC_BUTTON1)		{
				char nom[TAILLE_MAX_NOM_SD], defaut[TAILLE_MAX_VALEUR_DEFAUT_SD];
				int taille, type;
				GetDlgItemText(hDlg, IDC_EDIT1, nom, sizeof(nom));
				if (strlen(nom)==0)
					break;
				//Le nom existe déjà?
				for (i=0;i<tNumParams;i++)		{
					if (!strcmp(nom, tNomsParams[i]))
						break;
				}
				//Oui -> on le sélectionne
				if (i<tNumParams)
					nObjSelect=i;
				GetDlgItemText(hDlg, IDC_EDIT3, defaut, sizeof(defaut));
				type=SendDlgItemMessage(hDlg,IDC_COMBO1,CB_GETCURSEL,0,0);
				if (type==LB_ERR)
					break;
				type++;
				GetDlgItemText(hDlg, IDC_EDIT2, str, sizeof(str));
				taille = GetEntier(str);
				if (taille>=1 && taille<4)
					MessageBox(hDlg, "La taille doit être d'au moins 4 octets.", "Erreur", MB_ICONEXCLAMATION);
				if (taille<4)
					break;
				if (nObjSelect==-1)			{
					if (tNumParams>=MAX_SD)			{
						MessageBox(hDlg, "Le nombre maximal de paramètres est atteint.", "Erreur", MB_ICONEXCLAMATION);
						break;
					}
					strcpy(tNomsParams[tNumParams], nom);
					strcpy(tTexteDefaut[tNumParams], defaut);
					tTypeParam[tNumParams] = type;
					tTaillesParam[tNumParams] = taille;
					tNumParams++;
					goto redess_liste;
				}
				else		{
					strcpy(tNomsParams[nObjSelect], nom);
					strcpy(tTexteDefaut[nObjSelect], defaut);
					tTypeParam[nObjSelect] = type;
					tTaillesParam[nObjSelect] = taille;
					goto redess_liste;
				}
			}

			if (LOWORD(wParam) == IDC_BUTTON3)
			{
				goto efface;
			}

			if (LOWORD(wParam) == IDOK) 
			{
				int enregistrer;
//				gblSdModele = modeleCourant;
				sdp = &sdParams[modeleCourant];
				enregistrer=TRUE;
				if (memcmp(sdp->sdNomsParams, tNomsParams, sizeof(sdp->sdNomModele)) ||
					memcmp(sdp->sdTaillesParam, tTaillesParam, sizeof(sdp->sdTaillesParam)) ||
					memcmp(sdp->sdTypeParam, tTypeParam, sizeof(sdp->sdTypeParam)) ||
					memcmp(sdp->sdTexteDefaut, tTexteDefaut, sizeof(sdp->sdTexteDefaut)))			{
					sprintf(str, "Voulez-vous apporter les modifications au modèle %s?\nNote: Pour éviter d'obtenir ce message, sauvegardez toujours vos modifications sous un modèle avant de fermer la boîte.", sdp->sdNomModele);
					if (MessageBox(hDlg, str, "Avertissement", MB_ICONINFORMATION|MB_YESNO)==IDNO)
						enregistrer=FALSE;
				}
				if (enregistrer)		{
					memcpy(sdp->sdTypeParam, tTypeParam, sizeof(sdp->sdTypeParam));
					memcpy(sdp->sdTaillesParam, tTaillesParam, sizeof(sdp->sdTaillesParam));
					memcpy(sdp->sdNomsParams, tNomsParams, sizeof(sdp->sdNomsParams));
					memcpy(sdp->sdTexteDefaut, tTexteDefaut, sizeof(sdp->sdTexteDefaut));
					sdp->sdNumParams=tNumParams;
					sdp->sizeofSD=sizeof(SPRITE_DEF)+sdp->sdTaillesParam[sdp->sdNumParams];
				}
				EndDialog(hDlg, 0);
				return TRUE;
			}

			if (LOWORD(wParam) == IDCANCEL)
			{
				EndDialog(hDlg, -1);
				return TRUE;
			}
			break;
	}

    return FALSE;
}


LRESULT CALLBACK DlgCouleurs2(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
		case WM_INITDIALOG:
			tooltip_AddControl(hDlg, IDC_CHECK4, "Par exemple, si la conversion produit 10 couleurs et que vous travaillez avec des palettes de 16, les 6 couleurs restantes seront automatiquement ajoutées afin de la remplir.");
			tooltip_AddControl(hDlg, IDC_EDIT1, "Vous pouvez réduire cette valeur pour accélerer les conversions ou l'augmenter si vous n'arrivez pas à convertir votre bitmap car elle contient trop de couleurs différentes.");
			Dialog_SetBool(hDlg, IDC_CHECK1, nuancesAvant);
			Dialog_SetBool(hDlg, IDC_CHECK3, troncEntier);
			Dialog_SetBool(hDlg, IDC_CHECK4, utilMaxCoul);
			Dialog_SetInt(hDlg, IDC_EDIT1, precisionMax);
			return TRUE;

		case WM_NOTIFY:
			tooltip_OnWMNotify(lParam);
			break;

		//Support onglets
		case WM_SIZE:
			UpdateBackgroundBrush();
			break;

		case WM_CTLCOLORSTATIC:
			BOOL bHandled;
			return OnCtlColor(message, wParam, lParam, bHandled);

		case WM_ERASEBKGND:
			return TRUE;
		//End support onglets

		case WM_COMMAND:

			if (LOWORD(wParam) == IDC_AVANCE || LOWORD(wParam) == IDC_AVANCEFINI)		{
				SendMessage(GetParent(hDlg), message, wParam, lParam);
			}
			if (LOWORD(wParam) == IDC_BUTTON1)		{
				//Valeurs par défaut)
				Dialog_SetBool(hDlg, IDC_CHECK1, 0);
				Dialog_SetBool(hDlg, IDC_CHECK3, 0);
				Dialog_SetBool(hDlg, IDC_CHECK4, 0);
				Dialog_SetInt(hDlg, IDC_EDIT1, 512);
			}
			if (LOWORD(wParam) == IDOK) 
			{
				nuancesAvant = Dialog_GetBool(hDlg, IDC_CHECK1);
				troncEntier = Dialog_GetBool(hDlg, IDC_CHECK3);
				utilMaxCoul = Dialog_GetBool(hDlg, IDC_CHECK4);
				precisionMax = Dialog_GetInt(hDlg, IDC_EDIT1);

/*				GetDlgItemText(hDlg,IDC_EDIT5,str,sizeof(str));
				x=GetEntier(str);
				if (x>0 && x!=NB_MAX_ELE_LISTE)		{
					if (gblHEdit)		{
						MessageBox(hDlg, "Impossible de modifier le nombre d'éléments par liste lorsque l'éditeur est ouvert. Veuillez le fermer", "Erreur", MB_ICONEXCLAMATION);
					}
					else			{
						if (x<3)
							x=3;
						NB_MAX_ELE_LISTE=x;
					}
				}*/

				EndDialog(hDlg, 0);
				return TRUE;
			}

			if (LOWORD(wParam) == IDCANCEL)
			{
				EndDialog(hDlg, -1);
				return TRUE;
			}
			break;
	}

    return FALSE;
}


