📄 complist.c
字号:
int FAR PASCAL
complist_dodlg_savelist(HWND hDlg, UINT message, UINT wParam, long lParam)
{
static char buffer[256];
switch(message) {
case WM_INITDIALOG:
SendDlgItemMessage(hDlg, IDD_IDENTICAL, BM_SETCHECK,
dlg_identical ? 1 : 0, 0);
SendDlgItemMessage(hDlg, IDD_DIFFER, BM_SETCHECK,
dlg_differ ? 1 : 0, 0);
SendDlgItemMessage(hDlg, IDD_LEFT, BM_SETCHECK,
dlg_left ? 1 : 0, 0);
SendDlgItemMessage(hDlg, IDD_RIGHT, BM_SETCHECK,
dlg_right ? 1 : 0, 0);
SetDlgItemText(hDlg, IDD_FILE, dlg_file);
/* convert 'left tree' into the right name */
wsprintf((LPTSTR)buffer, LoadRcString(IDS_FILES_ONLY), (LPSTR) dialog_leftname);
SendDlgItemMessage(hDlg, IDD_LEFT, WM_SETTEXT, 0, (DWORD) (LPSTR) buffer);
/* convert 'right tree' msg into correct path */
wsprintf((LPTSTR)buffer, LoadRcString(IDS_FILES_ONLY), (LPSTR) dialog_rightname);
SendDlgItemMessage(hDlg, IDD_RIGHT, WM_SETTEXT, 0, (DWORD) (LPSTR) buffer);
return(TRUE);
case WM_COMMAND:
switch (GET_WM_COMMAND_ID(wParam, lParam)) {
case IDOK:
dlg_identical = (SendDlgItemMessage(hDlg, IDD_IDENTICAL,
BM_GETCHECK, 0, 0) == 1);
dlg_differ = (SendDlgItemMessage(hDlg, IDD_DIFFER,
BM_GETCHECK, 0, 0) == 1);
dlg_left = (SendDlgItemMessage(hDlg, IDD_LEFT,
BM_GETCHECK, 0, 0) == 1);
dlg_right = (SendDlgItemMessage(hDlg, IDD_RIGHT,
BM_GETCHECK, 0, 0) == 1);
GetDlgItemText(hDlg, IDD_FILE, dlg_file, sizeof(dlg_file));
EndDialog(hDlg, TRUE);
break;
case IDCANCEL:
EndDialog(hDlg, FALSE);
break;
}
}
return(FALSE);
} /* complist_dodlg_savelist */
/***************************************************************************
* Function: complist_dodlg_copyfiles
*
* Purpose:
*
* dialog to get directory name and inclusion options. Init dlg fields from
* the dlg_* variables, and save state to the dlg_* variables on dialog
* close. return TRUE for OK, or FALSE for cancel (from the dialogbox()
* using EndDialog).
*
**************************************************************************/
int FAR PASCAL
complist_dodlg_copyfiles(HWND hDlg, UINT message, UINT wParam, long lParam)
{
static char buffer[256];
switch(message) {
case WM_INITDIALOG:
/*
* set checkboxes and directory field to defaults
*/
CheckDlgButton(hDlg, IDD_IDENTICAL,
(dlg_options & INCLUDE_SAME) ? 1 : 0);
CheckDlgButton(hDlg, IDD_DIFFER,
(dlg_options & INCLUDE_DIFFER) ? 1 : 0);
CheckDlgButton(hDlg, IDD_LEFT,
(dlg_options & (INCLUDE_LEFTONLY|INCLUDE_RIGHTONLY)) ? 1 : 0);
SetDlgItemText(hDlg, IDD_DIR1, dlg_root);
/*
* set 'copy from' buttons to have the full pathname
*/
SetDlgItemText(hDlg, IDD_FROMLEFT, dialog_leftname);
SetDlgItemText(hDlg, IDD_FROMRIGHT, dialog_rightname);
/*
* set default radio button for copy from, and set
* the text on the 'files only in...' checkbox to
* indicate which path is being selected
*/
if (dlg_options & COPY_FROMLEFT) {
CheckRadioButton(hDlg, IDD_FROMLEFT, IDD_FROMRIGHT,
IDD_FROMLEFT);
wsprintf((LPTSTR)buffer, LoadRcString(IDS_FILES_ONLY), (LPSTR) dialog_leftname);
SetDlgItemText(hDlg, IDD_LEFT, buffer);
} else {
CheckRadioButton(hDlg, IDD_FROMLEFT, IDD_FROMRIGHT,
IDD_FROMRIGHT);
wsprintf((LPTSTR)buffer, LoadRcString(IDS_FILES_ONLY), (LPSTR) dialog_rightname);
SetDlgItemText(hDlg, IDD_LEFT, buffer);
}
return(TRUE);
case WM_COMMAND:
switch (GET_WM_COMMAND_ID(wParam, lParam)) {
case IDD_FROMLEFT:
wsprintf((LPTSTR)buffer, LoadRcString(IDS_FILES_ONLY), (LPSTR) dialog_leftname);
SetDlgItemText(hDlg, IDD_LEFT, buffer);
dlg_options &= ~(COPY_FROMRIGHT);
dlg_options |= COPY_FROMLEFT;
break;
case IDD_FROMRIGHT:
wsprintf((LPTSTR)buffer, LoadRcString(IDS_FILES_ONLY), (LPSTR) dialog_rightname);
SetDlgItemText(hDlg, IDD_LEFT, buffer);
dlg_options &= ~(COPY_FROMLEFT);
dlg_options |= COPY_FROMRIGHT;
break;
case IDOK:
if (SendDlgItemMessage(hDlg, IDD_IDENTICAL,
BM_GETCHECK, 0, 0) == 1) {
dlg_options |= INCLUDE_SAME;
} else {
dlg_options &= ~INCLUDE_SAME;
}
if (SendDlgItemMessage(hDlg, IDD_DIFFER,
BM_GETCHECK, 0, 0) == 1) {
dlg_options |= INCLUDE_DIFFER;
} else {
dlg_options &= ~INCLUDE_DIFFER;
}
if (SendDlgItemMessage(hDlg, IDD_LEFT,
BM_GETCHECK, 0, 0) == 1) {
dlg_options |= INCLUDE_LEFTONLY;
} else {
dlg_options &= ~INCLUDE_LEFTONLY;
}
GetDlgItemText(hDlg, IDD_DIR1, dlg_root, sizeof(dlg_root));
EndDialog(hDlg, TRUE);
break;
case IDCANCEL:
EndDialog(hDlg, FALSE);
break;
}
}
return(FALSE);
} /* complist_dodlg_copyfiles */
/***************************************************************************
* Function: complist_new
*
* Purpose:
*
* Allocates a new complist and initialise it
*
**************************************************************************/
COMPLIST
complist_new(void)
{
COMPLIST cl;
cl = (COMPLIST) gmem_get(hHeap, sizeof(struct complist));
cl->left = NULL;
cl->right = NULL;
cl->items = List_Create();
return(cl);
} /* complist_new */
/***************************************************************************
* Function: complist_dodlg_dir
*
* Purpose:
*
* Dialog box function to ask for two directory names.
* no listing of files etc - just two edit fields in which the
* user can type a file or a directory name.
*
* Initialises the names from win.ini, and stores them to win.ini first.
*
**************************************************************************/
int FAR PASCAL
complist_dodlg_dir(HWND hDlg, unsigned message, WORD wParam, LONG lParam)
{
static char path[256];
static char buffer[256];
switch (message) {
case WM_INITDIALOG:
/* fill the edit fields with the current
* directory as a good starting point
*/
_getcwd(path, sizeof(path));
AnsiLowerBuff(path, strlen(path));
GetProfileString(APPNAME, "NameLeft", path, buffer, 256);
SetDlgItemText(hDlg, IDD_DIR1, buffer);
GetProfileString(APPNAME, "NameRight", path, buffer, 256);
SetDlgItemText(hDlg, IDD_DIR2, buffer);
/* set recursive option to most recent value */
CheckDlgButton(hDlg, IDD_RECURSIVE, dlg_recursive);
return(TRUE);
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDCANCEL:
EndDialog(hDlg, FALSE);
return(TRUE);
case IDOK:
/* fetch the text from the dialog, and remember
* it in win.ini
*/
GetDlgItemText(hDlg, IDD_DIR1,
dialog_leftname, sizeof(dialog_leftname));
WriteProfileString(APPNAME, "NameLeft", dialog_leftname);
GetDlgItemText(hDlg, IDD_DIR2,
dialog_rightname, sizeof(dialog_rightname));
WriteProfileString(APPNAME, "NameRight", dialog_rightname);
/* fetch recursive option */
dlg_recursive = SendDlgItemMessage(hDlg, IDD_RECURSIVE,
BM_GETCHECK, 0, 0);
EndDialog(hDlg, TRUE);
return(TRUE);
}
break;
}
return(FALSE);
} /* complist_dodlg_dir */
/***************************************************************************
* Function: complist_open
*
* Purpose:
*
* Puts up dialog asking the user to select an existing file to open.
*
* Parameters:
*
* prompt - message to user indicating purpose of file
* (to be displayed somewhere in dialog box.
*
* ext - default file extension if user enters file without
* extension.
*
* spec - default file spec (eg *.*)
*
* osp - OFSTRUCT representing file, if successfully open.
*
* fn - buffer where filename (just final element) is returned.
*
* Returns:
*
* TRUE - if file selected and exists (tested with OF_EXIST).
*
* FALSE - if dialog cancelled. If user selects a file that we cannot
* open, we complain and restart the dialog.
*
* Comments:
*
* if TRUE is returned, the file will have been successfully opened,
* for reading and then closed again.
*
**************************************************************************/
BOOL FAR PASCAL
complist_open(LPSTR prompt, LPSTR ext, LPSTR spec, OFSTRUCT FAR *osp, LPSTR fn)
{
OPENFILENAME ofn;
char achFilters[256];
char achPath[256];
LPSTR chp;
int fh;
/* build filter-pair buffer to contain one pair - the spec filter,
* twice (one of the pair should be the filter, the second should be
* the title of the filter - we don't have a title so we use the
* filter both times. remember double null at end of list of strings.
*/
lstrcpy(achFilters, spec); // filter + null
chp = &achFilters[lstrlen(achFilters)+1]; //2nd string just after null
lstrcpy(chp, spec); // filter name (+null)
chp[lstrlen(chp)+1] = '\0'; // double null at end of list
/*
* initialise arguments to dialog proc
*/
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = NULL;
ofn.hInstance = NULL;
ofn.lpstrFilter = achFilters;
ofn.lpstrCustomFilter = (LPSTR)NULL;
ofn.nMaxCustFilter = 0L;
ofn.nFilterIndex = 1L; // first filter pair in list
achPath[0] = '\0';
ofn.lpstrFile = achPath; // we need to get the full path to open
ofn.nMaxFile = sizeof(achPath);
ofn.lpstrFileTitle = fn; // return final elem of name here
ofn.nMaxFileTitle = sizeof(fn);
ofn.lpstrInitialDir = NULL;
ofn.lpstrTitle = prompt; // dialog title is good place for prompt text
ofn.Flags = OFN_FILEMUSTEXIST |
OFN_HIDEREADONLY |
OFN_PATHMUSTEXIST;
ofn.lpstrDefExt = ext;
ofn.nFileOffset = 0;
ofn.nFileExtension = 0;
ofn.lCustData = 0;
/*
* loop until the user cancels, or selects a file that we can open
*/
do {
if (!GetOpenFileName(&ofn)) {
return(FALSE);
}
fh = OpenFile(achPath, osp, OF_READ);
if (fh == HFILE_ERROR) {
if (MessageBox(NULL, LoadRcString(IDS_COULDNT_BE_OPENED), LoadRcString2(IDS_FILEOPEN),
MB_OKCANCEL|MB_ICONSTOP) == IDCANCEL) {
return(FALSE);
}
}
} while (fh == HFILE_ERROR);
_lclose(fh);
return(TRUE);
}
/***************************************************************************
* Function: complist_getroot_left
*
* Purpose:
*
* Gets the root names of the left tree used to build this complist.
*
**************************************************************************/
LPSTR
complist_getroot_left(COMPLIST cl)
{
return( dir_getroot_list(cl->left));
}
/***************************************************************************
* Function: complist_getroot_right
*
* Purpose:
*
* Gets the root names of the right tree used to build this complist.
*
**************************************************************************/
LPSTR
complist_getroot_right(COMPLIST cl)
{
return( dir_getroot_list(cl->right));
}
/***************************************************************************
* Function: complist_freeroot_*
*
* Purpose:
*
* Frees up memory allocated in a call to complist_getroot*()
*
**************************************************************************/
void
complist_freeroot_left(COMPLIST cl, LPSTR path)
{
dir_freeroot_list(cl->left, path);
}
void
complist_freeroot_right(COMPLIST cl, LPSTR path)
{
dir_freeroot_list(cl->right, path);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -