home *** CD-ROM | disk | FTP | other *** search
- //
- // *************************************************************************
- // * *
- // * OMEGA C++ Windowing Class Library *
- // * ================================= *
- // * *
- // * Copyright 1991,92 Tom Clancy *
- // * Submitted to the public domain, April 1992 *
- // * *
- // *************************************************************************
- // * *
- // * IO Screen Prompt Methods *
- // * *
- // *************************************************************************
- //
-
-
- #include <string.h>
- #include <dos.h>
- #include <conio.h>
- #include "omio.hpp"
-
- oIO::oIO() {
- Done=FALSE;
- Cursor=0;
- InsertMode=ON;
- Pointer=0;
- IOFillchar=32;
- Accepted=FALSE;
- Canescape=TRUE;
- Current=1;
- Donekey=F10;
- MessX=0;
- MessY=0;
- Nf=0;
- Pfg=WHITE;
- Pbk=BLUE;
- Ffg=BLACK;
- Fbk=LIGHTGRAY;
- Cfg=WHITE;
- Cbk=RED;
- Mfg=WHITE;
- Mbk=BLUE;
- Fstartx=1;
- UpperMode=TRUE;
- }
-
- oIO::~oIO() {
- register int i;
- for(i=1; i<=Nf; i++) {
- delete Field[i]->prompt;
- delete Field[i]->message;
- delete Field[i]->info;
- delete Field[i];
- }
- }
-
- void oIO::setIO(int pfg, int pbk, int ffg, int fbk, int cfg, int cbk,
- int mfg, int mbk, int messx, int messy) {
-
- Pfg=pfg;
- Pbk=pbk;
- Ffg=ffg;
- Fbk=fbk;
- Cfg=cfg;
- Cbk=cbk;
- Mfg=mfg;
- Mbk=mbk;
- MessX=messx;
- MessY=messy;
- }
-
- void oIO::addfield(int x, int y, int len, int nextf, int prevf, char *p, char *m) {
-
- Nf++;
- if(Nf>255)
- Nf=255;
- else
- if(numfields()<=255) {
- Field[Nf] = new field;
- Field[Nf]->message=new char[strlen(m)+1];
- if(strlen(m))
- strcpy(Field[Nf]->message,m);
- else
- Field[Nf]->message[0]='\0';
- Field[Nf]->prompt=new char[strlen(p)+1];
- if(strlen(p))
- strcpy(Field[Nf]->prompt,p);
- else
- Field[Nf]->prompt[0]='\0';
- Field[Nf]->info=new char[len+1];
- Field[Nf]->info[0]='\0';
- Field[Nf]->x=x;
- Field[Nf]->y=y;
- Field[Nf]->len=len;
- Field[Nf]->next=nextf;
- Field[Nf]->prev=prevf;
- Field[Nf]->Ffg=Ffg;
- Field[Nf]->Fbk=Fbk;
- }
-
- }
-
- int oIO::insertstr(char *s, char c, int pos) {
-
- register int i;
-
- if(UpperMode)
- c=upcase(c);
-
- if(pos>=0 && pos<=strlen(s)) {
- if(strlen(s) < Field[Current]->len) {
- for(i=strlen(s); i>=pos; i--)
- s[i+1]=s[i];
- s[pos]=c;
- return 1;
- }
- else
- if(strlen(s)==Field[Current]->len) {
- for(i=strlen(s)-1; i>=pos; i--)
- s[i+1]=s[i];
- s[pos]=c;
- s[Field[Current]->len]='\0';
- return 1;
- }
- }
- return 0;
- }
-
- int oIO::overtpstr(char *s, char c, int pos) {
-
- if(UpperMode)
- c=upcase(c);
-
- if(strlen(s))
- if(pos<strlen(s)) {
- s[pos]=c;
- return 1;
- }
- return 0;
- }
-
- int oIO::deletestr(char *s, int pos) {
-
- register int i;
- if(strlen(s)) {
- if(pos>=0 && pos<=strlen(s)) {
- for(i=pos; i<=strlen(s); i++)
- s[i]=s[i+1];
- return 1;
- }
- }
- return 0;
- }
-
-
- void oIO::clearfield(int f) {
- fillarea(Field[f]->x+strlen(Field[f]->prompt),Field[f]->y,Field[f]->x+strlen(Field[f]->prompt)+Field[f]->len-1,Field[f]->y,Field[f]->Ffg,Field[f]->Fbk,IOFillchar);
- }
-
- void oIO::showfield(int f) {
- clearfield(f);
- if(strlen(Field[f]->info))
- writeat(Fstartx,Field[f]->y,Field[f]->Ffg,Field[f]->Fbk,Field[f]->info);
- }
-
- void oIO::goendstr() {
- Cursor=Fstartx+strlen(Field[Current]->info);
- if(Cursor>Fstartx+Field[Current]->len-1)
- Cursor=Fstartx+Field[Current]->len-1;
- Pointer=strlen(Field[Current]->info);
- movexy(Cursor,Field[Current]->y);
- if(InsertMode) linecursor();
- else blockcursor();
- }
-
- void oIO::gohomestr() {
- Pointer=0;
- Cursor=Fstartx;
- movexy(Cursor,Field[Current]->y);
- if(InsertMode) linecursor();
- else blockcursor();
- }
-
- int oIO::withinIO() {
- return (buttonx()>=Fstartx &&
- buttonx()<=Fstartx+strlen(Field[Current]->info) &&
- buttony()==Field[Current]->y);
- }
-
- char *oIO::getfield(int fn) {
- if(fn && fn<=Nf)
- return Field[fn]->info;
- else
- return NULL;
- }
-
- void oIO::setfield(char *s, int fn) {
- delete Field[fn]->info;
- Field[fn]->info=new char[strlen(s)+1];
- strcpy(Field[fn]->info,s);
- }
-
- char *oIO::getmessage(int mn) {
- if(mn && mn<=Nf)
- return Field[mn]->message;
- else
- return NULL;
- }
-
- void oIO::display_message() {
- if(strlen(Field[Current]->message))
- writeat(MessX,MessY,Mfg,Mbk,Field[Current]->message);
-
- }
-
- void oIO::clear_message() {
- if(strlen(Field[Current]->message))
- clearline(MessY,MessX,MessX+strlen(Field[Current]->message),Mfg,getbkcolor());
- }
-
- void oIO::display_field(int fn) {
- if(fn && fn<=Nf) {
- Cursor=Field[fn]->x+strlen(Field[fn]->prompt);
- Fstartx=Cursor;
- clearfield(fn);
- writeat(Field[fn]->x,Field[fn]->y,Pfg,Pbk,Field[fn]->prompt);
- if(strlen(Field[fn]->info))
- writeat(Fstartx,Field[fn]->y,Field[fn]->Ffg,Field[fn]->Fbk,Field[fn]->info);
- movexy(Cursor,Field[fn]->y);
- }
- }
-
- int oIO::withinfield(int fn) {
-
- return (buttonx()>=Field[fn]->x &&
- buttonx()<=Field[fn]->x+strlen(Field[fn]->prompt)+Field[fn]->len-1 &&
- buttony()==Field[fn]->y);
- }
-
- int oIO::whichfield() {
- register int i;
- for(i=1; i<=Nf; i++)
- if(withinfield(i)) return i;
- return 0;
-
- }
-
- void oIO::initfieldinfo() {
- register int i;
- if(Nf)
- for(i=1; i<=Nf; i++)
- Field[i]->info[0]='\0';
- }
-
- void oIO::display_form() {
-
- if(Nf) {
- cursoroff();
- Done=FALSE;
- register int i;
- for(i=1; i<=Nf; i++)
- display_field(i);
- display_message();
- markcurrent();
- goendstr();
- }
- }
-
- void oIO::display_info() {
- display_form();
- }
-
- void oIO::releasecurrent() {
- setFfg(Ffg);
- setFbk(Fbk);
- display_field(Current);
- }
-
- void oIO::markcurrent() {
- setFfg(Cfg);
- setFbk(Cbk);
- display_field(Current);
- }
-
- void oIO::gonextfield() {
- int old=Current;
- releasecurrent();
- clear_message();
- Current=Field[Current]->next;
- if(Current<=0 || Current>Nf)
- Current=old;
- markcurrent();
- if(Current!=old)
- goendstr();
- display_message();
- }
-
- void oIO::goprevfield() {
- int old=Current;
- releasecurrent();
- clear_message();
- Current=Field[Current]->prev;
- if(Current<=0 || Current>Nf)
- Current=old;
- markcurrent();
- if(Current!=old)
- goendstr();
- display_message();
- }
-
- void oIO::clearallfields() {
- if(Nf) {
- initfieldinfo();
- register int i;
- int old=Current;
- cursoroff();
- for(i=1; i<=Nf; i++) {
- Current=i;
- releasecurrent();
- }
- Current=old;
- markcurrent();
- goendstr();
- }
- }
-
- int oIO::handle_mouse_event() {
-
- int w=whichfield();
- if(w!=Current) {
- if(w && w<=Nf) {
- releasecurrent();
- clear_message();
- Current=w;
- markcurrent();
- goendstr();
- display_message();
- cursoron();
- while(event());
- return cmdSelectField;
- }
- }
- else
- if(withinIO()) {
- markcurrent();
- Cursor=buttonx();
- if(Cursor<Fstartx)
- Cursor=Fstartx;
- Pointer=Cursor-Fstartx;
- movexy(Cursor,buttony());
- cursoron();
- while(event());
- }
- return cmdNocmd;
- }
-
- int oIO::handle_key_event() {
-
-
- int r=getkeycode();
-
- switch(r) {
-
- case Enter :
- gonextfield();
- return cmdNextField;
- break;
-
- case ShiftTab :
- goprevfield();
- return cmdPrevField;
- break;
-
- case DownArrow :
- gonextfield();
- return cmdNextField;
- break;
-
- case UpArrow :
- goprevfield();
- return cmdPrevField;
- break;
-
- case CtrlY :
- Field[Current]->info[0]='\0';
- display_field(Current);
- markcurrent();
- goendstr();
- return cmdDeleteField;
- break;
-
- case Escape :
- if(Canescape) {
- Accepted=FALSE;
- Done=TRUE;
- return cmdClose;
- }
- break;
-
- case BackSpace :
- Pointer--;
- if(Pointer<0)
- Pointer=0;
- int BS=deletestr(Field[Current]->info,Pointer);
- if(Pointer+1<Field[Current]->len) {
- Cursor--;
- if(Cursor<Fstartx)
- Cursor=Fstartx;
- }
- movexy(Cursor,Field[Current]->y);
- if(BS)
- showfield(Current);
- return cmdKBHIT;
- break;
-
- case Delete :
- int D=deletestr(Field[Current]->info,Pointer);
- if(D)
- showfield(Current);
- return cmdKBHIT;
- break;
-
- case Home :
- gohomestr();
- return cmdKBHIT;
- break;
-
- case End :
- goendstr();
- return cmdKBHIT;
- break;
-
- case RightArrow :
- if(Pointer<strlen(Field[Current]->info)) {
- Cursor++;
- Pointer++;
- if(Cursor>Fstartx+Field[Current]->len-1) {
- Pointer=strlen(Field[Current]->info);
- Cursor=Fstartx+Field[Current]->len-1;
- }
- movexy(Cursor,Field[Current]->y);
- }
- return cmdRightArrow;
- break;
-
- case LeftArrow :
- Cursor--;
- Pointer--;
- if(Cursor<Fstartx) {
- Cursor=Fstartx;
- Pointer=0;
- }
- movexy(Cursor,Field[Current]->y);
- return cmdLeftArrow;
- break;
-
- case Insert :
- InsertMode=!InsertMode;
- if(InsertMode)
- linecursor();
- else
- blockcursor();
- return cmdKBHIT;
- break;
-
- default :
- if(Donekey==r) {
- Accepted=TRUE;
- Done=TRUE;
- return cmdClose;
- }
- else {
- if(istypeable(r)) {
- char c=r;
- int ok=0;
- setlastevent(0);
- if(InsertMode)
- ok=insertstr(Field[Current]->info,c,Pointer);
- else
- ok=overtpstr(Field[Current]->info,c,Pointer);
- if(ok) {
- Pointer++;
- Cursor++;
- if(Cursor>Fstartx+Field[Current]->len-1) {
- Pointer=strlen(Field[Current]->info);
- Cursor=Fstartx+Field[Current]->len-1;
- }
- movexy(Cursor,Field[Current]->y);
- showfield(Current);
- }
- return cmdKBHIT;
- }
- }
- break;
- }
- return cmdNocmd;
- }
-
- void oIO::goIO () {
- while(getlastcmd()!=cmdClose) {
- handle_events();
- }
- }
-