Delphi & Pascal (česká wiki)
Přejít na: navigace, hledání
/*****************************************************************************
*								             *
*                                Subor MENU.C                                *
*									     *
*****************************************************************************/
 
 
#include <stdlib.h>
#include <dos.h>
#include <alloc.h>
#include <string.h>
 
#include "key.h"
#include "util.h"
#include "glob.h"
#include "menu.h"
#include "video.h"
#include "okno.h"
#include "error.h"
 
#pragma warn -wsus
#include "menu.def"
#pragma warn +wsus
 
 
//************************************************************************//
// PULL_DOWN_MENU							  //
//                                                            30.10.1997  //
//************************************************************************//
 
int pull_down_menu(struct HL_Menu *hlavne,struct Menu podmenu[],int volba)
{
 int pocet_volieb;
 int k=0,i;
 int koniec=0;
 struct Polozka_HL_Menu *polozka;
 
 polozka=hlavne->polozky;
 pocet_volieb=0;
 while(polozka->text!=NULL)
	{
	polozka++;
	pocet_volieb++;
	}
 pocet_volieb--;
 while(!koniec)
	{
	k=0;
	if(volba!=0)
		{
		hlavne->posledna_volba=volba-1;
		goto enter;
		}
	switch(vodorovne_menu(hlavne))
		{
		case -1:
			exit(1);
		case DOWN:
 enter:		case ENTER:
			while(k==0)
				{
				i=hlavne->posledna_volba;
				switch(zvisle_menu(&podmenu[i]))
					{
					case -1:
						neodstranitelna_chyba();
					case ESC:
 
 
						zatvor_okno();
						zrus_menu();
						volba=0;
						k=1;
						break;
					case ENTER:
						zatvor_okno();
						zrus_menu();
					      /*k=1;
						koniec=ENTER;*/
						break;
					case LEFT:
						zatvor_okno();
						zrus_menu();
						if(--hlavne->posledna_volba<0)
							hlavne->posledna_volba=pocet_volieb;
						break;
					case RIGHT:
						zatvor_okno();
						zrus_menu();
						if(++hlavne->posledna_volba>pocet_volieb)
							hlavne->posledna_volba=0;
						break;
					}
				tlac_vodorovne_menu(hlavne);
				zvyrazni_vodorovne_menu(hlavne);
				}
		break;
		}
	}
 return koniec;
}
 
 
//************************************************************************//
// ZVISLE_MENU								  //
//                                                            30.10.1997  //
//************************************************************************//
 
int zvisle_menu(Menu *menu)
{
 register int i;
 int rx,ry;
 int zx,zy;
 int volba=0;
 int kl=0;
 
 vypni_kurzor();
 zisti_suradnice(menu,&zx,&zy,&rx,&ry);
 if (otvor_okno(zx,zy,zx+rx,zy+ry,menu->attr_okna,menu->attr_okraja,menu->typ_okraja)!=TRUE)
    return(-1);
 
 zarad_menu(menu);
 
 i=0;
 while (menu->polozky[i].text!=NULL)
       tlac_riadok_menu(zx,zy,i++,menu,rx-2);
 
 for (i=0;i<rx-2;i++)
     nastav_atribut(zx+1+i,zy+1+menu->posledna_volba,menu->attr_bar);
 
 while (volba==0)
	{
	tlac_riadok_help(menu->polozky[menu->posledna_volba].spodny_riadok,menu->attr_spodneho_riadku,menu->attr_hot_key);
	kl=key();
	tlac_riadok_menu(zx,zy,menu->posledna_volba,menu,rx-2);
	switch(kl)
		{
		case UP:
			if (--menu->posledna_volba<0)menu->
			   posledna_volba=ry-3;
			break;
		case DOWN:
			if (++menu->posledna_volba>=ry-2)
			   menu->posledna_volba=0;
			break;
		case PGDOWN:
		case END:
			menu->posledna_volba=ry-3;
			break;
		case PGUP:
		case HOME:
			menu->posledna_volba=0;
			break;
		case LEFT:
			volba=LEFT;
			break;
		case RIGHT:
			volba=RIGHT;
			break;
		case ESC:
			return ESC;
		case ENTER:
opak_enter:
			if (menu->polozky[menu->posledna_volba].cinnost == MENU)
			   {
			    zvisle_menu(menu->polozky[menu->posledna_volba].c.podmenu);
			    zatvor_okno();
			    zrus_menu();
			    volba=0;
			   }
			  else
			   {
			    if (menu->polozky[menu->posledna_volba].c.fnc != NULL)
			       {
				tlac_riadok_menu(zx,zy,menu->posledna_volba,menu,rx-2);
				volba=menu->polozky[menu->posledna_volba].c.fnc();
			       }
			   }
			break;
		case F1:
			for (i=0;i<rx-2;i++)
			    nastav_atribut(zx+1+i,zy+1+menu->posledna_volba,menu->attr_bar);
			if (menu->polozky[menu->posledna_volba].help!=NULL)
			    help(*menu->polozky[menu->posledna_volba].help);
			break;
		default:
			kl=prevod_na_velke(kl);
			for (i=0;i<ry-2;i++)
			    if (kl==prevod_na_velke(menu->polozky[i].hot_key))
			       {
				menu->posledna_volba=i;
				goto opak_enter;
			       }
			break;
		}
		info_okno();
 
	for (i=0;i<rx-2;i++)
	    nastav_atribut(zx+1+i,zy+1+menu->posledna_volba,menu->attr_bar);
	}
 
 return volba;
}
 
 
//************************************************************************//
// VODOROVNE_MENU							  //
//                                                            30.10.1997  //
//************************************************************************//
 
