Delphi & Pascal (česká wiki)
Přejít na: navigace, hledání
/*****************************************************************************
*								             *
*                               Subor LINE_EDI.C                             *
*								             *
*****************************************************************************/
 
 
#include <string.h>
 
#include "glob.h"
#include "video.h"
#include "key.h"
#include "line_edi.h"
 
 
//************************************************************************//
// RIADKOVY_EDITOR							  //
//                                                            30.10.1997  //
//************************************************************************//
 
int riadkovy_editor(int zacx,int zacy,int sirka,int maxdlzka,unsigned char attr1,
		    unsigned char attr2,char *retazec)
{
   register int i;               //pomocna
   int zaciatocny=0;             //
   int aktualny=0;               //
   int koniec=0;                 //koniec cyklu
   int kl;                       //klaves
   int dlzka;                    //aktualna dlzka retazca
 
   dlzka=strlen(retazec);
   if(dlzka<sirka-2)
      {
      zaciatocny=0;
      aktualny=dlzka;
      }
   else
      {
      aktualny=sirka-2;
      zaciatocny=dlzka-aktualny;
      }
   tlac_riadkovy_editor(zacx,zacy,sirka,zaciatocny,attr1,attr2,retazec);
   presun_kurzor(zacx+1+aktualny,zacy);
   zapni_kurzor();
   switch(kl=key())
      {
      case ESC:vypni_kurzor();return FALSE;
      case ENTER:koniec=1;
      default:if(kl>=' ' && kl<=255)
		 {
		 *retazec='\0';
		 zaciatocny=0;
		 aktualny=0;
		 dlzka=0;
		 }
      }
   tlac_riadkovy_editor(zacx,zacy,sirka,zaciatocny,attr2,attr2,retazec);
   while(!koniec)
      {
      switch(kl)
	 {
	 case ESC:vypni_kurzor();return FALSE;
	 case ENTER:vypni_kurzor();return TRUE;
	 case BKSPC:if(aktualny+zaciatocny>0)
		       {
		       if(aktualny+zaciatocny<dlzka)
			  for(i=zaciatocny+aktualny;i<dlzka;i++)
			     retazec[i-1]=retazec[i];
		       retazec[--dlzka]='\0';
		       goto vlavo;
		       }
		    break;
vpravo:	 case RIGHT:aktualny++;
		       if(aktualny+zaciatocny>dlzka)
			  aktualny--;
		       else if(aktualny>sirka-2)
			       {
			       aktualny--;
			       zaciatocny++;
			       }
		    break;
vlavo:	 case LEFT: if(--aktualny<0)
		       {
		       aktualny++;
		       if(--zaciatocny<0)
			  zaciatocny++;
		       }
		    break;
	 case HOME: aktualny=0;
		    zaciatocny=0;
		    break;
	 case END:  if(dlzka<sirka-2)
		       {
		       zaciatocny=0;
		       aktualny=dlzka;
		       }
		    else
		       {
		       aktualny=sirka-2;
		       zaciatocny=dlzka-aktualny;
		       }
		    break;
	 case DEL:  if(aktualny+zaciatocny<dlzka)
		       {
		       for(i=zaciatocny+aktualny;i<dlzka;i++)
			  retazec[i]=retazec[i+1];
		       dlzka--;
		       }
		    break;
	 default:if(kl>=' ' && kl<=255 && dlzka<maxdlzka)
		    {
		    if(zaciatocny+aktualny>=dlzka)
		       {
		       if ( (kl>='A') && (kl<='Z') ) kl=kl + (224-'A');
		       retazec[dlzka++]=kl;
		       retazec[dlzka]='\0';
		       }
		    else
		       {
		       for(i=dlzka;i>zaciatocny+aktualny;i--)
			  retazec[i]=retazec[i-1];
		       if(dlzka<maxdlzka)
			  dlzka++;
		       retazec[dlzka]='\0';
		       retazec[zaciatocny+aktualny]=kl;
		       }
		    goto vpravo;
		    }
 
	 }
      tlac_riadkovy_editor(zacx,zacy,sirka,zaciatocny,attr2,attr2,retazec);
      presun_kurzor(zacx+1+aktualny,zacy);
      kl=key();
      }
   vypni_kurzor();
   return TRUE;
}
 
 
//************************************************************************//
// RIADKOVY_EDITOR1							  //
//                                                            30.10.1997  //
//************************************************************************//
 
