home *** CD-ROM | disk | FTP | other *** search
/ Shareware Supreme Volume 6 #1 / swsii.zip / swsii / 099 / DFPP02.ZIP / DFWINDOW.CPP < prev    next >
C/C++ Source or Header  |  1993-08-16  |  7KB  |  297 lines

  1. // ------------ dfwindow.cpp
  2.  
  3. #include "dflatpp.h"
  4. #include "frame.h"
  5. #include "desktop.h"
  6.  
  7. // -------- common constructor initialization code
  8. void DFWindow::InitWindow(int lf, int tp,
  9.                 int ht, int wd, DFWindow *par)
  10. {
  11.     windowtype = DFlatWindow;
  12.     if (lf == -1)
  13.         lf = (desktop.screen().Width()-wd)/2;
  14.     if (tp == -1)
  15.         tp = (desktop.screen().Height()-ht)/2;
  16.     if (ht == -1)
  17.         ht = desktop.screen().Height();
  18.     if (wd == -1)
  19.         wd = desktop.screen().Width();
  20.     attrib = restored_attrib = 0;
  21.     title = 0;
  22.     ctlmenu = 0;
  23.     videosave = 0;
  24.     visible = False;
  25.     prevcapture = 0;
  26.     prevfocus = 0;
  27.     SetParent(par);
  28.     BorderAdj = TopBorderAdj = BottomBorderAdj = 0;
  29.     Rect rcc(lf, tp, lf+wd-1, tp+ht-1);
  30.     restored_rc = rect = rcc;
  31.     clearch = ' ';
  32.     DblBorder = True;
  33.     Enqueue();
  34.     windowstate = OPEN;
  35. }
  36.  
  37. void DFWindow::InitWindow(char *ttl, int lf, int tp,
  38.             int ht, int wd, DFWindow *par)
  39. {
  40.     InitWindow(lf, tp, ht, wd, par);
  41.     attrib |= TITLEBAR;
  42.     title = new String(ttl);
  43. }
  44.  
  45. void DFWindow::CloseWindow()
  46. {
  47.     windowstate = CLOSING;
  48.     Hide();
  49.     // ------- close window's children
  50.     DFWindow *Wnd = First();
  51.     while (Wnd != 0)    {
  52.         Wnd->CloseWindow();
  53.         Wnd = Wnd->Next();
  54.     }
  55.     // ------ delete this window's memory
  56.     delete title;
  57.     title = 0;
  58.     delete videosave;
  59.     videosave = 0;
  60.     DeleteCtlMenu();
  61.     if (desktop.FocusCapture() == this)
  62.         ReleaseFocus();
  63.     else if (this == desktop.InFocus())    {
  64.         if (Parent() == 0)
  65.             desktop.SetFocus(0);
  66.         else if (Parent()->windowstate == CLOSING)    
  67.             desktop.SetFocus(Parent());
  68.         else     {
  69.                NextSiblingFocus();
  70.                if (this == desktop.InFocus())
  71.                    if (!Parent()->SetFocus())
  72.                        desktop.SetFocus(0);
  73.         }
  74.     }
  75.     Dequeue();
  76.     windowstate = CLOSED;
  77. }
  78.  
  79. // -------- set the fg/bg colors for the window 
  80. void DFWindow::SetColors()
  81. {
  82.     colors.fg = 
  83.     colors.sfg = 
  84.     colors.ffg = 
  85.     colors.hfg = WHITE;
  86.     colors.bg = 
  87.     colors.sbg = 
  88.     colors.fbg = 
  89.     colors.hbg = BLACK;
  90. }
  91.  
  92. // ---------- display the window
  93. void DFWindow::Show()
  94. {
  95.     if (windowstate != CLOSING)    {
  96.         SetColors();
  97.         if (attrib & SAVESELF)    {
  98.             Rect rc = ShadowedRect();
  99.             if (videosave == 0)    {
  100.                 int sz = rc.Height() * rc.Width() * 2;
  101.                 videosave = new char[sz];
  102.             }
  103.             if (!visible)
  104.                 desktop.screen().GetBuffer(rc, videosave);
  105.         }
  106.         visible = True;
  107.         Paint();
  108.         Border();
  109.         Shadow();
  110.         // --- show the children of this window
  111.         DFWindow *Wnd = First();
  112.         while (Wnd != 0)    {
  113.             Wnd->Show();
  114.             Wnd = Wnd->Next();
  115.         }
  116.     }
  117. }
  118.  
  119. Rect DFWindow::ShadowedRect()
  120. {
  121.     Rect rc = rect;
  122.     if (attrib & SHADOW)    {
  123.         rc.Right()++;
  124.         rc.Bottom()++;
  125.     }
  126.     return rc;
  127. }
  128.  
  129. void DFWindow::Hide()
  130. {
  131.     if (visible)    {
  132.         visible = False;
  133.         // ----- hide the children
  134.         DFWindow *Wnd = First();
  135.         while (Wnd != 0)    {
  136.             Wnd->Hide();
  137.             Wnd = Wnd->Next();
  138.         }
  139.         Rect rc = ShadowedRect();
  140.         if (videosave != 0)    {
  141.             desktop.screen().PutBuffer(rc, videosave);
  142.             delete videosave;
  143.             videosave = 0;
  144.         }
  145.     }
  146. }
  147.  
  148. Bool DFWindow::isDescendedFrom(DFWindow *ancestor)
  149. {
  150.     DFWindow *wnd = this;
  151.     while (wnd != 0)    {
  152.         if (wnd == ancestor)
  153.             return True;
  154.         wnd = wnd->Parent();
  155.     }
  156.     return False;
  157. }
  158.  
  159. void DFWindow::Keyboard(int key)
  160. {
  161.     switch (key)    {
  162.         case F1:
  163.             HelpFunction();
  164.             return;
  165.         case ALT_F6:
  166.             NextSiblingFocus();
  167.             return;
  168.         case ' ':
  169.             if ((desktop.keyboard().GetShift() & ALTKEY) == 0)
  170.                 break;
  171.             // --- fall through
  172.         case ALT_HYPHEN:
  173.             if (attrib & CONTROLBOX)    {
  174.                 OpenCtlMenu();
  175.                 return;
  176.             }
  177.             break;
  178.         case CTRL_F4:
  179.             if (Parent() && (attrib & CONTROLBOX))    {
  180.                 CloseWindow();
  181.                 return;
  182.             }
  183.             break;
  184.         default:
  185.             break;
  186.     }
  187.     // --- send all unprocessed keystrokes 
  188.     //     to the parent window
  189.     if (Parent() != 0)
  190.         Parent()->Keyboard(key);
  191. }
  192.  
  193. void DFWindow::HelpFunction()
  194. {
  195.     if (Parent() != 0)
  196.         Parent()->HelpFunction();
  197. }
  198.  
  199. void DFWindow::ShiftChanged(int sk)
  200. {
  201.     if (Parent() != 0)
  202.         Parent()->ShiftChanged(sk);
  203. }
  204.  
  205. void DFWindow::DoubleClick(int mx, int my)
  206. {
  207.     if (HitControlBox(mx, my))
  208.         CloseWindow();
  209. }
  210.  
  211. void DFWindow::LeftButton(int mx, int my)
  212. {
  213.     if (my == Top())    {
  214.         // ----- hit the top border
  215.         if (HitControlBox(mx, my) && (attrib & CONTROLBOX))
  216.             // ------- hit the control box
  217.             OpenCtlMenu();
  218.         else if (attrib & MOVEABLE)
  219.             // ---- move the window
  220.             new Frame(this, mx);
  221.     }
  222.     else if ((attrib & SIZEABLE) && windowstate == OPEN)
  223.         if (mx == Right() && my == Bottom())
  224.             // --- hit the lower right corner, size the window
  225.             new Frame(this);
  226.     prevmouseline = my;
  227.     prevmousecol = mx;
  228. }
  229.  
  230. void DFWindow::ButtonReleased(int, int)
  231. {
  232.     prevmouseline = -1;
  233.     prevmousecol = -1;
  234. }
  235.  
  236. Rect DFWindow::ClientRect()
  237. {
  238.     Rect rc(ClientLeft(), ClientTop(),
  239.         ClientRight(), ClientBottom());
  240.     return rc;
  241. }
  242.  
  243. void DFWindow::ChangePosition(int x, int y)
  244. {
  245.     int ht = Height();
  246.     int wd = Width();
  247.     rect.Left() = x;
  248.     rect.Top() = y;
  249.     rect.Right() = Left()+wd-1;
  250.     rect.Bottom() = Top()+ht-1;
  251.     restored_rc = rect;
  252. }
  253.  
  254. // ------------ move a window
  255. void DFWindow::Move(int x, int y)
  256. {
  257.     int xdif = x - Left();
  258.     int ydif = y - Top();
  259.     if (xdif == 0 && ydif == 0)
  260.         return;
  261.     Bool wasVisible = visible;
  262.     if (wasVisible)
  263.         Hide();
  264.     ChangePosition(x, y);
  265.     DFWindow *Wnd = First();
  266.     while (Wnd != 0)    {
  267.         Wnd->Move(Wnd->Left()+xdif, Wnd->Top()+ydif);
  268.         Wnd = Wnd->Next();
  269.     }
  270.     if (wasVisible)
  271.         Show();
  272. }
  273.  
  274. // ------------ size a window
  275. void DFWindow::Size(int x, int y)
  276. {
  277.     int xdif = x - Right();
  278.     int ydif = y - Bottom();
  279.     if (xdif == 0 && ydif == 0)
  280.         return;
  281.     Bool wasVisible = visible;
  282.     if (wasVisible)
  283.         Hide();
  284.     rect.Right() = x;
  285.     rect.Bottom() = y;
  286.     restored_rc = rect;
  287.  
  288.     DFWindow *Wnd = First();
  289.     while (Wnd != 0)    {
  290.         Wnd->ParentSized(xdif, ydif);
  291.         Wnd = Wnd->Next();
  292.     }
  293.     if (wasVisible)
  294.         Show();
  295. }
  296.  
  297.