/*===========================================================================*/
/*          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"


/*---------------------------------------------------------------------------*/
/* updateTermScrollBars() -                                            [mbb] */
/*---------------------------------------------------------------------------*/

VOID updateTermScrollBars(BOOL  bScroll)
{
   INT   saveScrollRange, offset;

   saveScrollRange = nScrollRange.y;
   if((offset = maxScreenLine - visScreenLine) < 0)
      offset = 0;
   if((nScrollRange.y = savTopLine + offset) < 0)
      nScrollRange.y = 0;

   if(((nScrollPos.y > 0) && (nScrollPos.y == saveScrollRange)) || (nScrollPos.y > nScrollRange.y)) 
      nScrollPos.y = nScrollRange.y;

   if(!trmParams.fHideTermVSB)
   {
      SetScrollRange(hTermWnd, SB_VERT, 0, (nScrollRange.y > 0) ? nScrollRange.y : 1, FALSE);
      if (GetScrollPos(hTermWnd, SB_VERT) != nScrollPos.y)    /* jtf 3.14 */
         SetScrollPos(hTermWnd, SB_VERT, nScrollPos.y, TRUE);
   }
   else
      SetScrollRange(hTermWnd, SB_VERT, 0, 0, TRUE);

   if(!trmParams.fHideTermHSB)
   {
      SetScrollRange(hTermWnd, SB_HORZ, 0, (nScrollRange.x > 0) ? nScrollRange.x : 1, FALSE);
      if (GetScrollPos(hTermWnd, SB_HORZ) != nScrollPos.x)    /* jtf 3.14 */
         SetScrollPos(hTermWnd, SB_HORZ, nScrollPos.x, TRUE);
   }
   else
      SetScrollRange(hTermWnd, SB_HORZ, 0, 0, TRUE);

   if(bScroll)
      scrollBits();
}


/*---------------------------------------------------------------------------*/
/* scrollTermWindow() -                                                [mbb] */
/*---------------------------------------------------------------------------*/

proc scrollTermWindow(INT  dh, INT  dv)
{
   ScrollWindow(hTermWnd, -dh*chrWidth, -dv*chrHeight, (LPRECT) &hTE.viewRect,
                (LPRECT) &hTE.viewRect);
}


/*---------------------------------------------------------------------------*/
/* scrollTermLine() -                                                  [mbb] */
/*---------------------------------------------------------------------------*/

proc scrollTermLine(INT  newLine, INT  dh, INT  dv)
{
   RECT  r;

   getPort();
   hTE.active = 0;

   if(dv > 0)
      r.top = hTE.viewRect.bottom - stdChrHeight;
   else
      r.top = 0;
   r.left = hTE.viewRect.left;
   r.bottom = r.top + stdChrHeight;
   r.right = hTE.viewRect.right;

   scrollTermWindow(dh, dv);
   ValidateRect(hTermWnd, (LPRECT) &r);

   reDrawTermLine(newLine, 0, maxChars);
   clipRect(&r);
   termActivate(&hTE);
   releasePort();
}


/*---------------------------------------------------------------------------*/
/* scrollBits() - Move text on term. screen + some IT house keeping.   [mbb] */
/*---------------------------------------------------------------------------*/

VOID scrollBits()
{
   INT   oldTopLine;
   INT   oldLeftCol;
   INT   dh, dv;
   INT   offset;
   INT   lin;

   oldLeftCol = curLeftCol;
   oldTopLine = curTopLine;

   curLeftCol = nScrollPos.x;
   curTopLine = nScrollPos.y;
   dh = curLeftCol - oldLeftCol;
   dv = curTopLine - oldTopLine;

   hideTermCursor();
   if(dh != 0)
   {
      scrollTermWindow(dh, dv);
      UpdateWindow(hTermWnd);
   }
   else if(dv == 1)
      scrollTermLine(curTopLine-savTopLine+visScreenLine, dh, dv);
   else if(dv == -1)
      scrollTermLine(curTopLine-savTopLine, dh, dv);
   else if(dv != 0)
   {
      termDeactivate(&hTE); 
      reDrawTermScreen(0, visScreenLine+1, curTopLine - savTopLine);    /* mbbx 2.00: jtf disp2... */
      termActivate(&hTE); 
   }
   showTermCursor();

   if((curTopLine + visScreenLine) > (savTopLine + maxScreenLine))   /* mbbx 2.00.06: jtf disp2... */
      cleanRect(maxScreenLine+1, (visScreenLine + curTopLine) - (savTopLine + maxScreenLine));
}


