home *** CD-ROM | disk | FTP | other *** search
/ POINT Software Programming / PPROG1.ISO / c / fli106c / diachar.cpp < prev    next >
C/C++ Source or Header  |  1992-03-11  |  11KB  |  508 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. // DiaChar
  9. //
  10.  
  11. #include "fli.h"
  12. #include "elements.h"
  13. #include "colors.h"
  14.  
  15. #ifdef __BCPLUSPLUS__
  16. #pragma hdrstop
  17. #if defined(__SMALL__) || defined(__TINY__) || defined(__MEDIUM__)
  18. #pragma option -Od
  19. #endif
  20. #endif
  21.  
  22. #include <alloc.h>
  23. #include <ctype.h>
  24. #include <string.h>
  25. #include <dos.h>
  26.  
  27. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  28. //
  29. // MaskSet define
  30. //
  31. // Defines the characters available in the masking set
  32. //
  33. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  34.  
  35. #define MaskSet "xXaALlUu0123456789#"
  36.  
  37. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  38. //
  39. // DiaChar()
  40. //
  41. // Constructor
  42. //
  43. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  44.  
  45. DiaChar::DiaChar(int _X,int _Y,char *_Mask,char *_Value,int _VisualWidth,
  46.   char MaskCharacter,int MaskWidth,int _NoEditErase)
  47. {
  48.   X=_X;
  49.   Y=_Y;
  50.   Mask=_Mask;
  51.   Value=_Value;
  52.   if (!MaskWidth)
  53.     Width=strlen(Mask);
  54.   Height=1;
  55.   AtLeft=0;
  56.   NoEditErase=_NoEditErase;
  57.   EditOverriden=0;
  58.  
  59.   VisualWidth=_VisualWidth;
  60.  
  61.   if (MaskCharacter)
  62.   {
  63.     Mask=new char[MaskWidth+1];
  64.     memset(Mask,MaskCharacter,MaskWidth);
  65.     *(Mask+MaskWidth)=0;
  66.     QuickMasked=1;
  67.     Width=MaskWidth;
  68.   }
  69.   else
  70.     QuickMasked=0;
  71.  
  72.   if (_VisualWidth && strlen(Mask)<_VisualWidth)
  73.     VisualWidth=0;
  74.   else if (_VisualWidth)
  75.     Width=VisualWidth;
  76.  
  77.   if (!strlen(Mask))
  78.     AssembleMask=NULL;
  79.   else
  80.   {
  81.     AssembleMask=new char[strlen(Mask)+1];
  82.  
  83.     char *SaveAssembleMask=AssembleMask;
  84.     char *SaveMask=Mask;
  85.  
  86.     while (*Mask)
  87.     {
  88.       if (strchr(MaskSet,*Mask))
  89.         *AssembleMask++=*Mask++;
  90.       else
  91.         Mask++;
  92.     }
  93.  
  94.     *AssembleMask=0;
  95.  
  96.     AssembleMask=SaveAssembleMask;
  97.     Mask=SaveMask;
  98.  
  99.     if (!strlen(AssembleMask))
  100.     {
  101.       delete AssembleMask;
  102.       AssembleMask=NULL;
  103.     }
  104.   }
  105.  
  106.   TotalMaskWidth=strlen(AssembleMask);
  107.  
  108.   if (!*Value)
  109.     CurrentLocation=0;
  110.   else
  111.   {
  112.     char *AssembleCount=AssembleMask;
  113.     int Position=0;
  114.  
  115.     while (*AssembleCount)
  116.     {
  117.       #pragma warn -lin
  118.       #pragma warn -lvc
  119.  
  120.       if (!MaskCheck(*AssembleCount,*_Value))
  121.       {
  122.         *_Value=0;
  123.         break;
  124.       }
  125.       else
  126.       {
  127.         Position++;
  128.         AssembleCount++;
  129.         _Value++;
  130.       }
  131.  
  132.       #pragma warn .lin
  133.       #pragma warn .lvc
  134.     }
  135.  
  136.     CurrentLocation=Position;
  137.  
  138.     if (CurrentLocation==TotalMaskWidth)
  139.       CurrentLocation--;
  140.   }
  141.  
  142.   if (VisualWidth && CurrentLocation>=VisualWidth)
  143.     CurrentLocation=0;
  144.  
  145.   if (VisualWidth)
  146.     X++;
  147.  
  148.   DialogElement::Width=Width;
  149. }
  150.  
  151. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  152. //
  153. // ~DiaChar()
  154. //
  155. // Destructor
  156. //
  157. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  158.  
  159. DiaChar::~DiaChar()
  160. {
  161.   if (AssembleMask)
  162.     delete AssembleMask;
  163.   if (QuickMasked)
  164.     delete Mask;
  165. }
  166.  
  167. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  168. //
  169. // GetPhysical()
  170. //
  171. // Gets the physical display location
  172. //
  173. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  174.  
  175. int DiaChar::GetPhysical()
  176. {
  177.   int Locate=0, Logical=0;
  178.  
  179.   char *Mask=DiaChar::Mask;
  180.  
  181.   while (*Mask)
  182.   {
  183.     if (strchr(MaskSet,*Mask++))
  184.     {
  185.       if (Logical==CurrentLocation)
  186.         break;
  187.       Logical++;
  188.     }
  189.     Locate++;
  190.   }
  191.  
  192.   return Locate;
  193. }
  194.  
  195. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  196. //
  197. // ScrollUpdate()
  198. //
  199. // Updates a scrolling characer element
  200. //
  201. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  202.  
  203. void DiaChar::ScrollUpdate(int Color)
  204. {
  205.   if (!VisualWidth)
  206.     return;
  207.  
  208.   int Physical=GetPhysical();
  209.  
  210.   if (AtLeft>Physical)
  211.     AtLeft=Physical;
  212.  
  213.   if ((AtLeft+VisualWidth)<=Physical)
  214.     AtLeft=(Physical-VisualWidth)+1;
  215.  
  216.   (*Blaze) (X-1,Y) << Color << (char)((AtLeft)?'\x11':' ');
  217.  
  218.   (*Blaze) (X+VisualWidth,Y) << Color <<
  219.     (char)((AtLeft+VisualWidth!=strlen(Mask))?'\x10':' ');
  220. }
  221.  
  222. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  223. //
  224. // Show()
  225. //
  226. // Show the character element
  227. //
  228. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  229.  
  230. static int InsertMode=0;
  231.  
  232. void DiaChar::Show()
  233. {
  234.   Blaze->BigCursor(0);
  235.  
  236.   if (CurrentLocation>strlen(Value))
  237.   {
  238.     CurrentLocation=strlen(Value);
  239.     if (VisualWidth)
  240.     {
  241.       AtLeft=0;
  242.       CurrentLocation=0;
  243.     }
  244.   }
  245.  
  246.   EditOverriden=0;
  247.  
  248.   if (NoEditErase)
  249.     CurrentLocation=strlen(Value);
  250.  
  251.   MouseHide();
  252.  
  253.   ScrollUpdate(Colors.CharNormal);
  254.  
  255.   (*Blaze) (X,Y);
  256.   (*Blaze) <<
  257.     ((Available()==CompleteEvent)?Colors.CharNormal:Colors.DiaDeadLocator);
  258.  
  259.   if (VisualWidth)
  260.     MaskShow(Mask,Value,*Blaze,AtLeft,VisualWidth);
  261.   else
  262.     MaskShow(Mask,Value,*Blaze);
  263.  
  264.   MouseShow();
  265. }
  266.  
  267. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  268. //
  269. // HighLight()
  270. //
  271. // Highlight the character element
  272. //
  273. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  274.  
  275. void DiaChar::HighLight()
  276. {
  277.   Blaze->BigCursor(InsertMode);
  278.  
  279.   if (CurrentLocation>strlen(Value))
  280.   {
  281.     CurrentLocation=strlen(Value);
  282.     if (VisualWidth)
  283.     {
  284.       AtLeft=0;
  285.       CurrentLocation=0;
  286.     }
  287.   }
  288.  
  289.   MouseHide();
  290.  
  291.   ScrollUpdate(Colors.CharHiLite);
  292.  
  293.   (*Blaze) (X,Y);
  294.   (*Blaze) << Colors.CharHiLite;
  295.  
  296.   if (VisualWidth)
  297.     MaskShow(Mask,Value,*Blaze,AtLeft,VisualWidth);
  298.   else
  299.     MaskShow(Mask,Value,*Blaze);
  300.  
  301.   MouseShow();
  302.  
  303.   Blaze->VisibleCursor();
  304.  
  305.   char *Mask=DiaChar::Mask;
  306.   int Count=CurrentLocation+1;
  307.   int Position=-1;
  308.  
  309.   while (*Mask)
  310.   {
  311.     if (strchr(MaskSet,*Mask++))
  312.     {
  313.       Count--;
  314.       Position++;
  315.       if (!Count)
  316.         break;
  317.     }
  318.     else
  319.       Position++;
  320.   }
  321.  
  322.   if (!VisualWidth)
  323.     Blaze->WindowGotoXY(X+Position,Y);
  324.   else
  325.     Blaze->WindowGotoXY(X+(Position-AtLeft),Y);
  326. }
  327.  
  328. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  329. //
  330. // EventHandler()
  331. //
  332. // Handles the events
  333. //
  334. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  335.  
  336. int DiaChar::EventHandler(int Event)
  337. {
  338.   switch(Event)
  339.   {
  340.     case ValidatedMousedEvent:
  341.       if (MouseEvent&MouseDoubleClick)
  342.         return ClickEvent;
  343.       return Event;
  344.  
  345.     case kbIns:
  346.       EditOverriden++;
  347.       InsertMode=(InsertMode)?0:1;
  348.       Blaze->BigCursor(InsertMode);
  349.       return CompleteEvent;
  350.  
  351.     case kbHome:
  352.       EditOverriden++;
  353.       CurrentLocation=0;
  354.       AtLeft=0;
  355.       HighLight();
  356.       return CompleteEvent;
  357.  
  358.     case kbEnd:
  359.       EditOverriden++;
  360.       CurrentLocation=strlen(Value);
  361.       HighLight();
  362.       return CompleteEvent;
  363.  
  364.     case kbLeft:
  365.       EditOverriden++;
  366.       if (CurrentLocation)
  367.         CurrentLocation--;
  368.       HighLight();
  369.       return CompleteEvent;
  370.  
  371.     case kbRight:
  372.       EditOverriden++;
  373.       if ((strlen(Value)==strlen(AssembleMask) && CurrentLocation!=strlen(Value)-1)
  374.         || (strlen(Value)<strlen(AssembleMask) && CurrentLocation!=strlen(Value)))
  375.         CurrentLocation++;
  376.       HighLight();
  377.       return CompleteEvent;
  378.  
  379.     case kbDel:
  380.     case kbBackSpace:
  381.  
  382.       EditOverriden++;
  383.  
  384.       if (CurrentLocation==TotalMaskWidth-1 && *(Value+CurrentLocation))
  385.       {
  386.         *(Value+CurrentLocation)=0;
  387.         HighLight();
  388.         break;
  389.       }
  390.  
  391.       if (Event==kbBackSpace)
  392.       {
  393.         if (CurrentLocation)
  394.           CurrentLocation--;
  395.         else
  396.           return CompleteEvent;
  397.       }
  398.  
  399.       char &DelMask = *(Value+CurrentLocation);
  400.  
  401.       #pragma warn -lin
  402.       #pragma warn -lvc
  403.  
  404.       for (int i=CurrentLocation+1;i<strlen(Value);i++)
  405.         if (MaskCheck(*(AssembleMask+i-1),*(Value+i),1)!=1)
  406.           return CompleteEvent;
  407.  
  408.       #pragma warn .lin
  409.       #pragma warn .lvc
  410.  
  411.       for (i=CurrentLocation+1;i<=strlen(Value);i++)
  412.         *(Value+i-1)=*(Value+i);
  413.  
  414.       if (CurrentLocation && strchr("Ll",*(AssembleMask+CurrentLocation)) &&
  415.         *(Value+CurrentLocation-1)!=' ')
  416.           DelMask+=(isupper(DelMask))?32:0;
  417.  
  418.       if (CurrentLocation && strchr("LlUu",*(AssembleMask+CurrentLocation+1)) &&
  419.         *(Value+CurrentLocation-1)==' ')
  420.           DelMask-=(islower(DelMask))?32:0;
  421.  
  422.       if (!CurrentLocation && strchr("UuLlXA",*(AssembleMask+CurrentLocation)))
  423.         DelMask-=(islower(DelMask))?32:0;
  424.  
  425.       HighLight();
  426.  
  427.       return CompleteEvent;
  428.  
  429.     default:
  430.       if ((NoEditErase && !EditOverriden && MaskCheck(*AssembleMask,Event,0)
  431.          && Event<128)
  432.          ||
  433.          (MaskCheck(*(AssembleMask+CurrentLocation),Event,0) && Event<128))
  434.       {
  435.         if (NoEditErase && !EditOverriden && MaskCheck(*AssembleMask,Event,0))
  436.         {
  437.           CurrentLocation=0;
  438.           *Value=0;
  439.         }
  440.  
  441.         EditOverriden++;
  442.  
  443.         if (InsertMode && strlen(Value))
  444.         {
  445.           if (CurrentLocation==TotalMaskWidth-1 || TotalMaskWidth==1)
  446.           {
  447.             *(Value+CurrentLocation)=Event;
  448.             *(Value+CurrentLocation+1)=0;
  449.             HighLight();
  450.             return CompleteEvent;
  451.           }
  452.  
  453.           if (strlen(Value)==TotalMaskWidth) // cannot insert
  454.             return CompleteEvent;
  455.  
  456.           #pragma warn -lin
  457.           #pragma warn -lvc
  458.  
  459.           for (i=CurrentLocation;i<strlen(Value)-1;i++)
  460.             if (MaskCheck(*(AssembleMask+i+1),*(Value+i),1)!=1)
  461.               return CompleteEvent;
  462.  
  463.           #pragma warn .lin
  464.           #pragma warn .lvc
  465.  
  466.           for (i=strlen(Value)+1;i>CurrentLocation;i--)
  467.             *(Value+i)=*(Value+i-1);
  468.         }
  469.  
  470.         if (strchr("UuLl",*(AssembleMask+CurrentLocation)))
  471.         {
  472.           if (!CurrentLocation || (CurrentLocation && *(Value+CurrentLocation-1)==' '))
  473.             Event-=(islower(Event))?32:0;
  474.           else if (strchr("Ll",*(AssembleMask+CurrentLocation)))
  475.             Event+=(isupper(Event))?32:0;
  476.         }
  477.  
  478.         if (!*(Value+CurrentLocation))
  479.           *(Value+CurrentLocation+1)=0;
  480.  
  481.         *(Value+CurrentLocation)=Event;
  482.  
  483.         if (strchr("Ll",*(AssembleMask+CurrentLocation+1)) &&
  484.           *(Value+CurrentLocation)!=' ')
  485.         {
  486.           char &EntryMask = *(Value+CurrentLocation+1);
  487.  
  488.           EntryMask+=(isupper(EntryMask))?32:0;
  489.         }
  490.         else if (strchr("UuLl",*(AssembleMask+CurrentLocation+1)) &&
  491.           *(Value+CurrentLocation)==' ')
  492.         {
  493.           char &EntryMask = *(Value+CurrentLocation+1);
  494.  
  495.           EntryMask-=(islower(EntryMask))?32:0;
  496.         }
  497.  
  498.         CurrentLocation=(CurrentLocation==TotalMaskWidth-1)?
  499.           CurrentLocation:(++CurrentLocation);
  500.  
  501.         HighLight();
  502.  
  503.         return CompleteEvent;
  504.       }
  505.   }
  506.   return Event;
  507. }
  508.