// EditADt module
// two-character identifier: ea
// ****************************************************************************
// 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<stdio.h>
#include<ctl3d.h>
#include"moledefs.h"
#include"molerc.h"
#include"molem.h"
#include"dstruct.h"
#include"areawnd.h"
#include"edit.h"
#include"editadt.h"
#include"dialog.h"
#include"editprop.h"
#include"editextr.h"
#include"editflag.h"
#include"help.h"
#include"ctl3dl.h"
BOOL CALLBACK _export eaEditAreaDetailProc(HWND p_hWnd, UINT p_message,
WPARAM p_wParam, LPARAM p_lParam) {
long l_VNum,l_i;
DSSTRUCT *l_thing,*l_edit;
BOOL l_changed;
switch (p_message)
{
case WM_INITDIALOG:
Ctl3dSubclassDlgEx(p_hWnd,CTL3D_ALL);
dlCascadeDialogBox(p_hWnd);
/* and then fall through to the following ... */
case WM_USER_INITDIALOGSUB:
l_VNum=p_lParam;
#ifdef WIN32
SetProp(p_hWnd,(LPCSTR)g_edLongHi,(HANDLE)l_VNum);
#else
SetProp(p_hWnd,(LPCSTR)g_edLongHi,HIWORD(l_VNum));
SetProp(p_hWnd,(LPCSTR)g_edLongLo,LOWORD(l_VNum));
#endif
RemoveProp(p_hWnd,(LPCSTR)g_edFlag);
for (l_i=IDC_EDITADTACTIVESTART;l_i<=IDC_EDITADTACTIVEEND;l_i++) {
EnableWindow(GetDlgItem(p_hWnd,(int)l_i),FALSE);
}
EnableWindow(GetDlgItem(p_hWnd,IDOK),FALSE);
return TRUE;
case WM_USER_NEWDATA:
#ifdef WIN32
l_VNum=(LONG)GetProp(p_hWnd,(LPCSTR)g_edLongHi);
#else
l_VNum=(LONG)MAKELONG(GetProp(p_hWnd,(LPCSTR)g_edLongLo),
GetProp(p_hWnd,(LPCSTR)g_edLongHi));
#endif
if (l_VNum<0) {
l_VNum=p_lParam;
#ifdef WIN32
SetProp(p_hWnd,(LPCSTR)g_edLongHi,(HANDLE)l_VNum);
#else
SetProp(p_hWnd,(LPCSTR)g_edLongHi,(HANDLE)HIWORD(l_VNum));
SetProp(p_hWnd,(LPCSTR)g_edLongLo,(HANDLE)LOWORD(l_VNum));
#endif
}
/* load data from structure into window fields */
l_thing=edAreaOf(l_VNum);
if (l_thing) {
edSetDlgItemData(p_hWnd,IDC_EDITADTNAME,&(DSSList(l_thing)->lName),EDSGD_STR,EDSGD_STR_STRIPNL);
}
l_thing=edAreaDetailOf(l_VNum);
if (l_thing) {
if (l_thing->sType==DS_STYPE_AREADETAIL) {
edSetDlgItemData(p_hWnd,IDC_EDITADTDESC,&(DSSAreaDetail(l_thing)->aDesc),EDSGD_STR,EDSGD_STR_FORMAT);
edSetDlgItemData(p_hWnd,IDC_EDITADTEDITORS,&(DSSAreaDetail(l_thing)->aEditor),EDSGD_STR,EDSGD_STR_FORMAT);
edSetDlgItemData(p_hWnd,IDC_EDITADTRESETDELAY,&(DSSAreaDetail(l_thing)->aResetDelay),EDSGD_WORD,0);
edSetDlgItemData(p_hWnd,IDC_EDITADTFLAGS,&(DSSAreaDetail(l_thing)->aResetFlag),EDSGD_FLAG,0);
edSetDlgItemData(p_hWnd,IDC_EDITADTPROPERTY,&(DSSAreaDetail(l_thing)->aProperty),EDSGD_PROPERTY,0);
for (l_i=IDC_EDITADTACTIVESTART;l_i<=IDC_EDITADTACTIVEEND;l_i++) {
EnableWindow(GetDlgItem(p_hWnd,(int)l_i),TRUE);
}
EnableWindow(GetDlgItem(p_hWnd,IDOK),TRUE);
SetFocus(GetDlgItem(p_hWnd,IDC_EDITADTNAME));
}
}
return TRUE;
case WM_SYSCOMMAND:
#ifdef WIN32
l_VNum=(LONG)GetProp(p_hWnd,(LPCSTR)g_edLongHi);
#else
l_VNum=(LONG)MAKELONG(GetProp(p_hWnd,(LPCSTR)g_edLongLo),
GetProp(p_hWnd,(LPCSTR)g_edLongHi));
#endif
switch(p_wParam) /* Process Control Box / Max-Min function */
{
case SC_CLOSE:
l_thing=edAreaOf(l_VNum);
if (l_thing)
DSSArea(l_thing)->aDetail.rEditWindow=NULL;
aaDestroyWindow(p_hWnd);
return TRUE;
default:
break;
}
break;
case WM_COMMAND:
#ifdef WIN32
l_VNum=(LONG)GetProp(p_hWnd,(LPCSTR)g_edLongHi);
#else
l_VNum=(LONG)MAKELONG(GetProp(p_hWnd,(LPCSTR)g_edLongLo),
GetProp(p_hWnd,(LPCSTR)g_edLongHi));
#endif
switch (GET_WM_COMMAND_ID(p_wParam,p_lParam))
{
case IDOK:
if (GET_WM_COMMAND_CMD(p_wParam,p_lParam)!=BN_CLICKED)
break;
/* Currently can't change the name of an area */
// l_thing=edAreaOf(l_VNum);
// if (l_thing) {
// l_changed=edGetDlgItemData(p_hWnd,IDC_EDITADTNAME,&(DSSList(l_thing)->lName),EDSGD_STR,EDSGD_STR_STRIPNL);
l_changed=FALSE;
// }
l_thing=edAreaOf(l_VNum);
if (l_thing)
DSSArea(l_thing)->aDetail.rEditWindow=NULL;
l_thing=edAreaDetailOf(l_VNum);
if (l_thing) {
/* save data & check for changes to ADT */
l_changed|=edGetDlgItemData(p_hWnd,IDC_EDITADTDESC,&(DSSAreaDetail(l_thing)->aDesc),EDSGD_STR,EDSGD_STR_FORMAT);
l_changed|=edGetDlgItemData(p_hWnd,IDC_EDITADTEDITORS,&(DSSAreaDetail(l_thing)->aEditor),EDSGD_STR,EDSGD_STR_FORMAT);
l_changed|=edGetDlgItemData(p_hWnd,IDC_EDITADTRESETDELAY,&(DSSAreaDetail(l_thing)->aResetDelay),EDSGD_WORD,0);
l_changed|=edGetDlgItemData(p_hWnd,IDC_EDITADTFLAGS,&(DSSAreaDetail(l_thing)->aResetFlag),EDSGD_FLAG,0);
l_changed|=edGetDlgItemData(p_hWnd,IDC_EDITADTPROPERTY,&(DSSAreaDetail(l_thing)->aProperty),EDSGD_PROPERTY,0);
/* save back to server if changes have been made */
if ((((unsigned int)(GetProp(p_hWnd,(LPCSTR)g_edFlag)))&EDFLAG_CHANGED)||(l_changed)) {
edSendItem(EDFI_AREADETAIL,edAreaOf(l_VNum),NULL,NULL);
/* exception: also update areawindow; they may have changed the name
of this area! */
PostMessage(g_awRootWnd,WM_USER_AREALIST_CHNG,0,0L);
}
/* now process button click */
}
aaDestroyWindow(p_hWnd);
return TRUE;
case IDHELP:
if (GET_WM_COMMAND_CMD(p_wParam,p_lParam)!=BN_CLICKED)
break;
WinHelp(g_aahWnd,g_aaHelpFile,HELP_CONTEXT,HP_EA_DIALOG_EDITADT_HELP);
return TRUE;
case IDCANCEL:
if (GET_WM_COMMAND_CMD(p_wParam,p_lParam)!=BN_CLICKED)
break;
l_thing=edAreaOf(l_VNum);
if (l_thing)
DSSArea(l_thing)->aDetail.rEditWindow=NULL;
aaDestroyWindow(p_hWnd);
return TRUE;
case IDC_EDITADTPROPERTYNEW:
l_thing=edAreaDetailOf(l_VNum);
if ((l_thing)&&(l_thing->sType==DS_STYPE_AREADETAIL)) {
l_changed=epEditProperty(p_hWnd,&(DSSAreaDetail(l_thing)->aProperty),
DS_STYPE_NONE,DS_STYPE_PROPERTY);
if (l_changed) {
SetProp(p_hWnd,(LPCSTR)g_edFlag,
(HANDLE)(((unsigned int)GetProp(p_hWnd,(LPCSTR)g_edFlag))|EDFLAG_CHANGED));
edSetDlgItemData(p_hWnd,IDC_EDITADTPROPERTY,
&(DSSAreaDetail(l_thing)->aProperty),EDSGD_PROPERTY,0);
}
return TRUE;
}
break;
case IDC_EDITADTPROPERTY:
if (GET_WM_COMMAND_CMD(p_wParam,p_lParam)!=LBN_DBLCLK)
break;
/* else fall through to the following */
case IDC_EDITADTPROPERTYEDIT:
case IDC_EDITADTPROPERTYDELETE:
if ((GET_WM_COMMAND_CMD(p_wParam,p_lParam)!=BN_CLICKED)&&
(GET_WM_COMMAND_CMD(p_wParam,p_lParam)!=LBN_DBLCLK))
break;
l_i=SendDlgItemMessage(p_hWnd,IDC_EDITADTPROPERTY,LB_GETCURSEL,0,0L);
if (l_i!=LB_ERR)
l_i=SendDlgItemMessage(p_hWnd,IDC_EDITADTPROPERTY,LB_GETITEMDATA,(WPARAM)l_i,0L);
if (l_i!=LB_ERR) {
l_thing=edAreaDetailOf(l_VNum);
if ((l_thing)&&((l_thing->sType)==DS_STYPE_AREADETAIL)) {
for (l_edit=(DSSAreaDetail(l_thing)->aProperty.rList);(l_edit)&&(l_i);
l_edit=l_edit->sNext) {
l_i--;
}
if (l_edit) {
l_thing=DSStruct(l_edit->sUpRef);
if ((GET_WM_COMMAND_ID(p_wParam,p_lParam)==IDC_EDITADTPROPERTYEDIT)||
(GET_WM_COMMAND_ID(p_wParam,p_lParam)==IDC_EDITADTPROPERTY)) {
/* l_edit now points to our property! */
if (epEditProperty(p_hWnd,l_edit,DS_STYPE_PROPERTY,DS_STYPE_PROPERTY))
SetProp(p_hWnd,(LPCSTR)g_edFlag,
(HANDLE)(((unsigned int)GetProp(p_hWnd,(LPCSTR)g_edFlag))|EDFLAG_CHANGED));
} else { /* delete */
SetProp(p_hWnd,(LPCSTR)g_edFlag,
(HANDLE)(((unsigned int)GetProp(p_hWnd,(LPCSTR)g_edFlag))|EDFLAG_CHANGED));
dsStructFree(l_edit);
}
edSetDlgItemData(p_hWnd,IDC_EDITADTPROPERTY,l_thing,EDSGD_PROPERTY,0);
return TRUE;
}
}
}
break;
case IDC_EDITADTFLAGS:
if (GET_WM_COMMAND_CMD(p_wParam,p_lParam)!=BN_CLICKED)
break;
l_thing=edAreaDetailOf(l_VNum);
if (!l_thing)
break;
if (efEditFlag(p_hWnd,&(DSSAreaDetail(l_thing)->aResetFlag),MOLE_LIST_RFLAG,"Area Flags"))
SetProp(p_hWnd,(LPCSTR)g_edFlag,
(HANDLE)(((unsigned int)GetProp(p_hWnd,(LPCSTR)g_edFlag))|EDFLAG_CHANGED));
return TRUE;
default:
break;
}
break;
case WM_DESTROY:
RemoveProp(p_hWnd,(LPCSTR)g_edLongHi);
#ifndef WIN32
RemoveProp(p_hWnd,(LPCSTR)g_edLongLo);
#endif
RemoveProp(p_hWnd,(LPCSTR)g_edFlag);
break;
default:
break;
}
return d3DlgMessageCheck(p_hWnd,p_message,p_wParam,p_lParam);
}