/**************************************************************************/ /* ** N A Y T T O . C */ #include #include #include #include #include "dhk.h" /*------------------------------------------------------------------------*/ char valimerkki[2]; /*------------------------------------------------------------------------*/ int tulosta_fraasit( /* Palauttaa alimman rivin indeksin */ fraasi_taulu ftaulu, /* Fraasitaulukko */ int yi, /* Ylimm„n rivin/fraasin indeksi */ int indeksi, /* Kursorin kohdalla olevan fraasin indeksi */ int sarake /* 1 tai 2 fraasin paikan mukaan */ ) { int i,j; pitka_merkkijono pmjono; char *rivi; i=yi; pmjono[0]=0; while ((ftaulu[i].r-ftaulu[yi].r+1) < 25) { if (ftaulu[i].r==0) break; gotoxy(ftaulu[i].s,ftaulu[i].r-ftaulu[yi].r+1); if ((i==indeksi) && (sarake==1)) textcolor(RED); else textcolor(ftaulu[i].tsolmu->vari); strcpy(pmjono,ftaulu[i].tsolmu->esivalittu->mjono); rivi=palanen(pmjono,valimerkki,&j); while (j!=-1) { cprintf("%s",rivi); gotoxy(1,wherey()+1); rivi=palanen(NULL,valimerkki,&j); } if ((ftaulu[i].r==ftaulu[i+1].r) || (sarake==2)) { /* 2 fraasia samalla rivill„ */ if (sarake==1) i++; gotoxy(ftaulu[i].s,ftaulu[i].r-ftaulu[yi].r+1); if ((i==indeksi) && (sarake==2)) textcolor(RED); else textcolor(ftaulu[i].tsolmu->vari); strcpy(pmjono,ftaulu[i].tsolmu->esivalittu->mjono); rivi=palanen(pmjono,valimerkki,&j); while (j!=-1) { cprintf("%s",rivi); gotoxy(1,wherey()+1); rivi=palanen(NULL,valimerkki,&j); } } i++; } i--; gotoxy(ftaulu[indeksi].s,ftaulu[indeksi].r-ftaulu[yi].r+1); return i; } /*------------------------------------------------------------------------*/ int laske_aloituskohta( /* Palauttaa ylimm„n rivin indeksin */ fraasi_taulu ftaulu, /* Fraasitaulukko */ int ai /* Alimman rivin/fraasin indeksi */ ) { int i; for (i=ai;(ftaulu[ai].r+ftaulu[ai].p-ftaulu[i].r)<25;i--); i++; if (ftaulu[i].r==ftaulu[i-1].r) /* 2 fraasia samalla rivill„ */ i--; return i; } /*------------------------------------------------------------------------*/ void fraasilista( fraasi_taulu ftaulu, /* Fraasitaulukko */ int indeksi, /* Voimassaolevan valinna indeksi menuun tultaessa */ lista_alkio *nykyinen /* Osoitin valittuun fraasiin menusta poistuttaessa*/ ) { lista_alkio *l_alkio; int paikka=1; int j; char *rivi; pitka_merkkijono pmjono; pmjono[0]=0; gotoxy(1,1); for (l_alkio=ftaulu[indeksi].tsolmu->seuraava; l_alkio; l_alkio=l_alkio->seuraava) { if (l_alkio==nykyinen) { paikka=wherey(); textcolor(RED); } else if (l_alkio==ftaulu[indeksi].tsolmu->seuraava) textcolor(GREEN); /* Luokkanimike */ else textcolor(YELLOW); /* Fraasi */ strcpy(pmjono,l_alkio->mjono); rivi=palanen(pmjono,valimerkki,&j); while (j!=-1) { cprintf("%s",rivi); gotoxy(1,wherey()+1); rivi=palanen(NULL,valimerkki,&j); } } gotoxy(1,paikka); } /*------------------------------------------------------------------------*/ void fmenu( fraasi_taulu ftaulu, /* Fraasitaulukko */ int indeksi, /* Valitun fraasi(lista)n indeksi taulukossa */ int x, /* Menun oikean yl„kulman */ int y /* koordinaatit */ ) { int korkeus=0; /* Menun korkeus rivein„ */ int leveys; /* Menun leveys */ char c; /* Switch-muuttuja */ lista_alkio *l_alkio; /* Apumuuttuja listan l„pik„ymiseen */ lista_alkio *nykyinen; /* Osoitin valittuun fraasiin */ int a; /* Silmukkalaskuri */ int erotus; /* Uuden ja vanhan fraasin pituuksien erotus */ int vieritys; /* Montako rivi„ n„ytt”„ joudutaan vieritt„m„„n, */ /* jotta menu sopii siihen */ leveys=78-x; nykyinen=ftaulu[indeksi].tsolmu->esivalittu; for (l_alkio = ftaulu[indeksi].tsolmu->seuraava;l_alkio;l_alkio=l_alkio->seuraava) korkeus+=l_alkio->pituus; l_alkio=ftaulu[indeksi].tsolmu->seuraava; vieritys=korkeus+2-(25-y); /* Montako rivi„ n„ytt”„ joudutaan vieritt„m„„n */ tulosta_kehys(leveys,korkeus,x,y); if (vieritys>0) y-=vieritys; window(x+1,y+1,x+leveys,y+korkeus); fraasilista(ftaulu,indeksi,nykyinen); do { c=getch(); switch (c) { case ESC : { window(1,1,80,25); break; } case RETURN: { erotus=nykyinen->pituus-ftaulu[indeksi].p; ftaulu[indeksi].p=nykyinen->pituus; ftaulu[indeksi].tsolmu->esivalittu=nykyinen; /* Vaihdetaan tulostusv„ri, jos luokkanimikkeen tilalle valittin fraasi */ if (nykyinen != ftaulu[indeksi].tsolmu->seuraava) ftaulu[indeksi].tsolmu->vari = YELLOW; else ftaulu[indeksi].tsolmu->vari = GREEN; /* T„sm„t„„n rivinumerot fraasin muuttuneen pituuden mukaisiksi */ if ( ftaulu[indeksi].r==ftaulu[indeksi+1].r ) /* Samalla rivill„ olevaa fraasia ei pid„ juoksuttaa alasp„in */ a=1; else a=0; for (a=a+indeksi+1;((ftaulu[a].r!=0) && (indeksi<=MAX_LUOKKANIMIKKEITA));a++) ftaulu[a].r+=erotus; window(1,1,80,25); break; } case 0: { c=getch(); switch(c) { case NUOLI_YLOS: { if (nykyinen->edellinen!=NULL) { nykyinen = nykyinen->edellinen; fraasilista(ftaulu,indeksi,nykyinen); } break; } case NUOLI_ALAS: { if (nykyinen->seuraava!=NULL) { nykyinen = nykyinen->seuraava; fraasilista(ftaulu,indeksi,nykyinen); } break; } } break; } } } while ((c!=RETURN) && (c!=ESC)); } /*------------------------------------------------------------------------*/ int talleta_kirje( /* Palauttaa 1 jos talletus onnistui, muutoin 0 */ fraasi_taulu ftaulu, /* Fraasitaulukko */ int max_indeksi /* Viimeisen k„yt”ss„ olevan ftaulun alkion indeksi*/ ) { FILE *t; rivityyppi naytto[MAX_RIVEJA]; char tiedosto[TIEDOSTONIMENPITUUS]; char *tnimi, bak_nimi[TIEDOSTONIMENPITUUS]; int i,j; int x,r=0; pitka_merkkijono pmjono; char *rivi; tulosta_kehys(70,1,5,10); window(7,11,75,11); fflush(stdin); gotoxy(1,1); cprintf("Anna tiedostonimi ilman tarkenninta / "); tiedosto[0]=TIEDOSTONIMENPITUUS; tnimi = cgets(tiedosto); if (strcmp(tnimi,"\0")==0) return 0; bak_nimi[0]=0; strcpy(bak_nimi,tnimi); strcat(tnimi,TARKENNIN); strcat(bak_nimi,VANHATARK); remove(bak_nimi); rename(tnimi,bak_nimi); clrscr(); gotoxy(1,1); cprintf("Odota. Talletan: ",tnimi); if ( !(t= fopen(tnimi,"wt")) ) { clrscr(); gotoxy(1,1); cprintf("Talletus ei onnistu! Paina jotain."); getch(); return 0; } for (i=0;ivari!=GREEN) { r=ftaulu[i].r; strcpy(pmjono,ftaulu[i].tsolmu->esivalittu->mjono); rivi=palanen(pmjono,valimerkki,&j); while (j!=-1) { if (ftaulu[i].s>1) { for (x=strlen(naytto[r]); x sen kohdalla.\r\n"); cprintf("F10/F2 : kirjeen talletus, F7/ALT-X : lopetus.\r\n"); cprintf("Paina jotakin ..."); getch(); } /*------------------------------------------------------------------------*/ void kirje(fraasi_taulu ftaulu) { int yi=0; int ai; int indeksi=0; int max_indeksi; int sarake=1; char c; char talletettu=0; textcolor(WHITE); textbackground(BLUE); clrscr(); valimerkki[0]=VALIMERKKI; valimerkki[1]=0; for (max_indeksi=0;ftaulu[max_indeksi].r!=0;max_indeksi++) if (max_indeksi>MAX_LUOKKANIMIKKEITA) break; max_indeksi--; ai=tulosta_fraasit(ftaulu,yi,indeksi,sarake); do { c = getch(); switch (c) { case RETURN: { fmenu(ftaulu,indeksi,wherex(),wherey()); clrscr(); ai=tulosta_fraasit(ftaulu,yi,indeksi,sarake); break; } case 0: { c = getch(); switch (c) { case F1: case F3: { ohjeet(); window(1,1,80,25); clrscr(); ai=tulosta_fraasit(ftaulu,yi,indeksi,sarake); break; } case ALT_X: case F7: { if (!talletettu) { tulosta_kehys(65,1,5,10); gotoxy(3,2); cprintf("Kirjett„ ei ole talletettu. Poistutaanko silti (K/E):"); c=getch(); window(1,1,80,25); clrscr(); if (strchr(KYLLA,c)) exit(0); else ai=tulosta_fraasit(ftaulu,yi,indeksi,sarake); } else { clrscr(); exit(0); } break; } case F2: case F10: { talletettu=talleta_kirje(ftaulu,max_indeksi); window(1,1,80,25); clrscr(); ai=tulosta_fraasit(ftaulu,yi,indeksi,sarake); break; } case NUOLI_YLOS: { if (indeksi>0) { if (indeksi==yi) { yi--; clrscr(); if ((yi>0) && (ftaulu[yi].r==ftaulu[yi-1].r)) yi--; /* 2 fraasia samalla rivill„ */ } indeksi--; if (ftaulu[indeksi].s>1) sarake=2; else sarake=1; ai=tulosta_fraasit(ftaulu,yi,indeksi,sarake); } break; } case NUOLI_ALAS: { if (indeksi1) sarake=2; else sarake=1; ai=tulosta_fraasit(ftaulu,yi,indeksi,sarake); } break; } case VASEN_NUOLI: { if (sarake==2) { if ((indeksi>0) && (ftaulu[indeksi].r==ftaulu[indeksi-1].r)) { sarake=1; indeksi--; ai=tulosta_fraasit(ftaulu,yi,indeksi,sarake); } } break; } case OIKEA_NUOLI: { if (sarake==1) { if (ftaulu[indeksi].r==ftaulu[indeksi+1].r) { indeksi++; sarake=2; ai=tulosta_fraasit(ftaulu,yi,indeksi,sarake); } } break; } } break; } } } while (1); }