home *** CD-ROM | disk | FTP | other *** search
/ POINT Software Programming / PPROG1.ISO / c / fli106c / dlgjump.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1992-03-11  |  8.7 KB  |  436 lines

  1. //
  2. // The Fusion Library Interface for DOS
  3. // Version 1.06c
  4. // Copyright (C) 1990, 1991, 1992
  5. // Software Dimensions
  6. //
  7. // DialogClass
  8. //
  9.  
  10. #include "fli.h"
  11.  
  12. #ifdef __BCPLUSPLUS__
  13. #pragma hdrstop
  14. #endif
  15.  
  16. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  17. //
  18. // RePosition()
  19. //
  20. // Repositions to specified element
  21. //
  22. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  23.  
  24. int DialogClass::RePosition(DialogElement *LocationToGo)
  25. {
  26.   if (LocationToGo->Available()==FailedEvent)
  27.     return 0;
  28.  
  29.   Present->Show();
  30.  
  31.   int SaveGroup=Present->GroupCode;
  32.  
  33.   ShowLocator(0);
  34.   LastPresent=0;
  35.  
  36.   Present=LocationToGo;
  37.  
  38.   if (SaveGroup!=Present->GroupCode)
  39.     ShowHeading(0);
  40.   ShowHeading(Present->GroupCode);
  41.   ShowLocator();
  42.  
  43.   Blaze.VisibleCursor();
  44.   Present->HighLight();
  45.  
  46.   return 1;
  47. }
  48.  
  49. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  50. //
  51. // Depart()
  52. //
  53. // Departs from the current element and calls the departure function
  54. //
  55. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  56.  
  57. int DialogClass::Depart(DialogElement &Present)
  58. {
  59.   DialogElement *Save=DialogClass::Present;
  60.   DialogClass::Present=&Present;
  61.  
  62.   Present.Show();
  63.   ShowLocator(0);
  64.  
  65.   DialogClass::Present=Save;
  66.  
  67.   int Test=Present.Departure();
  68.  
  69.   if (Test==RefreshEvent || Test==OtherRefreshEvent)
  70.   {
  71.     LastPresent=0;
  72.     AlreadyShown=0;
  73.     ShowElements(Test==OtherRefreshEvent);
  74.   }
  75.  
  76.   if (Test==StopEvent || Test==AbortEvent)
  77.     return 0;
  78.  
  79.   return 1;
  80. }
  81.  
  82. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  83. //
  84. // Arrive()
  85. //
  86. // Arrives from the current element and calls the arrival function
  87. //
  88. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  89.  
  90. int DialogClass::Arrive(DialogElement &Present)
  91. {
  92.   if (LastPresent==&Present)
  93.     return 1;
  94.  
  95.   LastPresent=&Present;
  96.   Blaze.VisibleCursor();
  97.   MouseShow();
  98.   Blaze.GetXY(XSave,YSave);
  99.  
  100.   int Test=Present.Arrival();
  101.  
  102.   if (Test==RefreshEvent || Test==OtherRefreshEvent)
  103.   {
  104.     LastPresent=0;
  105.     AlreadyShown=0;
  106.     ShowElements(Test==OtherRefreshEvent);
  107.   }
  108.  
  109.   if (Test==StopEvent || Test==AbortEvent)
  110.     return 0;
  111.  
  112.   DialogElement *Save=DialogClass::Present;
  113.   DialogClass::Present=&Present;
  114.  
  115.   Present.HighLight();
  116.   ShowLocator();
  117.  
  118.   if (GroupLock!=Present.GroupCode)
  119.     ShowHeading(0);
  120.  
  121.   ShowHeading(Present.GroupCode);
  122.   GroupLock=Save->GroupCode;
  123.  
  124.   DialogClass::Present=Save;
  125.  
  126.   return 1;
  127. }
  128.  
  129. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  130. //
  131. // NextElement()
  132. //
  133. // Jump to next element
  134. //
  135. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  136.  
  137. int DialogClass::NextElement()
  138. {
  139.   DialogElement *Save=Present;
  140.   int MustFind=0;
  141.  
  142.   if (Present->Available()!=CompleteEvent)
  143.     MustFind=1;
  144.  
  145.   Present=Present->Next;
  146.  
  147.   for (int i=0;i<2;i++)
  148.   {
  149.     while (Present && Present!=Save)
  150.     {
  151.       if (Present->Available()==CompleteEvent)
  152.       {
  153.         if (!Depart(*Save))
  154.           return 0;
  155.         return 1;
  156.       }
  157.  
  158.       Present=Present->Next;
  159.     }
  160.  
  161.     if (!Save->Last)
  162.     {
  163.       Present=Save;
  164.       return (MustFind)?0:1;
  165.     }
  166.     Present=First;
  167.   }
  168.   Present=Save;
  169.   return (MustFind)?0:1;
  170. }
  171.  
  172. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  173. //
  174. // PreviousElement()
  175. //
  176. // Jump to last element
  177. //
  178. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  179.  
  180. int DialogClass::PreviousElement()
  181. {
  182.   DialogElement *Save=Present;
  183.   int MustFind=0;
  184.  
  185.   if (Present->Available()!=CompleteEvent)
  186.     MustFind=1;
  187.  
  188.   Present=Present->Last;
  189.  
  190.   for (int i=0;i<2;i++)
  191.   {
  192.     while (Present && Present!=Save)
  193.     {
  194.       if (Present->Available()==CompleteEvent)
  195.       {
  196.         if (!Depart(*Save))
  197.           return 0;
  198.         return 1;
  199.       }
  200.  
  201.       Present=Present->Last;
  202.     }
  203.     if (!Save->Next)
  204.     {
  205.       Present=Save;
  206.       return (MustFind)?0:1;
  207.     }
  208.     Present=Last;
  209.   }
  210.   Present=Save;
  211.   return (MustFind)?0:1;
  212. }
  213.  
  214. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  215. //
  216. // NextWithinGroup()
  217. //
  218. // Jump to next element within a group
  219. //
  220. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  221.  
  222. int DialogClass::NextWithinGroup()
  223. {
  224.   if (!Present->GroupCode)
  225.     return 1;
  226.  
  227.   DialogElement *Save=Present;
  228.   int MustFind=0;
  229.  
  230.   if (Present->Available()!=CompleteEvent)
  231.     MustFind=1;
  232.  
  233.   Present=Present->Next;
  234.  
  235.   for (int i=0;i<2;i++)
  236.   {
  237.     while (Present && Present!=Save)
  238.     {
  239.       if (Present->Available()==CompleteEvent &&
  240.         Present->GroupCode==Save->GroupCode)
  241.       {
  242.         if (!Depart(*Save))
  243.           return 0;
  244.         return 1;
  245.       }
  246.  
  247.       Present=Present->Next;
  248.     }
  249.     if (!Save->Last)
  250.     {
  251.       Present=Save;
  252.       return (MustFind)?0:1;
  253.     }
  254.     Present=First;
  255.   }
  256.   Present=Save;
  257.   return (MustFind)?0:1;
  258. }
  259.  
  260. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  261. //
  262. // PreviousWithinGroup()
  263. //
  264. // Jump to last element within a group
  265. //
  266. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  267.  
  268. int DialogClass::PreviousWithinGroup()
  269. {
  270.   if (!Present->GroupCode)
  271.     return 1;
  272.  
  273.   DialogElement *Save=Present;
  274.   int MustFind=0;
  275.  
  276.   if (Present->Available()!=CompleteEvent)
  277.     MustFind=1;
  278.  
  279.   Present=Present->Last;
  280.  
  281.   for (int i=0;i<2;i++)
  282.   {
  283.     while (Present && Present!=Save)
  284.     {
  285.       if (Present->Available()==CompleteEvent &&
  286.         Present->GroupCode==Save->GroupCode)
  287.       {
  288.         if (!Depart(*Save))
  289.           return 0;
  290.         return 1;
  291.       }
  292.  
  293.       Present=Present->Last;
  294.     }
  295.     if (!Save->Next)
  296.     {
  297.       Present=Save;
  298.       return (MustFind)?0:1;
  299.     }
  300.     Present=Last;
  301.   }
  302.   Present=Save;
  303.   return (MustFind)?0:1;
  304. }
  305.  
  306. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  307. //
  308. // NextGroup()
  309. //
  310. // Jump to next group or element, whichever is appropriate
  311. //
  312. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  313.  
  314. int DialogClass::NextGroup()
  315. {
  316.   if (!Present->GroupCode)
  317.     return NextElement();
  318.  
  319.   DialogElement *Save=Present;
  320.   int MustFind=0;
  321.  
  322.   if (Present->Available()!=CompleteEvent)
  323.     MustFind=1;
  324.  
  325.   Present=Present->Next;
  326.  
  327.   for (int i=0;i<2;i++)
  328.   {
  329.     while (Present && Present!=Save)
  330.     {
  331.       if (Present->Available()==CompleteEvent &&
  332.         (Present->GroupCode!=Save->GroupCode ||
  333.          !Save->GroupCode))
  334.       {
  335.         if (!Depart(*Save))
  336.           return 0;
  337.         return 1;
  338.       }
  339.  
  340.       Present=Present->Next;
  341.     }
  342.     if (!Save->Last)
  343.     {
  344.       Present=Save;
  345.       return (MustFind)?0:1;
  346.     }
  347.     Present=First;
  348.   }
  349.   Present=Save;
  350.   return (MustFind)?0:1;
  351. }
  352.  
  353. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  354. //
  355. // PreviousGroup()
  356. //
  357. // Jump to last group or element, whichever is appropriate
  358. //
  359. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  360.  
  361. int DialogClass::PreviousGroup()
  362. {
  363.   if (!Present->GroupCode)
  364.   {
  365.     if (!(Present->Last && Present->Last->GroupCode) &&
  366.         !(!Present->Last && Last->GroupCode))
  367.       return PreviousElement();
  368.   }
  369.  
  370.   DialogElement *Save=Present;
  371.   int MustFind=0;
  372.  
  373.   if (Present->Available()!=CompleteEvent)
  374.     MustFind=1;
  375.  
  376.   Present=Present->Last;
  377.  
  378.   for (int i=0;i<2;i++)
  379.   {
  380.     while (Present && Present!=Save)
  381.     {
  382.       if (Present->Available()==CompleteEvent &&
  383.         (Present->GroupCode!=Save->GroupCode ||
  384.          !Save->GroupCode))
  385.       {
  386.         if (Present->Last && Present->GroupCode)
  387.         {
  388.           int Group=Present->GroupCode;
  389.           DialogElement *Saved=Present;
  390.           DialogElement *Memory=0;
  391.  
  392.           Present=Present->Last;
  393.  
  394.           while (Present)
  395.           {
  396.             if (Present->Available()==CompleteEvent && Present->GroupCode==Group)
  397.               Memory=Present;
  398.             Present=Present->Last;
  399.           }
  400.  
  401.           Present=(Memory)?Memory:Saved;
  402.         }
  403.  
  404.         if (!Depart(*Save))
  405.           return 0;
  406.         return 1;
  407.       }
  408.  
  409.       Present=Present->Last;
  410.     }
  411.     if (!Save->Next)
  412.     {
  413.       Present=Save;
  414.       return (MustFind)?0:1;
  415.     }
  416.     Present=Last;
  417.   }
  418.   Present=Save;
  419.   return (MustFind)?0:1;
  420. }
  421.  
  422. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  423. //
  424. // Valid()
  425. //
  426. // Checks validity of current element
  427. //
  428. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  429.  
  430. int DialogClass::Valid()
  431. {
  432.   return !(Present->Validation()==FailedEvent &&
  433.     Present->Available()!=FailedEvent);
  434. }
  435.  
  436.