/*---------------------------------------------------------------------------*/
/* scrollUp() -                                                              */
/*---------------------------------------------------------------------------*/

VOID scrollUp(INT   nBar, INT   partCode, INT   deltaLines)
{
   LONG   *pScrollPos;

   if(partCode == SB_LINEUP)
   {
      pScrollPos = ((nBar == SB_VERT) ? &nScrollPos.y : &nScrollPos.x);

      if(*pScrollPos > 0)
      {
         *pScrollPos -= deltaLines;
         updateTermScrollBars(TRUE);
      }
   }
}


/*---------------------------------------------------------------------------*/
/* scrollDown() -                                                            */
/*---------------------------------------------------------------------------*/

VOID scrollDown(INT   nBar, INT   partCode, INT   deltaLines)
{
   LONG  *pScrollRange, *pScrollPos;

   if(partCode == SB_LINEDOWN)
   {
      if(nBar == SB_VERT)
      {
         pScrollRange = &nScrollRange.y;
         pScrollPos   = &nScrollPos.y;
      }
      else
      {
         pScrollRange = &nScrollRange.x;
         pScrollPos   = &nScrollPos.x;
      }

      if(*pScrollPos < *pScrollRange)
      {
         *pScrollPos += deltaLines;
         updateTermScrollBars(TRUE);
      }
   }
}


/*---------------------------------------------------------------------------*/
/* pageScroll() -                                                            */
/*---------------------------------------------------------------------------*/

VOID pageScroll(INT   which)
{
   if(which == SB_PAGEUP)
   {
      if((nScrollPos.y -= (visScreenLine + 1)) < 0)
         nScrollPos.y = 0;
   }
   else
   {
      if((nScrollPos.y += (visScreenLine + 1)) > nScrollRange.y)
         nScrollPos.y = nScrollRange.y;
   }

   updateTermScrollBars(TRUE);
   termCleanUp();
}


/*---------------------------------------------------------------------------*/
/* hPageScroll() -                                                           */
/*---------------------------------------------------------------------------*/

VOID hPageScroll(INT   which)
{
   nScrollPos.x = ((which == SB_PAGEUP) ? 0 : nScrollRange.x);
   updateTermScrollBars(TRUE);
   termCleanUp();                            /* mbbx 1.04: per jtfx */
}


/*---------------------------------------------------------------------------*/
/* trackScroll() -                                                     [scf] */
/*---------------------------------------------------------------------------*/

VOID trackScroll(INT   nBar, INT   partCode)
{
   LONG  *pScrollRange, *pScrollPos;
   INT   amount;

   if(nBar == SB_VERT)
   {
      pScrollRange = &nScrollRange.y;
      pScrollPos   = &nScrollPos.y;
   }
   else
   {
      pScrollRange = &nScrollRange.x;
      pScrollPos   = &nScrollPos.x;
   }

   amount = (((partCode == SB_LINEUP) || (partCode == SB_PAGEUP)) ? -1 : 1);

   if(((amount == -1) && (*pScrollPos > 0)) || ((amount == 1) && (*pScrollPos < *pScrollRange)))
   {
      if((partCode == SB_PAGEUP) || (partCode == SB_PAGEDOWN))
      {
         if(nBar == SB_VERT)
         {
            if(amount == -1)
            {
               if((*pScrollPos -= ((hTE.viewRect.bottom - hTE.viewRect.top) / chrHeight)) < 0)
                  *pScrollPos = 0;
            }
            else
            {
               if((*pScrollPos += ((hTE.viewRect.bottom - hTE.viewRect.top) / chrHeight)) > *pScrollRange)
                  *pScrollPos = *pScrollRange;
            }
         }
         else
            *pScrollPos += ((amount == -1) ? 0 : *pScrollRange);
      }
      else
         *pScrollPos += amount;

      updateTermScrollBars(FALSE);
   }
}