// editflag.h
// two-character identifier: ef
// Flag editing tool functions.
// ****************************************************************************
// Copyright (C) B. Cameron Lesiuk, 1999. All rights reserved.
// Permission to use/copy this code is granted for non-commercial use only.
// B. Cameron Lesiuk
// Victoria, BC, Canada
// wi961@freenet.victoria.bc.ca
// ****************************************************************************
#include<windows.h>
#include<windowsx.h>
#include<ctl3d.h>
#include"molem.h"
#include"molerc.h"
#include"dstruct.h"
#include"edit.h"
#include"dialog.h"
#include"areawnd.h"
#include"editflag.h"
#include"help.h"
#include"ctl3dl.h"
/* edit's the p_ptr property. If p_sType is DS_STYPE_NONE, creates a NEW struct
* of type p_newType and attaches it to the REFERENCE p_ptr. */
BOOL efEditFlag(HWND p_hWnd,DSFLAG *p_flag,int p_fType,char *p_WindowTitle) {
EFPARAM l_param;
int l_rc;
DSFLAG l_flag;
if ((!p_flag)||(p_fType<0)||(p_fType>MOLE_LIST_NUMLISTS))
return FALSE;
l_param.pWindowTitle=p_WindowTitle;
l_param.pFlag=p_flag;
l_param.pFType=p_fType;
/* saved (old) value - for changed check */
l_flag=*p_flag;
/* edit flag */
l_rc=DialogBoxParam(g_aahInst,MAKEINTRESOURCE(DIALOG_EDITFLAG),p_hWnd,
efEditFlagProc,(LPARAM)(&l_param));
if (l_rc==IDOK) {
if (l_flag==*(l_param.pFlag))
return FALSE;
else
return TRUE;
}
return FALSE;
}
BOOL CALLBACK _export efEditFlagProc(HWND p_hWnd, UINT p_message,
WPARAM p_wParam, LPARAM p_lParam) {
EFPARAM *l_param;
int l_i;
DSFTL *l_ftl;
switch (p_message)
{
case WM_INITDIALOG:
Ctl3dSubclassDlgEx(p_hWnd,CTL3D_ALL);
dlCentreDialogBox(p_hWnd);
l_param=(EFPARAM *)p_lParam;
if (!l_param)
EndDialog(p_hWnd,IDCANCEL);
#ifdef WIN32
SetProp(p_hWnd,(LPCSTR)g_edLongHi,(HANDLE)(p_lParam));
#else
SetProp(p_hWnd,(LPCSTR)g_edLongHi,HIWORD(p_lParam));
SetProp(p_hWnd,(LPCSTR)g_edLongLo,LOWORD(p_lParam));
#endif
SetWindowText(p_hWnd,l_param->pWindowTitle);
/* Ok, let's setup our window to look nice & pretty for the user */
l_ftl=dsFTLOf(&g_awFTList,l_param->pFType);
for (l_i=0;l_i<32;l_i++) {
if (l_ftl) {
SetDlgItemText(p_hWnd,IDC_EDITFLAG_FLAG1+l_i,l_ftl->fName);
if ((*(l_param->pFlag))&(1L<<l_i))
CheckDlgButton(p_hWnd,IDC_EDITFLAG_FLAG1+l_i,TRUE);
else
CheckDlgButton(p_hWnd,IDC_EDITFLAG_FLAG1+l_i,FALSE);
l_ftl=l_ftl->fNext;
} else {
EnableWindow(GetDlgItem(p_hWnd,IDC_EDITFLAG_FLAG1+l_i),FALSE);
ShowWindow(GetDlgItem(p_hWnd,IDC_EDITFLAG_FLAG1+l_i),SW_HIDE);
}
}
return TRUE;
case WM_SYSCOMMAND:
switch(p_wParam) /* Process Control Box / Max-Min function */
{
case SC_CLOSE:
EndDialog(p_hWnd,IDCANCEL);
return TRUE;
default:
break;
}
break;
case WM_COMMAND:
switch (GET_WM_COMMAND_ID(p_wParam,p_lParam))
{
case IDOK:
if (GET_WM_COMMAND_CMD(p_wParam,p_lParam)!=BN_CLICKED)
break;
#ifdef WIN32
l_param=(EFPARAM *)GetProp(p_hWnd,(LPCSTR)g_edLongHi);
#else
l_param=(EFPARAM *)MAKELP(GetProp(p_hWnd,(LPCSTR)g_edLongHi),
GetProp(p_hWnd,(LPCSTR)g_edLongLo));
#endif
l_ftl=dsFTLOf(&g_awFTList,l_param->pFType);
for (l_i=0;l_i<32;l_i++) {
if (l_ftl) {
if (IsDlgButtonChecked(p_hWnd,IDC_EDITFLAG_FLAG1+l_i)) {
(*(l_param->pFlag))|=(1L<<l_i);
} else {
(*(l_param->pFlag))|=(1L<<l_i); /* OR */
(*(l_param->pFlag))^=(1L<<l_i); /* XOR */
}
l_ftl=l_ftl->fNext;
} else {
break;
}
}
EndDialog(p_hWnd,IDOK);
return TRUE;
case IDHELP:
if (GET_WM_COMMAND_CMD(p_wParam,p_lParam)!=BN_CLICKED)
break;
WinHelp(g_aahWnd,g_aaHelpFile,HELP_CONTEXT,HP_EF_DIALOG_EDITFLAG_HELP);
return TRUE;
case IDCANCEL:
if (GET_WM_COMMAND_CMD(p_wParam,p_lParam)!=BN_CLICKED)
break;
EndDialog(p_hWnd,IDCANCEL);
return TRUE;
default:
break;
}
break;
case WM_DESTROY:
RemoveProp(p_hWnd,(LPCSTR)g_edLongHi);
#ifndef WIN32
RemoveProp(p_hWnd,(LPCSTR)g_edLongLo);
#endif
break;
default:
break;
}
return d3DlgMessageCheck(p_hWnd,p_message,p_wParam,p_lParam);
}