mirror of
https://github.com/reactos/reactos.git
synced 2024-08-21 19:03:01 +00:00
260 lines
6.9 KiB
C
260 lines
6.9 KiB
C
/* ----------- fileopen.c ------------- */
|
|
|
|
#include "dflat.h"
|
|
|
|
static BOOL DlgFileOpen(char *, char *, DF_DBOX *);
|
|
static int DlgFnOpen(DFWINDOW, DFMESSAGE, DF_PARAM, DF_PARAM);
|
|
static void InitDlgBox(DFWINDOW);
|
|
static void StripPath(char *);
|
|
static BOOL IncompleteFilename(char *);
|
|
|
|
static char *OrigSpec;
|
|
static char *FileSpec;
|
|
static char *FileName;
|
|
static char *NewFileName;
|
|
|
|
static BOOL Saving;
|
|
extern DF_DBOX FileOpen;
|
|
extern DF_DBOX SaveAs;
|
|
|
|
/*
|
|
* Dialog Box to select a file to open
|
|
*/
|
|
BOOL DfOpenFileDialogBox(char *Fpath, char *Fname)
|
|
{
|
|
return DlgFileOpen(Fpath, Fname, &FileOpen);
|
|
}
|
|
|
|
/*
|
|
* Dialog Box to select a file to save as
|
|
*/
|
|
BOOL DfSaveAsDialogBox(char *Fname)
|
|
{
|
|
return DlgFileOpen(NULL, Fname, &SaveAs);
|
|
}
|
|
|
|
/* --------- generic file open ---------- */
|
|
static BOOL DlgFileOpen(char *Fpath, char *Fname, DF_DBOX *db)
|
|
{
|
|
BOOL rtn;
|
|
char savedir[MAX_PATH];
|
|
char OSpec[80];
|
|
char FSpec[80];
|
|
char FName[80];
|
|
char NewFName[80];
|
|
|
|
OrigSpec = OSpec;
|
|
FileSpec = FSpec;
|
|
FileName = FName;
|
|
NewFileName = NewFName;
|
|
|
|
GetCurrentDirectory (MAX_PATH, savedir);
|
|
|
|
if (Fpath != NULL) {
|
|
strncpy(FileSpec, Fpath, 80);
|
|
Saving = FALSE;
|
|
}
|
|
else {
|
|
*FileSpec = '\0';
|
|
Saving = TRUE;
|
|
}
|
|
strcpy(FileName, FileSpec);
|
|
strcpy(OrigSpec, FileSpec);
|
|
|
|
if ((rtn = DfDialogBox(NULL, db, TRUE, DlgFnOpen)) != FALSE)
|
|
strcpy(Fname, NewFileName);
|
|
else
|
|
*Fname = '\0';
|
|
|
|
SetCurrentDirectory (savedir);
|
|
|
|
return rtn;
|
|
}
|
|
|
|
/*
|
|
* Process dialog box messages
|
|
*/
|
|
static int DlgFnOpen(DFWINDOW wnd,DFMESSAGE msg,DF_PARAM p1,DF_PARAM p2)
|
|
{
|
|
int rtn;
|
|
DF_DBOX *db;
|
|
DFWINDOW cwnd;
|
|
|
|
switch (msg)
|
|
{
|
|
case DFM_CREATE_WINDOW:
|
|
rtn = DfDefaultWndProc(wnd, msg, p1, p2);
|
|
db = wnd->extension;
|
|
cwnd = DfControlWindow(db, DF_ID_FILENAME);
|
|
DfSendMessage(cwnd, DFM_SETTEXTLENGTH, 64, 0);
|
|
return rtn;
|
|
|
|
case DFM_INITIATE_DIALOG:
|
|
InitDlgBox(wnd);
|
|
break;
|
|
|
|
case DFM_COMMAND:
|
|
switch ((int) p1)
|
|
{
|
|
case DF_ID_FILENAME:
|
|
if (p2 != DFM_ENTERFOCUS)
|
|
{
|
|
/* allow user to modify the file spec */
|
|
DfGetItemText(wnd, DF_ID_FILENAME,
|
|
FileName, 65);
|
|
if (IncompleteFilename(FileName) || Saving)
|
|
{
|
|
strcpy(OrigSpec, FileName);
|
|
StripPath(OrigSpec);
|
|
}
|
|
if (p2 != DFM_LEAVEFOCUS)
|
|
DfSendMessage(wnd, DFM_COMMAND, DF_ID_OK, 0);
|
|
}
|
|
return TRUE;
|
|
|
|
case DF_ID_OK:
|
|
if (p2 != 0)
|
|
break;
|
|
DfGetItemText(wnd, DF_ID_FILENAME,
|
|
FileName, 65);
|
|
strcpy(FileSpec, FileName);
|
|
if (IncompleteFilename(FileName))
|
|
{
|
|
/* no file name yet */
|
|
InitDlgBox(wnd);
|
|
strcpy(OrigSpec, FileSpec);
|
|
return TRUE;
|
|
}
|
|
else {
|
|
DfGetItemText(wnd, DF_ID_PATH, FileName, 65);
|
|
strcat(FileName, FileSpec);
|
|
strcpy(NewFileName, FileName);
|
|
}
|
|
break;
|
|
|
|
case DF_ID_FILES:
|
|
switch ((int) p2)
|
|
{
|
|
case DFM_ENTERFOCUS:
|
|
case DFM_LB_SELECTION:
|
|
/* selected a different filename */
|
|
DfGetDlgListText(wnd, FileName,
|
|
DF_ID_FILES);
|
|
DfPutItemText(wnd, DF_ID_FILENAME,
|
|
FileName);
|
|
break;
|
|
case DFM_LB_CHOOSE:
|
|
/* chose a file name */
|
|
DfGetDlgListText(wnd, FileName,
|
|
DF_ID_FILES);
|
|
DfSendMessage(wnd, DFM_COMMAND, DF_ID_OK, 0);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return TRUE;
|
|
|
|
case DF_ID_DRIVE:
|
|
switch ((int) p2) {
|
|
case DFM_ENTERFOCUS:
|
|
if (Saving)
|
|
*FileSpec = '\0';
|
|
break;
|
|
case DFM_LEAVEFOCUS:
|
|
if (Saving)
|
|
strcpy(FileSpec, FileName);
|
|
break;
|
|
|
|
case DFM_LB_SELECTION:
|
|
{
|
|
char dd[25];
|
|
/* selected different drive/dir */
|
|
DfGetDlgListText(wnd, dd, DF_ID_DRIVE);
|
|
if (*(dd+2) == ':')
|
|
*(dd+3) = '\0';
|
|
else
|
|
*(dd+strlen(dd)-1) = '\0';
|
|
strcpy(FileName, dd+1);
|
|
if (*(dd+2) != ':' && *OrigSpec != '\\')
|
|
strcat(FileName, "\\");
|
|
strcat(FileName, OrigSpec);
|
|
if (*(FileName+1) != ':' && *FileName != '.')
|
|
{
|
|
DfGetItemText(wnd, DF_ID_PATH, FileSpec, 65);
|
|
strcat(FileSpec, FileName);
|
|
}
|
|
else
|
|
strcpy(FileSpec, FileName);
|
|
}
|
|
break;
|
|
|
|
case DFM_LB_CHOOSE:
|
|
/* chose drive/dir */
|
|
if (Saving)
|
|
DfPutItemText(wnd, DF_ID_FILENAME, "");
|
|
InitDlgBox(wnd);
|
|
return TRUE;
|
|
default:
|
|
break;
|
|
}
|
|
DfPutItemText(wnd, DF_ID_FILENAME, FileSpec);
|
|
return TRUE;
|
|
|
|
|
|
default:
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
return DfDefaultWndProc(wnd, msg, p1, p2);
|
|
}
|
|
|
|
/*
|
|
* Initialize the dialog box
|
|
*/
|
|
static void InitDlgBox(DFWINDOW wnd)
|
|
{
|
|
if (*FileSpec && !Saving)
|
|
DfPutItemText(wnd, DF_ID_FILENAME, FileSpec);
|
|
if (DfDlgDirList(wnd, FileSpec, DF_ID_FILES, DF_ID_PATH, 0))
|
|
{
|
|
StripPath(FileSpec);
|
|
DfDlgDirList(wnd, "*.*", DF_ID_DRIVE, 0, 0xc010);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Strip the drive and path information from a file spec
|
|
*/
|
|
static void StripPath(char *filespec)
|
|
{
|
|
char *cp, *cp1;
|
|
|
|
cp = strchr(filespec, ':');
|
|
if (cp != NULL)
|
|
cp++;
|
|
else
|
|
cp = filespec;
|
|
while (TRUE) {
|
|
cp1 = strchr(cp, '\\');
|
|
if (cp1 == NULL)
|
|
break;
|
|
cp = cp1+1;
|
|
}
|
|
strcpy(filespec, cp);
|
|
}
|
|
|
|
|
|
static BOOL IncompleteFilename(char *s)
|
|
{
|
|
int lc = strlen(s)-1;
|
|
if (strchr(s, '?') || strchr(s, '*') || !*s)
|
|
return TRUE;
|
|
if (*(s+lc) == ':' || *(s+lc) == '\\')
|
|
return TRUE;
|
|
return FALSE;
|
|
}
|
|
|
|
/* EOF */
|