// areawnd.c
// Two-letter Module Descriptor: aw
// ****************************************************************************
// 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
// ****************************************************************************
/* This module implements the area list window which displays,
* as a hierarchy, the structure tree. */
#include<windows.h>
#include<windowsx.h>
#include<time.h>
#include<stdio.h>
#include<string.h>
#include"molem.h"
#include"molerc.h"
#include"dstruct.h"
#include"areawnd.h"
#include"enviromt.h"
#include"debug.h"
#include"edit.h"
#include"main.h"
#include"clipbrd.h"
#ifdef WIN32
#define MoveTo(x,y,z) MoveToEx(x,y,z,NULL)
#endif
/* ICON references */
#define AW_ICON_PLUS 0
#define AW_ICON_MINUS 1
#define AW_MUDNAME_NOTCONN "<not connected>"
#define AW_PROFILE_STR "AreaWindow"
/* Globals */
DSREF g_awRootRef; /* the root of all evil, er, I mean, of all structures */
DSFTL *g_awFTList; /* may as well keep this here too. */
DSFTL *g_awFTLObjType; /* and this too */
int g_awRootTop; /* the # of the top line in the root window */
HWND g_awRootWnd;
int g_awTextY; /* height of a single row in Area window */
int g_awTextX; /* width of a "column" in Area Window - a column is a | section */
int g_awTextHalfY; /* height of a single row in Area window */
int g_awTextHalfX; /* width of a "column" in Area Window - a column is a | section */
int g_awRowsReqd; /* # rows required for current display options */
RECT g_awRootRect; /* rectangle for the client area of the area window */
int g_awRSWidth; /* width of scrollbar */
int g_awPageScroll; /* # lines for a page-sized scroll */
HFONT g_awFont;
//HICON g_awGlobeIcon[3],g_awMOBsIcon[3],g_awOBJIcon[3];
//HICON g_awMOBIcon,g_awMapIcon[3],g_awResetIcon,g_awArrowIcon[3];
HICON g_awRootIcon[2],g_awAreaIcon[2],g_awWLDListIcon[2];
HICON g_awMOBListIcon[2],g_awOBJListIcon[2];
HICON g_awAreaDetailIcon,g_awResetIcon,g_awWLDIcon,g_awMOBIcon,g_awOBJIcon;
int g_awHighlightLine;
char g_awMUDName[100];
char *g_awDetailString,*g_awMOBString,*g_awOBJString;
char *g_awWLDString,*g_awRSTString;
int g_awAvailable,g_awPending,g_awUnavailable;
BOOL awInitAreaWnd() {
HDC l_hDC;
TEXTMETRIC l_tm;
g_awAvailable=COLOR_WINDOWTEXT;
g_awUnavailable=COLOR_GRAYTEXT;
g_awPending=-1;
// g_awAvailable=-2;
// g_awPending=-3;
// g_awUnavailable=-1;
dsRefClear(&g_awRootRef);
g_awFTList=NULL;
g_awFTLObjType=NULL;
g_awHighlightLine=0;
g_awRootRef.rState=DS_NS_NOTAVAIL;
g_awRootRef.rLoadTime=time(NULL);
g_awRootRef.rFlag=DS_FLAG_WINOPEN;
g_awDetailString="Area settings";
g_awMOBString="Mobiles";
g_awOBJString="Objects";
g_awWLDString="World";
g_awRSTString="Reset";
strcpy(g_awMUDName,AW_MUDNAME_NOTCONN);
g_awRowsReqd=1;
g_awRSWidth=GetSystemMetrics(SM_CXVSCROLL);
g_awRootWnd = CreateWindow(
AW_WIND_CLASS_NAME,
"Area Hierarchy",
WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN|WS_VSCROLL,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
g_aahWnd,
NULL,
g_aahInst,
NULL
);
if (!g_awRootWnd)
return FALSE;
g_awRootTop=0;
g_awFont=GetStockObject(SYSTEM_FONT);
l_hDC=GetDC(g_awRootWnd);
if (l_hDC) {
SelectObject(l_hDC,g_awFont);
GetTextMetrics(l_hDC,&l_tm);
ReleaseDC(g_awRootWnd,l_hDC);
g_awTextX=l_tm.tmAveCharWidth;
g_awTextY=l_tm.tmHeight+l_tm.tmExternalLeading;
} else {
g_awTextX=18;
g_awTextY=16;
}
if (g_awTextY<16)
g_awTextY=16;
if (g_awTextX<18)
g_awTextX=18;
g_awTextHalfX=g_awTextX>>1;
g_awTextHalfY=g_awTextY>>1;
g_awRootIcon[AW_ICON_PLUS]=LoadIcon(g_aahInst,MAKEINTRESOURCE(ICON_GLOBEP));
g_awRootIcon[AW_ICON_MINUS]=LoadIcon(g_aahInst,MAKEINTRESOURCE(ICON_GLOBEM));
g_awAreaIcon[AW_ICON_PLUS]=LoadIcon(g_aahInst,MAKEINTRESOURCE(ICON_ARROWGREENRIGHT));
g_awAreaIcon[AW_ICON_MINUS]=LoadIcon(g_aahInst,MAKEINTRESOURCE(ICON_ARROWGREENDOWN));
g_awWLDListIcon[AW_ICON_PLUS]=LoadIcon(g_aahInst,MAKEINTRESOURCE(ICON_ARROWBLUERIGHT));
g_awWLDListIcon[AW_ICON_MINUS]=LoadIcon(g_aahInst,MAKEINTRESOURCE(ICON_ARROWBLUEDOWN));
g_awMOBListIcon[AW_ICON_PLUS]=LoadIcon(g_aahInst,MAKEINTRESOURCE(ICON_ARROWYELLOWRIGHT));
g_awMOBListIcon[AW_ICON_MINUS]=LoadIcon(g_aahInst,MAKEINTRESOURCE(ICON_ARROWYELLOWDOWN));
g_awOBJListIcon[AW_ICON_PLUS]=LoadIcon(g_aahInst,MAKEINTRESOURCE(ICON_ARROWREDRIGHT));
g_awOBJListIcon[AW_ICON_MINUS]=LoadIcon(g_aahInst,MAKEINTRESOURCE(ICON_ARROWREDDOWN));
g_awAreaDetailIcon=LoadIcon(g_aahInst,MAKEINTRESOURCE(ICON_MAP));
g_awResetIcon=LoadIcon(g_aahInst,MAKEINTRESOURCE(ICON_RESET));
g_awWLDIcon=LoadIcon(g_aahInst,MAKEINTRESOURCE(ICON_GLOBE));
g_awMOBIcon=LoadIcon(g_aahInst,MAKEINTRESOURCE(ICON_MOB));
g_awOBJIcon=LoadIcon(g_aahInst,MAKEINTRESOURCE(ICON_OBJ));
SetWindowPlacement(g_awRootWnd,enRestoreWindowPlacement(AW_PROFILE_STR,
GetSystemMetrics(SM_CXSCREEN)*3/4,GetSystemMetrics(SM_CYSCREEN)/8,
GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN)*2/3));
if (enRestoreYesNo(AW_PROFILE_STR,"ShowWindow",TRUE))
ShowWindow(g_awRootWnd,SW_SHOWNORMAL);
else
ShowWindow(g_awRootWnd,SW_HIDE);
GetClientRect(g_awRootWnd,&g_awRootRect);
PostMessage(g_awRootWnd,WM_USER_AREALIST_CHNG,0,0L);
return TRUE;
}
void awShutdownAreaWnd() {
if (g_awRootWnd) {
enSaveWindowPlacement(AW_PROFILE_STR,g_awRootWnd);
enSaveYesNo(AW_PROFILE_STR,"ShowWindow",awIsAreaWindowVisible());
DestroyWindow(g_awRootWnd);
}
dsRefFree(&g_awRootRef);
dsFTLFree(&g_awFTList);
dsFTLFree(&g_awFTLObjType);
DestroyIcon(g_awRootIcon[AW_ICON_PLUS]);
DestroyIcon(g_awRootIcon[AW_ICON_MINUS]);
DestroyIcon(g_awAreaIcon[AW_ICON_PLUS]);
DestroyIcon(g_awAreaIcon[AW_ICON_MINUS]);
DestroyIcon(g_awWLDListIcon[AW_ICON_PLUS]);
DestroyIcon(g_awWLDListIcon[AW_ICON_MINUS]);
DestroyIcon(g_awMOBListIcon[AW_ICON_PLUS]);
DestroyIcon(g_awMOBListIcon[AW_ICON_MINUS]);
DestroyIcon(g_awOBJListIcon[AW_ICON_PLUS]);
DestroyIcon(g_awOBJListIcon[AW_ICON_MINUS]);
DestroyIcon(g_awAreaDetailIcon);
DestroyIcon(g_awResetIcon);
DestroyIcon(g_awWLDIcon);
DestroyIcon(g_awMOBIcon);
DestroyIcon(g_awOBJIcon);
return;
}
/* connection has been killed - reset all our variables */
void awResetConnection() {
/* kill our local struct tree */
dsRefFree(&g_awRootRef);
/* reset our MUD name */
strcpy(g_awMUDName,AW_MUDNAME_NOTCONN);
/* turf our FTLists */
dsFTLFree(&g_awFTList);
dsFTLFree(&g_awFTLObjType);
/* refresh window */
PostMessage(g_awRootWnd,WM_USER_AREALIST_CHNG,0,0L);
return;
}
BOOL awInitAreaWndApplication() {
WNDCLASS l_wc;
l_wc.style = CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;
l_wc.lpfnWndProc = awAreaWndProc;
l_wc.cbClsExtra = 0;
l_wc.cbWndExtra = 0;
l_wc.hInstance = g_aahInst;
l_wc.hIcon = LoadIcon(g_aahInst, MAKEINTRESOURCE(ICON_MOLE));
l_wc.hCursor = LoadCursor(NULL, IDC_ARROW);
l_wc.hbrBackground =(HBRUSH)(COLOR_WINDOW+1);
l_wc.lpszMenuName = NULL;
l_wc.lpszClassName = AW_WIND_CLASS_NAME;
return (RegisterClass(&l_wc));
}
BOOL awInitAreaWndSecondApp() {
return TRUE;
}
/* this proc recursively goes through the structure and counts how many
* things are open, and returns the number of lines required for each thing */
/* Macro used only in this proc -- text type macro */
#define AW_HILIGHT_TEXTOUT(hDC,x,y,buf,len) \
if (l_i==g_awHighlightLine) { \
SetBkColor(hDC,awGetColor(COLOR_HIGHLIGHT)); \
TextOut(hDC,x,y,buf,len); \
SetBkColor(hDC,awGetColor(COLOR_WINDOW)); \
} else { \
TextOut(hDC,x,y,buf,len); \
}
LRESULT CALLBACK _export awAreaWndProc(HWND p_hWnd, UINT p_message,
WPARAM p_wParam, LPARAM p_lParam)
{
static RECT l_rect;
static PAINTSTRUCT l_ps; // paint structure
static HDC l_hDC; // device context
static HFONT l_oldFont;
static int l_i,l_j,l_x,l_y;
static int l_start,l_end; /* start & end lines */
static DSSTRUCT *l_area,*l_thing;
static char l_buf[200];
static POINT l_ptCurrent; /* for quick-menu */
static HMENU l_hmenu; /* for quick-menu */
static UINT l_flags; /* for quick-menu */
static UINT l_flagsInactive; /* for quick-menu */
static UINT l_flagsSeparator; /* for quick-menu */
switch (p_message)
{
case WM_USER_NEWDATA:
case WM_USER_AREALIST_CHNG:
/* structure has received an update - we have to redraw and recalculate everything */
/* our rectangle should be OK */
/* let's recalculate our total number of lines */
g_awRowsReqd=1; /* 1 - always show g_awRootRef */
if (g_awRootRef.rFlag&DS_FLAG_WINOPEN) {
for(l_area=g_awRootRef.rList;l_area;l_area=l_area->sNext) {
g_awRowsReqd++; /* for area name */
if (DSSArea(l_area)->aFlag&DS_FLAG_WINOPEN) {
g_awRowsReqd+=5; /* for detail,MOB,OBJ,WLD,RST */
if (((DSSArea(l_area)->aWLD.rFlag)&DS_FLAG_WINOPEN)&&
(DSSArea(l_area)->aWLD.rState==DS_NS_AVAIL))
for (l_thing=DSSArea(l_area)->aWLD.rList;l_thing;l_thing=l_thing->sNext)
g_awRowsReqd++;
if (((DSSArea(l_area)->aMOB.rFlag)&DS_FLAG_WINOPEN)&&
(DSSArea(l_area)->aMOB.rState==DS_NS_AVAIL))
for (l_thing=DSSArea(l_area)->aMOB.rList;l_thing;l_thing=l_thing->sNext)
g_awRowsReqd++;
if (((DSSArea(l_area)->aOBJ.rFlag)&DS_FLAG_WINOPEN)&&
(DSSArea(l_area)->aOBJ.rState==DS_NS_AVAIL))
for (l_thing=DSSArea(l_area)->aOBJ.rList;l_thing;l_thing=l_thing->sNext)
g_awRowsReqd++;
}
}
}
/* check on our scroll bar */
PostMessage(p_hWnd,WM_USER_AREALIST_SCROLL,0,0L);
// RedrawWindow(p_hWnd,NULL,NULL,RDW_ERASE);
InvalidateRect(p_hWnd,NULL,TRUE);
// UpdateWindow(p_hWnd);
return 0L;
case WM_USER_AREALIST_SCROLL:
/* check up on, and adjust if necessary, our scroll bar */
if (g_awRootTop>g_awRowsReqd)
g_awRootTop=0;
/* check to see if we can move up */
l_i=(g_awRootRect.bottom/g_awTextY);
if (l_i>(g_awRowsReqd-g_awRootTop))
g_awRootTop=g_awRowsReqd-l_i;
if (g_awRootTop<0)
g_awRootTop=0;
if (g_awRootTop || (g_awRowsReqd>(g_awRootRect.bottom/g_awTextY))) {
/* set up our scroll bar */
SetScrollRange(g_awRootWnd,SB_VERT,0,g_awRowsReqd-l_i,FALSE);
SetScrollPos(g_awRootWnd,SB_VERT,g_awRootTop,TRUE);
} else {
SetScrollRange(g_awRootWnd,SB_VERT,0,0,TRUE);
}
g_awPageScroll=g_awRootRect.bottom/g_awTextY-2;
if (g_awPageScroll<2)
g_awPageScroll=2;
return 0L;
// case WM_MOVE:
// case WM_SIZE:
case WM_WINDOWPOSCHANGED:
GetClientRect(g_awRootWnd,&g_awRootRect);
PostMessage(p_hWnd,WM_USER_AREALIST_SCROLL,0,0L);
return 0L;
case WM_VSCROLL:
l_j=g_awRootTop;
switch(GET_WM_VSCROLL_CODE(p_wParam,p_lParam)) {
case SB_BOTTOM:
g_awRootTop=g_awRowsReqd-1;
break;
case SB_LINEDOWN:
if (g_awRootTop<(g_awRowsReqd-1))
g_awRootTop++;
break;
case SB_LINEUP:
if (g_awRootTop>0)
g_awRootTop--;
break;
case SB_PAGEDOWN:
if (g_awRootTop<(g_awRowsReqd-1-g_awPageScroll))
g_awRootTop+=g_awPageScroll;
else
g_awRootTop=g_awRowsReqd-1;
break;
case SB_PAGEUP:
if (g_awRootTop>=g_awPageScroll)
g_awRootTop-=g_awPageScroll;
else
g_awRootTop=0;
break;
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
g_awRootTop=GET_WM_HSCROLL_POS(p_wParam,p_lParam);
ScrollWindow(p_hWnd,0,(l_j-g_awRootTop)*g_awTextY,NULL,NULL);
return 0L;
case SB_TOP:
g_awRootTop=0;
break;
case SB_ENDSCROLL:
PostMessage(p_hWnd,WM_USER_AREALIST_SCROLL,0,0L);
break;
}
/* check to see if we can move up */
l_i=(g_awRootRect.bottom/g_awTextY);
if (l_i>(g_awRowsReqd-g_awRootTop))
g_awRootTop=g_awRowsReqd-l_i;
if (g_awRootTop<0)
g_awRootTop=0;
if (l_j!=g_awRootTop) {
ScrollWindow(p_hWnd,0,(l_j-g_awRootTop)*g_awTextY,NULL,NULL);
PostMessage(p_hWnd,WM_USER_AREALIST_SCROLL,0,0L);
}
return 0L;
case WM_SYSCOMMAND:
switch(p_wParam) /* Process Control Box / Max-Min function */
{
case SC_CLOSE:
awHideAreaWindow();
return 0L;
default:
break;
}
break;
case WM_COMMAND:
switch(GET_WM_COMMAND_ID(p_wParam,p_lParam))
{
case CM_QUICKCOPY:
case CM_QUICKPASTE:
case CM_QUICKEDIT:
awFindHighlightItem(&l_area,&l_thing,&l_j);
if (p_wParam==CM_QUICKEDIT) {
if ((l_j>=EDFI_EDITABLE)&&(l_j<=EDFI_ENDEDITABLE))
edEditItem(l_j,l_area,l_thing,NULL);
} else if (p_wParam==CM_QUICKCOPY) {
cbCopyStruct(l_thing);
} else if (p_wParam==CM_QUICKPASTE) {
cbPasteStruct(l_thing);
}
return 0L;
case CM_QUICKEDITAREA:
case CM_QUICKEDITRESET:
case CM_QUICKNEW:
break;
case CM_QUICKRELOAD:
awFindHighlightItem(&l_area,&l_thing,&l_j);
if (l_j==EDFI_NULL) { /* reload area list */
edFetchItem(EDFI_AREALIST,NULL,NULL,NULL);
} else if (l_j==EDFI_AREALIST) { /* reload area's lists */
edFetchItem(EDFI_WLDLIST,l_area,NULL,NULL);
edFetchItem(EDFI_MOBLIST,l_area,NULL,NULL);
edFetchItem(EDFI_OBJLIST,l_area,NULL,NULL);
} else if ((l_j==EDFI_WLDLIST)||(l_j==EDFI_WORLD)) { /* reload world list */
edFetchItem(EDFI_WLDLIST,l_area,NULL,NULL);
} else if ((l_j==EDFI_MOBLIST)||(l_j==EDFI_MOBILE)) { /* reload mobile list */
edFetchItem(EDFI_MOBLIST,l_area,NULL,NULL);
} else if ((l_j==EDFI_OBJLIST)||(l_j==EDFI_OBJECT)) { /* reload object list */
edFetchItem(EDFI_OBJLIST,l_area,NULL,NULL);
} /* else ignore */
return 0L;
default:
break;
}
break;
case WM_LBUTTONDBLCLK:
case WM_RBUTTONDOWN:
case WM_LBUTTONDOWN: /* change focus and possibly open up a structure */
/* First, find line */
l_x=LOWORD(p_lParam)/g_awTextX; /* column */
l_y=g_awRootTop+(HIWORD(p_lParam)/g_awTextY); /* Row */
if (l_y>=g_awRowsReqd) /* clicked outside our region - abort */
return 0L;
/* first, move highlight to this position now */
if (g_awHighlightLine!=l_y) {
l_rect.left=g_awRootRect.left;
l_rect.right=g_awRootRect.right;
if ((g_awHighlightLine>=g_awRootTop)&&
(g_awHighlightLine<(g_awRootRect.bottom/g_awTextY+1+g_awRootTop))) {
l_rect.top=(g_awHighlightLine-g_awRootTop)*g_awTextY;
l_rect.bottom=l_rect.top+g_awTextY;
InvalidateRect(p_hWnd,&l_rect,TRUE);
}
g_awHighlightLine=l_y;
l_rect.top=(g_awHighlightLine-g_awRootTop)*g_awTextY;
l_rect.bottom=l_rect.top+g_awTextY;
InvalidateRect(p_hWnd,&l_rect,TRUE);
} /* redraw highlight bar if req'd */
/* next, find the object we're pointing to */
awFindHighlightItem(&l_area,&l_thing,&l_j);
/* l_j: EEDFI_* describes item pointed to. */
/* OK, now process the sucker */
/* First, filter out clicks to the icons - to perform open/close */
/* l_start is the "start" of our X-coord for the icon */
if (l_j==EDFI_NULL) l_start=0; /* root */
else if (l_j==EDFI_AREALIST) l_start=1; /* area */
else if (l_j<EDFI_WORLD) l_start=2; /* area detail,rst,etc.*/
else l_start=3;
if (l_x<l_start)
return 0L; /* to the left of the icon - ignore */
else if (l_x<(l_start+1)) {
/* we've got an icon hit! Let's take another look at what we hit. */
if (p_message==WM_LBUTTONDOWN) { /* only left button allowed to trigger icon */
if (l_j==EDFI_NULL) {
g_awRootRef.rFlag^=DS_FLAG_WINOPEN;
if ((g_awRootRef.rFlag|DS_FLAG_WINOPEN)&&(g_awRootRef.rState==DS_NS_NOTAVAIL))
edFetchItem(EDFI_AREALIST,NULL,NULL,NULL);
} else if (l_j==EDFI_AREALIST) {
DSSArea(l_area)->aFlag^=DS_FLAG_WINOPEN;
} else if (l_j==EDFI_WLDLIST) {
DSSArea(l_area)->aWLD.rFlag^=DS_FLAG_WINOPEN;
if ((DSSArea(l_area)->aWLD.rFlag|DS_FLAG_WINOPEN)&&
(DSSArea(l_area)->aWLD.rState==DS_NS_NOTAVAIL))
edFetchItem(EDFI_WLDLIST,l_area,NULL,NULL);
} else if (l_j==EDFI_MOBLIST) {
DSSArea(l_area)->aMOB.rFlag^=DS_FLAG_WINOPEN;
if ((DSSArea(l_area)->aMOB.rFlag|DS_FLAG_WINOPEN)&&
(DSSArea(l_area)->aMOB.rState==DS_NS_NOTAVAIL))
edFetchItem(EDFI_MOBLIST,l_area,NULL,NULL);
} else if (l_j==EDFI_OBJLIST) {
DSSArea(l_area)->aOBJ.rFlag^=DS_FLAG_WINOPEN;
if ((DSSArea(l_area)->aOBJ.rFlag|DS_FLAG_WINOPEN)&&
(DSSArea(l_area)->aOBJ.rState==DS_NS_NOTAVAIL))
edFetchItem(EDFI_OBJLIST,l_area,NULL,NULL);
} else return 0L; /* other icon's don't matter */
PostMessage(p_hWnd,WM_USER_AREALIST_CHNG,0,0L);
}
return 0L;
}
/* l_j: EEDFI_* describes item pointed to. */
if (p_message==WM_LBUTTONDBLCLK) { /* action time */
if (l_j==EDFI_NULL) {
g_awRootRef.rFlag^=DS_FLAG_WINOPEN;
if ((g_awRootRef.rFlag|DS_FLAG_WINOPEN)&&(g_awRootRef.rState==DS_NS_NOTAVAIL))
edFetchItem(EDFI_AREALIST,NULL,NULL,NULL);
} else if (l_j==EDFI_AREALIST) {
DSSArea(l_area)->aFlag^=DS_FLAG_WINOPEN;
} else if (l_j==EDFI_WLDLIST) {
DSSArea(l_area)->aWLD.rFlag^=DS_FLAG_WINOPEN;
if ((DSSArea(l_area)->aWLD.rFlag|DS_FLAG_WINOPEN)&&
(DSSArea(l_area)->aWLD.rState==DS_NS_NOTAVAIL))
edFetchItem(EDFI_WLDLIST,l_area,NULL,NULL);
} else if (l_j==EDFI_MOBLIST) {
DSSArea(l_area)->aMOB.rFlag^=DS_FLAG_WINOPEN;
if ((DSSArea(l_area)->aMOB.rFlag|DS_FLAG_WINOPEN)&&
(DSSArea(l_area)->aMOB.rState==DS_NS_NOTAVAIL))
edFetchItem(EDFI_MOBLIST,l_area,NULL,NULL);
} else if (l_j==EDFI_OBJLIST) {
DSSArea(l_area)->aOBJ.rFlag^=DS_FLAG_WINOPEN;
if ((DSSArea(l_area)->aOBJ.rFlag|DS_FLAG_WINOPEN)&&
(DSSArea(l_area)->aOBJ.rState==DS_NS_NOTAVAIL))
edFetchItem(EDFI_OBJLIST,l_area,NULL,NULL);
} else if ((l_j>=EDFI_EDITABLE)&&(l_j<=EDFI_ENDEDITABLE)) {
/* catch-all for EDFI_AREADETAIL, RESET, WORLD, MOBILE, OBJECT */
edEditItem(l_j,l_area,l_thing,NULL);
return 0L;
} else { /* who knows. */
return 0L;
}
PostMessage(p_hWnd,WM_USER_AREALIST_CHNG,0,0L);
return 0L;
} else if (p_message==WM_RBUTTONDOWN) { /* quick-menu time! */
/* let's create that handy little pop-up menu */
#ifdef WIN32
l_ptCurrent.x = LOWORD(p_lParam);
l_ptCurrent.y = HIWORD(p_lParam);
#else
l_ptCurrent = MAKEPOINT(p_lParam);
#endif
l_hmenu = CreatePopupMenu();
l_flags=MF_ENABLED;
l_flagsInactive=MF_GRAYED;
l_flagsSeparator=MF_SEPARATOR;
/* l_j: EEDFI_* describes item pointed to. */
if (l_j==EDFI_NULL) {
AppendMenu(l_hmenu, l_flagsInactive, CM_QUICKNEW,"&New Area");
l_flags=MF_SEPARATOR;
AppendMenu(l_hmenu, l_flags, 0,NULL);
l_flags=MF_ENABLED;
AppendMenu(l_hmenu, l_flags, CM_QUICKRELOAD,"&Reload Area list");
} else if (l_j==EDFI_AREALIST) {
/* I took the following two out because they kind of broke the
* standard menu structure. Well, the real reason is because if I
* allow editing from here, I should allow copy/paste, and this
* menu would start to get carried away! */
// AppendMenu(l_hmenu, l_flagsInactive, CM_QUICKEDITAREA,"Edit &Area settings");
// AppendMenu(l_hmenu, l_flagsInactive, CM_QUICKEDITRESET,"Edit &Reset");
AppendMenu(l_hmenu, l_flagsInactive, CM_QUICKNEW,"&New Area");
AppendMenu(l_hmenu, l_flagsSeparator, 0,NULL);
AppendMenu(l_hmenu, l_flags, CM_QUICKRELOAD,"&Reload Area's lists");
} else if (l_j==EDFI_AREADETAIL) {
AppendMenu(l_hmenu, l_flags, CM_QUICKEDIT,"Edit &Area settings");
AppendMenu(l_hmenu, l_flagsSeparator, 0,NULL);
AppendMenu(l_hmenu, l_flagsInactive, CM_QUICKCOPY,"&Copy Area settings");
AppendMenu(l_hmenu, l_flagsInactive, CM_QUICKPASTE,"&Paste Area settings");
} else if (l_j==EDFI_RESET) {
AppendMenu(l_hmenu, l_flags, CM_QUICKEDIT,"Edit &Reset");
AppendMenu(l_hmenu, l_flagsSeparator, 0,NULL);
AppendMenu(l_hmenu, l_flagsInactive, CM_QUICKCOPY,"&Copy Reset");
AppendMenu(l_hmenu, l_flagsInactive, CM_QUICKPASTE,"&Paste Reset");
} else if (l_j==EDFI_WLDLIST) {
AppendMenu(l_hmenu, l_flagsInactive, CM_QUICKNEW,"New &World");
AppendMenu(l_hmenu, l_flagsSeparator, 0,NULL);
AppendMenu(l_hmenu, l_flags, CM_QUICKRELOAD,"&Reload World list");
} else if (l_j==EDFI_MOBLIST) {
AppendMenu(l_hmenu, l_flagsInactive, CM_QUICKNEW,"New &Mobile");
AppendMenu(l_hmenu, l_flagsSeparator, 0,NULL);
AppendMenu(l_hmenu, l_flags, CM_QUICKRELOAD,"&Reload Mobile list");
} else if (l_j==EDFI_OBJLIST) {
AppendMenu(l_hmenu, l_flags, CM_QUICKNEW,"New &Object");
AppendMenu(l_hmenu, l_flagsSeparator, 0,NULL);
AppendMenu(l_hmenu, l_flags, CM_QUICKRELOAD,"&Reload Object list");
} else if (l_j==EDFI_WORLD) {
AppendMenu(l_hmenu, l_flags, CM_QUICKEDIT,"&Edit World");
AppendMenu(l_hmenu, l_flagsInactive, CM_QUICKNEW,"&New World");
AppendMenu(l_hmenu, l_flagsSeparator, 0,NULL);
AppendMenu(l_hmenu, l_flagsInactive, CM_QUICKCOPY,"&Copy World");
AppendMenu(l_hmenu, l_flagsInactive, CM_QUICKPASTE,"&Paste World");
AppendMenu(l_hmenu, l_flagsSeparator, 0,NULL);
AppendMenu(l_hmenu, l_flags, CM_QUICKRELOAD,"&Reload World list");
} else if (l_j==EDFI_MOBILE) {
AppendMenu(l_hmenu, l_flags, CM_QUICKEDIT,"&Edit Mobile");
AppendMenu(l_hmenu, l_flagsInactive, CM_QUICKNEW,"&New Mobile");
AppendMenu(l_hmenu, l_flagsSeparator, 0,NULL);
AppendMenu(l_hmenu, l_flagsInactive, CM_QUICKCOPY,"&Copy Mobile");
AppendMenu(l_hmenu, l_flagsInactive, CM_QUICKPASTE,"&Paste Mobile");
AppendMenu(l_hmenu, l_flagsSeparator, 0,NULL);
AppendMenu(l_hmenu, l_flags, CM_QUICKRELOAD,"&Reload Mobile list");
} else if (l_j==EDFI_OBJECT) {
AppendMenu(l_hmenu, l_flags, CM_QUICKEDIT,"&Edit Object");
AppendMenu(l_hmenu, l_flagsInactive, CM_QUICKNEW,"&New Object");
AppendMenu(l_hmenu, l_flagsSeparator, 0,NULL);
AppendMenu(l_hmenu, l_flagsInactive, CM_QUICKCOPY,"&Copy Object");
AppendMenu(l_hmenu, l_flagsInactive, CM_QUICKPASTE,"&Paste Object");
AppendMenu(l_hmenu, l_flagsSeparator, 0,NULL);
AppendMenu(l_hmenu, l_flags, CM_QUICKRELOAD,"&Reload Object list");
} else {
return 0L;
}
ClientToScreen(p_hWnd, &l_ptCurrent);
TrackPopupMenu(l_hmenu, TPM_LEFTALIGN|TPM_RIGHTBUTTON, l_ptCurrent.x,
l_ptCurrent.y, 0, p_hWnd, NULL);
DestroyMenu(l_hmenu);
return 0L;
} /* else we don't care - just move the highlight */
return 0L;
case WM_KEYDOWN:
l_rect.left=0;
l_rect.right=10000;
if (p_wParam==VK_UP) {
if (g_awHighlightLine>0) {
if ((g_awHighlightLine>=g_awRootTop)&&
(g_awHighlightLine<(g_awRootRect.bottom/g_awTextY+1+g_awRootTop))) {
l_rect.top=(g_awHighlightLine-g_awRootTop)*g_awTextY;
l_rect.bottom=l_rect.top+g_awTextY;
InvalidateRect(p_hWnd,&l_rect,TRUE);
}
g_awHighlightLine--;
if ((g_awHighlightLine>=g_awRootTop)&&
(g_awHighlightLine<(g_awRootRect.bottom/g_awTextY+1+g_awRootTop))) {
l_rect.top=(g_awHighlightLine-g_awRootTop)*g_awTextY;
l_rect.bottom=l_rect.top+g_awTextY;
InvalidateRect(p_hWnd,&l_rect,TRUE);
}
}
} else if (p_wParam==VK_DOWN) {
if (g_awHighlightLine<(g_awRowsReqd-1)) {
if ((g_awHighlightLine>=g_awRootTop)&&
(g_awHighlightLine<(g_awRootRect.bottom/g_awTextY+1+g_awRootTop))) {
l_rect.top=(g_awHighlightLine-g_awRootTop)*g_awTextY;
l_rect.bottom=l_rect.top+g_awTextY;
InvalidateRect(p_hWnd,&l_rect,TRUE);
}
g_awHighlightLine++;
if ((g_awHighlightLine>=g_awRootTop)&&
(g_awHighlightLine<(g_awRootRect.bottom/g_awTextY+1+g_awRootTop))) {
l_rect.top=(g_awHighlightLine-g_awRootTop)*g_awTextY;
l_rect.bottom=l_rect.top+g_awTextY;
InvalidateRect(p_hWnd,&l_rect,TRUE);
}
}
} else if (p_wParam==VK_RETURN) {
SendMessage(p_hWnd,WM_LBUTTONDBLCLK,(WPARAM)0,
(LPARAM)MAKELONG(1000,(g_awHighlightLine-g_awRootTop)*g_awTextY+1));
} else if (p_wParam==VK_HOME) {
InvalidateRect(p_hWnd,NULL,TRUE);
g_awHighlightLine=0;
} else if (p_wParam==VK_END) {
InvalidateRect(p_hWnd,NULL,TRUE);
g_awHighlightLine=g_awRowsReqd-1;
} else if (p_wParam==VK_PRIOR) {
if ((g_awRootTop<g_awHighlightLine)&&
(g_awHighlightLine<g_awRootRect.bottom/g_awTextY)){
if (g_awRootTop>=g_awPageScroll)
g_awRootTop-=g_awPageScroll;
else
g_awRootTop=0;
}
InvalidateRect(p_hWnd,NULL,TRUE);
if (g_awHighlightLine>=g_awPageScroll)
g_awHighlightLine-=g_awPageScroll;
else
g_awHighlightLine=0;
} else if (p_wParam==VK_NEXT) {
if ((g_awRootTop<g_awHighlightLine)&&
(g_awHighlightLine<g_awRootRect.bottom/g_awTextY)){
if (g_awRootTop<(g_awRowsReqd-1-g_awPageScroll))
g_awRootTop+=g_awPageScroll;
else
g_awRootTop=g_awRowsReqd-1;
}
InvalidateRect(p_hWnd,NULL,TRUE);
if (g_awHighlightLine<(g_awRowsReqd-1-g_awPageScroll))
g_awHighlightLine+=g_awPageScroll;
else
g_awHighlightLine=g_awRowsReqd-1;
} else {
return 0L;
}
if (g_awHighlightLine<g_awRootTop) {
g_awRootTop=g_awHighlightLine;
InvalidateRect(p_hWnd,NULL,TRUE);
} else if (g_awHighlightLine>(g_awRootTop+g_awRootRect.bottom/g_awTextY-1)) {
g_awRootTop=g_awHighlightLine-g_awRootRect.bottom/g_awTextY+1;
InvalidateRect(p_hWnd,NULL,TRUE);
}
PostMessage(p_hWnd,WM_USER_AREALIST_SCROLL,0,0L);
return 0L;
case WM_PAINT:
if (IsIconic(p_hWnd))
break;
/* Paint window */
if (GetUpdateRect(p_hWnd,&l_rect,TRUE)) {
/* first, determine our line numbers to update */
l_y=(l_rect.top/g_awTextY);
l_start=g_awRootTop+l_y;
l_end=g_awRootTop+(l_rect.bottom/g_awTextY);
if (l_end >= g_awRowsReqd)
l_end=g_awRowsReqd-1;
l_y*=g_awTextY; /* we do this to round up to the nearest row boundary */
// l_x=l_start*g_awTextX;
/* we redraw the whole line each time */
/* get a device context */
l_hDC=BeginPaint(p_hWnd,&l_ps);
l_oldFont=SelectObject(l_hDC,g_awFont);
SetBkColor(l_hDC,awGetColor(COLOR_WINDOW));
/** BIG UGLY **/
l_i=0;
if (g_awRootRef.rFlag&DS_FLAG_WINOPEN) {
if (l_i>=l_start) { /* root is open - display tree */
DrawIcon(l_hDC,1,l_y,g_awRootIcon[AW_ICON_MINUS]);
if (g_awRootRef.rState==DS_NS_PENDING) {
SetTextColor(l_hDC,awGetColor(g_awUnavailable));
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX,l_y,
g_awMUDName,strlen(g_awMUDName))
SetTextColor(l_hDC,awGetColor(g_awAvailable));
} else if (g_awRootRef.rState!=DS_NS_AVAIL) {
SetTextColor(l_hDC,awGetColor(g_awUnavailable));
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX,l_y,
g_awMUDName,strlen(g_awMUDName))
SetTextColor(l_hDC,awGetColor(g_awAvailable));
} else {
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX,l_y,
g_awMUDName,strlen(g_awMUDName))
}
l_y+=g_awTextY;
}
l_i++;
for(l_area=g_awRootRef.rList;l_area;l_area=l_area->sNext) {
if (l_i>l_end)
break;
/* first, print this area's node */
if (l_i>=l_start) {
if (l_area->sNext) {
MoveTo(l_hDC,g_awTextHalfX,l_y);
LineTo(l_hDC,g_awTextHalfX,l_y+g_awTextY);
MoveTo(l_hDC,g_awTextHalfX,l_y+g_awTextHalfY);
LineTo(l_hDC,g_awTextX,l_y+g_awTextHalfY);
} else { /* last area - square off line here */
MoveTo(l_hDC,g_awTextHalfX,l_y);
LineTo(l_hDC,g_awTextHalfX,l_y+g_awTextHalfY);
LineTo(l_hDC,g_awTextX,l_y+g_awTextHalfY);
}
}
if (DSSArea(l_area)->aFlag&DS_FLAG_WINOPEN) {
if (l_i>=l_start) {
DrawIcon(l_hDC,g_awTextX+1,l_y,g_awAreaIcon[AW_ICON_MINUS]);
sprintf(l_buf,"%s (%li-%li)",DSSList(l_area)->lName.sData,
DSSList(l_area)->lVNum,DSSList(l_area)->lVNum2);
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX*2,l_y,l_buf,strlen(l_buf))
l_y+=g_awTextY;
}
l_i++;
if (l_i>l_end)
break;
/* Print aDetail reference - should only ever contain 1 struct */
if (l_i>=l_start) {
/* standard line display */
if (l_area->sNext) {
/* area line continuation */
MoveTo(l_hDC,g_awTextHalfX,l_y);
LineTo(l_hDC,g_awTextHalfX,l_y+g_awTextY);
}
MoveTo(l_hDC,g_awTextX+g_awTextHalfX,l_y);
LineTo(l_hDC,g_awTextX+g_awTextHalfX,l_y+g_awTextY);
MoveTo(l_hDC,g_awTextX+g_awTextHalfX,l_y+g_awTextHalfY);
LineTo(l_hDC,g_awTextX*2,l_y+g_awTextHalfY);
DrawIcon(l_hDC,g_awTextX*2+1,l_y,g_awAreaDetailIcon);
if (DSSArea(l_area)->aDetail.rState==DS_NS_PENDING) {
SetTextColor(l_hDC,awGetColor(g_awPending));
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX*3,l_y,
g_awDetailString,strlen(g_awDetailString))
SetTextColor(l_hDC,awGetColor(g_awAvailable));
} else if (DSSArea(l_area)->aDetail.rState!=DS_NS_AVAIL) {
SetTextColor(l_hDC,awGetColor(g_awUnavailable));
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX*3,l_y,
g_awDetailString,strlen(g_awDetailString))
SetTextColor(l_hDC,awGetColor(g_awAvailable));
} else {
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX*3,l_y,
g_awDetailString,strlen(g_awDetailString))
}
l_y+=g_awTextY;
}
l_i++;
if (l_i>l_end)
break;
/* Print reset - only get's a single node */
if (l_i>=l_start) {
/* standard line display */
if (l_area->sNext) {
/* area line continuation */
MoveTo(l_hDC,g_awTextHalfX,l_y);
LineTo(l_hDC,g_awTextHalfX,l_y+g_awTextY);
}
MoveTo(l_hDC,g_awTextX+g_awTextHalfX,l_y);
LineTo(l_hDC,g_awTextX+g_awTextHalfX,l_y+g_awTextY);
MoveTo(l_hDC,g_awTextX+g_awTextHalfX,l_y+g_awTextHalfY);
LineTo(l_hDC,g_awTextX*2,l_y+g_awTextHalfY);
DrawIcon(l_hDC,g_awTextX*2+1,l_y,g_awResetIcon);
if (DSSArea(l_area)->aRST.rState==DS_NS_PENDING) {
SetTextColor(l_hDC,awGetColor(g_awPending));
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX*3,l_y,
g_awRSTString,strlen(g_awRSTString))
SetTextColor(l_hDC,awGetColor(g_awAvailable));
} else if (DSSArea(l_area)->aRST.rState!=DS_NS_AVAIL) {
SetTextColor(l_hDC,awGetColor(g_awUnavailable));
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX*3,l_y,
g_awRSTString,strlen(g_awRSTString))
SetTextColor(l_hDC,awGetColor(g_awAvailable));
} else {
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX*3,l_y,
g_awRSTString,strlen(g_awRSTString))
}
l_y+=g_awTextY;
}
l_i++;
if (l_i>l_end)
break;
/* now do other reference lists */
/* WLD Header */
if (l_i>=l_start) {
/* standard line display */
if (l_area->sNext) {
/* area line continuation */
MoveTo(l_hDC,g_awTextHalfX,l_y);
LineTo(l_hDC,g_awTextHalfX,l_y+g_awTextY);
}
MoveTo(l_hDC,g_awTextX+g_awTextHalfX,l_y);
LineTo(l_hDC,g_awTextX+g_awTextHalfX,l_y+g_awTextY);
MoveTo(l_hDC,g_awTextX+g_awTextHalfX,l_y+g_awTextHalfY);
LineTo(l_hDC,g_awTextX*2,l_y+g_awTextHalfY);
if (DSSArea(l_area)->aWLD.rFlag&DS_FLAG_WINOPEN)
DrawIcon(l_hDC,g_awTextX*2+1,l_y,g_awWLDListIcon[AW_ICON_MINUS]);
else
DrawIcon(l_hDC,g_awTextX*2+1,l_y,g_awWLDListIcon[AW_ICON_PLUS]);
if (DSSArea(l_area)->aWLD.rState==DS_NS_PENDING) {
SetTextColor(l_hDC,awGetColor(g_awPending));
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX*3,l_y,
g_awWLDString,strlen(g_awWLDString))
SetTextColor(l_hDC,awGetColor(g_awAvailable));
} else if (DSSArea(l_area)->aWLD.rState!=DS_NS_AVAIL) {
SetTextColor(l_hDC,awGetColor(g_awUnavailable));
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX*3,l_y,
g_awWLDString,strlen(g_awWLDString))
SetTextColor(l_hDC,awGetColor(g_awAvailable));
} else {
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX*3,l_y,
g_awWLDString,strlen(g_awWLDString))
}
l_y+=g_awTextY;
}
l_i++;
if (l_i>l_end)
break;
/* WLD list */
if (DSSArea(l_area)->aWLD.rFlag&DS_FLAG_WINOPEN) {
for (l_thing=DSSArea(l_area)->aWLD.rList;l_thing;l_thing=l_thing->sNext) {
if (l_i>=l_start) {
if (l_area->sNext) {
/* area line continuation */
MoveTo(l_hDC,g_awTextHalfX,l_y);
LineTo(l_hDC,g_awTextHalfX,l_y+g_awTextY);
}
/* area-contents (WLD,OBJ,MOB, etc) continuation */
MoveTo(l_hDC,g_awTextX+g_awTextHalfX,l_y);
LineTo(l_hDC,g_awTextX+g_awTextHalfX,l_y+g_awTextY);
/* WLD line */
if (l_thing->sNext) { /* there's more */
MoveTo(l_hDC,g_awTextX*2+g_awTextHalfX,l_y);
LineTo(l_hDC,g_awTextX*2+g_awTextHalfX,l_y+g_awTextY);
MoveTo(l_hDC,g_awTextX*2+g_awTextHalfX,l_y+g_awTextHalfY);
LineTo(l_hDC,g_awTextX*3,l_y+g_awTextHalfY);
} else { /* last in list */
MoveTo(l_hDC,g_awTextX*2+g_awTextHalfX,l_y);
LineTo(l_hDC,g_awTextX*2+g_awTextHalfX,l_y+g_awTextHalfY);
LineTo(l_hDC,g_awTextX*3,l_y+g_awTextHalfY);
}
DrawIcon(l_hDC,g_awTextX*3+1,l_y,g_awWLDIcon);
sprintf(l_buf,"%s <%li>",DSSList(l_thing)->lName.sData,
DSSList(l_thing)->lVNum);
if (l_thing->sState==DS_NS_PENDING) {
SetTextColor(l_hDC,awGetColor(g_awPending));
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX*4,l_y,l_buf,strlen(l_buf))
SetTextColor(l_hDC,awGetColor(g_awAvailable));
} else if (l_thing->sState!=DS_NS_AVAIL) {
SetTextColor(l_hDC,awGetColor(g_awUnavailable));
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX*4,l_y,l_buf,strlen(l_buf))
SetTextColor(l_hDC,awGetColor(g_awAvailable));
} else {
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX*4,l_y,l_buf,strlen(l_buf))
}
l_y+=g_awTextY;
}
l_i++;
if (l_i>l_end)
break;
}
}
/* MOB Header */
if (l_i>=l_start) {
/* standard line display */
if (l_area->sNext) {
/* area line continuation */
MoveTo(l_hDC,g_awTextHalfX,l_y);
LineTo(l_hDC,g_awTextHalfX,l_y+g_awTextY);
}
MoveTo(l_hDC,g_awTextX+g_awTextHalfX,l_y);
LineTo(l_hDC,g_awTextX+g_awTextHalfX,l_y+g_awTextY);
MoveTo(l_hDC,g_awTextX+g_awTextHalfX,l_y+g_awTextHalfY);
LineTo(l_hDC,g_awTextX*2,l_y+g_awTextHalfY);
if (DSSArea(l_area)->aMOB.rFlag&DS_FLAG_WINOPEN)
DrawIcon(l_hDC,g_awTextX*2+1,l_y,g_awMOBListIcon[AW_ICON_MINUS]);
else
DrawIcon(l_hDC,g_awTextX*2+1,l_y,g_awMOBListIcon[AW_ICON_PLUS]);
if (DSSArea(l_area)->aMOB.rState==DS_NS_PENDING) {
SetTextColor(l_hDC,awGetColor(g_awPending));
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX*3,l_y,
g_awMOBString,strlen(g_awMOBString))
SetTextColor(l_hDC,awGetColor(g_awAvailable));
} else if (DSSArea(l_area)->aMOB.rState!=DS_NS_AVAIL) {
SetTextColor(l_hDC,awGetColor(g_awUnavailable));
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX*3,l_y,
g_awMOBString,strlen(g_awMOBString))
SetTextColor(l_hDC,awGetColor(g_awAvailable));
} else {
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX*3,l_y,
g_awMOBString,strlen(g_awMOBString))
}
l_y+=g_awTextY;
}
l_i++;
if (l_i>l_end)
break;
/* MOB list */
if (DSSArea(l_area)->aMOB.rFlag&DS_FLAG_WINOPEN) {
for (l_thing=DSSArea(l_area)->aMOB.rList;l_thing;l_thing=l_thing->sNext) {
if (l_i>=l_start) {
if (l_area->sNext) {
/* area line continuation */
MoveTo(l_hDC,g_awTextHalfX,l_y);
LineTo(l_hDC,g_awTextHalfX,l_y+g_awTextY);
}
/* area-contents (WLD,OBJ,MOB, etc) continuation */
MoveTo(l_hDC,g_awTextX+g_awTextHalfX,l_y);
LineTo(l_hDC,g_awTextX+g_awTextHalfX,l_y+g_awTextY);
/* MOB line */
if (l_thing->sNext) { /* there's more */
MoveTo(l_hDC,g_awTextX*2+g_awTextHalfX,l_y);
LineTo(l_hDC,g_awTextX*2+g_awTextHalfX,l_y+g_awTextY);
MoveTo(l_hDC,g_awTextX*2+g_awTextHalfX,l_y+g_awTextHalfY);
LineTo(l_hDC,g_awTextX*3,l_y+g_awTextHalfY);
} else { /* last in list */
MoveTo(l_hDC,g_awTextX*2+g_awTextHalfX,l_y);
LineTo(l_hDC,g_awTextX*2+g_awTextHalfX,l_y+g_awTextHalfY);
LineTo(l_hDC,g_awTextX*3,l_y+g_awTextHalfY);
}
DrawIcon(l_hDC,g_awTextX*3+1,l_y,g_awMOBIcon);
sprintf(l_buf,"%s <%li>",DSSList(l_thing)->lName.sData,
DSSList(l_thing)->lVNum);
if (l_thing->sState==DS_NS_PENDING) {
SetTextColor(l_hDC,awGetColor(g_awPending));
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX*4,l_y,l_buf,strlen(l_buf));
SetTextColor(l_hDC,awGetColor(g_awAvailable));
} else if (l_thing->sState!=DS_NS_AVAIL) {
SetTextColor(l_hDC,awGetColor(g_awUnavailable));
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX*4,l_y,l_buf,strlen(l_buf));
SetTextColor(l_hDC,awGetColor(g_awAvailable));
} else {
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX*4,l_y,l_buf,strlen(l_buf));
}
l_y+=g_awTextY;
}
l_i++;
if (l_i>l_end)
break;
}
}
/* OBJ Header */
if (l_i>=l_start) {
/* standard line display */
if (l_area->sNext) {
/* area line continuation */
MoveTo(l_hDC,g_awTextHalfX,l_y);
LineTo(l_hDC,g_awTextHalfX,l_y+g_awTextY);
}
MoveTo(l_hDC,g_awTextX+g_awTextHalfX,l_y);
LineTo(l_hDC,g_awTextX+g_awTextHalfX,l_y+g_awTextHalfY);
LineTo(l_hDC,g_awTextX*2,l_y+g_awTextHalfY);
if (DSSArea(l_area)->aOBJ.rFlag&DS_FLAG_WINOPEN)
DrawIcon(l_hDC,g_awTextX*2+1,l_y,g_awOBJListIcon[AW_ICON_MINUS]);
else
DrawIcon(l_hDC,g_awTextX*2+1,l_y,g_awOBJListIcon[AW_ICON_PLUS]);
if (DSSArea(l_area)->aOBJ.rState==DS_NS_PENDING) {
SetTextColor(l_hDC,awGetColor(g_awPending));
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX*3,l_y,
g_awOBJString,strlen(g_awOBJString))
SetTextColor(l_hDC,awGetColor(g_awAvailable));
} else if (DSSArea(l_area)->aOBJ.rState!=DS_NS_AVAIL) {
SetTextColor(l_hDC,awGetColor(g_awUnavailable));
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX*3,l_y,
g_awOBJString,strlen(g_awOBJString))
SetTextColor(l_hDC,awGetColor(g_awAvailable));
} else {
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX*3,l_y,
g_awOBJString,strlen(g_awOBJString))
}
l_y+=g_awTextY;
}
l_i++;
if (l_i>l_end)
break;
/* OBJ list */
if (DSSArea(l_area)->aOBJ.rFlag&DS_FLAG_WINOPEN) {
for (l_thing=DSSArea(l_area)->aOBJ.rList;l_thing;l_thing=l_thing->sNext) {
if (l_i>=l_start) {
if (l_area->sNext) {
/* area line continuation */
MoveTo(l_hDC,g_awTextHalfX,l_y);
LineTo(l_hDC,g_awTextHalfX,l_y+g_awTextY);
}
/* OBJ line */
if (l_thing->sNext) { /* there's more */
MoveTo(l_hDC,g_awTextX*2+g_awTextHalfX,l_y);
LineTo(l_hDC,g_awTextX*2+g_awTextHalfX,l_y+g_awTextY);
MoveTo(l_hDC,g_awTextX*2+g_awTextHalfX,l_y+g_awTextHalfY);
LineTo(l_hDC,g_awTextX*3,l_y+g_awTextHalfY);
} else { /* last in list */
MoveTo(l_hDC,g_awTextX*2+g_awTextHalfX,l_y);
LineTo(l_hDC,g_awTextX*2+g_awTextHalfX,l_y+g_awTextHalfY);
LineTo(l_hDC,g_awTextX*3,l_y+g_awTextHalfY);
}
DrawIcon(l_hDC,g_awTextX*3+1,l_y,g_awOBJIcon);
sprintf(l_buf,"%s <%li>",DSSList(l_thing)->lName.sData,
DSSList(l_thing)->lVNum);
if (l_thing->sState==DS_NS_PENDING) {
SetTextColor(l_hDC,awGetColor(g_awPending));
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX*4,l_y,l_buf,strlen(l_buf));
SetTextColor(l_hDC,awGetColor(g_awAvailable));
} else if (l_thing->sState!=DS_NS_AVAIL) {
SetTextColor(l_hDC,awGetColor(g_awUnavailable));
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX*4,l_y,l_buf,strlen(l_buf));
SetTextColor(l_hDC,awGetColor(g_awAvailable));
} else {
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX*4,l_y,l_buf,strlen(l_buf));
}
l_y+=g_awTextY;
}
l_i++;
if (l_i>l_end)
break;
}
}
} else { /* if... area open */
if (l_i>=l_start) {
DrawIcon(l_hDC,g_awTextX+1,l_y,g_awAreaIcon[AW_ICON_PLUS]);
sprintf(l_buf,"%s (%li-%li)",DSSList(l_area)->lName.sData,
DSSList(l_area)->lVNum,DSSList(l_area)->lVNum2);
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX*2,l_y,l_buf,strlen(l_buf))
l_y+=g_awTextY;
}
l_i++;
}
} /* for... area list */
} else { /* root is not open */
if (l_i>=l_start) {
DrawIcon(l_hDC,1,l_y,g_awRootIcon[AW_ICON_PLUS]);
if (g_awRootRef.rState==DS_NS_PENDING) {
SetTextColor(l_hDC,awGetColor(g_awPending));
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX,l_y,
g_awMUDName,strlen(g_awMUDName))
SetTextColor(l_hDC,awGetColor(g_awAvailable));
} else if (g_awRootRef.rState!=DS_NS_AVAIL) {
SetTextColor(l_hDC,awGetColor(g_awUnavailable));
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX,l_y,
g_awMUDName,strlen(g_awMUDName))
SetTextColor(l_hDC,awGetColor(g_awAvailable));
} else {
AW_HILIGHT_TEXTOUT(l_hDC,g_awTextX,l_y,
g_awMUDName,strlen(g_awMUDName))
}
l_y+=g_awTextY;
}
l_i++;
}
/** End of BIG UGLY **/
SelectObject(l_hDC,l_oldFont);
EndPaint(p_hWnd,&l_ps);
return 0L;
}
break;
default:
break;
}
return (DefWindowProc(p_hWnd, p_message, p_wParam, p_lParam));
}
/* This proc finds and identifies the item pointed to by the highlighted line.
* NOTE that this proc uses and returns EDFI_* constants in p_type!!! */
int awFindHighlightItem(DSSTRUCT **p_area, DSSTRUCT **p_thing, int *p_type) {
int l_i,l_j;
DSSTRUCT *l_area, *l_thing;
BOOL l_FoundIt;
/* find the object we're pointing to */
l_i=0;
l_j=EDFI_NULL; /* Use EDFI_* constants */
l_thing=l_area=NULL;
l_FoundIt=FALSE;
if (l_i<g_awHighlightLine) {
if (g_awRootRef.rFlag&DS_FLAG_WINOPEN) {
for(l_area=g_awRootRef.rList;l_area;l_area=l_area->sNext) {
l_i++; /* for area name */
if (l_i==g_awHighlightLine) {
l_j=EDFI_AREALIST;
break;
}
if (DSSArea(l_area)->aFlag&DS_FLAG_WINOPEN) {
l_i++; /* for area details */
if (l_i==g_awHighlightLine) {
l_j=EDFI_AREADETAIL;
l_thing=DSSArea(l_area)->aDetail.rList;
break;
}
l_i++; /* for reset */
if (l_i==g_awHighlightLine) {
l_j=EDFI_RESET;
l_thing=DSSArea(l_area)->aRST.rList;
break;
}
l_i++; /* for WLD */
if (l_i==g_awHighlightLine) {
l_j=EDFI_WLDLIST;
break;
}
if (((DSSArea(l_area)->aWLD.rFlag)&DS_FLAG_WINOPEN)&&
(DSSArea(l_area)->aWLD.rState==DS_NS_AVAIL))
for (l_thing=DSSArea(l_area)->aWLD.rList;l_thing;l_thing=l_thing->sNext) {
l_i++; /* for l_thing */
if (l_i==g_awHighlightLine) {
l_FoundIt=TRUE;
l_j=EDFI_WORLD;
break;
}
}
if (l_i==g_awHighlightLine) /* check for thing match */
break;
l_i++; /* for MOB */
if (l_i==g_awHighlightLine) {
l_j=EDFI_MOBLIST;
break;
}
if (((DSSArea(l_area)->aMOB.rFlag)&DS_FLAG_WINOPEN)&&
(DSSArea(l_area)->aMOB.rState==DS_NS_AVAIL))
for (l_thing=DSSArea(l_area)->aMOB.rList;l_thing;l_thing=l_thing->sNext) {
l_i++; /* for l_thing */
if (l_i==g_awHighlightLine) {
l_FoundIt=TRUE;
l_j=EDFI_MOBILE;
break;
}
}
if (l_i==g_awHighlightLine) /* check for thing match */
break;
l_i++; /* for OBJ */
if (l_i==g_awHighlightLine) {
l_j=EDFI_OBJLIST;
break;
}
if (((DSSArea(l_area)->aOBJ.rFlag)&DS_FLAG_WINOPEN)&&
(DSSArea(l_area)->aOBJ.rState==DS_NS_AVAIL))
for (l_thing=DSSArea(l_area)->aOBJ.rList;l_thing;l_thing=l_thing->sNext) {
l_i++; /* for l_thing */
if (l_i==g_awHighlightLine) {
l_FoundIt=TRUE;
l_j=EDFI_OBJECT;
break;
}
}
} /* area's open */
if (l_FoundIt)
break;
} /* loop through areas */
} /* root's open */
} /* if root is highlighted */
/* return our findings */
if (p_area)
*p_area=l_area;
if (p_thing)
*p_thing=l_thing;
if (p_type)
*p_type=l_j;
return l_j;
} /* awFindHighlightItem() */
void awShowAreaWindow() {
if (g_awRootWnd)
ShowWindow(g_awRootWnd,SW_SHOWNA);
mnMenuMainUpdate();
return;
}
void awHideAreaWindow() {
if (g_awRootWnd)
ShowWindow(g_awRootWnd,SW_HIDE);
mnMenuMainUpdate();
return;
}
BOOL awIsAreaWindowVisible() {
if (g_awRootWnd)
return IsWindowVisible(g_awRootWnd);
return FALSE;
}
COLORREF awGetColor(int p_color) {
if (p_color<0) {
return RGB(0,0,255);
}
return GetSysColor(p_color);
}