diff options
Diffstat (limited to 'bundles/org.eclipse.swt/Eclipse SWT Theme/win32/org/eclipse/swt/internal/theme/ToolItemDrawData.java')
-rw-r--r-- | bundles/org.eclipse.swt/Eclipse SWT Theme/win32/org/eclipse/swt/internal/theme/ToolItemDrawData.java | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Theme/win32/org/eclipse/swt/internal/theme/ToolItemDrawData.java b/bundles/org.eclipse.swt/Eclipse SWT Theme/win32/org/eclipse/swt/internal/theme/ToolItemDrawData.java new file mode 100644 index 0000000000..516595f9be --- /dev/null +++ b/bundles/org.eclipse.swt/Eclipse SWT Theme/win32/org/eclipse/swt/internal/theme/ToolItemDrawData.java @@ -0,0 +1,169 @@ +/******************************************************************************* + * Copyright (c) 2000, 2007 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 ToolItemDrawData extends DrawData { + + public ToolBarDrawData parent; + + static final int INSET = 1; + +public ToolItemDrawData() { + state = new int[2]; +} + +Rectangle computeTrim(Theme theme, GC gc) { + if (OS.COMCTL32_MAJOR >= 6 && OS.IsAppThemed ()) { + int /*long*/ hTheme = OS.OpenThemeData(0, getClassId()); + RECT rect = new RECT (); + rect.left = clientArea.x; + rect.right = clientArea.x + clientArea.width; + rect.top = clientArea.y; + rect.bottom = clientArea.y + clientArea.height; + RECT extent = new RECT (); + int[] part = getPartId(DrawData.WIDGET_WHOLE); + OS.GetThemeBackgroundExtent(hTheme, gc.handle, part[0], part[1], rect, extent); + OS.CloseThemeData(hTheme); + if ((style & SWT.DROP_DOWN) != 0) { + SIZE size = new SIZE(); + part = getPartId(DrawData.TOOLITEM_ARROW); + OS.GetThemePartSize(hTheme, 0, part[0], part[1], null, OS.TS_TRUE, size); + extent.right = Math.max(extent.left, extent.right + size.cx); + } else { + extent.left -= INSET; + extent.top -= INSET; + extent.right += INSET; + extent.bottom += INSET; + } + return new Rectangle(extent.left, extent.top, extent.right - extent.left, extent.bottom - extent.top); + } + return new Rectangle(0, 0, 0, 0); +} + +void draw(Theme theme, GC gc, Rectangle bounds) { + if (OS.COMCTL32_MAJOR >= 6 && OS.IsAppThemed ()) { + int /*long*/ hTheme = OS.OpenThemeData(0, getClassId()); + RECT rect = new RECT (); + rect.left = bounds.x; + rect.right = bounds.x + bounds.width; + rect.top = bounds.y; + rect.bottom = bounds.y + bounds.height; + SIZE size = null; + int[] dropPart = null; + if ((style & SWT.DROP_DOWN) != 0) { + size = new SIZE(); + dropPart = getPartId(DrawData.TOOLITEM_ARROW); + OS.GetThemePartSize(hTheme, gc.handle, dropPart[0], dropPart[1], rect, OS.TS_TRUE, size); + rect.right -= size.cx; + if (rect.right < rect.left) rect.right = rect.left; + } + int[] part = getPartId(DrawData.WIDGET_WHOLE); + OS.DrawThemeBackground(hTheme, gc.handle, part[0], part[1], rect, null); + 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; + } + if ((style & SWT.DROP_DOWN) != 0) { + rect.left = rect.right; + rect.right = rect.left + size.cx; + OS.DrawThemeBackground(hTheme, gc.handle, dropPart[0], dropPart[1], rect, null); + } + OS.CloseThemeData(hTheme); + } +} + +char[] getClassId() { + return TOOLBAR; +} + +int[] getPartId(int part) { + int state = this.state[part]; + int iPartId = 0, iStateId = 0; + switch (part) { + case DrawData.WIDGET_WHOLE: + if ((style & (SWT.PUSH | SWT.CHECK | SWT.RADIO)) != 0) { + iPartId = OS.TP_BUTTON; + } else if ((style & SWT.DROP_DOWN) != 0) { + iPartId = OS.TP_SPLITBUTTON; + } else if ((style & SWT.SEPARATOR) != 0) { + if ((parent.style & SWT.VERTICAL) != 0) { + iPartId = OS.TP_SEPARATORVERT; + } else { + iPartId = OS.TP_SEPARATOR; + } + } + if ((style & SWT.SEPARATOR) == 0) { + if ((state & DrawData.HOT) != 0) { + if ((style & (SWT.RADIO | SWT.CHECK)) != 0 && (state & DrawData.SELECTED) != 0) { + iStateId = OS.TS_HOTCHECKED; + } else { + iStateId = OS.TS_HOT; + } + } + if ((style & (SWT.RADIO | SWT.CHECK)) != 0 && (state & DrawData.SELECTED) != 0) { + iStateId = OS.TS_CHECKED; + } + if ((state & DrawData.PRESSED) != 0) iStateId = OS.TS_PRESSED; + if ((state & DrawData.DISABLED) != 0) iStateId = OS.TS_DISABLED; + } + break; + case DrawData.TOOLITEM_ARROW: + iPartId = OS.TP_SPLITBUTTONDROPDOWN; + if ((state & DrawData.HOT) != 0) iStateId = OS.TS_HOT; + if ((state & DrawData.PRESSED) != 0) iStateId = OS.TS_PRESSED; + if ((state & DrawData.DISABLED) !=0) iStateId = OS.TS_DISABLED; + break; + } + return new int[]{iPartId, iStateId}; +} + +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; + int /*long*/ hTheme = OS.OpenThemeData(0, getClassId()); + try { + RECT rect = new RECT (); + rect.left = bounds.x; + rect.right = bounds.x + bounds.width; + rect.top = bounds.y; + rect.bottom = bounds.y + bounds.height; + POINT pt = new POINT(); + pt.x = position.x; + pt.y = position.y; + short[] code = new short[1]; + int[] part = getPartId(DrawData.WIDGET_WHOLE); + OS.HitTestThemeBackground(hTheme, 0, part[0], part[1], 0, rect, 0, pt, code); + if (code[0] == OS.HTNOWHERE) return DrawData.WIDGET_NOWHERE; + int style = this.style; + if ((style & SWT.DROP_DOWN) != 0) { + SIZE size = new SIZE(); + part = getPartId(DrawData.TOOLITEM_ARROW); + OS.GetThemePartSize(hTheme, 0, part[0], part[1], rect, OS.TS_TRUE, size); + rect.left = Math.max(rect.left, rect.right - size.cx); + OS.HitTestThemeBackground(hTheme, 0, part[0], part[1], 0, rect, 0, pt, code); + if (code[0] != OS.HTNOWHERE) return DrawData.TOOLITEM_ARROW; + } + } finally { + OS.CloseThemeData(hTheme); + } + return DrawData.WIDGET_WHOLE; +} + +} |