int vodorovne_menu(struct HL_Menu *menu)
{
 register int i=0;
 int pocet_volieb;
 int volba=0;
 int kl=0;
 struct Polozka_HL_Menu *polozka;
 
 polozka=menu->polozky;
 pocet_volieb=0;
 while(polozka->text!=NULL)
	{
	polozka++;
	pocet_volieb++;
	}
 pocet_volieb--;
 vypni_kurzor();
 tlac_vodorovne_menu(menu);
 zvyrazni_vodorovne_menu(menu);
 tlac_riadok_help(menu->polozky[menu->posledna_volba].spodny_riadok,menu->attr_spodneho_riadku,menu->attr_hot_key);
 while(volba==0)
	{
	switch(kl=key())
		{
		case LEFT:
			if(--menu->posledna_volba<0)
			menu->posledna_volba=pocet_volieb;
			break;
		case RIGHT:
			if(++menu->posledna_volba>pocet_volieb)
			menu->posledna_volba=0;
			break;
		case PGDOWN:
		case END:
			menu->posledna_volba=pocet_volieb;
			break;
		case PGUP:
		case HOME:
			menu->posledna_volba=0;
			break;
		case DOWN:
		case ESC:
		case ENTER:
			volba=kl;
			break;
		case F1:
			if(menu->polozky[menu->posledna_volba].help!=NULL)
			help(*menu->polozky[menu->posledna_volba].help);
			break;
		default:
			kl=prevod_na_velke(kl);
			for(i=0;i<=pocet_volieb;i++)
				if(kl==prevod_na_velke(menu->polozky[i].hot_key))
					{
					menu->posledna_volba=i;
					volba=ENTER;
					}
			break;
		}
	tlac_vodorovne_menu(menu);
	zvyrazni_vodorovne_menu(menu);
	tlac_riadok_help(menu->polozky[menu->posledna_volba].spodny_riadok,menu->attr_spodneho_riadku,menu->attr_hot_key);
	}
 return volba;
}
 
 
//************************************************************************//
// TLAC_VODOROVNE_MENU							  //
//                                                            30.10.1997  //
//************************************************************************//
 
void tlac_vodorovne_menu(struct HL_Menu *menu)
{
 register int i=0,j;
 char *p;
 int bol;
 int zx,zy;
 int attr1,attr2;
 struct Polozka_HL_Menu *polozka;
 
 zy=menu->riadok;
 attr1=menu->attr_okna;
 attr2=menu->attr_hot_key;
 polozka=menu->polozky;
 
 while(polozka->text!=NULL)
	{
	bol=0;
	zx=polozka->stlpec;
	p=polozka->text;
	j=0;
	while(*p!='\0')
		{
		if(*p!=polozka->hot_key)
			{
			tlac_znak(zx+j,zy,attr1,*p);
			}
		else
			if(bol==0)
				{
				tlac_znak(zx+j,zy,attr2,*p);
				bol=1;
				}
			else
				tlac_znak(zx+j,zy,attr1,*p);
		j++;
		p++;
		}
	i++;
	polozka++;
	}
}
 
 
//************************************************************************//
// ZVYRAZNI_VODOROVNE_MENU						  //
//                                                            30.10.1997  //
//************************************************************************//
 
