/* riskedit.c by Michiel Overtoom, 1987-1988 */ #include /* DOS routine defines */ #include /* defs used in resource header */ #include "obdefs.h" /* Objectdefinities voor GEM */ #include "gemdefs.h" /* Voor event multi */ #include "riskedit.h" /* button/dialoog identifiers (van RCS) */ #define HIDE_MOUSE graf_mouse(256,&junk) #define SHOW_MOUSE graf_mouse(257,&junk) #define NORMAL 1 #define SHOW 1 #define ENABLE 1 #define DISABLE 0 #define YES 1 #define NO 0 #define WAITEVENT (MU_BUTTON|MU_MESAG|MU_KEYBD) #define BUTTDOWN 1 #define ONEBUTTON 1 #define LANHEIGHT 4 #define LEGHEIGHT 6 #define ALTA 0x1E00 #define ALTB 0x3000 #define ALTD 0x2000 #define ALTG 0x2200 #define ALTI 0x1700 #define ALTL 0x2600 #define ALTN 0x3100 #define ALTO 0x1800 #define ALTP 0x1900 #define ALTQ 0x1000 #define ALTR 0x1300 #define ALTS 0x1F00 #define ALTX 0x2D00 #define ALTZ 0x2C00 #define HLP 0x6200 #define CUP 0x4800 #define CDOWN 0x5000 #define CRIGHT 0x4D00 #define CLEFT 0x4B00 #define CCLR 0x4700 /* Muisvormen */ #define PIJL 0 #define BIJ 2 extern int contrl[],intin[], ptsin[],intout[], /* VDI binding tabellen */ ptsout[]; extern int charw,charh,boxw,boxh, /* Teken- en Schermgroottes */ xres,yres; extern int junk; /* Scratch var */ extern int handle; /* VDI's scherm handle */ int end_of_program; /* YES indien Quit gekozen */ int i,j; int workx,worky,workw,workh; /* Window Workspace afmetingen */ int deskx,desky,deskw,deskh; /* desktop afmetingen */ int pxy[10]; OBJECT *menutree; /* ---> Menutree */ extern OBJECT *dispmenu(); /* Toon menubar */ #define MAXLAND 100 /* Max.Editsize landarray data */ #define MAXWDEEL 10 /* Max.Editsize werelddeel data */ /* Globals */ int nland; /* 0=leeg, 1=1 land, n=nlanden 1...nland */ char pi3[13]; /* Assoc bitmap */ char gebnaam[32]; /* gebiedsnaam null padded */ char om1[32]; /* Omschrijving */ char om2[32]; /* Omschrijving */ char om3[32]; /* Omschrijving */ char om4[32]; /* Omschrijving */ /* Werelddeel namen & aanwasgetallen */ char wnaam[MAXWDEEL][32]; int waanwas[MAXWDEEL]; /* Data voor elk land: */ struct lands { char naam[32]; /* Landnaam, null padded */ int wdeel; /* Werelddeelnummer */ int legx,legy; /* Legerinfo x,y */ int lanx,lany; /* Landnaam x,y */ int npoly; /* Aantal polypunten */ int poly[64]; /* Max 63 polylines x,y (VDI format) */ int topol[8]; /* Max 8 topol links */ }; struct lands land[MAXLAND+1]; /* Globale editor variabelen: */ int saved; /* NO indien wel gemuteerd & niet gesaved */ int aktland; /* Aktuele editland */ char *bitmap; /* Aktuele bitmap */ main() { vdistuff(); rsrc_load("RISKEDIT.RSC"); menutree=dispmenu(MENUBAR); /* VDI text parameters */ vst_alignment(handle,0,5,&junk,&junk);/* Alignment onder x,y*/ vswr_mode(handle,1);/* Replace mode */ bitmap=(long *)Malloc(32008L); nland=0; updaaktland(); saved=YES; multi(); /* Ruim op */ Mfree(bitmap); v_clsvwk(handle); appl_exit(); } int multi() { int land,event; int evb_bmx,evb_bmy,evb,keycode,clicks; int msgbuff[10]; end_of_program=NO; do { event=evnt_multi(WAITEVENT,2,ONEBUTTON,BUTTDOWN, 0,0,0,0,0, 0,0,0,0,0, msgbuff,0,0,&evb_bmx,&evb_bmy, &evb,&junk,&keycode,&clicks); wind_update(BEG_UPDATE); if (event&MU_MESAG) switch (msgbuff[0]) { case WM_CLOSED: end_of_program=YES; break; case MN_SELECTED: /*title ,item*/ end_of_program=domenu(msgbuff[3],msgbuff[4]); menu_tnormal(menutree,msgbuff[3],NORMAL); break; } /* Muisbutton Message ? */ if (event&MU_BUTTON) { if (clicks==2) dubbelklik(evb_bmx,evb_bmy); else if (clicks==1) klik(evb_bmx,evb_bmy); } /* End MU_BUTTON */ /* Check het toetsenbord */ if (event&MU_KEYBD) dokey(keycode); wind_update(END_UPDATE); if (end_of_program && checksaved()) end_of_program=NO; } while (!end_of_program); } dubbelklik(x,y) int x,y; { if (klik(x,y)) { edetail(); fresh(); saved=NO; } } klik(x,y) int x,y; /* Maak aktueel land */ { int res; if (nland==0) return(NO); res=findland(x,y); if ((res>0)&&(res<=nland)) { aktland=res; updaaktland(); return(YES); } return(NO); } /* Zoekt het dichtbijzijnste land bij de muis. -1 is notfound */ int findland(mx,my) int mx,my; { int xdis,ydis,mindist=9999,minland= -1; int i; for (i=1;i<=nland;i++) { xdis=land[i].lanx-mx; if (xdis<0) xdis= -(xdis); ydis=land[i].lany-my; if (ydis<0) ydis= -(ydis); if ((xdis+ydis)25) return(-1); else return(minland); } /*********** Deze routine behandelt toetsaanslagen */ dokey(keycode) int keycode; { char s[30]; switch(keycode) { case CDOWN: case CRIGHT: aktland++; if (aktland>nland) aktland=1; updaaktland(); break; case CUP: case CLEFT: if (--aktland<1) aktland=nland; updaaktland(); break; case ALTA: domenu(DESK,ABOUT); break; case ALTB: domenu(EDIT,ETOPOL); break; case ALTD: domenu(EDIT,EDEL); break; case ALTG: domenu(EDIT,EGLOB); break; case ALTI: domenu(EDIT,EINS); break; case ALTL: domenu(EDIT,ELEGER); break; case ALTN: domenu(EDIT,ELANDPOS); break; case ALTO: domenu(FILE,FOPEN); break; /* case ALTP: domenu(EDIT,EPOLY); break; */ case ALTQ: domenu(FILE,FQUIT); break; case ALTR: domenu(EDIT,EFRESH); break; case ALTS: domenu(FILE,FSAVE); break; case ALTX: domenu(EDIT,EDETAIL); break; case ALTZ: domenu(FILE,FNIEUW); break; case HLP: help(); break; } } /********** Zet aktuele editland nummer/naam bovenaan scherm */ updaaktland() { char s[80]; if (nland==0) strcpy(s,"Geen landen gedefinieerd. "); else sprintf(s,"Aktueel: %3d %-32s ",aktland,land[aktland].naam); vst_height(handle,LEGHEIGHT,&junk,&junk,&junk,&junk); v_gtext(handle,640-50*8,3,s); } /********** Zet 47 msg bovenaan scherm */ msg(s) char *s; { char t[80]; sprintf(t,"%47s",s); vst_height(handle,LEGHEIGHT,&junk,&junk,&junk,&junk); v_gtext(handle,640-50*8,3,t); } /*********** Bewaar scherm en laat help zien */ help() { HIDE_MOUSE; fastsave(); SHOW_MOUSE; dialoog(HELP); HIDE_MOUSE; fastrest(); SHOW_MOUSE; } /********** Laad bitmap, indien die gespecificeerd is & bestaat */ picload() { int fd=Fopen(pi3,0); if (fd<0) return(fd); Fread(fd,34L,bitmap); Fread(fd,32000L,bitmap); Fclose(fd); } /********* Sleur de bitmap naar het scherm */ picdisp() { long *src=bitmap,*dst=Logbase(); int cnt=8000L; while(cnt--) *dst++= *src++; } /******* Kijkt of er wel gesaved is (om verlies van mutaties tegen te gaan) */ /******* Roep aan vlak voordat er definitiefs gaat gebeuren. */ /******* Indien gevaar, laat boxje zien en return JA */ int checksaved() { if (nland==0) return(NO); if (!saved) { fout("Waarschuwing:|Je hebt nog niet geSAVEd,|doe het nu of nooit."); saved=YES; return(YES); } return(NO); } /* Deze routine behandeld de keuzes uit het menu. */ domenu(title,item) int title,item; { int res; switch(item) { case DABOUT: HIDE_MOUSE; fastsave(); SHOW_MOUSE; dialoog(ABOUT); HIDE_MOUSE; fastrest(); fastsave(); SHOW_MOUSE; dialoog(HELP); HIDE_MOUSE; fastrest(); SHOW_MOUSE; break; case FNIEUW: if (checksaved()) break; fnieuw(); fresh(); saved=YES; break; case FSAVE: savetopol(); saved=YES; break; case FOPEN: if (checksaved()) break; res=opentopol(); fresh(); saved=YES; break; case EGLOB: HIDE_MOUSE; fastsave(); SHOW_MOUSE; eglob(); HIDE_MOUSE; fastrest(); SHOW_MOUSE; saved=NO; break; case ELAND: eland(); fresh(); saved=NO; break; case ELANDPOS: elandpos(); fresh(); saved=NO; break; case ELEGER: eleger(); fresh(); saved=NO; break; case ETOPOL: etopol(); fresh(); saved=NO; break; case EDETAIL: edetail(); fresh(); break; case EFRESH: fresh(); break; case EINS: nland++; aktland=nland; updaaktland(); saved=NO; break; case EDEL: if (nland>0) nland--; if (aktland>nland) { aktland=nland; updaaktland(); } saved=NO; break; } return(item==FQUIT ? YES : NO); } /*********** Schoon alle edit variabelen (NEW operatie) */ fnieuw() { int i; blkfill(pi3,0,13); blkfill(gebnaam,0,32); blkfill(om1,0,32); blkfill(om2,0,32); blkfill(om3,0,32); blkfill(om4,0,32); blkfill(wnaam,0,32*10); blkfill(waanwas,0,sizeof(int)*10); for (i=1;i<=MAXLAND;i++) blkfill(&land[i],0,sizeof(struct lands)); nland=0; } /*************** Garandeer een bepaalde filenaam extensie */ extensie(naam,ext) char *naam,*ext; { char hulp[80]; int i; i=0; do { hulp[i]=naam[i]; if (hulp[i]=='\0') break; if (hulp[i]=='.') break; i++; } while(1); hulp[i]='\0'; strcat(hulp,ext); strcpy(naam,hulp); } /*********** Laad een topologie */ opentopol() { char curdir[80],filenaam[80]; char f[100]; /* Full-named geselecteerde file */ int fd,i,exitbut; Dgetpath(curdir,0); strcat(curdir,"\\*.RIS"); strcpy(filenaam,""); HIDE_MOUSE; fastsave(); SHOW_MOUSE; fsel_input(curdir,filenaam,&exitbut); HIDE_MOUSE; fastrest(); SHOW_MOUSE; if (exitbut!=1) return(NO); extensie(filenaam,".RIS"); strcpy(f,curdir); /* Plak file achter directorynaam */ for (i=0;i