Create a new subdirectory for the common dialog box DLL and move all
code from /misc/commdlg.c to this directory. Also made a start in
documenting the API calls.
diff --git a/Makefile.in b/Makefile.in
index c26e1dc..989ec85 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -30,6 +30,7 @@
console \
dlls/advapi32 \
dlls/comctl32 \
+ dlls/commdlg \
dlls/imagehlp \
dlls/msacm \
dlls/msacm32 \
@@ -101,6 +102,7 @@
console/console.o \
dlls/advapi32/advapi32.o \
dlls/comctl32/comctl32.o \
+ dlls/commdlg/commdlg.o \
dlls/imagehlp/imagehlp.o \
dlls/msacm/msacm.o \
dlls/msacm32/msacm32.o \
diff --git a/configure b/configure
index a228f44..799cea6 100755
--- a/configure
+++ b/configure
@@ -4598,6 +4598,7 @@
dlls/Makefile
dlls/advapi32/Makefile
dlls/comctl32/Makefile
+dlls/commdlg/Makefile
dlls/imagehlp/Makefile
dlls/msacm/Makefile
dlls/msacm32/Makefile
@@ -4758,6 +4759,7 @@
dlls/Makefile
dlls/advapi32/Makefile
dlls/comctl32/Makefile
+dlls/commdlg/Makefile
dlls/imagehlp/Makefile
dlls/msacm/Makefile
dlls/msacm32/Makefile
diff --git a/configure.in b/configure.in
index 3caa6b4..e415059 100644
--- a/configure.in
+++ b/configure.in
@@ -623,6 +623,7 @@
dlls/Makefile
dlls/advapi32/Makefile
dlls/comctl32/Makefile
+dlls/commdlg/Makefile
dlls/imagehlp/Makefile
dlls/msacm/Makefile
dlls/msacm32/Makefile
diff --git a/dlls/Makefile.in b/dlls/Makefile.in
index 3314c47..66d67ce 100644
--- a/dlls/Makefile.in
+++ b/dlls/Makefile.in
@@ -1,6 +1,7 @@
SUBDIRS = \
advapi32 \
comctl32 \
+ commdlg \
imagehlp \
msacm \
msacm32 \
diff --git a/dlls/commdlg/.cvsignore b/dlls/commdlg/.cvsignore
new file mode 100644
index 0000000..f3c7a7c
--- /dev/null
+++ b/dlls/commdlg/.cvsignore
@@ -0,0 +1 @@
+Makefile
diff --git a/dlls/commdlg/Makefile.in b/dlls/commdlg/Makefile.in
new file mode 100644
index 0000000..c53ec9c
--- /dev/null
+++ b/dlls/commdlg/Makefile.in
@@ -0,0 +1,20 @@
+DEFS = @DLLFLAGS@ -D__WINE__
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR = @srcdir@
+VPATH = @srcdir@
+MODULE = commdlg
+
+C_SRCS = \
+ colordlg.c \
+ filedlg.c \
+ finddlg.c \
+ fontdlg.c \
+ generic.c \
+ printdlg.c
+
+all: $(MODULE).o
+
+@MAKE_RULES@
+
+### Dependencies:
diff --git a/dlls/commdlg/colordlg.c b/dlls/commdlg/colordlg.c
new file mode 100644
index 0000000..c2de9cb
--- /dev/null
+++ b/dlls/commdlg/colordlg.c
@@ -0,0 +1,1233 @@
+/*
+ * COMMDLG - File Dialog
+ *
+ * Copyright 1994 Martin Ayotte
+ * Copyright 1996 Albrecht Kleine
+ * Copyright 1999 Klaas van Gend
+ */
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include "winbase.h"
+#include "wine/winbase16.h"
+#include "wine/winuser16.h"
+#include "win.h"
+#include "heap.h"
+#include "message.h"
+#include "commdlg.h"
+#include "resource.h"
+#include "dialog.h"
+#include "dlgs.h"
+#include "module.h"
+#include "drive.h"
+#include "debug.h"
+#include "font.h"
+#include "winproc.h"
+
+extern DWORD CommDlgLastError;
+
+/***********************************************************************
+ * ChooseColor (COMMDLG.5)
+ */
+BOOL16 WINAPI ChooseColor16(LPCHOOSECOLOR16 lpChCol)
+{
+ HINSTANCE16 hInst;
+ HANDLE16 hDlgTmpl = 0;
+ BOOL16 bRet = FALSE, win32Format = FALSE;
+ LPCVOID template;
+ HWND hwndDialog;
+
+ TRACE(commdlg,"ChooseColor\n");
+ if (!lpChCol) return FALSE;
+
+ if (lpChCol->Flags & CC_ENABLETEMPLATEHANDLE)
+ {
+ if (!(template = LockResource16( lpChCol->hInstance )))
+ {
+ CommDlgLastError = CDERR_LOADRESFAILURE;
+ return FALSE;
+ }
+ }
+ else if (lpChCol->Flags & CC_ENABLETEMPLATE)
+ {
+ HANDLE16 hResInfo;
+ if (!(hResInfo = FindResource16(lpChCol->hInstance,
+ lpChCol->lpTemplateName,
+ RT_DIALOG16)))
+ {
+ CommDlgLastError = CDERR_FINDRESFAILURE;
+ return FALSE;
+ }
+ if (!(hDlgTmpl = LoadResource16( lpChCol->hInstance, hResInfo )) ||
+ !(template = LockResource16( hDlgTmpl )))
+ {
+ CommDlgLastError = CDERR_LOADRESFAILURE;
+ return FALSE;
+ }
+ }
+ else
+ {
+ template = SYSRES_GetResPtr( SYSRES_DIALOG_CHOOSE_COLOR );
+ win32Format = TRUE;
+ }
+
+ hInst = WIN_GetWindowInstance( lpChCol->hwndOwner );
+ hwndDialog = DIALOG_CreateIndirect( hInst, template, win32Format,
+ lpChCol->hwndOwner,
+ (DLGPROC16)MODULE_GetWndProcEntry16("ColorDlgProc"),
+ (DWORD)lpChCol, WIN_PROC_16 );
+ if (hwndDialog) bRet = DIALOG_DoDialogBox( hwndDialog, lpChCol->hwndOwner);
+ if (hDlgTmpl) FreeResource16( hDlgTmpl );
+
+ return bRet;
+}
+
+
+static const COLORREF predefcolors[6][8]=
+{
+ { 0x008080FFL, 0x0080FFFFL, 0x0080FF80L, 0x0080FF00L,
+ 0x00FFFF80L, 0x00FF8000L, 0x00C080FFL, 0x00FF80FFL },
+ { 0x000000FFL, 0x0000FFFFL, 0x0000FF80L, 0x0040FF00L,
+ 0x00FFFF00L, 0x00C08000L, 0x00C08080L, 0x00FF00FFL },
+
+ { 0x00404080L, 0x004080FFL, 0x0000FF00L, 0x00808000L,
+ 0x00804000L, 0x00FF8080L, 0x00400080L, 0x008000FFL },
+ { 0x00000080L, 0x000080FFL, 0x00008000L, 0x00408000L,
+ 0x00FF0000L, 0x00A00000L, 0x00800080L, 0x00FF0080L },
+
+ { 0x00000040L, 0x00004080L, 0x00004000L, 0x00404000L,
+ 0x00800000L, 0x00400000L, 0x00400040L, 0x00800040L },
+ { 0x00000000L, 0x00008080L, 0x00408080L, 0x00808080L,
+ 0x00808040L, 0x00C0C0C0L, 0x00400040L, 0x00FFFFFFL },
+};
+
+struct CCPRIVATE
+{
+ LPCHOOSECOLOR16 lpcc; /* points to public known data structure */
+ int nextuserdef; /* next free place in user defined color array */
+ HDC16 hdcMem; /* color graph used for BitBlt() */
+ HBITMAP16 hbmMem; /* color graph bitmap */
+ RECT16 fullsize; /* original dialog window size */
+ UINT16 msetrgb; /* # of SETRGBSTRING message (today not used) */
+ RECT16 old3angle; /* last position of l-marker */
+ RECT16 oldcross; /* last position of color/satuation marker */
+ BOOL updating; /* to prevent recursive WM_COMMAND/EN_UPDATE procesing */
+ int h;
+ int s;
+ int l; /* for temporary storing of hue,sat,lum */
+};
+
+/***********************************************************************
+ * CC_HSLtoRGB [internal]
+ */
+static int CC_HSLtoRGB(char c,int hue,int sat,int lum)
+{
+ int res=0,maxrgb;
+
+ /* hue */
+ switch(c)
+ {
+ case 'R':if (hue>80) hue-=80; else hue+=160; break;
+ case 'G':if (hue>160) hue-=160; else hue+=80; break;
+ case 'B':break;
+ }
+
+ /* l below 120 */
+ maxrgb=(256*MIN(120,lum))/120; /* 0 .. 256 */
+ if (hue< 80)
+ res=0;
+ else
+ if (hue< 120)
+ {
+ res=(hue-80)* maxrgb; /* 0...10240 */
+ res/=40; /* 0...256 */
+ }
+ else
+ if (hue< 200)
+ res=maxrgb;
+ else
+ {
+ res=(240-hue)* maxrgb;
+ res/=40;
+ }
+ res=res-maxrgb/2; /* -128...128 */
+
+ /* saturation */
+ res=maxrgb/2 + (sat*res) /240; /* 0..256 */
+
+ /* lum above 120 */
+ if (lum>120 && res<256)
+ res+=((lum-120) * (256-res))/120;
+
+ return MIN(res,255);
+}
+
+/***********************************************************************
+ * CC_RGBtoHSL [internal]
+ */
+static int CC_RGBtoHSL(char c,int r,int g,int b)
+{
+ WORD maxi,mini,mmsum,mmdif,result=0;
+ int iresult=0;
+
+ maxi=MAX(r,b);
+ maxi=MAX(maxi,g);
+ mini=MIN(r,b);
+ mini=MIN(mini,g);
+
+ mmsum=maxi+mini;
+ mmdif=maxi-mini;
+
+ switch(c)
+ {
+ /* lum */
+ case 'L':mmsum*=120; /* 0...61200=(255+255)*120 */
+ result=mmsum/255; /* 0...240 */
+ break;
+ /* saturation */
+ case 'S':if (!mmsum)
+ result=0;
+ else
+ if (!mini || maxi==255)
+ result=240;
+ else
+ {
+ result=mmdif*240; /* 0...61200=255*240 */
+ result/= (mmsum>255 ? mmsum=510-mmsum : mmsum); /* 0..255 */
+ }
+ break;
+ /* hue */
+ case 'H':if (!mmdif)
+ result=160;
+ else
+ {
+ if (maxi==r)
+ {
+ iresult=40*(g-b); /* -10200 ... 10200 */
+ iresult/=(int)mmdif; /* -40 .. 40 */
+ if (iresult<0)
+ iresult+=240; /* 0..40 and 200..240 */
+ }
+ else
+ if (maxi==g)
+ {
+ iresult=40*(b-r);
+ iresult/=(int)mmdif;
+ iresult+=80; /* 40 .. 120 */
+ }
+ else
+ if (maxi==b)
+ {
+ iresult=40*(r-g);
+ iresult/=(int)mmdif;
+ iresult+=160; /* 120 .. 200 */
+ }
+ result=iresult;
+ }
+ break;
+ }
+ return result; /* is this integer arithmetic precise enough ? */
+}
+
+#define DISTANCE 4
+
+/***********************************************************************
+ * CC_MouseCheckPredefColorArray [internal]
+ */
+static int CC_MouseCheckPredefColorArray(HWND16 hDlg,int dlgitem,int rows,int cols,
+ LPARAM lParam,COLORREF *cr)
+{
+ HWND16 hwnd;
+ POINT16 point = MAKEPOINT16(lParam);
+ RECT16 rect;
+ int dx,dy,x,y;
+
+ ClientToScreen16(hDlg,&point);
+ hwnd=GetDlgItem(hDlg,dlgitem);
+ GetWindowRect16(hwnd,&rect);
+ if (PtInRect16(&rect,point))
+ {
+ dx=(rect.right-rect.left)/cols;
+ dy=(rect.bottom-rect.top)/rows;
+ ScreenToClient16(hwnd,&point);
+
+ if (point.x % dx < (dx-DISTANCE) && point.y % dy < (dy-DISTANCE))
+ {
+ x=point.x/dx;
+ y=point.y/dy;
+ *cr=predefcolors[y][x];
+ /* FIXME: Draw_a_Focus_Rect() */
+ return 1;
+ }
+ }
+ return 0;
+}
+
+/***********************************************************************
+ * CC_MouseCheckUserColorArray [internal]
+ */
+static int CC_MouseCheckUserColorArray(HWND16 hDlg,int dlgitem,int rows,int cols,
+ LPARAM lParam,COLORREF *cr,COLORREF*crarr)
+{
+ HWND16 hwnd;
+ POINT16 point = MAKEPOINT16(lParam);
+ RECT16 rect;
+ int dx,dy,x,y;
+
+ ClientToScreen16(hDlg,&point);
+ hwnd=GetDlgItem(hDlg,dlgitem);
+ GetWindowRect16(hwnd,&rect);
+ if (PtInRect16(&rect,point))
+ {
+ dx=(rect.right-rect.left)/cols;
+ dy=(rect.bottom-rect.top)/rows;
+ ScreenToClient16(hwnd,&point);
+
+ if (point.x % dx < (dx-DISTANCE) && point.y % dy < (dy-DISTANCE))
+ {
+ x=point.x/dx;
+ y=point.y/dy;
+ *cr=crarr[x+cols*y];
+ /* FIXME: Draw_a_Focus_Rect() */
+ return 1;
+ }
+ }
+ return 0;
+}
+
+#define MAXVERT 240
+#define MAXHORI 239
+
+/* 240 ^...... ^^ 240
+ | . ||
+ SAT | . || LUM
+ | . ||
+ +-----> 239 ----
+ HUE
+*/
+/***********************************************************************
+ * CC_MouseCheckColorGraph [internal]
+ */
+static int CC_MouseCheckColorGraph(HWND16 hDlg,int dlgitem,int *hori,int *vert,LPARAM lParam)
+{
+ HWND hwnd;
+ POINT16 point = MAKEPOINT16(lParam);
+ RECT16 rect;
+ long x,y;
+
+ ClientToScreen16(hDlg,&point);
+ hwnd=GetDlgItem(hDlg,dlgitem);
+ GetWindowRect16(hwnd,&rect);
+ if (PtInRect16(&rect,point))
+ {
+ GetClientRect16(hwnd,&rect);
+ ScreenToClient16(hwnd,&point);
+
+ x=(long)point.x*MAXHORI;
+ x/=rect.right;
+ y=(long)(rect.bottom-point.y)*MAXVERT;
+ y/=rect.bottom;
+
+ if (hori)
+ *hori=x;
+ if (vert)
+ *vert=y;
+ return 1;
+ }
+ else
+ return 0;
+}
+/***********************************************************************
+ * CC_MouseCheckResultWindow [internal]
+ */
+static int CC_MouseCheckResultWindow(HWND16 hDlg,LPARAM lParam)
+{
+ HWND16 hwnd;
+ POINT16 point = MAKEPOINT16(lParam);
+ RECT16 rect;
+
+ ClientToScreen16(hDlg,&point);
+ hwnd=GetDlgItem(hDlg,0x2c5);
+ GetWindowRect16(hwnd,&rect);
+ if (PtInRect16(&rect,point))
+ {
+ PostMessage16(hDlg,WM_COMMAND,0x2c9,0);
+ return 1;
+ }
+ return 0;
+}
+
+/***********************************************************************
+ * CC_CheckDigitsInEdit [internal]
+ */
+static int CC_CheckDigitsInEdit(HWND16 hwnd,int maxval)
+{
+ int i,k,m,result,value;
+ long editpos;
+ char buffer[30];
+ GetWindowTextA(hwnd,buffer,sizeof(buffer));
+ m=strlen(buffer);
+ result=0;
+
+ for (i=0;i<m;i++)
+ if (buffer[i]<'0' || buffer[i]>'9')
+ {
+ for (k=i+1;k<=m;k++) /* delete bad character */
+ {
+ buffer[i]=buffer[k];
+ m--;
+ }
+ buffer[m]=0;
+ result=1;
+ }
+
+ value=atoi(buffer);
+ if (value>maxval) /* build a new string */
+ {
+ sprintf(buffer,"%d",maxval);
+ result=2;
+ }
+ if (result)
+ {
+ editpos=SendMessage16(hwnd,EM_GETSEL16,0,0);
+ SetWindowTextA(hwnd,buffer);
+ SendMessage16(hwnd,EM_SETSEL16,0,editpos);
+ }
+ return value;
+}
+
+
+
+/***********************************************************************
+ * CC_PaintSelectedColor [internal]
+ */
+static void CC_PaintSelectedColor(HWND16 hDlg,COLORREF cr)
+{
+ RECT16 rect;
+ HDC hdc;
+ HBRUSH hBrush;
+ HWND hwnd=GetDlgItem(hDlg,0x2c5);
+ if (IsWindowVisible(GetDlgItem(hDlg,0x2c6))) /* if full size */
+ {
+ hdc=GetDC(hwnd);
+ GetClientRect16 (hwnd, &rect) ;
+ hBrush = CreateSolidBrush(cr);
+ if (hBrush)
+ {
+ hBrush = SelectObject (hdc, hBrush) ;
+ Rectangle(hdc, rect.left,rect.top,rect.right/2,rect.bottom);
+ DeleteObject (SelectObject (hdc,hBrush)) ;
+ hBrush=CreateSolidBrush(GetNearestColor(hdc,cr));
+ if (hBrush)
+ {
+ hBrush= SelectObject (hdc, hBrush) ;
+ Rectangle( hdc, rect.right/2-1,rect.top,rect.right,rect.bottom);
+ DeleteObject( SelectObject (hdc, hBrush)) ;
+ }
+ }
+ ReleaseDC(hwnd,hdc);
+ }
+}
+
+/***********************************************************************
+ * CC_PaintTriangle [internal]
+ */
+static void CC_PaintTriangle(HWND16 hDlg,int y)
+{
+ HDC hDC;
+ long temp;
+ int w=GetDialogBaseUnits();
+ POINT16 points[3];
+ int height;
+ int oben;
+ RECT16 rect;
+ HWND16 hwnd=GetDlgItem(hDlg,0x2be);
+ struct CCPRIVATE *lpp=(struct CCPRIVATE *)GetWindowLongA(hDlg, DWL_USER);
+
+ if (IsWindowVisible(GetDlgItem(hDlg,0x2c6))) /* if full size */
+ {
+ GetClientRect16(hwnd,&rect);
+ height=rect.bottom;
+ hDC=GetDC(hDlg);
+
+ points[0].y=rect.top;
+ points[0].x=rect.right; /* | /| */
+ ClientToScreen16(hwnd,points); /* | / | */
+ ScreenToClient16(hDlg,points); /* |< | */
+ oben=points[0].y; /* | \ | */
+ /* | \| */
+ temp=(long)height*(long)y;
+ points[0].y=oben+height -temp/(long)MAXVERT;
+ points[1].y=points[0].y+w;
+ points[2].y=points[0].y-w;
+ points[2].x=points[1].x=points[0].x + w;
+
+ if (lpp->old3angle.left)
+ FillRect16(hDC,&lpp->old3angle,GetStockObject(WHITE_BRUSH));
+ lpp->old3angle.left =points[0].x;
+ lpp->old3angle.right =points[1].x+1;
+ lpp->old3angle.top =points[2].y-1;
+ lpp->old3angle.bottom=points[1].y+1;
+ Polygon16(hDC,points,3);
+ ReleaseDC(hDlg,hDC);
+ }
+}
+
+
+/***********************************************************************
+ * CC_PaintCross [internal]
+ */
+static void CC_PaintCross(HWND16 hDlg,int x,int y)
+{
+ HDC hDC;
+ int w=GetDialogBaseUnits();
+ HWND16 hwnd=GetDlgItem(hDlg,0x2c6);
+ struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLongA(hDlg, DWL_USER);
+ RECT16 rect;
+ POINT16 point;
+ HPEN hPen;
+
+ if (IsWindowVisible(GetDlgItem(hDlg,0x2c6))) /* if full size */
+ {
+ GetClientRect16(hwnd,&rect);
+ hDC=GetDC(hwnd);
+ SelectClipRgn(hDC,CreateRectRgnIndirect16(&rect));
+ hPen=CreatePen(PS_SOLID,2,0);
+ hPen=SelectObject(hDC,hPen);
+ point.x=((long)rect.right*(long)x)/(long)MAXHORI;
+ point.y=rect.bottom-((long)rect.bottom*(long)y)/(long)MAXVERT;
+ if (lpp->oldcross.left!=lpp->oldcross.right)
+ BitBlt(hDC,lpp->oldcross.left,lpp->oldcross.top,
+ lpp->oldcross.right-lpp->oldcross.left,
+ lpp->oldcross.bottom-lpp->oldcross.top,
+ lpp->hdcMem,lpp->oldcross.left,lpp->oldcross.top,SRCCOPY);
+ lpp->oldcross.left =point.x-w-1;
+ lpp->oldcross.right =point.x+w+1;
+ lpp->oldcross.top =point.y-w-1;
+ lpp->oldcross.bottom=point.y+w+1;
+
+ MoveTo16(hDC,point.x-w,point.y);
+ LineTo(hDC,point.x+w,point.y);
+ MoveTo16(hDC,point.x,point.y-w);
+ LineTo(hDC,point.x,point.y+w);
+ DeleteObject(SelectObject(hDC,hPen));
+ ReleaseDC(hwnd,hDC);
+ }
+}
+
+
+#define XSTEPS 48
+#define YSTEPS 24
+
+
+/***********************************************************************
+ * CC_PrepareColorGraph [internal]
+ */
+static void CC_PrepareColorGraph(HWND16 hDlg)
+{
+ int sdif,hdif,xdif,ydif,r,g,b,hue,sat;
+ HWND hwnd=GetDlgItem(hDlg,0x2c6);
+ struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLongA(hDlg, DWL_USER);
+ HBRUSH hbrush;
+ HDC hdc ;
+ RECT16 rect,client;
+ HCURSOR16 hcursor=SetCursor16(LoadCursor16(0,IDC_WAIT16));
+
+ GetClientRect16(hwnd,&client);
+ hdc=GetDC(hwnd);
+ lpp->hdcMem = CreateCompatibleDC(hdc);
+ lpp->hbmMem = CreateCompatibleBitmap(hdc,client.right,client.bottom);
+ SelectObject(lpp->hdcMem,lpp->hbmMem);
+
+ xdif=client.right /XSTEPS;
+ ydif=client.bottom/YSTEPS+1;
+ hdif=239/XSTEPS;
+ sdif=240/YSTEPS;
+ for(rect.left=hue=0;hue<239+hdif;hue+=hdif)
+ {
+ rect.right=rect.left+xdif;
+ rect.bottom=client.bottom;
+ for(sat=0;sat<240+sdif;sat+=sdif)
+ {
+ rect.top=rect.bottom-ydif;
+ r=CC_HSLtoRGB('R',hue,sat,120);
+ g=CC_HSLtoRGB('G',hue,sat,120);
+ b=CC_HSLtoRGB('B',hue,sat,120);
+ hbrush=CreateSolidBrush(RGB(r,g,b));
+ FillRect16(lpp->hdcMem,&rect,hbrush);
+ DeleteObject(hbrush);
+ rect.bottom=rect.top;
+ }
+ rect.left=rect.right;
+ }
+ ReleaseDC(hwnd,hdc);
+ SetCursor16(hcursor);
+}
+
+/***********************************************************************
+ * CC_PaintColorGraph [internal]
+ */
+static void CC_PaintColorGraph(HWND16 hDlg)
+{
+ HWND hwnd=GetDlgItem(hDlg,0x2c6);
+ struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLongA(hDlg, DWL_USER);
+ HDC hDC;
+ RECT16 rect;
+ if (IsWindowVisible(hwnd)) /* if full size */
+ {
+ if (!lpp->hdcMem)
+ CC_PrepareColorGraph(hDlg); /* should not be necessary */
+
+ hDC=GetDC(hwnd);
+ GetClientRect16(hwnd,&rect);
+ if (lpp->hdcMem)
+ BitBlt(hDC,0,0,rect.right,rect.bottom,lpp->hdcMem,0,0,SRCCOPY);
+ else
+ WARN(commdlg,"choose color: hdcMem is not defined\n");
+ ReleaseDC(hwnd,hDC);
+ }
+}
+/***********************************************************************
+ * CC_PaintLumBar [internal]
+ */
+static void CC_PaintLumBar(HWND16 hDlg,int hue,int sat)
+{
+ HWND hwnd=GetDlgItem(hDlg,0x2be);
+ RECT16 rect,client;
+ int lum,ldif,ydif,r,g,b;
+ HBRUSH hbrush;
+ HDC hDC;
+
+ if (IsWindowVisible(hwnd))
+ {
+ hDC=GetDC(hwnd);
+ GetClientRect16(hwnd,&client);
+ rect=client;
+
+ ldif=240/YSTEPS;
+ ydif=client.bottom/YSTEPS+1;
+ for(lum=0;lum<240+ldif;lum+=ldif)
+ {
+ rect.top=MAX(0,rect.bottom-ydif);
+ r=CC_HSLtoRGB('R',hue,sat,lum);
+ g=CC_HSLtoRGB('G',hue,sat,lum);
+ b=CC_HSLtoRGB('B',hue,sat,lum);
+ hbrush=CreateSolidBrush(RGB(r,g,b));
+ FillRect16(hDC,&rect,hbrush);
+ DeleteObject(hbrush);
+ rect.bottom=rect.top;
+ }
+ GetClientRect16(hwnd,&rect);
+ FrameRect16(hDC,&rect,GetStockObject(BLACK_BRUSH));
+ ReleaseDC(hwnd,hDC);
+ }
+}
+
+/***********************************************************************
+ * CC_EditSetRGB [internal]
+ */
+static void CC_EditSetRGB(HWND16 hDlg,COLORREF cr)
+{
+ char buffer[10];
+ struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLongA(hDlg, DWL_USER);
+ int r=GetRValue(cr);
+ int g=GetGValue(cr);
+ int b=GetBValue(cr);
+ if (IsWindowVisible(GetDlgItem(hDlg,0x2c6))) /* if full size */
+ {
+ lpp->updating=TRUE;
+ sprintf(buffer,"%d",r);
+ SetWindowTextA(GetDlgItem(hDlg,0x2c2),buffer);
+ sprintf(buffer,"%d",g);
+ SetWindowTextA(GetDlgItem(hDlg,0x2c3),buffer);
+ sprintf(buffer,"%d",b);
+ SetWindowTextA(GetDlgItem(hDlg,0x2c4),buffer);
+ lpp->updating=FALSE;
+ }
+}
+
+/***********************************************************************
+ * CC_EditSetHSL [internal]
+ */
+static void CC_EditSetHSL(HWND16 hDlg,int h,int s,int l)
+{
+ char buffer[10];
+ struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLongA(hDlg, DWL_USER);
+ lpp->updating=TRUE;
+ if (IsWindowVisible(GetDlgItem(hDlg,0x2c6))) /* if full size */
+ {
+ lpp->updating=TRUE;
+ sprintf(buffer,"%d",h);
+ SetWindowTextA(GetDlgItem(hDlg,0x2bf),buffer);
+ sprintf(buffer,"%d",s);
+ SetWindowTextA(GetDlgItem(hDlg,0x2c0),buffer);
+ sprintf(buffer,"%d",l);
+ SetWindowTextA(GetDlgItem(hDlg,0x2c1),buffer);
+ lpp->updating=FALSE;
+ }
+ CC_PaintLumBar(hDlg,h,s);
+}
+
+/***********************************************************************
+ * CC_SwitchToFullSize [internal]
+ */
+static void CC_SwitchToFullSize(HWND16 hDlg,COLORREF result,LPRECT16 lprect)
+{
+ int i;
+ struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLongA(hDlg, DWL_USER);
+
+ EnableWindow(GetDlgItem(hDlg,0x2cf),FALSE);
+ CC_PrepareColorGraph(hDlg);
+ for (i=0x2bf;i<0x2c5;i++)
+ EnableWindow(GetDlgItem(hDlg,i),TRUE);
+ for (i=0x2d3;i<0x2d9;i++)
+ EnableWindow(GetDlgItem(hDlg,i),TRUE);
+ EnableWindow(GetDlgItem(hDlg,0x2c9),TRUE);
+ EnableWindow(GetDlgItem(hDlg,0x2c8),TRUE);
+
+ if (lprect)
+ SetWindowPos(hDlg,0,0,0,lprect->right-lprect->left,
+ lprect->bottom-lprect->top, SWP_NOMOVE|SWP_NOZORDER);
+
+ ShowWindow(GetDlgItem(hDlg,0x2c6),SW_SHOW);
+ ShowWindow(GetDlgItem(hDlg,0x2be),SW_SHOW);
+ ShowWindow(GetDlgItem(hDlg,0x2c5),SW_SHOW);
+
+ CC_EditSetRGB(hDlg,result);
+ CC_EditSetHSL(hDlg,lpp->h,lpp->s,lpp->l);
+}
+
+/***********************************************************************
+ * CC_PaintPredefColorArray [internal]
+ */
+static void CC_PaintPredefColorArray(HWND16 hDlg,int rows,int cols)
+{
+ HWND hwnd=GetDlgItem(hDlg,0x2d0);
+ RECT16 rect;
+ HDC hdc;
+ HBRUSH hBrush;
+ int dx,dy,i,j,k;
+
+ GetClientRect16(hwnd,&rect);
+ dx=rect.right/cols;
+ dy=rect.bottom/rows;
+ k=rect.left;
+
+ hdc=GetDC(hwnd);
+ GetClientRect16 (hwnd, &rect) ;
+
+ for (j=0;j<rows;j++)
+ {
+ for (i=0;i<cols;i++)
+ {
+ hBrush = CreateSolidBrush(predefcolors[j][i]);
+ if (hBrush)
+ {
+ hBrush = SelectObject (hdc, hBrush) ;
+ Rectangle(hdc, rect.left, rect.top,
+ rect.left+dx-DISTANCE, rect.top+dy-DISTANCE);
+ rect.left=rect.left+dx;
+ DeleteObject( SelectObject (hdc, hBrush)) ;
+ }
+ }
+ rect.top=rect.top+dy;
+ rect.left=k;
+ }
+ ReleaseDC(hwnd,hdc);
+ /* FIXME: draw_a_focus_rect */
+}
+/***********************************************************************
+ * CC_PaintUserColorArray [internal]
+ */
+static void CC_PaintUserColorArray(HWND16 hDlg,int rows,int cols,COLORREF* lpcr)
+{
+ HWND hwnd=GetDlgItem(hDlg,0x2d1);
+ RECT16 rect;
+ HDC hdc;
+ HBRUSH hBrush;
+ int dx,dy,i,j,k;
+
+ GetClientRect16(hwnd,&rect);
+
+ dx=rect.right/cols;
+ dy=rect.bottom/rows;
+ k=rect.left;
+
+ hdc=GetDC(hwnd);
+ if (hdc)
+ {
+ for (j=0;j<rows;j++)
+ {
+ for (i=0;i<cols;i++)
+ {
+ hBrush = CreateSolidBrush(lpcr[i+j*cols]);
+ if (hBrush)
+ {
+ hBrush = SelectObject (hdc, hBrush) ;
+ Rectangle( hdc, rect.left, rect.top,
+ rect.left+dx-DISTANCE, rect.top+dy-DISTANCE);
+ rect.left=rect.left+dx;
+ DeleteObject( SelectObject (hdc, hBrush)) ;
+ }
+ }
+ rect.top=rect.top+dy;
+ rect.left=k;
+ }
+ ReleaseDC(hwnd,hdc);
+ }
+ /* FIXME: draw_a_focus_rect */
+}
+
+
+
+/***********************************************************************
+ * CC_HookCallChk [internal]
+ */
+static BOOL CC_HookCallChk(LPCHOOSECOLOR16 lpcc)
+{
+ if (lpcc)
+ if(lpcc->Flags & CC_ENABLEHOOK)
+ if (lpcc->lpfnHook)
+ return TRUE;
+ return FALSE;
+}
+
+/***********************************************************************
+ * CC_WMInitDialog [internal]
+ */
+static LONG CC_WMInitDialog(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam)
+{
+ int i,res;
+ int r, g, b;
+ HWND16 hwnd;
+ RECT16 rect;
+ POINT16 point;
+ struct CCPRIVATE * lpp;
+
+ TRACE(commdlg,"WM_INITDIALOG lParam=%08lX\n", lParam);
+ lpp=calloc(1,sizeof(struct CCPRIVATE));
+ lpp->lpcc=(LPCHOOSECOLOR16)lParam;
+
+ if (lpp->lpcc->lStructSize != sizeof(CHOOSECOLOR16))
+ {
+ EndDialog (hDlg, 0) ;
+ return FALSE;
+ }
+ SetWindowLongA(hDlg, DWL_USER, (LONG)lpp);
+
+ if (!(lpp->lpcc->Flags & CC_SHOWHELP))
+ ShowWindow(GetDlgItem(hDlg,0x40e),SW_HIDE);
+ lpp->msetrgb=RegisterWindowMessageA( SETRGBSTRING );
+
+#if 0
+ cpos=MAKELONG(5,7); /* init */
+ if (lpp->lpcc->Flags & CC_RGBINIT)
+ {
+ for (i=0;i<6;i++)
+ for (j=0;j<8;j++)
+ if (predefcolors[i][j]==lpp->lpcc->rgbResult)
+ {
+ cpos=MAKELONG(i,j);
+ goto found;
+ }
+ }
+ found:
+ /* FIXME: Draw_a_focus_rect & set_init_values */
+#endif
+
+ GetWindowRect16(hDlg,&lpp->fullsize);
+ if (lpp->lpcc->Flags & CC_FULLOPEN || lpp->lpcc->Flags & CC_PREVENTFULLOPEN)
+ {
+ hwnd=GetDlgItem(hDlg,0x2cf);
+ EnableWindow(hwnd,FALSE);
+ }
+ if (!(lpp->lpcc->Flags & CC_FULLOPEN) || lpp->lpcc->Flags & CC_PREVENTFULLOPEN)
+ {
+ rect=lpp->fullsize;
+ res=rect.bottom-rect.top;
+ hwnd=GetDlgItem(hDlg,0x2c6); /* cut at left border */
+ point.x=point.y=0;
+ ClientToScreen16(hwnd,&point);
+ ScreenToClient16(hDlg,&point);
+ GetClientRect16(hDlg,&rect);
+ point.x+=GetSystemMetrics(SM_CXDLGFRAME);
+ SetWindowPos(hDlg,0,0,0,point.x,res,SWP_NOMOVE|SWP_NOZORDER);
+
+ ShowWindow(GetDlgItem(hDlg,0x2c6),SW_HIDE);
+ ShowWindow(GetDlgItem(hDlg,0x2c5),SW_HIDE);
+ }
+ else
+ CC_SwitchToFullSize(hDlg,lpp->lpcc->rgbResult,NULL);
+ res=TRUE;
+ for (i=0x2bf;i<0x2c5;i++)
+ SendMessage16(GetDlgItem(hDlg,i),EM_LIMITTEXT16,3,0); /* max 3 digits: xyz */
+ if (CC_HookCallChk(lpp->lpcc))
+ res=CallWindowProc16(lpp->lpcc->lpfnHook,hDlg,WM_INITDIALOG,wParam,lParam);
+
+
+ /* Set the initial values of the color chooser dialog */
+ r = GetRValue(lpp->lpcc->rgbResult);
+ g = GetGValue(lpp->lpcc->rgbResult);
+ b = GetBValue(lpp->lpcc->rgbResult);
+
+ CC_PaintSelectedColor(hDlg,lpp->lpcc->rgbResult);
+ lpp->h=CC_RGBtoHSL('H',r,g,b);
+ lpp->s=CC_RGBtoHSL('S',r,g,b);
+ lpp->l=CC_RGBtoHSL('L',r,g,b);
+
+ /* Doing it the long way becaus CC_EditSetRGB/HSL doesn'nt seem to work */
+ SetDlgItemInt(hDlg, 703, lpp->h, TRUE);
+ SetDlgItemInt(hDlg, 704, lpp->s, TRUE);
+ SetDlgItemInt(hDlg, 705, lpp->l, TRUE);
+ SetDlgItemInt(hDlg, 706, r, TRUE);
+ SetDlgItemInt(hDlg, 707, g, TRUE);
+ SetDlgItemInt(hDlg, 708, b, TRUE);
+
+ CC_PaintCross(hDlg,lpp->h,lpp->s);
+ CC_PaintTriangle(hDlg,lpp->l);
+
+ return res;
+}
+
+/***********************************************************************
+ * CC_WMCommand [internal]
+ */
+static LRESULT CC_WMCommand(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam)
+{
+ int r,g,b,i,xx;
+ UINT16 cokmsg;
+ HDC hdc;
+ COLORREF *cr;
+ struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLongA(hDlg, DWL_USER);
+ TRACE(commdlg,"CC_WMCommand wParam=%x lParam=%lx\n",wParam,lParam);
+ switch (wParam)
+ {
+ case 0x2c2: /* edit notify RGB */
+ case 0x2c3:
+ case 0x2c4:
+ if (HIWORD(lParam)==EN_UPDATE && !lpp->updating)
+ {
+ i=CC_CheckDigitsInEdit(LOWORD(lParam),255);
+ r=GetRValue(lpp->lpcc->rgbResult);
+ g=GetGValue(lpp->lpcc->rgbResult);
+ b=GetBValue(lpp->lpcc->rgbResult);
+ xx=0;
+ switch (wParam)
+ {
+ case 0x2c2:if ((xx=(i!=r))) r=i;break;
+ case 0x2c3:if ((xx=(i!=g))) g=i;break;
+ case 0x2c4:if ((xx=(i!=b))) b=i;break;
+ }
+ if (xx) /* something has changed */
+ {
+ lpp->lpcc->rgbResult=RGB(r,g,b);
+ CC_PaintSelectedColor(hDlg,lpp->lpcc->rgbResult);
+ lpp->h=CC_RGBtoHSL('H',r,g,b);
+ lpp->s=CC_RGBtoHSL('S',r,g,b);
+ lpp->l=CC_RGBtoHSL('L',r,g,b);
+ CC_EditSetHSL(hDlg,lpp->h,lpp->s,lpp->l);
+ CC_PaintCross(hDlg,lpp->h,lpp->s);
+ CC_PaintTriangle(hDlg,lpp->l);
+ }
+ }
+ break;
+
+ case 0x2bf: /* edit notify HSL */
+ case 0x2c0:
+ case 0x2c1:
+ if (HIWORD(lParam)==EN_UPDATE && !lpp->updating)
+ {
+ i=CC_CheckDigitsInEdit(LOWORD(lParam),wParam==0x2bf?239:240);
+ xx=0;
+ switch (wParam)
+ {
+ case 0x2bf:if ((xx=(i!=lpp->h))) lpp->h=i;break;
+ case 0x2c0:if ((xx=(i!=lpp->s))) lpp->s=i;break;
+ case 0x2c1:if ((xx=(i!=lpp->l))) lpp->l=i;break;
+ }
+ if (xx) /* something has changed */
+ {
+ r=CC_HSLtoRGB('R',lpp->h,lpp->s,lpp->l);
+ g=CC_HSLtoRGB('G',lpp->h,lpp->s,lpp->l);
+ b=CC_HSLtoRGB('B',lpp->h,lpp->s,lpp->l);
+ lpp->lpcc->rgbResult=RGB(r,g,b);
+ CC_PaintSelectedColor(hDlg,lpp->lpcc->rgbResult);
+ CC_EditSetRGB(hDlg,lpp->lpcc->rgbResult);
+ CC_PaintCross(hDlg,lpp->h,lpp->s);
+ CC_PaintTriangle(hDlg,lpp->l);
+ }
+ }
+ break;
+
+ case 0x2cf:
+ CC_SwitchToFullSize(hDlg,lpp->lpcc->rgbResult,&lpp->fullsize);
+ InvalidateRect( hDlg, NULL, TRUE );
+ SetFocus(GetDlgItem(hDlg,0x2bf));
+ break;
+
+ case 0x2c8: /* add colors ... column by column */
+ cr=PTR_SEG_TO_LIN(lpp->lpcc->lpCustColors);
+ cr[(lpp->nextuserdef%2)*8 + lpp->nextuserdef/2]=lpp->lpcc->rgbResult;
+ if (++lpp->nextuserdef==16)
+ lpp->nextuserdef=0;
+ CC_PaintUserColorArray(hDlg,2,8,PTR_SEG_TO_LIN(lpp->lpcc->lpCustColors));
+ break;
+
+ case 0x2c9: /* resulting color */
+ hdc=GetDC(hDlg);
+ lpp->lpcc->rgbResult=GetNearestColor(hdc,lpp->lpcc->rgbResult);
+ ReleaseDC(hDlg,hdc);
+ CC_EditSetRGB(hDlg,lpp->lpcc->rgbResult);
+ CC_PaintSelectedColor(hDlg,lpp->lpcc->rgbResult);
+ r=GetRValue(lpp->lpcc->rgbResult);
+ g=GetGValue(lpp->lpcc->rgbResult);
+ b=GetBValue(lpp->lpcc->rgbResult);
+ lpp->h=CC_RGBtoHSL('H',r,g,b);
+ lpp->s=CC_RGBtoHSL('S',r,g,b);
+ lpp->l=CC_RGBtoHSL('L',r,g,b);
+ CC_EditSetHSL(hDlg,lpp->h,lpp->s,lpp->l);
+ CC_PaintCross(hDlg,lpp->h,lpp->s);
+ CC_PaintTriangle(hDlg,lpp->l);
+ break;
+
+ case 0x40e: /* Help! */ /* The Beatles, 1965 ;-) */
+ i=RegisterWindowMessageA( HELPMSGSTRING );
+ if (lpp->lpcc->hwndOwner)
+ SendMessage16(lpp->lpcc->hwndOwner,i,0,(LPARAM)lpp->lpcc);
+ if (CC_HookCallChk(lpp->lpcc))
+ CallWindowProc16(lpp->lpcc->lpfnHook,hDlg,
+ WM_COMMAND,psh15,(LPARAM)lpp->lpcc);
+ break;
+
+ case IDOK :
+ cokmsg=RegisterWindowMessageA( COLOROKSTRING );
+ if (lpp->lpcc->hwndOwner)
+ if (SendMessage16(lpp->lpcc->hwndOwner,cokmsg,0,(LPARAM)lpp->lpcc))
+ break; /* do NOT close */
+
+ EndDialog (hDlg, 1) ;
+ return TRUE ;
+
+ case IDCANCEL :
+ EndDialog (hDlg, 0) ;
+ return TRUE ;
+
+ }
+ return FALSE;
+}
+
+/***********************************************************************
+ * CC_WMPaint [internal]
+ */
+static LRESULT CC_WMPaint(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam)
+{
+ HDC hdc;
+ PAINTSTRUCT ps;
+ struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLongA(hDlg, DWL_USER);
+
+ hdc=BeginPaint(hDlg,&ps);
+ EndPaint(hDlg,&ps);
+ /* we have to paint dialog children except text and buttons */
+
+ CC_PaintPredefColorArray(hDlg,6,8);
+ CC_PaintUserColorArray(hDlg,2,8,PTR_SEG_TO_LIN(lpp->lpcc->lpCustColors));
+ CC_PaintColorGraph(hDlg);
+ CC_PaintLumBar(hDlg,lpp->h,lpp->s);
+ CC_PaintCross(hDlg,lpp->h,lpp->s);
+ CC_PaintTriangle(hDlg,lpp->l);
+ CC_PaintSelectedColor(hDlg,lpp->lpcc->rgbResult);
+
+ /* special necessary for Wine */
+ ValidateRect(GetDlgItem(hDlg,0x2d0),NULL);
+ ValidateRect(GetDlgItem(hDlg,0x2d1),NULL);
+ ValidateRect(GetDlgItem(hDlg,0x2c6),NULL);
+ ValidateRect(GetDlgItem(hDlg,0x2be),NULL);
+ ValidateRect(GetDlgItem(hDlg,0x2c5),NULL);
+ /* hope we can remove it later -->FIXME */
+ return TRUE;
+}
+
+
+/***********************************************************************
+ * CC_WMLButtonDown [internal]
+ */
+static LRESULT CC_WMLButtonDown(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam)
+{
+ struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLongA(hDlg, DWL_USER);
+ int r,g,b,i;
+ i=0;
+ if (CC_MouseCheckPredefColorArray(hDlg,0x2d0,6,8,lParam,&lpp->lpcc->rgbResult))
+ i=1;
+ else
+ if (CC_MouseCheckUserColorArray(hDlg,0x2d1,2,8,lParam,&lpp->lpcc->rgbResult,
+ PTR_SEG_TO_LIN(lpp->lpcc->lpCustColors)))
+ i=1;
+ else
+ if (CC_MouseCheckColorGraph(hDlg,0x2c6,&lpp->h,&lpp->s,lParam))
+ i=2;
+ else
+ if (CC_MouseCheckColorGraph(hDlg,0x2be,NULL,&lpp->l,lParam))
+ i=2;
+ if (i==2)
+ {
+ r=CC_HSLtoRGB('R',lpp->h,lpp->s,lpp->l);
+ g=CC_HSLtoRGB('G',lpp->h,lpp->s,lpp->l);
+ b=CC_HSLtoRGB('B',lpp->h,lpp->s,lpp->l);
+ lpp->lpcc->rgbResult=RGB(r,g,b);
+ }
+ if (i==1)
+ {
+ r=GetRValue(lpp->lpcc->rgbResult);
+ g=GetGValue(lpp->lpcc->rgbResult);
+ b=GetBValue(lpp->lpcc->rgbResult);
+ lpp->h=CC_RGBtoHSL('H',r,g,b);
+ lpp->s=CC_RGBtoHSL('S',r,g,b);
+ lpp->l=CC_RGBtoHSL('L',r,g,b);
+ }
+ if (i)
+ {
+ CC_EditSetRGB(hDlg,lpp->lpcc->rgbResult);
+ CC_EditSetHSL(hDlg,lpp->h,lpp->s,lpp->l);
+ CC_PaintCross(hDlg,lpp->h,lpp->s);
+ CC_PaintTriangle(hDlg,lpp->l);
+ CC_PaintSelectedColor(hDlg,lpp->lpcc->rgbResult);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/***********************************************************************
+ * ColorDlgProc (COMMDLG.8)
+ */
+LRESULT WINAPI ColorDlgProc16(HWND16 hDlg, UINT16 message,
+ WPARAM16 wParam, LONG lParam)
+{
+ int res;
+ struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLongA(hDlg, DWL_USER);
+ if (message!=WM_INITDIALOG)
+ {
+ if (!lpp)
+ return FALSE;
+ res=0;
+ if (CC_HookCallChk(lpp->lpcc))
+ res=CallWindowProc16(lpp->lpcc->lpfnHook,hDlg,message,wParam,lParam);
+ if (res)
+ return res;
+ }
+
+ /* FIXME: SetRGB message
+ if (message && message==msetrgb)
+ return HandleSetRGB(hDlg,lParam);
+ */
+
+ switch (message)
+ {
+ case WM_INITDIALOG:
+ return CC_WMInitDialog(hDlg,wParam,lParam);
+ case WM_NCDESTROY:
+ DeleteDC(lpp->hdcMem);
+ DeleteObject(lpp->hbmMem);
+ free(lpp);
+ SetWindowLongA(hDlg, DWL_USER, 0L); /* we don't need it anymore */
+ break;
+ case WM_COMMAND:
+ if (CC_WMCommand(hDlg, wParam, lParam))
+ return TRUE;
+ break;
+ case WM_PAINT:
+ if (CC_WMPaint(hDlg, wParam, lParam))
+ return TRUE;
+ break;
+ case WM_LBUTTONDBLCLK:
+ if (CC_MouseCheckResultWindow(hDlg,lParam))
+ return TRUE;
+ break;
+ case WM_MOUSEMOVE: /* FIXME: calculate new hue,sat,lum (if in color graph) */
+ break;
+ case WM_LBUTTONUP: /* FIXME: ClipCursor off (if in color graph)*/
+ break;
+ case WM_LBUTTONDOWN:/* FIXME: ClipCursor on (if in color graph)*/
+ if (CC_WMLButtonDown(hDlg, wParam, lParam))
+ return TRUE;
+ break;
+ }
+ return FALSE ;
+}
+
+
+/***********************************************************************
+ * ChooseColorA (COMDLG32.1)
+ */
+BOOL WINAPI ChooseColorA(LPCHOOSECOLORA lpChCol )
+
+{
+ BOOL16 ret;
+ char *str = NULL;
+ COLORREF* ccref=SEGPTR_ALLOC(64);
+ LPCHOOSECOLOR16 lpcc16=SEGPTR_ALLOC(sizeof(CHOOSECOLOR16));
+
+ memset(lpcc16,'\0',sizeof(*lpcc16));
+ lpcc16->lStructSize=sizeof(*lpcc16);
+ lpcc16->hwndOwner=lpChCol->hwndOwner;
+ lpcc16->hInstance=MapHModuleLS(lpChCol->hInstance);
+ lpcc16->rgbResult=lpChCol->rgbResult;
+ memcpy(ccref,lpChCol->lpCustColors,64);
+ lpcc16->lpCustColors=(COLORREF*)SEGPTR_GET(ccref);
+ lpcc16->Flags=lpChCol->Flags;
+ lpcc16->lCustData=lpChCol->lCustData;
+ lpcc16->lpfnHook=(WNDPROC16)lpChCol->lpfnHook;
+ if (lpChCol->lpTemplateName)
+ str = SEGPTR_STRDUP(lpChCol->lpTemplateName );
+ lpcc16->lpTemplateName=SEGPTR_GET(str);
+
+ ret = ChooseColor16(lpcc16);
+
+ if(ret)
+ lpChCol->rgbResult = lpcc16->rgbResult;
+
+ if(str)
+ SEGPTR_FREE(str);
+ memcpy(lpChCol->lpCustColors,ccref,64);
+ SEGPTR_FREE(ccref);
+ SEGPTR_FREE(lpcc16);
+ return (BOOL)ret;
+}
+
+/***********************************************************************
+ * ChooseColorW (COMDLG32.2)
+ */
+BOOL WINAPI ChooseColorW(LPCHOOSECOLORW lpChCol )
+
+{
+ BOOL16 ret;
+ char *str = NULL;
+ COLORREF* ccref=SEGPTR_ALLOC(64);
+ LPCHOOSECOLOR16 lpcc16=SEGPTR_ALLOC(sizeof(CHOOSECOLOR16));
+
+ memset(lpcc16,'\0',sizeof(*lpcc16));
+ lpcc16->lStructSize=sizeof(*lpcc16);
+ lpcc16->hwndOwner=lpChCol->hwndOwner;
+ lpcc16->hInstance=MapHModuleLS(lpChCol->hInstance);
+ lpcc16->rgbResult=lpChCol->rgbResult;
+ memcpy(ccref,lpChCol->lpCustColors,64);
+ lpcc16->lpCustColors=(COLORREF*)SEGPTR_GET(ccref);
+ lpcc16->Flags=lpChCol->Flags;
+ lpcc16->lCustData=lpChCol->lCustData;
+ lpcc16->lpfnHook=(WNDPROC16)lpChCol->lpfnHook;
+ if (lpChCol->lpTemplateName)
+ str = SEGPTR_STRDUP_WtoA(lpChCol->lpTemplateName );
+ lpcc16->lpTemplateName=SEGPTR_GET(str);
+
+ ret = ChooseColor16(lpcc16);
+
+ if(ret)
+ lpChCol->rgbResult = lpcc16->rgbResult;
+
+ if(str)
+ SEGPTR_FREE(str);
+ memcpy(lpChCol->lpCustColors,ccref,64);
+ SEGPTR_FREE(ccref);
+ SEGPTR_FREE(lpcc16);
+ return (BOOL)ret;
+}
diff --git a/dlls/commdlg/filedlg.c b/dlls/commdlg/filedlg.c
new file mode 100644
index 0000000..9e9d9ec
--- /dev/null
+++ b/dlls/commdlg/filedlg.c
@@ -0,0 +1,1359 @@
+/*
+ * COMMDLG - File Dialogs
+ *
+ * Copyright 1994 Martin Ayotte
+ * Copyright 1996 Albrecht Kleine
+ * Copyright 1999 Klaas van Gend
+ */
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include "winbase.h"
+#include "wine/winbase16.h"
+#include "wine/winuser16.h"
+#include "win.h"
+#include "heap.h"
+#include "message.h"
+#include "commdlg.h"
+#include "resource.h"
+#include "dialog.h"
+#include "dlgs.h"
+#include "module.h"
+#include "drive.h"
+#include "debug.h"
+#include "font.h"
+#include "winproc.h"
+
+extern DWORD CommDlgLastError;
+
+static HBITMAP16 hFolder = 0;
+static HBITMAP16 hFolder2 = 0;
+static HBITMAP16 hFloppy = 0;
+static HBITMAP16 hHDisk = 0;
+static HBITMAP16 hCDRom = 0;
+
+static const char defaultfilter[]=" \0\0";
+
+/***********************************************************************
+ * FileDlg_Init [internal]
+ */
+static BOOL FileDlg_Init(void)
+{
+ static BOOL initialized = 0;
+
+ if (!initialized) {
+ if (!hFolder) hFolder = LoadBitmap16(0, MAKEINTRESOURCE16(OBM_FOLDER));
+ if (!hFolder2) hFolder2 = LoadBitmap16(0, MAKEINTRESOURCE16(OBM_FOLDER2));
+ if (!hFloppy) hFloppy = LoadBitmap16(0, MAKEINTRESOURCE16(OBM_FLOPPY));
+ if (!hHDisk) hHDisk = LoadBitmap16(0, MAKEINTRESOURCE16(OBM_HDISK));
+ if (!hCDRom) hCDRom = LoadBitmap16(0, MAKEINTRESOURCE16(OBM_CDROM));
+ if (hFolder == 0 || hFolder2 == 0 || hFloppy == 0 ||
+ hHDisk == 0 || hCDRom == 0)
+ {
+ WARN(commdlg, "Error loading bitmaps !\nprin");
+ return FALSE;
+ }
+ initialized = TRUE;
+ }
+ return TRUE;
+}
+
+/***********************************************************************
+ * GetOpenFileName16 (COMMDLG.1)
+ *
+ * Creates a dialog box for the user to select a file to open.
+ *
+ * RETURNS
+ * TRUE on succes: user selected a valid file
+ * FALSE on cancel, error, close or filename-does-not-fit-in-buffer.
+ *
+ * BUGS
+ * unknown, there are some FIXME's left.
+ */
+BOOL16 WINAPI GetOpenFileName16(
+ SEGPTR ofn /* addess of structure with data*/
+ )
+{
+ HINSTANCE hInst;
+ HANDLE hDlgTmpl = 0, hResInfo;
+ BOOL bRet = FALSE, win32Format = FALSE;
+ HWND hwndDialog;
+ LPOPENFILENAME16 lpofn = (LPOPENFILENAME16)PTR_SEG_TO_LIN(ofn);
+ LPCVOID template;
+ char defaultopen[]="Open File";
+ char *str=0,*str1=0;
+
+ if (!lpofn || !FileDlg_Init()) return FALSE;
+
+ if (lpofn->Flags & OFN_WINE) {
+ if (lpofn->Flags & OFN_ENABLETEMPLATEHANDLE)
+ {
+ if (!(template = LockResource( MapHModuleSL(lpofn->hInstance ))))
+ {
+ CommDlgLastError = CDERR_LOADRESFAILURE;
+ return FALSE;
+ }
+ }
+ else if (lpofn->Flags & OFN_ENABLETEMPLATE)
+ {
+ if (!(hResInfo = FindResourceA(MapHModuleSL(lpofn->hInstance),
+ PTR_SEG_TO_LIN(lpofn->lpTemplateName), RT_DIALOGA)))
+ {
+ CommDlgLastError = CDERR_FINDRESFAILURE;
+ return FALSE;
+ }
+ if (!(hDlgTmpl = LoadResource( MapHModuleSL(lpofn->hInstance),
+ hResInfo )) ||
+ !(template = LockResource( hDlgTmpl )))
+ {
+ CommDlgLastError = CDERR_LOADRESFAILURE;
+ return FALSE;
+ }
+ } else {
+ template = SYSRES_GetResPtr( SYSRES_DIALOG_OPEN_FILE );
+ }
+ win32Format = TRUE;
+ } else {
+ if (lpofn->Flags & OFN_ENABLETEMPLATEHANDLE)
+ {
+ if (!(template = LockResource16( lpofn->hInstance )))
+ {
+ CommDlgLastError = CDERR_LOADRESFAILURE;
+ return FALSE;
+ }
+ }
+ else if (lpofn->Flags & OFN_ENABLETEMPLATE)
+ {
+ if (!(hResInfo = FindResource16(lpofn->hInstance,
+ lpofn->lpTemplateName,
+ RT_DIALOG16)))
+ {
+ CommDlgLastError = CDERR_FINDRESFAILURE;
+ return FALSE;
+ }
+ if (!(hDlgTmpl = LoadResource16( lpofn->hInstance, hResInfo )) ||
+ !(template = LockResource16( hDlgTmpl )))
+ {
+ CommDlgLastError = CDERR_LOADRESFAILURE;
+ return FALSE;
+ }
+ } else {
+ template = SYSRES_GetResPtr( SYSRES_DIALOG_OPEN_FILE );
+ win32Format = TRUE;
+ }
+ }
+
+ hInst = WIN_GetWindowInstance( lpofn->hwndOwner );
+
+ if (!(lpofn->lpstrFilter))
+ {
+ str = SEGPTR_ALLOC(sizeof(defaultfilter));
+ TRACE(commdlg,"Alloc %p default for Filetype in GetOpenFileName\n",str);
+ memcpy(str,defaultfilter,sizeof(defaultfilter));
+ lpofn->lpstrFilter=SEGPTR_GET(str);
+ }
+
+ if (!(lpofn->lpstrTitle))
+ {
+ str1 = SEGPTR_ALLOC(strlen(defaultopen)+1);
+ TRACE(commdlg,"Alloc %p default for Title in GetOpenFileName\n",str1);
+ strcpy(str1,defaultopen);
+ lpofn->lpstrTitle=SEGPTR_GET(str1);
+ }
+
+ /* FIXME: doesn't handle win32 format correctly yet */
+ hwndDialog = DIALOG_CreateIndirect( hInst, template, win32Format,
+ lpofn->hwndOwner,
+ (DLGPROC16)MODULE_GetWndProcEntry16("FileOpenDlgProc"),
+ ofn, WIN_PROC_16 );
+ if (hwndDialog) bRet = DIALOG_DoDialogBox( hwndDialog, lpofn->hwndOwner );
+
+ if (str1)
+ {
+ TRACE(commdlg,"Freeing %p default for Title in GetOpenFileName\n",str1);
+ SEGPTR_FREE(str1);
+ lpofn->lpstrTitle=0;
+ }
+
+ if (str)
+ {
+ TRACE(commdlg,"Freeing %p default for Filetype in GetOpenFileName\n",str);
+ SEGPTR_FREE(str);
+ lpofn->lpstrFilter=0;
+ }
+
+ if (hDlgTmpl) {
+ if (lpofn->Flags & OFN_WINE)
+ FreeResource( hDlgTmpl );
+ else
+ FreeResource16( hDlgTmpl );
+ }
+
+ TRACE(commdlg,"return lpstrFile='%s' !\n",
+ (LPSTR)PTR_SEG_TO_LIN(lpofn->lpstrFile));
+ return bRet;
+}
+
+
+/***********************************************************************
+ * GetSaveFileName (COMMDLG.2)
+ *
+ * Creates a dialog box for the user to select a file to save.
+ *
+ * RETURNS
+ * TRUE on succes: user enters a valid file
+ * FALSE on cancel, error, close or filename-does-not-fit-in-buffer.
+ *
+ * BUGS
+ * unknown. There are some FIXME's left.
+ */
+BOOL16 WINAPI GetSaveFileName16(
+ SEGPTR ofn /* addess of structure with data*/
+ )
+{
+ HINSTANCE hInst;
+ HANDLE hDlgTmpl = 0;
+ BOOL bRet = FALSE, win32Format = FALSE;
+ LPOPENFILENAME16 lpofn = (LPOPENFILENAME16)PTR_SEG_TO_LIN(ofn);
+ LPCVOID template;
+ HWND hwndDialog;
+ char defaultsave[]="Save as";
+ char *str =0,*str1=0;
+
+ if (!lpofn || !FileDlg_Init()) return FALSE;
+
+ if (lpofn->Flags & OFN_WINE) {
+ if (lpofn->Flags & OFN_ENABLETEMPLATEHANDLE)
+ {
+ if (!(template = LockResource( MapHModuleSL(lpofn->hInstance ))))
+ {
+ CommDlgLastError = CDERR_LOADRESFAILURE;
+ return FALSE;
+ }
+ }
+ else if (lpofn->Flags & OFN_ENABLETEMPLATE)
+ {
+ HANDLE hResInfo;
+ if (!(hResInfo = FindResourceA(MapHModuleSL(lpofn->hInstance),
+ PTR_SEG_TO_LIN(lpofn->lpTemplateName),
+ RT_DIALOGA)))
+ {
+ CommDlgLastError = CDERR_FINDRESFAILURE;
+ return FALSE;
+ }
+ if (!(hDlgTmpl = LoadResource(MapHModuleSL(lpofn->hInstance),
+ hResInfo)) ||
+ !(template = LockResource(hDlgTmpl)))
+ {
+ CommDlgLastError = CDERR_LOADRESFAILURE;
+ return FALSE;
+ }
+ win32Format= TRUE;
+ } else {
+ template = SYSRES_GetResPtr( SYSRES_DIALOG_SAVE_FILE );
+ win32Format = TRUE;
+ }
+ } else {
+ if (lpofn->Flags & OFN_ENABLETEMPLATEHANDLE)
+ {
+ if (!(template = LockResource16( lpofn->hInstance )))
+ {
+ CommDlgLastError = CDERR_LOADRESFAILURE;
+ return FALSE;
+ }
+ }
+ else if (lpofn->Flags & OFN_ENABLETEMPLATE)
+ {
+ HANDLE16 hResInfo;
+ if (!(hResInfo = FindResource16(lpofn->hInstance,
+ lpofn->lpTemplateName,
+ RT_DIALOG16)))
+ {
+ CommDlgLastError = CDERR_FINDRESFAILURE;
+ return FALSE;
+ }
+ if (!(hDlgTmpl = LoadResource16( lpofn->hInstance, hResInfo )) ||
+ !(template = LockResource16( hDlgTmpl )))
+ {
+ CommDlgLastError = CDERR_LOADRESFAILURE;
+ return FALSE;
+ }
+ } else {
+ template = SYSRES_GetResPtr( SYSRES_DIALOG_SAVE_FILE );
+ win32Format = TRUE;
+ }
+ }
+
+ hInst = WIN_GetWindowInstance( lpofn->hwndOwner );
+
+ if (!(lpofn->lpstrFilter))
+ {
+ str = SEGPTR_ALLOC(sizeof(defaultfilter));
+ TRACE(commdlg,"Alloc default for Filetype in GetSaveFileName\n");
+ memcpy(str,defaultfilter,sizeof(defaultfilter));
+ lpofn->lpstrFilter=SEGPTR_GET(str);
+ }
+
+ if (!(lpofn->lpstrTitle))
+ {
+ str1 = SEGPTR_ALLOC(sizeof(defaultsave)+1);
+ TRACE(commdlg,"Alloc default for Title in GetSaveFileName\n");
+ strcpy(str1,defaultsave);
+ lpofn->lpstrTitle=SEGPTR_GET(str1);
+ }
+
+ hwndDialog = DIALOG_CreateIndirect( hInst, template, win32Format,
+ lpofn->hwndOwner,
+ (DLGPROC16)MODULE_GetWndProcEntry16("FileSaveDlgProc"),
+ ofn, WIN_PROC_16 );
+ if (hwndDialog) bRet = DIALOG_DoDialogBox( hwndDialog, lpofn->hwndOwner );
+
+ if (str1)
+ {
+ TRACE(commdlg,"Freeing %p default for Title in GetSaveFileName\n",str1);
+ SEGPTR_FREE(str1);
+ lpofn->lpstrTitle=0;
+ }
+
+ if (str)
+ {
+ TRACE(commdlg,"Freeing %p default for Filetype in GetSaveFileName\n",str);
+ SEGPTR_FREE(str);
+ lpofn->lpstrFilter=0;
+ }
+
+ if (hDlgTmpl) {
+ if (lpofn->Flags & OFN_WINE)
+ FreeResource( hDlgTmpl );
+ else
+ FreeResource16( hDlgTmpl );
+ }
+
+ TRACE(commdlg, "return lpstrFile='%s' !\n",
+ (LPSTR)PTR_SEG_TO_LIN(lpofn->lpstrFile));
+ return bRet;
+}
+
+/***********************************************************************
+ * FILEDLG_StripEditControl [internal]
+ * Strip pathnames off the contents of the edit control.
+ */
+static void FILEDLG_StripEditControl(HWND16 hwnd)
+{
+ char temp[512], *cp;
+
+ GetDlgItemTextA( hwnd, edt1, temp, sizeof(temp) );
+ cp = strrchr(temp, '\\');
+ if (cp != NULL) {
+ strcpy(temp, cp+1);
+ }
+ cp = strrchr(temp, ':');
+ if (cp != NULL) {
+ strcpy(temp, cp+1);
+ }
+ /* FIXME: shouldn't we do something with the result here? ;-) */
+}
+
+/***********************************************************************
+ * FILEDLG_ScanDir [internal]
+ */
+static BOOL FILEDLG_ScanDir(HWND16 hWnd, LPSTR newPath)
+{
+ char buffer[512];
+ char* str = buffer;
+ int drive;
+ HWND hlb;
+
+ lstrcpynA(buffer, newPath, sizeof(buffer));
+
+ if (str[0] && (str[1] == ':')) {
+ drive = toupper(str[0]) - 'A';
+ str += 2;
+ if (!DRIVE_SetCurrentDrive(drive))
+ return FALSE;
+ } else {
+ drive = DRIVE_GetCurrentDrive();
+ }
+
+ if (str[0] && !DRIVE_Chdir(drive, str)) {
+ return FALSE;
+ }
+
+ GetDlgItemTextA(hWnd, edt1, buffer, sizeof(buffer));
+ if ((hlb = GetDlgItem(hWnd, lst1)) != 0) {
+ char* scptr; /* ptr on semi-colon */
+ char* filter = buffer;
+
+ TRACE(commdlg, "Using filter %s\n", filter);
+ SendMessageA(hlb, LB_RESETCONTENT, 0, 0);
+ while (filter) {
+ scptr = strchr(filter, ';');
+ if (scptr) *scptr = 0;
+ TRACE(commdlg, "Using file spec %s\n", filter);
+ if (SendMessageA(hlb, LB_DIR, 0, (LPARAM)filter) == LB_ERR)
+ return FALSE;
+ if (scptr) *scptr = ';';
+ filter = (scptr) ? (scptr + 1) : 0;
+ }
+ }
+
+ strcpy(buffer, "*.*");
+ return DlgDirListA(hWnd, buffer, lst2, stc1, 0x8010);
+}
+
+/***********************************************************************
+ * FILEDLG_GetFileType [internal]
+ */
+
+static LPSTR FILEDLG_GetFileType(LPSTR cfptr, LPSTR fptr, WORD index)
+{
+ int n, i;
+ i = 0;
+ if (cfptr)
+ for ( ;(n = strlen(cfptr)) != 0; i++)
+ {
+ cfptr += n + 1;
+ if (i == index)
+ return cfptr;
+ cfptr += strlen(cfptr) + 1;
+ }
+ if (fptr)
+ for ( ;(n = strlen(fptr)) != 0; i++)
+ {
+ fptr += n + 1;
+ if (i == index)
+ return fptr;
+ fptr += strlen(fptr) + 1;
+ }
+ return "*.*"; /* FIXME */
+}
+
+/***********************************************************************
+ * FILEDLG_WMDrawItem [internal]
+ */
+static LONG FILEDLG_WMDrawItem(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam,int savedlg)
+{
+ LPDRAWITEMSTRUCT16 lpdis = (LPDRAWITEMSTRUCT16)PTR_SEG_TO_LIN(lParam);
+ char *str;
+ HBRUSH hBrush;
+ HBITMAP16 hBitmap, hPrevBitmap;
+ BITMAP16 bm;
+ HDC hMemDC;
+
+ if (lpdis->CtlType == ODT_LISTBOX && lpdis->CtlID == lst1)
+ {
+ if (!(str = SEGPTR_ALLOC(512))) return FALSE;
+ hBrush = SelectObject(lpdis->hDC, GetStockObject(LTGRAY_BRUSH));
+ SelectObject(lpdis->hDC, hBrush);
+ FillRect16(lpdis->hDC, &lpdis->rcItem, hBrush);
+ SendMessage16(lpdis->hwndItem, LB_GETTEXT16, lpdis->itemID,
+ (LPARAM)SEGPTR_GET(str));
+
+ if (savedlg) /* use _gray_ text in FileSaveDlg */
+ {
+ if (!lpdis->itemState)
+ SetTextColor(lpdis->hDC,GetSysColor(COLOR_GRAYTEXT) );
+ else
+ SetTextColor(lpdis->hDC,GetSysColor(COLOR_WINDOWTEXT) );
+ /* inversion of gray would be bad readable */
+ }
+
+ TextOut16(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top,
+ str, strlen(str));
+ if (lpdis->itemState != 0) {
+ InvertRect16(lpdis->hDC, &lpdis->rcItem);
+ }
+ SEGPTR_FREE(str);
+ return TRUE;
+ }
+
+ if (lpdis->CtlType == ODT_LISTBOX && lpdis->CtlID == lst2)
+ {
+ if (!(str = SEGPTR_ALLOC(512))) return FALSE;
+ hBrush = SelectObject(lpdis->hDC, GetStockObject(LTGRAY_BRUSH));
+ SelectObject(lpdis->hDC, hBrush);
+ FillRect16(lpdis->hDC, &lpdis->rcItem, hBrush);
+ SendMessage16(lpdis->hwndItem, LB_GETTEXT16, lpdis->itemID,
+ (LPARAM)SEGPTR_GET(str));
+
+ hBitmap = hFolder;
+ GetObject16( hBitmap, sizeof(bm), &bm );
+ TextOut16(lpdis->hDC, lpdis->rcItem.left + bm.bmWidth,
+ lpdis->rcItem.top, str, strlen(str));
+ hMemDC = CreateCompatibleDC(lpdis->hDC);
+ hPrevBitmap = SelectObject(hMemDC, hBitmap);
+ BitBlt(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top,
+ bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ SelectObject(hMemDC, hPrevBitmap);
+ DeleteDC(hMemDC);
+ if (lpdis->itemState != 0) InvertRect16(lpdis->hDC, &lpdis->rcItem);
+ SEGPTR_FREE(str);
+ return TRUE;
+ }
+ if (lpdis->CtlType == ODT_COMBOBOX && lpdis->CtlID == cmb2)
+ {
+ if (!(str = SEGPTR_ALLOC(512))) return FALSE;
+ hBrush = SelectObject(lpdis->hDC, GetStockObject(LTGRAY_BRUSH));
+ SelectObject(lpdis->hDC, hBrush);
+ FillRect16(lpdis->hDC, &lpdis->rcItem, hBrush);
+ SendMessage16(lpdis->hwndItem, CB_GETLBTEXT16, lpdis->itemID,
+ (LPARAM)SEGPTR_GET(str));
+ switch(DRIVE_GetType( str[2] - 'a' ))
+ {
+ case TYPE_FLOPPY: hBitmap = hFloppy; break;
+ case TYPE_CDROM: hBitmap = hCDRom; break;
+ case TYPE_HD:
+ case TYPE_NETWORK:
+ default: hBitmap = hHDisk; break;
+ }
+ GetObject16( hBitmap, sizeof(bm), &bm );
+ TextOut16(lpdis->hDC, lpdis->rcItem.left + bm.bmWidth,
+ lpdis->rcItem.top, str, strlen(str));
+ hMemDC = CreateCompatibleDC(lpdis->hDC);
+ hPrevBitmap = SelectObject(hMemDC, hBitmap);
+ BitBlt( lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top,
+ bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY );
+ SelectObject(hMemDC, hPrevBitmap);
+ DeleteDC(hMemDC);
+ if (lpdis->itemState != 0) InvertRect16(lpdis->hDC, &lpdis->rcItem);
+ SEGPTR_FREE(str);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/***********************************************************************
+ * FILEDLG_WMMeasureItem [internal]
+ */
+static LONG FILEDLG_WMMeasureItem(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam)
+{
+ BITMAP16 bm;
+ LPMEASUREITEMSTRUCT16 lpmeasure;
+
+ GetObject16( hFolder2, sizeof(bm), &bm );
+ lpmeasure = (LPMEASUREITEMSTRUCT16)PTR_SEG_TO_LIN(lParam);
+ lpmeasure->itemHeight = bm.bmHeight;
+ return TRUE;
+}
+
+/***********************************************************************
+ * FILEDLG_HookCallChk [internal]
+ */
+static int FILEDLG_HookCallChk(LPOPENFILENAME16 lpofn)
+{
+ if (lpofn)
+ if (lpofn->Flags & OFN_ENABLEHOOK)
+ if (lpofn->lpfnHook)
+ return 1;
+ return 0;
+}
+
+/***********************************************************************
+ * FILEDLG_CallWindowProc [internal]
+ *
+ * Adapt the structures back for win32 calls so the callee can read lpCustData
+ */
+static BOOL FILEDLG_CallWindowProc(LPOPENFILENAME16 lpofn,HWND hwnd,
+ UINT wMsg,WPARAM wParam,LPARAM lParam
+
+) {
+ BOOL needstruct;
+ BOOL result = FALSE;
+ WINDOWPROCTYPE ProcType; /* Type of Hook Function to be called. */
+
+ /* TRUE if lParam points to the OPENFILENAME16 Structure */
+ needstruct = (PTR_SEG_TO_LIN(lParam) == lpofn);
+
+ ProcType = (lpofn->Flags & OFN_WINE)
+ ? (lpofn->Flags & OFN_UNICODE) /* 32-Bit call to GetOpenFileName */
+ ? WIN_PROC_32W : WIN_PROC_32A
+ : WIN_PROC_16; /* 16-Bit call to GetOpenFileName */
+
+ if (!(lpofn->Flags & OFN_WINE))
+ /* Call to 16-Bit Hooking function... No Problem at all. */
+ return (BOOL)CallWindowProc16(
+ lpofn->lpfnHook,hwnd,(UINT16)wMsg,(WPARAM16)wParam,lParam
+ );
+ /* |OFN_WINE32 */
+ if (needstruct)
+ {
+ /* Parameter lParam points to lpofn... Convert Structure Data... */
+ if (lpofn->Flags & OFN_UNICODE)
+ {
+ OPENFILENAMEW ofnw;
+
+ /* FIXME: probably needs more converted */
+ ofnw.lCustData = lpofn->lCustData;
+ return (BOOL)CallWindowProcW(
+ (WNDPROC)lpofn->lpfnHook,hwnd,wMsg,wParam,(LPARAM)&ofnw
+ );
+ }
+ else /* ! |OFN_UNICODE */
+ {
+ OPENFILENAMEA ofna;
+
+ /* FIXME: probably needs more converted */
+ ofna.lCustData = lpofn->lCustData;
+ return (BOOL)CallWindowProcA(
+ (WNDPROC)lpofn->lpfnHook,hwnd,wMsg,wParam,(LPARAM)&ofna
+ );
+ }
+ }
+ else /* ! needstruct */
+ {
+ HWINDOWPROC hWindowProc=NULL;
+
+ if (WINPROC_SetProc(&hWindowProc, lpofn->lpfnHook, ProcType, WIN_PROC_WINDOW))
+ {
+ /* Call Window Procedure converting 16-Bit Type Parameters to 32-Bit Type Parameters */
+ result = CallWindowProc16( (WNDPROC16)hWindowProc,
+ hwnd, wMsg, wParam, lParam );
+
+ result = LOWORD(result);
+
+ WINPROC_FreeProc( hWindowProc, WIN_PROC_WINDOW );
+ }
+
+ return result;
+
+ }
+}
+
+
+/***********************************************************************
+ * FILEDLG_WMInitDialog [internal]
+ */
+
+static LONG FILEDLG_WMInitDialog(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam)
+{
+ int i, n;
+ LPOPENFILENAME16 lpofn;
+ char tmpstr[512];
+ LPSTR pstr, old_pstr;
+ SetWindowLongA(hWnd, DWL_USER, lParam);
+ lpofn = (LPOPENFILENAME16)PTR_SEG_TO_LIN(lParam);
+ if (lpofn->lpstrTitle) SetWindowText16( hWnd, lpofn->lpstrTitle );
+ /* read custom filter information */
+ if (lpofn->lpstrCustomFilter)
+ {
+ pstr = (LPSTR)PTR_SEG_TO_LIN(lpofn->lpstrCustomFilter);
+ n = 0;
+ TRACE(commdlg,"lpstrCustomFilter = %p\n", pstr);
+ while(*pstr)
+ {
+ old_pstr = pstr;
+ i = SendDlgItemMessage16(hWnd, cmb1, CB_ADDSTRING16, 0,
+ (LPARAM)lpofn->lpstrCustomFilter + n );
+ n += strlen(pstr) + 1;
+ pstr += strlen(pstr) + 1;
+ TRACE(commdlg,"add str='%s' "
+ "associated to '%s'\n", old_pstr, pstr);
+ SendDlgItemMessage16(hWnd, cmb1, CB_SETITEMDATA16, i, (LPARAM)pstr);
+ n += strlen(pstr) + 1;
+ pstr += strlen(pstr) + 1;
+ }
+ }
+ /* read filter information */
+ if (lpofn->lpstrFilter) {
+ pstr = (LPSTR)PTR_SEG_TO_LIN(lpofn->lpstrFilter);
+ n = 0;
+ while(*pstr) {
+ old_pstr = pstr;
+ i = SendDlgItemMessage16(hWnd, cmb1, CB_ADDSTRING16, 0,
+ (LPARAM)lpofn->lpstrFilter + n );
+ n += strlen(pstr) + 1;
+ pstr += strlen(pstr) + 1;
+ TRACE(commdlg,"add str='%s' "
+ "associated to '%s'\n", old_pstr, pstr);
+ SendDlgItemMessage16(hWnd, cmb1, CB_SETITEMDATA16, i, (LPARAM)pstr);
+ n += strlen(pstr) + 1;
+ pstr += strlen(pstr) + 1;
+ }
+ }
+ /* set default filter */
+ if (lpofn->nFilterIndex == 0 && lpofn->lpstrCustomFilter == (SEGPTR)NULL)
+ lpofn->nFilterIndex = 1;
+ SendDlgItemMessage16(hWnd, cmb1, CB_SETCURSEL16, lpofn->nFilterIndex - 1, 0);
+ strncpy(tmpstr, FILEDLG_GetFileType(PTR_SEG_TO_LIN(lpofn->lpstrCustomFilter),
+ PTR_SEG_TO_LIN(lpofn->lpstrFilter), lpofn->nFilterIndex - 1),511);
+ tmpstr[511]=0;
+ TRACE(commdlg,"nFilterIndex = %ld, SetText of edt1 to '%s'\n",
+ lpofn->nFilterIndex, tmpstr);
+ SetDlgItemTextA( hWnd, edt1, tmpstr );
+ /* get drive list */
+ *tmpstr = 0;
+ DlgDirListComboBoxA(hWnd, tmpstr, cmb2, 0, 0xC000);
+ /* read initial directory */
+ if (PTR_SEG_TO_LIN(lpofn->lpstrInitialDir) != NULL)
+ {
+ strncpy(tmpstr, PTR_SEG_TO_LIN(lpofn->lpstrInitialDir), 510);
+ tmpstr[510]=0;
+ if (strlen(tmpstr) > 0 && tmpstr[strlen(tmpstr)-1] != '\\'
+ && tmpstr[strlen(tmpstr)-1] != ':')
+ strcat(tmpstr,"\\");
+ }
+ else
+ *tmpstr = 0;
+ if (!FILEDLG_ScanDir(hWnd, tmpstr)) {
+ *tmpstr = 0;
+ if (!FILEDLG_ScanDir(hWnd, tmpstr))
+ WARN(commdlg, "Couldn't read initial directory %s!\n",tmpstr);
+ }
+ /* select current drive in combo 2, omit missing drives */
+ for(i=0, n=-1; i<=DRIVE_GetCurrentDrive(); i++)
+ if (DRIVE_IsValid(i)) n++;
+ SendDlgItemMessage16(hWnd, cmb2, CB_SETCURSEL16, n, 0);
+ if (!(lpofn->Flags & OFN_SHOWHELP))
+ ShowWindow(GetDlgItem(hWnd, pshHelp), SW_HIDE);
+ if (lpofn->Flags & OFN_HIDEREADONLY)
+ ShowWindow(GetDlgItem(hWnd, chx1), SW_HIDE);
+ if (FILEDLG_HookCallChk(lpofn))
+ return (BOOL16)FILEDLG_CallWindowProc(lpofn,hWnd,WM_INITDIALOG,wParam,lParam );
+ else
+ return TRUE;
+}
+
+/***********************************************************************
+ * FILEDLG_WMCommand [internal]
+ */
+BOOL in_update=FALSE;
+
+static LRESULT FILEDLG_WMCommand(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam)
+{
+ LONG lRet;
+ LPOPENFILENAME16 lpofn;
+ OPENFILENAME16 ofn2;
+ char tmpstr[512], tmpstr2[512];
+ LPSTR pstr, pstr2;
+ UINT16 control,notification;
+
+ /* Notifications are packaged differently in Win32 */
+ control = wParam;
+ notification = HIWORD(lParam);
+
+ lpofn = (LPOPENFILENAME16)PTR_SEG_TO_LIN(GetWindowLongA(hWnd, DWL_USER));
+ switch (control)
+ {
+ case lst1: /* file list */
+ FILEDLG_StripEditControl(hWnd);
+ if (notification == LBN_DBLCLK)
+ goto almost_ok;
+ lRet = SendDlgItemMessage16(hWnd, lst1, LB_GETCURSEL16, 0, 0);
+ if (lRet == LB_ERR) return TRUE;
+ if ((pstr = SEGPTR_ALLOC(512)))
+ {
+ SendDlgItemMessage16(hWnd, lst1, LB_GETTEXT16, lRet,
+ (LPARAM)SEGPTR_GET(pstr));
+ SetDlgItemTextA( hWnd, edt1, pstr );
+ SEGPTR_FREE(pstr);
+ }
+ if (FILEDLG_HookCallChk(lpofn))
+ FILEDLG_CallWindowProc(lpofn,hWnd,
+ RegisterWindowMessageA( LBSELCHSTRING ),
+ control, MAKELONG(lRet,CD_LBSELCHANGE));
+ /* FIXME: for OFN_ALLOWMULTISELECT we need CD_LBSELSUB, CD_SELADD, CD_LBSELNOITEMS */
+ return TRUE;
+ case lst2: /* directory list */
+ FILEDLG_StripEditControl(hWnd);
+ if (notification == LBN_DBLCLK)
+ {
+ lRet = SendDlgItemMessage16(hWnd, lst2, LB_GETCURSEL16, 0, 0);
+ if (lRet == LB_ERR) return TRUE;
+ pstr = SEGPTR_ALLOC(512);
+ SendDlgItemMessage16(hWnd, lst2, LB_GETTEXT16, lRet,
+ (LPARAM)SEGPTR_GET(pstr));
+ strcpy( tmpstr, pstr );
+ SEGPTR_FREE(pstr);
+ if (tmpstr[0] == '[')
+ {
+ tmpstr[strlen(tmpstr) - 1] = 0;
+ strcpy(tmpstr,tmpstr+1);
+ }
+ strcat(tmpstr, "\\");
+ goto reset_scan;
+ }
+ return TRUE;
+ case cmb1: /* file type drop list */
+ if (notification == CBN_SELCHANGE)
+ {
+ *tmpstr = 0;
+ goto reset_scan;
+ }
+ return TRUE;
+ case chx1:
+ return TRUE;
+ case pshHelp:
+ return TRUE;
+ case cmb2: /* disk drop list */
+ FILEDLG_StripEditControl(hWnd);
+ lRet = SendDlgItemMessage16(hWnd, cmb2, CB_GETCURSEL16, 0, 0L);
+ if (lRet == LB_ERR) return 0;
+ pstr = SEGPTR_ALLOC(512);
+ SendDlgItemMessage16(hWnd, cmb2, CB_GETLBTEXT16, lRet,
+ (LPARAM)SEGPTR_GET(pstr));
+ sprintf(tmpstr, "%c:", pstr[2]);
+ SEGPTR_FREE(pstr);
+ reset_scan:
+ lRet = SendDlgItemMessage16(hWnd, cmb1, CB_GETCURSEL16, 0, 0);
+ if (lRet == LB_ERR)
+ return TRUE;
+ pstr = (LPSTR)SendDlgItemMessage16(hWnd, cmb1, CB_GETITEMDATA16, lRet, 0);
+ TRACE(commdlg,"Selected filter : %s\n", pstr);
+ SetDlgItemTextA( hWnd, edt1, pstr );
+ FILEDLG_ScanDir(hWnd, tmpstr);
+ in_update=TRUE;
+ case IDOK:
+ almost_ok:
+ ofn2=*lpofn; /* for later restoring */
+ GetDlgItemTextA( hWnd, edt1, tmpstr, sizeof(tmpstr) );
+ pstr = strrchr(tmpstr, '\\');
+ if (pstr == NULL)
+ pstr = strrchr(tmpstr, ':');
+ if (strchr(tmpstr,'*') != NULL || strchr(tmpstr,'?') != NULL)
+ {
+ /* edit control contains wildcards */
+ if (pstr != NULL)
+ {
+ strncpy(tmpstr2, pstr+1, 511); tmpstr2[511]=0;
+ *(pstr+1) = 0;
+ }
+ else
+ {
+ strcpy(tmpstr2, tmpstr);
+ *tmpstr=0;
+ }
+ TRACE(commdlg,"tmpstr=%s, tmpstr2=%s\n", tmpstr, tmpstr2);
+ SetDlgItemTextA( hWnd, edt1, tmpstr2 );
+ FILEDLG_ScanDir(hWnd, tmpstr);
+ return TRUE;
+ }
+ /* no wildcards, we might have a directory or a filename */
+ /* try appending a wildcard and reading the directory */
+ pstr2 = tmpstr + strlen(tmpstr);
+ if (pstr == NULL || *(pstr+1) != 0)
+ strcat(tmpstr, "\\");
+ lRet = SendDlgItemMessage16(hWnd, cmb1, CB_GETCURSEL16, 0, 0);
+ if (lRet == LB_ERR) return TRUE;
+ lpofn->nFilterIndex = lRet + 1;
+ TRACE(commdlg,"lpofn->nFilterIndex=%ld\n", lpofn->nFilterIndex);
+ lstrcpynA(tmpstr2,
+ FILEDLG_GetFileType(PTR_SEG_TO_LIN(lpofn->lpstrCustomFilter),
+ PTR_SEG_TO_LIN(lpofn->lpstrFilter),
+ lRet), sizeof(tmpstr2));
+ SetDlgItemTextA( hWnd, edt1, tmpstr2 );
+ if (!in_update)
+ /* if ScanDir succeeds, we have changed the directory */
+ if (FILEDLG_ScanDir(hWnd, tmpstr)) return TRUE;
+ /* if not, this must be a filename */
+ *pstr2 = 0;
+ if (pstr != NULL)
+ {
+ /* strip off the pathname */
+ *pstr = 0;
+ SetDlgItemTextA( hWnd, edt1, pstr + 1 );
+ lstrcpynA(tmpstr2, pstr+1, sizeof(tmpstr2) );
+ /* Should we MessageBox() if this fails? */
+ if (!FILEDLG_ScanDir(hWnd, tmpstr)) return TRUE;
+ strcpy(tmpstr, tmpstr2);
+ }
+ else SetDlgItemTextA( hWnd, edt1, tmpstr );
+#if 0
+ ShowWindow16(hWnd, SW_HIDE); /* this should not be necessary ?! (%%%) */
+#endif
+ {
+ int drive = DRIVE_GetCurrentDrive();
+ tmpstr2[0] = 'A'+ drive;
+ tmpstr2[1] = ':';
+ tmpstr2[2] = '\\';
+ strncpy(tmpstr2 + 3, DRIVE_GetDosCwd(drive), 507); tmpstr2[510]=0;
+ if (strlen(tmpstr2) > 3)
+ strcat(tmpstr2, "\\");
+ strncat(tmpstr2, tmpstr, 511-strlen(tmpstr2)); tmpstr2[511]=0;
+ if (lpofn->lpstrFile)
+ lstrcpynA(PTR_SEG_TO_LIN(lpofn->lpstrFile), tmpstr2,lpofn->nMaxFile);
+ }
+ lpofn->nFileOffset = strrchr(tmpstr2,'\\') - tmpstr2 +1;
+ lpofn->nFileExtension = 0;
+ while(tmpstr2[lpofn->nFileExtension] != '.' && tmpstr2[lpofn->nFileExtension] != '\0')
+ lpofn->nFileExtension++;
+ if (tmpstr2[lpofn->nFileExtension] == '\0')
+ lpofn->nFileExtension = 0;
+ else
+ lpofn->nFileExtension++;
+
+ if(in_update)
+ {
+ if (FILEDLG_HookCallChk(lpofn))
+ FILEDLG_CallWindowProc(lpofn,hWnd,
+ RegisterWindowMessageA( LBSELCHSTRING ),
+ control, MAKELONG(lRet,CD_LBSELCHANGE));
+
+ in_update = FALSE;
+ return TRUE;
+ }
+ if (PTR_SEG_TO_LIN(lpofn->lpstrFileTitle) != NULL)
+ {
+ lRet = SendDlgItemMessage16(hWnd, lst1, LB_GETCURSEL16, 0, 0);
+ SendDlgItemMessage16(hWnd, lst1, LB_GETTEXT16, lRet,
+ lpofn->lpstrFileTitle );
+ }
+ if (FILEDLG_HookCallChk(lpofn))
+ {
+ lRet= (BOOL16)FILEDLG_CallWindowProc(lpofn,
+ hWnd, RegisterWindowMessageA( FILEOKSTRING ), 0, lParam );
+ if (lRet)
+ {
+ *lpofn=ofn2; /* restore old state */
+#if 0
+ ShowWindow16(hWnd, SW_SHOW); /* only if above (%%%) SW_HIDE used */
+#endif
+ break;
+ }
+ }
+ EndDialog(hWnd, TRUE);
+ return TRUE;
+ case IDCANCEL:
+ EndDialog(hWnd, FALSE);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+/***********************************************************************
+ * FileOpenDlgProc (COMMDLG.6)
+ */
+LRESULT WINAPI FileOpenDlgProc16(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
+ LPARAM lParam)
+{
+ LPOPENFILENAME16 lpofn = (LPOPENFILENAME16)PTR_SEG_TO_LIN(GetWindowLongA(hWnd, DWL_USER));
+
+ if (wMsg!=WM_INITDIALOG)
+ if (FILEDLG_HookCallChk(lpofn))
+ {
+ LRESULT lRet=(BOOL16)FILEDLG_CallWindowProc(lpofn,hWnd,wMsg,wParam,lParam);
+ if (lRet)
+ return lRet; /* else continue message processing */
+ }
+ switch (wMsg)
+ {
+ case WM_INITDIALOG:
+ return FILEDLG_WMInitDialog(hWnd, wParam, lParam);
+ case WM_MEASUREITEM:
+ return FILEDLG_WMMeasureItem(hWnd, wParam, lParam);
+ case WM_DRAWITEM:
+ return FILEDLG_WMDrawItem(hWnd, wParam, lParam, FALSE);
+ case WM_COMMAND:
+ return FILEDLG_WMCommand(hWnd, wParam, lParam);
+#if 0
+ case WM_CTLCOLOR:
+ SetBkColor((HDC16)wParam, 0x00C0C0C0);
+ switch (HIWORD(lParam))
+ {
+ case CTLCOLOR_BTN:
+ SetTextColor((HDC16)wParam, 0x00000000);
+ return hGRAYBrush;
+ case CTLCOLOR_STATIC:
+ SetTextColor((HDC16)wParam, 0x00000000);
+ return hGRAYBrush;
+ }
+ break;
+#endif
+ }
+ return FALSE;
+}
+
+
+/***********************************************************************
+ * FileSaveDlgProc (COMMDLG.7)
+ */
+LRESULT WINAPI FileSaveDlgProc16(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
+ LPARAM lParam)
+{
+ LPOPENFILENAME16 lpofn = (LPOPENFILENAME16)PTR_SEG_TO_LIN(GetWindowLongA(hWnd, DWL_USER));
+
+ if (wMsg!=WM_INITDIALOG)
+ if (FILEDLG_HookCallChk(lpofn))
+ {
+ LRESULT lRet=(BOOL16)FILEDLG_CallWindowProc(lpofn,hWnd,wMsg,wParam,lParam);
+ if (lRet)
+ return lRet; /* else continue message processing */
+ }
+ switch (wMsg) {
+ case WM_INITDIALOG:
+ return FILEDLG_WMInitDialog(hWnd, wParam, lParam);
+
+ case WM_MEASUREITEM:
+ return FILEDLG_WMMeasureItem(hWnd, wParam, lParam);
+
+ case WM_DRAWITEM:
+ return FILEDLG_WMDrawItem(hWnd, wParam, lParam, TRUE);
+
+ case WM_COMMAND:
+ return FILEDLG_WMCommand(hWnd, wParam, lParam);
+ }
+
+ /*
+ case WM_CTLCOLOR:
+ SetBkColor((HDC16)wParam, 0x00C0C0C0);
+ switch (HIWORD(lParam))
+ {
+ case CTLCOLOR_BTN:
+ SetTextColor((HDC16)wParam, 0x00000000);
+ return hGRAYBrush;
+ case CTLCOLOR_STATIC:
+ SetTextColor((HDC16)wParam, 0x00000000);
+ return hGRAYBrush;
+ }
+ return FALSE;
+
+ */
+ return FALSE;
+}
+
+
+
+/***********************************************************************
+ * GetFileTitleA (COMDLG32.8)
+ */
+short WINAPI GetFileTitleA(LPCSTR lpFile, LPSTR lpTitle, UINT cbBuf)
+{
+ int i, len;
+ TRACE(commdlg,"(%p %p %d); \n", lpFile, lpTitle, cbBuf);
+ if (lpFile == NULL || lpTitle == NULL)
+ return -1;
+ len = strlen(lpFile);
+ if (len == 0)
+ return -1;
+ if (strpbrk(lpFile, "*[]"))
+ return -1;
+ len--;
+ if (lpFile[len] == '/' || lpFile[len] == '\\' || lpFile[len] == ':')
+ return -1;
+ for (i = len; i >= 0; i--)
+ if (lpFile[i] == '/' || lpFile[i] == '\\' || lpFile[i] == ':')
+ {
+ i++;
+ break;
+ }
+ if (i == -1)
+ i++;
+ TRACE(commdlg,"---> '%s' \n", &lpFile[i]);
+
+ len = strlen(lpFile+i)+1;
+ if (cbBuf < len)
+ return len;
+
+ strncpy(lpTitle, &lpFile[i], len);
+ return 0;
+}
+
+
+/***********************************************************************
+ * GetFileTitleA (COMDLG32.8)
+ *
+ * RETURNS
+ *
+ *
+ * BUGS
+ *
+ *
+ */
+short WINAPI GetFileTitleW(LPCWSTR lpFile, LPWSTR lpTitle, UINT cbBuf)
+{
+ LPSTR file = HEAP_strdupWtoA(GetProcessHeap(),0,lpFile);
+ LPSTR title = HeapAlloc(GetProcessHeap(),0,cbBuf);
+ short ret;
+
+ ret = GetFileTitleA(file,title,cbBuf);
+
+ lstrcpynAtoW(lpTitle,title,cbBuf);
+ HeapFree(GetProcessHeap(),0,file);
+ HeapFree(GetProcessHeap(),0,title);
+ return ret;
+}
+/***********************************************************************
+ * GetFileTitle (COMMDLG.27)
+ */
+short WINAPI GetFileTitle16(LPCSTR lpFile, LPSTR lpTitle, UINT16 cbBuf)
+{
+ return GetFileTitleA(lpFile,lpTitle,cbBuf);
+}
+
+
+
+
+
+static BOOL Commdlg_GetFileNameA( BOOL16 (CALLBACK *dofunction)(SEGPTR x),
+ LPOPENFILENAMEA ofn )
+{
+ BOOL16 ret;
+ LPOPENFILENAME16 ofn16 = SEGPTR_ALLOC(sizeof(OPENFILENAME16));
+
+ memset(ofn16,'\0',sizeof(*ofn16));
+ ofn16->lStructSize = sizeof(*ofn16);
+ ofn16->hwndOwner = ofn->hwndOwner;
+ ofn16->hInstance = MapHModuleLS(ofn->hInstance);
+ if (ofn->lpstrFilter) {
+ LPSTR s,x;
+
+ /* filter is a list... title\0ext\0......\0\0 */
+ s = (LPSTR)ofn->lpstrFilter;
+ while (*s)
+ s = s+strlen(s)+1;
+ s++;
+ x = (LPSTR)SEGPTR_ALLOC(s-ofn->lpstrFilter);
+ memcpy(x,ofn->lpstrFilter,s-ofn->lpstrFilter);
+ ofn16->lpstrFilter = SEGPTR_GET(x);
+ }
+ if (ofn->lpstrCustomFilter) {
+ LPSTR s,x;
+
+ /* filter is a list... title\0ext\0......\0\0 */
+ s = (LPSTR)ofn->lpstrCustomFilter;
+ while (*s)
+ s = s+strlen(s)+1;
+ s++;
+ x = SEGPTR_ALLOC(s-ofn->lpstrCustomFilter);
+ memcpy(x,ofn->lpstrCustomFilter,s-ofn->lpstrCustomFilter);
+ ofn16->lpstrCustomFilter = SEGPTR_GET(x);
+ }
+ ofn16->nMaxCustFilter = ofn->nMaxCustFilter;
+ ofn16->nFilterIndex = ofn->nFilterIndex;
+ if (ofn->nMaxFile)
+ ofn16->lpstrFile = SEGPTR_GET(SEGPTR_ALLOC(ofn->nMaxFile));
+ ofn16->nMaxFile = ofn->nMaxFile;
+ ofn16->nMaxFileTitle = ofn->nMaxFileTitle;
+ if (ofn16->nMaxFileTitle)
+ ofn16->lpstrFileTitle = SEGPTR_GET(SEGPTR_ALLOC(ofn->nMaxFileTitle));
+ if (ofn->lpstrInitialDir)
+ ofn16->lpstrInitialDir = SEGPTR_GET(SEGPTR_STRDUP(ofn->lpstrInitialDir));
+ if (ofn->lpstrTitle)
+ ofn16->lpstrTitle = SEGPTR_GET(SEGPTR_STRDUP(ofn->lpstrTitle));
+ ofn16->Flags = ofn->Flags|OFN_WINE;
+ ofn16->nFileOffset = ofn->nFileOffset;
+ ofn16->nFileExtension = ofn->nFileExtension;
+ if (ofn->lpstrDefExt)
+ ofn16->lpstrDefExt = SEGPTR_GET(SEGPTR_STRDUP(ofn->lpstrDefExt));
+ ofn16->lCustData = ofn->lCustData;
+ ofn16->lpfnHook = (WNDPROC16)ofn->lpfnHook;
+
+ if (ofn->lpTemplateName)
+ ofn16->lpTemplateName = SEGPTR_GET(SEGPTR_STRDUP(ofn->lpTemplateName));
+
+ ret = dofunction(SEGPTR_GET(ofn16));
+
+ ofn->nFileOffset = ofn16->nFileOffset;
+ ofn->nFileExtension = ofn16->nFileExtension;
+ if (ofn16->lpstrFilter)
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFilter));
+ if (ofn16->lpTemplateName)
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpTemplateName));
+ if (ofn16->lpstrDefExt)
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrDefExt));
+ if (ofn16->lpstrTitle)
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrTitle));
+ if (ofn16->lpstrInitialDir)
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrInitialDir));
+ if (ofn16->lpstrCustomFilter)
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrCustomFilter));
+
+ if (ofn16->lpstrFile)
+ {
+ strcpy(ofn->lpstrFile,PTR_SEG_TO_LIN(ofn16->lpstrFile));
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFile));
+ }
+
+ if (ofn16->lpstrFileTitle)
+ {
+ strcpy(ofn->lpstrFileTitle,PTR_SEG_TO_LIN(ofn16->lpstrFileTitle));
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFileTitle));
+ }
+ SEGPTR_FREE(ofn16);
+ return ret;
+}
+
+static BOOL Commdlg_GetFileNameW( BOOL16 (CALLBACK *dofunction)(SEGPTR x),
+ LPOPENFILENAMEW ofn )
+{
+ BOOL16 ret;
+ LPOPENFILENAME16 ofn16 = SEGPTR_ALLOC(sizeof(OPENFILENAME16));
+
+ memset(ofn16,'\0',sizeof(*ofn16));
+ ofn16->lStructSize = sizeof(*ofn16);
+ ofn16->hwndOwner = ofn->hwndOwner;
+ ofn16->hInstance = MapHModuleLS(ofn->hInstance);
+ if (ofn->lpstrFilter) {
+ LPWSTR s;
+ LPSTR x,y;
+ int n;
+
+ /* filter is a list... title\0ext\0......\0\0 */
+ s = (LPWSTR)ofn->lpstrFilter;
+ while (*s)
+ s = s+lstrlenW(s)+1;
+ s++;
+ n = s - ofn->lpstrFilter; /* already divides by 2. ptr magic */
+ x = y = (LPSTR)SEGPTR_ALLOC(n);
+ s = (LPWSTR)ofn->lpstrFilter;
+ while (*s) {
+ lstrcpyWtoA(x,s);
+ x+=lstrlenA(x)+1;
+ s+=lstrlenW(s)+1;
+ }
+ *x=0;
+ ofn16->lpstrFilter = SEGPTR_GET(y);
+}
+ if (ofn->lpstrCustomFilter) {
+ LPWSTR s;
+ LPSTR x,y;
+ int n;
+
+ /* filter is a list... title\0ext\0......\0\0 */
+ s = (LPWSTR)ofn->lpstrCustomFilter;
+ while (*s)
+ s = s+lstrlenW(s)+1;
+ s++;
+ n = s - ofn->lpstrCustomFilter;
+ x = y = (LPSTR)SEGPTR_ALLOC(n);
+ s = (LPWSTR)ofn->lpstrCustomFilter;
+ while (*s) {
+ lstrcpyWtoA(x,s);
+ x+=lstrlenA(x)+1;
+ s+=lstrlenW(s)+1;
+ }
+ *x=0;
+ ofn16->lpstrCustomFilter = SEGPTR_GET(y);
+ }
+ ofn16->nMaxCustFilter = ofn->nMaxCustFilter;
+ ofn16->nFilterIndex = ofn->nFilterIndex;
+ if (ofn->nMaxFile)
+ ofn16->lpstrFile = SEGPTR_GET(SEGPTR_ALLOC(ofn->nMaxFile));
+ ofn16->nMaxFile = ofn->nMaxFile;
+ ofn16->nMaxFileTitle = ofn->nMaxFileTitle;
+ if (ofn->nMaxFileTitle)
+ ofn16->lpstrFileTitle = SEGPTR_GET(SEGPTR_ALLOC(ofn->nMaxFileTitle));
+ if (ofn->lpstrInitialDir)
+ ofn16->lpstrInitialDir = SEGPTR_GET(SEGPTR_STRDUP_WtoA(ofn->lpstrInitialDir));
+ if (ofn->lpstrTitle)
+ ofn16->lpstrTitle = SEGPTR_GET(SEGPTR_STRDUP_WtoA(ofn->lpstrTitle));
+ ofn16->Flags = ofn->Flags|OFN_WINE|OFN_UNICODE;
+ ofn16->nFileOffset = ofn->nFileOffset;
+ ofn16->nFileExtension = ofn->nFileExtension;
+ if (ofn->lpstrDefExt)
+ ofn16->lpstrDefExt = SEGPTR_GET(SEGPTR_STRDUP_WtoA(ofn->lpstrDefExt));
+ ofn16->lCustData = ofn->lCustData;
+ ofn16->lpfnHook = (WNDPROC16)ofn->lpfnHook;
+ if (ofn->lpTemplateName)
+ ofn16->lpTemplateName = SEGPTR_GET(SEGPTR_STRDUP_WtoA(ofn->lpTemplateName));
+ ret = dofunction(SEGPTR_GET(ofn16));
+
+ ofn->nFileOffset = ofn16->nFileOffset;
+ ofn->nFileExtension = ofn16->nFileExtension;
+ if (ofn16->lpstrFilter)
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFilter));
+ if (ofn16->lpTemplateName)
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpTemplateName));
+ if (ofn16->lpstrDefExt)
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrDefExt));
+ if (ofn16->lpstrTitle)
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrTitle));
+ if (ofn16->lpstrInitialDir)
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrInitialDir));
+ if (ofn16->lpstrCustomFilter)
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrCustomFilter));
+
+ if (ofn16->lpstrFile) {
+ lstrcpyAtoW(ofn->lpstrFile,PTR_SEG_TO_LIN(ofn16->lpstrFile));
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFile));
+ }
+
+ if (ofn16->lpstrFileTitle) {
+ lstrcpyAtoW(ofn->lpstrFileTitle,PTR_SEG_TO_LIN(ofn16->lpstrFileTitle));
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFileTitle));
+ }
+ SEGPTR_FREE(ofn16);
+ return ret;
+}
+
+/***********************************************************************
+ * GetOpenFileNameA (COMDLG32.10)
+ *
+ * Creates a dialog box for the user to select a file to open.
+ *
+ * RETURNS
+ * TRUE on succes: user enters a valid file
+ * FALSE on cancel, error, close or filename-does-not-fit-in-buffer.
+ *
+ * BUGS
+ * unknown, calls its 16-bit equivalent.
+ */
+BOOL WINAPI GetOpenFileNameA(
+ LPOPENFILENAMEA ofn /* address of init structure */
+ )
+{
+ BOOL16 (CALLBACK * dofunction)(SEGPTR ofn16) = GetOpenFileName16;
+ return Commdlg_GetFileNameA(dofunction,ofn);
+}
+
+/***********************************************************************
+ * GetOpenFileNameW (COMDLG32.11)
+ *
+ * Creates a dialog box for the user to select a file to open.
+ *
+ * RETURNS
+ * TRUE on succes: user enters a valid file
+ * FALSE on cancel, error, close or filename-does-not-fit-in-buffer.
+ *
+ * BUGS
+ * unknown, calls its 16-bit equivalent.
+ */
+BOOL WINAPI GetOpenFileNameW(
+ LPOPENFILENAMEW ofn /* address of init structure */
+ )
+{
+ BOOL16 (CALLBACK * dofunction)(SEGPTR ofn16) = GetOpenFileName16;
+ return Commdlg_GetFileNameW(dofunction,ofn);
+}
+
+/***********************************************************************
+ * GetSaveFileNameA (COMDLG32.12)
+ *
+ * Creates a dialog box for the user to select a file to save.
+ *
+ * RETURNS
+ * TRUE on succes: user enters a valid file
+ * FALSE on cancel, error, close or filename-does-not-fit-in-buffer.
+ *
+ * BUGS
+ * unknown, calls its 16-bit equivalent.
+ */
+BOOL WINAPI GetSaveFileNameA(
+ LPOPENFILENAMEA ofn /* address of init structure */
+ )
+{
+ BOOL16 (CALLBACK * dofunction)(SEGPTR ofn16) = GetSaveFileName16;
+ return Commdlg_GetFileNameA(dofunction,ofn);
+}
+
+/***********************************************************************
+ * GetSaveFileNameW (COMDLG32.13)
+ *
+ * Creates a dialog box for the user to select a file to save.
+ *
+ * RETURNS
+ * TRUE on succes: user enters a valid file
+ * FALSE on cancel, error, close or filename-does-not-fit-in-buffer.
+ *
+ * BUGS
+ * unknown, calls its 16-bit equivalent.
+ */
+BOOL WINAPI GetSaveFileNameW(
+ LPOPENFILENAMEW ofn /* address of init structure */
+ )
+{
+ BOOL16 (CALLBACK * dofunction)(SEGPTR ofn16) = GetSaveFileName16;
+ return Commdlg_GetFileNameW(dofunction,ofn);
+}
+
diff --git a/dlls/commdlg/finddlg.c b/dlls/commdlg/finddlg.c
new file mode 100644
index 0000000..c111d55
--- /dev/null
+++ b/dlls/commdlg/finddlg.c
@@ -0,0 +1,518 @@
+/*
+ * COMMDLG - Find & Replace Text Dialogs
+ *
+ * Copyright 1994 Martin Ayotte
+ * Copyright 1996 Albrecht Kleine
+ * Copyright 1999 Klaas van Gend
+ */
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include "winbase.h"
+#include "wine/winbase16.h"
+#include "wine/winuser16.h"
+#include "win.h"
+#include "heap.h"
+#include "message.h"
+#include "commdlg.h"
+#include "resource.h"
+#include "dialog.h"
+#include "dlgs.h"
+#include "module.h"
+#include "drive.h"
+#include "debug.h"
+#include "font.h"
+#include "winproc.h"
+
+extern DWORD CommDlgLastError;
+/*
+extern HBITMAP16 hFolder;
+extern HBITMAP16 hFolder2;
+extern HBITMAP16 hFloppy;
+extern HBITMAP16 hHDisk;
+extern HBITMAP16 hCDRom;
+extern HBITMAP16 hBitmapTT;
+extern const char defaultfilter[];
+*/
+
+/***********************************************************************
+ * FindText16 (COMMDLG.11)
+ */
+HWND16 WINAPI FindText16( SEGPTR find )
+{
+ HANDLE16 hInst;
+ LPCVOID ptr;
+ LPFINDREPLACE16 lpFind = (LPFINDREPLACE16)PTR_SEG_TO_LIN(find);
+
+ /*
+ * FIXME : Should respond to FR_ENABLETEMPLATE and FR_ENABLEHOOK here
+ * For now, only the standard dialog works.
+ */
+ if (lpFind->Flags & (FR_ENABLETEMPLATE | FR_ENABLETEMPLATEHANDLE |
+ FR_ENABLEHOOK)) FIXME(commdlg, ": unimplemented flag (ignored)\n");
+ ptr = SYSRES_GetResPtr( SYSRES_DIALOG_FIND_TEXT );
+ hInst = WIN_GetWindowInstance( lpFind->hwndOwner );
+ return DIALOG_CreateIndirect( hInst, ptr, TRUE, lpFind->hwndOwner,
+ (DLGPROC16)MODULE_GetWndProcEntry16("FindTextDlgProc"),
+ find, WIN_PROC_16 );
+}
+
+/***********************************************************************
+ * FindText32A (COMMDLG.6)
+ */
+HWND WINAPI FindTextA( LPFINDREPLACEA lpFind )
+{
+ HANDLE16 hInst;
+ LPCVOID ptr;
+
+ /*
+ * FIXME : Should respond to FR_ENABLETEMPLATE and FR_ENABLEHOOK here
+ * For now, only the standard dialog works.
+ */
+ if (lpFind->Flags & (FR_ENABLETEMPLATE | FR_ENABLETEMPLATEHANDLE |
+ FR_ENABLEHOOK)) FIXME(commdlg, ": unimplemented flag (ignored)\n");
+ ptr = SYSRES_GetResPtr( SYSRES_DIALOG_FIND_TEXT );
+ hInst = WIN_GetWindowInstance( lpFind->hwndOwner );
+ return DIALOG_CreateIndirect( hInst, ptr, TRUE, lpFind->hwndOwner,
+ (DLGPROC16)FindTextDlgProcA, (LPARAM)lpFind, WIN_PROC_32A );
+}
+
+/***********************************************************************
+ * FindText32W (COMMDLG.7)
+ */
+HWND WINAPI FindTextW( LPFINDREPLACEW lpFind )
+{
+ HANDLE16 hInst;
+ LPCVOID ptr;
+
+ /*
+ * FIXME : Should respond to FR_ENABLETEMPLATE and FR_ENABLEHOOK here
+ * For now, only the standard dialog works.
+ */
+ if (lpFind->Flags & (FR_ENABLETEMPLATE | FR_ENABLETEMPLATEHANDLE |
+ FR_ENABLEHOOK)) FIXME(commdlg, ": unimplemented flag (ignored)\n");
+ ptr = SYSRES_GetResPtr( SYSRES_DIALOG_FIND_TEXT );
+ hInst = WIN_GetWindowInstance( lpFind->hwndOwner );
+ return DIALOG_CreateIndirect( hInst, ptr, TRUE, lpFind->hwndOwner,
+ (DLGPROC16)FindTextDlgProcW, (LPARAM)lpFind, WIN_PROC_32W );
+}
+
+/***********************************************************************
+ * ReplaceText16 (COMMDLG.12)
+ */
+HWND16 WINAPI ReplaceText16( SEGPTR find )
+{
+ HANDLE16 hInst;
+ LPCVOID ptr;
+ LPFINDREPLACE16 lpFind = (LPFINDREPLACE16)PTR_SEG_TO_LIN(find);
+
+ /*
+ * FIXME : We should do error checking on the lpFind structure here
+ * and make CommDlgExtendedError() return the error condition.
+ */
+ if (lpFind->Flags & (FR_ENABLETEMPLATE | FR_ENABLETEMPLATEHANDLE |
+ FR_ENABLEHOOK)) FIXME(commdlg, ": unimplemented flag (ignored)\n");
+ ptr = SYSRES_GetResPtr( SYSRES_DIALOG_REPLACE_TEXT );
+ hInst = WIN_GetWindowInstance( lpFind->hwndOwner );
+ return DIALOG_CreateIndirect( hInst, ptr, TRUE, lpFind->hwndOwner,
+ (DLGPROC16)MODULE_GetWndProcEntry16("ReplaceTextDlgProc"),
+ find, WIN_PROC_16 );
+}
+
+/***********************************************************************
+ * ReplaceText32A (COMDLG32.19)
+ */
+HWND WINAPI ReplaceTextA( LPFINDREPLACEA lpFind )
+{
+ HANDLE16 hInst;
+ LPCVOID ptr;
+
+ /*
+ * FIXME : Should respond to FR_ENABLETEMPLATE and FR_ENABLEHOOK here
+ * For now, only the standard dialog works.
+ */
+ if (lpFind->Flags & (FR_ENABLETEMPLATE | FR_ENABLETEMPLATEHANDLE |
+ FR_ENABLEHOOK)) FIXME(commdlg, ": unimplemented flag (ignored)\n");
+ ptr = SYSRES_GetResPtr( SYSRES_DIALOG_REPLACE_TEXT );
+ hInst = WIN_GetWindowInstance( lpFind->hwndOwner );
+ return DIALOG_CreateIndirect( hInst, ptr, TRUE, lpFind->hwndOwner,
+ (DLGPROC16)ReplaceTextDlgProcA, (LPARAM)lpFind, WIN_PROC_32A );
+}
+
+/***********************************************************************
+ * ReplaceText32W (COMDLG32.20)
+ */
+HWND WINAPI ReplaceTextW( LPFINDREPLACEW lpFind )
+{
+ HANDLE16 hInst;
+ LPCVOID ptr;
+
+ /*
+ * FIXME : We should do error checking on the lpFind structure here
+ * and make CommDlgExtendedError() return the error condition.
+ */
+ if (lpFind->Flags & (FR_ENABLETEMPLATE | FR_ENABLETEMPLATEHANDLE |
+ FR_ENABLEHOOK)) FIXME(commdlg, ": unimplemented flag (ignored)\n");
+ ptr = SYSRES_GetResPtr( SYSRES_DIALOG_REPLACE_TEXT );
+ hInst = WIN_GetWindowInstance( lpFind->hwndOwner );
+ return DIALOG_CreateIndirect( hInst, ptr, TRUE, lpFind->hwndOwner,
+ (DLGPROC16)ReplaceTextDlgProcW, (LPARAM)lpFind, WIN_PROC_32W );
+}
+
+
+/***********************************************************************
+ * FINDDLG_WMInitDialog [internal]
+ */
+static LRESULT FINDDLG_WMInitDialog(HWND hWnd, LPARAM lParam, LPDWORD lpFlags,
+ LPSTR lpstrFindWhat, BOOL fUnicode)
+{
+ SetWindowLongA(hWnd, DWL_USER, lParam);
+ *lpFlags &= ~(FR_FINDNEXT | FR_REPLACE | FR_REPLACEALL | FR_DIALOGTERM);
+ /*
+ * FIXME : If the initial FindWhat string is empty, we should disable the
+ * FindNext (IDOK) button. Only after typing some text, the button should be
+ * enabled.
+ */
+ if (fUnicode) SetDlgItemTextW(hWnd, edt1, (LPWSTR)lpstrFindWhat);
+ else SetDlgItemTextA(hWnd, edt1, lpstrFindWhat);
+ CheckRadioButton(hWnd, rad1, rad2, (*lpFlags & FR_DOWN) ? rad2 : rad1);
+ if (*lpFlags & (FR_HIDEUPDOWN | FR_NOUPDOWN)) {
+ EnableWindow(GetDlgItem(hWnd, rad1), FALSE);
+ EnableWindow(GetDlgItem(hWnd, rad2), FALSE);
+ }
+ if (*lpFlags & FR_HIDEUPDOWN) {
+ ShowWindow(GetDlgItem(hWnd, rad1), SW_HIDE);
+ ShowWindow(GetDlgItem(hWnd, rad2), SW_HIDE);
+ ShowWindow(GetDlgItem(hWnd, grp1), SW_HIDE);
+ }
+ CheckDlgButton(hWnd, chx1, (*lpFlags & FR_WHOLEWORD) ? 1 : 0);
+ if (*lpFlags & (FR_HIDEWHOLEWORD | FR_NOWHOLEWORD))
+ EnableWindow(GetDlgItem(hWnd, chx1), FALSE);
+ if (*lpFlags & FR_HIDEWHOLEWORD)
+ ShowWindow(GetDlgItem(hWnd, chx1), SW_HIDE);
+ CheckDlgButton(hWnd, chx2, (*lpFlags & FR_MATCHCASE) ? 1 : 0);
+ if (*lpFlags & (FR_HIDEMATCHCASE | FR_NOMATCHCASE))
+ EnableWindow(GetDlgItem(hWnd, chx2), FALSE);
+ if (*lpFlags & FR_HIDEMATCHCASE)
+ ShowWindow(GetDlgItem(hWnd, chx2), SW_HIDE);
+ if (!(*lpFlags & FR_SHOWHELP)) {
+ EnableWindow(GetDlgItem(hWnd, pshHelp), FALSE);
+ ShowWindow(GetDlgItem(hWnd, pshHelp), SW_HIDE);
+ }
+ ShowWindow(hWnd, SW_SHOWNORMAL);
+ return TRUE;
+}
+
+
+/***********************************************************************
+ * FINDDLG_WMCommand [internal]
+ */
+static LRESULT FINDDLG_WMCommand(HWND hWnd, WPARAM wParam,
+ HWND hwndOwner, LPDWORD lpFlags,
+ LPSTR lpstrFindWhat, WORD wFindWhatLen,
+ BOOL fUnicode)
+{
+ int uFindReplaceMessage = RegisterWindowMessageA( FINDMSGSTRING );
+ int uHelpMessage = RegisterWindowMessageA( HELPMSGSTRING );
+
+ switch (wParam) {
+ case IDOK:
+ if (fUnicode)
+ GetDlgItemTextW(hWnd, edt1, (LPWSTR)lpstrFindWhat, wFindWhatLen/2);
+ else GetDlgItemTextA(hWnd, edt1, lpstrFindWhat, wFindWhatLen);
+ if (IsDlgButtonChecked(hWnd, rad2))
+ *lpFlags |= FR_DOWN;
+ else *lpFlags &= ~FR_DOWN;
+ if (IsDlgButtonChecked(hWnd, chx1))
+ *lpFlags |= FR_WHOLEWORD;
+ else *lpFlags &= ~FR_WHOLEWORD;
+ if (IsDlgButtonChecked(hWnd, chx2))
+ *lpFlags |= FR_MATCHCASE;
+ else *lpFlags &= ~FR_MATCHCASE;
+ *lpFlags &= ~(FR_REPLACE | FR_REPLACEALL | FR_DIALOGTERM);
+ *lpFlags |= FR_FINDNEXT;
+ SendMessageA(hwndOwner, uFindReplaceMessage, 0,
+ GetWindowLongA(hWnd, DWL_USER) );
+ return TRUE;
+ case IDCANCEL:
+ *lpFlags &= ~(FR_FINDNEXT | FR_REPLACE | FR_REPLACEALL);
+ *lpFlags |= FR_DIALOGTERM;
+ SendMessageA(hwndOwner, uFindReplaceMessage, 0,
+ GetWindowLongA(hWnd, DWL_USER) );
+ DestroyWindow(hWnd);
+ return TRUE;
+ case pshHelp:
+ /* FIXME : should lpfr structure be passed as an argument ??? */
+ SendMessageA(hwndOwner, uHelpMessage, 0, 0);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+/***********************************************************************
+ * FindTextDlgProc16 (COMMDLG.13)
+ */
+LRESULT WINAPI FindTextDlgProc16(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
+ LPARAM lParam)
+{
+ LPFINDREPLACE16 lpfr;
+ switch (wMsg) {
+ case WM_INITDIALOG:
+ lpfr=(LPFINDREPLACE16)PTR_SEG_TO_LIN(lParam);
+ return FINDDLG_WMInitDialog(hWnd, lParam, &(lpfr->Flags),
+ PTR_SEG_TO_LIN(lpfr->lpstrFindWhat), FALSE);
+ case WM_COMMAND:
+ lpfr=(LPFINDREPLACE16)PTR_SEG_TO_LIN(GetWindowLongA(hWnd, DWL_USER));
+ return FINDDLG_WMCommand(hWnd, wParam, lpfr->hwndOwner,
+ &lpfr->Flags, PTR_SEG_TO_LIN(lpfr->lpstrFindWhat),
+ lpfr->wFindWhatLen, FALSE);
+ }
+ return FALSE;
+}
+
+/***********************************************************************
+ * FindTextDlgProc32A
+ */
+LRESULT WINAPI FindTextDlgProcA(HWND hWnd, UINT wMsg, WPARAM wParam,
+ LPARAM lParam)
+{
+ LPFINDREPLACEA lpfr;
+ switch (wMsg) {
+ case WM_INITDIALOG:
+ lpfr=(LPFINDREPLACEA)lParam;
+ return FINDDLG_WMInitDialog(hWnd, lParam, &(lpfr->Flags),
+ lpfr->lpstrFindWhat, FALSE);
+ case WM_COMMAND:
+ lpfr=(LPFINDREPLACEA)GetWindowLongA(hWnd, DWL_USER);
+ return FINDDLG_WMCommand(hWnd, wParam, lpfr->hwndOwner,
+ &lpfr->Flags, lpfr->lpstrFindWhat, lpfr->wFindWhatLen,
+ FALSE);
+ }
+ return FALSE;
+}
+
+/***********************************************************************
+ * FindTextDlgProc32W
+ */
+LRESULT WINAPI FindTextDlgProcW(HWND hWnd, UINT wMsg, WPARAM wParam,
+ LPARAM lParam)
+{
+ LPFINDREPLACEW lpfr;
+ switch (wMsg) {
+ case WM_INITDIALOG:
+ lpfr=(LPFINDREPLACEW)lParam;
+ return FINDDLG_WMInitDialog(hWnd, lParam, &(lpfr->Flags),
+ (LPSTR)lpfr->lpstrFindWhat, TRUE);
+ case WM_COMMAND:
+ lpfr=(LPFINDREPLACEW)GetWindowLongA(hWnd, DWL_USER);
+ return FINDDLG_WMCommand(hWnd, wParam, lpfr->hwndOwner,
+ &lpfr->Flags, (LPSTR)lpfr->lpstrFindWhat, lpfr->wFindWhatLen,
+ TRUE);
+ }
+ return FALSE;
+}
+
+
+/***********************************************************************
+ * REPLACEDLG_WMInitDialog [internal]
+ */
+static LRESULT REPLACEDLG_WMInitDialog(HWND hWnd, LPARAM lParam,
+ LPDWORD lpFlags, LPSTR lpstrFindWhat,
+ LPSTR lpstrReplaceWith, BOOL fUnicode)
+{
+ SetWindowLongA(hWnd, DWL_USER, lParam);
+ *lpFlags &= ~(FR_FINDNEXT | FR_REPLACE | FR_REPLACEALL | FR_DIALOGTERM);
+ /*
+ * FIXME : If the initial FindWhat string is empty, we should disable the FinNext /
+ * Replace / ReplaceAll buttons. Only after typing some text, the buttons should be
+ * enabled.
+ */
+ if (fUnicode)
+ {
+ SetDlgItemTextW(hWnd, edt1, (LPWSTR)lpstrFindWhat);
+ SetDlgItemTextW(hWnd, edt2, (LPWSTR)lpstrReplaceWith);
+ } else
+ {
+ SetDlgItemTextA(hWnd, edt1, lpstrFindWhat);
+ SetDlgItemTextA(hWnd, edt2, lpstrReplaceWith);
+ }
+ CheckDlgButton(hWnd, chx1, (*lpFlags & FR_WHOLEWORD) ? 1 : 0);
+ if (*lpFlags & (FR_HIDEWHOLEWORD | FR_NOWHOLEWORD))
+ EnableWindow(GetDlgItem(hWnd, chx1), FALSE);
+ if (*lpFlags & FR_HIDEWHOLEWORD)
+ ShowWindow(GetDlgItem(hWnd, chx1), SW_HIDE);
+ CheckDlgButton(hWnd, chx2, (*lpFlags & FR_MATCHCASE) ? 1 : 0);
+ if (*lpFlags & (FR_HIDEMATCHCASE | FR_NOMATCHCASE))
+ EnableWindow(GetDlgItem(hWnd, chx2), FALSE);
+ if (*lpFlags & FR_HIDEMATCHCASE)
+ ShowWindow(GetDlgItem(hWnd, chx2), SW_HIDE);
+ if (!(*lpFlags & FR_SHOWHELP)) {
+ EnableWindow(GetDlgItem(hWnd, pshHelp), FALSE);
+ ShowWindow(GetDlgItem(hWnd, pshHelp), SW_HIDE);
+ }
+ ShowWindow(hWnd, SW_SHOWNORMAL);
+ return TRUE;
+}
+
+
+/***********************************************************************
+ * REPLACEDLG_WMCommand [internal]
+ */
+static LRESULT REPLACEDLG_WMCommand(HWND hWnd, WPARAM16 wParam,
+ HWND hwndOwner, LPDWORD lpFlags,
+ LPSTR lpstrFindWhat, WORD wFindWhatLen,
+ LPSTR lpstrReplaceWith, WORD wReplaceWithLen,
+ BOOL fUnicode)
+{
+ int uFindReplaceMessage = RegisterWindowMessageA( FINDMSGSTRING );
+ int uHelpMessage = RegisterWindowMessageA( HELPMSGSTRING );
+
+ switch (wParam) {
+ case IDOK:
+ if (fUnicode)
+ {
+ GetDlgItemTextW(hWnd, edt1, (LPWSTR)lpstrFindWhat, wFindWhatLen/2);
+ GetDlgItemTextW(hWnd, edt2, (LPWSTR)lpstrReplaceWith, wReplaceWithLen/2);
+ } else
+ {
+ GetDlgItemTextA(hWnd, edt1, lpstrFindWhat, wFindWhatLen);
+ GetDlgItemTextA(hWnd, edt2, lpstrReplaceWith, wReplaceWithLen);
+ }
+ if (IsDlgButtonChecked(hWnd, chx1))
+ *lpFlags |= FR_WHOLEWORD;
+ else *lpFlags &= ~FR_WHOLEWORD;
+ if (IsDlgButtonChecked(hWnd, chx2))
+ *lpFlags |= FR_MATCHCASE;
+ else *lpFlags &= ~FR_MATCHCASE;
+ *lpFlags &= ~(FR_REPLACE | FR_REPLACEALL | FR_DIALOGTERM);
+ *lpFlags |= FR_FINDNEXT;
+ SendMessageA(hwndOwner, uFindReplaceMessage, 0,
+ GetWindowLongA(hWnd, DWL_USER) );
+ return TRUE;
+ case IDCANCEL:
+ *lpFlags &= ~(FR_FINDNEXT | FR_REPLACE | FR_REPLACEALL);
+ *lpFlags |= FR_DIALOGTERM;
+ SendMessageA(hwndOwner, uFindReplaceMessage, 0,
+ GetWindowLongA(hWnd, DWL_USER) );
+ DestroyWindow(hWnd);
+ return TRUE;
+ case psh1:
+ if (fUnicode)
+ {
+ GetDlgItemTextW(hWnd, edt1, (LPWSTR)lpstrFindWhat, wFindWhatLen/2);
+ GetDlgItemTextW(hWnd, edt2, (LPWSTR)lpstrReplaceWith, wReplaceWithLen/2);
+ } else
+ {
+ GetDlgItemTextA(hWnd, edt1, lpstrFindWhat, wFindWhatLen);
+ GetDlgItemTextA(hWnd, edt2, lpstrReplaceWith, wReplaceWithLen);
+ }
+ if (IsDlgButtonChecked(hWnd, chx1))
+ *lpFlags |= FR_WHOLEWORD;
+ else *lpFlags &= ~FR_WHOLEWORD;
+ if (IsDlgButtonChecked(hWnd, chx2))
+ *lpFlags |= FR_MATCHCASE;
+ else *lpFlags &= ~FR_MATCHCASE;
+ *lpFlags &= ~(FR_FINDNEXT | FR_REPLACEALL | FR_DIALOGTERM);
+ *lpFlags |= FR_REPLACE;
+ SendMessageA(hwndOwner, uFindReplaceMessage, 0,
+ GetWindowLongA(hWnd, DWL_USER) );
+ return TRUE;
+ case psh2:
+ if (fUnicode)
+ {
+ GetDlgItemTextW(hWnd, edt1, (LPWSTR)lpstrFindWhat, wFindWhatLen/2);
+ GetDlgItemTextW(hWnd, edt2, (LPWSTR)lpstrReplaceWith, wReplaceWithLen/2);
+ } else
+ {
+ GetDlgItemTextA(hWnd, edt1, lpstrFindWhat, wFindWhatLen);
+ GetDlgItemTextA(hWnd, edt2, lpstrReplaceWith, wReplaceWithLen);
+ }
+ if (IsDlgButtonChecked(hWnd, chx1))
+ *lpFlags |= FR_WHOLEWORD;
+ else *lpFlags &= ~FR_WHOLEWORD;
+ if (IsDlgButtonChecked(hWnd, chx2))
+ *lpFlags |= FR_MATCHCASE;
+ else *lpFlags &= ~FR_MATCHCASE;
+ *lpFlags &= ~(FR_FINDNEXT | FR_REPLACE | FR_DIALOGTERM);
+ *lpFlags |= FR_REPLACEALL;
+ SendMessageA(hwndOwner, uFindReplaceMessage, 0,
+ GetWindowLongA(hWnd, DWL_USER) );
+ return TRUE;
+ case pshHelp:
+ /* FIXME : should lpfr structure be passed as an argument ??? */
+ SendMessageA(hwndOwner, uHelpMessage, 0, 0);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+/***********************************************************************
+ * ReplaceTextDlgProc16 (COMMDLG.14)
+ */
+LRESULT WINAPI ReplaceTextDlgProc16(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
+ LPARAM lParam)
+{
+ LPFINDREPLACE16 lpfr;
+ switch (wMsg) {
+ case WM_INITDIALOG:
+ lpfr=(LPFINDREPLACE16)PTR_SEG_TO_LIN(lParam);
+ return REPLACEDLG_WMInitDialog(hWnd, lParam, &lpfr->Flags,
+ PTR_SEG_TO_LIN(lpfr->lpstrFindWhat),
+ PTR_SEG_TO_LIN(lpfr->lpstrReplaceWith), FALSE);
+ case WM_COMMAND:
+ lpfr=(LPFINDREPLACE16)PTR_SEG_TO_LIN(GetWindowLongA(hWnd, DWL_USER));
+ return REPLACEDLG_WMCommand(hWnd, wParam, lpfr->hwndOwner,
+ &lpfr->Flags, PTR_SEG_TO_LIN(lpfr->lpstrFindWhat),
+ lpfr->wFindWhatLen, PTR_SEG_TO_LIN(lpfr->lpstrReplaceWith),
+ lpfr->wReplaceWithLen, FALSE);
+ }
+ return FALSE;
+}
+
+/***********************************************************************
+ * ReplaceTextDlgProc32A
+ */
+LRESULT WINAPI ReplaceTextDlgProcA(HWND hWnd, UINT wMsg, WPARAM wParam,
+ LPARAM lParam)
+{
+ LPFINDREPLACEA lpfr;
+ switch (wMsg) {
+ case WM_INITDIALOG:
+ lpfr=(LPFINDREPLACEA)lParam;
+ return REPLACEDLG_WMInitDialog(hWnd, lParam, &lpfr->Flags,
+ lpfr->lpstrFindWhat, lpfr->lpstrReplaceWith, FALSE);
+ case WM_COMMAND:
+ lpfr=(LPFINDREPLACEA)GetWindowLongA(hWnd, DWL_USER);
+ return REPLACEDLG_WMCommand(hWnd, wParam, lpfr->hwndOwner,
+ &lpfr->Flags, lpfr->lpstrFindWhat, lpfr->wFindWhatLen,
+ lpfr->lpstrReplaceWith, lpfr->wReplaceWithLen, FALSE);
+ }
+ return FALSE;
+}
+
+/***********************************************************************
+ * ReplaceTextDlgProc32W
+ */
+LRESULT WINAPI ReplaceTextDlgProcW(HWND hWnd, UINT wMsg, WPARAM wParam,
+ LPARAM lParam)
+{
+ LPFINDREPLACEW lpfr;
+ switch (wMsg) {
+ case WM_INITDIALOG:
+ lpfr=(LPFINDREPLACEW)lParam;
+ return REPLACEDLG_WMInitDialog(hWnd, lParam, &lpfr->Flags,
+ (LPSTR)lpfr->lpstrFindWhat, (LPSTR)lpfr->lpstrReplaceWith,
+ TRUE);
+ case WM_COMMAND:
+ lpfr=(LPFINDREPLACEW)GetWindowLongA(hWnd, DWL_USER);
+ return REPLACEDLG_WMCommand(hWnd, wParam, lpfr->hwndOwner,
+ &lpfr->Flags, (LPSTR)lpfr->lpstrFindWhat, lpfr->wFindWhatLen,
+ (LPSTR)lpfr->lpstrReplaceWith, lpfr->wReplaceWithLen, TRUE);
+ }
+ return FALSE;
+}
+
+
diff --git a/dlls/commdlg/fontdlg.c b/dlls/commdlg/fontdlg.c
new file mode 100644
index 0000000..270b8bd
--- /dev/null
+++ b/dlls/commdlg/fontdlg.c
@@ -0,0 +1,986 @@
+/*
+ * COMMDLG - Font Dialog
+ *
+ * Copyright 1994 Martin Ayotte
+ * Copyright 1996 Albrecht Kleine
+ * Copyright 1999 Klaas van Gend
+ */
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include "winbase.h"
+#include "wine/winbase16.h"
+#include "wine/winuser16.h"
+#include "win.h"
+#include "heap.h"
+#include "message.h"
+#include "commdlg.h"
+#include "resource.h"
+#include "dialog.h"
+#include "dlgs.h"
+#include "module.h"
+#include "drive.h"
+#include "debug.h"
+#include "font.h"
+#include "winproc.h"
+
+extern DWORD CommDlgLastError;
+
+static HBITMAP16 hBitmapTT = 0;
+
+
+
+
+static void CFn_CHOOSEFONT16to32A(LPCHOOSEFONT16 chf16, LPCHOOSEFONTA chf32a)
+{
+ chf32a->lStructSize=sizeof(CHOOSEFONTA);
+ chf32a->hwndOwner=chf16->hwndOwner;
+ chf32a->hDC=chf16->hDC;
+ chf32a->iPointSize=chf16->iPointSize;
+ chf32a->Flags=chf16->Flags;
+ chf32a->rgbColors=chf16->rgbColors;
+ chf32a->lCustData=chf16->lCustData;
+ chf32a->lpfnHook=NULL;
+ chf32a->lpTemplateName=PTR_SEG_TO_LIN(chf16->lpTemplateName);
+ chf32a->hInstance=chf16->hInstance;
+ chf32a->lpszStyle=PTR_SEG_TO_LIN(chf16->lpszStyle);
+ chf32a->nFontType=chf16->nFontType;
+ chf32a->nSizeMax=chf16->nSizeMax;
+ chf32a->nSizeMin=chf16->nSizeMin;
+ FONT_LogFont16To32A(PTR_SEG_TO_LIN(chf16->lpLogFont), chf32a->lpLogFont);
+}
+
+
+/***********************************************************************
+ * ChooseFont16 (COMMDLG.15)
+ */
+BOOL16 WINAPI ChooseFont16(LPCHOOSEFONT16 lpChFont)
+{
+ HINSTANCE16 hInst;
+ HANDLE16 hDlgTmpl = 0;
+ BOOL16 bRet = FALSE, win32Format = FALSE;
+ LPCVOID template;
+ HWND hwndDialog;
+ CHOOSEFONTA cf32a;
+ LOGFONTA lf32a;
+ SEGPTR lpTemplateName;
+
+ cf32a.lpLogFont=&lf32a;
+ CFn_CHOOSEFONT16to32A(lpChFont, &cf32a);
+
+ TRACE(commdlg,"ChooseFont\n");
+ if (!lpChFont) return FALSE;
+
+ if (lpChFont->Flags & CF_ENABLETEMPLATEHANDLE)
+ {
+ if (!(template = LockResource16( lpChFont->hInstance )))
+ {
+ CommDlgLastError = CDERR_LOADRESFAILURE;
+ return FALSE;
+ }
+ }
+ else if (lpChFont->Flags & CF_ENABLETEMPLATE)
+ {
+ HANDLE16 hResInfo;
+ if (!(hResInfo = FindResource16( lpChFont->hInstance,
+ lpChFont->lpTemplateName,
+ RT_DIALOG16)))
+ {
+ CommDlgLastError = CDERR_FINDRESFAILURE;
+ return FALSE;
+ }
+ if (!(hDlgTmpl = LoadResource16( lpChFont->hInstance, hResInfo )) ||
+ !(template = LockResource16( hDlgTmpl )))
+ {
+ CommDlgLastError = CDERR_LOADRESFAILURE;
+ return FALSE;
+ }
+ }
+ else
+ {
+ template = SYSRES_GetResPtr( SYSRES_DIALOG_CHOOSE_FONT );
+ win32Format = TRUE;
+ }
+
+ hInst = WIN_GetWindowInstance( lpChFont->hwndOwner );
+
+ /* lpTemplateName is not used in the dialog */
+ lpTemplateName=lpChFont->lpTemplateName;
+ lpChFont->lpTemplateName=(SEGPTR)&cf32a;
+
+ hwndDialog = DIALOG_CreateIndirect( hInst, template, win32Format,
+ lpChFont->hwndOwner,
+ (DLGPROC16)MODULE_GetWndProcEntry16("FormatCharDlgProc"),
+ (DWORD)lpChFont, WIN_PROC_16 );
+ if (hwndDialog) bRet = DIALOG_DoDialogBox(hwndDialog, lpChFont->hwndOwner);
+ if (hDlgTmpl) FreeResource16( hDlgTmpl );
+ lpChFont->lpTemplateName=lpTemplateName;
+ FONT_LogFont32ATo16(cf32a.lpLogFont,
+ (LPLOGFONT16)(PTR_SEG_TO_LIN(lpChFont->lpLogFont)));
+ return bRet;
+}
+
+
+/***********************************************************************
+ * ChooseFont32A (COMDLG32.3)
+ */
+BOOL WINAPI ChooseFontA(LPCHOOSEFONTA lpChFont)
+{
+ BOOL bRet=FALSE;
+ HWND hwndDialog;
+ HINSTANCE hInst=WIN_GetWindowInstance( lpChFont->hwndOwner );
+ LPCVOID template = SYSRES_GetResPtr( SYSRES_DIALOG_CHOOSE_FONT );
+ if (lpChFont->Flags & (CF_SELECTSCRIPT | CF_NOVERTFONTS | CF_ENABLETEMPLATE |
+ CF_ENABLETEMPLATEHANDLE)) FIXME(commdlg, ": unimplemented flag (ignored)\n");
+ hwndDialog = DIALOG_CreateIndirect(hInst, template, TRUE, lpChFont->hwndOwner,
+ (DLGPROC16)FormatCharDlgProcA, (LPARAM)lpChFont, WIN_PROC_32A );
+ if (hwndDialog) bRet = DIALOG_DoDialogBox(hwndDialog, lpChFont->hwndOwner);
+ return bRet;
+}
+
+/***********************************************************************
+ * ChooseFont32W (COMDLG32.4)
+ */
+BOOL WINAPI ChooseFontW(LPCHOOSEFONTW lpChFont)
+{
+ BOOL bRet=FALSE;
+ HWND hwndDialog;
+ HINSTANCE hInst=WIN_GetWindowInstance( lpChFont->hwndOwner );
+ CHOOSEFONTA cf32a;
+ LOGFONTA lf32a;
+ LPCVOID template = SYSRES_GetResPtr( SYSRES_DIALOG_CHOOSE_FONT );
+ if (lpChFont->Flags & (CF_SELECTSCRIPT | CF_NOVERTFONTS | CF_ENABLETEMPLATE |
+ CF_ENABLETEMPLATEHANDLE)) FIXME(commdlg, ": unimplemented flag (ignored)\n");
+ memcpy(&cf32a, lpChFont, sizeof(cf32a));
+ memcpy(&lf32a, lpChFont->lpLogFont, sizeof(LOGFONTA));
+ lstrcpynWtoA(lf32a.lfFaceName, lpChFont->lpLogFont->lfFaceName, LF_FACESIZE);
+ cf32a.lpLogFont=&lf32a;
+ cf32a.lpszStyle=HEAP_strdupWtoA(GetProcessHeap(), 0, lpChFont->lpszStyle);
+ lpChFont->lpTemplateName=(LPWSTR)&cf32a;
+ hwndDialog=DIALOG_CreateIndirect(hInst, template, TRUE, lpChFont->hwndOwner,
+ (DLGPROC16)FormatCharDlgProcW, (LPARAM)lpChFont, WIN_PROC_32W );
+ if (hwndDialog)bRet=DIALOG_DoDialogBox(hwndDialog, lpChFont->hwndOwner);
+ HeapFree(GetProcessHeap(), 0, cf32a.lpszStyle);
+ lpChFont->lpTemplateName=(LPWSTR)cf32a.lpTemplateName;
+ memcpy(lpChFont->lpLogFont, &lf32a, sizeof(CHOOSEFONTA));
+ lstrcpynAtoW(lpChFont->lpLogFont->lfFaceName, lf32a.lfFaceName, LF_FACESIZE);
+ return bRet;
+}
+
+
+#define TEXT_EXTRAS 4
+#define TEXT_COLORS 16
+
+static const COLORREF textcolors[TEXT_COLORS]=
+{
+ 0x00000000L,0x00000080L,0x00008000L,0x00008080L,
+ 0x00800000L,0x00800080L,0x00808000L,0x00808080L,
+ 0x00c0c0c0L,0x000000ffL,0x0000ff00L,0x0000ffffL,
+ 0x00ff0000L,0x00ff00ffL,0x00ffff00L,0x00FFFFFFL
+};
+
+/***********************************************************************
+ * CFn_HookCallChk [internal]
+ */
+static BOOL CFn_HookCallChk(LPCHOOSEFONT16 lpcf)
+{
+ if (lpcf)
+ if(lpcf->Flags & CF_ENABLEHOOK)
+ if (lpcf->lpfnHook)
+ return TRUE;
+ return FALSE;
+}
+
+/***********************************************************************
+ * CFn_HookCallChk32 [internal]
+ */
+static BOOL CFn_HookCallChk32(LPCHOOSEFONTA lpcf)
+{
+ if (lpcf)
+ if(lpcf->Flags & CF_ENABLEHOOK)
+ if (lpcf->lpfnHook)
+ return TRUE;
+ return FALSE;
+}
+
+
+/*************************************************************************
+ * AddFontFamily [internal]
+ */
+static INT AddFontFamily(LPLOGFONTA lplf, UINT nFontType,
+ LPCHOOSEFONTA lpcf, HWND hwnd)
+{
+ int i;
+ WORD w;
+
+ TRACE(commdlg,"font=%s (nFontType=%d)\n", lplf->lfFaceName,nFontType);
+
+ if (lpcf->Flags & CF_FIXEDPITCHONLY)
+ if (!(lplf->lfPitchAndFamily & FIXED_PITCH))
+ return 1;
+ if (lpcf->Flags & CF_ANSIONLY)
+ if (lplf->lfCharSet != ANSI_CHARSET)
+ return 1;
+ if (lpcf->Flags & CF_TTONLY)
+ if (!(nFontType & TRUETYPE_FONTTYPE))
+ return 1;
+
+ i=SendMessageA(hwnd, CB_ADDSTRING, 0, (LPARAM)lplf->lfFaceName);
+ if (i!=CB_ERR)
+ {
+ w=(lplf->lfCharSet << 8) | lplf->lfPitchAndFamily;
+ SendMessageA(hwnd, CB_SETITEMDATA, i, MAKELONG(nFontType,w));
+ return 1 ; /* store some important font information */
+ }
+ else
+ return 0;
+}
+
+typedef struct
+{
+ HWND hWnd1;
+ HWND hWnd2;
+ LPCHOOSEFONTA lpcf32a;
+} CFn_ENUMSTRUCT, *LPCFn_ENUMSTRUCT;
+
+/*************************************************************************
+ * FontFamilyEnumProc32 [internal]
+ */
+INT WINAPI FontFamilyEnumProc(LPENUMLOGFONTA lpEnumLogFont,
+ LPNEWTEXTMETRICA metrics, UINT nFontType, LPARAM lParam)
+{
+ LPCFn_ENUMSTRUCT e;
+ e=(LPCFn_ENUMSTRUCT)lParam;
+ return AddFontFamily(&lpEnumLogFont->elfLogFont, nFontType, e->lpcf32a, e->hWnd1);
+}
+
+/***********************************************************************
+ * FontFamilyEnumProc16 (COMMDLG.19)
+ */
+INT16 WINAPI FontFamilyEnumProc16( SEGPTR logfont, SEGPTR metrics,
+ UINT16 nFontType, LPARAM lParam )
+{
+ HWND16 hwnd=LOWORD(lParam);
+ HWND16 hDlg=GetParent16(hwnd);
+ LPCHOOSEFONT16 lpcf=(LPCHOOSEFONT16)GetWindowLongA(hDlg, DWL_USER);
+ LOGFONT16 *lplf = (LOGFONT16 *)PTR_SEG_TO_LIN( logfont );
+ LOGFONTA lf32a;
+ FONT_LogFont16To32A(lplf, &lf32a);
+ return AddFontFamily(&lf32a, nFontType, (LPCHOOSEFONTA)lpcf->lpTemplateName,
+ hwnd);
+}
+
+/*************************************************************************
+ * SetFontStylesToCombo2 [internal]
+ *
+ * Fill font style information into combobox (without using font.c directly)
+ */
+static int SetFontStylesToCombo2(HWND hwnd, HDC hdc, LPLOGFONTA lplf)
+{
+ #define FSTYLES 4
+ struct FONTSTYLE
+ { int italic;
+ int weight;
+ char stname[20]; };
+ static struct FONTSTYLE fontstyles[FSTYLES]={
+ { 0,FW_NORMAL,"Regular"},{0,FW_BOLD,"Bold"},
+ { 1,FW_NORMAL,"Italic"}, {1,FW_BOLD,"Bold Italic"}};
+ HFONT16 hf;
+ TEXTMETRIC16 tm;
+ int i,j;
+
+ for (i=0;i<FSTYLES;i++)
+ {
+ lplf->lfItalic=fontstyles[i].italic;
+ lplf->lfWeight=fontstyles[i].weight;
+ hf=CreateFontIndirectA(lplf);
+ hf=SelectObject(hdc,hf);
+ GetTextMetrics16(hdc,&tm);
+ hf=SelectObject(hdc,hf);
+ DeleteObject(hf);
+
+ if (tm.tmWeight==fontstyles[i].weight &&
+ tm.tmItalic==fontstyles[i].italic) /* font successful created ? */
+ {
+ char *str = SEGPTR_STRDUP(fontstyles[i].stname);
+ j=SendMessage16(hwnd,CB_ADDSTRING16,0,(LPARAM)SEGPTR_GET(str) );
+ SEGPTR_FREE(str);
+ if (j==CB_ERR) return 1;
+ j=SendMessage16(hwnd, CB_SETITEMDATA16, j,
+ MAKELONG(fontstyles[i].weight,fontstyles[i].italic));
+ if (j==CB_ERR) return 1;
+ }
+ }
+ return 0;
+}
+
+/*************************************************************************
+ * AddFontSizeToCombo3 [internal]
+ */
+static int AddFontSizeToCombo3(HWND hwnd, UINT h, LPCHOOSEFONTA lpcf)
+{
+ int j;
+ char buffer[20];
+
+ if ( (!(lpcf->Flags & CF_LIMITSIZE)) ||
+ ((lpcf->Flags & CF_LIMITSIZE) && (h >= lpcf->nSizeMin) && (h <= lpcf->nSizeMax)))
+ {
+ sprintf(buffer, "%2d", h);
+ j=SendMessageA(hwnd, CB_FINDSTRINGEXACT, -1, (LPARAM)buffer);
+ if (j==CB_ERR)
+ {
+ j=SendMessageA(hwnd, CB_ADDSTRING, 0, (LPARAM)buffer);
+ if (j!=CB_ERR) j = SendMessageA(hwnd, CB_SETITEMDATA, j, h);
+ if (j==CB_ERR) return 1;
+ }
+ }
+ return 0;
+}
+
+/*************************************************************************
+ * SetFontSizesToCombo3 [internal]
+ */
+static int SetFontSizesToCombo3(HWND hwnd, LPCHOOSEFONTA lpcf)
+{
+ static const int sizes[]={8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72,0};
+ int i;
+
+ for (i=0; sizes[i]; i++)
+ if (AddFontSizeToCombo3(hwnd, sizes[i], lpcf)) return 1;
+ return 0;
+}
+
+/***********************************************************************
+ * AddFontStyle [internal]
+ */
+INT AddFontStyle(LPLOGFONTA lplf, UINT nFontType,
+ LPCHOOSEFONTA lpcf, HWND hcmb2, HWND hcmb3, HWND hDlg)
+{
+ int i;
+
+ TRACE(commdlg,"(nFontType=%d)\n",nFontType);
+ TRACE(commdlg," %s h=%d w=%d e=%d o=%d wg=%d i=%d u=%d s=%d"
+ " ch=%d op=%d cp=%d q=%d pf=%xh\n",
+ lplf->lfFaceName,lplf->lfHeight,lplf->lfWidth,
+ lplf->lfEscapement,lplf->lfOrientation,
+ lplf->lfWeight,lplf->lfItalic,lplf->lfUnderline,
+ lplf->lfStrikeOut,lplf->lfCharSet, lplf->lfOutPrecision,
+ lplf->lfClipPrecision,lplf->lfQuality, lplf->lfPitchAndFamily);
+ if (nFontType & RASTER_FONTTYPE)
+ {
+ if (AddFontSizeToCombo3(hcmb3, lplf->lfHeight, lpcf)) return 0;
+ } else if (SetFontSizesToCombo3(hcmb3, lpcf)) return 0;
+
+ if (!SendMessageA(hcmb2, CB_GETCOUNT, 0, 0))
+ {
+ HDC hdc= (lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC) ? lpcf->hDC : GetDC(hDlg);
+ i=SetFontStylesToCombo2(hcmb2,hdc,lplf);
+ if (!(lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC))
+ ReleaseDC(hDlg,hdc);
+ if (i)
+ return 0;
+ }
+ return 1 ;
+
+}
+
+/***********************************************************************
+ * FontStyleEnumProc16 (COMMDLG.18)
+ */
+INT16 WINAPI FontStyleEnumProc16( SEGPTR logfont, SEGPTR metrics,
+ UINT16 nFontType, LPARAM lParam )
+{
+ HWND16 hcmb2=LOWORD(lParam);
+ HWND16 hcmb3=HIWORD(lParam);
+ HWND16 hDlg=GetParent16(hcmb3);
+ LPCHOOSEFONT16 lpcf=(LPCHOOSEFONT16)GetWindowLongA(hDlg, DWL_USER);
+ LOGFONT16 *lplf = (LOGFONT16 *)PTR_SEG_TO_LIN(logfont);
+ LOGFONTA lf32a;
+ FONT_LogFont16To32A(lplf, &lf32a);
+ return AddFontStyle(&lf32a, nFontType, (LPCHOOSEFONTA)lpcf->lpTemplateName,
+ hcmb2, hcmb3, hDlg);
+}
+
+/***********************************************************************
+ * FontStyleEnumProc32 [internal]
+ */
+INT WINAPI FontStyleEnumProc( LPENUMLOGFONTA lpFont,
+ LPNEWTEXTMETRICA metrics, UINT nFontType, LPARAM lParam )
+{
+ LPCFn_ENUMSTRUCT s=(LPCFn_ENUMSTRUCT)lParam;
+ HWND hcmb2=s->hWnd1;
+ HWND hcmb3=s->hWnd2;
+ HWND hDlg=GetParent(hcmb3);
+ return AddFontStyle(&lpFont->elfLogFont, nFontType, s->lpcf32a, hcmb2,
+ hcmb3, hDlg);
+}
+
+/***********************************************************************
+ * CFn_WMInitDialog [internal]
+ */
+LRESULT CFn_WMInitDialog(HWND hDlg, WPARAM wParam, LPARAM lParam,
+ LPCHOOSEFONTA lpcf)
+{
+ HDC hdc;
+ int i,j,res,init=0;
+ long l;
+ LPLOGFONTA lpxx;
+ HCURSOR hcursor=SetCursor(LoadCursorA(0,IDC_WAITA));
+
+ SetWindowLongA(hDlg, DWL_USER, lParam);
+ lpxx=lpcf->lpLogFont;
+ TRACE(commdlg,"WM_INITDIALOG lParam=%08lX\n", lParam);
+
+ if (lpcf->lStructSize != sizeof(CHOOSEFONTA))
+ {
+ ERR(commdlg,"structure size failure !!!\n");
+ EndDialog (hDlg, 0);
+ return FALSE;
+ }
+ if (!hBitmapTT)
+ hBitmapTT = LoadBitmapA(0, MAKEINTRESOURCEA(OBM_TRTYPE));
+
+ /* This font will be deleted by WM_COMMAND */
+ SendDlgItemMessageA(hDlg,stc6,WM_SETFONT,
+ CreateFontA(0, 0, 1, 1, 400, 0, 0, 0, 0, 0, 0, 0, 0, NULL),FALSE);
+
+ if (!(lpcf->Flags & CF_SHOWHELP) || !IsWindow(lpcf->hwndOwner))
+ ShowWindow(GetDlgItem(hDlg,pshHelp),SW_HIDE);
+ if (!(lpcf->Flags & CF_APPLY))
+ ShowWindow(GetDlgItem(hDlg,psh3),SW_HIDE);
+ if (lpcf->Flags & CF_EFFECTS)
+ {
+ for (res=1,i=0;res && i<TEXT_COLORS;i++)
+ {
+ /* FIXME: load color name from resource: res=LoadString(...,i+....,buffer,.....); */
+ char name[20];
+ strcpy( name, "[color name]" );
+ j=SendDlgItemMessageA(hDlg, cmb4, CB_ADDSTRING, 0, (LPARAM)name);
+ SendDlgItemMessageA(hDlg, cmb4, CB_SETITEMDATA16, j, textcolors[j]);
+ /* look for a fitting value in color combobox */
+ if (textcolors[j]==lpcf->rgbColors)
+ SendDlgItemMessageA(hDlg,cmb4, CB_SETCURSEL,j,0);
+ }
+ }
+ else
+ {
+ ShowWindow(GetDlgItem(hDlg,cmb4),SW_HIDE);
+ ShowWindow(GetDlgItem(hDlg,chx1),SW_HIDE);
+ ShowWindow(GetDlgItem(hDlg,chx2),SW_HIDE);
+ ShowWindow(GetDlgItem(hDlg,grp1),SW_HIDE);
+ ShowWindow(GetDlgItem(hDlg,stc4),SW_HIDE);
+ }
+ hdc= (lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC) ? lpcf->hDC : GetDC(hDlg);
+ if (hdc)
+ {
+ CFn_ENUMSTRUCT s;
+ s.hWnd1=GetDlgItem(hDlg,cmb1);
+ s.lpcf32a=lpcf;
+ if (!EnumFontFamiliesA(hdc, NULL, FontFamilyEnumProc, (LPARAM)&s))
+ TRACE(commdlg,"EnumFontFamilies returns 0\n");
+ if (lpcf->Flags & CF_INITTOLOGFONTSTRUCT)
+ {
+ /* look for fitting font name in combobox1 */
+ j=SendDlgItemMessageA(hDlg,cmb1,CB_FINDSTRING,-1,(LONG)lpxx->lfFaceName);
+ if (j!=CB_ERR)
+ {
+ SendDlgItemMessageA(hDlg, cmb1, CB_SETCURSEL, j, 0);
+ SendMessageA(hDlg, WM_COMMAND, MAKEWPARAM(cmb1, CBN_SELCHANGE),
+ GetDlgItem(hDlg,cmb1));
+ init=1;
+ /* look for fitting font style in combobox2 */
+ l=MAKELONG(lpxx->lfWeight > FW_MEDIUM ? FW_BOLD:FW_NORMAL,lpxx->lfItalic !=0);
+ for (i=0;i<TEXT_EXTRAS;i++)
+ {
+ if (l==SendDlgItemMessageA(hDlg, cmb2, CB_GETITEMDATA, i, 0))
+ SendDlgItemMessageA(hDlg, cmb2, CB_SETCURSEL, i, 0);
+ }
+
+ /* look for fitting font size in combobox3 */
+ j=SendDlgItemMessageA(hDlg, cmb3, CB_GETCOUNT, 0, 0);
+ for (i=0;i<j;i++)
+ {
+ if (lpxx->lfHeight==(int)SendDlgItemMessageA(hDlg,cmb3, CB_GETITEMDATA,i,0))
+ SendDlgItemMessageA(hDlg,cmb3,CB_SETCURSEL,i,0);
+ }
+ }
+ }
+ if (!init)
+ {
+ SendDlgItemMessageA(hDlg,cmb1,CB_SETCURSEL,0,0);
+ SendMessageA(hDlg, WM_COMMAND, MAKEWPARAM(cmb1, CBN_SELCHANGE),
+ GetDlgItem(hDlg,cmb1));
+ }
+ if (lpcf->Flags & CF_USESTYLE && lpcf->lpszStyle)
+ {
+ j=SendDlgItemMessageA(hDlg,cmb2,CB_FINDSTRING,-1,(LONG)lpcf->lpszStyle);
+ if (j!=CB_ERR)
+ {
+ j=SendDlgItemMessageA(hDlg,cmb2,CB_SETCURSEL,j,0);
+ SendMessageA(hDlg,WM_COMMAND,cmb2,
+ MAKELONG(GetDlgItem(hDlg,cmb2),CBN_SELCHANGE));
+ }
+ }
+ }
+ else
+ {
+ WARN(commdlg,"HDC failure !!!\n");
+ EndDialog (hDlg, 0);
+ return FALSE;
+ }
+
+ if (!(lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC))
+ ReleaseDC(hDlg,hdc);
+ SetCursor(hcursor);
+ return TRUE;
+}
+
+
+/***********************************************************************
+ * CFn_WMMeasureItem [internal]
+ */
+LRESULT CFn_WMMeasureItem(HWND hDlg, WPARAM wParam, LPARAM lParam)
+{
+ BITMAP bm;
+ LPMEASUREITEMSTRUCT lpmi=(LPMEASUREITEMSTRUCT)lParam;
+ if (!hBitmapTT)
+ hBitmapTT = LoadBitmapA(0, MAKEINTRESOURCEA(OBM_TRTYPE));
+ GetObjectA( hBitmapTT, sizeof(bm), &bm );
+ lpmi->itemHeight=bm.bmHeight;
+ /* FIXME: use MAX of bm.bmHeight and tm.tmHeight .*/
+ return 0;
+}
+
+
+/***********************************************************************
+ * CFn_WMDrawItem [internal]
+ */
+LRESULT CFn_WMDrawItem(HWND hDlg, WPARAM wParam, LPARAM lParam)
+{
+ HBRUSH hBrush;
+ char buffer[40];
+ BITMAP bm;
+ COLORREF cr, oldText=0, oldBk=0;
+ RECT rect;
+#if 0
+ HDC hMemDC;
+ int nFontType;
+ HBITMAP hBitmap; /* for later TT usage */
+#endif
+ LPDRAWITEMSTRUCT lpdi = (LPDRAWITEMSTRUCT)lParam;
+
+ if (lpdi->itemID == 0xFFFF) /* got no items */
+ DrawFocusRect(lpdi->hDC, &lpdi->rcItem);
+ else
+ {
+ if (lpdi->CtlType == ODT_COMBOBOX)
+ {
+ if (lpdi->itemState ==ODS_SELECTED)
+ {
+ hBrush=GetSysColorBrush(COLOR_HIGHLIGHT);
+ oldText=SetTextColor(lpdi->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT));
+ oldBk=SetBkColor(lpdi->hDC, GetSysColor(COLOR_HIGHLIGHT));
+ } else
+ {
+ hBrush = SelectObject(lpdi->hDC, GetStockObject(LTGRAY_BRUSH));
+ SelectObject(lpdi->hDC, hBrush);
+ }
+ FillRect(lpdi->hDC, &lpdi->rcItem, hBrush);
+ }
+ else
+ return TRUE; /* this should never happen */
+
+ rect=lpdi->rcItem;
+ switch (lpdi->CtlID)
+ {
+ case cmb1: /* TRACE(commdlg,"WM_Drawitem cmb1\n"); */
+ SendMessageA(lpdi->hwndItem, CB_GETLBTEXT, lpdi->itemID,
+ (LPARAM)buffer);
+ GetObjectA( hBitmapTT, sizeof(bm), &bm );
+ TextOutA(lpdi->hDC, lpdi->rcItem.left + bm.bmWidth + 10,
+ lpdi->rcItem.top, buffer, lstrlenA(buffer));
+#if 0
+ nFontType = SendMessageA(lpdi->hwndItem, CB_GETITEMDATA, lpdi->itemID,0L);
+ /* FIXME: draw bitmap if truetype usage */
+ if (nFontType&TRUETYPE_FONTTYPE)
+ {
+ hMemDC = CreateCompatibleDC(lpdi->hDC);
+ hBitmap = SelectObject(hMemDC, hBitmapTT);
+ BitBlt(lpdi->hDC, lpdi->rcItem.left, lpdi->rcItem.top,
+ bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ SelectObject(hMemDC, hBitmap);
+ DeleteDC(hMemDC);
+ }
+#endif
+ break;
+ case cmb2:
+ case cmb3: /* TRACE(commdlg,"WM_DRAWITEN cmb2,cmb3\n"); */
+ SendMessageA(lpdi->hwndItem, CB_GETLBTEXT, lpdi->itemID,
+ (LPARAM)buffer);
+ TextOutA(lpdi->hDC, lpdi->rcItem.left,
+ lpdi->rcItem.top, buffer, lstrlenA(buffer));
+ break;
+
+ case cmb4: /* TRACE(commdlg,"WM_DRAWITEM cmb4 (=COLOR)\n"); */
+ SendMessageA(lpdi->hwndItem, CB_GETLBTEXT, lpdi->itemID,
+ (LPARAM)buffer);
+ TextOutA(lpdi->hDC, lpdi->rcItem.left + 25+5,
+ lpdi->rcItem.top, buffer, lstrlenA(buffer));
+ cr = SendMessageA(lpdi->hwndItem, CB_GETITEMDATA, lpdi->itemID,0L);
+ hBrush = CreateSolidBrush(cr);
+ if (hBrush)
+ {
+ hBrush = SelectObject (lpdi->hDC, hBrush) ;
+ rect.right=rect.left+25;
+ rect.top++;
+ rect.left+=5;
+ rect.bottom--;
+ Rectangle( lpdi->hDC, rect.left, rect.top,
+ rect.right, rect.bottom );
+ DeleteObject( SelectObject (lpdi->hDC, hBrush)) ;
+ }
+ rect=lpdi->rcItem;
+ rect.left+=25+5;
+ break;
+
+ default: return TRUE; /* this should never happen */
+ }
+ if (lpdi->itemState == ODS_SELECTED)
+ {
+ SetTextColor(lpdi->hDC, oldText);
+ SetBkColor(lpdi->hDC, oldBk);
+ }
+ }
+ return TRUE;
+}
+
+/***********************************************************************
+ * CFn_WMCtlColor [internal]
+ */
+LRESULT CFn_WMCtlColorStatic(HWND hDlg, WPARAM wParam, LPARAM lParam,
+ LPCHOOSEFONTA lpcf)
+{
+ if (lpcf->Flags & CF_EFFECTS)
+ if (GetDlgCtrlID(lParam)==stc6)
+ {
+ SetTextColor((HDC)wParam, lpcf->rgbColors);
+ return GetStockObject(WHITE_BRUSH);
+ }
+ return 0;
+}
+
+/***********************************************************************
+ * CFn_WMCommand [internal]
+ */
+LRESULT CFn_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam,
+ LPCHOOSEFONTA lpcf)
+{
+ HFONT hFont;
+ int i,j;
+ long l;
+ HDC hdc;
+ LPLOGFONTA lpxx=lpcf->lpLogFont;
+
+ TRACE(commdlg,"WM_COMMAND wParam=%08lX lParam=%08lX\n", (LONG)wParam, lParam);
+ switch (LOWORD(wParam))
+ {
+ case cmb1:if (HIWORD(wParam)==CBN_SELCHANGE)
+ {
+ hdc=(lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC) ? lpcf->hDC : GetDC(hDlg);
+ if (hdc)
+ {
+ SendDlgItemMessageA(hDlg, cmb2, CB_RESETCONTENT16, 0, 0);
+ SendDlgItemMessageA(hDlg, cmb3, CB_RESETCONTENT16, 0, 0);
+ i=SendDlgItemMessageA(hDlg, cmb1, CB_GETCURSEL16, 0, 0);
+ if (i!=CB_ERR)
+ {
+ HCURSOR hcursor=SetCursor(LoadCursorA(0,IDC_WAITA));
+ CFn_ENUMSTRUCT s;
+ char str[256];
+ SendDlgItemMessageA(hDlg, cmb1, CB_GETLBTEXT, i,
+ (LPARAM)str);
+ TRACE(commdlg,"WM_COMMAND/cmb1 =>%s\n",str);
+ s.hWnd1=GetDlgItem(hDlg, cmb2);
+ s.hWnd2=GetDlgItem(hDlg, cmb3);
+ s.lpcf32a=lpcf;
+ EnumFontFamiliesA(hdc, str, FontStyleEnumProc, (LPARAM)&s);
+ SetCursor(hcursor);
+ }
+ if (!(lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC))
+ ReleaseDC(hDlg,hdc);
+ }
+ else
+ {
+ WARN(commdlg,"HDC failure !!!\n");
+ EndDialog (hDlg, 0);
+ return TRUE;
+ }
+ }
+ case chx1:
+ case chx2:
+ case cmb2:
+ case cmb3:if (HIWORD(wParam)==CBN_SELCHANGE || HIWORD(wParam)== BN_CLICKED )
+ {
+ char str[256];
+ TRACE(commdlg,"WM_COMMAND/cmb2,3 =%08lX\n", lParam);
+ i=SendDlgItemMessageA(hDlg,cmb1,CB_GETCURSEL,0,0);
+ if (i==CB_ERR)
+ i=GetDlgItemTextA( hDlg, cmb1, str, 256 );
+ else
+ {
+ SendDlgItemMessageA(hDlg,cmb1,CB_GETLBTEXT,i,
+ (LPARAM)str);
+ l=SendDlgItemMessageA(hDlg,cmb1,CB_GETITEMDATA,i,0);
+ j=HIWORD(l);
+ lpcf->nFontType = LOWORD(l);
+ /* FIXME: lpcf->nFontType |= .... SIMULATED_FONTTYPE and so */
+ /* same value reported to the EnumFonts
+ call back with the extra FONTTYPE_... bits added */
+ lpxx->lfPitchAndFamily=j&0xff;
+ lpxx->lfCharSet=j>>8;
+ }
+ strcpy(lpxx->lfFaceName,str);
+ i=SendDlgItemMessageA(hDlg, cmb2, CB_GETCURSEL, 0, 0);
+ if (i!=CB_ERR)
+ {
+ l=SendDlgItemMessageA(hDlg, cmb2, CB_GETITEMDATA, i, 0);
+ if (0!=(lpxx->lfItalic=HIWORD(l)))
+ lpcf->nFontType |= ITALIC_FONTTYPE;
+ if ((lpxx->lfWeight=LOWORD(l)) > FW_MEDIUM)
+ lpcf->nFontType |= BOLD_FONTTYPE;
+ }
+ i=SendDlgItemMessageA(hDlg, cmb3, CB_GETCURSEL, 0, 0);
+ if (i!=CB_ERR)
+ lpxx->lfHeight=-LOWORD(SendDlgItemMessageA(hDlg, cmb3, CB_GETITEMDATA, i, 0));
+ else
+ lpxx->lfHeight=0;
+ lpxx->lfStrikeOut=IsDlgButtonChecked(hDlg,chx1);
+ lpxx->lfUnderline=IsDlgButtonChecked(hDlg,chx2);
+ lpxx->lfWidth=lpxx->lfOrientation=lpxx->lfEscapement=0;
+ lpxx->lfOutPrecision=OUT_DEFAULT_PRECIS;
+ lpxx->lfClipPrecision=CLIP_DEFAULT_PRECIS;
+ lpxx->lfQuality=DEFAULT_QUALITY;
+ lpcf->iPointSize= -10*lpxx->lfHeight;
+
+ hFont=CreateFontIndirectA(lpxx);
+ if (hFont)
+ {
+ HFONT oldFont=SendDlgItemMessageA(hDlg, stc6,
+ WM_GETFONT, 0, 0);
+ SendDlgItemMessageA(hDlg,stc6,WM_SETFONT,hFont,TRUE);
+ DeleteObject(oldFont);
+ }
+ }
+ break;
+
+ case cmb4:i=SendDlgItemMessageA(hDlg, cmb4, CB_GETCURSEL, 0, 0);
+ if (i!=CB_ERR)
+ {
+ lpcf->rgbColors=textcolors[i];
+ InvalidateRect( GetDlgItem(hDlg,stc6), NULL, 0 );
+ }
+ break;
+
+ case psh15:i=RegisterWindowMessageA( HELPMSGSTRING );
+ if (lpcf->hwndOwner)
+ SendMessageA(lpcf->hwndOwner, i, 0, (LPARAM)GetWindowLongA(hDlg, DWL_USER));
+/* if (CFn_HookCallChk(lpcf))
+ CallWindowProc16(lpcf->lpfnHook,hDlg,WM_COMMAND,psh15,(LPARAM)lpcf);*/
+ break;
+
+ case IDOK:if ( (!(lpcf->Flags & CF_LIMITSIZE)) ||
+ ( (lpcf->Flags & CF_LIMITSIZE) &&
+ (-lpxx->lfHeight >= lpcf->nSizeMin) &&
+ (-lpxx->lfHeight <= lpcf->nSizeMax)))
+ EndDialog(hDlg, TRUE);
+ else
+ {
+ char buffer[80];
+ sprintf(buffer,"Select a font size between %d and %d points.",
+ lpcf->nSizeMin,lpcf->nSizeMax);
+ MessageBoxA(hDlg, buffer, NULL, MB_OK);
+ }
+ return(TRUE);
+ case IDCANCEL:EndDialog(hDlg, FALSE);
+ return(TRUE);
+ }
+ return(FALSE);
+}
+
+static LRESULT CFn_WMDestroy(HWND hwnd, WPARAM wParam, LPARAM lParam)
+{
+ DeleteObject(SendDlgItemMessageA(hwnd, stc6, WM_GETFONT, 0, 0));
+ return TRUE;
+}
+
+
+/***********************************************************************
+ * FormatCharDlgProc16 (COMMDLG.16)
+ FIXME: 1. some strings are "hardcoded", but it's better load from sysres
+ 2. some CF_.. flags are not supported
+ 3. some TType extensions
+ */
+LRESULT WINAPI FormatCharDlgProc16(HWND16 hDlg, UINT16 message, WPARAM16 wParam,
+ LPARAM lParam)
+{
+ LPCHOOSEFONT16 lpcf;
+ LPCHOOSEFONTA lpcf32a;
+ UINT uMsg32;
+ WPARAM wParam32;
+ LRESULT res=0;
+ if (message!=WM_INITDIALOG)
+ {
+ lpcf=(LPCHOOSEFONT16)GetWindowLongA(hDlg, DWL_USER);
+ if (!lpcf)
+ return FALSE;
+ if (CFn_HookCallChk(lpcf))
+ res=CallWindowProc16(lpcf->lpfnHook,hDlg,message,wParam,lParam);
+ if (res)
+ return res;
+ }
+ else
+ {
+ lpcf=(LPCHOOSEFONT16)lParam;
+ lpcf32a=(LPCHOOSEFONTA)lpcf->lpTemplateName;
+ if (!CFn_WMInitDialog(hDlg, wParam, lParam, lpcf32a))
+ {
+ TRACE(commdlg, "CFn_WMInitDialog returned FALSE\n");
+ return FALSE;
+ }
+ if (CFn_HookCallChk(lpcf))
+ return CallWindowProc16(lpcf->lpfnHook,hDlg,WM_INITDIALOG,wParam,lParam);
+ }
+ WINPROC_MapMsg16To32A(message, wParam, &uMsg32, &wParam32, &lParam);
+ lpcf32a=(LPCHOOSEFONTA)lpcf->lpTemplateName;
+ switch (uMsg32)
+ {
+ case WM_MEASUREITEM:
+ res=CFn_WMMeasureItem(hDlg, wParam32, lParam);
+ break;
+ case WM_DRAWITEM:
+ res=CFn_WMDrawItem(hDlg, wParam32, lParam);
+ break;
+ case WM_CTLCOLORSTATIC:
+ res=CFn_WMCtlColorStatic(hDlg, wParam32, lParam, lpcf32a);
+ break;
+ case WM_COMMAND:
+ res=CFn_WMCommand(hDlg, wParam32, lParam, lpcf32a);
+ break;
+ case WM_DESTROY:
+ res=CFn_WMDestroy(hDlg, wParam32, lParam);
+ break;
+ case WM_CHOOSEFONT_GETLOGFONT:
+ TRACE(commdlg,"WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n",
+ lParam);
+ FIXME(commdlg, "current logfont back to caller\n");
+ break;
+ }
+ WINPROC_UnmapMsg16To32A(hDlg,uMsg32, wParam32, lParam, res);
+ return res;
+}
+
+/***********************************************************************
+ * FormatCharDlgProc32A [internal]
+ */
+LRESULT WINAPI FormatCharDlgProcA(HWND hDlg, UINT uMsg, WPARAM wParam,
+ LPARAM lParam)
+{
+ LPCHOOSEFONTA lpcf;
+ LRESULT res=FALSE;
+ if (uMsg!=WM_INITDIALOG)
+ {
+ lpcf=(LPCHOOSEFONTA)GetWindowLongA(hDlg, DWL_USER);
+ if (!lpcf)
+ return FALSE;
+ if (CFn_HookCallChk32(lpcf))
+ res=CallWindowProcA(lpcf->lpfnHook, hDlg, uMsg, wParam, lParam);
+ if (res)
+ return res;
+ }
+ else
+ {
+ lpcf=(LPCHOOSEFONTA)lParam;
+ if (!CFn_WMInitDialog(hDlg, wParam, lParam, lpcf))
+ {
+ TRACE(commdlg, "CFn_WMInitDialog returned FALSE\n");
+ return FALSE;
+ }
+ if (CFn_HookCallChk32(lpcf))
+ return CallWindowProcA(lpcf->lpfnHook,hDlg,WM_INITDIALOG,wParam,lParam);
+ }
+ switch (uMsg)
+ {
+ case WM_MEASUREITEM:
+ return CFn_WMMeasureItem(hDlg, wParam, lParam);
+ case WM_DRAWITEM:
+ return CFn_WMDrawItem(hDlg, wParam, lParam);
+ case WM_CTLCOLORSTATIC:
+ return CFn_WMCtlColorStatic(hDlg, wParam, lParam, lpcf);
+ case WM_COMMAND:
+ return CFn_WMCommand(hDlg, wParam, lParam, lpcf);
+ case WM_DESTROY:
+ return CFn_WMDestroy(hDlg, wParam, lParam);
+ case WM_CHOOSEFONT_GETLOGFONT:
+ TRACE(commdlg,"WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n",
+ lParam);
+ FIXME(commdlg, "current logfont back to caller\n");
+ break;
+ }
+ return res;
+}
+
+/***********************************************************************
+ * FormatCharDlgProc32W [internal]
+ */
+LRESULT WINAPI FormatCharDlgProcW(HWND hDlg, UINT uMsg, WPARAM wParam,
+ LPARAM lParam)
+{
+ LPCHOOSEFONTW lpcf32w;
+ LPCHOOSEFONTA lpcf32a;
+ LRESULT res=FALSE;
+ if (uMsg!=WM_INITDIALOG)
+ {
+ lpcf32w=(LPCHOOSEFONTW)GetWindowLongA(hDlg, DWL_USER);
+ if (!lpcf32w)
+ return FALSE;
+ if (CFn_HookCallChk32((LPCHOOSEFONTA)lpcf32w))
+ res=CallWindowProcW(lpcf32w->lpfnHook, hDlg, uMsg, wParam, lParam);
+ if (res)
+ return res;
+ }
+ else
+ {
+ lpcf32w=(LPCHOOSEFONTW)lParam;
+ lpcf32a=(LPCHOOSEFONTA)lpcf32w->lpTemplateName;
+ if (!CFn_WMInitDialog(hDlg, wParam, lParam, lpcf32a))
+ {
+ TRACE(commdlg, "CFn_WMInitDialog returned FALSE\n");
+ return FALSE;
+ }
+ if (CFn_HookCallChk32((LPCHOOSEFONTA)lpcf32w))
+ return CallWindowProcW(lpcf32w->lpfnHook,hDlg,WM_INITDIALOG,wParam,lParam);
+ }
+ lpcf32a=(LPCHOOSEFONTA)lpcf32w->lpTemplateName;
+ switch (uMsg)
+ {
+ case WM_MEASUREITEM:
+ return CFn_WMMeasureItem(hDlg, wParam, lParam);
+ case WM_DRAWITEM:
+ return CFn_WMDrawItem(hDlg, wParam, lParam);
+ case WM_CTLCOLORSTATIC:
+ return CFn_WMCtlColorStatic(hDlg, wParam, lParam, lpcf32a);
+ case WM_COMMAND:
+ return CFn_WMCommand(hDlg, wParam, lParam, lpcf32a);
+ case WM_DESTROY:
+ return CFn_WMDestroy(hDlg, wParam, lParam);
+ case WM_CHOOSEFONT_GETLOGFONT:
+ TRACE(commdlg,"WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n",
+ lParam);
+ FIXME(commdlg, "current logfont back to caller\n");
+ break;
+ }
+ return res;
+}
+
+
diff --git a/dlls/commdlg/generic.c b/dlls/commdlg/generic.c
new file mode 100644
index 0000000..9ff26e2
--- /dev/null
+++ b/dlls/commdlg/generic.c
@@ -0,0 +1,40 @@
+/*
+ * COMMDLG functions
+ *
+ * Copyright 1994 Martin Ayotte
+ * Copyright 1996 Albrecht Kleine
+ * Copyright 1999 Klaas van Gend
+ */
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include "winbase.h"
+#include "wine/winbase16.h"
+#include "wine/winuser16.h"
+#include "win.h"
+#include "heap.h"
+#include "message.h"
+#include "commdlg.h"
+#include "resource.h"
+#include "dialog.h"
+#include "dlgs.h"
+#include "module.h"
+#include "drive.h"
+#include "debug.h"
+#include "font.h"
+#include "winproc.h"
+
+static DWORD CommDlgLastError = 0;
+
+
+
+/***********************************************************************
+ * CommDlgExtendedError (COMMDLG.26)
+ */
+DWORD WINAPI CommDlgExtendedError(void)
+{
+ return CommDlgLastError;
+}
+
+
diff --git a/dlls/commdlg/printdlg.c b/dlls/commdlg/printdlg.c
new file mode 100644
index 0000000..ca86015
--- /dev/null
+++ b/dlls/commdlg/printdlg.c
@@ -0,0 +1,417 @@
+/*
+ * COMMDLG - Print Dialog
+ *
+ * Copyright 1994 Martin Ayotte
+ * Copyright 1996 Albrecht Kleine
+ * Copyright 1999 Klaas van Gend
+ */
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include "winbase.h"
+#include "wine/winbase16.h"
+#include "wine/winuser16.h"
+#include "win.h"
+#include "heap.h"
+#include "message.h"
+#include "commdlg.h"
+#include "resource.h"
+#include "dialog.h"
+#include "dlgs.h"
+#include "module.h"
+#include "drive.h"
+#include "debug.h"
+#include "font.h"
+#include "winproc.h"
+
+DWORD CommDlgLastError = 0;
+
+extern HBITMAP16 hFolder;
+extern HBITMAP16 hFolder2;
+extern HBITMAP16 hFloppy;
+extern HBITMAP16 hHDisk;
+extern HBITMAP16 hCDRom;
+extern HBITMAP16 hBitmapTT;
+extern const char defaultfilter[];
+
+
+
+
+/***********************************************************************
+ * PrintDlg16 (COMMDLG.20)
+ */
+BOOL16 WINAPI PrintDlg16( SEGPTR printdlg )
+{
+ HANDLE16 hInst;
+ BOOL16 bRet = FALSE;
+ LPCVOID template;
+ HWND hwndDialog;
+ LPPRINTDLG16 lpPrint = (LPPRINTDLG16)PTR_SEG_TO_LIN(printdlg);
+
+ TRACE(commdlg,"(%p) -- Flags=%08lX\n", lpPrint, lpPrint->Flags );
+
+ if (lpPrint->Flags & PD_RETURNDEFAULT)
+ /* FIXME: should fill lpPrint->hDevMode and lpPrint->hDevNames here */
+ return TRUE;
+
+ if (lpPrint->Flags & PD_PRINTSETUP)
+ template = SYSRES_GetResPtr( SYSRES_DIALOG_PRINT_SETUP );
+ else
+ template = SYSRES_GetResPtr( SYSRES_DIALOG_PRINT );
+
+ hInst = WIN_GetWindowInstance( lpPrint->hwndOwner );
+ hwndDialog = DIALOG_CreateIndirect( hInst, template, TRUE,
+ lpPrint->hwndOwner,
+ (DLGPROC16)((lpPrint->Flags & PD_PRINTSETUP) ?
+ MODULE_GetWndProcEntry16("PrintSetupDlgProc") :
+ MODULE_GetWndProcEntry16("PrintDlgProc")),
+ printdlg, WIN_PROC_16 );
+ if (hwndDialog) bRet = DIALOG_DoDialogBox( hwndDialog, lpPrint->hwndOwner);
+ return bRet;
+}
+
+
+
+/***********************************************************************
+ * PrintDlgA (COMDLG32.17)
+ *
+ * Displays the the PRINT dialog box, which enables the user to specify
+ * specific properties of the print job.
+ *
+ * (Note: according to the MS Platform SDK, this call was in the past
+ * also used to display some PRINT SETUP dialog. As this is superseded
+ * by PageSetupDlg, this now results in an error!)
+ *
+ * RETURNS
+ * nonzero if the user pressed the OK button
+ * zero if the user cancelled the window or an error occurred
+ *
+ * BUGS
+ * The function is a stub only, returning TRUE to allow more programs
+ * to function.
+ */
+BOOL WINAPI PrintDlgA(
+ LPPRINTDLGA lppd /* ptr to PRINTDLG32 struct */
+ )
+{
+/* My implementing strategy:
+ *
+ * step 1: display the dialog and implement the layout-flags
+ * step 2: enter valid information in the fields (e.g. real printers)
+ * step 3: fix the RETURN-TRUE-ALWAYS Fixme by checking lppd->Flags for
+ * PD_RETURNDEFAULT
+ * step 4: implement all other specs
+ * step 5: allow customisation of the dialog box
+ *
+ * current implementation is in step 1.
+ */
+
+ HWND hwndDialog;
+ BOOL bRet = FALSE;
+ LPCVOID ptr = SYSRES_GetResPtr( SYSRES_DIALOG_PRINT32 );
+ HINSTANCE hInst = WIN_GetWindowInstance( lppd->hwndOwner );
+
+ FIXME(commdlg, "KVG (%p): stub\n", lppd);
+
+ /*
+ * FIXME : Should respond to TEMPLATE and HOOK flags here
+ * For now, only the standard dialog works.
+ */
+ if (lppd->Flags & (PD_ENABLEPRINTHOOK | PD_ENABLEPRINTTEMPLATE |
+ PD_ENABLEPRINTTEMPLATEHANDLE | PD_ENABLESETUPHOOK |
+ PD_ENABLESETUPTEMPLATE|PD_ENABLESETUPTEMPLATEHANDLE))
+ FIXME(commdlg, ": unimplemented flag (ignored)\n");
+
+ /*
+ * if lppd->Flags PD_RETURNDEFAULT is specified, the PrintDlg function
+ * does not display the dialog box, but returns with valid entries
+ * for hDevMode and hDevNames .
+ *
+ * Currently the flag is recognised, but we return empty hDevMode and
+ * and hDevNames. This will be fixed when I am in step 3.
+ */
+ if (lppd->Flags & PD_RETURNDEFAULT)
+ {
+ WARN(commdlg, ": PrintDlg was requested to return printer info only."
+ "\n The return value currently does NOT provide these.\n");
+ CommDlgLastError=PDERR_NODEVICES; /* return TRUE, thus never checked! */
+ return(TRUE);
+ }
+
+ if (lppd->Flags & PD_PRINTSETUP)
+ {
+ FIXME(commdlg, ": PrintDlg was requested to display PrintSetup box.\n");
+ CommDlgLastError=PDERR_INITFAILURE;
+ return(FALSE);
+ }
+
+ hwndDialog= DIALOG_CreateIndirect(hInst, ptr, TRUE, lppd->hwndOwner,
+ (DLGPROC16)PrintDlgProcA, (LPARAM)lppd, WIN_PROC_32A );
+ if (hwndDialog)
+ bRet = DIALOG_DoDialogBox(hwndDialog, lppd->hwndOwner);
+ return bRet;
+}
+
+
+
+
+
+/***********************************************************************
+ * PrintDlg32W (COMDLG32.18)
+ */
+BOOL WINAPI PrintDlgW( LPPRINTDLGW printdlg )
+{
+ FIXME(commdlg, "A really empty stub\n" );
+ return FALSE;
+}
+
+
+
+/***********************************************************************
+ * PRINTDLG_WMInitDialog [internal]
+ */
+LRESULT PRINTDLG_WMInitDialog(HWND hDlg, WPARAM wParam, LPARAM lParam,
+ LPPRINTDLGA lppd)
+{
+ SetWindowLongA(hDlg, DWL_USER, lParam);
+ TRACE(commdlg,"WM_INITDIALOG lParam=%08lX\n", lParam);
+
+ if (lppd->lStructSize != sizeof(PRINTDLGA))
+ {
+ FIXME(commdlg,"structure size failure !!!\n");
+/* EndDialog (hDlg, 0);
+ return FALSE;
+*/ }
+
+/* Flag processing to set the according buttons on/off and
+ * Initialise the various values
+ */
+
+ /* Print range (All/Range/Selection) */
+ if (lppd->nMinPage == lppd->nMaxPage)
+ lppd->Flags &= ~PD_NOPAGENUMS;
+ /* FIXME: I allow more freedom than either Win95 or WinNT,
+ * as officially we should return error if
+ * ToPage or FromPage is out-of-range
+ */
+ if (lppd->nToPage < lppd->nMinPage)
+ lppd->nToPage = lppd->nMinPage;
+ if (lppd->nToPage > lppd->nMaxPage)
+ lppd->nToPage = lppd->nMaxPage;
+ if (lppd->nFromPage < lppd->nMinPage)
+ lppd->nFromPage = lppd->nMinPage;
+ if (lppd->nFromPage > lppd->nMaxPage)
+ lppd->nFromPage = lppd->nMaxPage;
+ SetDlgItemInt(hDlg, edt2, lppd->nFromPage, FALSE);
+ SetDlgItemInt(hDlg, edt3, lppd->nToPage, FALSE);
+ CheckRadioButton(hDlg, rad1, rad3, rad1);
+ if (lppd->Flags & PD_NOSELECTION)
+ EnableWindow(GetDlgItem(hDlg, rad3), FALSE);
+ else
+ if (lppd->Flags & PD_SELECTION)
+ CheckRadioButton(hDlg, rad1, rad3, rad3);
+ if (lppd->Flags & PD_NOPAGENUMS)
+ {
+ EnableWindow(GetDlgItem(hDlg, rad2), FALSE);
+ EnableWindow(GetDlgItem(hDlg, stc10),FALSE);
+ EnableWindow(GetDlgItem(hDlg, edt2), FALSE);
+ EnableWindow(GetDlgItem(hDlg, stc11),FALSE);
+ EnableWindow(GetDlgItem(hDlg, edt3), FALSE);
+ }
+ else
+ {
+ if (lppd->Flags & PD_PAGENUMS)
+ CheckRadioButton(hDlg, rad1, rad3, rad2);
+ }
+ /* FIXME: in Win95, the radiobutton "All" is displayed as
+ * "Print all xxx pages"... This is not done here (yet?)
+ */
+
+ /* Collate pages */
+ if (lppd->Flags & PD_COLLATE)
+ FIXME(commdlg, "PD_COLLATE not implemented yet\n");
+
+ /* print to file */
+ CheckDlgButton(hDlg, chx1, (lppd->Flags & PD_PRINTTOFILE) ? 1 : 0);
+ if (lppd->Flags & PD_DISABLEPRINTTOFILE)
+ EnableWindow(GetDlgItem(hDlg, chx1), FALSE);
+ if (lppd->Flags & PD_HIDEPRINTTOFILE)
+ ShowWindow(GetDlgItem(hDlg, chx1), SW_HIDE);
+
+ /* status */
+
+TRACE(commdlg, "succesful!\n");
+ return TRUE;
+}
+
+
+/***********************************************************************
+ * PRINTDLG_ValidateAndDuplicateSettings [internal]
+ */
+BOOL PRINTDLG_ValidateAndDuplicateSettings(HWND hDlg, LPPRINTDLGA lppd)
+{
+ WORD nToPage;
+ WORD nFromPage;
+ char TempBuffer[256];
+
+ /* check whether nFromPage and nToPage are within range defined by
+ * nMinPage and nMaxPage
+ */
+ /* FIXMNo checking on rad2 is performed now, because IsDlgButtonCheck
+ * currently doesn't seem to know a state BST_CHECKED
+ */
+/* if (IsDlgButtonChecked(hDlg, rad2) == BST_CHECKED) */
+ {
+ nFromPage = GetDlgItemInt(hDlg, edt2, NULL, FALSE);
+ nToPage = GetDlgItemInt(hDlg, edt3, NULL, FALSE);
+ if (nFromPage < lppd->nMinPage || nFromPage > lppd->nMaxPage ||
+ nToPage < lppd->nMinPage || nToPage > lppd->nMaxPage)
+ {
+ FIXME(commdlg, "The MessageBox is not internationalised.");
+ sprintf(TempBuffer, "This value lies not within Page range\n"
+ "Please enter a value between %d and %d",
+ lppd->nMinPage, lppd->nMaxPage);
+ MessageBoxA(hDlg, TempBuffer, "Print", MB_OK | MB_ICONWARNING);
+ return(FALSE);
+ }
+ lppd->nFromPage = nFromPage;
+ lppd->nToPage = nToPage;
+ }
+
+ return(TRUE);
+}
+
+
+
+/***********************************************************************
+ * PRINTDLG_WMCommand [internal]
+ */
+static LRESULT PRINTDLG_WMCommand(HWND hDlg, WPARAM wParam,
+ LPARAM lParam, LPPRINTDLGA lppd)
+{
+ switch (wParam)
+ {
+ case IDOK:
+ if (PRINTDLG_ValidateAndDuplicateSettings(hDlg, lppd) != TRUE)
+ return(FALSE);
+ MessageBoxA(hDlg, "OK was hit!", NULL, MB_OK);
+ DestroyWindow(hDlg);
+ return(TRUE);
+ case IDCANCEL:
+ MessageBoxA(hDlg, "CANCEL was hit!", NULL, MB_OK);
+ EndDialog(hDlg, FALSE);
+/* DestroyWindow(hDlg); */
+ return(FALSE);
+ }
+ return FALSE;
+}
+
+
+
+/***********************************************************************
+ * PrintDlgProcA [internal]
+ */
+LRESULT WINAPI PrintDlgProcA(HWND hDlg, UINT uMsg, WPARAM wParam,
+ LPARAM lParam)
+{
+ LPPRINTDLGA lppd;
+ LRESULT res=FALSE;
+ if (uMsg!=WM_INITDIALOG)
+ {
+ lppd=(LPPRINTDLGA)GetWindowLongA(hDlg, DWL_USER);
+ if (!lppd)
+ return FALSE;
+}
+ else
+ {
+ lppd=(LPPRINTDLGA)lParam;
+ if (!PRINTDLG_WMInitDialog(hDlg, wParam, lParam, lppd))
+ {
+ TRACE(commdlg, "PRINTDLG_WMInitDialog returned FALSE\n");
+ return FALSE;
+ }
+ MessageBoxA(hDlg,"Warning: this dialog has no functionality yet!",
+ NULL, MB_OK);
+ }
+ switch (uMsg)
+ {
+ case WM_COMMAND:
+ return PRINTDLG_WMCommand(hDlg, wParam, lParam, lppd);
+ case WM_DESTROY:
+ return FALSE;
+ }
+
+ return res;
+}
+
+
+
+
+
+
+
+/***********************************************************************
+ * PrintDlgProc16 (COMMDLG.21)
+ */
+LRESULT WINAPI PrintDlgProc16(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
+ LPARAM lParam)
+{
+ switch (wMsg)
+ {
+ case WM_INITDIALOG:
+ TRACE(commdlg,"WM_INITDIALOG lParam=%08lX\n", lParam);
+ ShowWindow16(hWnd, SW_SHOWNORMAL);
+ return (TRUE);
+ case WM_COMMAND:
+ switch (wParam)
+ {
+ case IDOK:
+ EndDialog(hWnd, TRUE);
+ return(TRUE);
+ case IDCANCEL:
+ EndDialog(hWnd, FALSE);
+ return(TRUE);
+ }
+ return(FALSE);
+ }
+ return FALSE;
+}
+
+
+/***********************************************************************
+ * PrintSetupDlgProc (COMMDLG.22)
+ */
+LRESULT WINAPI PrintSetupDlgProc16(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
+ LPARAM lParam)
+{
+ switch (wMsg)
+ {
+ case WM_INITDIALOG:
+ TRACE(commdlg,"WM_INITDIALOG lParam=%08lX\n", lParam);
+ ShowWindow16(hWnd, SW_SHOWNORMAL);
+ return (TRUE);
+ case WM_COMMAND:
+ switch (wParam) {
+ case IDOK:
+ EndDialog(hWnd, TRUE);
+ return(TRUE);
+ case IDCANCEL:
+ EndDialog(hWnd, FALSE);
+ return(TRUE);
+ }
+ return(FALSE);
+ }
+ return FALSE;
+}
+
+
+
+
+/***********************************************************************
+ * PageSetupDlgA (COMDLG32.15)
+ */
+BOOL WINAPI PageSetupDlgA(LPPAGESETUPDLGA setupdlg) {
+ FIXME(commdlg,"(%p), stub!\n",setupdlg);
+ return FALSE;
+}
diff --git a/misc/Makefile.in b/misc/Makefile.in
index cd99257..2c4c232 100644
--- a/misc/Makefile.in
+++ b/misc/Makefile.in
@@ -9,7 +9,6 @@
callback.c \
cdrom.c \
comm.c \
- commdlg.c \
crtdll.c \
cpu.c \
ddeml.c \
diff --git a/misc/commdlg.c b/misc/commdlg.c
deleted file mode 100644
index fbdd89d..0000000
--- a/misc/commdlg.c
+++ /dev/null
@@ -1,4305 +0,0 @@
-/*
- * COMMDLG functions
- *
- * Copyright 1994 Martin Ayotte
- * Copyright 1996 Albrecht Kleine
- * Copyright 1999 Klaas van Gend
- */
-
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-#include "winbase.h"
-#include "wine/winbase16.h"
-#include "wine/winuser16.h"
-#include "win.h"
-#include "heap.h"
-#include "message.h"
-#include "commdlg.h"
-#include "resource.h"
-#include "dialog.h"
-#include "dlgs.h"
-#include "module.h"
-#include "drive.h"
-#include "debug.h"
-#include "font.h"
-#include "winproc.h"
-
-static DWORD CommDlgLastError = 0;
-
-static HBITMAP16 hFolder = 0;
-static HBITMAP16 hFolder2 = 0;
-static HBITMAP16 hFloppy = 0;
-static HBITMAP16 hHDisk = 0;
-static HBITMAP16 hCDRom = 0;
-static HBITMAP16 hBitmapTT = 0;
-static const char defaultfilter[]=" \0\0";
-
-/***********************************************************************
- * FileDlg_Init [internal]
- */
-static BOOL FileDlg_Init(void)
-{
- static BOOL initialized = 0;
-
- if (!initialized) {
- if (!hFolder) hFolder = LoadBitmap16(0, MAKEINTRESOURCE16(OBM_FOLDER));
- if (!hFolder2) hFolder2 = LoadBitmap16(0, MAKEINTRESOURCE16(OBM_FOLDER2));
- if (!hFloppy) hFloppy = LoadBitmap16(0, MAKEINTRESOURCE16(OBM_FLOPPY));
- if (!hHDisk) hHDisk = LoadBitmap16(0, MAKEINTRESOURCE16(OBM_HDISK));
- if (!hCDRom) hCDRom = LoadBitmap16(0, MAKEINTRESOURCE16(OBM_CDROM));
- if (hFolder == 0 || hFolder2 == 0 || hFloppy == 0 ||
- hHDisk == 0 || hCDRom == 0)
- {
- WARN(commdlg, "Error loading bitmaps !\nprin");
- return FALSE;
- }
- initialized = TRUE;
- }
- return TRUE;
-}
-
-/***********************************************************************
- * GetOpenFileName (COMMDLG.1)
- */
-BOOL16 WINAPI GetOpenFileName16( SEGPTR ofn )
-{
- HINSTANCE hInst;
- HANDLE hDlgTmpl = 0, hResInfo;
- BOOL bRet = FALSE, win32Format = FALSE;
- HWND hwndDialog;
- LPOPENFILENAME16 lpofn = (LPOPENFILENAME16)PTR_SEG_TO_LIN(ofn);
- LPCVOID template;
- char defaultopen[]="Open File";
- char *str=0,*str1=0;
-
- if (!lpofn || !FileDlg_Init()) return FALSE;
-
- if (lpofn->Flags & OFN_WINE) {
- if (lpofn->Flags & OFN_ENABLETEMPLATEHANDLE)
- {
- if (!(template = LockResource( MapHModuleSL(lpofn->hInstance ))))
- {
- CommDlgLastError = CDERR_LOADRESFAILURE;
- return FALSE;
- }
- }
- else if (lpofn->Flags & OFN_ENABLETEMPLATE)
- {
- if (!(hResInfo = FindResourceA(MapHModuleSL(lpofn->hInstance),
- PTR_SEG_TO_LIN(lpofn->lpTemplateName), RT_DIALOGA)))
- {
- CommDlgLastError = CDERR_FINDRESFAILURE;
- return FALSE;
- }
- if (!(hDlgTmpl = LoadResource( MapHModuleSL(lpofn->hInstance),
- hResInfo )) ||
- !(template = LockResource( hDlgTmpl )))
- {
- CommDlgLastError = CDERR_LOADRESFAILURE;
- return FALSE;
- }
- } else {
- template = SYSRES_GetResPtr( SYSRES_DIALOG_OPEN_FILE );
- }
- win32Format = TRUE;
- } else {
- if (lpofn->Flags & OFN_ENABLETEMPLATEHANDLE)
- {
- if (!(template = LockResource16( lpofn->hInstance )))
- {
- CommDlgLastError = CDERR_LOADRESFAILURE;
- return FALSE;
- }
- }
- else if (lpofn->Flags & OFN_ENABLETEMPLATE)
- {
- if (!(hResInfo = FindResource16(lpofn->hInstance,
- lpofn->lpTemplateName,
- RT_DIALOG16)))
- {
- CommDlgLastError = CDERR_FINDRESFAILURE;
- return FALSE;
- }
- if (!(hDlgTmpl = LoadResource16( lpofn->hInstance, hResInfo )) ||
- !(template = LockResource16( hDlgTmpl )))
- {
- CommDlgLastError = CDERR_LOADRESFAILURE;
- return FALSE;
- }
- } else {
- template = SYSRES_GetResPtr( SYSRES_DIALOG_OPEN_FILE );
- win32Format = TRUE;
- }
- }
-
- hInst = WIN_GetWindowInstance( lpofn->hwndOwner );
-
- if (!(lpofn->lpstrFilter))
- {
- str = SEGPTR_ALLOC(sizeof(defaultfilter));
- TRACE(commdlg,"Alloc %p default for Filetype in GetOpenFileName\n",str);
- memcpy(str,defaultfilter,sizeof(defaultfilter));
- lpofn->lpstrFilter=SEGPTR_GET(str);
- }
-
- if (!(lpofn->lpstrTitle))
- {
- str1 = SEGPTR_ALLOC(strlen(defaultopen)+1);
- TRACE(commdlg,"Alloc %p default for Title in GetOpenFileName\n",str1);
- strcpy(str1,defaultopen);
- lpofn->lpstrTitle=SEGPTR_GET(str1);
- }
-
- /* FIXME: doesn't handle win32 format correctly yet */
- hwndDialog = DIALOG_CreateIndirect( hInst, template, win32Format,
- lpofn->hwndOwner,
- (DLGPROC16)MODULE_GetWndProcEntry16("FileOpenDlgProc"),
- ofn, WIN_PROC_16 );
- if (hwndDialog) bRet = DIALOG_DoDialogBox( hwndDialog, lpofn->hwndOwner );
-
- if (str1)
- {
- TRACE(commdlg,"Freeing %p default for Title in GetOpenFileName\n",str1);
- SEGPTR_FREE(str1);
- lpofn->lpstrTitle=0;
- }
-
- if (str)
- {
- TRACE(commdlg,"Freeing %p default for Filetype in GetOpenFileName\n",str);
- SEGPTR_FREE(str);
- lpofn->lpstrFilter=0;
- }
-
- if (hDlgTmpl) {
- if (lpofn->Flags & OFN_WINE)
- FreeResource( hDlgTmpl );
- else
- FreeResource16( hDlgTmpl );
- }
-
- TRACE(commdlg,"return lpstrFile='%s' !\n",
- (LPSTR)PTR_SEG_TO_LIN(lpofn->lpstrFile));
- return bRet;
-}
-
-
-/***********************************************************************
- * GetSaveFileName (COMMDLG.2)
- */
-BOOL16 WINAPI GetSaveFileName16( SEGPTR ofn)
-{
- HINSTANCE hInst;
- HANDLE hDlgTmpl = 0;
- BOOL bRet = FALSE, win32Format = FALSE;
- LPOPENFILENAME16 lpofn = (LPOPENFILENAME16)PTR_SEG_TO_LIN(ofn);
- LPCVOID template;
- HWND hwndDialog;
- char defaultsave[]="Save as";
- char *str =0,*str1=0;
-
- if (!lpofn || !FileDlg_Init()) return FALSE;
-
- if (lpofn->Flags & OFN_WINE) {
- if (lpofn->Flags & OFN_ENABLETEMPLATEHANDLE)
- {
- if (!(template = LockResource( MapHModuleSL(lpofn->hInstance ))))
- {
- CommDlgLastError = CDERR_LOADRESFAILURE;
- return FALSE;
- }
- }
- else if (lpofn->Flags & OFN_ENABLETEMPLATE)
- {
- HANDLE hResInfo;
- if (!(hResInfo = FindResourceA(MapHModuleSL(lpofn->hInstance),
- PTR_SEG_TO_LIN(lpofn->lpTemplateName),
- RT_DIALOGA)))
- {
- CommDlgLastError = CDERR_FINDRESFAILURE;
- return FALSE;
- }
- if (!(hDlgTmpl = LoadResource(MapHModuleSL(lpofn->hInstance),
- hResInfo)) ||
- !(template = LockResource(hDlgTmpl)))
- {
- CommDlgLastError = CDERR_LOADRESFAILURE;
- return FALSE;
- }
- win32Format= TRUE;
- } else {
- template = SYSRES_GetResPtr( SYSRES_DIALOG_SAVE_FILE );
- win32Format = TRUE;
- }
- } else {
- if (lpofn->Flags & OFN_ENABLETEMPLATEHANDLE)
- {
- if (!(template = LockResource16( lpofn->hInstance )))
- {
- CommDlgLastError = CDERR_LOADRESFAILURE;
- return FALSE;
- }
- }
- else if (lpofn->Flags & OFN_ENABLETEMPLATE)
- {
- HANDLE16 hResInfo;
- if (!(hResInfo = FindResource16(lpofn->hInstance,
- lpofn->lpTemplateName,
- RT_DIALOG16)))
- {
- CommDlgLastError = CDERR_FINDRESFAILURE;
- return FALSE;
- }
- if (!(hDlgTmpl = LoadResource16( lpofn->hInstance, hResInfo )) ||
- !(template = LockResource16( hDlgTmpl )))
- {
- CommDlgLastError = CDERR_LOADRESFAILURE;
- return FALSE;
- }
- } else {
- template = SYSRES_GetResPtr( SYSRES_DIALOG_SAVE_FILE );
- win32Format = TRUE;
- }
- }
-
- hInst = WIN_GetWindowInstance( lpofn->hwndOwner );
-
- if (!(lpofn->lpstrFilter))
- {
- str = SEGPTR_ALLOC(sizeof(defaultfilter));
- TRACE(commdlg,"Alloc default for Filetype in GetSaveFileName\n");
- memcpy(str,defaultfilter,sizeof(defaultfilter));
- lpofn->lpstrFilter=SEGPTR_GET(str);
- }
-
- if (!(lpofn->lpstrTitle))
- {
- str1 = SEGPTR_ALLOC(sizeof(defaultsave)+1);
- TRACE(commdlg,"Alloc default for Title in GetSaveFileName\n");
- strcpy(str1,defaultsave);
- lpofn->lpstrTitle=SEGPTR_GET(str1);
- }
-
- hwndDialog = DIALOG_CreateIndirect( hInst, template, win32Format,
- lpofn->hwndOwner,
- (DLGPROC16)MODULE_GetWndProcEntry16("FileSaveDlgProc"),
- ofn, WIN_PROC_16 );
- if (hwndDialog) bRet = DIALOG_DoDialogBox( hwndDialog, lpofn->hwndOwner );
-
- if (str1)
- {
- TRACE(commdlg,"Freeing %p default for Title in GetSaveFileName\n",str1);
- SEGPTR_FREE(str1);
- lpofn->lpstrTitle=0;
- }
-
- if (str)
- {
- TRACE(commdlg,"Freeing %p default for Filetype in GetSaveFileName\n",str);
- SEGPTR_FREE(str);
- lpofn->lpstrFilter=0;
- }
-
- if (hDlgTmpl) {
- if (lpofn->Flags & OFN_WINE)
- FreeResource( hDlgTmpl );
- else
- FreeResource16( hDlgTmpl );
- }
-
- TRACE(commdlg, "return lpstrFile='%s' !\n",
- (LPSTR)PTR_SEG_TO_LIN(lpofn->lpstrFile));
- return bRet;
-}
-
-/***********************************************************************
- * FILEDLG_StripEditControl [internal]
- * Strip pathnames off the contents of the edit control.
- */
-static void FILEDLG_StripEditControl(HWND16 hwnd)
-{
- char temp[512], *cp;
-
- GetDlgItemTextA( hwnd, edt1, temp, sizeof(temp) );
- cp = strrchr(temp, '\\');
- if (cp != NULL) {
- strcpy(temp, cp+1);
- }
- cp = strrchr(temp, ':');
- if (cp != NULL) {
- strcpy(temp, cp+1);
- }
- /* FIXME: shouldn't we do something with the result here? ;-) */
-}
-
-/***********************************************************************
- * FILEDLG_ScanDir [internal]
- */
-static BOOL FILEDLG_ScanDir(HWND16 hWnd, LPSTR newPath)
-{
- char buffer[512];
- char* str = buffer;
- int drive;
- HWND hlb;
-
- lstrcpynA(buffer, newPath, sizeof(buffer));
-
- if (str[0] && (str[1] == ':')) {
- drive = toupper(str[0]) - 'A';
- str += 2;
- if (!DRIVE_SetCurrentDrive(drive))
- return FALSE;
- } else {
- drive = DRIVE_GetCurrentDrive();
- }
-
- if (str[0] && !DRIVE_Chdir(drive, str)) {
- return FALSE;
- }
-
- GetDlgItemTextA(hWnd, edt1, buffer, sizeof(buffer));
- if ((hlb = GetDlgItem(hWnd, lst1)) != 0) {
- char* scptr; /* ptr on semi-colon */
- char* filter = buffer;
-
- TRACE(commdlg, "Using filter %s\n", filter);
- SendMessageA(hlb, LB_RESETCONTENT, 0, 0);
- while (filter) {
- scptr = strchr(filter, ';');
- if (scptr) *scptr = 0;
- TRACE(commdlg, "Using file spec %s\n", filter);
- if (SendMessageA(hlb, LB_DIR, 0, (LPARAM)filter) == LB_ERR)
- return FALSE;
- if (scptr) *scptr = ';';
- filter = (scptr) ? (scptr + 1) : 0;
- }
- }
-
- strcpy(buffer, "*.*");
- return DlgDirListA(hWnd, buffer, lst2, stc1, 0x8010);
-}
-
-/***********************************************************************
- * FILEDLG_GetFileType [internal]
- */
-
-static LPSTR FILEDLG_GetFileType(LPSTR cfptr, LPSTR fptr, WORD index)
-{
- int n, i;
- i = 0;
- if (cfptr)
- for ( ;(n = strlen(cfptr)) != 0; i++)
- {
- cfptr += n + 1;
- if (i == index)
- return cfptr;
- cfptr += strlen(cfptr) + 1;
- }
- if (fptr)
- for ( ;(n = strlen(fptr)) != 0; i++)
- {
- fptr += n + 1;
- if (i == index)
- return fptr;
- fptr += strlen(fptr) + 1;
- }
- return "*.*"; /* FIXME */
-}
-
-/***********************************************************************
- * FILEDLG_WMDrawItem [internal]
- */
-static LONG FILEDLG_WMDrawItem(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam,int savedlg)
-{
- LPDRAWITEMSTRUCT16 lpdis = (LPDRAWITEMSTRUCT16)PTR_SEG_TO_LIN(lParam);
- char *str;
- HBRUSH hBrush;
- HBITMAP16 hBitmap, hPrevBitmap;
- BITMAP16 bm;
- HDC hMemDC;
-
- if (lpdis->CtlType == ODT_LISTBOX && lpdis->CtlID == lst1)
- {
- if (!(str = SEGPTR_ALLOC(512))) return FALSE;
- hBrush = SelectObject(lpdis->hDC, GetStockObject(LTGRAY_BRUSH));
- SelectObject(lpdis->hDC, hBrush);
- FillRect16(lpdis->hDC, &lpdis->rcItem, hBrush);
- SendMessage16(lpdis->hwndItem, LB_GETTEXT16, lpdis->itemID,
- (LPARAM)SEGPTR_GET(str));
-
- if (savedlg) /* use _gray_ text in FileSaveDlg */
- {
- if (!lpdis->itemState)
- SetTextColor(lpdis->hDC,GetSysColor(COLOR_GRAYTEXT) );
- else
- SetTextColor(lpdis->hDC,GetSysColor(COLOR_WINDOWTEXT) );
- /* inversion of gray would be bad readable */
- }
-
- TextOut16(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top,
- str, strlen(str));
- if (lpdis->itemState != 0) {
- InvertRect16(lpdis->hDC, &lpdis->rcItem);
- }
- SEGPTR_FREE(str);
- return TRUE;
- }
-
- if (lpdis->CtlType == ODT_LISTBOX && lpdis->CtlID == lst2)
- {
- if (!(str = SEGPTR_ALLOC(512))) return FALSE;
- hBrush = SelectObject(lpdis->hDC, GetStockObject(LTGRAY_BRUSH));
- SelectObject(lpdis->hDC, hBrush);
- FillRect16(lpdis->hDC, &lpdis->rcItem, hBrush);
- SendMessage16(lpdis->hwndItem, LB_GETTEXT16, lpdis->itemID,
- (LPARAM)SEGPTR_GET(str));
-
- hBitmap = hFolder;
- GetObject16( hBitmap, sizeof(bm), &bm );
- TextOut16(lpdis->hDC, lpdis->rcItem.left + bm.bmWidth,
- lpdis->rcItem.top, str, strlen(str));
- hMemDC = CreateCompatibleDC(lpdis->hDC);
- hPrevBitmap = SelectObject(hMemDC, hBitmap);
- BitBlt(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top,
- bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
- SelectObject(hMemDC, hPrevBitmap);
- DeleteDC(hMemDC);
- if (lpdis->itemState != 0) InvertRect16(lpdis->hDC, &lpdis->rcItem);
- SEGPTR_FREE(str);
- return TRUE;
- }
- if (lpdis->CtlType == ODT_COMBOBOX && lpdis->CtlID == cmb2)
- {
- if (!(str = SEGPTR_ALLOC(512))) return FALSE;
- hBrush = SelectObject(lpdis->hDC, GetStockObject(LTGRAY_BRUSH));
- SelectObject(lpdis->hDC, hBrush);
- FillRect16(lpdis->hDC, &lpdis->rcItem, hBrush);
- SendMessage16(lpdis->hwndItem, CB_GETLBTEXT16, lpdis->itemID,
- (LPARAM)SEGPTR_GET(str));
- switch(DRIVE_GetType( str[2] - 'a' ))
- {
- case TYPE_FLOPPY: hBitmap = hFloppy; break;
- case TYPE_CDROM: hBitmap = hCDRom; break;
- case TYPE_HD:
- case TYPE_NETWORK:
- default: hBitmap = hHDisk; break;
- }
- GetObject16( hBitmap, sizeof(bm), &bm );
- TextOut16(lpdis->hDC, lpdis->rcItem.left + bm.bmWidth,
- lpdis->rcItem.top, str, strlen(str));
- hMemDC = CreateCompatibleDC(lpdis->hDC);
- hPrevBitmap = SelectObject(hMemDC, hBitmap);
- BitBlt( lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top,
- bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY );
- SelectObject(hMemDC, hPrevBitmap);
- DeleteDC(hMemDC);
- if (lpdis->itemState != 0) InvertRect16(lpdis->hDC, &lpdis->rcItem);
- SEGPTR_FREE(str);
- return TRUE;
- }
- return FALSE;
-}
-
-/***********************************************************************
- * FILEDLG_WMMeasureItem [internal]
- */
-static LONG FILEDLG_WMMeasureItem(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam)
-{
- BITMAP16 bm;
- LPMEASUREITEMSTRUCT16 lpmeasure;
-
- GetObject16( hFolder2, sizeof(bm), &bm );
- lpmeasure = (LPMEASUREITEMSTRUCT16)PTR_SEG_TO_LIN(lParam);
- lpmeasure->itemHeight = bm.bmHeight;
- return TRUE;
-}
-
-/***********************************************************************
- * FILEDLG_HookCallChk [internal]
- */
-static int FILEDLG_HookCallChk(LPOPENFILENAME16 lpofn)
-{
- if (lpofn)
- if (lpofn->Flags & OFN_ENABLEHOOK)
- if (lpofn->lpfnHook)
- return 1;
- return 0;
-}
-
-/***********************************************************************
- * FILEDLG_CallWindowProc [internal]
- *
- * Adapt the structures back for win32 calls so the callee can read lpCustData
- */
-static BOOL FILEDLG_CallWindowProc(LPOPENFILENAME16 lpofn,HWND hwnd,
- UINT wMsg,WPARAM wParam,LPARAM lParam
-
-) {
- BOOL needstruct;
- BOOL result = FALSE;
- WINDOWPROCTYPE ProcType; /* Type of Hook Function to be called. */
-
- /* TRUE if lParam points to the OPENFILENAME16 Structure */
- needstruct = (PTR_SEG_TO_LIN(lParam) == lpofn);
-
- ProcType = (lpofn->Flags & OFN_WINE)
- ? (lpofn->Flags & OFN_UNICODE) /* 32-Bit call to GetOpenFileName */
- ? WIN_PROC_32W : WIN_PROC_32A
- : WIN_PROC_16; /* 16-Bit call to GetOpenFileName */
-
- if (!(lpofn->Flags & OFN_WINE))
- /* Call to 16-Bit Hooking function... No Problem at all. */
- return (BOOL)CallWindowProc16(
- lpofn->lpfnHook,hwnd,(UINT16)wMsg,(WPARAM16)wParam,lParam
- );
- /* |OFN_WINE32 */
- if (needstruct)
- {
- /* Parameter lParam points to lpofn... Convert Structure Data... */
- if (lpofn->Flags & OFN_UNICODE)
- {
- OPENFILENAMEW ofnw;
-
- /* FIXME: probably needs more converted */
- ofnw.lCustData = lpofn->lCustData;
- return (BOOL)CallWindowProcW(
- (WNDPROC)lpofn->lpfnHook,hwnd,wMsg,wParam,(LPARAM)&ofnw
- );
- }
- else /* ! |OFN_UNICODE */
- {
- OPENFILENAMEA ofna;
-
- /* FIXME: probably needs more converted */
- ofna.lCustData = lpofn->lCustData;
- return (BOOL)CallWindowProcA(
- (WNDPROC)lpofn->lpfnHook,hwnd,wMsg,wParam,(LPARAM)&ofna
- );
- }
- }
- else /* ! needstruct */
- {
- HWINDOWPROC hWindowProc=NULL;
-
- if (WINPROC_SetProc(&hWindowProc, lpofn->lpfnHook, ProcType, WIN_PROC_WINDOW))
- {
- /* Call Window Procedure converting 16-Bit Type Parameters to 32-Bit Type Parameters */
- result = CallWindowProc16( (WNDPROC16)hWindowProc,
- hwnd, wMsg, wParam, lParam );
-
- result = LOWORD(result);
-
- WINPROC_FreeProc( hWindowProc, WIN_PROC_WINDOW );
- }
-
- return result;
-
- }
-}
-
-
-/***********************************************************************
- * FILEDLG_WMInitDialog [internal]
- */
-
-static LONG FILEDLG_WMInitDialog(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam)
-{
- int i, n;
- LPOPENFILENAME16 lpofn;
- char tmpstr[512];
- LPSTR pstr, old_pstr;
- SetWindowLongA(hWnd, DWL_USER, lParam);
- lpofn = (LPOPENFILENAME16)PTR_SEG_TO_LIN(lParam);
- if (lpofn->lpstrTitle) SetWindowText16( hWnd, lpofn->lpstrTitle );
- /* read custom filter information */
- if (lpofn->lpstrCustomFilter)
- {
- pstr = (LPSTR)PTR_SEG_TO_LIN(lpofn->lpstrCustomFilter);
- n = 0;
- TRACE(commdlg,"lpstrCustomFilter = %p\n", pstr);
- while(*pstr)
- {
- old_pstr = pstr;
- i = SendDlgItemMessage16(hWnd, cmb1, CB_ADDSTRING16, 0,
- (LPARAM)lpofn->lpstrCustomFilter + n );
- n += strlen(pstr) + 1;
- pstr += strlen(pstr) + 1;
- TRACE(commdlg,"add str='%s' "
- "associated to '%s'\n", old_pstr, pstr);
- SendDlgItemMessage16(hWnd, cmb1, CB_SETITEMDATA16, i, (LPARAM)pstr);
- n += strlen(pstr) + 1;
- pstr += strlen(pstr) + 1;
- }
- }
- /* read filter information */
- if (lpofn->lpstrFilter) {
- pstr = (LPSTR)PTR_SEG_TO_LIN(lpofn->lpstrFilter);
- n = 0;
- while(*pstr) {
- old_pstr = pstr;
- i = SendDlgItemMessage16(hWnd, cmb1, CB_ADDSTRING16, 0,
- (LPARAM)lpofn->lpstrFilter + n );
- n += strlen(pstr) + 1;
- pstr += strlen(pstr) + 1;
- TRACE(commdlg,"add str='%s' "
- "associated to '%s'\n", old_pstr, pstr);
- SendDlgItemMessage16(hWnd, cmb1, CB_SETITEMDATA16, i, (LPARAM)pstr);
- n += strlen(pstr) + 1;
- pstr += strlen(pstr) + 1;
- }
- }
- /* set default filter */
- if (lpofn->nFilterIndex == 0 && lpofn->lpstrCustomFilter == (SEGPTR)NULL)
- lpofn->nFilterIndex = 1;
- SendDlgItemMessage16(hWnd, cmb1, CB_SETCURSEL16, lpofn->nFilterIndex - 1, 0);
- strncpy(tmpstr, FILEDLG_GetFileType(PTR_SEG_TO_LIN(lpofn->lpstrCustomFilter),
- PTR_SEG_TO_LIN(lpofn->lpstrFilter), lpofn->nFilterIndex - 1),511);
- tmpstr[511]=0;
- TRACE(commdlg,"nFilterIndex = %ld, SetText of edt1 to '%s'\n",
- lpofn->nFilterIndex, tmpstr);
- SetDlgItemTextA( hWnd, edt1, tmpstr );
- /* get drive list */
- *tmpstr = 0;
- DlgDirListComboBoxA(hWnd, tmpstr, cmb2, 0, 0xC000);
- /* read initial directory */
- if (PTR_SEG_TO_LIN(lpofn->lpstrInitialDir) != NULL)
- {
- strncpy(tmpstr, PTR_SEG_TO_LIN(lpofn->lpstrInitialDir), 510);
- tmpstr[510]=0;
- if (strlen(tmpstr) > 0 && tmpstr[strlen(tmpstr)-1] != '\\'
- && tmpstr[strlen(tmpstr)-1] != ':')
- strcat(tmpstr,"\\");
- }
- else
- *tmpstr = 0;
- if (!FILEDLG_ScanDir(hWnd, tmpstr)) {
- *tmpstr = 0;
- if (!FILEDLG_ScanDir(hWnd, tmpstr))
- WARN(commdlg, "Couldn't read initial directory %s!\n",tmpstr);
- }
- /* select current drive in combo 2, omit missing drives */
- for(i=0, n=-1; i<=DRIVE_GetCurrentDrive(); i++)
- if (DRIVE_IsValid(i)) n++;
- SendDlgItemMessage16(hWnd, cmb2, CB_SETCURSEL16, n, 0);
- if (!(lpofn->Flags & OFN_SHOWHELP))
- ShowWindow(GetDlgItem(hWnd, pshHelp), SW_HIDE);
- if (lpofn->Flags & OFN_HIDEREADONLY)
- ShowWindow(GetDlgItem(hWnd, chx1), SW_HIDE);
- if (FILEDLG_HookCallChk(lpofn))
- return (BOOL16)FILEDLG_CallWindowProc(lpofn,hWnd,WM_INITDIALOG,wParam,lParam );
- else
- return TRUE;
-}
-
-/***********************************************************************
- * FILEDLG_WMCommand [internal]
- */
-BOOL in_update=FALSE;
-
-static LRESULT FILEDLG_WMCommand(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam)
-{
- LONG lRet;
- LPOPENFILENAME16 lpofn;
- OPENFILENAME16 ofn2;
- char tmpstr[512], tmpstr2[512];
- LPSTR pstr, pstr2;
- UINT16 control,notification;
-
- /* Notifications are packaged differently in Win32 */
- control = wParam;
- notification = HIWORD(lParam);
-
- lpofn = (LPOPENFILENAME16)PTR_SEG_TO_LIN(GetWindowLongA(hWnd, DWL_USER));
- switch (control)
- {
- case lst1: /* file list */
- FILEDLG_StripEditControl(hWnd);
- if (notification == LBN_DBLCLK)
- goto almost_ok;
- lRet = SendDlgItemMessage16(hWnd, lst1, LB_GETCURSEL16, 0, 0);
- if (lRet == LB_ERR) return TRUE;
- if ((pstr = SEGPTR_ALLOC(512)))
- {
- SendDlgItemMessage16(hWnd, lst1, LB_GETTEXT16, lRet,
- (LPARAM)SEGPTR_GET(pstr));
- SetDlgItemTextA( hWnd, edt1, pstr );
- SEGPTR_FREE(pstr);
- }
- if (FILEDLG_HookCallChk(lpofn))
- FILEDLG_CallWindowProc(lpofn,hWnd,
- RegisterWindowMessageA( LBSELCHSTRING ),
- control, MAKELONG(lRet,CD_LBSELCHANGE));
- /* FIXME: for OFN_ALLOWMULTISELECT we need CD_LBSELSUB, CD_SELADD, CD_LBSELNOITEMS */
- return TRUE;
- case lst2: /* directory list */
- FILEDLG_StripEditControl(hWnd);
- if (notification == LBN_DBLCLK)
- {
- lRet = SendDlgItemMessage16(hWnd, lst2, LB_GETCURSEL16, 0, 0);
- if (lRet == LB_ERR) return TRUE;
- pstr = SEGPTR_ALLOC(512);
- SendDlgItemMessage16(hWnd, lst2, LB_GETTEXT16, lRet,
- (LPARAM)SEGPTR_GET(pstr));
- strcpy( tmpstr, pstr );
- SEGPTR_FREE(pstr);
- if (tmpstr[0] == '[')
- {
- tmpstr[strlen(tmpstr) - 1] = 0;
- strcpy(tmpstr,tmpstr+1);
- }
- strcat(tmpstr, "\\");
- goto reset_scan;
- }
- return TRUE;
- case cmb1: /* file type drop list */
- if (notification == CBN_SELCHANGE)
- {
- *tmpstr = 0;
- goto reset_scan;
- }
- return TRUE;
- case chx1:
- return TRUE;
- case pshHelp:
- return TRUE;
- case cmb2: /* disk drop list */
- FILEDLG_StripEditControl(hWnd);
- lRet = SendDlgItemMessage16(hWnd, cmb2, CB_GETCURSEL16, 0, 0L);
- if (lRet == LB_ERR) return 0;
- pstr = SEGPTR_ALLOC(512);
- SendDlgItemMessage16(hWnd, cmb2, CB_GETLBTEXT16, lRet,
- (LPARAM)SEGPTR_GET(pstr));
- sprintf(tmpstr, "%c:", pstr[2]);
- SEGPTR_FREE(pstr);
- reset_scan:
- lRet = SendDlgItemMessage16(hWnd, cmb1, CB_GETCURSEL16, 0, 0);
- if (lRet == LB_ERR)
- return TRUE;
- pstr = (LPSTR)SendDlgItemMessage16(hWnd, cmb1, CB_GETITEMDATA16, lRet, 0);
- TRACE(commdlg,"Selected filter : %s\n", pstr);
- SetDlgItemTextA( hWnd, edt1, pstr );
- FILEDLG_ScanDir(hWnd, tmpstr);
- in_update=TRUE;
- case IDOK:
- almost_ok:
- ofn2=*lpofn; /* for later restoring */
- GetDlgItemTextA( hWnd, edt1, tmpstr, sizeof(tmpstr) );
- pstr = strrchr(tmpstr, '\\');
- if (pstr == NULL)
- pstr = strrchr(tmpstr, ':');
- if (strchr(tmpstr,'*') != NULL || strchr(tmpstr,'?') != NULL)
- {
- /* edit control contains wildcards */
- if (pstr != NULL)
- {
- strncpy(tmpstr2, pstr+1, 511); tmpstr2[511]=0;
- *(pstr+1) = 0;
- }
- else
- {
- strcpy(tmpstr2, tmpstr);
- *tmpstr=0;
- }
- TRACE(commdlg,"tmpstr=%s, tmpstr2=%s\n", tmpstr, tmpstr2);
- SetDlgItemTextA( hWnd, edt1, tmpstr2 );
- FILEDLG_ScanDir(hWnd, tmpstr);
- return TRUE;
- }
- /* no wildcards, we might have a directory or a filename */
- /* try appending a wildcard and reading the directory */
- pstr2 = tmpstr + strlen(tmpstr);
- if (pstr == NULL || *(pstr+1) != 0)
- strcat(tmpstr, "\\");
- lRet = SendDlgItemMessage16(hWnd, cmb1, CB_GETCURSEL16, 0, 0);
- if (lRet == LB_ERR) return TRUE;
- lpofn->nFilterIndex = lRet + 1;
- TRACE(commdlg,"lpofn->nFilterIndex=%ld\n", lpofn->nFilterIndex);
- lstrcpynA(tmpstr2,
- FILEDLG_GetFileType(PTR_SEG_TO_LIN(lpofn->lpstrCustomFilter),
- PTR_SEG_TO_LIN(lpofn->lpstrFilter),
- lRet), sizeof(tmpstr2));
- SetDlgItemTextA( hWnd, edt1, tmpstr2 );
- if (!in_update)
- /* if ScanDir succeeds, we have changed the directory */
- if (FILEDLG_ScanDir(hWnd, tmpstr)) return TRUE;
- /* if not, this must be a filename */
- *pstr2 = 0;
- if (pstr != NULL)
- {
- /* strip off the pathname */
- *pstr = 0;
- SetDlgItemTextA( hWnd, edt1, pstr + 1 );
- lstrcpynA(tmpstr2, pstr+1, sizeof(tmpstr2) );
- /* Should we MessageBox() if this fails? */
- if (!FILEDLG_ScanDir(hWnd, tmpstr)) return TRUE;
- strcpy(tmpstr, tmpstr2);
- }
- else SetDlgItemTextA( hWnd, edt1, tmpstr );
-#if 0
- ShowWindow16(hWnd, SW_HIDE); /* this should not be necessary ?! (%%%) */
-#endif
- {
- int drive = DRIVE_GetCurrentDrive();
- tmpstr2[0] = 'A'+ drive;
- tmpstr2[1] = ':';
- tmpstr2[2] = '\\';
- strncpy(tmpstr2 + 3, DRIVE_GetDosCwd(drive), 507); tmpstr2[510]=0;
- if (strlen(tmpstr2) > 3)
- strcat(tmpstr2, "\\");
- strncat(tmpstr2, tmpstr, 511-strlen(tmpstr2)); tmpstr2[511]=0;
- if (lpofn->lpstrFile)
- lstrcpynA(PTR_SEG_TO_LIN(lpofn->lpstrFile), tmpstr2,lpofn->nMaxFile);
- }
- lpofn->nFileOffset = strrchr(tmpstr2,'\\') - tmpstr2 +1;
- lpofn->nFileExtension = 0;
- while(tmpstr2[lpofn->nFileExtension] != '.' && tmpstr2[lpofn->nFileExtension] != '\0')
- lpofn->nFileExtension++;
- if (tmpstr2[lpofn->nFileExtension] == '\0')
- lpofn->nFileExtension = 0;
- else
- lpofn->nFileExtension++;
-
- if(in_update)
- {
- if (FILEDLG_HookCallChk(lpofn))
- FILEDLG_CallWindowProc(lpofn,hWnd,
- RegisterWindowMessageA( LBSELCHSTRING ),
- control, MAKELONG(lRet,CD_LBSELCHANGE));
-
- in_update = FALSE;
- return TRUE;
- }
- if (PTR_SEG_TO_LIN(lpofn->lpstrFileTitle) != NULL)
- {
- lRet = SendDlgItemMessage16(hWnd, lst1, LB_GETCURSEL16, 0, 0);
- SendDlgItemMessage16(hWnd, lst1, LB_GETTEXT16, lRet,
- lpofn->lpstrFileTitle );
- }
- if (FILEDLG_HookCallChk(lpofn))
- {
- lRet= (BOOL16)FILEDLG_CallWindowProc(lpofn,
- hWnd, RegisterWindowMessageA( FILEOKSTRING ), 0, lParam );
- if (lRet)
- {
- *lpofn=ofn2; /* restore old state */
-#if 0
- ShowWindow16(hWnd, SW_SHOW); /* only if above (%%%) SW_HIDE used */
-#endif
- break;
- }
- }
- EndDialog(hWnd, TRUE);
- return TRUE;
- case IDCANCEL:
- EndDialog(hWnd, FALSE);
- return TRUE;
- }
- return FALSE;
-}
-
-
-/***********************************************************************
- * FileOpenDlgProc (COMMDLG.6)
- */
-LRESULT WINAPI FileOpenDlgProc16(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
- LPARAM lParam)
-{
- LPOPENFILENAME16 lpofn = (LPOPENFILENAME16)PTR_SEG_TO_LIN(GetWindowLongA(hWnd, DWL_USER));
-
- if (wMsg!=WM_INITDIALOG)
- if (FILEDLG_HookCallChk(lpofn))
- {
- LRESULT lRet=(BOOL16)FILEDLG_CallWindowProc(lpofn,hWnd,wMsg,wParam,lParam);
- if (lRet)
- return lRet; /* else continue message processing */
- }
- switch (wMsg)
- {
- case WM_INITDIALOG:
- return FILEDLG_WMInitDialog(hWnd, wParam, lParam);
- case WM_MEASUREITEM:
- return FILEDLG_WMMeasureItem(hWnd, wParam, lParam);
- case WM_DRAWITEM:
- return FILEDLG_WMDrawItem(hWnd, wParam, lParam, FALSE);
- case WM_COMMAND:
- return FILEDLG_WMCommand(hWnd, wParam, lParam);
-#if 0
- case WM_CTLCOLOR:
- SetBkColor((HDC16)wParam, 0x00C0C0C0);
- switch (HIWORD(lParam))
- {
- case CTLCOLOR_BTN:
- SetTextColor((HDC16)wParam, 0x00000000);
- return hGRAYBrush;
- case CTLCOLOR_STATIC:
- SetTextColor((HDC16)wParam, 0x00000000);
- return hGRAYBrush;
- }
- break;
-#endif
- }
- return FALSE;
-}
-
-
-/***********************************************************************
- * FileSaveDlgProc (COMMDLG.7)
- */
-LRESULT WINAPI FileSaveDlgProc16(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
- LPARAM lParam)
-{
- LPOPENFILENAME16 lpofn = (LPOPENFILENAME16)PTR_SEG_TO_LIN(GetWindowLongA(hWnd, DWL_USER));
-
- if (wMsg!=WM_INITDIALOG)
- if (FILEDLG_HookCallChk(lpofn))
- {
- LRESULT lRet=(BOOL16)FILEDLG_CallWindowProc(lpofn,hWnd,wMsg,wParam,lParam);
- if (lRet)
- return lRet; /* else continue message processing */
- }
- switch (wMsg) {
- case WM_INITDIALOG:
- return FILEDLG_WMInitDialog(hWnd, wParam, lParam);
-
- case WM_MEASUREITEM:
- return FILEDLG_WMMeasureItem(hWnd, wParam, lParam);
-
- case WM_DRAWITEM:
- return FILEDLG_WMDrawItem(hWnd, wParam, lParam, TRUE);
-
- case WM_COMMAND:
- return FILEDLG_WMCommand(hWnd, wParam, lParam);
- }
-
- /*
- case WM_CTLCOLOR:
- SetBkColor((HDC16)wParam, 0x00C0C0C0);
- switch (HIWORD(lParam))
- {
- case CTLCOLOR_BTN:
- SetTextColor((HDC16)wParam, 0x00000000);
- return hGRAYBrush;
- case CTLCOLOR_STATIC:
- SetTextColor((HDC16)wParam, 0x00000000);
- return hGRAYBrush;
- }
- return FALSE;
-
- */
- return FALSE;
-}
-
-
-/***********************************************************************
- * FindText16 (COMMDLG.11)
- */
-HWND16 WINAPI FindText16( SEGPTR find )
-{
- HANDLE16 hInst;
- LPCVOID ptr;
- LPFINDREPLACE16 lpFind = (LPFINDREPLACE16)PTR_SEG_TO_LIN(find);
-
- /*
- * FIXME : Should respond to FR_ENABLETEMPLATE and FR_ENABLEHOOK here
- * For now, only the standard dialog works.
- */
- if (lpFind->Flags & (FR_ENABLETEMPLATE | FR_ENABLETEMPLATEHANDLE |
- FR_ENABLEHOOK)) FIXME(commdlg, ": unimplemented flag (ignored)\n");
- ptr = SYSRES_GetResPtr( SYSRES_DIALOG_FIND_TEXT );
- hInst = WIN_GetWindowInstance( lpFind->hwndOwner );
- return DIALOG_CreateIndirect( hInst, ptr, TRUE, lpFind->hwndOwner,
- (DLGPROC16)MODULE_GetWndProcEntry16("FindTextDlgProc"),
- find, WIN_PROC_16 );
-}
-
-/***********************************************************************
- * FindText32A (COMMDLG.6)
- */
-HWND WINAPI FindTextA( LPFINDREPLACEA lpFind )
-{
- HANDLE16 hInst;
- LPCVOID ptr;
-
- /*
- * FIXME : Should respond to FR_ENABLETEMPLATE and FR_ENABLEHOOK here
- * For now, only the standard dialog works.
- */
- if (lpFind->Flags & (FR_ENABLETEMPLATE | FR_ENABLETEMPLATEHANDLE |
- FR_ENABLEHOOK)) FIXME(commdlg, ": unimplemented flag (ignored)\n");
- ptr = SYSRES_GetResPtr( SYSRES_DIALOG_FIND_TEXT );
- hInst = WIN_GetWindowInstance( lpFind->hwndOwner );
- return DIALOG_CreateIndirect( hInst, ptr, TRUE, lpFind->hwndOwner,
- (DLGPROC16)FindTextDlgProcA, (LPARAM)lpFind, WIN_PROC_32A );
-}
-
-/***********************************************************************
- * FindText32W (COMMDLG.7)
- */
-HWND WINAPI FindTextW( LPFINDREPLACEW lpFind )
-{
- HANDLE16 hInst;
- LPCVOID ptr;
-
- /*
- * FIXME : Should respond to FR_ENABLETEMPLATE and FR_ENABLEHOOK here
- * For now, only the standard dialog works.
- */
- if (lpFind->Flags & (FR_ENABLETEMPLATE | FR_ENABLETEMPLATEHANDLE |
- FR_ENABLEHOOK)) FIXME(commdlg, ": unimplemented flag (ignored)\n");
- ptr = SYSRES_GetResPtr( SYSRES_DIALOG_FIND_TEXT );
- hInst = WIN_GetWindowInstance( lpFind->hwndOwner );
- return DIALOG_CreateIndirect( hInst, ptr, TRUE, lpFind->hwndOwner,
- (DLGPROC16)FindTextDlgProcW, (LPARAM)lpFind, WIN_PROC_32W );
-}
-
-/***********************************************************************
- * ReplaceText16 (COMMDLG.12)
- */
-HWND16 WINAPI ReplaceText16( SEGPTR find )
-{
- HANDLE16 hInst;
- LPCVOID ptr;
- LPFINDREPLACE16 lpFind = (LPFINDREPLACE16)PTR_SEG_TO_LIN(find);
-
- /*
- * FIXME : We should do error checking on the lpFind structure here
- * and make CommDlgExtendedError() return the error condition.
- */
- if (lpFind->Flags & (FR_ENABLETEMPLATE | FR_ENABLETEMPLATEHANDLE |
- FR_ENABLEHOOK)) FIXME(commdlg, ": unimplemented flag (ignored)\n");
- ptr = SYSRES_GetResPtr( SYSRES_DIALOG_REPLACE_TEXT );
- hInst = WIN_GetWindowInstance( lpFind->hwndOwner );
- return DIALOG_CreateIndirect( hInst, ptr, TRUE, lpFind->hwndOwner,
- (DLGPROC16)MODULE_GetWndProcEntry16("ReplaceTextDlgProc"),
- find, WIN_PROC_16 );
-}
-
-/***********************************************************************
- * ReplaceText32A (COMDLG32.19)
- */
-HWND WINAPI ReplaceTextA( LPFINDREPLACEA lpFind )
-{
- HANDLE16 hInst;
- LPCVOID ptr;
-
- /*
- * FIXME : Should respond to FR_ENABLETEMPLATE and FR_ENABLEHOOK here
- * For now, only the standard dialog works.
- */
- if (lpFind->Flags & (FR_ENABLETEMPLATE | FR_ENABLETEMPLATEHANDLE |
- FR_ENABLEHOOK)) FIXME(commdlg, ": unimplemented flag (ignored)\n");
- ptr = SYSRES_GetResPtr( SYSRES_DIALOG_REPLACE_TEXT );
- hInst = WIN_GetWindowInstance( lpFind->hwndOwner );
- return DIALOG_CreateIndirect( hInst, ptr, TRUE, lpFind->hwndOwner,
- (DLGPROC16)ReplaceTextDlgProcA, (LPARAM)lpFind, WIN_PROC_32A );
-}
-
-/***********************************************************************
- * ReplaceText32W (COMDLG32.20)
- */
-HWND WINAPI ReplaceTextW( LPFINDREPLACEW lpFind )
-{
- HANDLE16 hInst;
- LPCVOID ptr;
-
- /*
- * FIXME : We should do error checking on the lpFind structure here
- * and make CommDlgExtendedError() return the error condition.
- */
- if (lpFind->Flags & (FR_ENABLETEMPLATE | FR_ENABLETEMPLATEHANDLE |
- FR_ENABLEHOOK)) FIXME(commdlg, ": unimplemented flag (ignored)\n");
- ptr = SYSRES_GetResPtr( SYSRES_DIALOG_REPLACE_TEXT );
- hInst = WIN_GetWindowInstance( lpFind->hwndOwner );
- return DIALOG_CreateIndirect( hInst, ptr, TRUE, lpFind->hwndOwner,
- (DLGPROC16)ReplaceTextDlgProcW, (LPARAM)lpFind, WIN_PROC_32W );
-}
-
-
-/***********************************************************************
- * FINDDLG_WMInitDialog [internal]
- */
-static LRESULT FINDDLG_WMInitDialog(HWND hWnd, LPARAM lParam, LPDWORD lpFlags,
- LPSTR lpstrFindWhat, BOOL fUnicode)
-{
- SetWindowLongA(hWnd, DWL_USER, lParam);
- *lpFlags &= ~(FR_FINDNEXT | FR_REPLACE | FR_REPLACEALL | FR_DIALOGTERM);
- /*
- * FIXME : If the initial FindWhat string is empty, we should disable the
- * FindNext (IDOK) button. Only after typing some text, the button should be
- * enabled.
- */
- if (fUnicode) SetDlgItemTextW(hWnd, edt1, (LPWSTR)lpstrFindWhat);
- else SetDlgItemTextA(hWnd, edt1, lpstrFindWhat);
- CheckRadioButton(hWnd, rad1, rad2, (*lpFlags & FR_DOWN) ? rad2 : rad1);
- if (*lpFlags & (FR_HIDEUPDOWN | FR_NOUPDOWN)) {
- EnableWindow(GetDlgItem(hWnd, rad1), FALSE);
- EnableWindow(GetDlgItem(hWnd, rad2), FALSE);
- }
- if (*lpFlags & FR_HIDEUPDOWN) {
- ShowWindow(GetDlgItem(hWnd, rad1), SW_HIDE);
- ShowWindow(GetDlgItem(hWnd, rad2), SW_HIDE);
- ShowWindow(GetDlgItem(hWnd, grp1), SW_HIDE);
- }
- CheckDlgButton(hWnd, chx1, (*lpFlags & FR_WHOLEWORD) ? 1 : 0);
- if (*lpFlags & (FR_HIDEWHOLEWORD | FR_NOWHOLEWORD))
- EnableWindow(GetDlgItem(hWnd, chx1), FALSE);
- if (*lpFlags & FR_HIDEWHOLEWORD)
- ShowWindow(GetDlgItem(hWnd, chx1), SW_HIDE);
- CheckDlgButton(hWnd, chx2, (*lpFlags & FR_MATCHCASE) ? 1 : 0);
- if (*lpFlags & (FR_HIDEMATCHCASE | FR_NOMATCHCASE))
- EnableWindow(GetDlgItem(hWnd, chx2), FALSE);
- if (*lpFlags & FR_HIDEMATCHCASE)
- ShowWindow(GetDlgItem(hWnd, chx2), SW_HIDE);
- if (!(*lpFlags & FR_SHOWHELP)) {
- EnableWindow(GetDlgItem(hWnd, pshHelp), FALSE);
- ShowWindow(GetDlgItem(hWnd, pshHelp), SW_HIDE);
- }
- ShowWindow(hWnd, SW_SHOWNORMAL);
- return TRUE;
-}
-
-
-/***********************************************************************
- * FINDDLG_WMCommand [internal]
- */
-static LRESULT FINDDLG_WMCommand(HWND hWnd, WPARAM wParam,
- HWND hwndOwner, LPDWORD lpFlags,
- LPSTR lpstrFindWhat, WORD wFindWhatLen,
- BOOL fUnicode)
-{
- int uFindReplaceMessage = RegisterWindowMessageA( FINDMSGSTRING );
- int uHelpMessage = RegisterWindowMessageA( HELPMSGSTRING );
-
- switch (wParam) {
- case IDOK:
- if (fUnicode)
- GetDlgItemTextW(hWnd, edt1, (LPWSTR)lpstrFindWhat, wFindWhatLen/2);
- else GetDlgItemTextA(hWnd, edt1, lpstrFindWhat, wFindWhatLen);
- if (IsDlgButtonChecked(hWnd, rad2))
- *lpFlags |= FR_DOWN;
- else *lpFlags &= ~FR_DOWN;
- if (IsDlgButtonChecked(hWnd, chx1))
- *lpFlags |= FR_WHOLEWORD;
- else *lpFlags &= ~FR_WHOLEWORD;
- if (IsDlgButtonChecked(hWnd, chx2))
- *lpFlags |= FR_MATCHCASE;
- else *lpFlags &= ~FR_MATCHCASE;
- *lpFlags &= ~(FR_REPLACE | FR_REPLACEALL | FR_DIALOGTERM);
- *lpFlags |= FR_FINDNEXT;
- SendMessageA(hwndOwner, uFindReplaceMessage, 0,
- GetWindowLongA(hWnd, DWL_USER) );
- return TRUE;
- case IDCANCEL:
- *lpFlags &= ~(FR_FINDNEXT | FR_REPLACE | FR_REPLACEALL);
- *lpFlags |= FR_DIALOGTERM;
- SendMessageA(hwndOwner, uFindReplaceMessage, 0,
- GetWindowLongA(hWnd, DWL_USER) );
- DestroyWindow(hWnd);
- return TRUE;
- case pshHelp:
- /* FIXME : should lpfr structure be passed as an argument ??? */
- SendMessageA(hwndOwner, uHelpMessage, 0, 0);
- return TRUE;
- }
- return FALSE;
-}
-
-
-/***********************************************************************
- * FindTextDlgProc16 (COMMDLG.13)
- */
-LRESULT WINAPI FindTextDlgProc16(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
- LPARAM lParam)
-{
- LPFINDREPLACE16 lpfr;
- switch (wMsg) {
- case WM_INITDIALOG:
- lpfr=(LPFINDREPLACE16)PTR_SEG_TO_LIN(lParam);
- return FINDDLG_WMInitDialog(hWnd, lParam, &(lpfr->Flags),
- PTR_SEG_TO_LIN(lpfr->lpstrFindWhat), FALSE);
- case WM_COMMAND:
- lpfr=(LPFINDREPLACE16)PTR_SEG_TO_LIN(GetWindowLongA(hWnd, DWL_USER));
- return FINDDLG_WMCommand(hWnd, wParam, lpfr->hwndOwner,
- &lpfr->Flags, PTR_SEG_TO_LIN(lpfr->lpstrFindWhat),
- lpfr->wFindWhatLen, FALSE);
- }
- return FALSE;
-}
-
-/***********************************************************************
- * FindTextDlgProc32A
- */
-LRESULT WINAPI FindTextDlgProcA(HWND hWnd, UINT wMsg, WPARAM wParam,
- LPARAM lParam)
-{
- LPFINDREPLACEA lpfr;
- switch (wMsg) {
- case WM_INITDIALOG:
- lpfr=(LPFINDREPLACEA)lParam;
- return FINDDLG_WMInitDialog(hWnd, lParam, &(lpfr->Flags),
- lpfr->lpstrFindWhat, FALSE);
- case WM_COMMAND:
- lpfr=(LPFINDREPLACEA)GetWindowLongA(hWnd, DWL_USER);
- return FINDDLG_WMCommand(hWnd, wParam, lpfr->hwndOwner,
- &lpfr->Flags, lpfr->lpstrFindWhat, lpfr->wFindWhatLen,
- FALSE);
- }
- return FALSE;
-}
-
-/***********************************************************************
- * FindTextDlgProc32W
- */
-LRESULT WINAPI FindTextDlgProcW(HWND hWnd, UINT wMsg, WPARAM wParam,
- LPARAM lParam)
-{
- LPFINDREPLACEW lpfr;
- switch (wMsg) {
- case WM_INITDIALOG:
- lpfr=(LPFINDREPLACEW)lParam;
- return FINDDLG_WMInitDialog(hWnd, lParam, &(lpfr->Flags),
- (LPSTR)lpfr->lpstrFindWhat, TRUE);
- case WM_COMMAND:
- lpfr=(LPFINDREPLACEW)GetWindowLongA(hWnd, DWL_USER);
- return FINDDLG_WMCommand(hWnd, wParam, lpfr->hwndOwner,
- &lpfr->Flags, (LPSTR)lpfr->lpstrFindWhat, lpfr->wFindWhatLen,
- TRUE);
- }
- return FALSE;
-}
-
-
-/***********************************************************************
- * REPLACEDLG_WMInitDialog [internal]
- */
-static LRESULT REPLACEDLG_WMInitDialog(HWND hWnd, LPARAM lParam,
- LPDWORD lpFlags, LPSTR lpstrFindWhat,
- LPSTR lpstrReplaceWith, BOOL fUnicode)
-{
- SetWindowLongA(hWnd, DWL_USER, lParam);
- *lpFlags &= ~(FR_FINDNEXT | FR_REPLACE | FR_REPLACEALL | FR_DIALOGTERM);
- /*
- * FIXME : If the initial FindWhat string is empty, we should disable the FinNext /
- * Replace / ReplaceAll buttons. Only after typing some text, the buttons should be
- * enabled.
- */
- if (fUnicode)
- {
- SetDlgItemTextW(hWnd, edt1, (LPWSTR)lpstrFindWhat);
- SetDlgItemTextW(hWnd, edt2, (LPWSTR)lpstrReplaceWith);
- } else
- {
- SetDlgItemTextA(hWnd, edt1, lpstrFindWhat);
- SetDlgItemTextA(hWnd, edt2, lpstrReplaceWith);
- }
- CheckDlgButton(hWnd, chx1, (*lpFlags & FR_WHOLEWORD) ? 1 : 0);
- if (*lpFlags & (FR_HIDEWHOLEWORD | FR_NOWHOLEWORD))
- EnableWindow(GetDlgItem(hWnd, chx1), FALSE);
- if (*lpFlags & FR_HIDEWHOLEWORD)
- ShowWindow(GetDlgItem(hWnd, chx1), SW_HIDE);
- CheckDlgButton(hWnd, chx2, (*lpFlags & FR_MATCHCASE) ? 1 : 0);
- if (*lpFlags & (FR_HIDEMATCHCASE | FR_NOMATCHCASE))
- EnableWindow(GetDlgItem(hWnd, chx2), FALSE);
- if (*lpFlags & FR_HIDEMATCHCASE)
- ShowWindow(GetDlgItem(hWnd, chx2), SW_HIDE);
- if (!(*lpFlags & FR_SHOWHELP)) {
- EnableWindow(GetDlgItem(hWnd, pshHelp), FALSE);
- ShowWindow(GetDlgItem(hWnd, pshHelp), SW_HIDE);
- }
- ShowWindow(hWnd, SW_SHOWNORMAL);
- return TRUE;
-}
-
-
-/***********************************************************************
- * REPLACEDLG_WMCommand [internal]
- */
-static LRESULT REPLACEDLG_WMCommand(HWND hWnd, WPARAM16 wParam,
- HWND hwndOwner, LPDWORD lpFlags,
- LPSTR lpstrFindWhat, WORD wFindWhatLen,
- LPSTR lpstrReplaceWith, WORD wReplaceWithLen,
- BOOL fUnicode)
-{
- int uFindReplaceMessage = RegisterWindowMessageA( FINDMSGSTRING );
- int uHelpMessage = RegisterWindowMessageA( HELPMSGSTRING );
-
- switch (wParam) {
- case IDOK:
- if (fUnicode)
- {
- GetDlgItemTextW(hWnd, edt1, (LPWSTR)lpstrFindWhat, wFindWhatLen/2);
- GetDlgItemTextW(hWnd, edt2, (LPWSTR)lpstrReplaceWith, wReplaceWithLen/2);
- } else
- {
- GetDlgItemTextA(hWnd, edt1, lpstrFindWhat, wFindWhatLen);
- GetDlgItemTextA(hWnd, edt2, lpstrReplaceWith, wReplaceWithLen);
- }
- if (IsDlgButtonChecked(hWnd, chx1))
- *lpFlags |= FR_WHOLEWORD;
- else *lpFlags &= ~FR_WHOLEWORD;
- if (IsDlgButtonChecked(hWnd, chx2))
- *lpFlags |= FR_MATCHCASE;
- else *lpFlags &= ~FR_MATCHCASE;
- *lpFlags &= ~(FR_REPLACE | FR_REPLACEALL | FR_DIALOGTERM);
- *lpFlags |= FR_FINDNEXT;
- SendMessageA(hwndOwner, uFindReplaceMessage, 0,
- GetWindowLongA(hWnd, DWL_USER) );
- return TRUE;
- case IDCANCEL:
- *lpFlags &= ~(FR_FINDNEXT | FR_REPLACE | FR_REPLACEALL);
- *lpFlags |= FR_DIALOGTERM;
- SendMessageA(hwndOwner, uFindReplaceMessage, 0,
- GetWindowLongA(hWnd, DWL_USER) );
- DestroyWindow(hWnd);
- return TRUE;
- case psh1:
- if (fUnicode)
- {
- GetDlgItemTextW(hWnd, edt1, (LPWSTR)lpstrFindWhat, wFindWhatLen/2);
- GetDlgItemTextW(hWnd, edt2, (LPWSTR)lpstrReplaceWith, wReplaceWithLen/2);
- } else
- {
- GetDlgItemTextA(hWnd, edt1, lpstrFindWhat, wFindWhatLen);
- GetDlgItemTextA(hWnd, edt2, lpstrReplaceWith, wReplaceWithLen);
- }
- if (IsDlgButtonChecked(hWnd, chx1))
- *lpFlags |= FR_WHOLEWORD;
- else *lpFlags &= ~FR_WHOLEWORD;
- if (IsDlgButtonChecked(hWnd, chx2))
- *lpFlags |= FR_MATCHCASE;
- else *lpFlags &= ~FR_MATCHCASE;
- *lpFlags &= ~(FR_FINDNEXT | FR_REPLACEALL | FR_DIALOGTERM);
- *lpFlags |= FR_REPLACE;
- SendMessageA(hwndOwner, uFindReplaceMessage, 0,
- GetWindowLongA(hWnd, DWL_USER) );
- return TRUE;
- case psh2:
- if (fUnicode)
- {
- GetDlgItemTextW(hWnd, edt1, (LPWSTR)lpstrFindWhat, wFindWhatLen/2);
- GetDlgItemTextW(hWnd, edt2, (LPWSTR)lpstrReplaceWith, wReplaceWithLen/2);
- } else
- {
- GetDlgItemTextA(hWnd, edt1, lpstrFindWhat, wFindWhatLen);
- GetDlgItemTextA(hWnd, edt2, lpstrReplaceWith, wReplaceWithLen);
- }
- if (IsDlgButtonChecked(hWnd, chx1))
- *lpFlags |= FR_WHOLEWORD;
- else *lpFlags &= ~FR_WHOLEWORD;
- if (IsDlgButtonChecked(hWnd, chx2))
- *lpFlags |= FR_MATCHCASE;
- else *lpFlags &= ~FR_MATCHCASE;
- *lpFlags &= ~(FR_FINDNEXT | FR_REPLACE | FR_DIALOGTERM);
- *lpFlags |= FR_REPLACEALL;
- SendMessageA(hwndOwner, uFindReplaceMessage, 0,
- GetWindowLongA(hWnd, DWL_USER) );
- return TRUE;
- case pshHelp:
- /* FIXME : should lpfr structure be passed as an argument ??? */
- SendMessageA(hwndOwner, uHelpMessage, 0, 0);
- return TRUE;
- }
- return FALSE;
-}
-
-
-/***********************************************************************
- * ReplaceTextDlgProc16 (COMMDLG.14)
- */
-LRESULT WINAPI ReplaceTextDlgProc16(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
- LPARAM lParam)
-{
- LPFINDREPLACE16 lpfr;
- switch (wMsg) {
- case WM_INITDIALOG:
- lpfr=(LPFINDREPLACE16)PTR_SEG_TO_LIN(lParam);
- return REPLACEDLG_WMInitDialog(hWnd, lParam, &lpfr->Flags,
- PTR_SEG_TO_LIN(lpfr->lpstrFindWhat),
- PTR_SEG_TO_LIN(lpfr->lpstrReplaceWith), FALSE);
- case WM_COMMAND:
- lpfr=(LPFINDREPLACE16)PTR_SEG_TO_LIN(GetWindowLongA(hWnd, DWL_USER));
- return REPLACEDLG_WMCommand(hWnd, wParam, lpfr->hwndOwner,
- &lpfr->Flags, PTR_SEG_TO_LIN(lpfr->lpstrFindWhat),
- lpfr->wFindWhatLen, PTR_SEG_TO_LIN(lpfr->lpstrReplaceWith),
- lpfr->wReplaceWithLen, FALSE);
- }
- return FALSE;
-}
-
-/***********************************************************************
- * ReplaceTextDlgProc32A
- */
-LRESULT WINAPI ReplaceTextDlgProcA(HWND hWnd, UINT wMsg, WPARAM wParam,
- LPARAM lParam)
-{
- LPFINDREPLACEA lpfr;
- switch (wMsg) {
- case WM_INITDIALOG:
- lpfr=(LPFINDREPLACEA)lParam;
- return REPLACEDLG_WMInitDialog(hWnd, lParam, &lpfr->Flags,
- lpfr->lpstrFindWhat, lpfr->lpstrReplaceWith, FALSE);
- case WM_COMMAND:
- lpfr=(LPFINDREPLACEA)GetWindowLongA(hWnd, DWL_USER);
- return REPLACEDLG_WMCommand(hWnd, wParam, lpfr->hwndOwner,
- &lpfr->Flags, lpfr->lpstrFindWhat, lpfr->wFindWhatLen,
- lpfr->lpstrReplaceWith, lpfr->wReplaceWithLen, FALSE);
- }
- return FALSE;
-}
-
-/***********************************************************************
- * ReplaceTextDlgProc32W
- */
-LRESULT WINAPI ReplaceTextDlgProcW(HWND hWnd, UINT wMsg, WPARAM wParam,
- LPARAM lParam)
-{
- LPFINDREPLACEW lpfr;
- switch (wMsg) {
- case WM_INITDIALOG:
- lpfr=(LPFINDREPLACEW)lParam;
- return REPLACEDLG_WMInitDialog(hWnd, lParam, &lpfr->Flags,
- (LPSTR)lpfr->lpstrFindWhat, (LPSTR)lpfr->lpstrReplaceWith,
- TRUE);
- case WM_COMMAND:
- lpfr=(LPFINDREPLACEW)GetWindowLongA(hWnd, DWL_USER);
- return REPLACEDLG_WMCommand(hWnd, wParam, lpfr->hwndOwner,
- &lpfr->Flags, (LPSTR)lpfr->lpstrFindWhat, lpfr->wFindWhatLen,
- (LPSTR)lpfr->lpstrReplaceWith, lpfr->wReplaceWithLen, TRUE);
- }
- return FALSE;
-}
-
-
-
-/***********************************************************************
- * PrintDlg16 (COMMDLG.20)
- */
-BOOL16 WINAPI PrintDlg16( SEGPTR printdlg )
-{
- HANDLE16 hInst;
- BOOL16 bRet = FALSE;
- LPCVOID template;
- HWND hwndDialog;
- LPPRINTDLG16 lpPrint = (LPPRINTDLG16)PTR_SEG_TO_LIN(printdlg);
-
- TRACE(commdlg,"(%p) -- Flags=%08lX\n", lpPrint, lpPrint->Flags );
-
- if (lpPrint->Flags & PD_RETURNDEFAULT)
- /* FIXME: should fill lpPrint->hDevMode and lpPrint->hDevNames here */
- return TRUE;
-
- if (lpPrint->Flags & PD_PRINTSETUP)
- template = SYSRES_GetResPtr( SYSRES_DIALOG_PRINT_SETUP );
- else
- template = SYSRES_GetResPtr( SYSRES_DIALOG_PRINT );
-
- hInst = WIN_GetWindowInstance( lpPrint->hwndOwner );
- hwndDialog = DIALOG_CreateIndirect( hInst, template, TRUE,
- lpPrint->hwndOwner,
- (DLGPROC16)((lpPrint->Flags & PD_PRINTSETUP) ?
- MODULE_GetWndProcEntry16("PrintSetupDlgProc") :
- MODULE_GetWndProcEntry16("PrintDlgProc")),
- printdlg, WIN_PROC_16 );
- if (hwndDialog) bRet = DIALOG_DoDialogBox( hwndDialog, lpPrint->hwndOwner);
- return bRet;
-}
-
-
-
-/***********************************************************************
- * PrintDlgA (COMDLG32.17)
- *
- * Displays the the PRINT dialog box, which enables the user to specify
- * specific properties of the print job.
- *
- * (Note: according to the MS Platform SDK, this call was in the past
- * also used to display some PRINT SETUP dialog. As this is superseded
- * by PageSetupDlg, this now results in an error!)
- *
- * RETURNS
- * nonzero if the user pressed the OK button
- * zero if the user cancelled the window or an error occurred
- *
- * BUGS
- * The function is a stub only, returning TRUE to allow more programs
- * to function.
- */
-BOOL WINAPI PrintDlgA(
- LPPRINTDLGA lppd /* ptr to PRINTDLG32 struct */
- )
-{
-/* My implementing strategy:
- *
- * step 1: display the dialog and implement the layout-flags
- * step 2: enter valid information in the fields (e.g. real printers)
- * step 3: fix the RETURN-TRUE-ALWAYS Fixme by checking lppd->Flags for
- * PD_RETURNDEFAULT
- * step 4: implement all other specs
- * step 5: allow customisation of the dialog box
- *
- * current implementation is in step 1.
- */
-
- HWND hwndDialog;
- BOOL bRet = FALSE;
- LPCVOID ptr = SYSRES_GetResPtr( SYSRES_DIALOG_PRINT32 );
- HINSTANCE hInst = WIN_GetWindowInstance( lppd->hwndOwner );
-
- FIXME(commdlg, "KVG (%p): stub\n", lppd);
-
- /*
- * FIXME : Should respond to TEMPLATE and HOOK flags here
- * For now, only the standard dialog works.
- */
- if (lppd->Flags & (PD_ENABLEPRINTHOOK | PD_ENABLEPRINTTEMPLATE |
- PD_ENABLEPRINTTEMPLATEHANDLE | PD_ENABLESETUPHOOK |
- PD_ENABLESETUPTEMPLATE|PD_ENABLESETUPTEMPLATEHANDLE))
- FIXME(commdlg, ": unimplemented flag (ignored)\n");
-
- /*
- * if lppd->Flags PD_RETURNDEFAULT is specified, the PrintDlg function
- * does not display the dialog box, but returns with valid entries
- * for hDevMode and hDevNames .
- *
- * Currently the flag is recognised, but we return empty hDevMode and
- * and hDevNames. This will be fixed when I am in step 3.
- */
- if (lppd->Flags & PD_RETURNDEFAULT)
- {
- WARN(commdlg, ": PrintDlg was requested to return printer info only."
- "\n The return value currently does NOT provide these.\n");
- CommDlgLastError=PDERR_NODEVICES; /* return TRUE, thus never checked! */
- return(TRUE);
- }
-
- if (lppd->Flags & PD_PRINTSETUP)
- {
- FIXME(commdlg, ": PrintDlg was requested to display PrintSetup box.\n");
- CommDlgLastError=PDERR_INITFAILURE;
- return(FALSE);
- }
-
- hwndDialog= DIALOG_CreateIndirect(hInst, ptr, TRUE, lppd->hwndOwner,
- (DLGPROC16)PrintDlgProcA, (LPARAM)lppd, WIN_PROC_32A );
- if (hwndDialog)
- bRet = DIALOG_DoDialogBox(hwndDialog, lppd->hwndOwner);
- return bRet;
-}
-
-
-
-
-
-/***********************************************************************
- * PrintDlg32W (COMDLG32.18)
- */
-BOOL WINAPI PrintDlgW( LPPRINTDLGW printdlg )
-{
- FIXME(commdlg, "A really empty stub\n" );
- return FALSE;
-}
-
-
-
-/***********************************************************************
- * PRINTDLG_WMInitDialog [internal]
- */
-LRESULT PRINTDLG_WMInitDialog(HWND hDlg, WPARAM wParam, LPARAM lParam,
- LPPRINTDLGA lppd)
-{
- SetWindowLongA(hDlg, DWL_USER, lParam);
- TRACE(commdlg,"WM_INITDIALOG lParam=%08lX\n", lParam);
-
- if (lppd->lStructSize != sizeof(PRINTDLGA))
- {
- FIXME(commdlg,"structure size failure !!!\n");
-/* EndDialog (hDlg, 0);
- return FALSE;
-*/ }
-
-/* Flag processing to set the according buttons on/off and
- * Initialise the various values
- */
-
- /* Print range (All/Range/Selection) */
- if (lppd->nMinPage == lppd->nMaxPage)
- lppd->Flags &= ~PD_NOPAGENUMS;
- /* FIXME: I allow more freedom than either Win95 or WinNT,
- * as officially we should return error if
- * ToPage or FromPage is out-of-range
- */
- if (lppd->nToPage < lppd->nMinPage)
- lppd->nToPage = lppd->nMinPage;
- if (lppd->nToPage > lppd->nMaxPage)
- lppd->nToPage = lppd->nMaxPage;
- if (lppd->nFromPage < lppd->nMinPage)
- lppd->nFromPage = lppd->nMinPage;
- if (lppd->nFromPage > lppd->nMaxPage)
- lppd->nFromPage = lppd->nMaxPage;
- SetDlgItemInt(hDlg, edt2, lppd->nFromPage, FALSE);
- SetDlgItemInt(hDlg, edt3, lppd->nToPage, FALSE);
- CheckRadioButton(hDlg, rad1, rad3, rad1);
- if (lppd->Flags & PD_NOSELECTION)
- EnableWindow(GetDlgItem(hDlg, rad3), FALSE);
- else
- if (lppd->Flags & PD_SELECTION)
- CheckRadioButton(hDlg, rad1, rad3, rad3);
- if (lppd->Flags & PD_NOPAGENUMS)
- {
- EnableWindow(GetDlgItem(hDlg, rad2), FALSE);
- EnableWindow(GetDlgItem(hDlg, stc10),FALSE);
- EnableWindow(GetDlgItem(hDlg, edt2), FALSE);
- EnableWindow(GetDlgItem(hDlg, stc11),FALSE);
- EnableWindow(GetDlgItem(hDlg, edt3), FALSE);
- }
- else
- {
- if (lppd->Flags & PD_PAGENUMS)
- CheckRadioButton(hDlg, rad1, rad3, rad2);
- }
- /* FIXME: in Win95, the radiobutton "All" is displayed as
- * "Print all xxx pages"... This is not done here (yet?)
- */
-
- /* Collate pages */
- if (lppd->Flags & PD_COLLATE)
- FIXME(commdlg, "PD_COLLATE not implemented yet\n");
-
- /* print to file */
- CheckDlgButton(hDlg, chx1, (lppd->Flags & PD_PRINTTOFILE) ? 1 : 0);
- if (lppd->Flags & PD_DISABLEPRINTTOFILE)
- EnableWindow(GetDlgItem(hDlg, chx1), FALSE);
- if (lppd->Flags & PD_HIDEPRINTTOFILE)
- ShowWindow(GetDlgItem(hDlg, chx1), SW_HIDE);
-
- /* status */
-
-TRACE(commdlg, "succesful!\n");
- return TRUE;
-}
-
-
-/***********************************************************************
- * PRINTDLG_ValidateAndDuplicateSettings [internal]
- */
-BOOL PRINTDLG_ValidateAndDuplicateSettings(HWND hDlg, LPPRINTDLGA lppd)
-{
- WORD nToPage;
- WORD nFromPage;
- char TempBuffer[256];
-
- /* check whether nFromPage and nToPage are within range defined by
- * nMinPage and nMaxPage
- */
- /* FIXMNo checking on rad2 is performed now, because IsDlgButtonCheck
- * currently doesn't seem to know a state BST_CHECKED
- */
-/* if (IsDlgButtonChecked(hDlg, rad2) == BST_CHECKED) */
- {
- nFromPage = GetDlgItemInt(hDlg, edt2, NULL, FALSE);
- nToPage = GetDlgItemInt(hDlg, edt3, NULL, FALSE);
- if (nFromPage < lppd->nMinPage || nFromPage > lppd->nMaxPage ||
- nToPage < lppd->nMinPage || nToPage > lppd->nMaxPage)
- {
- FIXME(commdlg, "The MessageBox is not internationalised.");
- sprintf(TempBuffer, "This value lies not within Page range\n"
- "Please enter a value between %d and %d",
- lppd->nMinPage, lppd->nMaxPage);
- MessageBoxA(hDlg, TempBuffer, "Print", MB_OK | MB_ICONWARNING);
- return(FALSE);
- }
- lppd->nFromPage = nFromPage;
- lppd->nToPage = nToPage;
- }
-
- return(TRUE);
-}
-
-
-
-/***********************************************************************
- * PRINTDLG_WMCommand [internal]
- */
-static LRESULT PRINTDLG_WMCommand(HWND hDlg, WPARAM wParam,
- LPARAM lParam, LPPRINTDLGA lppd)
-{
- switch (wParam)
- {
- case IDOK:
- if (PRINTDLG_ValidateAndDuplicateSettings(hDlg, lppd) != TRUE)
- return(FALSE);
- MessageBoxA(hDlg, "OK was hit!", NULL, MB_OK);
- DestroyWindow(hDlg);
- return(TRUE);
- case IDCANCEL:
- MessageBoxA(hDlg, "CANCEL was hit!", NULL, MB_OK);
- EndDialog(hDlg, FALSE);
-/* DestroyWindow(hDlg); */
- return(FALSE);
- }
- return FALSE;
-}
-
-
-
-/***********************************************************************
- * PrintDlgProcA [internal]
- */
-LRESULT WINAPI PrintDlgProcA(HWND hDlg, UINT uMsg, WPARAM wParam,
- LPARAM lParam)
-{
- LPPRINTDLGA lppd;
- LRESULT res=FALSE;
- if (uMsg!=WM_INITDIALOG)
- {
- lppd=(LPPRINTDLGA)GetWindowLongA(hDlg, DWL_USER);
- if (!lppd)
- return FALSE;
-}
- else
- {
- lppd=(LPPRINTDLGA)lParam;
- if (!PRINTDLG_WMInitDialog(hDlg, wParam, lParam, lppd))
- {
- TRACE(commdlg, "PRINTDLG_WMInitDialog returned FALSE\n");
- return FALSE;
- }
- MessageBoxA(hDlg,"Warning: this dialog has no functionality yet!",
- NULL, MB_OK);
- }
- switch (uMsg)
- {
- case WM_COMMAND:
- return PRINTDLG_WMCommand(hDlg, wParam, lParam, lppd);
- case WM_DESTROY:
- return FALSE;
- }
-
- return res;
-}
-
-
-
-
-
-
-
-/***********************************************************************
- * PrintDlgProc16 (COMMDLG.21)
- */
-LRESULT WINAPI PrintDlgProc16(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
- LPARAM lParam)
-{
- switch (wMsg)
- {
- case WM_INITDIALOG:
- TRACE(commdlg,"WM_INITDIALOG lParam=%08lX\n", lParam);
- ShowWindow16(hWnd, SW_SHOWNORMAL);
- return (TRUE);
- case WM_COMMAND:
- switch (wParam)
- {
- case IDOK:
- EndDialog(hWnd, TRUE);
- return(TRUE);
- case IDCANCEL:
- EndDialog(hWnd, FALSE);
- return(TRUE);
- }
- return(FALSE);
- }
- return FALSE;
-}
-
-
-/***********************************************************************
- * PrintSetupDlgProc (COMMDLG.22)
- */
-LRESULT WINAPI PrintSetupDlgProc16(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
- LPARAM lParam)
-{
- switch (wMsg)
- {
- case WM_INITDIALOG:
- TRACE(commdlg,"WM_INITDIALOG lParam=%08lX\n", lParam);
- ShowWindow16(hWnd, SW_SHOWNORMAL);
- return (TRUE);
- case WM_COMMAND:
- switch (wParam) {
- case IDOK:
- EndDialog(hWnd, TRUE);
- return(TRUE);
- case IDCANCEL:
- EndDialog(hWnd, FALSE);
- return(TRUE);
- }
- return(FALSE);
- }
- return FALSE;
-}
-
-
-
-/***********************************************************************
- * CommDlgExtendedError (COMMDLG.26)
- */
-DWORD WINAPI CommDlgExtendedError(void)
-{
- return CommDlgLastError;
-}
-
-/***********************************************************************
- * GetFileTitleA (COMDLG32.8)
- */
-short WINAPI GetFileTitleA(LPCSTR lpFile, LPSTR lpTitle, UINT cbBuf)
-{
- int i, len;
- TRACE(commdlg,"(%p %p %d); \n", lpFile, lpTitle, cbBuf);
- if (lpFile == NULL || lpTitle == NULL)
- return -1;
- len = strlen(lpFile);
- if (len == 0)
- return -1;
- if (strpbrk(lpFile, "*[]"))
- return -1;
- len--;
- if (lpFile[len] == '/' || lpFile[len] == '\\' || lpFile[len] == ':')
- return -1;
- for (i = len; i >= 0; i--)
- if (lpFile[i] == '/' || lpFile[i] == '\\' || lpFile[i] == ':')
- {
- i++;
- break;
- }
- if (i == -1)
- i++;
- TRACE(commdlg,"---> '%s' \n", &lpFile[i]);
-
- len = strlen(lpFile+i)+1;
- if (cbBuf < len)
- return len;
-
- strncpy(lpTitle, &lpFile[i], len);
- return 0;
-}
-
-
-/***********************************************************************
- * GetFileTitleA (COMDLG32.8)
- */
-short WINAPI GetFileTitleW(LPCWSTR lpFile, LPWSTR lpTitle, UINT cbBuf)
-{
- LPSTR file = HEAP_strdupWtoA(GetProcessHeap(),0,lpFile);
- LPSTR title = HeapAlloc(GetProcessHeap(),0,cbBuf);
- short ret;
-
- ret = GetFileTitleA(file,title,cbBuf);
-
- lstrcpynAtoW(lpTitle,title,cbBuf);
- HeapFree(GetProcessHeap(),0,file);
- HeapFree(GetProcessHeap(),0,title);
- return ret;
-}
-/***********************************************************************
- * GetFileTitle (COMMDLG.27)
- */
-short WINAPI GetFileTitle16(LPCSTR lpFile, LPSTR lpTitle, UINT16 cbBuf)
-{
- return GetFileTitleA(lpFile,lpTitle,cbBuf);
-}
-
-
-/* ------------------------ Choose Color Dialog --------------------------- */
-
-/***********************************************************************
- * ChooseColor (COMMDLG.5)
- */
-BOOL16 WINAPI ChooseColor16(LPCHOOSECOLOR16 lpChCol)
-{
- HINSTANCE16 hInst;
- HANDLE16 hDlgTmpl = 0;
- BOOL16 bRet = FALSE, win32Format = FALSE;
- LPCVOID template;
- HWND hwndDialog;
-
- TRACE(commdlg,"ChooseColor\n");
- if (!lpChCol) return FALSE;
-
- if (lpChCol->Flags & CC_ENABLETEMPLATEHANDLE)
- {
- if (!(template = LockResource16( lpChCol->hInstance )))
- {
- CommDlgLastError = CDERR_LOADRESFAILURE;
- return FALSE;
- }
- }
- else if (lpChCol->Flags & CC_ENABLETEMPLATE)
- {
- HANDLE16 hResInfo;
- if (!(hResInfo = FindResource16(lpChCol->hInstance,
- lpChCol->lpTemplateName,
- RT_DIALOG16)))
- {
- CommDlgLastError = CDERR_FINDRESFAILURE;
- return FALSE;
- }
- if (!(hDlgTmpl = LoadResource16( lpChCol->hInstance, hResInfo )) ||
- !(template = LockResource16( hDlgTmpl )))
- {
- CommDlgLastError = CDERR_LOADRESFAILURE;
- return FALSE;
- }
- }
- else
- {
- template = SYSRES_GetResPtr( SYSRES_DIALOG_CHOOSE_COLOR );
- win32Format = TRUE;
- }
-
- hInst = WIN_GetWindowInstance( lpChCol->hwndOwner );
- hwndDialog = DIALOG_CreateIndirect( hInst, template, win32Format,
- lpChCol->hwndOwner,
- (DLGPROC16)MODULE_GetWndProcEntry16("ColorDlgProc"),
- (DWORD)lpChCol, WIN_PROC_16 );
- if (hwndDialog) bRet = DIALOG_DoDialogBox( hwndDialog, lpChCol->hwndOwner);
- if (hDlgTmpl) FreeResource16( hDlgTmpl );
-
- return bRet;
-}
-
-
-static const COLORREF predefcolors[6][8]=
-{
- { 0x008080FFL, 0x0080FFFFL, 0x0080FF80L, 0x0080FF00L,
- 0x00FFFF80L, 0x00FF8000L, 0x00C080FFL, 0x00FF80FFL },
- { 0x000000FFL, 0x0000FFFFL, 0x0000FF80L, 0x0040FF00L,
- 0x00FFFF00L, 0x00C08000L, 0x00C08080L, 0x00FF00FFL },
-
- { 0x00404080L, 0x004080FFL, 0x0000FF00L, 0x00808000L,
- 0x00804000L, 0x00FF8080L, 0x00400080L, 0x008000FFL },
- { 0x00000080L, 0x000080FFL, 0x00008000L, 0x00408000L,
- 0x00FF0000L, 0x00A00000L, 0x00800080L, 0x00FF0080L },
-
- { 0x00000040L, 0x00004080L, 0x00004000L, 0x00404000L,
- 0x00800000L, 0x00400000L, 0x00400040L, 0x00800040L },
- { 0x00000000L, 0x00008080L, 0x00408080L, 0x00808080L,
- 0x00808040L, 0x00C0C0C0L, 0x00400040L, 0x00FFFFFFL },
-};
-
-struct CCPRIVATE
-{
- LPCHOOSECOLOR16 lpcc; /* points to public known data structure */
- int nextuserdef; /* next free place in user defined color array */
- HDC16 hdcMem; /* color graph used for BitBlt() */
- HBITMAP16 hbmMem; /* color graph bitmap */
- RECT16 fullsize; /* original dialog window size */
- UINT16 msetrgb; /* # of SETRGBSTRING message (today not used) */
- RECT16 old3angle; /* last position of l-marker */
- RECT16 oldcross; /* last position of color/satuation marker */
- BOOL updating; /* to prevent recursive WM_COMMAND/EN_UPDATE procesing */
- int h;
- int s;
- int l; /* for temporary storing of hue,sat,lum */
-};
-
-/***********************************************************************
- * CC_HSLtoRGB [internal]
- */
-static int CC_HSLtoRGB(char c,int hue,int sat,int lum)
-{
- int res=0,maxrgb;
-
- /* hue */
- switch(c)
- {
- case 'R':if (hue>80) hue-=80; else hue+=160; break;
- case 'G':if (hue>160) hue-=160; else hue+=80; break;
- case 'B':break;
- }
-
- /* l below 120 */
- maxrgb=(256*MIN(120,lum))/120; /* 0 .. 256 */
- if (hue< 80)
- res=0;
- else
- if (hue< 120)
- {
- res=(hue-80)* maxrgb; /* 0...10240 */
- res/=40; /* 0...256 */
- }
- else
- if (hue< 200)
- res=maxrgb;
- else
- {
- res=(240-hue)* maxrgb;
- res/=40;
- }
- res=res-maxrgb/2; /* -128...128 */
-
- /* saturation */
- res=maxrgb/2 + (sat*res) /240; /* 0..256 */
-
- /* lum above 120 */
- if (lum>120 && res<256)
- res+=((lum-120) * (256-res))/120;
-
- return MIN(res,255);
-}
-
-/***********************************************************************
- * CC_RGBtoHSL [internal]
- */
-static int CC_RGBtoHSL(char c,int r,int g,int b)
-{
- WORD maxi,mini,mmsum,mmdif,result=0;
- int iresult=0;
-
- maxi=MAX(r,b);
- maxi=MAX(maxi,g);
- mini=MIN(r,b);
- mini=MIN(mini,g);
-
- mmsum=maxi+mini;
- mmdif=maxi-mini;
-
- switch(c)
- {
- /* lum */
- case 'L':mmsum*=120; /* 0...61200=(255+255)*120 */
- result=mmsum/255; /* 0...240 */
- break;
- /* saturation */
- case 'S':if (!mmsum)
- result=0;
- else
- if (!mini || maxi==255)
- result=240;
- else
- {
- result=mmdif*240; /* 0...61200=255*240 */
- result/= (mmsum>255 ? mmsum=510-mmsum : mmsum); /* 0..255 */
- }
- break;
- /* hue */
- case 'H':if (!mmdif)
- result=160;
- else
- {
- if (maxi==r)
- {
- iresult=40*(g-b); /* -10200 ... 10200 */
- iresult/=(int)mmdif; /* -40 .. 40 */
- if (iresult<0)
- iresult+=240; /* 0..40 and 200..240 */
- }
- else
- if (maxi==g)
- {
- iresult=40*(b-r);
- iresult/=(int)mmdif;
- iresult+=80; /* 40 .. 120 */
- }
- else
- if (maxi==b)
- {
- iresult=40*(r-g);
- iresult/=(int)mmdif;
- iresult+=160; /* 120 .. 200 */
- }
- result=iresult;
- }
- break;
- }
- return result; /* is this integer arithmetic precise enough ? */
-}
-
-#define DISTANCE 4
-
-/***********************************************************************
- * CC_MouseCheckPredefColorArray [internal]
- */
-static int CC_MouseCheckPredefColorArray(HWND16 hDlg,int dlgitem,int rows,int cols,
- LPARAM lParam,COLORREF *cr)
-{
- HWND16 hwnd;
- POINT16 point = MAKEPOINT16(lParam);
- RECT16 rect;
- int dx,dy,x,y;
-
- ClientToScreen16(hDlg,&point);
- hwnd=GetDlgItem(hDlg,dlgitem);
- GetWindowRect16(hwnd,&rect);
- if (PtInRect16(&rect,point))
- {
- dx=(rect.right-rect.left)/cols;
- dy=(rect.bottom-rect.top)/rows;
- ScreenToClient16(hwnd,&point);
-
- if (point.x % dx < (dx-DISTANCE) && point.y % dy < (dy-DISTANCE))
- {
- x=point.x/dx;
- y=point.y/dy;
- *cr=predefcolors[y][x];
- /* FIXME: Draw_a_Focus_Rect() */
- return 1;
- }
- }
- return 0;
-}
-
-/***********************************************************************
- * CC_MouseCheckUserColorArray [internal]
- */
-static int CC_MouseCheckUserColorArray(HWND16 hDlg,int dlgitem,int rows,int cols,
- LPARAM lParam,COLORREF *cr,COLORREF*crarr)
-{
- HWND16 hwnd;
- POINT16 point = MAKEPOINT16(lParam);
- RECT16 rect;
- int dx,dy,x,y;
-
- ClientToScreen16(hDlg,&point);
- hwnd=GetDlgItem(hDlg,dlgitem);
- GetWindowRect16(hwnd,&rect);
- if (PtInRect16(&rect,point))
- {
- dx=(rect.right-rect.left)/cols;
- dy=(rect.bottom-rect.top)/rows;
- ScreenToClient16(hwnd,&point);
-
- if (point.x % dx < (dx-DISTANCE) && point.y % dy < (dy-DISTANCE))
- {
- x=point.x/dx;
- y=point.y/dy;
- *cr=crarr[x+cols*y];
- /* FIXME: Draw_a_Focus_Rect() */
- return 1;
- }
- }
- return 0;
-}
-
-#define MAXVERT 240
-#define MAXHORI 239
-
-/* 240 ^...... ^^ 240
- | . ||
- SAT | . || LUM
- | . ||
- +-----> 239 ----
- HUE
-*/
-/***********************************************************************
- * CC_MouseCheckColorGraph [internal]
- */
-static int CC_MouseCheckColorGraph(HWND16 hDlg,int dlgitem,int *hori,int *vert,LPARAM lParam)
-{
- HWND hwnd;
- POINT16 point = MAKEPOINT16(lParam);
- RECT16 rect;
- long x,y;
-
- ClientToScreen16(hDlg,&point);
- hwnd=GetDlgItem(hDlg,dlgitem);
- GetWindowRect16(hwnd,&rect);
- if (PtInRect16(&rect,point))
- {
- GetClientRect16(hwnd,&rect);
- ScreenToClient16(hwnd,&point);
-
- x=(long)point.x*MAXHORI;
- x/=rect.right;
- y=(long)(rect.bottom-point.y)*MAXVERT;
- y/=rect.bottom;
-
- if (hori)
- *hori=x;
- if (vert)
- *vert=y;
- return 1;
- }
- else
- return 0;
-}
-/***********************************************************************
- * CC_MouseCheckResultWindow [internal]
- */
-static int CC_MouseCheckResultWindow(HWND16 hDlg,LPARAM lParam)
-{
- HWND16 hwnd;
- POINT16 point = MAKEPOINT16(lParam);
- RECT16 rect;
-
- ClientToScreen16(hDlg,&point);
- hwnd=GetDlgItem(hDlg,0x2c5);
- GetWindowRect16(hwnd,&rect);
- if (PtInRect16(&rect,point))
- {
- PostMessage16(hDlg,WM_COMMAND,0x2c9,0);
- return 1;
- }
- return 0;
-}
-
-/***********************************************************************
- * CC_CheckDigitsInEdit [internal]
- */
-static int CC_CheckDigitsInEdit(HWND16 hwnd,int maxval)
-{
- int i,k,m,result,value;
- long editpos;
- char buffer[30];
- GetWindowTextA(hwnd,buffer,sizeof(buffer));
- m=strlen(buffer);
- result=0;
-
- for (i=0;i<m;i++)
- if (buffer[i]<'0' || buffer[i]>'9')
- {
- for (k=i+1;k<=m;k++) /* delete bad character */
- {
- buffer[i]=buffer[k];
- m--;
- }
- buffer[m]=0;
- result=1;
- }
-
- value=atoi(buffer);
- if (value>maxval) /* build a new string */
- {
- sprintf(buffer,"%d",maxval);
- result=2;
- }
- if (result)
- {
- editpos=SendMessage16(hwnd,EM_GETSEL16,0,0);
- SetWindowTextA(hwnd,buffer);
- SendMessage16(hwnd,EM_SETSEL16,0,editpos);
- }
- return value;
-}
-
-
-
-/***********************************************************************
- * CC_PaintSelectedColor [internal]
- */
-static void CC_PaintSelectedColor(HWND16 hDlg,COLORREF cr)
-{
- RECT16 rect;
- HDC hdc;
- HBRUSH hBrush;
- HWND hwnd=GetDlgItem(hDlg,0x2c5);
- if (IsWindowVisible(GetDlgItem(hDlg,0x2c6))) /* if full size */
- {
- hdc=GetDC(hwnd);
- GetClientRect16 (hwnd, &rect) ;
- hBrush = CreateSolidBrush(cr);
- if (hBrush)
- {
- hBrush = SelectObject (hdc, hBrush) ;
- Rectangle(hdc, rect.left,rect.top,rect.right/2,rect.bottom);
- DeleteObject (SelectObject (hdc,hBrush)) ;
- hBrush=CreateSolidBrush(GetNearestColor(hdc,cr));
- if (hBrush)
- {
- hBrush= SelectObject (hdc, hBrush) ;
- Rectangle( hdc, rect.right/2-1,rect.top,rect.right,rect.bottom);
- DeleteObject( SelectObject (hdc, hBrush)) ;
- }
- }
- ReleaseDC(hwnd,hdc);
- }
-}
-
-/***********************************************************************
- * CC_PaintTriangle [internal]
- */
-static void CC_PaintTriangle(HWND16 hDlg,int y)
-{
- HDC hDC;
- long temp;
- int w=GetDialogBaseUnits();
- POINT16 points[3];
- int height;
- int oben;
- RECT16 rect;
- HWND16 hwnd=GetDlgItem(hDlg,0x2be);
- struct CCPRIVATE *lpp=(struct CCPRIVATE *)GetWindowLongA(hDlg, DWL_USER);
-
- if (IsWindowVisible(GetDlgItem(hDlg,0x2c6))) /* if full size */
- {
- GetClientRect16(hwnd,&rect);
- height=rect.bottom;
- hDC=GetDC(hDlg);
-
- points[0].y=rect.top;
- points[0].x=rect.right; /* | /| */
- ClientToScreen16(hwnd,points); /* | / | */
- ScreenToClient16(hDlg,points); /* |< | */
- oben=points[0].y; /* | \ | */
- /* | \| */
- temp=(long)height*(long)y;
- points[0].y=oben+height -temp/(long)MAXVERT;
- points[1].y=points[0].y+w;
- points[2].y=points[0].y-w;
- points[2].x=points[1].x=points[0].x + w;
-
- if (lpp->old3angle.left)
- FillRect16(hDC,&lpp->old3angle,GetStockObject(WHITE_BRUSH));
- lpp->old3angle.left =points[0].x;
- lpp->old3angle.right =points[1].x+1;
- lpp->old3angle.top =points[2].y-1;
- lpp->old3angle.bottom=points[1].y+1;
- Polygon16(hDC,points,3);
- ReleaseDC(hDlg,hDC);
- }
-}
-
-
-/***********************************************************************
- * CC_PaintCross [internal]
- */
-static void CC_PaintCross(HWND16 hDlg,int x,int y)
-{
- HDC hDC;
- int w=GetDialogBaseUnits();
- HWND16 hwnd=GetDlgItem(hDlg,0x2c6);
- struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLongA(hDlg, DWL_USER);
- RECT16 rect;
- POINT16 point;
- HPEN hPen;
-
- if (IsWindowVisible(GetDlgItem(hDlg,0x2c6))) /* if full size */
- {
- GetClientRect16(hwnd,&rect);
- hDC=GetDC(hwnd);
- SelectClipRgn(hDC,CreateRectRgnIndirect16(&rect));
- hPen=CreatePen(PS_SOLID,2,0);
- hPen=SelectObject(hDC,hPen);
- point.x=((long)rect.right*(long)x)/(long)MAXHORI;
- point.y=rect.bottom-((long)rect.bottom*(long)y)/(long)MAXVERT;
- if (lpp->oldcross.left!=lpp->oldcross.right)
- BitBlt(hDC,lpp->oldcross.left,lpp->oldcross.top,
- lpp->oldcross.right-lpp->oldcross.left,
- lpp->oldcross.bottom-lpp->oldcross.top,
- lpp->hdcMem,lpp->oldcross.left,lpp->oldcross.top,SRCCOPY);
- lpp->oldcross.left =point.x-w-1;
- lpp->oldcross.right =point.x+w+1;
- lpp->oldcross.top =point.y-w-1;
- lpp->oldcross.bottom=point.y+w+1;
-
- MoveTo16(hDC,point.x-w,point.y);
- LineTo(hDC,point.x+w,point.y);
- MoveTo16(hDC,point.x,point.y-w);
- LineTo(hDC,point.x,point.y+w);
- DeleteObject(SelectObject(hDC,hPen));
- ReleaseDC(hwnd,hDC);
- }
-}
-
-
-#define XSTEPS 48
-#define YSTEPS 24
-
-
-/***********************************************************************
- * CC_PrepareColorGraph [internal]
- */
-static void CC_PrepareColorGraph(HWND16 hDlg)
-{
- int sdif,hdif,xdif,ydif,r,g,b,hue,sat;
- HWND hwnd=GetDlgItem(hDlg,0x2c6);
- struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLongA(hDlg, DWL_USER);
- HBRUSH hbrush;
- HDC hdc ;
- RECT16 rect,client;
- HCURSOR16 hcursor=SetCursor16(LoadCursor16(0,IDC_WAIT16));
-
- GetClientRect16(hwnd,&client);
- hdc=GetDC(hwnd);
- lpp->hdcMem = CreateCompatibleDC(hdc);
- lpp->hbmMem = CreateCompatibleBitmap(hdc,client.right,client.bottom);
- SelectObject(lpp->hdcMem,lpp->hbmMem);
-
- xdif=client.right /XSTEPS;
- ydif=client.bottom/YSTEPS+1;
- hdif=239/XSTEPS;
- sdif=240/YSTEPS;
- for(rect.left=hue=0;hue<239+hdif;hue+=hdif)
- {
- rect.right=rect.left+xdif;
- rect.bottom=client.bottom;
- for(sat=0;sat<240+sdif;sat+=sdif)
- {
- rect.top=rect.bottom-ydif;
- r=CC_HSLtoRGB('R',hue,sat,120);
- g=CC_HSLtoRGB('G',hue,sat,120);
- b=CC_HSLtoRGB('B',hue,sat,120);
- hbrush=CreateSolidBrush(RGB(r,g,b));
- FillRect16(lpp->hdcMem,&rect,hbrush);
- DeleteObject(hbrush);
- rect.bottom=rect.top;
- }
- rect.left=rect.right;
- }
- ReleaseDC(hwnd,hdc);
- SetCursor16(hcursor);
-}
-
-/***********************************************************************
- * CC_PaintColorGraph [internal]
- */
-static void CC_PaintColorGraph(HWND16 hDlg)
-{
- HWND hwnd=GetDlgItem(hDlg,0x2c6);
- struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLongA(hDlg, DWL_USER);
- HDC hDC;
- RECT16 rect;
- if (IsWindowVisible(hwnd)) /* if full size */
- {
- if (!lpp->hdcMem)
- CC_PrepareColorGraph(hDlg); /* should not be necessary */
-
- hDC=GetDC(hwnd);
- GetClientRect16(hwnd,&rect);
- if (lpp->hdcMem)
- BitBlt(hDC,0,0,rect.right,rect.bottom,lpp->hdcMem,0,0,SRCCOPY);
- else
- WARN(commdlg,"choose color: hdcMem is not defined\n");
- ReleaseDC(hwnd,hDC);
- }
-}
-/***********************************************************************
- * CC_PaintLumBar [internal]
- */
-static void CC_PaintLumBar(HWND16 hDlg,int hue,int sat)
-{
- HWND hwnd=GetDlgItem(hDlg,0x2be);
- RECT16 rect,client;
- int lum,ldif,ydif,r,g,b;
- HBRUSH hbrush;
- HDC hDC;
-
- if (IsWindowVisible(hwnd))
- {
- hDC=GetDC(hwnd);
- GetClientRect16(hwnd,&client);
- rect=client;
-
- ldif=240/YSTEPS;
- ydif=client.bottom/YSTEPS+1;
- for(lum=0;lum<240+ldif;lum+=ldif)
- {
- rect.top=MAX(0,rect.bottom-ydif);
- r=CC_HSLtoRGB('R',hue,sat,lum);
- g=CC_HSLtoRGB('G',hue,sat,lum);
- b=CC_HSLtoRGB('B',hue,sat,lum);
- hbrush=CreateSolidBrush(RGB(r,g,b));
- FillRect16(hDC,&rect,hbrush);
- DeleteObject(hbrush);
- rect.bottom=rect.top;
- }
- GetClientRect16(hwnd,&rect);
- FrameRect16(hDC,&rect,GetStockObject(BLACK_BRUSH));
- ReleaseDC(hwnd,hDC);
- }
-}
-
-/***********************************************************************
- * CC_EditSetRGB [internal]
- */
-static void CC_EditSetRGB(HWND16 hDlg,COLORREF cr)
-{
- char buffer[10];
- struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLongA(hDlg, DWL_USER);
- int r=GetRValue(cr);
- int g=GetGValue(cr);
- int b=GetBValue(cr);
- if (IsWindowVisible(GetDlgItem(hDlg,0x2c6))) /* if full size */
- {
- lpp->updating=TRUE;
- sprintf(buffer,"%d",r);
- SetWindowTextA(GetDlgItem(hDlg,0x2c2),buffer);
- sprintf(buffer,"%d",g);
- SetWindowTextA(GetDlgItem(hDlg,0x2c3),buffer);
- sprintf(buffer,"%d",b);
- SetWindowTextA(GetDlgItem(hDlg,0x2c4),buffer);
- lpp->updating=FALSE;
- }
-}
-
-/***********************************************************************
- * CC_EditSetHSL [internal]
- */
-static void CC_EditSetHSL(HWND16 hDlg,int h,int s,int l)
-{
- char buffer[10];
- struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLongA(hDlg, DWL_USER);
- lpp->updating=TRUE;
- if (IsWindowVisible(GetDlgItem(hDlg,0x2c6))) /* if full size */
- {
- lpp->updating=TRUE;
- sprintf(buffer,"%d",h);
- SetWindowTextA(GetDlgItem(hDlg,0x2bf),buffer);
- sprintf(buffer,"%d",s);
- SetWindowTextA(GetDlgItem(hDlg,0x2c0),buffer);
- sprintf(buffer,"%d",l);
- SetWindowTextA(GetDlgItem(hDlg,0x2c1),buffer);
- lpp->updating=FALSE;
- }
- CC_PaintLumBar(hDlg,h,s);
-}
-
-/***********************************************************************
- * CC_SwitchToFullSize [internal]
- */
-static void CC_SwitchToFullSize(HWND16 hDlg,COLORREF result,LPRECT16 lprect)
-{
- int i;
- struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLongA(hDlg, DWL_USER);
-
- EnableWindow(GetDlgItem(hDlg,0x2cf),FALSE);
- CC_PrepareColorGraph(hDlg);
- for (i=0x2bf;i<0x2c5;i++)
- EnableWindow(GetDlgItem(hDlg,i),TRUE);
- for (i=0x2d3;i<0x2d9;i++)
- EnableWindow(GetDlgItem(hDlg,i),TRUE);
- EnableWindow(GetDlgItem(hDlg,0x2c9),TRUE);
- EnableWindow(GetDlgItem(hDlg,0x2c8),TRUE);
-
- if (lprect)
- SetWindowPos(hDlg,0,0,0,lprect->right-lprect->left,
- lprect->bottom-lprect->top, SWP_NOMOVE|SWP_NOZORDER);
-
- ShowWindow(GetDlgItem(hDlg,0x2c6),SW_SHOW);
- ShowWindow(GetDlgItem(hDlg,0x2be),SW_SHOW);
- ShowWindow(GetDlgItem(hDlg,0x2c5),SW_SHOW);
-
- CC_EditSetRGB(hDlg,result);
- CC_EditSetHSL(hDlg,lpp->h,lpp->s,lpp->l);
-}
-
-/***********************************************************************
- * CC_PaintPredefColorArray [internal]
- */
-static void CC_PaintPredefColorArray(HWND16 hDlg,int rows,int cols)
-{
- HWND hwnd=GetDlgItem(hDlg,0x2d0);
- RECT16 rect;
- HDC hdc;
- HBRUSH hBrush;
- int dx,dy,i,j,k;
-
- GetClientRect16(hwnd,&rect);
- dx=rect.right/cols;
- dy=rect.bottom/rows;
- k=rect.left;
-
- hdc=GetDC(hwnd);
- GetClientRect16 (hwnd, &rect) ;
-
- for (j=0;j<rows;j++)
- {
- for (i=0;i<cols;i++)
- {
- hBrush = CreateSolidBrush(predefcolors[j][i]);
- if (hBrush)
- {
- hBrush = SelectObject (hdc, hBrush) ;
- Rectangle(hdc, rect.left, rect.top,
- rect.left+dx-DISTANCE, rect.top+dy-DISTANCE);
- rect.left=rect.left+dx;
- DeleteObject( SelectObject (hdc, hBrush)) ;
- }
- }
- rect.top=rect.top+dy;
- rect.left=k;
- }
- ReleaseDC(hwnd,hdc);
- /* FIXME: draw_a_focus_rect */
-}
-/***********************************************************************
- * CC_PaintUserColorArray [internal]
- */
-static void CC_PaintUserColorArray(HWND16 hDlg,int rows,int cols,COLORREF* lpcr)
-{
- HWND hwnd=GetDlgItem(hDlg,0x2d1);
- RECT16 rect;
- HDC hdc;
- HBRUSH hBrush;
- int dx,dy,i,j,k;
-
- GetClientRect16(hwnd,&rect);
-
- dx=rect.right/cols;
- dy=rect.bottom/rows;
- k=rect.left;
-
- hdc=GetDC(hwnd);
- if (hdc)
- {
- for (j=0;j<rows;j++)
- {
- for (i=0;i<cols;i++)
- {
- hBrush = CreateSolidBrush(lpcr[i+j*cols]);
- if (hBrush)
- {
- hBrush = SelectObject (hdc, hBrush) ;
- Rectangle( hdc, rect.left, rect.top,
- rect.left+dx-DISTANCE, rect.top+dy-DISTANCE);
- rect.left=rect.left+dx;
- DeleteObject( SelectObject (hdc, hBrush)) ;
- }
- }
- rect.top=rect.top+dy;
- rect.left=k;
- }
- ReleaseDC(hwnd,hdc);
- }
- /* FIXME: draw_a_focus_rect */
-}
-
-
-
-/***********************************************************************
- * CC_HookCallChk [internal]
- */
-static BOOL CC_HookCallChk(LPCHOOSECOLOR16 lpcc)
-{
- if (lpcc)
- if(lpcc->Flags & CC_ENABLEHOOK)
- if (lpcc->lpfnHook)
- return TRUE;
- return FALSE;
-}
-
-/***********************************************************************
- * CC_WMInitDialog [internal]
- */
-static LONG CC_WMInitDialog(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam)
-{
- int i,res;
- int r, g, b;
- HWND16 hwnd;
- RECT16 rect;
- POINT16 point;
- struct CCPRIVATE * lpp;
-
- TRACE(commdlg,"WM_INITDIALOG lParam=%08lX\n", lParam);
- lpp=calloc(1,sizeof(struct CCPRIVATE));
- lpp->lpcc=(LPCHOOSECOLOR16)lParam;
-
- if (lpp->lpcc->lStructSize != sizeof(CHOOSECOLOR16))
- {
- EndDialog (hDlg, 0) ;
- return FALSE;
- }
- SetWindowLongA(hDlg, DWL_USER, (LONG)lpp);
-
- if (!(lpp->lpcc->Flags & CC_SHOWHELP))
- ShowWindow(GetDlgItem(hDlg,0x40e),SW_HIDE);
- lpp->msetrgb=RegisterWindowMessageA( SETRGBSTRING );
-
-#if 0
- cpos=MAKELONG(5,7); /* init */
- if (lpp->lpcc->Flags & CC_RGBINIT)
- {
- for (i=0;i<6;i++)
- for (j=0;j<8;j++)
- if (predefcolors[i][j]==lpp->lpcc->rgbResult)
- {
- cpos=MAKELONG(i,j);
- goto found;
- }
- }
- found:
- /* FIXME: Draw_a_focus_rect & set_init_values */
-#endif
-
- GetWindowRect16(hDlg,&lpp->fullsize);
- if (lpp->lpcc->Flags & CC_FULLOPEN || lpp->lpcc->Flags & CC_PREVENTFULLOPEN)
- {
- hwnd=GetDlgItem(hDlg,0x2cf);
- EnableWindow(hwnd,FALSE);
- }
- if (!(lpp->lpcc->Flags & CC_FULLOPEN) || lpp->lpcc->Flags & CC_PREVENTFULLOPEN)
- {
- rect=lpp->fullsize;
- res=rect.bottom-rect.top;
- hwnd=GetDlgItem(hDlg,0x2c6); /* cut at left border */
- point.x=point.y=0;
- ClientToScreen16(hwnd,&point);
- ScreenToClient16(hDlg,&point);
- GetClientRect16(hDlg,&rect);
- point.x+=GetSystemMetrics(SM_CXDLGFRAME);
- SetWindowPos(hDlg,0,0,0,point.x,res,SWP_NOMOVE|SWP_NOZORDER);
-
- ShowWindow(GetDlgItem(hDlg,0x2c6),SW_HIDE);
- ShowWindow(GetDlgItem(hDlg,0x2c5),SW_HIDE);
- }
- else
- CC_SwitchToFullSize(hDlg,lpp->lpcc->rgbResult,NULL);
- res=TRUE;
- for (i=0x2bf;i<0x2c5;i++)
- SendMessage16(GetDlgItem(hDlg,i),EM_LIMITTEXT16,3,0); /* max 3 digits: xyz */
- if (CC_HookCallChk(lpp->lpcc))
- res=CallWindowProc16(lpp->lpcc->lpfnHook,hDlg,WM_INITDIALOG,wParam,lParam);
-
-
- /* Set the initial values of the color chooser dialog */
- r = GetRValue(lpp->lpcc->rgbResult);
- g = GetGValue(lpp->lpcc->rgbResult);
- b = GetBValue(lpp->lpcc->rgbResult);
-
- CC_PaintSelectedColor(hDlg,lpp->lpcc->rgbResult);
- lpp->h=CC_RGBtoHSL('H',r,g,b);
- lpp->s=CC_RGBtoHSL('S',r,g,b);
- lpp->l=CC_RGBtoHSL('L',r,g,b);
-
- /* Doing it the long way becaus CC_EditSetRGB/HSL doesn'nt seem to work */
- SetDlgItemInt(hDlg, 703, lpp->h, TRUE);
- SetDlgItemInt(hDlg, 704, lpp->s, TRUE);
- SetDlgItemInt(hDlg, 705, lpp->l, TRUE);
- SetDlgItemInt(hDlg, 706, r, TRUE);
- SetDlgItemInt(hDlg, 707, g, TRUE);
- SetDlgItemInt(hDlg, 708, b, TRUE);
-
- CC_PaintCross(hDlg,lpp->h,lpp->s);
- CC_PaintTriangle(hDlg,lpp->l);
-
- return res;
-}
-
-/***********************************************************************
- * CC_WMCommand [internal]
- */
-static LRESULT CC_WMCommand(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam)
-{
- int r,g,b,i,xx;
- UINT16 cokmsg;
- HDC hdc;
- COLORREF *cr;
- struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLongA(hDlg, DWL_USER);
- TRACE(commdlg,"CC_WMCommand wParam=%x lParam=%lx\n",wParam,lParam);
- switch (wParam)
- {
- case 0x2c2: /* edit notify RGB */
- case 0x2c3:
- case 0x2c4:
- if (HIWORD(lParam)==EN_UPDATE && !lpp->updating)
- {
- i=CC_CheckDigitsInEdit(LOWORD(lParam),255);
- r=GetRValue(lpp->lpcc->rgbResult);
- g=GetGValue(lpp->lpcc->rgbResult);
- b=GetBValue(lpp->lpcc->rgbResult);
- xx=0;
- switch (wParam)
- {
- case 0x2c2:if ((xx=(i!=r))) r=i;break;
- case 0x2c3:if ((xx=(i!=g))) g=i;break;
- case 0x2c4:if ((xx=(i!=b))) b=i;break;
- }
- if (xx) /* something has changed */
- {
- lpp->lpcc->rgbResult=RGB(r,g,b);
- CC_PaintSelectedColor(hDlg,lpp->lpcc->rgbResult);
- lpp->h=CC_RGBtoHSL('H',r,g,b);
- lpp->s=CC_RGBtoHSL('S',r,g,b);
- lpp->l=CC_RGBtoHSL('L',r,g,b);
- CC_EditSetHSL(hDlg,lpp->h,lpp->s,lpp->l);
- CC_PaintCross(hDlg,lpp->h,lpp->s);
- CC_PaintTriangle(hDlg,lpp->l);
- }
- }
- break;
-
- case 0x2bf: /* edit notify HSL */
- case 0x2c0:
- case 0x2c1:
- if (HIWORD(lParam)==EN_UPDATE && !lpp->updating)
- {
- i=CC_CheckDigitsInEdit(LOWORD(lParam),wParam==0x2bf?239:240);
- xx=0;
- switch (wParam)
- {
- case 0x2bf:if ((xx=(i!=lpp->h))) lpp->h=i;break;
- case 0x2c0:if ((xx=(i!=lpp->s))) lpp->s=i;break;
- case 0x2c1:if ((xx=(i!=lpp->l))) lpp->l=i;break;
- }
- if (xx) /* something has changed */
- {
- r=CC_HSLtoRGB('R',lpp->h,lpp->s,lpp->l);
- g=CC_HSLtoRGB('G',lpp->h,lpp->s,lpp->l);
- b=CC_HSLtoRGB('B',lpp->h,lpp->s,lpp->l);
- lpp->lpcc->rgbResult=RGB(r,g,b);
- CC_PaintSelectedColor(hDlg,lpp->lpcc->rgbResult);
- CC_EditSetRGB(hDlg,lpp->lpcc->rgbResult);
- CC_PaintCross(hDlg,lpp->h,lpp->s);
- CC_PaintTriangle(hDlg,lpp->l);
- }
- }
- break;
-
- case 0x2cf:
- CC_SwitchToFullSize(hDlg,lpp->lpcc->rgbResult,&lpp->fullsize);
- InvalidateRect( hDlg, NULL, TRUE );
- SetFocus(GetDlgItem(hDlg,0x2bf));
- break;
-
- case 0x2c8: /* add colors ... column by column */
- cr=PTR_SEG_TO_LIN(lpp->lpcc->lpCustColors);
- cr[(lpp->nextuserdef%2)*8 + lpp->nextuserdef/2]=lpp->lpcc->rgbResult;
- if (++lpp->nextuserdef==16)
- lpp->nextuserdef=0;
- CC_PaintUserColorArray(hDlg,2,8,PTR_SEG_TO_LIN(lpp->lpcc->lpCustColors));
- break;
-
- case 0x2c9: /* resulting color */
- hdc=GetDC(hDlg);
- lpp->lpcc->rgbResult=GetNearestColor(hdc,lpp->lpcc->rgbResult);
- ReleaseDC(hDlg,hdc);
- CC_EditSetRGB(hDlg,lpp->lpcc->rgbResult);
- CC_PaintSelectedColor(hDlg,lpp->lpcc->rgbResult);
- r=GetRValue(lpp->lpcc->rgbResult);
- g=GetGValue(lpp->lpcc->rgbResult);
- b=GetBValue(lpp->lpcc->rgbResult);
- lpp->h=CC_RGBtoHSL('H',r,g,b);
- lpp->s=CC_RGBtoHSL('S',r,g,b);
- lpp->l=CC_RGBtoHSL('L',r,g,b);
- CC_EditSetHSL(hDlg,lpp->h,lpp->s,lpp->l);
- CC_PaintCross(hDlg,lpp->h,lpp->s);
- CC_PaintTriangle(hDlg,lpp->l);
- break;
-
- case 0x40e: /* Help! */ /* The Beatles, 1965 ;-) */
- i=RegisterWindowMessageA( HELPMSGSTRING );
- if (lpp->lpcc->hwndOwner)
- SendMessage16(lpp->lpcc->hwndOwner,i,0,(LPARAM)lpp->lpcc);
- if (CC_HookCallChk(lpp->lpcc))
- CallWindowProc16(lpp->lpcc->lpfnHook,hDlg,
- WM_COMMAND,psh15,(LPARAM)lpp->lpcc);
- break;
-
- case IDOK :
- cokmsg=RegisterWindowMessageA( COLOROKSTRING );
- if (lpp->lpcc->hwndOwner)
- if (SendMessage16(lpp->lpcc->hwndOwner,cokmsg,0,(LPARAM)lpp->lpcc))
- break; /* do NOT close */
-
- EndDialog (hDlg, 1) ;
- return TRUE ;
-
- case IDCANCEL :
- EndDialog (hDlg, 0) ;
- return TRUE ;
-
- }
- return FALSE;
-}
-
-/***********************************************************************
- * CC_WMPaint [internal]
- */
-static LRESULT CC_WMPaint(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam)
-{
- HDC hdc;
- PAINTSTRUCT ps;
- struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLongA(hDlg, DWL_USER);
-
- hdc=BeginPaint(hDlg,&ps);
- EndPaint(hDlg,&ps);
- /* we have to paint dialog children except text and buttons */
-
- CC_PaintPredefColorArray(hDlg,6,8);
- CC_PaintUserColorArray(hDlg,2,8,PTR_SEG_TO_LIN(lpp->lpcc->lpCustColors));
- CC_PaintColorGraph(hDlg);
- CC_PaintLumBar(hDlg,lpp->h,lpp->s);
- CC_PaintCross(hDlg,lpp->h,lpp->s);
- CC_PaintTriangle(hDlg,lpp->l);
- CC_PaintSelectedColor(hDlg,lpp->lpcc->rgbResult);
-
- /* special necessary for Wine */
- ValidateRect(GetDlgItem(hDlg,0x2d0),NULL);
- ValidateRect(GetDlgItem(hDlg,0x2d1),NULL);
- ValidateRect(GetDlgItem(hDlg,0x2c6),NULL);
- ValidateRect(GetDlgItem(hDlg,0x2be),NULL);
- ValidateRect(GetDlgItem(hDlg,0x2c5),NULL);
- /* hope we can remove it later -->FIXME */
- return TRUE;
-}
-
-
-/***********************************************************************
- * CC_WMLButtonDown [internal]
- */
-static LRESULT CC_WMLButtonDown(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam)
-{
- struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLongA(hDlg, DWL_USER);
- int r,g,b,i;
- i=0;
- if (CC_MouseCheckPredefColorArray(hDlg,0x2d0,6,8,lParam,&lpp->lpcc->rgbResult))
- i=1;
- else
- if (CC_MouseCheckUserColorArray(hDlg,0x2d1,2,8,lParam,&lpp->lpcc->rgbResult,
- PTR_SEG_TO_LIN(lpp->lpcc->lpCustColors)))
- i=1;
- else
- if (CC_MouseCheckColorGraph(hDlg,0x2c6,&lpp->h,&lpp->s,lParam))
- i=2;
- else
- if (CC_MouseCheckColorGraph(hDlg,0x2be,NULL,&lpp->l,lParam))
- i=2;
- if (i==2)
- {
- r=CC_HSLtoRGB('R',lpp->h,lpp->s,lpp->l);
- g=CC_HSLtoRGB('G',lpp->h,lpp->s,lpp->l);
- b=CC_HSLtoRGB('B',lpp->h,lpp->s,lpp->l);
- lpp->lpcc->rgbResult=RGB(r,g,b);
- }
- if (i==1)
- {
- r=GetRValue(lpp->lpcc->rgbResult);
- g=GetGValue(lpp->lpcc->rgbResult);
- b=GetBValue(lpp->lpcc->rgbResult);
- lpp->h=CC_RGBtoHSL('H',r,g,b);
- lpp->s=CC_RGBtoHSL('S',r,g,b);
- lpp->l=CC_RGBtoHSL('L',r,g,b);
- }
- if (i)
- {
- CC_EditSetRGB(hDlg,lpp->lpcc->rgbResult);
- CC_EditSetHSL(hDlg,lpp->h,lpp->s,lpp->l);
- CC_PaintCross(hDlg,lpp->h,lpp->s);
- CC_PaintTriangle(hDlg,lpp->l);
- CC_PaintSelectedColor(hDlg,lpp->lpcc->rgbResult);
- return TRUE;
- }
- return FALSE;
-}
-
-/***********************************************************************
- * ColorDlgProc (COMMDLG.8)
- */
-LRESULT WINAPI ColorDlgProc16(HWND16 hDlg, UINT16 message,
- WPARAM16 wParam, LONG lParam)
-{
- int res;
- struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLongA(hDlg, DWL_USER);
- if (message!=WM_INITDIALOG)
- {
- if (!lpp)
- return FALSE;
- res=0;
- if (CC_HookCallChk(lpp->lpcc))
- res=CallWindowProc16(lpp->lpcc->lpfnHook,hDlg,message,wParam,lParam);
- if (res)
- return res;
- }
-
- /* FIXME: SetRGB message
- if (message && message==msetrgb)
- return HandleSetRGB(hDlg,lParam);
- */
-
- switch (message)
- {
- case WM_INITDIALOG:
- return CC_WMInitDialog(hDlg,wParam,lParam);
- case WM_NCDESTROY:
- DeleteDC(lpp->hdcMem);
- DeleteObject(lpp->hbmMem);
- free(lpp);
- SetWindowLongA(hDlg, DWL_USER, 0L); /* we don't need it anymore */
- break;
- case WM_COMMAND:
- if (CC_WMCommand(hDlg, wParam, lParam))
- return TRUE;
- break;
- case WM_PAINT:
- if (CC_WMPaint(hDlg, wParam, lParam))
- return TRUE;
- break;
- case WM_LBUTTONDBLCLK:
- if (CC_MouseCheckResultWindow(hDlg,lParam))
- return TRUE;
- break;
- case WM_MOUSEMOVE: /* FIXME: calculate new hue,sat,lum (if in color graph) */
- break;
- case WM_LBUTTONUP: /* FIXME: ClipCursor off (if in color graph)*/
- break;
- case WM_LBUTTONDOWN:/* FIXME: ClipCursor on (if in color graph)*/
- if (CC_WMLButtonDown(hDlg, wParam, lParam))
- return TRUE;
- break;
- }
- return FALSE ;
-}
-
-static void CFn_CHOOSEFONT16to32A(LPCHOOSEFONT16 chf16, LPCHOOSEFONTA chf32a)
-{
- chf32a->lStructSize=sizeof(CHOOSEFONTA);
- chf32a->hwndOwner=chf16->hwndOwner;
- chf32a->hDC=chf16->hDC;
- chf32a->iPointSize=chf16->iPointSize;
- chf32a->Flags=chf16->Flags;
- chf32a->rgbColors=chf16->rgbColors;
- chf32a->lCustData=chf16->lCustData;
- chf32a->lpfnHook=NULL;
- chf32a->lpTemplateName=PTR_SEG_TO_LIN(chf16->lpTemplateName);
- chf32a->hInstance=chf16->hInstance;
- chf32a->lpszStyle=PTR_SEG_TO_LIN(chf16->lpszStyle);
- chf32a->nFontType=chf16->nFontType;
- chf32a->nSizeMax=chf16->nSizeMax;
- chf32a->nSizeMin=chf16->nSizeMin;
- FONT_LogFont16To32A(PTR_SEG_TO_LIN(chf16->lpLogFont), chf32a->lpLogFont);
-}
-
-
-/***********************************************************************
- * ChooseFont16 (COMMDLG.15)
- */
-BOOL16 WINAPI ChooseFont16(LPCHOOSEFONT16 lpChFont)
-{
- HINSTANCE16 hInst;
- HANDLE16 hDlgTmpl = 0;
- BOOL16 bRet = FALSE, win32Format = FALSE;
- LPCVOID template;
- HWND hwndDialog;
- CHOOSEFONTA cf32a;
- LOGFONTA lf32a;
- SEGPTR lpTemplateName;
-
- cf32a.lpLogFont=&lf32a;
- CFn_CHOOSEFONT16to32A(lpChFont, &cf32a);
-
- TRACE(commdlg,"ChooseFont\n");
- if (!lpChFont) return FALSE;
-
- if (lpChFont->Flags & CF_ENABLETEMPLATEHANDLE)
- {
- if (!(template = LockResource16( lpChFont->hInstance )))
- {
- CommDlgLastError = CDERR_LOADRESFAILURE;
- return FALSE;
- }
- }
- else if (lpChFont->Flags & CF_ENABLETEMPLATE)
- {
- HANDLE16 hResInfo;
- if (!(hResInfo = FindResource16( lpChFont->hInstance,
- lpChFont->lpTemplateName,
- RT_DIALOG16)))
- {
- CommDlgLastError = CDERR_FINDRESFAILURE;
- return FALSE;
- }
- if (!(hDlgTmpl = LoadResource16( lpChFont->hInstance, hResInfo )) ||
- !(template = LockResource16( hDlgTmpl )))
- {
- CommDlgLastError = CDERR_LOADRESFAILURE;
- return FALSE;
- }
- }
- else
- {
- template = SYSRES_GetResPtr( SYSRES_DIALOG_CHOOSE_FONT );
- win32Format = TRUE;
- }
-
- hInst = WIN_GetWindowInstance( lpChFont->hwndOwner );
-
- /* lpTemplateName is not used in the dialog */
- lpTemplateName=lpChFont->lpTemplateName;
- lpChFont->lpTemplateName=(SEGPTR)&cf32a;
-
- hwndDialog = DIALOG_CreateIndirect( hInst, template, win32Format,
- lpChFont->hwndOwner,
- (DLGPROC16)MODULE_GetWndProcEntry16("FormatCharDlgProc"),
- (DWORD)lpChFont, WIN_PROC_16 );
- if (hwndDialog) bRet = DIALOG_DoDialogBox(hwndDialog, lpChFont->hwndOwner);
- if (hDlgTmpl) FreeResource16( hDlgTmpl );
- lpChFont->lpTemplateName=lpTemplateName;
- FONT_LogFont32ATo16(cf32a.lpLogFont,
- (LPLOGFONT16)(PTR_SEG_TO_LIN(lpChFont->lpLogFont)));
- return bRet;
-}
-
-
-/***********************************************************************
- * ChooseFont32A (COMDLG32.3)
- */
-BOOL WINAPI ChooseFontA(LPCHOOSEFONTA lpChFont)
-{
- BOOL bRet=FALSE;
- HWND hwndDialog;
- HINSTANCE hInst=WIN_GetWindowInstance( lpChFont->hwndOwner );
- LPCVOID template = SYSRES_GetResPtr( SYSRES_DIALOG_CHOOSE_FONT );
- if (lpChFont->Flags & (CF_SELECTSCRIPT | CF_NOVERTFONTS | CF_ENABLETEMPLATE |
- CF_ENABLETEMPLATEHANDLE)) FIXME(commdlg, ": unimplemented flag (ignored)\n");
- hwndDialog = DIALOG_CreateIndirect(hInst, template, TRUE, lpChFont->hwndOwner,
- (DLGPROC16)FormatCharDlgProcA, (LPARAM)lpChFont, WIN_PROC_32A );
- if (hwndDialog) bRet = DIALOG_DoDialogBox(hwndDialog, lpChFont->hwndOwner);
- return bRet;
-}
-
-/***********************************************************************
- * ChooseFont32W (COMDLG32.4)
- */
-BOOL WINAPI ChooseFontW(LPCHOOSEFONTW lpChFont)
-{
- BOOL bRet=FALSE;
- HWND hwndDialog;
- HINSTANCE hInst=WIN_GetWindowInstance( lpChFont->hwndOwner );
- CHOOSEFONTA cf32a;
- LOGFONTA lf32a;
- LPCVOID template = SYSRES_GetResPtr( SYSRES_DIALOG_CHOOSE_FONT );
- if (lpChFont->Flags & (CF_SELECTSCRIPT | CF_NOVERTFONTS | CF_ENABLETEMPLATE |
- CF_ENABLETEMPLATEHANDLE)) FIXME(commdlg, ": unimplemented flag (ignored)\n");
- memcpy(&cf32a, lpChFont, sizeof(cf32a));
- memcpy(&lf32a, lpChFont->lpLogFont, sizeof(LOGFONTA));
- lstrcpynWtoA(lf32a.lfFaceName, lpChFont->lpLogFont->lfFaceName, LF_FACESIZE);
- cf32a.lpLogFont=&lf32a;
- cf32a.lpszStyle=HEAP_strdupWtoA(GetProcessHeap(), 0, lpChFont->lpszStyle);
- lpChFont->lpTemplateName=(LPWSTR)&cf32a;
- hwndDialog=DIALOG_CreateIndirect(hInst, template, TRUE, lpChFont->hwndOwner,
- (DLGPROC16)FormatCharDlgProcW, (LPARAM)lpChFont, WIN_PROC_32W );
- if (hwndDialog)bRet=DIALOG_DoDialogBox(hwndDialog, lpChFont->hwndOwner);
- HeapFree(GetProcessHeap(), 0, cf32a.lpszStyle);
- lpChFont->lpTemplateName=(LPWSTR)cf32a.lpTemplateName;
- memcpy(lpChFont->lpLogFont, &lf32a, sizeof(CHOOSEFONTA));
- lstrcpynAtoW(lpChFont->lpLogFont->lfFaceName, lf32a.lfFaceName, LF_FACESIZE);
- return bRet;
-}
-
-
-#define TEXT_EXTRAS 4
-#define TEXT_COLORS 16
-
-static const COLORREF textcolors[TEXT_COLORS]=
-{
- 0x00000000L,0x00000080L,0x00008000L,0x00008080L,
- 0x00800000L,0x00800080L,0x00808000L,0x00808080L,
- 0x00c0c0c0L,0x000000ffL,0x0000ff00L,0x0000ffffL,
- 0x00ff0000L,0x00ff00ffL,0x00ffff00L,0x00FFFFFFL
-};
-
-/***********************************************************************
- * CFn_HookCallChk [internal]
- */
-static BOOL CFn_HookCallChk(LPCHOOSEFONT16 lpcf)
-{
- if (lpcf)
- if(lpcf->Flags & CF_ENABLEHOOK)
- if (lpcf->lpfnHook)
- return TRUE;
- return FALSE;
-}
-
-/***********************************************************************
- * CFn_HookCallChk32 [internal]
- */
-static BOOL CFn_HookCallChk32(LPCHOOSEFONTA lpcf)
-{
- if (lpcf)
- if(lpcf->Flags & CF_ENABLEHOOK)
- if (lpcf->lpfnHook)
- return TRUE;
- return FALSE;
-}
-
-
-/*************************************************************************
- * AddFontFamily [internal]
- */
-static INT AddFontFamily(LPLOGFONTA lplf, UINT nFontType,
- LPCHOOSEFONTA lpcf, HWND hwnd)
-{
- int i;
- WORD w;
-
- TRACE(commdlg,"font=%s (nFontType=%d)\n", lplf->lfFaceName,nFontType);
-
- if (lpcf->Flags & CF_FIXEDPITCHONLY)
- if (!(lplf->lfPitchAndFamily & FIXED_PITCH))
- return 1;
- if (lpcf->Flags & CF_ANSIONLY)
- if (lplf->lfCharSet != ANSI_CHARSET)
- return 1;
- if (lpcf->Flags & CF_TTONLY)
- if (!(nFontType & TRUETYPE_FONTTYPE))
- return 1;
-
- i=SendMessageA(hwnd, CB_ADDSTRING, 0, (LPARAM)lplf->lfFaceName);
- if (i!=CB_ERR)
- {
- w=(lplf->lfCharSet << 8) | lplf->lfPitchAndFamily;
- SendMessageA(hwnd, CB_SETITEMDATA, i, MAKELONG(nFontType,w));
- return 1 ; /* store some important font information */
- }
- else
- return 0;
-}
-
-typedef struct
-{
- HWND hWnd1;
- HWND hWnd2;
- LPCHOOSEFONTA lpcf32a;
-} CFn_ENUMSTRUCT, *LPCFn_ENUMSTRUCT;
-
-/*************************************************************************
- * FontFamilyEnumProc32 [internal]
- */
-INT WINAPI FontFamilyEnumProc(LPENUMLOGFONTA lpEnumLogFont,
- LPNEWTEXTMETRICA metrics, UINT nFontType, LPARAM lParam)
-{
- LPCFn_ENUMSTRUCT e;
- e=(LPCFn_ENUMSTRUCT)lParam;
- return AddFontFamily(&lpEnumLogFont->elfLogFont, nFontType, e->lpcf32a, e->hWnd1);
-}
-
-/***********************************************************************
- * FontFamilyEnumProc16 (COMMDLG.19)
- */
-INT16 WINAPI FontFamilyEnumProc16( SEGPTR logfont, SEGPTR metrics,
- UINT16 nFontType, LPARAM lParam )
-{
- HWND16 hwnd=LOWORD(lParam);
- HWND16 hDlg=GetParent16(hwnd);
- LPCHOOSEFONT16 lpcf=(LPCHOOSEFONT16)GetWindowLongA(hDlg, DWL_USER);
- LOGFONT16 *lplf = (LOGFONT16 *)PTR_SEG_TO_LIN( logfont );
- LOGFONTA lf32a;
- FONT_LogFont16To32A(lplf, &lf32a);
- return AddFontFamily(&lf32a, nFontType, (LPCHOOSEFONTA)lpcf->lpTemplateName,
- hwnd);
-}
-
-/*************************************************************************
- * SetFontStylesToCombo2 [internal]
- *
- * Fill font style information into combobox (without using font.c directly)
- */
-static int SetFontStylesToCombo2(HWND hwnd, HDC hdc, LPLOGFONTA lplf)
-{
- #define FSTYLES 4
- struct FONTSTYLE
- { int italic;
- int weight;
- char stname[20]; };
- static struct FONTSTYLE fontstyles[FSTYLES]={
- { 0,FW_NORMAL,"Regular"},{0,FW_BOLD,"Bold"},
- { 1,FW_NORMAL,"Italic"}, {1,FW_BOLD,"Bold Italic"}};
- HFONT16 hf;
- TEXTMETRIC16 tm;
- int i,j;
-
- for (i=0;i<FSTYLES;i++)
- {
- lplf->lfItalic=fontstyles[i].italic;
- lplf->lfWeight=fontstyles[i].weight;
- hf=CreateFontIndirectA(lplf);
- hf=SelectObject(hdc,hf);
- GetTextMetrics16(hdc,&tm);
- hf=SelectObject(hdc,hf);
- DeleteObject(hf);
-
- if (tm.tmWeight==fontstyles[i].weight &&
- tm.tmItalic==fontstyles[i].italic) /* font successful created ? */
- {
- char *str = SEGPTR_STRDUP(fontstyles[i].stname);
- j=SendMessage16(hwnd,CB_ADDSTRING16,0,(LPARAM)SEGPTR_GET(str) );
- SEGPTR_FREE(str);
- if (j==CB_ERR) return 1;
- j=SendMessage16(hwnd, CB_SETITEMDATA16, j,
- MAKELONG(fontstyles[i].weight,fontstyles[i].italic));
- if (j==CB_ERR) return 1;
- }
- }
- return 0;
-}
-
-/*************************************************************************
- * AddFontSizeToCombo3 [internal]
- */
-static int AddFontSizeToCombo3(HWND hwnd, UINT h, LPCHOOSEFONTA lpcf)
-{
- int j;
- char buffer[20];
-
- if ( (!(lpcf->Flags & CF_LIMITSIZE)) ||
- ((lpcf->Flags & CF_LIMITSIZE) && (h >= lpcf->nSizeMin) && (h <= lpcf->nSizeMax)))
- {
- sprintf(buffer, "%2d", h);
- j=SendMessageA(hwnd, CB_FINDSTRINGEXACT, -1, (LPARAM)buffer);
- if (j==CB_ERR)
- {
- j=SendMessageA(hwnd, CB_ADDSTRING, 0, (LPARAM)buffer);
- if (j!=CB_ERR) j = SendMessageA(hwnd, CB_SETITEMDATA, j, h);
- if (j==CB_ERR) return 1;
- }
- }
- return 0;
-}
-
-/*************************************************************************
- * SetFontSizesToCombo3 [internal]
- */
-static int SetFontSizesToCombo3(HWND hwnd, LPCHOOSEFONTA lpcf)
-{
- static const int sizes[]={8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72,0};
- int i;
-
- for (i=0; sizes[i]; i++)
- if (AddFontSizeToCombo3(hwnd, sizes[i], lpcf)) return 1;
- return 0;
-}
-
-/***********************************************************************
- * AddFontStyle [internal]
- */
-INT AddFontStyle(LPLOGFONTA lplf, UINT nFontType,
- LPCHOOSEFONTA lpcf, HWND hcmb2, HWND hcmb3, HWND hDlg)
-{
- int i;
-
- TRACE(commdlg,"(nFontType=%d)\n",nFontType);
- TRACE(commdlg," %s h=%d w=%d e=%d o=%d wg=%d i=%d u=%d s=%d"
- " ch=%d op=%d cp=%d q=%d pf=%xh\n",
- lplf->lfFaceName,lplf->lfHeight,lplf->lfWidth,
- lplf->lfEscapement,lplf->lfOrientation,
- lplf->lfWeight,lplf->lfItalic,lplf->lfUnderline,
- lplf->lfStrikeOut,lplf->lfCharSet, lplf->lfOutPrecision,
- lplf->lfClipPrecision,lplf->lfQuality, lplf->lfPitchAndFamily);
- if (nFontType & RASTER_FONTTYPE)
- {
- if (AddFontSizeToCombo3(hcmb3, lplf->lfHeight, lpcf)) return 0;
- } else if (SetFontSizesToCombo3(hcmb3, lpcf)) return 0;
-
- if (!SendMessageA(hcmb2, CB_GETCOUNT, 0, 0))
- {
- HDC hdc= (lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC) ? lpcf->hDC : GetDC(hDlg);
- i=SetFontStylesToCombo2(hcmb2,hdc,lplf);
- if (!(lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC))
- ReleaseDC(hDlg,hdc);
- if (i)
- return 0;
- }
- return 1 ;
-
-}
-
-/***********************************************************************
- * FontStyleEnumProc16 (COMMDLG.18)
- */
-INT16 WINAPI FontStyleEnumProc16( SEGPTR logfont, SEGPTR metrics,
- UINT16 nFontType, LPARAM lParam )
-{
- HWND16 hcmb2=LOWORD(lParam);
- HWND16 hcmb3=HIWORD(lParam);
- HWND16 hDlg=GetParent16(hcmb3);
- LPCHOOSEFONT16 lpcf=(LPCHOOSEFONT16)GetWindowLongA(hDlg, DWL_USER);
- LOGFONT16 *lplf = (LOGFONT16 *)PTR_SEG_TO_LIN(logfont);
- LOGFONTA lf32a;
- FONT_LogFont16To32A(lplf, &lf32a);
- return AddFontStyle(&lf32a, nFontType, (LPCHOOSEFONTA)lpcf->lpTemplateName,
- hcmb2, hcmb3, hDlg);
-}
-
-/***********************************************************************
- * FontStyleEnumProc32 [internal]
- */
-INT WINAPI FontStyleEnumProc( LPENUMLOGFONTA lpFont,
- LPNEWTEXTMETRICA metrics, UINT nFontType, LPARAM lParam )
-{
- LPCFn_ENUMSTRUCT s=(LPCFn_ENUMSTRUCT)lParam;
- HWND hcmb2=s->hWnd1;
- HWND hcmb3=s->hWnd2;
- HWND hDlg=GetParent(hcmb3);
- return AddFontStyle(&lpFont->elfLogFont, nFontType, s->lpcf32a, hcmb2,
- hcmb3, hDlg);
-}
-
-/***********************************************************************
- * CFn_WMInitDialog [internal]
- */
-LRESULT CFn_WMInitDialog(HWND hDlg, WPARAM wParam, LPARAM lParam,
- LPCHOOSEFONTA lpcf)
-{
- HDC hdc;
- int i,j,res,init=0;
- long l;
- LPLOGFONTA lpxx;
- HCURSOR hcursor=SetCursor(LoadCursorA(0,IDC_WAITA));
-
- SetWindowLongA(hDlg, DWL_USER, lParam);
- lpxx=lpcf->lpLogFont;
- TRACE(commdlg,"WM_INITDIALOG lParam=%08lX\n", lParam);
-
- if (lpcf->lStructSize != sizeof(CHOOSEFONTA))
- {
- ERR(commdlg,"structure size failure !!!\n");
- EndDialog (hDlg, 0);
- return FALSE;
- }
- if (!hBitmapTT)
- hBitmapTT = LoadBitmapA(0, MAKEINTRESOURCEA(OBM_TRTYPE));
-
- /* This font will be deleted by WM_COMMAND */
- SendDlgItemMessageA(hDlg,stc6,WM_SETFONT,
- CreateFontA(0, 0, 1, 1, 400, 0, 0, 0, 0, 0, 0, 0, 0, NULL),FALSE);
-
- if (!(lpcf->Flags & CF_SHOWHELP) || !IsWindow(lpcf->hwndOwner))
- ShowWindow(GetDlgItem(hDlg,pshHelp),SW_HIDE);
- if (!(lpcf->Flags & CF_APPLY))
- ShowWindow(GetDlgItem(hDlg,psh3),SW_HIDE);
- if (lpcf->Flags & CF_EFFECTS)
- {
- for (res=1,i=0;res && i<TEXT_COLORS;i++)
- {
- /* FIXME: load color name from resource: res=LoadString(...,i+....,buffer,.....); */
- char name[20];
- strcpy( name, "[color name]" );
- j=SendDlgItemMessageA(hDlg, cmb4, CB_ADDSTRING, 0, (LPARAM)name);
- SendDlgItemMessageA(hDlg, cmb4, CB_SETITEMDATA16, j, textcolors[j]);
- /* look for a fitting value in color combobox */
- if (textcolors[j]==lpcf->rgbColors)
- SendDlgItemMessageA(hDlg,cmb4, CB_SETCURSEL,j,0);
- }
- }
- else
- {
- ShowWindow(GetDlgItem(hDlg,cmb4),SW_HIDE);
- ShowWindow(GetDlgItem(hDlg,chx1),SW_HIDE);
- ShowWindow(GetDlgItem(hDlg,chx2),SW_HIDE);
- ShowWindow(GetDlgItem(hDlg,grp1),SW_HIDE);
- ShowWindow(GetDlgItem(hDlg,stc4),SW_HIDE);
- }
- hdc= (lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC) ? lpcf->hDC : GetDC(hDlg);
- if (hdc)
- {
- CFn_ENUMSTRUCT s;
- s.hWnd1=GetDlgItem(hDlg,cmb1);
- s.lpcf32a=lpcf;
- if (!EnumFontFamiliesA(hdc, NULL, FontFamilyEnumProc, (LPARAM)&s))
- TRACE(commdlg,"EnumFontFamilies returns 0\n");
- if (lpcf->Flags & CF_INITTOLOGFONTSTRUCT)
- {
- /* look for fitting font name in combobox1 */
- j=SendDlgItemMessageA(hDlg,cmb1,CB_FINDSTRING,-1,(LONG)lpxx->lfFaceName);
- if (j!=CB_ERR)
- {
- SendDlgItemMessageA(hDlg, cmb1, CB_SETCURSEL, j, 0);
- SendMessageA(hDlg, WM_COMMAND, MAKEWPARAM(cmb1, CBN_SELCHANGE),
- GetDlgItem(hDlg,cmb1));
- init=1;
- /* look for fitting font style in combobox2 */
- l=MAKELONG(lpxx->lfWeight > FW_MEDIUM ? FW_BOLD:FW_NORMAL,lpxx->lfItalic !=0);
- for (i=0;i<TEXT_EXTRAS;i++)
- {
- if (l==SendDlgItemMessageA(hDlg, cmb2, CB_GETITEMDATA, i, 0))
- SendDlgItemMessageA(hDlg, cmb2, CB_SETCURSEL, i, 0);
- }
-
- /* look for fitting font size in combobox3 */
- j=SendDlgItemMessageA(hDlg, cmb3, CB_GETCOUNT, 0, 0);
- for (i=0;i<j;i++)
- {
- if (lpxx->lfHeight==(int)SendDlgItemMessageA(hDlg,cmb3, CB_GETITEMDATA,i,0))
- SendDlgItemMessageA(hDlg,cmb3,CB_SETCURSEL,i,0);
- }
- }
- }
- if (!init)
- {
- SendDlgItemMessageA(hDlg,cmb1,CB_SETCURSEL,0,0);
- SendMessageA(hDlg, WM_COMMAND, MAKEWPARAM(cmb1, CBN_SELCHANGE),
- GetDlgItem(hDlg,cmb1));
- }
- if (lpcf->Flags & CF_USESTYLE && lpcf->lpszStyle)
- {
- j=SendDlgItemMessageA(hDlg,cmb2,CB_FINDSTRING,-1,(LONG)lpcf->lpszStyle);
- if (j!=CB_ERR)
- {
- j=SendDlgItemMessageA(hDlg,cmb2,CB_SETCURSEL,j,0);
- SendMessageA(hDlg,WM_COMMAND,cmb2,
- MAKELONG(GetDlgItem(hDlg,cmb2),CBN_SELCHANGE));
- }
- }
- }
- else
- {
- WARN(commdlg,"HDC failure !!!\n");
- EndDialog (hDlg, 0);
- return FALSE;
- }
-
- if (!(lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC))
- ReleaseDC(hDlg,hdc);
- SetCursor(hcursor);
- return TRUE;
-}
-
-
-/***********************************************************************
- * CFn_WMMeasureItem [internal]
- */
-LRESULT CFn_WMMeasureItem(HWND hDlg, WPARAM wParam, LPARAM lParam)
-{
- BITMAP bm;
- LPMEASUREITEMSTRUCT lpmi=(LPMEASUREITEMSTRUCT)lParam;
- if (!hBitmapTT)
- hBitmapTT = LoadBitmapA(0, MAKEINTRESOURCEA(OBM_TRTYPE));
- GetObjectA( hBitmapTT, sizeof(bm), &bm );
- lpmi->itemHeight=bm.bmHeight;
- /* FIXME: use MAX of bm.bmHeight and tm.tmHeight .*/
- return 0;
-}
-
-
-/***********************************************************************
- * CFn_WMDrawItem [internal]
- */
-LRESULT CFn_WMDrawItem(HWND hDlg, WPARAM wParam, LPARAM lParam)
-{
- HBRUSH hBrush;
- char buffer[40];
- BITMAP bm;
- COLORREF cr, oldText=0, oldBk=0;
- RECT rect;
-#if 0
- HDC hMemDC;
- int nFontType;
- HBITMAP hBitmap; /* for later TT usage */
-#endif
- LPDRAWITEMSTRUCT lpdi = (LPDRAWITEMSTRUCT)lParam;
-
- if (lpdi->itemID == 0xFFFF) /* got no items */
- DrawFocusRect(lpdi->hDC, &lpdi->rcItem);
- else
- {
- if (lpdi->CtlType == ODT_COMBOBOX)
- {
- if (lpdi->itemState ==ODS_SELECTED)
- {
- hBrush=GetSysColorBrush(COLOR_HIGHLIGHT);
- oldText=SetTextColor(lpdi->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT));
- oldBk=SetBkColor(lpdi->hDC, GetSysColor(COLOR_HIGHLIGHT));
- } else
- {
- hBrush = SelectObject(lpdi->hDC, GetStockObject(LTGRAY_BRUSH));
- SelectObject(lpdi->hDC, hBrush);
- }
- FillRect(lpdi->hDC, &lpdi->rcItem, hBrush);
- }
- else
- return TRUE; /* this should never happen */
-
- rect=lpdi->rcItem;
- switch (lpdi->CtlID)
- {
- case cmb1: /* TRACE(commdlg,"WM_Drawitem cmb1\n"); */
- SendMessageA(lpdi->hwndItem, CB_GETLBTEXT, lpdi->itemID,
- (LPARAM)buffer);
- GetObjectA( hBitmapTT, sizeof(bm), &bm );
- TextOutA(lpdi->hDC, lpdi->rcItem.left + bm.bmWidth + 10,
- lpdi->rcItem.top, buffer, lstrlenA(buffer));
-#if 0
- nFontType = SendMessageA(lpdi->hwndItem, CB_GETITEMDATA, lpdi->itemID,0L);
- /* FIXME: draw bitmap if truetype usage */
- if (nFontType&TRUETYPE_FONTTYPE)
- {
- hMemDC = CreateCompatibleDC(lpdi->hDC);
- hBitmap = SelectObject(hMemDC, hBitmapTT);
- BitBlt(lpdi->hDC, lpdi->rcItem.left, lpdi->rcItem.top,
- bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
- SelectObject(hMemDC, hBitmap);
- DeleteDC(hMemDC);
- }
-#endif
- break;
- case cmb2:
- case cmb3: /* TRACE(commdlg,"WM_DRAWITEN cmb2,cmb3\n"); */
- SendMessageA(lpdi->hwndItem, CB_GETLBTEXT, lpdi->itemID,
- (LPARAM)buffer);
- TextOutA(lpdi->hDC, lpdi->rcItem.left,
- lpdi->rcItem.top, buffer, lstrlenA(buffer));
- break;
-
- case cmb4: /* TRACE(commdlg,"WM_DRAWITEM cmb4 (=COLOR)\n"); */
- SendMessageA(lpdi->hwndItem, CB_GETLBTEXT, lpdi->itemID,
- (LPARAM)buffer);
- TextOutA(lpdi->hDC, lpdi->rcItem.left + 25+5,
- lpdi->rcItem.top, buffer, lstrlenA(buffer));
- cr = SendMessageA(lpdi->hwndItem, CB_GETITEMDATA, lpdi->itemID,0L);
- hBrush = CreateSolidBrush(cr);
- if (hBrush)
- {
- hBrush = SelectObject (lpdi->hDC, hBrush) ;
- rect.right=rect.left+25;
- rect.top++;
- rect.left+=5;
- rect.bottom--;
- Rectangle( lpdi->hDC, rect.left, rect.top,
- rect.right, rect.bottom );
- DeleteObject( SelectObject (lpdi->hDC, hBrush)) ;
- }
- rect=lpdi->rcItem;
- rect.left+=25+5;
- break;
-
- default: return TRUE; /* this should never happen */
- }
- if (lpdi->itemState == ODS_SELECTED)
- {
- SetTextColor(lpdi->hDC, oldText);
- SetBkColor(lpdi->hDC, oldBk);
- }
- }
- return TRUE;
-}
-
-/***********************************************************************
- * CFn_WMCtlColor [internal]
- */
-LRESULT CFn_WMCtlColorStatic(HWND hDlg, WPARAM wParam, LPARAM lParam,
- LPCHOOSEFONTA lpcf)
-{
- if (lpcf->Flags & CF_EFFECTS)
- if (GetDlgCtrlID(lParam)==stc6)
- {
- SetTextColor((HDC)wParam, lpcf->rgbColors);
- return GetStockObject(WHITE_BRUSH);
- }
- return 0;
-}
-
-/***********************************************************************
- * CFn_WMCommand [internal]
- */
-LRESULT CFn_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam,
- LPCHOOSEFONTA lpcf)
-{
- HFONT hFont;
- int i,j;
- long l;
- HDC hdc;
- LPLOGFONTA lpxx=lpcf->lpLogFont;
-
- TRACE(commdlg,"WM_COMMAND wParam=%08lX lParam=%08lX\n", (LONG)wParam, lParam);
- switch (LOWORD(wParam))
- {
- case cmb1:if (HIWORD(wParam)==CBN_SELCHANGE)
- {
- hdc=(lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC) ? lpcf->hDC : GetDC(hDlg);
- if (hdc)
- {
- SendDlgItemMessageA(hDlg, cmb2, CB_RESETCONTENT16, 0, 0);
- SendDlgItemMessageA(hDlg, cmb3, CB_RESETCONTENT16, 0, 0);
- i=SendDlgItemMessageA(hDlg, cmb1, CB_GETCURSEL16, 0, 0);
- if (i!=CB_ERR)
- {
- HCURSOR hcursor=SetCursor(LoadCursorA(0,IDC_WAITA));
- CFn_ENUMSTRUCT s;
- char str[256];
- SendDlgItemMessageA(hDlg, cmb1, CB_GETLBTEXT, i,
- (LPARAM)str);
- TRACE(commdlg,"WM_COMMAND/cmb1 =>%s\n",str);
- s.hWnd1=GetDlgItem(hDlg, cmb2);
- s.hWnd2=GetDlgItem(hDlg, cmb3);
- s.lpcf32a=lpcf;
- EnumFontFamiliesA(hdc, str, FontStyleEnumProc, (LPARAM)&s);
- SetCursor(hcursor);
- }
- if (!(lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC))
- ReleaseDC(hDlg,hdc);
- }
- else
- {
- WARN(commdlg,"HDC failure !!!\n");
- EndDialog (hDlg, 0);
- return TRUE;
- }
- }
- case chx1:
- case chx2:
- case cmb2:
- case cmb3:if (HIWORD(wParam)==CBN_SELCHANGE || HIWORD(wParam)== BN_CLICKED )
- {
- char str[256];
- TRACE(commdlg,"WM_COMMAND/cmb2,3 =%08lX\n", lParam);
- i=SendDlgItemMessageA(hDlg,cmb1,CB_GETCURSEL,0,0);
- if (i==CB_ERR)
- i=GetDlgItemTextA( hDlg, cmb1, str, 256 );
- else
- {
- SendDlgItemMessageA(hDlg,cmb1,CB_GETLBTEXT,i,
- (LPARAM)str);
- l=SendDlgItemMessageA(hDlg,cmb1,CB_GETITEMDATA,i,0);
- j=HIWORD(l);
- lpcf->nFontType = LOWORD(l);
- /* FIXME: lpcf->nFontType |= .... SIMULATED_FONTTYPE and so */
- /* same value reported to the EnumFonts
- call back with the extra FONTTYPE_... bits added */
- lpxx->lfPitchAndFamily=j&0xff;
- lpxx->lfCharSet=j>>8;
- }
- strcpy(lpxx->lfFaceName,str);
- i=SendDlgItemMessageA(hDlg, cmb2, CB_GETCURSEL, 0, 0);
- if (i!=CB_ERR)
- {
- l=SendDlgItemMessageA(hDlg, cmb2, CB_GETITEMDATA, i, 0);
- if (0!=(lpxx->lfItalic=HIWORD(l)))
- lpcf->nFontType |= ITALIC_FONTTYPE;
- if ((lpxx->lfWeight=LOWORD(l)) > FW_MEDIUM)
- lpcf->nFontType |= BOLD_FONTTYPE;
- }
- i=SendDlgItemMessageA(hDlg, cmb3, CB_GETCURSEL, 0, 0);
- if (i!=CB_ERR)
- lpxx->lfHeight=-LOWORD(SendDlgItemMessageA(hDlg, cmb3, CB_GETITEMDATA, i, 0));
- else
- lpxx->lfHeight=0;
- lpxx->lfStrikeOut=IsDlgButtonChecked(hDlg,chx1);
- lpxx->lfUnderline=IsDlgButtonChecked(hDlg,chx2);
- lpxx->lfWidth=lpxx->lfOrientation=lpxx->lfEscapement=0;
- lpxx->lfOutPrecision=OUT_DEFAULT_PRECIS;
- lpxx->lfClipPrecision=CLIP_DEFAULT_PRECIS;
- lpxx->lfQuality=DEFAULT_QUALITY;
- lpcf->iPointSize= -10*lpxx->lfHeight;
-
- hFont=CreateFontIndirectA(lpxx);
- if (hFont)
- {
- HFONT oldFont=SendDlgItemMessageA(hDlg, stc6,
- WM_GETFONT, 0, 0);
- SendDlgItemMessageA(hDlg,stc6,WM_SETFONT,hFont,TRUE);
- DeleteObject(oldFont);
- }
- }
- break;
-
- case cmb4:i=SendDlgItemMessageA(hDlg, cmb4, CB_GETCURSEL, 0, 0);
- if (i!=CB_ERR)
- {
- lpcf->rgbColors=textcolors[i];
- InvalidateRect( GetDlgItem(hDlg,stc6), NULL, 0 );
- }
- break;
-
- case psh15:i=RegisterWindowMessageA( HELPMSGSTRING );
- if (lpcf->hwndOwner)
- SendMessageA(lpcf->hwndOwner, i, 0, (LPARAM)GetWindowLongA(hDlg, DWL_USER));
-/* if (CFn_HookCallChk(lpcf))
- CallWindowProc16(lpcf->lpfnHook,hDlg,WM_COMMAND,psh15,(LPARAM)lpcf);*/
- break;
-
- case IDOK:if ( (!(lpcf->Flags & CF_LIMITSIZE)) ||
- ( (lpcf->Flags & CF_LIMITSIZE) &&
- (-lpxx->lfHeight >= lpcf->nSizeMin) &&
- (-lpxx->lfHeight <= lpcf->nSizeMax)))
- EndDialog(hDlg, TRUE);
- else
- {
- char buffer[80];
- sprintf(buffer,"Select a font size between %d and %d points.",
- lpcf->nSizeMin,lpcf->nSizeMax);
- MessageBoxA(hDlg, buffer, NULL, MB_OK);
- }
- return(TRUE);
- case IDCANCEL:EndDialog(hDlg, FALSE);
- return(TRUE);
- }
- return(FALSE);
-}
-
-static LRESULT CFn_WMDestroy(HWND hwnd, WPARAM wParam, LPARAM lParam)
-{
- DeleteObject(SendDlgItemMessageA(hwnd, stc6, WM_GETFONT, 0, 0));
- return TRUE;
-}
-
-
-/***********************************************************************
- * FormatCharDlgProc16 (COMMDLG.16)
- FIXME: 1. some strings are "hardcoded", but it's better load from sysres
- 2. some CF_.. flags are not supported
- 3. some TType extensions
- */
-LRESULT WINAPI FormatCharDlgProc16(HWND16 hDlg, UINT16 message, WPARAM16 wParam,
- LPARAM lParam)
-{
- LPCHOOSEFONT16 lpcf;
- LPCHOOSEFONTA lpcf32a;
- UINT uMsg32;
- WPARAM wParam32;
- LRESULT res=0;
- if (message!=WM_INITDIALOG)
- {
- lpcf=(LPCHOOSEFONT16)GetWindowLongA(hDlg, DWL_USER);
- if (!lpcf)
- return FALSE;
- if (CFn_HookCallChk(lpcf))
- res=CallWindowProc16(lpcf->lpfnHook,hDlg,message,wParam,lParam);
- if (res)
- return res;
- }
- else
- {
- lpcf=(LPCHOOSEFONT16)lParam;
- lpcf32a=(LPCHOOSEFONTA)lpcf->lpTemplateName;
- if (!CFn_WMInitDialog(hDlg, wParam, lParam, lpcf32a))
- {
- TRACE(commdlg, "CFn_WMInitDialog returned FALSE\n");
- return FALSE;
- }
- if (CFn_HookCallChk(lpcf))
- return CallWindowProc16(lpcf->lpfnHook,hDlg,WM_INITDIALOG,wParam,lParam);
- }
- WINPROC_MapMsg16To32A(message, wParam, &uMsg32, &wParam32, &lParam);
- lpcf32a=(LPCHOOSEFONTA)lpcf->lpTemplateName;
- switch (uMsg32)
- {
- case WM_MEASUREITEM:
- res=CFn_WMMeasureItem(hDlg, wParam32, lParam);
- break;
- case WM_DRAWITEM:
- res=CFn_WMDrawItem(hDlg, wParam32, lParam);
- break;
- case WM_CTLCOLORSTATIC:
- res=CFn_WMCtlColorStatic(hDlg, wParam32, lParam, lpcf32a);
- break;
- case WM_COMMAND:
- res=CFn_WMCommand(hDlg, wParam32, lParam, lpcf32a);
- break;
- case WM_DESTROY:
- res=CFn_WMDestroy(hDlg, wParam32, lParam);
- break;
- case WM_CHOOSEFONT_GETLOGFONT:
- TRACE(commdlg,"WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n",
- lParam);
- FIXME(commdlg, "current logfont back to caller\n");
- break;
- }
- WINPROC_UnmapMsg16To32A(hDlg,uMsg32, wParam32, lParam, res);
- return res;
-}
-
-/***********************************************************************
- * FormatCharDlgProc32A [internal]
- */
-LRESULT WINAPI FormatCharDlgProcA(HWND hDlg, UINT uMsg, WPARAM wParam,
- LPARAM lParam)
-{
- LPCHOOSEFONTA lpcf;
- LRESULT res=FALSE;
- if (uMsg!=WM_INITDIALOG)
- {
- lpcf=(LPCHOOSEFONTA)GetWindowLongA(hDlg, DWL_USER);
- if (!lpcf)
- return FALSE;
- if (CFn_HookCallChk32(lpcf))
- res=CallWindowProcA(lpcf->lpfnHook, hDlg, uMsg, wParam, lParam);
- if (res)
- return res;
- }
- else
- {
- lpcf=(LPCHOOSEFONTA)lParam;
- if (!CFn_WMInitDialog(hDlg, wParam, lParam, lpcf))
- {
- TRACE(commdlg, "CFn_WMInitDialog returned FALSE\n");
- return FALSE;
- }
- if (CFn_HookCallChk32(lpcf))
- return CallWindowProcA(lpcf->lpfnHook,hDlg,WM_INITDIALOG,wParam,lParam);
- }
- switch (uMsg)
- {
- case WM_MEASUREITEM:
- return CFn_WMMeasureItem(hDlg, wParam, lParam);
- case WM_DRAWITEM:
- return CFn_WMDrawItem(hDlg, wParam, lParam);
- case WM_CTLCOLORSTATIC:
- return CFn_WMCtlColorStatic(hDlg, wParam, lParam, lpcf);
- case WM_COMMAND:
- return CFn_WMCommand(hDlg, wParam, lParam, lpcf);
- case WM_DESTROY:
- return CFn_WMDestroy(hDlg, wParam, lParam);
- case WM_CHOOSEFONT_GETLOGFONT:
- TRACE(commdlg,"WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n",
- lParam);
- FIXME(commdlg, "current logfont back to caller\n");
- break;
- }
- return res;
-}
-
-/***********************************************************************
- * FormatCharDlgProc32W [internal]
- */
-LRESULT WINAPI FormatCharDlgProcW(HWND hDlg, UINT uMsg, WPARAM wParam,
- LPARAM lParam)
-{
- LPCHOOSEFONTW lpcf32w;
- LPCHOOSEFONTA lpcf32a;
- LRESULT res=FALSE;
- if (uMsg!=WM_INITDIALOG)
- {
- lpcf32w=(LPCHOOSEFONTW)GetWindowLongA(hDlg, DWL_USER);
- if (!lpcf32w)
- return FALSE;
- if (CFn_HookCallChk32((LPCHOOSEFONTA)lpcf32w))
- res=CallWindowProcW(lpcf32w->lpfnHook, hDlg, uMsg, wParam, lParam);
- if (res)
- return res;
- }
- else
- {
- lpcf32w=(LPCHOOSEFONTW)lParam;
- lpcf32a=(LPCHOOSEFONTA)lpcf32w->lpTemplateName;
- if (!CFn_WMInitDialog(hDlg, wParam, lParam, lpcf32a))
- {
- TRACE(commdlg, "CFn_WMInitDialog returned FALSE\n");
- return FALSE;
- }
- if (CFn_HookCallChk32((LPCHOOSEFONTA)lpcf32w))
- return CallWindowProcW(lpcf32w->lpfnHook,hDlg,WM_INITDIALOG,wParam,lParam);
- }
- lpcf32a=(LPCHOOSEFONTA)lpcf32w->lpTemplateName;
- switch (uMsg)
- {
- case WM_MEASUREITEM:
- return CFn_WMMeasureItem(hDlg, wParam, lParam);
- case WM_DRAWITEM:
- return CFn_WMDrawItem(hDlg, wParam, lParam);
- case WM_CTLCOLORSTATIC:
- return CFn_WMCtlColorStatic(hDlg, wParam, lParam, lpcf32a);
- case WM_COMMAND:
- return CFn_WMCommand(hDlg, wParam, lParam, lpcf32a);
- case WM_DESTROY:
- return CFn_WMDestroy(hDlg, wParam, lParam);
- case WM_CHOOSEFONT_GETLOGFONT:
- TRACE(commdlg,"WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n",
- lParam);
- FIXME(commdlg, "current logfont back to caller\n");
- break;
- }
- return res;
-}
-
-
-static BOOL Commdlg_GetFileNameA( BOOL16 (CALLBACK *dofunction)(SEGPTR x),
- LPOPENFILENAMEA ofn )
-{
- BOOL16 ret;
- LPOPENFILENAME16 ofn16 = SEGPTR_ALLOC(sizeof(OPENFILENAME16));
-
- memset(ofn16,'\0',sizeof(*ofn16));
- ofn16->lStructSize = sizeof(*ofn16);
- ofn16->hwndOwner = ofn->hwndOwner;
- ofn16->hInstance = MapHModuleLS(ofn->hInstance);
- if (ofn->lpstrFilter) {
- LPSTR s,x;
-
- /* filter is a list... title\0ext\0......\0\0 */
- s = (LPSTR)ofn->lpstrFilter;
- while (*s)
- s = s+strlen(s)+1;
- s++;
- x = (LPSTR)SEGPTR_ALLOC(s-ofn->lpstrFilter);
- memcpy(x,ofn->lpstrFilter,s-ofn->lpstrFilter);
- ofn16->lpstrFilter = SEGPTR_GET(x);
- }
- if (ofn->lpstrCustomFilter) {
- LPSTR s,x;
-
- /* filter is a list... title\0ext\0......\0\0 */
- s = (LPSTR)ofn->lpstrCustomFilter;
- while (*s)
- s = s+strlen(s)+1;
- s++;
- x = SEGPTR_ALLOC(s-ofn->lpstrCustomFilter);
- memcpy(x,ofn->lpstrCustomFilter,s-ofn->lpstrCustomFilter);
- ofn16->lpstrCustomFilter = SEGPTR_GET(x);
- }
- ofn16->nMaxCustFilter = ofn->nMaxCustFilter;
- ofn16->nFilterIndex = ofn->nFilterIndex;
- if (ofn->nMaxFile)
- ofn16->lpstrFile = SEGPTR_GET(SEGPTR_ALLOC(ofn->nMaxFile));
- ofn16->nMaxFile = ofn->nMaxFile;
- ofn16->nMaxFileTitle = ofn->nMaxFileTitle;
- if (ofn16->nMaxFileTitle)
- ofn16->lpstrFileTitle = SEGPTR_GET(SEGPTR_ALLOC(ofn->nMaxFileTitle));
- if (ofn->lpstrInitialDir)
- ofn16->lpstrInitialDir = SEGPTR_GET(SEGPTR_STRDUP(ofn->lpstrInitialDir));
- if (ofn->lpstrTitle)
- ofn16->lpstrTitle = SEGPTR_GET(SEGPTR_STRDUP(ofn->lpstrTitle));
- ofn16->Flags = ofn->Flags|OFN_WINE;
- ofn16->nFileOffset = ofn->nFileOffset;
- ofn16->nFileExtension = ofn->nFileExtension;
- if (ofn->lpstrDefExt)
- ofn16->lpstrDefExt = SEGPTR_GET(SEGPTR_STRDUP(ofn->lpstrDefExt));
- ofn16->lCustData = ofn->lCustData;
- ofn16->lpfnHook = (WNDPROC16)ofn->lpfnHook;
-
- if (ofn->lpTemplateName)
- ofn16->lpTemplateName = SEGPTR_GET(SEGPTR_STRDUP(ofn->lpTemplateName));
-
- ret = dofunction(SEGPTR_GET(ofn16));
-
- ofn->nFileOffset = ofn16->nFileOffset;
- ofn->nFileExtension = ofn16->nFileExtension;
- if (ofn16->lpstrFilter)
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFilter));
- if (ofn16->lpTemplateName)
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpTemplateName));
- if (ofn16->lpstrDefExt)
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrDefExt));
- if (ofn16->lpstrTitle)
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrTitle));
- if (ofn16->lpstrInitialDir)
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrInitialDir));
- if (ofn16->lpstrCustomFilter)
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrCustomFilter));
-
- if (ofn16->lpstrFile)
- {
- strcpy(ofn->lpstrFile,PTR_SEG_TO_LIN(ofn16->lpstrFile));
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFile));
- }
-
- if (ofn16->lpstrFileTitle)
- {
- strcpy(ofn->lpstrFileTitle,PTR_SEG_TO_LIN(ofn16->lpstrFileTitle));
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFileTitle));
- }
- SEGPTR_FREE(ofn16);
- return ret;
-}
-
-static BOOL Commdlg_GetFileNameW( BOOL16 (CALLBACK *dofunction)(SEGPTR x),
- LPOPENFILENAMEW ofn )
-{
- BOOL16 ret;
- LPOPENFILENAME16 ofn16 = SEGPTR_ALLOC(sizeof(OPENFILENAME16));
-
- memset(ofn16,'\0',sizeof(*ofn16));
- ofn16->lStructSize = sizeof(*ofn16);
- ofn16->hwndOwner = ofn->hwndOwner;
- ofn16->hInstance = MapHModuleLS(ofn->hInstance);
- if (ofn->lpstrFilter) {
- LPWSTR s;
- LPSTR x,y;
- int n;
-
- /* filter is a list... title\0ext\0......\0\0 */
- s = (LPWSTR)ofn->lpstrFilter;
- while (*s)
- s = s+lstrlenW(s)+1;
- s++;
- n = s - ofn->lpstrFilter; /* already divides by 2. ptr magic */
- x = y = (LPSTR)SEGPTR_ALLOC(n);
- s = (LPWSTR)ofn->lpstrFilter;
- while (*s) {
- lstrcpyWtoA(x,s);
- x+=lstrlenA(x)+1;
- s+=lstrlenW(s)+1;
- }
- *x=0;
- ofn16->lpstrFilter = SEGPTR_GET(y);
-}
- if (ofn->lpstrCustomFilter) {
- LPWSTR s;
- LPSTR x,y;
- int n;
-
- /* filter is a list... title\0ext\0......\0\0 */
- s = (LPWSTR)ofn->lpstrCustomFilter;
- while (*s)
- s = s+lstrlenW(s)+1;
- s++;
- n = s - ofn->lpstrCustomFilter;
- x = y = (LPSTR)SEGPTR_ALLOC(n);
- s = (LPWSTR)ofn->lpstrCustomFilter;
- while (*s) {
- lstrcpyWtoA(x,s);
- x+=lstrlenA(x)+1;
- s+=lstrlenW(s)+1;
- }
- *x=0;
- ofn16->lpstrCustomFilter = SEGPTR_GET(y);
- }
- ofn16->nMaxCustFilter = ofn->nMaxCustFilter;
- ofn16->nFilterIndex = ofn->nFilterIndex;
- if (ofn->nMaxFile)
- ofn16->lpstrFile = SEGPTR_GET(SEGPTR_ALLOC(ofn->nMaxFile));
- ofn16->nMaxFile = ofn->nMaxFile;
- ofn16->nMaxFileTitle = ofn->nMaxFileTitle;
- if (ofn->nMaxFileTitle)
- ofn16->lpstrFileTitle = SEGPTR_GET(SEGPTR_ALLOC(ofn->nMaxFileTitle));
- if (ofn->lpstrInitialDir)
- ofn16->lpstrInitialDir = SEGPTR_GET(SEGPTR_STRDUP_WtoA(ofn->lpstrInitialDir));
- if (ofn->lpstrTitle)
- ofn16->lpstrTitle = SEGPTR_GET(SEGPTR_STRDUP_WtoA(ofn->lpstrTitle));
- ofn16->Flags = ofn->Flags|OFN_WINE|OFN_UNICODE;
- ofn16->nFileOffset = ofn->nFileOffset;
- ofn16->nFileExtension = ofn->nFileExtension;
- if (ofn->lpstrDefExt)
- ofn16->lpstrDefExt = SEGPTR_GET(SEGPTR_STRDUP_WtoA(ofn->lpstrDefExt));
- ofn16->lCustData = ofn->lCustData;
- ofn16->lpfnHook = (WNDPROC16)ofn->lpfnHook;
- if (ofn->lpTemplateName)
- ofn16->lpTemplateName = SEGPTR_GET(SEGPTR_STRDUP_WtoA(ofn->lpTemplateName));
- ret = dofunction(SEGPTR_GET(ofn16));
-
- ofn->nFileOffset = ofn16->nFileOffset;
- ofn->nFileExtension = ofn16->nFileExtension;
- if (ofn16->lpstrFilter)
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFilter));
- if (ofn16->lpTemplateName)
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpTemplateName));
- if (ofn16->lpstrDefExt)
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrDefExt));
- if (ofn16->lpstrTitle)
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrTitle));
- if (ofn16->lpstrInitialDir)
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrInitialDir));
- if (ofn16->lpstrCustomFilter)
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrCustomFilter));
-
- if (ofn16->lpstrFile) {
- lstrcpyAtoW(ofn->lpstrFile,PTR_SEG_TO_LIN(ofn16->lpstrFile));
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFile));
- }
-
- if (ofn16->lpstrFileTitle) {
- lstrcpyAtoW(ofn->lpstrFileTitle,PTR_SEG_TO_LIN(ofn16->lpstrFileTitle));
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFileTitle));
- }
- SEGPTR_FREE(ofn16);
- return ret;
-}
-
-/***********************************************************************
- * GetOpenFileName32A (COMDLG32.10)
- */
-BOOL WINAPI GetOpenFileNameA( LPOPENFILENAMEA ofn )
-{
- BOOL16 (CALLBACK * dofunction)(SEGPTR ofn16) = GetOpenFileName16;
- return Commdlg_GetFileNameA(dofunction,ofn);
-}
-
-/***********************************************************************
- * GetOpenFileName32W (COMDLG32.11)
- */
-BOOL WINAPI GetOpenFileNameW( LPOPENFILENAMEW ofn )
-{
- BOOL16 (CALLBACK * dofunction)(SEGPTR ofn16) = GetOpenFileName16;
- return Commdlg_GetFileNameW(dofunction,ofn);
-}
-
-/***********************************************************************
- * GetSaveFileName32A (COMDLG32.12)
- */
-BOOL WINAPI GetSaveFileNameA( LPOPENFILENAMEA ofn )
-{
- BOOL16 (CALLBACK * dofunction)(SEGPTR ofn16) = GetSaveFileName16;
- return Commdlg_GetFileNameA(dofunction,ofn);
-}
-
-/***********************************************************************
- * GetSaveFileName32W (COMDLG32.13)
- */
-BOOL WINAPI GetSaveFileNameW( LPOPENFILENAMEW ofn )
-{
- BOOL16 (CALLBACK * dofunction)(SEGPTR ofn16) = GetSaveFileName16;
- return Commdlg_GetFileNameW(dofunction,ofn);
-}
-
-/***********************************************************************
- * ChooseColorA (COMDLG32.1)
- */
-BOOL WINAPI ChooseColorA(LPCHOOSECOLORA lpChCol )
-
-{
- BOOL16 ret;
- char *str = NULL;
- COLORREF* ccref=SEGPTR_ALLOC(64);
- LPCHOOSECOLOR16 lpcc16=SEGPTR_ALLOC(sizeof(CHOOSECOLOR16));
-
- memset(lpcc16,'\0',sizeof(*lpcc16));
- lpcc16->lStructSize=sizeof(*lpcc16);
- lpcc16->hwndOwner=lpChCol->hwndOwner;
- lpcc16->hInstance=MapHModuleLS(lpChCol->hInstance);
- lpcc16->rgbResult=lpChCol->rgbResult;
- memcpy(ccref,lpChCol->lpCustColors,64);
- lpcc16->lpCustColors=(COLORREF*)SEGPTR_GET(ccref);
- lpcc16->Flags=lpChCol->Flags;
- lpcc16->lCustData=lpChCol->lCustData;
- lpcc16->lpfnHook=(WNDPROC16)lpChCol->lpfnHook;
- if (lpChCol->lpTemplateName)
- str = SEGPTR_STRDUP(lpChCol->lpTemplateName );
- lpcc16->lpTemplateName=SEGPTR_GET(str);
-
- ret = ChooseColor16(lpcc16);
-
- if(ret)
- lpChCol->rgbResult = lpcc16->rgbResult;
-
- if(str)
- SEGPTR_FREE(str);
- memcpy(lpChCol->lpCustColors,ccref,64);
- SEGPTR_FREE(ccref);
- SEGPTR_FREE(lpcc16);
- return (BOOL)ret;
-}
-
-/***********************************************************************
- * ChooseColorW (COMDLG32.2)
- */
-BOOL WINAPI ChooseColorW(LPCHOOSECOLORW lpChCol )
-
-{
- BOOL16 ret;
- char *str = NULL;
- COLORREF* ccref=SEGPTR_ALLOC(64);
- LPCHOOSECOLOR16 lpcc16=SEGPTR_ALLOC(sizeof(CHOOSECOLOR16));
-
- memset(lpcc16,'\0',sizeof(*lpcc16));
- lpcc16->lStructSize=sizeof(*lpcc16);
- lpcc16->hwndOwner=lpChCol->hwndOwner;
- lpcc16->hInstance=MapHModuleLS(lpChCol->hInstance);
- lpcc16->rgbResult=lpChCol->rgbResult;
- memcpy(ccref,lpChCol->lpCustColors,64);
- lpcc16->lpCustColors=(COLORREF*)SEGPTR_GET(ccref);
- lpcc16->Flags=lpChCol->Flags;
- lpcc16->lCustData=lpChCol->lCustData;
- lpcc16->lpfnHook=(WNDPROC16)lpChCol->lpfnHook;
- if (lpChCol->lpTemplateName)
- str = SEGPTR_STRDUP_WtoA(lpChCol->lpTemplateName );
- lpcc16->lpTemplateName=SEGPTR_GET(str);
-
- ret = ChooseColor16(lpcc16);
-
- if(ret)
- lpChCol->rgbResult = lpcc16->rgbResult;
-
- if(str)
- SEGPTR_FREE(str);
- memcpy(lpChCol->lpCustColors,ccref,64);
- SEGPTR_FREE(ccref);
- SEGPTR_FREE(lpcc16);
- return (BOOL)ret;
-}
-
-/***********************************************************************
- * PageSetupDlgA (COMDLG32.15)
- */
-BOOL WINAPI PageSetupDlgA(LPPAGESETUPDLGA setupdlg) {
- FIXME(commdlg,"(%p), stub!\n",setupdlg);
- return FALSE;
-}