int riadkovy_editor1(int zacx,int zacy,int sirka,int maxdlzka,unsigned char attr1,
		    unsigned char attr2,char *retazec)
{
   register int i;               //pomocna
   int zaciatocny=0;             //
   int aktualny=0;               //
   int koniec=0;                 //koniec cyklu
   int kl;                       //klaves
   int dlzka;                    //aktualna dlzka retazca
 
   dlzka=strlen(retazec);
   if(dlzka<sirka-2)
      {
      zaciatocny=0;
      aktualny=dlzka;
      }
   else
      {
      aktualny=sirka-2;
      zaciatocny=dlzka-aktualny;
      }
   tlac_riadkovy_editor(zacx,zacy,sirka,zaciatocny,attr1,attr2,retazec);
   presun_kurzor(zacx+1+aktualny,zacy);
   zapni_kurzor();
   switch(kl=key())
      {
      case ESC:  koniec=ESC;break;
      case ENTER:koniec=ENTER;break;
      case TAB:  koniec=TAB;break;
      case UP:   koniec=UP;break;
      case DOWN: koniec=DOWN;break;
      case F1 :  koniec=F1;break;
      case F6:   koniec=F6;break;
      default:if(kl>=' ' && kl<=255)
		 {
		 *retazec='\0';
		 zaciatocny=0;
		 aktualny=0;
		 dlzka=0;
		 }
      }
   tlac_riadkovy_editor(zacx,zacy,sirka,zaciatocny,attr2,attr2,retazec);
   while(!koniec)
      {
      switch(kl)
	 {
	 case ESC:  vypni_kurzor();return ESC;
	 case ENTER:vypni_kurzor();return ENTER;
	 case TAB:  vypni_kurzor();return TAB;
	 case UP:   vypni_kurzor();return UP;
	 case DOWN: vypni_kurzor();return DOWN;
	 case F1  : vypni_kurzor();return F1;
	 case F6  : vypni_kurzor();return F6;
	 case BKSPC:if(aktualny+zaciatocny>0)
		       {
		       if(aktualny+zaciatocny<dlzka)
			  for(i=zaciatocny+aktualny;i<dlzka;i++)
			     retazec[i-1]=retazec[i];
		       retazec[--dlzka]='\0';
		       goto vlavo;
		       }
		    break;
vpravo:	 case RIGHT:aktualny++;
		       if(aktualny+zaciatocny>dlzka)
			  aktualny--;
		       else if(aktualny>sirka-2)
			       {
			       aktualny--;
			       zaciatocny++;
			       }
		    break;
vlavo:	 case LEFT: if(--aktualny<0)
		       {
		       aktualny++;
		       if(--zaciatocny<0)
			  zaciatocny++;
		       }
		    break;
	 case HOME: aktualny=0;
		    zaciatocny=0;
		    break;
	 case END:  if(dlzka<sirka-2)
		       {
		       zaciatocny=0;
		       aktualny=dlzka;
		       }
		    else
		       {
		       aktualny=sirka-2;
		       zaciatocny=dlzka-aktualny;
		       }
		    break;
	 case DEL:  if(aktualny+zaciatocny<dlzka)
		       {
		       for(i=zaciatocny+aktualny;i<dlzka;i++)
			  retazec[i]=retazec[i+1];
		       dlzka--;
		       }
		    break;
	 default:if(kl>=' ' && kl<=255 && dlzka<maxdlzka)
		    {
		    if(zaciatocny+aktualny>=dlzka)
		       {
		       retazec[dlzka++]=kl;
		       retazec[dlzka]='\0';
		       }
		    else
		       {
		       for(i=dlzka;i>zaciatocny+aktualny;i--)
			  retazec[i]=retazec[i-1];
		       if(dlzka<maxdlzka)
			  dlzka++;
		       retazec[dlzka]='\0';
		       retazec[zaciatocny+aktualny]=kl;
		       }
		    goto vpravo;
		    }
 
	 }
      tlac_riadkovy_editor(zacx,zacy,sirka,zaciatocny,attr2,attr2,retazec);
      presun_kurzor(zacx+1+aktualny,zacy);
      kl=key();
      }
   vypni_kurzor();
   return koniec;
}
 
 
//************************************************************************//
// TLAC_RIADKOVY_EDITOR							  //
//                                                            30.10.1997  //
//************************************************************************//
 
int tlac_riadkovy_editor(int zacx,int zacy,int sirka,int zaciatocny,unsigned char attr1,
			  unsigned char attr2,char *ret)
{
   register int i=0;
   register int j=0;
 
   if(zaciatocny>0)
      tlac_znak(zacx,zacy,attr2,17);
   else tlac_znak(zacx,zacy,attr2,' ');
   while(zaciatocny-->0)ret++;
   for(i=0;i<sirka;i++)
      if(*ret=='\0')
	 {
	 for(j=i;j<sirka;j++)
	    tlac_znak(zacx+j+1,zacy,attr2,' ');
	 break;
	 }
      else
	 tlac_znak(zacx+i+1,zacy,attr1,*ret++);
   if(*ret!='\0')
      tlac_znak(zacx+sirka,zacy,attr2,16);
   else tlac_znak(zacx+sirka,zacy,attr2,' ');
   return i;
}
 
 
//************************************************************************//
// TLAC_OBMEDZENY_RETAZEC						  //
//                                                            30.10.1997  //
//************************************************************************//
 
void tlac_obmedzeny_retazec(int zacx,int zacy,int sirka,unsigned char attr,char *ret)
{
   register int i;
 
   if((i=strlen(ret))<sirka-2)
      tlac_riadkovy_editor(zacx,zacy,sirka,0,attr,attr,ret);
   else
      tlac_riadkovy_editor(zacx,zacy,sirka,i-sirka-2,attr,attr,ret);
}
 
 
/*---------------------------------END--------------------------------------*/