/*******************************************************************************
 * 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.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.internal.win32.*;

public class TabItemDrawData extends DrawData {

	public TabFolderDrawData parent;
	public int position;

	static final int TABITEM_INSET = 2;
	static final int TABITEM_INSET2 = 6;

public TabItemDrawData() {
	state = new int[1];
}

@Override
Rectangle computeTrim(Theme theme, GC gc) {
	if (OS.COMCTL32_MAJOR >= 6 && OS.IsAppThemed ()) {
		long /*int*/ hTheme = OS.OpenThemeData(0, getClassId());
		int x = clientArea.x, y = clientArea.y, width = clientArea.width, height = clientArea.height;
		if ((style & SWT.LEFT) != 0) {
			x -= TABITEM_INSET;
			width += TABITEM_INSET;
		}
		y -= TABITEM_INSET;
		height += TABITEM_INSET;
		RECT rect = new RECT ();
		rect.left = x;
		rect.right = x + width;
		rect.top = y;
		rect.bottom = y + height;
		RECT extent = new RECT ();
		int[] part = getPartId(DrawData.WIDGET_WHOLE);
		OS.GetThemeBackgroundExtent(hTheme, gc.handle, part[0], part[1], rect, extent);
		extent.left -= TABITEM_INSET2;
		extent.top -= TABITEM_INSET2;
		extent.right += TABITEM_INSET2;
		OS.CloseThemeData(hTheme);
		return new Rectangle(extent.left, extent.top, extent.right - extent.left, extent.bottom - extent.top);
	}
	return new Rectangle(0, 0, 0, 0);
}

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

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

@Override
int[] getPartId(int part) {
	int state = this.state[part];
	int iPartId = OS.TABP_TABITEM, iStateId = OS.TIS_NORMAL;
	if ((style & SWT.LEFT) != 0 && (style & SWT.RIGHT) != 0) {
		iPartId = OS.TABP_TABITEMLEFTEDGE;
	} else if ((style & SWT.LEFT) != 0) {
		iPartId = OS.TABP_TABITEMLEFTEDGE;
	} else if ((style & SWT.RIGHT) != 0) {
	}
	if ((state & DrawData.HOT) != 0) iStateId = OS.TIS_HOT;
	if ((state & DrawData.FOCUSED) != 0) iStateId = OS.TIS_FOCUSED;
	if ((state & DrawData.SELECTED) != 0) iStateId = OS.TIS_SELECTED;
	if ((state & DrawData.DISABLED) != 0) iStateId = OS.TIS_DISABLED;
	return new int[]{iPartId, iStateId};
}

@Override
int hit(Theme theme, Point position, Rectangle bounds) {
	if (!bounds.contains(position)) return DrawData.WIDGET_NOWHERE;
	int style = this.style;
	int x = bounds.x, y = bounds.y, width = bounds.width, height = bounds.height;
	if ((style & SWT.LEFT) != 0) {
		x += TABITEM_INSET;
		width -= TABITEM_INSET;
	}
	y += TABITEM_INSET;
	height -= TABITEM_INSET;
	Rectangle content = new Rectangle(x, y, width, height);
	if (!content.contains(position)) return DrawData.WIDGET_NOWHERE;
	return DrawData.WIDGET_WHOLE;
}

}
