/*

Miranda IM: the free IM client for Microsoft* Windows*

Copyright 2000-2009 Miranda ICQ/IM project, 
all portions of this codebase are copyrighted to the people 
listed in contributors.txt.

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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*/
#include "..\..\core\commonheaders.h"

typedef struct {
	DWORD  helpID;
	DWORD  exStyle;
	DWORD  style;
	short  x;
	short  y;
	short  cx;
	short  cy;
	DWORD  id;
} START_OF_DLGITEMTEMPLATEEX;

typedef struct {
	WORD   dlgVer;
	WORD   signature;
	DWORD  helpID;
	DWORD  exStyle;
	DWORD  style;
	WORD   cDlgItems;
	short  x;
	short  y;
	short  cx;
	short  cy;
} START_OF_DLGTEMPLATEEX;

INT_PTR ResizeDialog(WPARAM, LPARAM lParam)
{
	UTILRESIZEDIALOG *urd = (UTILRESIZEDIALOG*)lParam;
	HDWP hDwp;
	int i;
	DLGITEMTEMPLATE *pItem = NULL;
	START_OF_DLGITEMTEMPLATEEX *pItemEx = NULL;
	RECT rc;
	PWORD pWord;
	DLGTEMPLATE *pTemplate;
	START_OF_DLGTEMPLATEEX *pTemplateEx;
	UTILRESIZECONTROL urc;
	int procResult;
	int extendedDlg, itemCount;

	if (urd == NULL || urd->cbSize != sizeof(UTILRESIZEDIALOG)) return 1;
	pTemplate = (DLGTEMPLATE*)LockResource(LoadResource(urd->hInstance, FindResourceA(urd->hInstance, urd->lpTemplate, MAKEINTRESOURCEA(5))));
	pTemplateEx = (START_OF_DLGTEMPLATEEX*)pTemplate;
	extendedDlg = pTemplateEx->signature == 0xFFFF;
	if (extendedDlg && pTemplateEx->dlgVer != 1)
		return 1;

	if (extendedDlg) pWord = (PWORD)(pTemplateEx+1);
	else pWord = (PWORD)(pTemplate+1);
	if (*pWord == 0xFFFF) pWord+=2; else while (*pWord++);   //menu
	if (*pWord == 0xFFFF) pWord+=2; else while (*pWord++);   //class
	while (*pWord++);   //title
	if (extendedDlg) {
		if (pTemplateEx->style&DS_SETFONT) {
			pWord+=3;    //font size, weight, italic
			while (*pWord++);   //font name
		}
	}
	else {
		if (pTemplate->style&DS_SETFONT) {
			pWord++;    //font size
			while (*pWord++);   //font name
		}
	}

	urc.cbSize = sizeof(UTILRESIZECONTROL);
	rc.left = 0; rc.top = 0;
	if (extendedDlg) {rc.right = pTemplateEx->cx; rc.bottom = pTemplateEx->cy;}
	else {rc.right = pTemplate->cx; rc.bottom = pTemplate->cy;}
	MapDialogRect(urd->hwndDlg, &rc);
	urc.dlgOriginalSize.cx = rc.right; urc.dlgOriginalSize.cy = rc.bottom;
	GetClientRect(urd->hwndDlg, &rc);
	urc.dlgNewSize.cx = rc.right; urc.dlgNewSize.cy = rc.bottom;

	if (extendedDlg) itemCount = pTemplateEx->cDlgItems;
	else itemCount = pTemplate->cdit;
	hDwp = BeginDeferWindowPos(itemCount);
	for (i=0;i<itemCount;i++) {
		if ((UINT_PTR)pWord&2) pWord++;       //dword align

		if (extendedDlg) {
			pItemEx = (START_OF_DLGITEMTEMPLATEEX*)pWord;
			pWord = (PWORD)(pItemEx+1);

			urc.wId = pItemEx->id;
			urc.rcItem.left = pItemEx->x; urc.rcItem.top = pItemEx->y;
			urc.rcItem.right = urc.rcItem.left+pItemEx->cx; urc.rcItem.bottom = urc.rcItem.top+pItemEx->cy;
		}
		else {
			pItem = (DLGITEMTEMPLATE*)pWord;
			pWord = (PWORD)(pItem+1);

			urc.wId = pItem->id;
			urc.rcItem.left = pItem->x; urc.rcItem.top = pItem->y;
			urc.rcItem.right = urc.rcItem.left+pItem->cx; urc.rcItem.bottom = urc.rcItem.top+pItem->cy;
		}
		if (*pWord == 0xFFFF) pWord+=2; else while (*pWord++);   //menu
		if (*pWord == 0xFFFF) pWord+=2; else while (*pWord++);   //class
		pWord+=1+(1+*pWord)/2;     //creation data

		if (urc.wId == 65535) continue;  //using this breaks the dwp, so just ignore it

		MapDialogRect(urd->hwndDlg, &urc.rcItem);
		procResult = (urd->pfnResizer)(urd->hwndDlg, urd->lParam, &urc);
		if (procResult&RD_ANCHORX_RIGHT) {
			urc.rcItem.left+=urc.dlgNewSize.cx-urc.dlgOriginalSize.cx;
			urc.rcItem.right+=urc.dlgNewSize.cx-urc.dlgOriginalSize.cx;
		}
		else if (procResult&RD_ANCHORX_WIDTH)
			urc.rcItem.right+=urc.dlgNewSize.cx-urc.dlgOriginalSize.cx;
		else if (procResult&RD_ANCHORX_CENTRE) {
			urc.rcItem.left+=(urc.dlgNewSize.cx-urc.dlgOriginalSize.cx)/2;
			urc.rcItem.right+=(urc.dlgNewSize.cx-urc.dlgOriginalSize.cx)/2;
		}
		if (procResult&RD_ANCHORY_BOTTOM) {
			urc.rcItem.top+=urc.dlgNewSize.cy-urc.dlgOriginalSize.cy;
			urc.rcItem.bottom+=urc.dlgNewSize.cy-urc.dlgOriginalSize.cy;
		}
		else if (procResult&RD_ANCHORY_HEIGHT)
			urc.rcItem.bottom+=urc.dlgNewSize.cy-urc.dlgOriginalSize.cy;
		else if (procResult&RD_ANCHORY_CENTRE) {
			urc.rcItem.top+=(urc.dlgNewSize.cy-urc.dlgOriginalSize.cy)/2;
			urc.rcItem.bottom+=(urc.dlgNewSize.cy-urc.dlgOriginalSize.cy)/2;
		}
		hDwp = DeferWindowPos(hDwp, GetDlgItem(urd->hwndDlg, extendedDlg?pItemEx->id:pItem->id), 0, urc.rcItem.left, urc.rcItem.top, urc.rcItem.right-urc.rcItem.left, urc.rcItem.bottom-urc.rcItem.top, SWP_NOZORDER);
	}
	EndDeferWindowPos(hDwp);
	return 0;
}