summaryrefslogtreecommitdiffstats
path: root/bundles/org.eclipse.swt/Eclipse SWT Theme/win32/org/eclipse/swt/internal/theme/ComboDrawData.java
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.swt/Eclipse SWT Theme/win32/org/eclipse/swt/internal/theme/ComboDrawData.java')
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT Theme/win32/org/eclipse/swt/internal/theme/ComboDrawData.java104
1 files changed, 104 insertions, 0 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Theme/win32/org/eclipse/swt/internal/theme/ComboDrawData.java b/bundles/org.eclipse.swt/Eclipse SWT Theme/win32/org/eclipse/swt/internal/theme/ComboDrawData.java
new file mode 100644
index 0000000000..49da9f35bd
--- /dev/null
+++ b/bundles/org.eclipse.swt/Eclipse SWT Theme/win32/org/eclipse/swt/internal/theme/ComboDrawData.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * 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.graphics.*;
+import org.eclipse.swt.internal.win32.*;
+
+public class ComboDrawData extends DrawData {
+
+public ComboDrawData() {
+ state = new int[2];
+}
+
+void draw(Theme theme, GC gc, Rectangle bounds) {
+ if (OS.COMCTL32_MAJOR >= 6 && OS.IsAppThemed ()) {
+ int /*long*/ 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;
+ }
+ }
+}
+
+char[] getClassId() {
+ return COMBOBOX;
+}
+
+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};
+}
+
+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, 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;
+}
+
+}