dev-disp.cc

//************************************************************************
//  MODULE : Device Manager display module                               *
//  AUTHOR : Ron Chernich                                                *
//  PURPOSE: Perform all actions (except clear screen) associated with   *
//           the Device Manager (TTYs and Printer) screen.               *
//  HISTORY:                                                             *
//   26-MAR-93  First (MSC/C++ 7.00) version                             *
//   26-AUG-94  Class-ified                                              *
//   15-MAR-95  Class to manage terminals added                          *
//   22-MAR-95  (Happy Birthday, Ron!) No of terminals made dynamic      *
//   23-MAR-95  Mod so F5 repaint function does tty display contents too *
//************************************************************************


#include "dev-disp.hh"

	    #if defined(BC20) || defined(BC31)
	    // fix for BC20, can't return reference to temp object
	    rect pTemp( 0, 0, 0, 0 );
	    #endif

///////////////////////////////////////////////////////////////////////
// Create the Terminals object that manages the user device representation
//
TTyAnim::TTyAnim (Knl *pKnl, UINT16 n)
{
  pTerms = new Terminals(pKnl, n);
}

//////////////
// get rid of the rubbish
//
TTyAnim::~TTyAnim (void)
{
  if (pTerms)
    delete pTerms;
}

////////////////
// Paint the video console frames..
//
void TTyAnim::Paint (void)
{
  if (pTerms)
    pTerms->Paint();
}

//////////////
// get the location of the passed user terminal number
//
rect& TTyAnim::GetTTyPos (UINT16 n)
{
  if (pTerms)
    return pTerms->GetPos(n);
  #if defined(BC20) || defined (BC31)
    return pTemp;
  #else
    return rect(0, 0, 0, 0);
  #endif

}


///////////////////////////////////////////////////////////////////////
// Create TTY device instances; one for each user terminal as defined
// by the system preference . If any one fails, null its pointer.
//
Terminals::Terminals (Knl *pKnl, UINT16 n) : nTerm(n)
{
  pTerm = new tty*[nTerm];
  pttyPos = new rect[nTerm];
  int tty_width = (GFX_Xmin - (TTY_XGAP * 3)) / 2;
  int tty_height =
    (TTY_YLIM2 - TTY_YLIM1 - (TTY_YGAP * ((nTerm+1) / 2))) / ((nTerm+1) / 2);
  for (UINT16 i = 0; i < nTerm; i++) {
    pttyPos[i].lr = point(tty_width, tty_height);
    pttyPos[i].ul.x = (i % 2) ? ((TTY_XGAP * 2) + tty_width) : TTY_XGAP;
    pttyPos[i].ul.y =
      TTY_YLIM1 + (TTY_YGAP / 3) + ((i / 2) * (TTY_YGAP + tty_height));
    if ((nTerm == i + 1) && (nTerm % 2))
      pttyPos[i].lr.x += (tty_width + TTY_XGAP);
    pTerm[i] = new tty(ID_TTY_BASE + i, CLS_VDU, pKnl,
                       pttyPos[i], TTY_TXT, TTY_SCRN);
    if (pTerm[i])
      pTerm[i]->SetMode(TTY_Uscore);
    else
      pttyPos[i] = rect(0, 0, 0, 0);
  }
}
        
//////////
// kill off all terminals created.
//
Terminals::~Terminals (void)
{
  if (pTerm) {
    for (UINT16 i = 0; i < nTerm; i++)
      if (pTerm[i])
        delete pTerm[i];
    delete pTerm;
  }
  if (pttyPos)
    delete pttyPos;
}


//////////
// Repaint representation and contents of all terminals.
//
void Terminals::Refresh (void)
{
  for (UINT16 i = 0; i < nTerm; i++)
    if (pTerm[i])
      pTerm[i]->ReFresh();
}

//////////
// Temporarily inhibit all terminals
//
void Terminals::DeActivate (void)
{
  for (UINT16 i = 0; i < nTerm; i++)
    if (pTerm[i])
      pTerm[i]->SetMode(pTerm[i]->GetMode() & ~TTY_Active);
}

//////////
// Activate and display all terminals
//
void Terminals::Activate (void)
{
  for (UINT16 i = 0; i < nTerm; i++)
    if (pTerm[i])
      pTerm[i]->SetMode(pTerm[i]->GetMode() | TTY_Active);
}

//////////////
// draw the terminal frames
//
void Terminals::Paint (void)
{
  for (UINT16 i = 0; i < nTerm; i++)
    if (pTerm[i]) {
      GfxRect(pttyPos[i].ul.x - 2, pttyPos[i].ul.y - 2,
              pttyPos[i].ul.x + pttyPos[i].lr.x + 2,
              pttyPos[i].ul.y + pttyPos[i].lr.y + 16, GFX_Fill, TTY_FRAME);
      GfxRect(pttyPos[i].ul.x - 3, pttyPos[i].ul.y - 3,
              pttyPos[i].ul.x + pttyPos[i].lr.x + 3,
              pttyPos[i].ul.y + pttyPos[i].lr.y + 17, GFX_Frame, TTY_BDR);
      GfxRect(pttyPos[i].ul.x, pttyPos[i].ul.y,
              pttyPos[i].ul.x + pttyPos[i].lr.x,
              pttyPos[i].ul.y + pttyPos[i].lr.y, GFX_Fill, TTY_SCRN);
    }
  Refresh();
}

///////////////////////////////// EOF //////////////////////////////////////