/*******************************************************************************
 * Copyright (c) 2000, 2012 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.swt.internal.theme;

import org.eclipse.swt.graphics.*;
import org.eclipse.swt.internal.win32.*;

public class ComboDrawData extends DrawData {

public ComboDrawData() {
	state = new int[2];
}

@Override
void draw(Theme theme, GC gc, Rectangle bounds) {
	if (OS.COMCTL32_MAJOR >= 6 && OS.IsAppThemed ()) {
		long /*int*/ hTheme = OS.OpenThemeData(0, EDIT);
		RECT rect = new RECT ();
		rect.left = bounds.x;
		rect.right = bounds.x + bounds.width;
		rect.top = bounds.y;
		rect.bottom = bounds.y + bounds.height;
		int[] part = getPartId(DrawData.WIDGET_WHOLE);
		OS.DrawThemeBackground (hTheme, gc.handle, part[0], part[1], rect, null);
		RECT contentRect = new RECT();
		OS.GetThemeBackgroundContentRect(hTheme, gc.handle, part[0], part[1], rect, contentRect);
		Rectangle clientArea = this.clientArea;
		if (clientArea != null) {
			clientArea.x = contentRect.left;
			clientArea.y = contentRect.top;
			clientArea.width = contentRect.right - contentRect.left;
			clientArea.height = contentRect.bottom - contentRect.top;
		}
		OS.CloseThemeData(hTheme);
		hTheme = OS.OpenThemeData(0, getClassId());
		int width = OS.GetThemeSysSize(hTheme, OS.SM_CXVSCROLL);
		rect.left = contentRect.right - width;
		rect.top = contentRect.top;
		rect.right = contentRect.right;
		rect.bottom = contentRect.bottom;
		part = getPartId(DrawData.COMBO_ARROW);
		OS.DrawThemeBackground (hTheme, gc.handle, part[0], part[1], rect, null);
		OS.CloseThemeData(hTheme);
		if (clientArea != null) {
			clientArea.width -= width;
		}
	}
}

@Override
char[] getClassId() {
	return COMBOBOX;
}

@Override
int[] getPartId(int part) {
	int state = this.state[part];
	int iPartId = 0, iStateId = 0;
	switch (part) {
		case DrawData.WIDGET_WHOLE:
			iPartId = OS.EP_EDITTEXT;
			iStateId = OS.ETS_NORMAL;
			if ((state & DrawData.DISABLED) != 0) iStateId = OS.ETS_DISABLED;
			break;
		case DrawData.COMBO_ARROW:
			iPartId = OS.CP_DROPDOWNBUTTON;
			iStateId = OS.CBXS_NORMAL;
			if ((state & DrawData.DISABLED) != 0) iStateId = OS.CBXS_DISABLED;
			if ((state & DrawData.HOT) != 0) iStateId = OS.CBXS_HOT;
			if ((state & DrawData.PRESSED) != 0) iStateId = OS.CBXS_PRESSED;
			break;
	}
	return new int[]{iPartId, iStateId};
}

@Override
int hit(Theme theme, Point position, Rectangle bounds) {
	if (!(OS.COMCTL32_MAJOR >= 6 && OS.IsAppThemed ())) return DrawData.WIDGET_NOWHERE;
	if (!bounds.contains(position)) return DrawData.WIDGET_NOWHERE;
	long /*int*/ hTheme = OS.OpenThemeData(0, EDIT);
	int[] part = getPartId(DrawData.WIDGET_WHOLE);
	int iPartId = part[0];
	int iStateId = part[1];
	RECT rect = new RECT ();
	rect.left = bounds.x;
	rect.right = bounds.x + bounds.width;
	rect.top = bounds.y;
	rect.bottom = bounds.y + bounds.height;
	RECT contentRect = new RECT();
	OS.GetThemeBackgroundContentRect(hTheme, 0, iPartId, iStateId, rect, contentRect);
	OS.CloseThemeData(hTheme);
	hTheme = OS.OpenThemeData(0, getClassId());
	int width = OS.GetThemeSysSize(hTheme, OS.SM_CXVSCROLL);
	OS.CloseThemeData(hTheme);
	Rectangle arrowRect = new Rectangle(contentRect.right - width, contentRect.top, contentRect.bottom - contentRect.top, width);
	if (arrowRect.contains(position)) return DrawData.COMBO_ARROW;
	return DrawData.WIDGET_WHOLE;
}

}
