home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
POINT Software Programming
/
PPROG1.ISO
/
c
/
fli106c
/
diachar.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1992-03-11
|
11KB
|
508 lines
//
// The Fusion Library Interface for DOS
// Version 1.06c
// Copyright (C) 1990, 1991, 1992
// Software Dimensions
//
// DialogClass
// DiaChar
//
#include "fli.h"
#include "elements.h"
#include "colors.h"
#ifdef __BCPLUSPLUS__
#pragma hdrstop
#if defined(__SMALL__) || defined(__TINY__) || defined(__MEDIUM__)
#pragma option -Od
#endif
#endif
#include <alloc.h>
#include <ctype.h>
#include <string.h>
#include <dos.h>
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
//
// MaskSet define
//
// Defines the characters available in the masking set
//
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
#define MaskSet "xXaALlUu0123456789#"
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
//
// DiaChar()
//
// Constructor
//
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
DiaChar::DiaChar(int _X,int _Y,char *_Mask,char *_Value,int _VisualWidth,
char MaskCharacter,int MaskWidth,int _NoEditErase)
{
X=_X;
Y=_Y;
Mask=_Mask;
Value=_Value;
if (!MaskWidth)
Width=strlen(Mask);
Height=1;
AtLeft=0;
NoEditErase=_NoEditErase;
EditOverriden=0;
VisualWidth=_VisualWidth;
if (MaskCharacter)
{
Mask=new char[MaskWidth+1];
memset(Mask,MaskCharacter,MaskWidth);
*(Mask+MaskWidth)=0;
QuickMasked=1;
Width=MaskWidth;
}
else
QuickMasked=0;
if (_VisualWidth && strlen(Mask)<_VisualWidth)
VisualWidth=0;
else if (_VisualWidth)
Width=VisualWidth;
if (!strlen(Mask))
AssembleMask=NULL;
else
{
AssembleMask=new char[strlen(Mask)+1];
char *SaveAssembleMask=AssembleMask;
char *SaveMask=Mask;
while (*Mask)
{
if (strchr(MaskSet,*Mask))
*AssembleMask++=*Mask++;
else
Mask++;
}
*AssembleMask=0;
AssembleMask=SaveAssembleMask;
Mask=SaveMask;
if (!strlen(AssembleMask))
{
delete AssembleMask;
AssembleMask=NULL;
}
}
TotalMaskWidth=strlen(AssembleMask);
if (!*Value)
CurrentLocation=0;
else
{
char *AssembleCount=AssembleMask;
int Position=0;
while (*AssembleCount)
{
#pragma warn -lin
#pragma warn -lvc
if (!MaskCheck(*AssembleCount,*_Value))
{
*_Value=0;
break;
}
else
{
Position++;
AssembleCount++;
_Value++;
}
#pragma warn .lin
#pragma warn .lvc
}
CurrentLocation=Position;
if (CurrentLocation==TotalMaskWidth)
CurrentLocation--;
}
if (VisualWidth && CurrentLocation>=VisualWidth)
CurrentLocation=0;
if (VisualWidth)
X++;
DialogElement::Width=Width;
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
//
// ~DiaChar()
//
// Destructor
//
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
DiaChar::~DiaChar()
{
if (AssembleMask)
delete AssembleMask;
if (QuickMasked)
delete Mask;
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
//
// GetPhysical()
//
// Gets the physical display location
//
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
int DiaChar::GetPhysical()
{
int Locate=0, Logical=0;
char *Mask=DiaChar::Mask;
while (*Mask)
{
if (strchr(MaskSet,*Mask++))
{
if (Logical==CurrentLocation)
break;
Logical++;
}
Locate++;
}
return Locate;
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
//
// ScrollUpdate()
//
// Updates a scrolling characer element
//
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
void DiaChar::ScrollUpdate(int Color)
{
if (!VisualWidth)
return;
int Physical=GetPhysical();
if (AtLeft>Physical)
AtLeft=Physical;
if ((AtLeft+VisualWidth)<=Physical)
AtLeft=(Physical-VisualWidth)+1;
(*Blaze) (X-1,Y) << Color << (char)((AtLeft)?'\x11':' ');
(*Blaze) (X+VisualWidth,Y) << Color <<
(char)((AtLeft+VisualWidth!=strlen(Mask))?'\x10':' ');
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
//
// Show()
//
// Show the character element
//
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
static int InsertMode=0;
void DiaChar::Show()
{
Blaze->BigCursor(0);
if (CurrentLocation>strlen(Value))
{
CurrentLocation=strlen(Value);
if (VisualWidth)
{
AtLeft=0;
CurrentLocation=0;
}
}
EditOverriden=0;
if (NoEditErase)
CurrentLocation=strlen(Value);
MouseHide();
ScrollUpdate(Colors.CharNormal);
(*Blaze) (X,Y);
(*Blaze) <<
((Available()==CompleteEvent)?Colors.CharNormal:Colors.DiaDeadLocator);
if (VisualWidth)
MaskShow(Mask,Value,*Blaze,AtLeft,VisualWidth);
else
MaskShow(Mask,Value,*Blaze);
MouseShow();
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
//
// HighLight()
//
// Highlight the character element
//
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
void DiaChar::HighLight()
{
Blaze->BigCursor(InsertMode);
if (CurrentLocation>strlen(Value))
{
CurrentLocation=strlen(Value);
if (VisualWidth)
{
AtLeft=0;
CurrentLocation=0;
}
}
MouseHide();
ScrollUpdate(Colors.CharHiLite);
(*Blaze) (X,Y);
(*Blaze) << Colors.CharHiLite;
if (VisualWidth)
MaskShow(Mask,Value,*Blaze,AtLeft,VisualWidth);
else
MaskShow(Mask,Value,*Blaze);
MouseShow();
Blaze->VisibleCursor();
char *Mask=DiaChar::Mask;
int Count=CurrentLocation+1;
int Position=-1;
while (*Mask)
{
if (strchr(MaskSet,*Mask++))
{
Count--;
Position++;
if (!Count)
break;
}
else
Position++;
}
if (!VisualWidth)
Blaze->WindowGotoXY(X+Position,Y);
else
Blaze->WindowGotoXY(X+(Position-AtLeft),Y);
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
//
// EventHandler()
//
// Handles the events
//
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
int DiaChar::EventHandler(int Event)
{
switch(Event)
{
case ValidatedMousedEvent:
if (MouseEvent&MouseDoubleClick)
return ClickEvent;
return Event;
case kbIns:
EditOverriden++;
InsertMode=(InsertMode)?0:1;
Blaze->BigCursor(InsertMode);
return CompleteEvent;
case kbHome:
EditOverriden++;
CurrentLocation=0;
AtLeft=0;
HighLight();
return CompleteEvent;
case kbEnd:
EditOverriden++;
CurrentLocation=strlen(Value);
HighLight();
return CompleteEvent;
case kbLeft:
EditOverriden++;
if (CurrentLocation)
CurrentLocation--;
HighLight();
return CompleteEvent;
case kbRight:
EditOverriden++;
if ((strlen(Value)==strlen(AssembleMask) && CurrentLocation!=strlen(Value)-1)
|| (strlen(Value)<strlen(AssembleMask) && CurrentLocation!=strlen(Value)))
CurrentLocation++;
HighLight();
return CompleteEvent;
case kbDel:
case kbBackSpace:
EditOverriden++;
if (CurrentLocation==TotalMaskWidth-1 && *(Value+CurrentLocation))
{
*(Value+CurrentLocation)=0;
HighLight();
break;
}
if (Event==kbBackSpace)
{
if (CurrentLocation)
CurrentLocation--;
else
return CompleteEvent;
}
char &DelMask = *(Value+CurrentLocation);
#pragma warn -lin
#pragma warn -lvc
for (int i=CurrentLocation+1;i<strlen(Value);i++)
if (MaskCheck(*(AssembleMask+i-1),*(Value+i),1)!=1)
return CompleteEvent;
#pragma warn .lin
#pragma warn .lvc
for (i=CurrentLocation+1;i<=strlen(Value);i++)
*(Value+i-1)=*(Value+i);
if (CurrentLocation && strchr("Ll",*(AssembleMask+CurrentLocation)) &&
*(Value+CurrentLocation-1)!=' ')
DelMask+=(isupper(DelMask))?32:0;
if (CurrentLocation && strchr("LlUu",*(AssembleMask+CurrentLocation+1)) &&
*(Value+CurrentLocation-1)==' ')
DelMask-=(islower(DelMask))?32:0;
if (!CurrentLocation && strchr("UuLlXA",*(AssembleMask+CurrentLocation)))
DelMask-=(islower(DelMask))?32:0;
HighLight();
return CompleteEvent;
default:
if ((NoEditErase && !EditOverriden && MaskCheck(*AssembleMask,Event,0)
&& Event<128)
||
(MaskCheck(*(AssembleMask+CurrentLocation),Event,0) && Event<128))
{
if (NoEditErase && !EditOverriden && MaskCheck(*AssembleMask,Event,0))
{
CurrentLocation=0;
*Value=0;
}
EditOverriden++;
if (InsertMode && strlen(Value))
{
if (CurrentLocation==TotalMaskWidth-1 || TotalMaskWidth==1)
{
*(Value+CurrentLocation)=Event;
*(Value+CurrentLocation+1)=0;
HighLight();
return CompleteEvent;
}
if (strlen(Value)==TotalMaskWidth) // cannot insert
return CompleteEvent;
#pragma warn -lin
#pragma warn -lvc
for (i=CurrentLocation;i<strlen(Value)-1;i++)
if (MaskCheck(*(AssembleMask+i+1),*(Value+i),1)!=1)
return CompleteEvent;
#pragma warn .lin
#pragma warn .lvc
for (i=strlen(Value)+1;i>CurrentLocation;i--)
*(Value+i)=*(Value+i-1);
}
if (strchr("UuLl",*(AssembleMask+CurrentLocation)))
{
if (!CurrentLocation || (CurrentLocation && *(Value+CurrentLocation-1)==' '))
Event-=(islower(Event))?32:0;
else if (strchr("Ll",*(AssembleMask+CurrentLocation)))
Event+=(isupper(Event))?32:0;
}
if (!*(Value+CurrentLocation))
*(Value+CurrentLocation+1)=0;
*(Value+CurrentLocation)=Event;
if (strchr("Ll",*(AssembleMask+CurrentLocation+1)) &&
*(Value+CurrentLocation)!=' ')
{
char &EntryMask = *(Value+CurrentLocation+1);
EntryMask+=(isupper(EntryMask))?32:0;
}
else if (strchr("UuLl",*(AssembleMask+CurrentLocation+1)) &&
*(Value+CurrentLocation)==' ')
{
char &EntryMask = *(Value+CurrentLocation+1);
EntryMask-=(islower(EntryMask))?32:0;
}
CurrentLocation=(CurrentLocation==TotalMaskWidth-1)?
CurrentLocation:(++CurrentLocation);
HighLight();
return CompleteEvent;
}
}
return Event;
}