mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
508 lines
14 KiB
508 lines
14 KiB
/****************************Module*Header******************************\
|
|
* Copyright (c) 1987 - 1991 Microsoft Corporation *
|
|
\***********************************************************************/
|
|
/********************************************************
|
|
* *
|
|
* file: NEWDLG.c *
|
|
* system: PC Paintbrush for MS-Windows *
|
|
* descr: New common dialog interface *
|
|
* date: 12/23/90 @ 15:12 *
|
|
* *
|
|
********************************************************/
|
|
|
|
#define NOWINSTYLES
|
|
#define NODRAWFRAME
|
|
#define NOKEYSTATES
|
|
#define NOSOUND
|
|
#define NOCOMM
|
|
#define NOKANJI
|
|
#define NOHELP
|
|
#define NOPROFILER
|
|
#define PRINTERDLG
|
|
|
|
#include <windows.h>
|
|
#include <port1632.h>
|
|
|
|
#include "dlgs.h"
|
|
#include "pbrush.h"
|
|
|
|
#include "pbserver.h"
|
|
|
|
/* variables for the new File Open,File SaveAs and Find Text dialogs */
|
|
OPENFILENAME OFN;
|
|
|
|
static TCHAR szTemplate [CAPTIONMAX];
|
|
static TCHAR szTitle [CAPTIONMAX];
|
|
static TCHAR szFileName [MAX_PATH];
|
|
static TCHAR szLastDir [MAX_PATH];
|
|
static TCHAR szSaveFilter[FILTERMAX * 6]; /* default filter spec. for above */
|
|
static TCHAR szOpenFilter[FILTERMAX * 4];
|
|
static TCHAR szColorFilter[FILTERMAX * 2];
|
|
static TCHAR szCustFilterSpec[FILTERMAX]; /* buffer for custom filters created */
|
|
|
|
/* captions for dialog boxes with DS_MODALFRAME ATTRIBUTES */
|
|
static UINT DialogCaption[] = { IDSSaveAs, IDSFileOpen, IDSPasteFrom,
|
|
IDSCopyTo, IDSGetColors, IDSSaveColors };
|
|
static int Dialog[] = { FileSave, FileOpen, FileOpen,
|
|
FileSave, FileOpen, FileSave };
|
|
static TCHAR *Filter[] = { szSaveFilter, szOpenFilter, szOpenFilter,
|
|
szSaveFilter, szColorFilter, szColorFilter };
|
|
|
|
static TCHAR *OpenExt[] = { TEXT("*.BMP;*.DIB"), TEXT("*.MSP"), TEXT("*.PCX"), TEXT("*.*") };
|
|
static TCHAR OpenExtDef[4] = { TEXT('\0') };
|
|
static TCHAR *SaveExt[] = { TEXT("*.PCX"), TEXT("*.BMP"), TEXT("*.BMP"), TEXT("*.BMP"), TEXT("*.BMP") };
|
|
static TCHAR *ColorExt[] = { TEXT("*.PAL") };
|
|
|
|
extern WORD wFileType;
|
|
extern int fileMode;
|
|
extern TCHAR *namePtr, *pathPtr;
|
|
extern int DlgCaptionNo;
|
|
extern BITMAPFILEHEADER_VER1 BitmapHeader;
|
|
extern RECT pickRect;
|
|
extern int imagePlanes, imagePixels;
|
|
extern int imageWid, imageHgt;
|
|
|
|
#ifndef WIN32
|
|
typedef unsigned int * PUINT;
|
|
#endif
|
|
|
|
static void LoadFilters(LPTSTR pszFilter, PUINT Id, LPTSTR Extension[]);
|
|
static void ParseFileName(LPTSTR szTemp);
|
|
|
|
/* This is also in FileDlg.C */
|
|
BOOL PRIVATE MyStrChr(TCHAR *s, TCHAR *t)
|
|
{
|
|
TCHAR *pt;
|
|
|
|
for( ; *s; ++s)
|
|
for(pt = t; *pt; ++pt)
|
|
if(*s == *pt)
|
|
return TRUE;
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL PUBLIC InitNewDialogs(HINSTANCE hInst) {
|
|
/* construct default filter string in the required format for
|
|
* the new FileOpen and FileSaveAs dialogs. Pretty brutish...
|
|
*/
|
|
static UINT OpenIds[] = { IDS_BMPFILTER, IDS_MSPFILTER, IDS_PCXFILTER, IDS_ALLFILTER, 0 };
|
|
static UINT ColorIds[] = { IDS_COLORFILTER, 0 };
|
|
static UINT SaveIds[] = { IDS_PCXFILTER, IDS_MONOBMPFILTER,
|
|
IDS_16COLORFILTER, IDS_256COLORFILTER, IDS_24BITFILTER, 0 };
|
|
|
|
LoadFilters(szOpenFilter, OpenIds, OpenExt);
|
|
LoadFilters(szColorFilter, ColorIds, ColorExt);
|
|
LoadFilters(szSaveFilter, SaveIds, SaveExt);
|
|
|
|
*szCustFilterSpec = TEXT('\0');
|
|
|
|
/* init. some fields of the OPENFILENAME struct used by fileopen and
|
|
* filesaveas
|
|
*/
|
|
OFN.lStructSize = sizeof(OPENFILENAME);
|
|
OFN.hInstance = hInst;
|
|
OFN.nMaxCustFilter = FILTERMAX;
|
|
OFN.nFilterIndex = 1;
|
|
OFN.nMaxFile = MAX_PATH;
|
|
#ifndef WIN32
|
|
OFN.lpfnHook = (LPOFNHOOKPROC)MakeProcInstance((FARPROC)FileDialog, hInst);
|
|
#else
|
|
OFN.lpfnHook = (LPOFNHOOKPROC)FileDialog;
|
|
#endif
|
|
OFN.lCustData = 0L;
|
|
OFN.lpstrDefExt = OpenExtDef;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
void ParseFileName(LPTSTR pszFullName) {
|
|
LPTSTR pszFileName;
|
|
LPTSTR pszBackslash;
|
|
|
|
/* Locate the last backslash. "C:<filename>" isn't possible. */
|
|
pszBackslash = NULL;
|
|
pszFileName = pszFullName;
|
|
while (*pszFileName) {
|
|
if (*pszFileName == TEXT('\\'))
|
|
pszBackslash = pszFileName;
|
|
pszFileName = CharNext(pszFileName);
|
|
}
|
|
|
|
/* Save away the file name and path */
|
|
if (pszBackslash) {
|
|
*pszBackslash = (TCHAR) 0;
|
|
lstrcpy(pathPtr, pszFullName);
|
|
|
|
DB_OUTS(pathPtr);
|
|
lstrcpy(namePtr, pszBackslash + 1);
|
|
|
|
DB_OUTS(namePtr);
|
|
*pszBackslash = TEXT('\\');
|
|
|
|
/* Special case for the root path specified */
|
|
if( pathPtr[ 1 ] == TEXT(':') && (pathPtr[ 2 ] == TEXT('\0'))) {
|
|
pathPtr[ 2 ] = TEXT('\\');
|
|
pathPtr[ 3 ] = TEXT('\0');
|
|
}
|
|
} else {
|
|
*pathPtr = (TCHAR) 0;
|
|
lstrcpy(namePtr, pszFullName);
|
|
}
|
|
}
|
|
|
|
|
|
BOOL NEAR PASCAL GetExtFromInd(int i)
|
|
{
|
|
LPTSTR lpstrFilter;
|
|
|
|
/* Skip to the appropriate filter */
|
|
lpstrFilter = (LPTSTR)OFN.lpstrFilter;
|
|
goto CheckFilter;
|
|
|
|
do {
|
|
lpstrFilter += lstrlen(lpstrFilter)+1;
|
|
lpstrFilter += lstrlen(lpstrFilter)+1;
|
|
|
|
CheckFilter:
|
|
if (!*lpstrFilter)
|
|
return(FALSE);
|
|
} while (i--) ;
|
|
|
|
/* If we got to the filter, retrieve the extension */
|
|
/* Skip past the "*." */
|
|
lpstrFilter += lstrlen(lpstrFilter)+3;
|
|
|
|
/* Copy the extension, if not wildcard. */
|
|
if (*lpstrFilter == TEXT('*'))
|
|
return(FALSE);
|
|
|
|
for (i=0; i<3; ++i, ++lpstrFilter)
|
|
{
|
|
if (!*lpstrFilter || *lpstrFilter==TEXT(';'))
|
|
break;
|
|
OpenExtDef[i] = *lpstrFilter;
|
|
}
|
|
OpenExtDef[i] = TEXT('\0');
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
static void NEAR PASCAL DisplayFileInfo(HWND hDlg)
|
|
{
|
|
TCHAR s[MAX_PATH];
|
|
int i;
|
|
|
|
if (!GetDlgItemText(hDlg, edt1, s, CharSizeOf(s)))
|
|
return;
|
|
CharUpper(s);
|
|
|
|
switch (DlgCaptionNo)
|
|
{
|
|
case COPYTO:
|
|
BitmapHeader.wid = abs(pickRect.right - pickRect.left + 1);
|
|
BitmapHeader.hgt = abs(pickRect.bottom - pickRect.top + 1);
|
|
BitmapHeader.planes = (BYTE) imagePlanes;
|
|
BitmapHeader.bitcount = (BYTE) imagePixels;
|
|
i = 1;
|
|
break;
|
|
|
|
case FILESAVE:
|
|
BitmapHeader.wid = imageWid;
|
|
BitmapHeader.hgt = imageHgt;
|
|
BitmapHeader.planes = (BYTE)imagePlanes;
|
|
BitmapHeader.bitcount = (BYTE)imagePixels;
|
|
i = 1;
|
|
break;
|
|
|
|
default:
|
|
if (MyStrChr(s, TEXT("*?"))) /* Wild card... */
|
|
return;
|
|
|
|
switch (PBGetFileType(s))
|
|
{
|
|
case BITMAPFILE:
|
|
case BITMAPFILE4:
|
|
case BITMAPFILE8:
|
|
case BITMAPFILE24:
|
|
i = GetBitmapInfo(hDlg);
|
|
break;
|
|
|
|
case MSPFILE:
|
|
i = GetMSPInfo(hDlg);
|
|
break;
|
|
|
|
default:
|
|
i = GetInfo(hDlg);
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
if (i)
|
|
{
|
|
i = wFileType;
|
|
wFileType = ((DlgCaptionNo == COPYTO) || (DlgCaptionNo == FILESAVE))
|
|
? BITMAPFILE
|
|
: PBGetFileType(s);
|
|
DoDialog(INFOBOX, hDlg, (WNDPROC)InfoDlg);
|
|
wFileType = i;
|
|
}
|
|
}
|
|
|
|
|
|
/* Change the extension on a file name in the save dialog box
|
|
*/
|
|
void NEAR PASCAL NewExtension(HWND hDlg, int i)
|
|
{
|
|
TCHAR szName[MAX_PATH];
|
|
|
|
GetDlgItemText(hDlg, edt1, szName, sizeof(szName));
|
|
ReplaceExtension(szName, i);
|
|
SetDlgItemText(hDlg, edt1, szName);
|
|
}
|
|
|
|
|
|
/* This is now a subclass of the standard file dialog routine */
|
|
BOOL FAR PASCAL FileDialog(HWND hDlg, UINT message, WPARAM wParam, LONG lParam)
|
|
{
|
|
int i;
|
|
#ifdef JAPAN // added by Hiraisi (BUGFIX #1856 WIN31)
|
|
static TCHAR s[_MAX_PATH];
|
|
BOOL PUBLIC bFileExists(LPTSTR lpFilename);
|
|
#endif
|
|
|
|
switch (message)
|
|
{
|
|
case WM_COMMAND:
|
|
switch (GET_WM_COMMAND_ID(wParam,lParam))
|
|
{
|
|
case cmb1:
|
|
if (GET_WM_COMMAND_CMD(wParam,lParam) == CBN_SELCHANGE)
|
|
{
|
|
GetExtFromInd(i=(int)SendDlgItemMessage(hDlg, cmb1,
|
|
CB_GETCURSEL, 0, 0L));
|
|
|
|
if (DlgCaptionNo==COPYTO || DlgCaptionNo==FILESAVE)
|
|
NewExtension(hDlg, i);
|
|
}
|
|
break;
|
|
|
|
case IDINFO:
|
|
DisplayFileInfo(hDlg);
|
|
break;
|
|
|
|
#ifdef JAPAN // added by Hiraisi (BUGFIX #1856 WIN31)
|
|
case edt1:
|
|
if (GET_WM_COMMAND_CMD(wParam,lParam) == EN_CHANGE) {
|
|
if ((DlgCaptionNo != COLORLOAD)
|
|
&& (DlgCaptionNo != COLORSAVE)
|
|
&& (DlgCaptionNo != FILESAVE)
|
|
&& (DlgCaptionNo != COPYTO)
|
|
&& (GetDlgItemText(hDlg,edt1,s,FILENAMElen - 1))
|
|
&& bFileExists(s))
|
|
EnableWindow(GetDlgItem(hDlg, IDINFO), TRUE);
|
|
else
|
|
EnableWindow(GetDlgItem(hDlg, IDINFO), FALSE);
|
|
}
|
|
break;
|
|
#endif
|
|
}
|
|
break;
|
|
|
|
case WM_INITDIALOG:
|
|
#ifdef JAPAN // added by Hiraisi (BUGFIX #1856 WIN31)
|
|
if ((DlgCaptionNo != COLORLOAD)
|
|
&& (DlgCaptionNo != COLORSAVE)
|
|
&& (DlgCaptionNo != FILESAVE)
|
|
&& (DlgCaptionNo != COPYTO)
|
|
&& (GetDlgItemText(hDlg,edt1,s,FILENAMElen - 1)
|
|
&& bFileExists(s)))
|
|
EnableWindow(GetDlgItem(hDlg, IDINFO), TRUE);
|
|
else
|
|
EnableWindow(GetDlgItem(hDlg, IDINFO), FALSE);
|
|
#else
|
|
switch (DlgCaptionNo)
|
|
{
|
|
case COLORLOAD:
|
|
case COLORSAVE:
|
|
EnableWindow(GetDlgItem(hDlg, IDINFO), FALSE);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
#endif
|
|
return TRUE;
|
|
break;
|
|
|
|
#ifdef JAPAN // added by Hiraisi (BUGFIX #1856 WIN31)
|
|
case WM_CTLCOLOR:
|
|
if ((DlgCaptionNo != COLORLOAD)
|
|
&& (DlgCaptionNo != COLORSAVE)
|
|
&& (DlgCaptionNo != FILESAVE)
|
|
&& (DlgCaptionNo != COPYTO))
|
|
{
|
|
if (HIWORD(lParam) == CTLCOLOR_STATIC)
|
|
{
|
|
if (GetDlgItemText(hDlg,edt1,s,FILENAMElen - 1)
|
|
&& bFileExists(s))
|
|
EnableWindow(GetDlgItem(hDlg, IDINFO), TRUE);
|
|
else
|
|
EnableWindow(GetDlgItem(hDlg, IDINFO), FALSE);
|
|
}
|
|
}
|
|
break;
|
|
#endif
|
|
default:
|
|
return FALSE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL PUBLIC DoFileDialog(int id, HWND hwnd) {
|
|
REGISTER BOOL result;
|
|
TCHAR szTemp[MAX_PATH];
|
|
DWORD rc;
|
|
|
|
#ifdef BLOCKONMSG
|
|
EnterMsgMode();
|
|
#endif
|
|
/* Set up dialog specific items (title, default filter, ...) */
|
|
LoadString(hInst, DialogCaption[DlgCaptionNo], szTitle, CharSizeOf(szTitle));
|
|
OFN.hwndOwner = hwnd;
|
|
OFN.lpTemplateName = (LPTSTR) MAKEINTRESOURCE(Dialog[DlgCaptionNo]);
|
|
OFN.lpstrFilter = Filter[DlgCaptionNo];
|
|
OFN.lpstrTitle = szTitle;
|
|
OFN.lpstrFileTitle = NULL;
|
|
OFN.lpstrCustomFilter = szCustFilterSpec;
|
|
OFN.lpstrInitialDir = szLastDir;
|
|
OFN.Flags = OFN_ENABLETEMPLATE | OFN_ENABLEHOOK |
|
|
OFN_HIDEREADONLY;
|
|
|
|
OFN.nFilterIndex = 1;
|
|
|
|
switch (DlgCaptionNo) {
|
|
case FILELOAD:
|
|
case PASTEFROM:
|
|
switch (wFileType) {
|
|
case MSPFILE:
|
|
OFN.nFilterIndex = 2;
|
|
break;
|
|
|
|
case PCXFILE:
|
|
OFN.nFilterIndex = 3;
|
|
break;
|
|
}
|
|
|
|
/* Fall through */
|
|
case COLORLOAD:
|
|
OFN.Flags |= OFN_FILEMUSTEXIST;
|
|
break;
|
|
|
|
case COPYTO:
|
|
case FILESAVE:
|
|
{
|
|
HDC hDC;
|
|
WORD twFileType;
|
|
|
|
if (hDC = GetWindowDC(pbrushWnd[PAINTid])) {
|
|
twFileType = GetImageFileType(GetDeviceCaps(hDC, BITSPIXEL)
|
|
* GetDeviceCaps(hDC, PLANES));
|
|
ReleaseDC(pbrushWnd[PAINTid], hDC);
|
|
} else
|
|
twFileType = 1;
|
|
|
|
if (wFileType > twFileType
|
|
&& BITMAPFILE <= wFileType && wFileType <= BITMAPFILE24)
|
|
wFileType = twFileType;
|
|
}
|
|
|
|
/* Set the correct filter index */
|
|
OFN.nFilterIndex = wFileType + 1;
|
|
|
|
/* Fall through */
|
|
case COLORSAVE:
|
|
OFN.Flags |= OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT;
|
|
break;
|
|
}
|
|
|
|
GetExtFromInd(LOWORD(OFN.nFilterIndex)-1);
|
|
|
|
/* Retrieve the starting file name */
|
|
if (vfIsLink)
|
|
lstrcpy(szTemp, namePtr);
|
|
else
|
|
*szTemp = TEXT('\0');
|
|
|
|
OFN.lpstrFile = szTemp;
|
|
|
|
DoFileDialogAgain:
|
|
result = ((Dialog[DlgCaptionNo] == FileOpen)
|
|
? GetOpenFileName((LPOPENFILENAME)&OFN)
|
|
: GetSaveFileName((LPOPENFILENAME)&OFN));
|
|
|
|
rc = CommDlgExtendedError();
|
|
if(rc)
|
|
SimpleMessage(IDSNotEnufMem, NULL, MB_OK|MB_ICONHAND|MB_SYSTEMMODAL);
|
|
|
|
if (result) {
|
|
ParseFileName(szTemp);
|
|
|
|
switch (id) {
|
|
case LOADBOX:
|
|
switch (OFN.nFilterIndex) {
|
|
case 2: wFileType = MSPFILE; break;
|
|
case 3: wFileType = PCXFILE; break;
|
|
default: wFileType = (WORD)PBGetFileType(szTemp); break;
|
|
}
|
|
break;
|
|
|
|
case SAVEBOX:
|
|
/* Don't allow saving of MSP files */
|
|
if (LOWORD(OFN.nFilterIndex) >= 1
|
|
&& LOWORD(OFN.nFilterIndex) <= 5)
|
|
wFileType = (WORD)OFN.nFilterIndex - 1;
|
|
else
|
|
wFileType = PBGetFileType(szTemp);
|
|
|
|
/* Fall through */
|
|
case CLRSVBOX:
|
|
if (!SaveFileNameOK(pathPtr, namePtr))
|
|
{
|
|
lstrcpy(szTemp, namePtr);
|
|
goto DoFileDialogAgain;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
static void LoadFilters(LPTSTR pszFilter, PUINT Id, LPTSTR Extension[])
|
|
{
|
|
while (*Id) {
|
|
LoadString(hInst, *Id, pszFilter, FILTERMAX);
|
|
pszFilter += lstrlen (pszFilter);
|
|
*pszFilter++ = TEXT(' ');
|
|
*pszFilter++ = TEXT('(');
|
|
lstrcpy(pszFilter, *Extension);
|
|
pszFilter += lstrlen (pszFilter);
|
|
*pszFilter++ = TEXT(')');
|
|
*pszFilter++ = 0;
|
|
lstrcpy(pszFilter, *Extension);
|
|
pszFilter += lstrlen(pszFilter) + 1;
|
|
|
|
Id++; Extension++;
|
|
}
|
|
|
|
*pszFilter = TEXT('\0');
|
|
}
|
|
|