/* Copyright (c) 1987 - 1988, Future Soft Engineering, Inc. */ /* Houston, Texas */ /*===========================================================================*/ #define NOLSTRING TRUE /* jtf win3 mod */ #include #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); }