windows-nt/Source/XPSP1/NT/shell/osshell/accesory/terminal/showstat.c
2020-09-26 16:20:57 +08:00

351 lines
10 KiB
C

/*===========================================================================*/
/* Copyright (c) 1987 - 1988, Future Soft Engineering, Inc. */
/* Houston, Texas */
/*===========================================================================*/
#define NOLSTRING TRUE /* jtf win3 mod */
#include <windows.h>
#include "port1632.h"
#include "dcrc.h"
#include "dynacomm.h"
#include "video.h"
/*---------------------------------------------------------------------------*/
/* showXferCtrls() - [mbb] */
/*---------------------------------------------------------------------------*/
VOID setXferCtrlButton(WORD wCtrlID, WORD wResID) /* mbbx 2.00: xfer ctrls... */
//WORD wCtrlID;
//WORD wResID;
{
BYTE work[MINRESSTR];
LoadString(hInst, wResID, (LPSTR) work, MINRESSTR);
SetWindowText(GetDlgItem(hdbXferCtrls, wCtrlID), (LPSTR) work);
}
INT NEAR placeXferCtrl(HWND hCtrl, INT fCtrlLeft)
{
RECT fCtrlRect;
GetWindowRect(hCtrl, (LPRECT) &fCtrlRect);
fCtrlRect.right -= fCtrlRect.left;
MoveWindow(hCtrl, fCtrlLeft, 0, fCtrlRect.right, fCtrlRect.bottom - fCtrlRect.top, FALSE);
return(fCtrlLeft + fCtrlRect.right);
}
VOID showXferCtrls(WORD fShowCtrls) /* mbbx 2.00: xfer ctrls... */
//WORD fShowCtrls;
{
INT fCtrlLeft;
//sdj: the status line does not get updates when you come back
//sdj: to terminal focus.
if (hdbmyControls != NULL)
{
if(IsWindowVisible(hdbmyControls))
{
InvalidateRect(hdbmyControls, NULL, FALSE);
UpdateWindow(hdbmyControls);
}
}
if(fShowCtrls)
{
fCtrlLeft = placeXferCtrl(xferCtlStop, 0);
if(fShowCtrls & IDPAUSE)
{
fCtrlLeft = placeXferCtrl(xferCtlPause, fCtrlLeft);
}
if(fShowCtrls & IDFORK)
{
fCtrlLeft = placeXferCtrl(GetDlgItem(hdbXferCtrls, IDFORK), fCtrlLeft);
}
fCtrlLeft = placeXferCtrl(xferCtlScale, fCtrlLeft);
fCtrlLeft = placeXferCtrl(GetDlgItem(hdbXferCtrls, IDSENDING), fCtrlLeft);
if(fShowCtrls & IDBERRORS)
{
fCtrlLeft = placeXferCtrl(GetDlgItem(hdbXferCtrls, IDBERRORS), fCtrlLeft);
}
ShowWindow(hdbXferCtrls, SW_SHOWNOACTIVATE);
if(fShowCtrls & IDPAUSE)
{
ShowWindow(xferCtlPause, SW_SHOWNOACTIVATE);
}
if(fShowCtrls & IDFORK)
{
#ifdef ORGCODE
bSetUp(SPACE_STR+1);
#else
bSetup(SPACE_STR+1);
#endif
}
if(fShowCtrls & IDSCALE)
showScale();
else
showBBytes(0L, TRUE);
if(fShowCtrls & IDBERRORS)
{
showBErrors(0);
}
}
else
{
ShowWindow(hdbXferCtrls, SW_HIDE);
ShowWindow(xferCtlPause, SW_HIDE);
ShowWindow(GetDlgItem(hdbXferCtrls, IDFORK), SW_HIDE);
ShowWindow(GetDlgItem(hdbXferCtrls, IDBERRORS), SW_HIDE);
}
}
/*---------------------------------------------------------------------------*/
/* setItemText() - Set the text of a dialog item */
/*---------------------------------------------------------------------------*/
HDC NEAR beginXferCtrlUpdate(HWND hCtrl, RECT *ctrlRect, BOOL bRepaint)
{
HDC hDC;
HBRUSH hBrush;
hDC = GetDC(hCtrl);
GetClientRect(hCtrl, (LPRECT) ctrlRect);
if(bRepaint)
FillRect(hDC, (LPRECT) ctrlRect, (HBRUSH) GetStockObject(GRAY_BRUSH));
InflateRect((LPRECT) ctrlRect, -1, -1);
if(bRepaint)
{
hBrush = CreateSolidBrush(RGB(vidAttr[ANORMAL & AMASK].bkgd[VID_RED],
vidAttr[ANORMAL & AMASK].bkgd[VID_GREEN],
vidAttr[ANORMAL & AMASK].bkgd[VID_BLUE]));
FillRect(hDC, (LPRECT) ctrlRect, hBrush);
DeleteObject(hBrush);
FrameRect(hDC, (LPRECT) ctrlRect, (HBRUSH) GetStockObject(BLACK_BRUSH));
}
return(hDC);
}
VOID NEAR setItemText(INT item, BYTE *str, BOOL bRepaint)
{
HWND hItem;
HDC hDC;
RECT rect;
hItem = GetDlgItem(hdbXferCtrls, item);
if(bRepaint)
{
UpdateWindow(hdbXferCtrls);
if(!IsWindowVisible(hItem))
ShowWindow(hItem, SW_SHOWNOACTIVATE);
}
hDC = beginXferCtrlUpdate(hItem, &rect, bRepaint);
InflateRect((LPRECT) &rect, -4, -1);
SetBkColor(hDC, RGB(vidAttr[ANORMAL & AMASK].bkgd[VID_RED],
vidAttr[ANORMAL & AMASK].bkgd[VID_GREEN],
vidAttr[ANORMAL & AMASK].bkgd[VID_BLUE]));
SetTextColor(hDC, RGB(vidAttr[ANORMAL & AMASK].text[VID_RED],
vidAttr[ANORMAL & AMASK].text[VID_GREEN],
vidAttr[ANORMAL & AMASK].text[VID_BLUE]));
DrawText(hDC, (LPSTR) str, strlen(str), (LPRECT) &rect, DT_NOPREFIX | DT_SINGLELINE | DT_VCENTER);
ReleaseDC(hItem, hDC);
}
/*---------------------------------------------------------------------------*/
/* bSetUp() - [mbb] */
/*---------------------------------------------------------------------------*/
VOID bSetup(BYTE *str) /* mbbx 2.00: moved from XFERUTIL.C ... */
{
setItemText(IDFORK, str, TRUE);
strcpy(strRXFork, str);
}
/*---------------------------------------------------------------------------*/
/* showScale() - Draw the % done scale for file transfers. [scf] */
/*---------------------------------------------------------------------------*/
#define SECTIONS 10
#define TICKWIDTH 2
VOID showScale() /* mbbx 2.00: xfer ctrls... */
{
HDC hDC;
RECT rBase, rect;
INT increment, error, tickHeight, ndx, offset;
HBRUSH hBrush;
*strRXBytes = 255; /* IDSCALE is scale, not bytes count */
UpdateWindow(hdbXferCtrls);
hDC = beginXferCtrlUpdate(xferCtlScale, &rBase, TRUE); /* mbbx 2.00: xfer ctrls... */
InflateRect((LPRECT) &rBase, -1, -1);
increment = rBase.right / SECTIONS;
error = rBase.right - (increment * SECTIONS);
tickHeight = rBase.bottom / 2;
hBrush = CreateSolidBrush(RGB(vidAttr[ANORMAL & AMASK].text[VID_RED],
vidAttr[ANORMAL & AMASK].text[VID_GREEN],
vidAttr[ANORMAL & AMASK].text[VID_BLUE]));
for(ndx = 1; ndx < SECTIONS; ndx += 1)
{
offset = (ndx * increment) + ((ndx * error) / SECTIONS);
SetRect((LPRECT) &rect, (rBase.left + offset) - TICKWIDTH,
(ndx != SECTIONS / 2) ? tickHeight : tickHeight - (tickHeight / 2),
(rBase.left + offset) + TICKWIDTH, rBase.bottom);
FillRect(hDC, (LPRECT) &rect, hBrush);
}
DeleteObject(hBrush);
ReleaseDC(xferCtlScale, hDC);
}
/*---------------------------------------------------------------------------*/
/* updateProgress() Update the scale (thermometer) for xfers */
/*---------------------------------------------------------------------------*/
VOID updateProgress(BOOL redraw)
{
HDC hDC;
RECT ctrlRect;
INT left, right;
if(redraw)
{
xferPct = 0;
icon.last = 0;
if(IsIconic(hItWnd))
{
myDrawIcon(getPort(), TRUE);
releasePort();
}
else
showScale();
}
progress = 256 - (xferBytes * 256) / (xferOrig ? xferOrig : 1); /* avoid div by zero */
if(IsIconic(hItWnd))
updateIcon();
else
{
if(progress > xferPct)
{
hDC = GetDC(xferCtlScale);
GetClientRect(xferCtlScale, (LPRECT) &ctrlRect);
InflateRect((LPRECT) &ctrlRect, -2, -2); /* mbbx 2.00: xfer ctrls... */
ctrlRect.right -= ctrlRect.left;
left = (INT) (((LONG) xferPct * (LONG) ctrlRect.right) / 256);
right = (INT) (((LONG) progress * (LONG) ctrlRect.right) / 256);
ctrlRect.right = ctrlRect.left + (INT) right;
ctrlRect.left += (INT) left;
InvertRect(hDC, (LPRECT) &ctrlRect);
ReleaseDC(xferCtlScale, hDC);
}
}
if(progress > xferPct)
xferPct = progress;
}
/*---------------------------------------------------------------------------*/
/* showBBytes() - [mbb] */
/*---------------------------------------------------------------------------*/
VOID showBBytes(LONG cnt, BOOL bRepaint)
{
BYTE tmp1[TMPNSTR+1];
BYTE tmp2[TMPNSTR+1];
LoadString(hInst, STR_BYTECOUNT, (LPSTR) tmp1, TMPNSTR);
sprintf(tmp2, tmp1, cnt);
setItemText(IDSCALE, tmp2, bRepaint);
strcpy(strRXBytes, tmp2);
}
/*---------------------------------------------------------------------------*/
/* showRXFname() - */
/*---------------------------------------------------------------------------*/
VOID showRXFname(BYTE *fileName, INT actionString)
{
BYTE tmp1[TMPNSTR+1];
LoadString(hInst, actionString, (LPSTR) tmp1, TMPNSTR);
strcpy(tmp1+strlen(tmp1), fileName);
setItemText(IDSENDING, tmp1, TRUE); /* mbbx 2.00: xfer ctrls */
strcpy(strRXFname, tmp1);
}
/*---------------------------------------------------------------------------*/
/* showBErrors() - [scf] */
/*---------------------------------------------------------------------------*/
VOID showBErrors(INT cnt)
{
BYTE tmp1[TMPNSTR+1];
BYTE tmp2[TMPNSTR+1];
LoadString(hInst, STR_RETRIES, (LPSTR) tmp1, TMPNSTR); /* mbbx 1.00 ... */
sprintf(tmp2, tmp1, cnt);
setItemText(IDBERRORS, tmp2, TRUE); /* mbbx 2.00: xfer ctrls */
strcpy(strRXErrors, tmp2);
}
/*---------------------------------------------------------------------------*/
/* updateIndicators() - */
/*---------------------------------------------------------------------------*/
VOID updateIndicators() /* mbbx 2.00: moved from DCUTIL2.C ... */
{
if(xferFlag != XFRNONE)
{
UpdateWindow(hdbXferCtrls); /* mbbx 1.04: fkeys... */
if(*strRXFork != 0)
setItemText(IDFORK, strRXFork, TRUE); /* mbbx 2.00: xfer ctrls... */
if(*strRXBytes == 255)
updateProgress(TRUE);
else if(*strRXBytes != 0)
setItemText(IDSCALE, strRXBytes, TRUE);
if(*strRXFname != 0)
setItemText(IDSENDING, strRXFname, TRUE);
if(*strRXErrors != 0)
setItemText(IDBERRORS, strRXErrors, TRUE);
}
}