Delphi & Pascal (česká wiki)
/***************************************************************************** * * * 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-----------------------------------------*/