mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
163 lines
4.5 KiB
163 lines
4.5 KiB
/*
|
|
* listwin - window class that displays a list
|
|
*
|
|
* HISTORY:
|
|
* 11-Apr-1987 mz Use PASCAL/INTERNAL
|
|
* 10-Sep-87 danl Added LEFT RIGHT:
|
|
* 12-Oct-1989 leefi v1.10.73, added inclusion of <stdlib.h> for toupper()
|
|
*/
|
|
|
|
#define INCL_DOSINFOSEG
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <memory.h>
|
|
#include "wzport.h"
|
|
#include <tools.h>
|
|
#include "dh.h"
|
|
|
|
#include "zm.h"
|
|
|
|
|
|
/* ListWinProc - window procedure for List Window
|
|
*
|
|
* arguments:
|
|
* hWnd window handle
|
|
* command operation to perform
|
|
* data command specific data
|
|
*
|
|
* return value:
|
|
* none
|
|
*
|
|
*/
|
|
VOID PASCAL INTERNAL ListWinProc ( HW hWnd, INT command, WDATA data )
|
|
{
|
|
struct listwindata *lwd = ( struct listwindata *) hWnd->data;
|
|
struct vectorType *pVec = NULL;
|
|
PSTR pTmp = NULL;
|
|
CHAR line [ 64 ];
|
|
INT width = TWINWIDTH ( hWnd );
|
|
INT height = TWINHEIGHT ( hWnd );
|
|
INT oldBold, oldTop;
|
|
INT newBold, newTop;
|
|
INT i;
|
|
INT len;
|
|
|
|
/*
|
|
** *Top [0..cnt-1]
|
|
** *Bold [0..height-1]
|
|
*/
|
|
|
|
switch ( command )
|
|
{
|
|
case KEY:
|
|
newBold = oldBold = lwd->iBold;
|
|
newTop = oldTop = lwd->iTop;
|
|
switch ( data )
|
|
{
|
|
case ENTER :
|
|
case ESC :
|
|
CloseWindow ( hWnd );
|
|
return;
|
|
case CTRL_P:
|
|
case UP :
|
|
if ( oldBold == 0 )
|
|
newTop = max ( 0, oldTop - 1 );
|
|
newBold = max ( 0, oldBold - 1 );
|
|
break;
|
|
case CTRL_N:
|
|
case DOWN :
|
|
newBold = min ( lwd->cnt - oldTop - 1, oldBold + 1 );
|
|
if ( newBold > height - 1 )
|
|
{
|
|
newTop = min ( lwd->cnt - 1, oldTop + 1 );
|
|
newBold = height - 1;
|
|
}
|
|
break;
|
|
case CTRL_K:
|
|
case PGUP :
|
|
newTop = max ( 0, oldTop - height );
|
|
newBold = 0;
|
|
break;
|
|
case CTRL_L:
|
|
case PGDN :
|
|
newTop = min ( lwd->cnt - 1, oldTop + height );
|
|
newBold = 0;
|
|
break;
|
|
case CTRL_T:
|
|
case HOME :
|
|
newTop = newBold = 0;
|
|
break;
|
|
case CTRL_B:
|
|
case END :
|
|
newTop = lwd->cnt - 1;
|
|
newBold = 0;
|
|
break;
|
|
case LEFT:
|
|
case RIGHT:
|
|
break;
|
|
default :
|
|
if ( data > 127 )
|
|
break;
|
|
data = toupper ( data );
|
|
pVec = lwd->pVec;
|
|
for ( i = oldBold + oldTop + 1; i != oldBold + oldTop; i++ ) {
|
|
|
|
if ( i == lwd->cnt ) {
|
|
i = -1;
|
|
}
|
|
else {
|
|
if ( (INT)data == toupper ( *( ( PSTR ) pVec->elem [ i ] ) ) ) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if ( i == oldBold + oldTop )
|
|
Bell ( );
|
|
else if ( i < oldTop || i > oldTop + height - 1 ) {
|
|
newTop = i;
|
|
newBold = 0;
|
|
}
|
|
else
|
|
newBold = i - oldTop;
|
|
break;
|
|
}
|
|
if ( ( oldBold != newBold ) || ( oldTop != newTop ) ) {
|
|
lwd->iTop = newTop;
|
|
lwd->iBold = newBold;
|
|
DrawWindow ( hWnd, FALSE );
|
|
}
|
|
break;
|
|
case PAINT:
|
|
if ( (INT)data >= lwd->cnt - lwd->iTop )
|
|
{
|
|
ClearLine ( hWnd, data );
|
|
break;
|
|
}
|
|
|
|
pTmp = ( PSTR ) lwd->pVec->elem [ data + lwd->iTop ];
|
|
len = strlen ( pTmp );
|
|
WzTextOut ( hWnd, 0, data, pTmp, len,
|
|
( (INT)data == lwd->iBold ? DefBold : DefNorm ) );
|
|
|
|
/* fill rest of line with white space */
|
|
memset ( line, ' ', width );
|
|
WzTextOut ( hWnd, len, data, line, width, DefNorm );
|
|
break;
|
|
case CREATE:
|
|
hWnd->data = data;
|
|
lwd = ( struct listwindata *) hWnd->data;
|
|
lwd->iBold = lwd->iTop = 0;
|
|
lwd->cnt = ( ( struct listwindata * ) data )->pVec->count;
|
|
WindLevel++;
|
|
break;
|
|
case CLOSE:
|
|
WindLevel--;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return;
|
|
}
|