www.pudn.com > commutil.zip > WINDOW.CPP


// ******************************************************************** // 
//                                                                      // 
//      WINDOW.CPP                                                      // 
//      Copyright (c) 1993, Michael Holmes and Bob Flanders             // 
//      C++ Communication Utilities                                     // 
//                                                                      // 
//      Chapter 7: Receiving a FAX                                      // 
//      Last changed in chapter 2                                       // 
//                                                                      // 
//      This file contains the definition and interface for             // 
//      the window class.                                               // 
//                                                                      // 
// ******************************************************************** // 
 
 
extern 
int    _wscroll;                            // screen scrolling flag 
 
enum    boxes                               // line drawing box types 
    { 
    none = -1,                              // no box 
    single_line,                            // single line box 
    double_line                             // double line box 
    }; 
 
struct  box_characters                      // box drawing characters 
     { 
     char ul_char,                          // upper left corner 
          ur_char,                          // upper right corner 
          ll_char,                          // lower left corner 
          lr_char,                          // lower right corner 
          top_char,                         // horizontal line 
          side_char;                        // vertical line 
     } box_chars[2] = 
         { 
         { '\xda', '\xbf', '\xc0', '\xd9',  // single line box 
           '\xc4', '\xb3'}, 
         { '\xc9', '\xbb', '\xc8', '\xbc',  // double line box 
           '\xcd', '\xba'} 
         }; 
 
class Window 
    { 
    public: 
        Window(char ul_c, char ul_r,        // define window, upper left 
               char lr_c, char lr_r,        //   lower right, 
               char cn,   char cr);         //   normal & reverse colors 
        void Open(boxes box = none),        // open window 
             AtSay(int c, int r, char *s),  // display string at position 
             AtSayReverse(int c, int r,     // display string at position 
               char *s),                    //   in reverse video 
             Display(char),                 // display a character 
             Display(char *s),              // display a string 
             DisplayReverse(char *s),       // display string in rev video 
             Clear(void),                   // clear window 
             GotoXY(int c, int r),          // goto xy location 
             MakeCurrent(void),             // make window current 
             Close(void);                   // close window 
       ~Window();                           // destructor 
 
    private: 
        char  ul_col, ul_row,               // window upper left 
              lr_col, lr_row,               // ..and lower right 
              cursor_col, cursor_row,       // cursor column and row 
              cn_color, cr_color,           // norm and reverse colors 
             *old_data,                     // overlaid data 
              open_flag,                    // window open/close flag 
              scroll_flag;                  // scrolling enabled flag 
        boxes border_flag;                  // border type 
    }; 
 
 
 
// 
//  Globals 
// 
 
int     max_lines = 25;                     // max lines on screen 
 
Window *last_window;                        // last window pointer 
 
 
 
/* ******************************************************************** * 
 * 
 *  Window -- define window instance 
 * 
 * ******************************************************************** */ 
 
Window::Window(char ul_c, char ul_r,        // upper left corner 
               char lr_c, char lr_r,        // lower right corner 
               char cn,   char cr)          // normal and reverse colors 
{ 
 
ul_col = ul_c;                              // save window coordinates 
ul_row = ul_r;                              // ..row and column 
lr_col = lr_c;                              // ..for upper left 
lr_row = lr_r;                              // ..and lower right 
 
cn_color = cn;                              // save user colors 
cr_color = cr;                              // ..for later 
 
cursor_col = cursor_row = 1;                // init cursor column and row 
open_flag = 0;                              // clear open flags 
 
old_data = new char[(((lr_c - ul_c) + 1)    // get work buffer 
            * ((lr_r - ul_r) + 1)) * 2];    // ..for old screen image 
 
} 
 
 
 
/* ******************************************************************** * 
 * 
 *  Open -- open a window 
 * 
 * ******************************************************************** */ 
 
void    Window::Open(boxes box)             // border flag 
{ 
int     i;                                  // loop control 
struct  box_characters *b;                  // box characters 
 
 
if (open_flag)                              // q. window already opened? 
    return;                                 // a. yes .. just return 
 
border_flag = box;                          // set border flag 
open_flag = 1;                              // show window opened 
 
gettext(ul_col, ul_row, lr_col, lr_row,     // capture old screen data 
            old_data);                      // ..to temp buffer 
 
window(ul_col, ul_row, lr_col, lr_row);     // make window active 
 
textcolor(FG(cn_color));                    // set up foreground 
textbackground(BG(cn_color));               // ..and background colors 
 
clrscr();                                   // clear window 
scroll_flag = _wscroll;                     // ..and save scroll setting 
 
if (box != none)                            // q. border requested? 
    {                                       // a. yes .. draw the box 
    b = &box_chars[box];                    // get line drawing group 
    _wscroll = 0;                           // disable scrolling 
 
    gotoxy(1, 1);                           // goto upper left corner 
    cprintf("%c", b->ul_char);              // put out first corner 
 
    for (i = 1; i < (lr_col - ul_col); i++) // build top of box.. 
        cprintf("%c", b->top_char);         // ..with horizontals 
 
    cprintf("%c", b->ur_char);              // ..and upper right corner 
 
    gotoxy(1, (lr_row - ul_row) + 1);       // goto lower left corner 
    cprintf("%c", b->ll_char);              // put out bottom corner 
 
    for (i = 1; i < (lr_col - ul_col); i++) // build bottom of box 
        cprintf("%c", b->top_char);         // ..with horizontals 
 
    cprintf("%c", b->lr_char);              // ..and lower right corner 
 
    for (i = 2; i <= (lr_row - ul_row); i++)// put the sides on the box 
        { 
        gotoxy(1, i);                       // jump to left side of box 
        cprintf("%c", b->side_char);        // ..and draw a chunk 
 
        gotoxy((lr_col - ul_col) + 1, i);   // ..then jump to right side 
        cprintf("%c", b->side_char);        // ..of the box and draw 
        } 
 
    _wscroll = scroll_flag;                 // restore scrolling mode 
 
    } 
} 
 
 
 