void zvyrazni_vodorovne_menu(struct HL_Menu *menu)
{
 register int j;
 register char i;
 char *p;
 int bol=0;
 int zx,zy;
 int attr1,attr2;
 
 zy=menu->riadok;
 attr1=menu->attr_bar;
 attr2=(menu->attr_hot_key & 0x0f)|(menu->attr_bar & 0xf0);
 zx=menu->polozky[menu->posledna_volba].stlpec;
 p=menu->polozky[menu->posledna_volba].text;
 i=menu->polozky[menu->posledna_volba].hot_key;
 j=0;
 while(*p!='\0')
	{
	if(*p!=i)
		{
		tlac_znak(zx+j,zy,attr1,*p);
		}
	else
		if(bol==0)
			{
			tlac_znak(zx+j,zy,attr2,*p);
			bol=1;
			}
		else
			tlac_znak(zx+j,zy,attr1,*p);
	j++;
	p++;
	}
}
 
 
//************************************************************************//
// TLAC_RIADOK_MENU							  //
//                                                            30.10.1997  //
//************************************************************************//
 
void tlac_riadok_menu(int zx,int zy,int riadok,struct Menu *menu,int sirka)
{
 register int i=0,bol=0;
 char *p;
 
 p=menu->polozky[riadok].text;
 while(*p!='\0')
	{
	if(*p!=menu->polozky[riadok].hot_key || bol!=0)
		tlac_znak(zx+1+i,zy+1+riadok,menu->attr_okna,*p);
	else
		{
		tlac_znak(zx+1+i,zy+1+riadok,menu->attr_hot_key,*p);
		bol=1;
		}
	i++;
	p++;
	}
 while(i<sirka)
	{
	tlac_znak(zx+1+i,zy+1+riadok,menu->attr_okna,' ');
	i++;
	}
}
 
 
//************************************************************************//
// TLAC_RIADOK_HELP							  //
//                                                            30.10.1997  //
//************************************************************************//
 
void tlac_riadok_help(char *p,unsigned char attr1,unsigned char attr2)
{
 register int i=0;
 register int j;
 
 j=attr1;
 while(*p!='\0')
	if(*p=='~')
		{
		j=attr2;
		p++;
		}
	else
		{
		if(*p==' ')
			j=attr1;
		tlac_znak(i++,_riadkov-1,j,*p++);
		}
 tlac_do_konca_riadku(i,_riadkov-1,attr1,' ');
}
 
 
//************************************************************************//
// ZISTI_SIRKU_OKNA							  //
//                                                            30.10.1997  //
//************************************************************************//
 
int zisti_sirku_okna(Polozka_Menu *polozky)
{
 register int i=0,j;
 int max=0;
 char *p;
 
 while(polozky[i].text!=0)
	{
	j=0;
	p=polozky[i].text;
	i++;
	while(*p++!='\0')
		j++;
	if(j>max)
		max=j;
	}
 return max+2;
}
 
 
//************************************************************************//
// ZISTI_VYSKU_OKNA							  //
//                                                            30.10.1997  //
//************************************************************************//
 
int zisti_vysku_okna(Polozka_Menu *polozky)
{
 register int i=0;
 
 while(polozky[i++].text!=NULL);
 return i+1;
}
 
 
//************************************************************************//
// INIC_MENU								  //
//                                                            30.10.1997  //
//************************************************************************//
 
void inic_menu(struct HL_Menu *hlavne,struct Menu podmenu[])
{
 register int i;
 struct Polozka_HL_Menu *h;
 struct Menu *m;
 
 h=hlavne->polozky;
 m=podmenu;
 while(h->text!=NULL)
	{
	m->horny=hlavne->riadok+1;
	i=zisti_sirku_okna(m->polozky);
	if(h->stlpec==0)
		m->lavy=0;
	else
		if(h->stlpec+i+4>_stlpcov)
			m->lavy=_stlpcov-i-3;
		else
			m->lavy=h->stlpec-1;
	m++;
	h++;
	}
	info_okno();
 
}
 
 
/*------------------------------END-----------------------------------------*/