changeset 404:720e61df8cf6

An even better combobox drawing fix. Only add 100 pixels to the size of the combobox when the list needs to be shown. This way it won't screw up clipping of items below it in the box. So OS/2 comboboxes can now be safely used in vertical boxes without worries.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Sat, 10 May 2003 10:33:54 +0000
parents 6a3ef130962f
children 4c084ec3e176
files os2/dw.c
diffstat 1 files changed, 66 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/os2/dw.c	Sat May 10 07:54:09 2003 +0000
+++ b/os2/dw.c	Sat May 10 10:33:54 2003 +0000
@@ -1161,8 +1161,13 @@
 				if(strncmp(tmpbuf, "#2", 3)==0)
 				{
 					/* Make the combobox big enough to drop down. :) */
-					WinSetWindowPos(handle, HWND_TOP, currentx + pad, (currenty + pad) - 100,
-									width + vectorx, (height + vectory) + 100, SWP_MOVE | SWP_SIZE | SWP_ZORDER);
+                    if(dw_window_get_data(handle, "_dw_dropped"))
+						WinSetWindowPos(handle, HWND_TOP, currentx + pad, (currenty + pad) - 100,
+										width + vectorx, (height + vectory) + 100, SWP_MOVE | SWP_SIZE | SWP_ZORDER);
+					else
+						WinSetWindowPos(handle, HWND_TOP, currentx + pad, currenty + pad,
+										width + vectorx, height + vectory, SWP_MOVE | SWP_SIZE | SWP_ZORDER);
+
 				}
 				else if(strncmp(tmpbuf, "#6", 3)==0)
 				{
@@ -1736,11 +1741,39 @@
 	case WM_SETFOCUS:
 		_run_event(hWnd, msg, mp1, mp2);
 		break;
+	case CBM_SHOWLIST:
+		{
+			int dropped = dw_window_get_data(hWnd, "_dw_dropped");
+
+			if(mp1)
+			{
+				if(!dropped)
+				{
+					SWP swp;
+
+					WinQueryWindowPos(hWnd, &swp);
+					WinSetWindowPos(hWnd, NULLHANDLE, swp.x, swp.y - 100, swp.cx, swp.cy + 100, SWP_MOVE | SWP_SIZE);
+					dw_window_set_data(hWnd, "_dw_dropped", (void *)1);
+				}
+			}
+			else
+			{
+				if(dropped)
+				{
+					SWP swp;
+
+					WinQueryWindowPos(hWnd, &swp);
+					WinSetWindowPos(hWnd, NULLHANDLE, swp.x, swp.y + 100, swp.cx, swp.cy - 100, SWP_MOVE | SWP_SIZE);
+					dw_window_set_data(hWnd, "_dw_dropped", (void *)0);
+				}
+			}
+		}
+		break;
 	case WM_PAINT:
 		{
 			HWND entry, parent = WinQueryWindow(hWnd, QW_PARENT);
 			HPS hpsPaint;
-			POINTL ptl;                  /* Add 6 because it has a thick border like the entryfield */
+			POINTL ptl;
 			unsigned long width, height, thumbheight = 0;
 			ULONG color;
 
@@ -1750,26 +1783,29 @@
 			if(!thumbheight)
 				thumbheight = WinQuerySysValue(HWND_DESKTOP, SV_CYVSCROLLARROW);
 
+			/* Add 6 because it has a thick border like the entryfield */
 			thumbheight += 6;
 
 			color = (ULONG)dw_window_get_data(parent, "_dw_fore");
 			dw_window_get_pos_size(hWnd, 0, 0, &width, &height);
 
-			hpsPaint = WinGetPS(hWnd);
-			if(color)
-				GpiSetColor(hpsPaint, _internal_color(color-1));
-			else
-				GpiSetColor(hpsPaint, CLR_PALEGRAY);
-
-			ptl.x = 0;
-			ptl.y = 96;
-			GpiMove(hpsPaint, &ptl);
-
-			ptl.x = width;
-			ptl.y = height - thumbheight;
-			GpiBox(hpsPaint, DRO_FILL, &ptl, 0, 0);
-
-			WinReleasePS(hpsPaint);
+			if(height > thumbheight)
+			{
+				hpsPaint = WinGetPS(hWnd);
+				if(color)
+					GpiSetColor(hpsPaint, _internal_color(color-1));
+				else
+					GpiSetColor(hpsPaint, CLR_PALEGRAY);
+
+				ptl.x = ptl.y = 0;
+				GpiMove(hpsPaint, &ptl);
+
+				ptl.x = width;
+				ptl.y = height - thumbheight;
+				GpiBox(hpsPaint, DRO_FILL, &ptl, 0, 0);
+
+				WinReleasePS(hpsPaint);
+			}
 		}
 		break;
 	}
@@ -2503,6 +2539,14 @@
 			return (MRESULT)TRUE;
 		}
 		break;
+	case WM_MOUSEMOVE:
+		{
+			HPOINTER ptr = (HPOINTER)dw_window_get_data(hWnd, "_dw_pointer");
+
+			if(ptr)
+				WinSetPointer(HWND_DESKTOP, ptr);
+		}
+		break;
 	case WM_USER:
 		windowfunc = (void (* API)(void *))mp1;
 
@@ -3619,11 +3663,10 @@
  */
 void API dw_window_pointer(HWND handle, int pointertype)
 {
-	WinSetPointer(handle,
-				  pointertype < 65535 ?
-				  WinQuerySysPointer(HWND_DESKTOP,
-									 pointertype,
-									 FALSE) : (HPOINTER)pointertype);
+	dw_window_set_data(handle, "_dw_pointer",
+					   pointertype < 65535 ?
+					   (void *)WinQuerySysPointer(HWND_DESKTOP,pointertype, FALSE)
+					   : (void *)pointertype);
 }
 
 /*