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

512 lines
14 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"
/*---------------------------------------------------------------------------*/
BOOL insertionPoint;
LONG anchorNdx, lastNdx;
/*---------------------------------------------------------------------------*/
/* pointToLong() - Convert coordinates (pt.x, pt.y) relative to the */
/* current display to an absolute buffer index. */
/*---------------------------------------------------------------------------*/
VOID pointToLong(POINT pt, LONG *l)
{
INT row, col;
if((col = ((pt.x + (chrWidth / 2) - 1) / chrWidth) + curLeftCol) < 0)
col = 0;
else if(col > maxChars)
col = maxChars;
if((row = (pt.y / chrHeight) + curTopLine) < 0)
row = 0;
else if(row > maxLines)
{
row = maxLines;
col = 0;
}
*l = (row * (maxChars + 2)) + col;
}
/*---------------------------------------------------------------------------*/
/* rcToPoint () - Convert absolute rc.row, rc.col to coordinates (GDI) */
/* relative to the currently displayed portion of the buffer. */
/*---------------------------------------------------------------------------*/
VOID rcToPoint (ROWCOL rc, POINT *pt, INT bottom)
{
pt->y = hTE.viewRect.top + (rc.row - curTopLine) * chrHeight + bottom;
pt->x = hTE.viewRect.left + (rc.col - curLeftCol) * chrWidth;
}
/*---------------------------------------------------------------------------*/
/* rcToPointS () - Convert absolute rc.row, rc.col to coordinates (GDI) */
/* relative to the currently displayed portion of the buffer. */
/*---------------------------------------------------------------------------*/
#ifdef NOMORE
VOID rcToPointS (ROWCOL rc, POINT *pt, INT bottom)
{
pt->y = hTE.viewRect.top + (rc.row - curTopLine) * chrHeight + bottom;
pt->x = hTE.viewRect.left + (rc.col - curLeftCol) * chrWidth;
}
#endif
/*---------------------------------------------------------------------------*/
/* longToPoint () - Convert selection to coordinates relative */
/* to the currently displayed portion of the buffer. */
/*---------------------------------------------------------------------------*/
VOID longToPoint(LONG sel, POINT *pt)
{
ROWCOL rc;
rc.row = sel / (maxChars + 2);
if((rc.col = sel % (maxChars + 2)) > maxChars)
rc.col = maxChars;
rcToPoint(rc, pt, 0);
}
/*---------------------------------------------------------------------------*/
/* hiliteSelect() - */
/*---------------------------------------------------------------------------*/
VOID NEAR invertSelectRect(NPRECT pRect)
{
INT viewRectEnd, offset;
viewRectEnd = hTE.viewRect.bottom;
if((offset = (curTopLine + visScreenLine) - (savTopLine + maxScreenLine)) > 0)
viewRectEnd -= (offset * chrHeight);
if(pRect->top > viewRectEnd)
pRect->top = viewRectEnd;
if(pRect->bottom > viewRectEnd)
pRect->bottom = viewRectEnd;
InvertRect(thePort, (LPRECT) pRect);
}
VOID hiliteSelect(LONG lSelStart, LONG lSelEnd)
{
ROWCOL selStart, selEnd;
RECT hiliteRect;
getPort();
selStart.row = lSelStart / (maxChars + 2);
selStart.col = lSelStart % (maxChars + 2);
selEnd.row = lSelEnd / (maxChars + 2);
selEnd.col = lSelEnd % (maxChars + 2);
if(lSelEnd > lSelStart)
{
if(selStart.row == selEnd.row)
{
rcToPoint(selStart, (PPOINT) &hiliteRect.left, 0);
rcToPoint(selEnd, (PPOINT) &hiliteRect.right, chrHeight);
invertSelectRect(&hiliteRect);
}
else
{
rcToPoint(selStart, (PPOINT) &hiliteRect.left, 0);
selStart.col = maxChars;
rcToPoint(selStart, (PPOINT) &hiliteRect.right, chrHeight);
invertSelectRect(&hiliteRect);
selStart.row += 1;
selStart.col = 0;
if(selEnd.row > selStart.row)
{
rcToPoint(selStart, (PPOINT) &hiliteRect.left, 0);
selStart.row = selEnd.row - 1;
selStart.col = maxChars;
rcToPoint(selStart, (PPOINT) &hiliteRect.right, chrHeight);
invertSelectRect(&hiliteRect);
selStart.col = 0;
}
if(selStart.col != selEnd.col)
{
selStart.row = selEnd.row;
rcToPoint(selStart, (PPOINT) &hiliteRect.left, 0);
rcToPoint(selEnd, (PPOINT) &hiliteRect.right, chrHeight);
invertSelectRect(&hiliteRect);
}
}
}
else if((lSelEnd == lSelStart) && insertionPoint)
{
rcToPoint(selStart, (PPOINT) &hiliteRect.left, 0);
rcToPoint(selEnd, (PPOINT) &hiliteRect.right, chrHeight);
hiliteRect.right += GetSystemMetrics(SM_CXBORDER);
invertSelectRect(&hiliteRect);
}
releasePort();
}
/*---------------------------------------------------------------------------*/
/* termActivate() - */
/*---------------------------------------------------------------------------*/
VOID termActivate (tEHandle *hTE)
{
if (!hTE->active)
{
hiliteSelect (hTE->selStart, hTE->selEnd);
hTE->active = TRUE;
}
}
/*---------------------------------------------------------------------------*/
/* termDeactivate() - */
/*---------------------------------------------------------------------------*/
VOID termDeactivate (tEHandle *hTE)
{
if (hTE->active)
{
hiliteSelect (hTE->selStart, hTE->selEnd);
hTE->active = FALSE;
}
}
/*---------------------------------------------------------------------------*/
/* termSetSelect() - */
/*---------------------------------------------------------------------------*/
VOID termSetSelect (LONG selStart, LONG selEnd)
{
LONG eob;
eob = maxLines * (maxChars + 2);
if (selStart > eob)
selStart = eob;
if (selEnd > eob)
selEnd = eob;
if (hTE.active)
{
hiliteSelect (hTE.selStart, hTE.selEnd);
hiliteSelect (selStart, selEnd);
}
hTE.selStart = selStart;
hTE.selEnd = selEnd;
}
/*---------------------------------------------------------------------------*/
/* extendSelect () - */
/*---------------------------------------------------------------------------*/
VOID extendSelect (LONG anchorRc, LONG lastRc)
{
if (lastRc < hTE.selStart)
{
if (anchorRc == hTE.selStart)
termSetSelect (lastRc, anchorRc);
else
{
hiliteSelect (lastRc, hTE.selStart);
hTE.selStart = lastRc;
}
}
else if (lastRc > hTE.selEnd)
{
if (anchorRc == hTE.selEnd)
termSetSelect (anchorRc, lastRc);
else
{
hiliteSelect (hTE.selEnd, lastRc);
hTE.selEnd = lastRc;
}
}
else
{
if (anchorRc == hTE.selStart)
{
hiliteSelect (lastRc, hTE.selEnd);
hTE.selEnd = lastRc;
}
else
{
hiliteSelect (hTE.selStart, lastRc);
hTE.selStart = lastRc;
}
}
}
/*---------------------------------------------------------------------------*/
/* keyBoardToMouse() - */
/*---------------------------------------------------------------------------*/
VOID keyBoardToMouse(INT partCode) /* mbbx 2.01.185 ... */
{
DEBOUT("keyBoardToMouse(): %s\n","TAKE CARE OF LastPoint MPOIN/POINT");
switch(partCode)
{
case VK_LEFT:
if((lastPoint.x > 0) || (curLeftCol > 0))
{
lastPoint.x -= chrWidth;
break;
}
/* else fall thru... */
case VK_UP:
if((lastPoint.y > 0) || (curTopLine > 0))
{
lastPoint.y -= chrHeight;
if(partCode == VK_LEFT)
lastPoint.x = (maxChars * chrWidth);
}
else
MessageBeep(0);
break;
case VK_RIGHT:
case VK_DOWN:
if(lastPoint.y <= (((savTopLine + maxScreenLine) - curTopLine) * chrHeight))
{
if((partCode == VK_RIGHT) &&
(lastPoint.x < ((maxChars - curLeftCol) * chrWidth)))
{
lastPoint.x += chrWidth;
}
else if(((lastPoint.y += chrHeight) > (((savTopLine + maxScreenLine) -
curTopLine) * chrHeight)) || (partCode == VK_RIGHT))
{
lastPoint.x = -((curLeftCol + 1) * chrWidth);
}
}
else
MessageBeep(0);
break;
}
}
/*---------------------------------------------------------------------------*/
/* termClick() - Handles mouse & keyboard for selection ranges. */
/*---------------------------------------------------------------------------*/
VOID hideInsertionPoint()
{
if(hTE.selStart == hTE.selEnd)
hiliteSelect(hTE.selStart, hTE.selEnd);
insertionPoint = FALSE;
}
/*---------------------------------------------------------------------------*/
BOOL stillDown(BOOL keyboard)
{
MSG msg;
BOOL result;
result = TRUE;
if (!keyboard)
{
if (PeekMessage(&msg, hTermWnd, WM_MOUSEFIRST, WM_MOUSELAST, TRUE))
{
switch (msg.message)
{
case WM_LBUTTONUP:
result = FALSE;
break;
case WM_MOUSEMOVE:
// lastPoint = MAKEMPOINT(msg.lParam);
lastPoint.x = (LONG)LOWORD(msg.lParam);
lastPoint.y = (LONG)HIWORD(msg.lParam);
break;
}
}
}
else
result = FALSE;
return result;
}
/*---------------------------------------------------------------------------*/
VOID showInsertionPoint()
{
insertionPoint = TRUE;
if(hTE.selStart == hTE.selEnd)
hiliteSelect(hTE.selStart, hTE.selEnd);
}
/*---------------------------------------------------------------------------*/
VOID termClick(POINT anchorPt, BOOL extend, INT partCode)
{
BOOL keyboard;
if (scrapSeq || ((xferFlag != XFRNONE) && (xferFlag != XFRRCV)) )
return;
hideInsertionPoint();
if(keyboard = (partCode != 0))
{
if((hTE.selStart == hTE.selEnd) && !extend)
{
if(anchorPt.y < 0)
anchorPt.y = 0;
else if(anchorPt.y > ((visScreenLine + 1) * chrHeight))
anchorPt.y = ((visScreenLine + 1) * chrHeight);
lastPoint = anchorPt;
pointToLong(anchorPt, &anchorNdx);
termSetSelect(anchorNdx, anchorNdx);
}
else
{
longToPoint(lastNdx, &lastPoint);
if(lastNdx == hTE.selStart)
anchorNdx = hTE.selEnd;
else
anchorNdx = hTE.selStart;
}
keyBoardToMouse(partCode);
}
else
{
SetCapture(hTermWnd);
lastPoint = anchorPt;
pointToLong(anchorPt, &anchorNdx);
if(extend)
{
if(anchorNdx >= hTE.selStart)
anchorNdx = hTE.selStart;
else
anchorNdx = hTE.selEnd;
}
else
termSetSelect(anchorNdx, anchorNdx);
}
repeat
{
pointToLong(lastPoint, &lastNdx);
pasClikLoop();
if(keyboard && !extend)
{
anchorNdx = lastNdx;
termSetSelect(lastNdx, lastNdx);
}
else
extendSelect(anchorNdx, lastNdx);
}
until(!stillDown(keyboard));
if(!keyboard)
ReleaseCapture();
showInsertionPoint();
}
/*---------------------------------------------------------------------------*/
/* getPort() - */
/*---------------------------------------------------------------------------*/
HDC getPort ()
{
if (thePort == 0)
{
thePort = GetDC (hTermWnd);
SelectObject (thePort, hTE.hFont);
portLocks = 1;
}
else
portLocks++;
return thePort;
}
/*---------------------------------------------------------------------------*/
/* releasePort() - */
/*---------------------------------------------------------------------------*/
VOID releasePort ()
{
if (--portLocks <= 0)
{
ReleaseDC (hTermWnd,thePort);
thePort = 0;
}
}
/*---------------------------------------------------------------------------*/
/* pasClickLoop() - */
/*---------------------------------------------------------------------------*/
BOOL APIENTRY pasClikLoop() /* mbbx 2.01.185 ... */
{
INT ndx;
POINT PointL;
if (lastPoint.y < hTE.viewRect.top - chrHeight)
lastPoint.y = hTE.viewRect.top - chrHeight; /* jtf 3.21 */
if (lastPoint.y > hTE.viewRect.bottom)
lastPoint.y = hTE.viewRect.bottom; /* jtf 3.21 */
/* changed &hTE.viewRect to &(hTE.viewRect) to see if error goes -sdj */
/* Actual error was due to lastPoint being MPOINT ie POINTS, changed type -sdj */
/* changed lastPoint back to MPOINT and taking care of conversion here -sdj*/
if(!PtInRect((LPRECT) &(hTE.viewRect), lastPoint))
{
for(ndx = lastPoint.y; ndx < hTE.viewRect.top; ndx += chrHeight)
trackScroll(SB_VERT, SB_LINEUP);
while(ndx >= hTE.viewRect.bottom)
{
trackScroll(SB_VERT, SB_LINEDOWN);
ndx -= chrHeight;
}
for(ndx = lastPoint.x; ndx < hTE.viewRect.left; ndx += chrWidth)
trackScroll(SB_HORZ, SB_LINEUP);
while(ndx >= hTE.viewRect.right)
{
trackScroll(SB_HORZ, SB_LINEDOWN);
ndx -= chrWidth;
}
scrollBits();
}
return(TRUE);
}