/* ******************************************************************** * 
 * 
 *  AtSay -- display string at position 
 * 
 * ******************************************************************** */ 
 
void    Window::AtSay(int c, int r,         // column and row to 
              char *s)                      // display string 
{ 
 
GotoXY(c, r);                               // set up at the right place 
 
cprintf("%s", s);                           // display string in window 
 
cursor_col = wherex();                      // save cursor column.. 
cursor_row = wherey();                      // ..and cursor row 
 
} 
 
 
 
/* ******************************************************************** * 
 * 
 *  AtSayReverse -- display string at position in reverse video 
 * 
 * ******************************************************************** */ 
 
void    Window::AtSayReverse(int c, int r,  // column and row to 
              char *s)                      // display string 
{ 
 
GotoXY(c, r);                               // set up at the right place 
textcolor(FG(cr_color));                    // set up foreground 
textbackground(BG(cr_color));               // ..and background colors 
 
cprintf("%s", s);                           // display string in window 
 
cursor_col = wherex();                      // save cursor column.. 
cursor_row = wherey();                      // ..and cursor row 
textcolor(FG(cn_color));                    // then set colors back to 
textbackground(BG(cn_color));               // ..their normal settings 
 
} 
 
 
 
/* ******************************************************************** * 
 * 
 *  Display -- display a character in a window 
 * 
 * ******************************************************************** */ 
 
void    Window::Display(char c)             // character to display 
{ 
 
MakeCurrent();                              // make this window current 
cprintf("%c", c);                           // display string in window 
cursor_col = wherex();                      // save cursor column.. 
cursor_row = wherey();                      // ..and cursor row 
 
} 
 
 
 
/* ******************************************************************** * 
 * 
 *  Display -- display string in window 
 * 
 * ******************************************************************** */ 
 
void    Window::Display(char *s)            // string to display 
{ 
 
MakeCurrent();                              // make this window current 
cprintf("%s", s);                           // display string in window 
cursor_col = wherex();                      // save cursor column.. 
cursor_row = wherey();                      // ..and cursor row 
 
} 
 
 
 
/* ******************************************************************** * 
 * 
 *  DisplayReverse -- display string in reverse video 
 * 
 * ******************************************************************** */ 
 
void    Window::DisplayReverse(char *s)     // string to display 
{ 
 
MakeCurrent();                              // make this window current 
textcolor(FG(cr_color));                    // set up foreground 
textbackground(BG(cr_color));               // ..and background colors 
 
cprintf("%s", s);                           // display string in window 
 
cursor_col = wherex();                      // save cursor column.. 
cursor_row = wherey();                      // ..and cursor row 
textcolor(FG(cn_color));                    // then set colors back to 
textbackground(BG(cn_color));               // ..their normal settings 
 
} 
 
 
 
/* ******************************************************************** * 
 * 
 *  Clear -- clear current window 
 * 
 * ******************************************************************** */ 
 
void    Window::Clear(void) 
{ 
 
MakeCurrent();                              // make this window current 
clrscr();                                   // ..then clear it 
 
cursor_col = wherex();                      // save cursor column.. 
cursor_row = wherey();                      // ..and cursor row 
 
} 
 
 
 
/* ******************************************************************** * 
 * 
 *  GotoXY -- position cursor in window 
 * 
 * ******************************************************************** */ 
 
void    Window::GotoXY(int c, int r)        // column and row 
{ 
 
MakeCurrent();                              // make this window current 
gotoxy(c, r);                               // goto requested location 
cursor_col = wherex();                      // save cursor column.. 
cursor_row = wherey();                      // ..and cursor row 
 
} 
 
 
 
/* ******************************************************************** * 
 * 
 *  Close -- close window and restore screen 
 * 
 * ******************************************************************** */ 
 
void    Window::Close(void) 
{ 
 
if (NOT open_flag)                          // q. window already closed? 
    return;                                 // a. yes .. just return 
 
open_flag = 0;                              // clear opened flag 
 
puttext(ul_col, ul_row, lr_col, lr_row,     // restore old screen data 
            old_data);                      // ..from temp buffer 
 
} 
 
 
 
/* ******************************************************************** * 
 * 
 *  ~Window -- destructor 
 * 
 * ******************************************************************** */ 
 
Window::~Window() 
{ 
 
if (open_flag)                              // q. window still open? 
    Close();                                // a. yes .. close window 
 
last_window = 0;                            // clear window pointer 
delete old_data;                            // de-allocate screen buffer 
window(1, 1, 80, max_lines);                // set whole screen as window 
 
} 
 
 
 
/* ******************************************************************** * 
 * 
 *  MakeCurrent -- make this window current 
 * 
 * ******************************************************************** */ 
 
void    Window::MakeCurrent(void) 
{ 
 
if (last_window != this)                    // q. same window? 
    { 
    last_window = this;                     // a. no .. use this window 
    _wscroll = scroll_flag;                 // ..and set up scroll flag 
 
    if (border_flag == none)                // q. any border? 
        window(ul_col, ul_row,              // a. no .. set up window 
                lr_col, lr_row);            // ..using entire area 
     else 
        window(ul_col + 1, ul_row + 1,      // else .. set up the window 
                lr_col - 1, lr_row - 1);    // ..allowing for the border 
 
    gotoxy(cursor_col, cursor_row);         // ..and re-place cursor 
    textcolor(FG(cn_color));                // ..and set up foreground 
    textbackground(BG(cn_color));           // ..and background colors 
    } 
}